Public Integration API
Supported settings and scoped usage are available through the public reference and usage endpoints. The User Intuition API allows you to programmatically manage studies, invite participants, access interview recordings and transcripts, generate reports, field panels, and set up webhooks to receive interview data. Building an autonomous workflow? Start with Build a research agent for the review points, safe retry rules, and an evaluation recipe. For bulk interview evidence, use interview exports to request a private CSV or JSONL file by page. For an agent-friendly study-design flow, create a study draft and callPOST /api/public/v1/studies/{study_id}/customize-plan once per conversation turn. The default decisions: "human" returns structured questions[] for the caller to relay. Use decisions: "agent" only when the researcher delegates ordinary design choices; report the returned assumptions[] and relay any remaining required questions. Put draft-only workflow constraints in execution_policy, outside the research message. Customization never launches recruitment, and later invitation or paid-launch approval is still required.
For a planning turn that may take longer than the client timeout, use POST /api/public/v1/studies/{study_id}/customize-plan/jobs. It returns 202 and a durable job_id; poll GET /api/public/v1/studies/{study_id}/customize-plan/jobs/{job_id} for the same structured response in result. Only one planning turn may run for a study at a time. A failed job is not replayed automatically because a conversation turn may have changed the saved study; inspect that state before explicitly submitting another turn. Upload a native concept image with the synchronous endpoint first, then use the async endpoint for later text turns.
OpenAPI Specification
View the complete OpenAPI specification
https://api.userintuition.ai/openapi.json and https://api.userintuition.ai/.well-known/openapi.json. Both production URLs list public integration endpoints only.
See the API changelog for contract changes and the versioning and deprecation policy before migrating an integration.
Review the public Security & Trust center for current compliance status, data protection, retention, and incident-response details. Interview detail reads can request redact_pii=true to mask common structured identifiers and omit direct identity and recording links; this is pattern masking, so applications handling sensitive interviews should still apply their own review controls.
For current availability checks of the API and MCP server, see the service status page.
Safe retries for creating resources
Send a uniqueIdempotency-Key header when creating a study, participant batch, feasibility request, or webhook, uploading a concept image, customizing a study plan, generating a report, sending a participant reward, or launching a paid panel. The combined create-study-with-participants operation accepts it too. If a request times out, retry with the same key and identical input. A completed operation returns its original response without repeating the write. Use a new key for a new operation or changed input.
409 idempotency_key_reused. Completed results can be replayed for 30 days; after that, treat the key as new. If the first request is still running or its result is uncertain, the API returns 409 idempotency_result_pending; retrieve the current resource before deciding what to do. An unresolved pending operation remains held until reconciled. Calls without a key retain ordinary behavior and cannot be safely replayed after an uncertain timeout.
A changed request that reuses a key did not start; use a new key. A failed read-only check, such as a missing or inaccessible study before creating participants, also does not start the operation, so the same key can be retried after the prerequisite is fixed.
Participant batch creation and report generation return 202 with a durable job_id. Poll GET /api/public/v1/participants/jobs/{job_id} or GET /api/public/v1/studies/{study_id}/report/jobs/{job_id} until status is succeeded, then follow result_url. Failed jobs return a safe summary; contact support with the job ID when a retry has exhausted. A report also emits report.ready when persisted. Use GET /api/public/v1/studies/{study_id}/fielding-progress for current completions, target, quality counts, and a rate-based finish estimate when enough data exists.
Runnable developer examples
Conduct a study, retrieve the four report sections, and search existing evidence. Start with fictional fixtures that require no account or spending.
Base URL
All API requests should be made to:Authentication
All endpoints require Bearer token authentication. You can authenticate with either an API key or a JWT token.API keys (recommended)
API keys are long-lived credentials ideal for server-to-server integrations and MCP clients. Ordinary users’ keys are scoped to their organization. They start with the prefixui_sk_.
Users with the platform role users.role = admin can read research across organizations. They can list organization IDs and select one for scoped operations. An admin’s API key still obeys its own scopes and spend cap.
New keys default to read. Add write to create or change research. Paid panel launches require panel:launch, and participant rewards require rewards:send, in each case alongside write and a positive lifetime USD spend cap. The cap counts reserved and completed operations; an uncertain operation remains reserved until reconciled. Existing keys retain broad public API scopes and may have no cap, so rotate them to adopt the new controls. API keys use the versioned public API and listed catalog reads; dashboard and billing routes require a dashboard session.
An API key can launch a one-time paid panel after receiving an estimate. Recurring panels are created from a dashboard session because later cycles can be repriced beyond a key’s one-cycle estimate.
Use the versioned public interview and report endpoints with an API key. The legacy dashboard endpoints that return raw interview messages or embedded call records require a dashboard session token.
Create and manage your keys from the Manage Account pane in the dashboard — no API call required to get started.
1
Open Manage Account
Sign in to the User Intuition Dashboard, click your avatar in the bottom-left corner of the sidebar, then select Manage Account.
2
Go to the API Keys tab
In the account management dialog, click API Keys in the sidebar.
3
Create a key
Enter a descriptive name, choose scopes, set a lifetime USD cap if selecting a paid scope, then click Create Key. The new key appears in a banner at the top of the page.
4
Copy the key immediately
Click Copy Key to copy it to your clipboard. The full key is only shown once — after you dismiss the banner or navigate away, only the key prefix remains visible.
5
Use the key
Pass the key as a Bearer token in the
Authorization header:See Account settings → API keys for the full UI walkthrough.
JWT tokens
JWT tokens are short-lived tokens issued by the dashboard. They are useful for quick testing.1
Sign in to your account
Sign in to your User Intuition Dashboard if you haven’t already.
2
Open your profile
Click on your profile in the bottom-left corner of the sidebar. This will show your name and company.
3
Select View JWT Token
Select “View JWT Token” from the dropdown menu (it has a key icon).
4
Copy your token
A dialog will appear displaying your JWT token. Click the “Copy Token” button to copy the token to your clipboard.
5
Confirmation
You’ll see a confirmation message when the token has been successfully copied.
Available Resources
Studies
Create and manage your studies, screeners, and interview configuration.
Interviews
Access interview records, transcripts, recordings, and analysis data.
Participants
Invite participants, send rewards, and track their status.
Webhooks
Receive interview data at your own endpoint as soon as an interview completes.
Response Format
All responses are returned in JSON format. Successful list responses include the resource collection plus pagination information (the collection key matches the resource, e.g.studies, participants, interviews):
Error Handling
The API uses standard HTTP status codes:
Every public API JSON error includes an
error object and an X-Request-ID response header. The request_id in the body matches that header. The existing detail field remains for clients that already use it; its shape can be a string, list, or object.
outcome: "unknown", retrieve the current resource state before retrying. field identifies the first invalid field when validation fails. Include the request ID when contacting support; do not include credentials.
An error with outcome: "not_started" means the request was rejected before that operation changed state. For example, a stale panel estimate or an invalid pause, resume, or stop transition is rejected before launch or fielding changes begin. Other conflicts can still report unknown; retrieve the resource before retrying those writes.
Use the returned
outcome and recovery_action, not the HTTP status alone, to decide whether a write is safe to repeat.
Report freshness and historical search
is_stale: true means the saved report no longer matches its current inputs. Those inputs include interview evidence, study settings, and report generation settings. Therefore stale_reason: "inputs_changed" can appear with new_interviews_since: 0; regenerate the report to use the current settings.
Search documents indexed before fieldwork dates were introduced may have research_period: null. Date filters exclude undated documents. Older reports with a saved interview evidence snapshot can be reindexed to restore their fieldwork dates; reports without that snapshot must be regenerated before date-filtered search can include them.
Rate Limiting
API requests are rate limited to ensure fair usage. The default budget is 120 requests per 60 seconds per authenticated user; deployed configuration can change it. Successful responses includeRateLimit-Policy and RateLimit headers showing the active limit, remaining requests, and reset time. A 429 Too Many Requests response also includes Retry-After. Wait for the indicated delay before retrying a read. For a write, check current state before retrying. If the limiter is unavailable, requests continue without rate headers.

