# Build a research agent Source: https://docs.userintuition.ai/api-reference/agents Design, field, and inspect research with the public API and MCP tools ## Start with a reviewable study An agent can create a draft, help design its interview plan, invite participants, and retrieve evidence. The researcher should review the saved plan and the current recruitment estimate before fieldwork starts. Use an API key with `read` and `write` scopes for draft work; paid panel launch also requires `panel:launch` and a positive lifetime spend cap. **1. Create a draft** Call `POST /api/public/v1/studies/` with an `Idempotency-Key`. Save the returned study ID. See the [study lifecycle](/api-reference/study-lifecycle) for state transitions. **2. Design the plan** Call `POST /api/public/v1/studies/{study_id}/customize-plan` once per conversation turn. Relay returned `questions[]` when `decisions` is `human`. If the researcher delegates ordinary design choices with `decisions: "agent"`, show the returned `assumptions[]` and any remaining questions. Review the persisted plan before recruiting. **3. Choose recruitment** For your own participants, create invitations or a share link. For a paid panel, request the current estimate, show the amount and target to the researcher, then launch with a key that has the required scope and spend cap. The plan customization call never starts recruitment. **4. Follow progress and evidence** Poll fielding progress and report jobs, or subscribe to [webhook events](/api-reference/webhooks/overview). Retrieve the persisted report and source interviews. Keep interview IDs and source references with each answer; distinguish quotations from analysis and recommendations. The [runnable TypeScript examples](/api-reference/developer-examples) include a fixture mode that uses fictional data and makes no network calls. Start there, then validate the narrow live path your application needs with an authorized test study. ## Connect through MCP The [MCP setup guide](/mcp-server/overview) covers authentication and tool discovery. Discover the tool schema at runtime, because MCP and REST names or response shapes can differ. The default tool surface includes write operations; use API key scopes and spend caps to limit what a connected agent can do. ## Evaluate before a live launch Use a fixed set of realistic briefs and record the study ID, request IDs, tool calls, final plan, estimate, and source references for each run. Include cases with missing audience details, a returned planning question, an uncertain write response, an empty study, and a paid panel estimate that exceeds the key's cap. | Check | Pass condition | | - | - | | Plan questions | The agent relays required `questions[]` or labels its `assumptions[]` before claiming the plan is final. | | Fieldwork approval | The saved plan and current estimate are shown before any paid launch call. | | Retry safety | A timed-out write reuses its original `Idempotency-Key` with identical input, and the agent checks persisted state when the outcome remains uncertain. | | Evidence | Every attributed quotation can be found in an accessible source interview; analysis and recommendations are labelled separately. | | Access and spend | Read-only keys cannot write; paid operations are rejected without their specific scope and a sufficient cap. | Count passes and failures by scenario, retain failed traces, and rerun the same set when the API contract, tool surface, or agent prompt changes. Fixture results demonstrate integration behavior; they do not establish real research quality. The [examples release checklist](https://github.com/user-intuition/examples/blob/main/docs/release-check.md) covers response shapes, pagination, citations, and source access. ## Current output formats The public API exposes structured reports, transcript segments, [private CSV or JSONL interview exports](/api-reference/interview-exports), [editable report slide decks](/api-reference/report-slide-exports), and [saved Highlights videos](/api-reference/highlight-clips). Use the persisted report and interview endpoints for current integrations. # API v1 capabilities Source: https://docs.userintuition.ai/api-reference/changelog Public API resources and integration workflows The public API is available under `/api/public/v1/`. Authenticate with an API key or session credential and use the [OpenAPI specification](/api-reference/openapi.json) to inspect request and response schemas. * [Organizations](/api-reference/organizations): discover accessible workspaces and select one for reads, writes, usage, and billing with `X-UI-Organization-ID` or MCP `organization_id`. * [Intelligence Hub](/api-reference/intelligence-hub): manage organization sessions and sources, chat with evidence, and create or edit reports, PowerPoints, and videos through durable jobs. * Study planning: create a metadata draft, customize its plan, and review the saved result before recruiting participants. * Participants and interviews: manage BYOP invitations, customer IDs and metadata; inspect interview summaries and bounded transcripts. * Reports and exports: read saved findings, create private CSV or JSONL interview exports, export editable PowerPoints, and generate saved Highlights videos. Signed download URLs expire after 15 minutes. * [Webhooks](/api-reference/webhooks/overview): receive signed lifecycle events, inspect deliveries, and manage subscriptions by ID. * Reference catalogs: inspect languages, interview modes, voices, study templates, targeting attributes, and interview usage. API-key scopes, spend caps, organization membership checks, and paid-action approval requirements apply to each operation. # Developer examples Source: https://docs.userintuition.ai/api-reference/developer-examples Run TypeScript examples for conducting qualitative research, retrieving study results, and searching existing evidence. ## Start with a runnable example The [public User Intuition examples repository](https://github.com/user-intuition/examples) demonstrates three workflows using TypeScript. Your application controls the customer experience and interpretation; User Intuition provides research execution and evidence access. ```bash theme={null} git clone https://github.com/user-intuition/examples.git cd examples npm run demo ``` Requires Node.js 22.18 or later. Default fixture mode makes no network calls and requires no API key or spending. Every fixture is fictional; it demonstrates data handling, not measured research performance. > [!NOTE] > > The report and search examples were checked against the 2026-10-05 public OpenAPI and staging reads. The API search guide documents the released contract separately from the runnable example. ## Conduct a study The example separates draft creation, Customize Plan turns, saved-plan review, a recruitment estimate, paid launch, monitoring, and report generation. A plan may require several conversational turns; relay questions rather than inventing answers. Save the study ID to resume. The user chooses panel recruitment or their own participants. Before paid recruitment, review the current saved plan and full estimate. The example requires explicit live mode and a separate launch approval flag. That flag is not a backend budget limit or an idempotency guarantee. [Run the study example and fetch its source](/api-reference/examples/conduct-a-study) ## Retrieve study results Study results expose Study Findings, Participant Responses, Participant Profiles, and Recommended Next Steps. Findings and response summaries are analysis; exact quotations are source evidence; profiles describe the sample; recommendations propose further work. Keep source references, interview IDs, coverage, and freshness with the report. An interview-level link does not necessarily identify the exact passage behind an answer. The example demonstrates answer-to-reference relationships and checks fictional quotations against their source messages. Retrieval does not regenerate analysis. [Run the results example and fetch its source](/api-reference/examples/retrieve-study-results) ## Search existing research Search locates relevant study plans and structured report content across authorized studies. The API ranks candidates and returns only canonical persisted JSON. Inspect each entry in `studies`, including its `index_status`, report IDs, grouped results, dates, call IDs, and finding reference IDs before using the evidence. Recommendations are distinct from observed evidence. A search over summaries does not prove that all transcript passages were searched. Empty results are different from an API failure, and repeated matches from one interview are not independent participants. Your agent performs the final synthesis. [Run the search example](/api-reference/examples/search-research-example) or [read the API search guide](/api-reference/examples/search-research). ## Connect through MCP or CLI Use the [MCP setup guide](/mcp-server/overview) for authentication and current tool discovery. The examples repository includes a [matching MCP and CLI walkthrough](https://github.com/user-intuition/examples/blob/main/docs/mcp-cli.md). REST and tool schemas may differ; use the contract for the surface you call. ## Verify before production use Run fixture tests and the release-schema check, then validate the narrow live workflow your integration needs with an authorized test study. Do not publish real participant data in a reproduction. A timed-out write can leave an uncertain outcome; inspect persisted state before retrying. The [release compatibility record](https://github.com/user-intuition/examples/blob/main/docs/release-check.md) covers response shapes, citations, pagination, coverage, errors, and source access. Each API endpoint page contains selectable request examples with the valid fields and values for that operation; start with [Create Study](/api-reference/public-studies/create-study). ## Machine discovery The [example catalog](https://raw.githubusercontent.com/user-intuition/examples/main/examples.json) lists commands, inputs, outputs, side effects, and raw source URLs. Individual example pages contain complete code blocks generated from the executable source files. # Conduct a study Source: https://docs.userintuition.ai/api-reference/examples/conduct-a-study Runnable TypeScript example: conduct a study, with inputs, output, source code, and execution limits. [Raw TypeScript source](https://raw.githubusercontent.com/user-intuition/examples/main/examples/conduct-a-study/index.ts) · [Workflow walkthrough](https://github.com/user-intuition/examples/tree/main/examples/conduct-a-study) · [All examples](/api-reference/developer-examples) ## Run locally Requires Node.js 22.18 or later. Run from the cloned repository; this file imports the shared client and contracts in `src/`. The default uses fictional local fixtures with no credentials, network calls, invitations, or spending. ```sh theme={null} git clone https://github.com/user-intuition/examples.git cd examples npm run study ``` For live calls, supply `USERINTUITION_API_KEY` securely in the environment and explicitly select `--live`. Follow the walkthrough for action-specific arguments and approvals. The report and search adapters were [checked against the released API and staging](https://github.com/user-intuition/examples/blob/main/docs/release-check.md); recheck the live contract when integrating a newer API version. ## Inputs Fixture mode needs no inputs. Live actions use --action, a study ID after creation, and the action-specific name, message, or request file described in the walkthrough. ## Expected output Fictional plan/fieldwork walkthrough labeled with fixture mode. Live mode prints the selected operation response. ## Side effects Fixture mode has no side effects. Live create/customize/launch/report-generation actions write data; launch starts paid recruitment and requires a separate approval flag. ## Failures Missing study/action inputs, malformed request JSON, a missing launch approval, and HTTP failures stop the operation. An interrupted write may have succeeded; inspect saved state before retrying. ## Complete source file The following is generated from `examples/conduct-a-study/index.ts`, not maintained as a separate snippet. SHA-256: `f8cd9f0bfeb836b06c65f54595edd330775f835fbe825a50afb07a27e927f990`. ```typescript theme={null} import { readFile } from "node:fs/promises"; import { args, required, assertLaunchApproval } from "../../src/args.ts"; import { ResearchClient, fixture, output } from "../../src/client.ts"; import { routes } from "../../src/contracts.ts"; const options = args(); if (!options.live) { output({ mode: "fictional fixture; no network, invitations, or spend", workflow: await fixture("workflow"), }); } else { const client = new ResearchClient(); if (options.action === "create") { const name = required(options.name, "name"); if (name.length > 40) throw new Error("Study name must be at most 40 characters."); output( await client.request("POST", routes.studies, { name, study_type: "in-depth-interview", recruiting_method: "panel", }), ); } else { const id = required(options.study, "study"); if (options.action === "customize") output( await client.request("POST", routes.customize(id), { message: required(options.message, "message"), }), ); else if (options.action === "review") output(await client.request("GET", routes.study(id))); else if (options.action === "estimate" || options.action === "launch") { const request = JSON.parse( await readFile( required(options["request-file"], "request-file"), "utf8", ), ); if (options.action === "launch") assertLaunchApproval(id, options["approve-launch"]); const study = await client.request<{ provisioning_status: string }>( "GET", routes.study(id), ); if (study.provisioning_status !== "provisioned") throw new Error( "Study interviewer is not provisioned. Complete and review the saved plan. This is not a fielding-status check.", ); output( await client.request("POST", routes.panel(id), { ...request, dry_run: options.action === "estimate", }), ); } else if (options.action === "monitor") { output( await client.request( "GET", `${routes.interviews}?study_id=${encodeURIComponent(id)}&status=completed&page=1&page_size=20`, ), ); } else if (options.action === "generate-report") output(await client.request("POST", routes.report(id))); else throw new Error( "Choose create, customize, review, estimate, launch, monitor, or generate-report.", ); } } ``` # Retrieve study results Source: https://docs.userintuition.ai/api-reference/examples/retrieve-study-results Runnable TypeScript example: retrieve study results, with inputs, output, source code, and execution limits. [Raw TypeScript source](https://raw.githubusercontent.com/user-intuition/examples/main/examples/retrieve-study-results/index.ts) · [Workflow walkthrough](https://github.com/user-intuition/examples/tree/main/examples/retrieve-study-results) · [All examples](/api-reference/developer-examples) ## Run locally Requires Node.js 22.18 or later. Run from the cloned repository; this file imports the shared client and contracts in `src/`. The default uses fictional local fixtures with no credentials, network calls, invitations, or spending. ```sh theme={null} git clone https://github.com/user-intuition/examples.git cd examples npm run results ``` For live calls, supply `USERINTUITION_API_KEY` securely in the environment and explicitly select `--live`. Follow the walkthrough for action-specific arguments and approvals. The report and search adapters were [checked against the released API and staging](https://github.com/user-intuition/examples/blob/main/docs/release-check.md); recheck the live contract when integrating a newer API version. ## Inputs Live mode requires --study YOUR\_STUDY\_ID. Add --fetch-source to fetch the first supporting interview. ## Expected output JSON containing mode, report, and source\_references. With --fetch-source, a second JSON object contains the reference and source\_interview, or a source\_status explaining why none was fetched. ## Side effects Read-only in live mode; it does not generate a report or start research. ## Failures Missing credentials or study ID, HTTP failures, invalid JSON, and unresolved source interviews are failures, not empty evidence. Stale or unknown freshness is reported separately. ## Complete source file The following is generated from `examples/retrieve-study-results/index.ts`, not maintained as a separate snippet. SHA-256: `1dca3ac1a43df59b393f2d163e86128c731b146ce505d177a633e4e6bbc69672`. ```typescript theme={null} import { args, required } from "../../src/args.ts"; import { ResearchClient, fixture, output, } from "../../src/client.ts"; import { routes, type Report } from "../../src/contracts.ts"; const options = args(); const report = options.live ? await new ResearchClient().request( "GET", routes.reportFull(required(options.study, "study")), ) : await fixture("report"); output({ mode: options.live ? "live" : "fictional fixture; no network or spend", report, source_references: report.references, }); if (report.is_stale === true) console.error("This report is stale; retrieval did not regenerate it."); if (report.is_stale == null) console.error("Report freshness is unknown."); // Inspect one supporting interview without silently fetching an entire library. if (options["fetch-source"]) { const reference = report.references.find((ref) => ref.interview_id); if (!reference?.interview_id) { output({ source_status: "No interview reference is available in this report.", }); } else { const interview = options.live ? await new ResearchClient().request( "GET", routes.interview(reference.interview_id), ) : ( await fixture>( "interviews", ) ).find((item) => item.id === reference.interview_id); if (!interview) throw new Error( "Referenced interview was not found; do not infer its contents.", ); output({ reference, source_interview: interview, instruction: "Inspect the original passage. A retrieved interview is not automatic verification of a generated summary.", }); } } ``` # Search research Source: https://docs.userintuition.ai/api-reference/examples/search-research-example Runnable TypeScript example: search research, with inputs, output, source code, and execution limits. [Raw TypeScript source](https://raw.githubusercontent.com/user-intuition/examples/main/examples/search-research/index.ts) · [Workflow walkthrough](https://github.com/user-intuition/examples/tree/main/examples/search-research) · [All examples](/api-reference/developer-examples) ## Run locally Requires Node.js 22.18 or later. Run from the cloned repository; this file imports the shared client and contracts in `src/`. The default uses fictional local fixtures with no credentials, network calls, invitations, or spending. ```sh theme={null} git clone https://github.com/user-intuition/examples.git cd examples npm run search ``` For live calls, supply `USERINTUITION_API_KEY` securely in the environment and explicitly select `--live`. Follow the walkthrough for action-specific arguments and approvals. The report and search adapters were [checked against the released API and staging](https://github.com/user-intuition/examples/blob/main/docs/release-check.md); recheck the live contract when integrating a newer API version. ## Inputs Use --query with the research question and --study for a live scoped search. Optional --cursor, --limit, and --fetch-source constrain or extend retrieval. Fixture mode returns a fixed match and does not execute the query. ## Expected output JSON containing mode, request, and response. The response groups canonical results under studies and includes next\_cursor. With --fetch-source, a second object contains source\_kind and source or explains that there are no matches. ## Side effects Retrieves existing evidence; does not create studies, regenerate reports, invite people, or launch recruitment. ## Failures Invalid limits, missing live credentials or study ID, HTTP errors, invalid response shapes, and unresolved sources are failures. A successful empty nested results array is distinct from these errors. ## Complete source file The following is generated from `examples/search-research/index.ts`, not maintained as a separate snippet. SHA-256: `f9d5d4e9d49b518feb7e22fbce170bbc661184ccc16c039cb94e282bbcabbfe5`. ```typescript theme={null} import { args, limit, required } from "../../src/args.ts"; import { ResearchClient, fixture, output, } from "../../src/client.ts"; import { routes, type SearchRequest, type SearchResponse, } from "../../src/contracts.ts"; const options = args(); const request: SearchRequest = { query: options.query ?? "What makes people think the product is too expensive?", limit: limit(options.limit), cursor: options.cursor ?? null, filters: { study_ids: [options.live ? required(options.study, "study") : (options.study ?? "example-study")], content_types: ["study_finding", "participant_response"], }, }; const response = options.live ? await new ResearchClient().request( "POST", routes.search, request, ) : await fixture("search"); if (!Array.isArray(response.studies) || response.studies.some((study) => !Array.isArray(study.results))) throw new Error( "Unexpected search response: studies or nested results is not an array.", ); output({ mode: options.live ? "live" : "fictional fixture; query is illustrative, not executed", request, response, }); // Fetch a source with routes.reportFull(study.study_id) or routes.interview(result.interview_id). // Paginate with the same query/filters and next_cursor. No new study is created by this example. if (options["fetch-source"]) { const first = response.studies.flatMap((study) => study.results.map((result) => ({ study, result })), )[0]; if (!first) { output({ source_status: "No search matches; no source was fetched." }); } else { const { study, result } = first; const interviewId = result.interview_id; const source = options.live ? await new ResearchClient().request( "GET", interviewId ? routes.interview(interviewId) : routes.reportFull(study.study_id), ) : interviewId ? ( await fixture>( "interviews", ) ).find((item) => item.id === interviewId) : await fixture("report"); if (!source) throw new Error( "Search source was not found; do not infer its contents.", ); output({ content_id: result.content_id, study_id: study.study_id, indexed_report_id: study.indexed_report_id, source_kind: interviewId ? "interview" : "report", source, instruction: "Check source context and the indexed report ID before citing. This is one result, not exhaustive coverage.", }); } } ``` # Bring Your Own Panel Source: https://docs.userintuition.ai/api-reference/external-panels Connect an external respondent provider to a BYOP study. Bring Your Own Panel lets your respondent provider send people into a BYOP study through one entry URL. It is separate from [individual participant invitations](/mcp-server/tools/participants) and from paid User Intuition Panel recruitment. 1. Create and configure a study with `recruiting_method: "byop"` and review its saved plan. 2. Confirm the study is provisioned and review its plan. Then `PUT /api/public/v1/studies/{study_id}/external-panel` with completion and screen-out redirect URLs. Optional settings map the provider's respondent, session, or external study IDs and quota-full or technical-failure redirects. 3. Give the returned `entry_url` to the provider after checking the parameter mapping and redirects. The provider substitutes its respondent ID in the entry URL. User Intuition creates a session and returns the respondent to the matching outcome URL. 4. Use `GET` to inspect the current configuration. `POST .../regenerate-token` immediately invalidates the previous entry URL; use an `Idempotency-Key` for safe retries, then update the provider with the replacement. `DELETE` disables new entries without deleting completed interviews. All configuration routes require an API key with `read` for GET or `write` for changes, plus access to the BYOP study. A paid Panel or synthetic-respondent study cannot use this integration. The `entry_url` is a live respondent link; handle it as a provider credential. The same workflow is available through the MCP tools `get_external_panel`, `configure_external_panel`, `regenerate_external_panel_token`, and `delete_external_panel`. # Feasibility request lifecycle Source: https://docs.userintuition.ai/api-reference/feasibility-lifecycle Review, page through, and withdraw specialist audience requests. Use a feasibility request when a panel audience needs manual review. Submission returns a request ID and `status: "received"`. Keep that ID to retrieve the request after a client timeout. `GET /api/public/v1/feasibility-requests/` returns a bounded page with `requests`, `total_count`, `page`, and `page_size`. The default page size is 20; the maximum is 100. Requests are ordered newest first. `GET /api/public/v1/feasibility-requests/{request_id}` returns one request, including any estimate or response. `expected_response_by` is a committed review deadline when present. A null value means no deadline has been set; it does not imply an immediate response. To withdraw a request that is still `received`, call `POST /api/public/v1/feasibility-requests/{request_id}/cancel`. The result has `status: "cancelled"` and `cancelled_at`. Repeating the cancellation returns the same cancelled request. A request already marked `responded` cannot be withdrawn and returns 409. # Highlights videos Source: https://docs.userintuition.ai/api-reference/highlight-clips Create and watch a saved video from default-report findings and original participant audio. Highlights use the [Intelligence Hub session API](/api-reference/intelligence-hub). 1. Create an organization session and sync its study sources. 2. Call `POST /api/public/v1/intelligence-hub/sessions/{session_id}/outputs` with `type: "highlights"`, a descriptive `prompt`, and an `Idempotency-Key` header. 3. Poll the returned `poll_url` until the job succeeds. Read its `result.output_id`. 4. Read or download the saved output through the session's output endpoints. One retained MP4 is generated per default-report revision. Learning goals become chapter cards and the corresponding detailed-finding quotations become segments, with branded opening and closing cards. Repeated requests reuse the saved video; the prompt does not select different quotations. Original participant audio is used where available; chat-only studies have no artificial narration. Reads and downloads recheck source access. Downloads redirect to a short-lived private capability URL; do not treat that URL as permanent public hosting. Audio may contain participants' identities, so review the video before sharing it. For MCP, use `generate_research_output` with `type: "highlights"`, poll `inspect_research_session` with `view: "job"`, and use `download_research_output` for a private video link. Advanced run-bound individual clips/reels are available through `queue_research_deliverable`; these use canonical evidence IDs and their existing explicit audio-export acknowledgement. # Intelligence Hub API Source: https://docs.userintuition.ai/api-reference/intelligence-hub Organization sessions, sources, synchronous and asynchronous chat, and Studio outputs. > [!NOTE] > > Use the [MCP tools](/mcp-server/tools/intelligence-hub) for the same workflow from an agent. Base path: `/api/public/v1/intelligence-hub`. Authenticate with an `Authorization: Bearer ui_sk_…` organization API key. GET requests require `read`; mutations require `write`. Sessions are scoped to the authenticated organization and application, including for administrators. Users with multiple memberships can select an accessible organization using `X-UI-Organization-ID`; there is no global session-list bypass. Personal sessions are not exposed through this API. Platform admins can discover and attach studies from other organizations within the same application, while keeping the session in their selected workspace. Non-admins can attach only their organization’s studies. The Hub provides durable jobs, evidence retrieval, verified references, saved reports, and native PowerPoint output. ## Endpoints Paths below are relative to the base path. `S` is a session UUID; `O` is an output UUID. Request and response schemas and examples are included in the generated public OpenAPI specification. | Method | Path | Purpose / request | | - | - | - | | POST | `/sessions` | Create: `{"name":"Customer research"}` | | GET | `/sessions` | List organization sessions | | GET | `/sessions/S` | Read session | | PATCH | `/sessions/S` | Rename: `{"name":"New name"}` | | DELETE | `/sessions/S` | Soft-delete session | | PUT | `/sessions/S/studies/{study_id}` | Add or resync an accessible study | | POST | `/sessions/S/sources` | Upload external evidence, multipart `file` | | GET | `/sessions/S/sources` | List study and document sources | | DELETE | `/sessions/S/sources/{source_id}` | Remove a source using its returned opaque ID | | POST | `/sessions/S/chat` | Synchronous chat with durable timeout recovery | | POST | `/sessions/S/chat/jobs` | Asynchronous chat | | GET | `/sessions/S/chat/history` | Read chat turns, including pending turns | | GET | `/sessions/S/jobs/{job_id}` | Poll preparation, chat, generation, or edit | | POST | `/sessions/S/outputs` | Generate report, PowerPoint, or Highlights | | GET | `/sessions/S/outputs` | List Studio outputs, including synced default reports | | GET | `/sessions/S/outputs/O` | Read output and verified references | | PATCH | `/sessions/S/outputs/O` | Rename: `{"name":"New name"}` | | POST | `/sessions/S/outputs/O/edits` | Edit in place: `{"prompt":"Shorten the executive summary"}` | | DELETE | `/sessions/S/outputs/O` | Soft-delete output | | GET | `/sessions/S/outputs/O/download` | Download Markdown, PPTX, PDF, or MP4 | | POST | `/sessions/S/templates?kind=report` | Upload a report template, multipart `file` | | POST | `/sessions/S/templates?kind=presentation` | Upload a presentation template | Lists use `limit` (default 50, maximum 200 per page) and `after`. Pass the returned `next_cursor` unchanged to fetch the next page. This page size does not limit the total number of sessions, sources, or outputs. Chat history is chronological and excludes automatic study-preparation runs. ## Analysis and exports Advanced operations also use the same base path and session authorization. `R` is a run UUID; `J` is a deliverable job UUID. MCP uses these canonical routes. | Method | Path | Purpose | | - | - | - | | GET | `/studies` | Discover accessible studies, including other organizations for platform admins | | POST | `/sessions/S/sources/all` | Add all accessible studies | | DELETE | `/sessions/S/sources` | Clear selected studies (external documents remain) | | POST | `/sessions/S/runs` | Start analysis with `Idempotency-Key` | | GET | `/sessions/S/runs` | List analysis runs | | GET | `/runs/R` | Read analysis status/result | | GET | `/runs/R/chat` | Read verified chat answer | | GET | `/runs/R/studies` | Read study coverage | | POST | `/runs/R/resume` | Resume analysis | | POST | `/runs/R/cancel` | Cancel analysis | | GET | `/runs/R/events` | Stream progress events | | GET | `/runs/R/claims` | Read verified claims | | GET | `/evidence/{evidence_id}?run_id=R` | Read evidence within an authorized run | | GET | `/runs/R/export` | Export analysis | | GET | `/runs/R/sources` | Read source manifest | | GET | `/runs/R/exclusions` | Read exclusions | | GET, POST | `/sessions/S/report-video` | Read or generate saved highlights | | GET, POST | `/runs/R/report-video` | Read or generate run highlights | | GET | `/runs/R/highlights` | Read highlight candidates | | POST | `/runs/R/deliverables` | Queue presentation, clip or reel with `Idempotency-Key` | | GET | `/runs/R/deliverables` | List exports | | GET | `/deliverables/J` | Poll export and obtain a fresh download URL | | POST | `/deliverables/J/cancel` | Cancel export | Use `/sessions/S/sources` for the canonical study/document source list and `/sessions/S/outputs` for saved Studio outputs. There are no duplicate public session creation, document upload, or Studio-save routes. ## Availability Hub endpoints return `404` when Hub analysis is disabled or the selected organization is outside the enabled organization list. A valid credential alone does not enable this feature. ## Retry and async contracts Session creation, chat, generation, edits, analysis creation, and deliverable creation require `Idempotency-Key` (1–200 characters). Reuse the same key and body after an uncertain network response; use a new key for a new operation. Conflicting reuse returns 409. Sync and async chat share the same underlying job, so callers can switch between them with the original key. Completed edits also replay the original job after the output has changed; retry keys are matched to the submitted request, not the current model settings or output revision. Both chat endpoints accept: ```json theme={null} {"prompt":"What drives trust? Include verified quotations.","parent_job_id":null,"include_synthetic":false} ``` For a follow-up, set `parent_job_id` to a completed chat job in the same session. `POST /chat` waits up to 120 seconds (`wait_seconds=0..120`). If still running, it returns **202**, the existing `job_id`, and `poll_url`; it does not cancel or restart the job. `/chat/jobs` returns **202** immediately. Poll until `status` is `succeeded` or `failed`. On success, `result.answer` and `result.references` contain the response. A partial completed analysis sets `result.partial=true`. Failed jobs return a public-safe error, without internal exception details. Study sync returns a `preparation_job_id` when preparation is needed. Poll it using the same jobs endpoint. Repeated sync reuses revision-aware preparation. External evidence supports TXT, Markdown, CSV, JSON, text PDFs, and DOCX up to 10 MB, using the same parser as the dashboard. ## Outputs and references Example generation body: ```json theme={null} {"type":"powerpoint","name":"Trust findings","prompt":"Summarize the saved findings for the product team.","template_id":null} ``` Generation and edits return **202** with a job. `result.output_id` identifies the saved output when successful. PowerPoint jobs remain running until the rendered file is ready. Edits retain the output ID and reuse the saved evidence; default reports cannot be edited or renamed. Report and PowerPoint edits are supported; Highlights are derived from default reports, not edited with prompts. `type:"highlights"` requests the saved default-report video, generated once per report revision. Its required `prompt` describes the request but does not change quote selection. Original participant audio is used where available; chat-only sources do not receive artificial narration. Reads include structured `references`: display label, study/interview ID, message index, and verified quotation. Document references include a source ID and page when available. Provider call identifiers, evidence hashes, and hidden dashboard reference catalogs are not part of the public content contract. Downloads default to Markdown for reports, PPTX for PowerPoints, and MP4 for Highlights. Use `?format=pdf` for a rendered presentation PDF. Video downloads redirect to a short-lived download capability. Access to source evidence is checked again when reading results or downloading files. Removing evidence can make earlier results unavailable; it does not grant continued access through saved output IDs. Templates use the dashboard's existing 5 MB upload and validation rules. Pass the returned template ID when generating the matching output type. Report templates accept Markdown, TXT, or DOCX with placeholders such as `{{title}}` and `{{findings}}`. Presentation templates accept 16:9 PPTX files and reuse their theme and layouts. Templates provide formatting, not research evidence. Expired or revoked outputs remain listable with `status: "unavailable"`; one unavailable artifact does not prevent listing the other session outputs. ## Read a chat reference `GET /intelligence-hub/sessions/{session_id}/jobs/{job_id}/references/{label}` resolves a verified citation from a completed chat answer. Use the exact `label` returned with that job. The response includes `reference`, `study_name`, `participant_label`, and an optional `interview` with speech around the cited turn and available playback links. Document references have no interview. Organization, session and source access are checked again; an unknown label or mismatched session does not return evidence. # Interview exports Source: https://docs.userintuition.ai/api-reference/interview-exports Download study interview evidence as private CSV or JSONL files ## Export one page Call `POST /api/public/v1/studies/{study_id}/exports/interviews` with `format=csv` or `format=jsonl`. The default `page=1` covers up to 100 interviews. A read-scoped API key can queue the export. Send an `Idempotency-Key` when retrying the same request after a timeout. ```http theme={null} POST /api/public/v1/studies/{study_id}/exports/interviews?format=jsonl&page=1&redact_pii=true Authorization: Bearer ui_sk_... Idempotency-Key: 97127ee4-65c2-4978-8f8f-4a19dd19812d ``` The `202` response includes a `job_id`. Poll `GET /api/public/v1/studies/{study_id}/exports/interviews/jobs/{job_id}` until `status` is `succeeded`. The successful response includes `download_url`, `record_count`, and `next_page`. Queue that next page to retrieve the rest of a large study. The JSONL file has one public interview object per line, with its spoken transcript turns. The CSV file has one row per spoken turn, with interview and participant IDs, status, quality, role, turn ID, message, and available timestamps. A CSV file may have more rows than `record_count`, which counts interviews. ## Privacy and retention Exports default to `redact_pii=true`. This masks email addresses, phone numbers, and US Social Security numbers in transcript and screener text, and omits participant email and recording URLs from JSONL. Pattern masking does not detect every identifier, including names and street addresses. Set `redact_pii=false` only if your use requires the unmasked public interview fields. Files live in a private storage bucket. The polling endpoint checks study access and job ownership before issuing a fresh signed URL that lasts 15 minutes. The job stops issuing URLs after seven days; the job processor deletes expired export objects. Store downloaded files according to your own retention policy. # API Introduction Source: https://docs.userintuition.ai/api-reference/introduction Integrate with User Intuition to manage studies, participants, interviews, and webhooks ## Public Integration API Supported settings and scoped usage are available through the [public reference and usage endpoints](/api-reference/reference-and-usage). 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](/api-reference/agents) for the review points, safe retry rules, and an evaluation recipe. For bulk interview evidence, use [interview exports](/api-reference/interview-exports) to request a private CSV or JSONL file by page. For an agent-friendly study-design flow, create a study draft and call `POST /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](/api-reference/openapi.json)** > > View the complete OpenAPI specification The public OpenAPI document is also available from the API host at `https://api.userintuition.ai/openapi.json` and `https://api.userintuition.ai/.well-known/openapi.json`. Both production URLs list public integration endpoints only. See [API capabilities](/api-reference/changelog) for available workflows and [API versioning](/api-reference/versioning-and-deprecation) for the public contract. Review the public [Security & Trust center](https://www.userintuition.ai/security/) 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](https://status.userintuition.ai/). ## Pagination Study, participant, and interview lists use `page` and `page_size`. Hub lists, research search, and deliverable lists return `next_cursor`; pass it unchanged as the endpoint’s `after` or `cursor` input with the same filters. Stop when it is null. An empty page can have a continuation cursor. ## Safe retries for creating resources Send a unique `Idempotency-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. ```http theme={null} Idempotency-Key: 97127ee4-65c2-4978-8f8f-4a19dd19812d ``` Keys are scoped to the authenticated user, organization, and operation. They contain 1–255 visible ASCII characters without spaces. Reusing a key with different input returns `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. For Hub session creation, chat, output generation, edits, and analysis/deliverable creation, the key is required and is limited to 200 characters. Calls to other operations 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](/api-reference/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: ``` https://api.userintuition.ai ``` ## Authentication All endpoints require Bearer token authentication. You can authenticate with either an **API key** or a **JWT token**. ```bash theme={null} Authorization: Bearer ``` ### 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 prefix `ui_sk_`. Users can belong to multiple organizations. [List accessible organizations and select one](/api-reference/organizations) for reads, writes, usage, and billing. Ordinary users can select active memberships; platform administrators retain app-wide access. API-key scopes and spend caps still apply. 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. 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](https://app.userintuition.ai), 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: ```bash theme={null} Authorization: Bearer ui_sk_aBcDeFgHiJkLmNoPqRs... ``` To revoke a key, return to the **API Keys** tab and click the trash icon next to it. Revoked keys stop working immediately and cannot be restored. > [!WARNING] > > The raw API key is only shown once at creation. If you lose it, revoke the old key and create a new one. > [!NOTE] > > See [Account settings → API keys](/resources/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](https://app.userintuition.ai) 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. > [!WARNING] > > Keep your JWT token secure and do not share it with others. This token provides authenticated access to your account. ## Available Resources > **[Studies](/api-reference/public-studies/list-studies)** > > Create and manage your studies, screeners, and interview configuration. > **[Interviews](/api-reference/public-interviews/list-interviews)** > > Access interview records, transcripts, recordings, and analysis data. > **[Participants](/api-reference/public-participants/create-participants)** > > Invite participants, send rewards, and track their status. > **[Webhooks](/api-reference/webhooks/overview)** > > 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`): ```json theme={null} { "studies": [...], "total_count": 100, "page": 1, "page_size": 20 } ``` ## Error Handling The API uses standard HTTP status codes: | Status Code | Description | | - | - | | `200` | Success | | `201` | Created | | `400` | Bad Request - Invalid input | | `401` | Unauthorized - Invalid or missing API key or session token | | `403` | Forbidden - The credential cannot access this resource | | `404` | Not Found | | `409` | Conflict - The resource is not in the required state | | `422` | Validation error | | `429` | Too Many Requests | | `500` | Internal Server Error | 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. ```json theme={null} { "detail": { "code": "stale_panel_estimate", "message": "The estimate expired or its study, launch inputs, balance, or price changed.", "recovery_action": "estimate_panel" }, "error": { "code": "stale_panel_estimate", "message": "The estimate expired or its study, launch inputs, balance, or price changed.", "field": null, "request_id": "74c5e6ec-9b78-4df1-97ce-bd12c952ca5a", "outcome": "not_started", "recovery_action": "estimate_panel", "docs_url": "https://docs.userintuition.ai/api-reference/introduction" } } ``` For a write with `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. | Situation | `outcome` | Recovery | | - | - | - | | Input or rate-limit rejection before work begins | `not_started` | Correct input or wait for `Retry-After` | | A conflict checked before a write | `not_started` | Follow `recovery_action` | | A write whose result may have changed state | `unknown` | Retrieve current state before retrying | | A failed read | `failed` | Retry the read | 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. `research_period: null` means fieldwork dates are unavailable. Date filters exclude undated documents. A saved interview evidence snapshot supplies the fieldwork dates during indexing. Generate a report with dated interview evidence to include it in date-filtered search. ## Rate Limiting API requests are rate limited to ensure fair usage. The default budgets are 300 requests per 60 seconds per signed-in user and 120 per API key or anonymous IP; deployed configuration can change them. Successful responses include `RateLimit-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, ordinary requests continue without rate headers; paid public actions are blocked. ## Support For API support, contact [support@userintuition.ai](mailto:support@userintuition.ai). # Organizations and workspace selection Source: https://docs.userintuition.ai/api-reference/organizations Discover accessible organizations and choose a workspace for API and MCP operations. A user can belong to multiple organizations. Call `GET /api/public/v1/organizations` to list accessible organizations, then select one for subsequent requests. Ordinary users see only their active memberships in the current app; platform administrators have app-wide discovery and research access. Organization owner or member roles do not grant platform-wide access. The listing accepts `search` for an organization name, active owner name, or owner email, plus `page` and `page_size` (maximum 100). Access filtering and search happen before pagination. Results contain organization IDs, names, and an `owners` array of active owner names and emails; it may be empty. Pass the chosen organization on each request: ```http theme={null} GET /api/public/v1/account/ HTTP/1.1 Authorization: Bearer ui_sk_... X-UI-Organization-ID: org_example ``` The header works with sessions and API keys. The API checks active membership for ordinary users and rejects an unauthorized selection with `403`. Missing, deleted, or cross-app organizations are unavailable. Selection changes only this request's workspace, billing, and audit context; it does not grant an administrator role or remove API-key scope checks, spend caps, or paid-action approval requirements. Without the header, the credential's default organization is used; platform administrators have global research read access. Use the same organization for reads, writes, usage, job polls, and billing. A selected organization that differs from the study's organization returns `404`. A platform administrator changing another organization's study without selecting its organization receives `409 organization_required`. MCP tools accept the equivalent optional `organization_id` input. Start with `list_organizations`, show the matches to the human, then pass the chosen ID to subsequent tools. `get_account` and `get_interview_usage_stats` accept it too. Verify the selected account and show the estimate before paid recruitment or participant rewards. Organization discovery is available on the full, core, read-only, and compact MCP profiles. # Panel targeting quotas Source: https://docs.userintuition.ai/api-reference/panel-targeting Set fixed interview targets for selected panel attribute options while leaving remaining capacity open Panel targeting quotas let you reserve part or all of a panel launch for specific answers to eligible single-select targeting attributes. You can preview them with either: * `POST /api/public/v1/studies/{study_id}/launch-panel` * `POST /api/public/v1/studies/create-and-launch-panel` ## Find attribute and option IDs Call `GET /api/public/v1/targeting-attributes/` before building the launch request. Use each catalog row's `qualification_id` and the `option_id` values from its `options` array. For an existing study, the targeted qualification must already be configured in the study's `targeting_attributes`. With `create-and-launch-panel`, configure the qualification in `study.targeting_attributes` and put its launch quotas in `panel.targeting_attributes`. This combined endpoint is for dry-run estimates only. To recruit, create the study, obtain its current estimate, and launch it with that estimate ID after approval. ## Request formats The request pages contain selectable, copyable examples beside the request-body schema: * [Launch Panel](/api-reference/public-studies/launch-panel) includes an untargeted cost estimate, the playground-safe array form, the equivalent object-map form, and a paid launch. * [Create Study and Launch Panel](/api-reference/public-studies/create-study-and-launch-panel) includes a targeted dry run. Paid recruitment uses the separate Launch Panel endpoint with a current estimate ID. In the playground-safe array form, add one `{ option_id, target }` item for every fixed target. Direct API clients may instead send `option_targets` as an object whose keys are option IDs and values are fixed interview counts. Both forms have identical behavior. Options omitted from either form remain **Open** and share the panel capacity left after fixed targets. ## Validation rules * Only eligible single-select attributes and the panel age attribute can have launch targets. * The attribute must have at least two qualifying options. * Every option target must be a positive whole number. * Targets for one attribute cannot add up to more than the panel's `target`. * If the configured targets add up to less than the panel target, at least one qualifying option must be omitted from `option_targets` and left Open. * The array format cannot contain the same `option_id` more than once. * A fully specified distribution is valid when its option targets add up exactly to the panel target. * Unknown or disqualifying option IDs are rejected. * Each `qualification_id` can appear only once in a launch request. > [!NOTE] > > A dry run validates targeting quotas with the same rules as a real launch, without creating a study or panel. # Get Account Source: https://docs.userintuition.ai/api-reference/public-account/get-account /api-reference/openapi.json get /api/public/v1/account/ Return account scope, available credits, and payment readiness. # Get Account Identity Source: https://docs.userintuition.ai/api-reference/public-account/get-account-identity /api-reference/openapi.json get /api/public/v1/account/identity Return the authenticated workspace without changing account state. # Get Interview Export Job Source: https://docs.userintuition.ai/api-reference/public-exports/get-interview-export-job /api-reference/openapi.json get /api/public/v1/studies/{study_id}/exports/interviews/jobs/{job_id} Poll a private export and receive a fresh 15-minute URL when complete. # Get Report Slide Export Job Source: https://docs.userintuition.ai/api-reference/public-exports/get-report-slide-export-job /api-reference/openapi.json get /api/public/v1/studies/{study_id}/exports/report-slides/jobs/{job_id} Poll a slide export and receive a fresh private download URL. # Queue Interview Export Source: https://docs.userintuition.ai/api-reference/public-exports/queue-interview-export /api-reference/openapi.json post /api/public/v1/studies/{study_id}/exports/interviews Queue a private CSV or JSONL export for one page of a study's interviews. # Queue Report Slide Export Source: https://docs.userintuition.ai/api-reference/public-exports/queue-report-slide-export /api-reference/openapi.json post /api/public/v1/studies/{study_id}/exports/report-slides Queue an editable PowerPoint deck from the latest saved study report. # Delete Study External Panel Source: https://docs.userintuition.ai/api-reference/public-external-panels/delete-study-external-panel /api-reference/openapi.json delete /api/public/v1/studies/{study_id}/external-panel Disable the external-panel entry link for an owned BYOP study. # Get Study External Panel Source: https://docs.userintuition.ai/api-reference/public-external-panels/get-study-external-panel /api-reference/openapi.json get /api/public/v1/studies/{study_id}/external-panel Get the external-panel entry link and outcome redirects for an owned BYOP study. # Put Study External Panel Source: https://docs.userintuition.ai/api-reference/public-external-panels/put-study-external-panel /api-reference/openapi.json put /api/public/v1/studies/{study_id}/external-panel Create or replace the external-panel integration for an owned BYOP study. # Regenerate Study External Panel Token Source: https://docs.userintuition.ai/api-reference/public-external-panels/regenerate-study-external-panel-token /api-reference/openapi.json post /api/public/v1/studies/{study_id}/external-panel/regenerate-token Replace the public entry token, immediately invalidating the old link. # Cancel Feasibility Request Source: https://docs.userintuition.ai/api-reference/public-feasibility/cancel-feasibility-request /api-reference/openapi.json post /api/public/v1/feasibility-requests/{request_id}/cancel Withdraw a pending request before a feasibility response is issued. # Get Feasibility Request Source: https://docs.userintuition.ai/api-reference/public-feasibility/get-feasibility-request /api-reference/openapi.json get /api/public/v1/feasibility-requests/{request_id} Get a feasibility request by ID. # List Feasibility Requests Source: https://docs.userintuition.ai/api-reference/public-feasibility/list-feasibility-requests /api-reference/openapi.json get /api/public/v1/feasibility-requests/ List the current account's feasibility requests, newest first. # Submit Feasibility Request Source: https://docs.userintuition.ai/api-reference/public-feasibility/submit-feasibility-request /api-reference/openapi.json post /api/public/v1/feasibility-requests/ Submit an audience for manual feasibility review. # Add All Sources Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/add-all-sources /api-reference/openapi.json post /api/public/v1/intelligence-hub/sessions/{session_id}/sources/all Select all accessible studies server-side without a fixed study-count cap. # Available Studies Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/available-studies /api-reference/openapi.json get /api/public/v1/intelligence-hub/studies List accessible studies with cursor pagination for session source selection. # Cancel Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/cancel /api-reference/openapi.json post /api/public/v1/intelligence-hub/runs/{run_id}/cancel Cancel pending or running analysis. Lease fencing prevents cancelled workers from publishing. # Cancel Deliverable Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/cancel-deliverable /api-reference/openapi.json post /api/public/v1/intelligence-hub/deliverables/{job_id}/cancel Cancel a queued or running export. A cancelled worker cannot publish its file. # Chat Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/chat /api-reference/openapi.json post /api/public/v1/intelligence-hub/sessions/{session_id}/chat Wait for a chat answer; return 202 with the same durable job if the wait expires. The timeout never cancels analysis. Use /chat/jobs for immediate acknowledgement. # Chat Answer Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/chat-answer /api-reference/openapi.json get /api/public/v1/intelligence-hub/runs/{run_id}/chat Read the verified chat answer from a completed run. # Claims Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/claims /api-reference/openapi.json get /api/public/v1/intelligence-hub/runs/{run_id}/claims Inspect paginated interview-level findings from completed tasks in this run. # Clear Sources Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/clear-sources /api-reference/openapi.json delete /api/public/v1/intelligence-hub/sessions/{session_id}/sources Clear selected session studies and revoke artifacts that depend on removed sources. # Create Report Video Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/create-report-video /api-reference/openapi.json post /api/public/v1/intelligence-hub/runs/{run_id}/report-video Generate once from default report Quotes; repeat requests reuse the retained video. # Create Run Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/create-run /api-reference/openapi.json post /api/public/v1/intelligence-hub/sessions/{session_id}/runs Start a durable analysis of the session sources. Reuse Idempotency-Key after a timeout. Study findings are prepared on sync and reused; editorial revisions reuse the original evidence. Presentation outputs automatically queue a PowerPoint when analysis completes. # Create Session Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/create-session /api-reference/openapi.json post /api/public/v1/intelligence-hub/sessions Create an organization-owned Intelligence Hub session. Reuse Idempotency-Key to recover the same session. # Create Session Video Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/create-session-video /api-reference/openapi.json post /api/public/v1/intelligence-hub/sessions/{session_id}/report-video Generate the saved default-report video once per report revision. # Delete Output Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/delete-output /api-reference/openapi.json delete /api/public/v1/intelligence-hub/sessions/{session_id}/outputs/{output_id} Soft-delete a Studio output without deleting its underlying study. # Delete Session Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/delete-session /api-reference/openapi.json delete /api/public/v1/intelligence-hub/sessions/{session_id} Soft-delete a session, revoking access to its analysis and outputs. # Download Output Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/download-output /api-reference/openapi.json get /api/public/v1/intelligence-hub/sessions/{session_id}/outputs/{output_id}/download Download a report, PowerPoint/PDF, or private Highlights video. Access is rechecked on every request. # Edit Output Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/edit-output /api-reference/openapi.json post /api/public/v1/intelligence-hub/sessions/{session_id}/outputs/{output_id}/edits Apply a prompt to the existing output in place; default reports are read-only. # Events Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/events /api-reference/openapi.json get /api/public/v1/intelligence-hub/runs/{run_id}/events Stream authorized analysis progress as server-sent events. Reconnect using the event cursor. # Evidence Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/evidence /api-reference/openapi.json get /api/public/v1/intelligence-hub/evidence/{evidence_id} Retrieve canonical evidence and its transcript locator within an authorized run. # Excluded Sources Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/excluded-sources /api-reference/openapi.json get /api/public/v1/intelligence-hub/runs/{run_id}/exclusions List excluded interviews and their exclusion reasons with cursor pagination. # Export Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/export /api-reference/openapi.json get /api/public/v1/intelligence-hub/runs/{run_id}/export Download verified run results as JSON, Markdown, CSV or editable PowerPoint. The run must be completed or partial; partial coverage remains explicit. # Generate Output Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/generate-output /api-reference/openapi.json post /api/public/v1/intelligence-hub/sessions/{session_id}/outputs Generate a report, native PowerPoint, or the saved default-report Highlights video. Highlights use original audio where available and are generated once per report revision; their prompt does not select new quotations. # Get Chat Reference Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/get-chat-reference /api-reference/openapi.json get /api/public/v1/intelligence-hub/sessions/{session_id}/jobs/{job_id}/references/{label} Resolve only a verified citation from this answer, rechecking source access. # Get Deliverable Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/get-deliverable /api-reference/openapi.json get /api/public/v1/intelligence-hub/deliverables/{job_id} Inspect an authorized export. Successful jobs return a private download URL valid for 15 minutes. Artifacts expire after seven days; source access is checked again at download. # Get Job Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/get-job /api-reference/openapi.json get /api/public/v1/intelligence-hub/sessions/{session_id}/jobs/{job_id} Poll a durable analysis or video job within the session. Internal errors are suppressed; completed responses include the result or output ID. # Get Output Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/get-output /api-reference/openapi.json get /api/public/v1/intelligence-hub/sessions/{session_id}/outputs/{output_id} Read one saved Studio output and its verified references after rechecking source access. # Get Run Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/get-run /api-reference/openapi.json get /api/public/v1/intelligence-hub/runs/{run_id} Inspect analysis status, verified results, coverage, budget and source changes. Access to the run and underlying sources is checked on every read. # Get Session Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/get-session /api-reference/openapi.json get /api/public/v1/intelligence-hub/sessions/{session_id} Read a session in the authenticated organization. # Highlight Candidates Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/highlight-candidates /api-reference/openapi.json get /api/public/v1/intelligence-hub/runs/{run_id}/highlights List cited evidence eligible for audio clipping, with exact IDs, stored timestamps and ineligibility reasons. Follow next_cursor for additional candidates. # History Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/history /api-reference/openapi.json get /api/public/v1/intelligence-hub/sessions/{session_id}/chat/history Read session chat turns from the durable Hub history, including pending turns. # List Deliverables Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/list-deliverables /api-reference/openapi.json get /api/public/v1/intelligence-hub/runs/{run_id}/deliverables List recent durable exports for this run with cursor pagination. Poll an individual job for a fresh download capability. # List Outputs Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/list-outputs /api-reference/openapi.json get /api/public/v1/intelligence-hub/sessions/{session_id}/outputs List saved Studio outputs, including default reports and pending generations, with cursor pagination. # List Sessions Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/list-sessions /api-reference/openapi.json get /api/public/v1/intelligence-hub/sessions List sessions in the authenticated organization with cursor pagination. # List Sources Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/list-sources /api-reference/openapi.json get /api/public/v1/intelligence-hub/sessions/{session_id}/sources List study and external-document sources with a shared cursor. Source IDs can be passed to removeHubSource. # Queue Chat Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/queue-chat /api-reference/openapi.json post /api/public/v1/intelligence-hub/sessions/{session_id}/chat/jobs Queue a chat turn. Reuse Idempotency-Key after an uncertain response. # Queue Deliverable Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/queue-deliverable /api-reference/openapi.json post /api/public/v1/intelligence-hub/runs/{run_id}/deliverables Queue an editable presentation, a single clip or an ordered reel from a completed or partial run. Reuse Idempotency-Key after a timeout. Audio requires exact verified evidence IDs, validated recording times and explicit acknowledgement of unredacted speech. # Remove Source Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/remove-source /api-reference/openapi.json delete /api/public/v1/intelligence-hub/sessions/{session_id}/sources/{source_id} Remove a source from the session and revoke dependent evidence access. # Rename Output Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/rename-output /api-reference/openapi.json patch /api/public/v1/intelligence-hub/sessions/{session_id}/outputs/{output_id} Rename a Studio output. Default reports are read-only. # Rename Session Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/rename-session /api-reference/openapi.json patch /api/public/v1/intelligence-hub/sessions/{session_id} Rename an existing organization session. # Resume Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/resume /api-reference/openapi.json post /api/public/v1/intelligence-hub/runs/{run_id}/resume Resume a paused analysis with an explicit additional model-call budget. Completed checkpoints are retained. # Run Studies Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/run-studies /api-reference/openapi.json get /api/public/v1/intelligence-hub/runs/{run_id}/studies List the frozen study manifest for this run with cursor pagination. # Runs Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/runs /api-reference/openapi.json get /api/public/v1/intelligence-hub/sessions/{session_id}/runs List this session’s durable analysis history with cursor pagination. # Saved Report Video Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/saved-report-video /api-reference/openapi.json get /api/public/v1/intelligence-hub/runs/{run_id}/report-video Read the saved highlights video associated with a run. # Saved Session Video Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/saved-session-video /api-reference/openapi.json get /api/public/v1/intelligence-hub/sessions/{session_id}/report-video Read the saved default-report video for a session. # Source Manifest Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/source-manifest /api-reference/openapi.json get /api/public/v1/intelligence-hub/runs/{run_id}/sources List the run’s frozen source revisions and processing coverage with cursor pagination. # Sync Study Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/sync-study /api-reference/openapi.json put /api/public/v1/intelligence-hub/sessions/{session_id}/studies/{study_id} Add or resync a study and queue revision-aware File Search preparation. # Upload Source Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/upload-source /api-reference/openapi.json post /api/public/v1/intelligence-hub/sessions/{session_id}/sources Attach TXT, Markdown, CSV, JSON, text PDF or DOCX evidence (up to 10 MB). # Upload Template Source: https://docs.userintuition.ai/api-reference/public-intelligence-hub/upload-template /api-reference/openapi.json post /api/public/v1/intelligence-hub/sessions/{session_id}/templates Upload a session-owned report template (TXT, Markdown, DOCX) or 16:9 PPTX template, up to 5 MB. Use its ID during generation. # Delete Interview Source: https://docs.userintuition.ai/api-reference/public-interviews/delete-interview /api-reference/openapi.json delete /api/public/v1/interviews/{interview_id} Soft-delete an interview owned by the authenticated user. # Get Interview Source: https://docs.userintuition.ai/api-reference/public-interviews/get-interview /api-reference/openapi.json get /api/public/v1/interviews/{interview_id} Read one interview's public metadata and a bounded page of transcript messages. # List Interviews Source: https://docs.userintuition.ai/api-reference/public-interviews/list-interviews /api-reference/openapi.json get /api/public/v1/interviews/ List interview summaries with pagination and optional study, participant, status, or quality filters. # List Organizations Source: https://docs.userintuition.ai/api-reference/public-organizations/list-organizations /api-reference/openapi.json get /api/public/v1/organizations List accessible organizations and active owner contacts. Users may belong to multiple organizations; select one with X-UI-Organization-ID on subsequent operations. Results are limited to active memberships unless the caller has platform-wide access. # List Panel Countries Source: https://docs.userintuition.ai/api-reference/public-panel-countries/list-panel-countries /api-reference/openapi.json get /api/public/v1/panel-countries/ Supported panel countries with their language options. Provide `language` OR `country` to filter (not both); omit both to list all. # Create Participants Source: https://docs.userintuition.ai/api-reference/public-participants/create-participants /api-reference/openapi.json post /api/public/v1/participants/ Queue up to 100 invitations. Poll the returned job before listing participants. # Delete Participant Source: https://docs.userintuition.ai/api-reference/public-participants/delete-participant /api-reference/openapi.json delete /api/public/v1/participants/{participant_id} Soft-delete a BYOP invitation; linked interviews require explicit cascade consent. # Get Participant Source: https://docs.userintuition.ai/api-reference/public-participants/get-participant /api-reference/openapi.json get /api/public/v1/participants/{participant_id} Retrieve one BYOP participant and their current lifecycle status. # Get Participant Job Source: https://docs.userintuition.ai/api-reference/public-participants/get-participant-job /api-reference/openapi.json get /api/public/v1/participants/jobs/{job_id} Poll an asynchronous participant creation job until it succeeds or fails. # List Participants Source: https://docs.userintuition.ai/api-reference/public-participants/list-participants /api-reference/openapi.json get /api/public/v1/participants/ List BYOP participants and invitation status, optionally filtered by study or email. # Patch Participant Source: https://docs.userintuition.ai/api-reference/public-participants/patch-participant /api-reference/openapi.json patch /api/public/v1/participants/{participant_id} Update email, customer ID, or bounded metadata. # Send Participant Reward Source: https://docs.userintuition.ai/api-reference/public-participants/send-participant-reward /api-reference/openapi.json post /api/public/v1/participants/{participant_id}/reward Send the configured incentive to a participant (BYOP studies only). # Get Study Type Source: https://docs.userintuition.ai/api-reference/public-reference/get-study-type /api-reference/openapi.json get /api/public/v1/reference/study-types/{slug} Read one visible planning template by slug. # List Interview Languages Source: https://docs.userintuition.ai/api-reference/public-reference/list-interview-languages /api-reference/openapi.json get /api/public/v1/reference/languages List language codes accepted by public study creation. # List Interview Modes Source: https://docs.userintuition.ai/api-reference/public-reference/list-interview-modes /api-reference/openapi.json get /api/public/v1/reference/modes List the supported interview formats. # List Study Types Source: https://docs.userintuition.ai/api-reference/public-reference/list-study-types /api-reference/openapi.json get /api/public/v1/reference/study-types Page through visible planning templates without their internal prompts. # List Voice Choices Source: https://docs.userintuition.ai/api-reference/public-reference/list-voice-choices /api-reference/openapi.json get /api/public/v1/reference/voices List product voice settings and display names without implementation data. # Answer Research Source: https://docs.userintuition.ai/api-reference/public-research-search/answer-research /api-reference/openapi.json post /api/public/v1/research/answer/ Answer from accessible indexed research with validated source citations. # Search Research Source: https://docs.userintuition.ai/api-reference/public-research-search/search-research /api-reference/openapi.json post /api/public/v1/research/search/ Rank candidate content, then return canonical stored JSON. # Create Study Source: https://docs.userintuition.ai/api-reference/public-studies/create-study /api-reference/openapi.json post /api/public/v1/studies/ Create a draft study. Customize its plan before inviting participants or launching recruitment. # Create Study And Launch Panel Source: https://docs.userintuition.ai/api-reference/public-studies/create-study-and-launch-panel /api-reference/openapi.json post /api/public/v1/studies/create-and-launch-panel Preview a Panel study without creating or fielding it. Paid launch requires a persisted study and a current estimate from the two-step launch flow. # Create Study With Participants Source: https://docs.userintuition.ai/api-reference/public-studies/create-study-with-participants /api-reference/openapi.json post /api/public/v1/studies/create-with-participants Create a BYOP study and its participant invitations in one request. # Customize Study Plan Source: https://docs.userintuition.ai/api-reference/public-studies/customize-study-plan /api-reference/openapi.json post /api/public/v1/studies/{study_id}/customize-plan Run one resumable turn through the same planning agent and tools used by the dashboard's Customize Plan page. The conversation id is stored on the study. Questions are returned to the caller; completed plan markdown is persisted automatically. # Delete Study Source: https://docs.userintuition.ai/api-reference/public-studies/delete-study /api-reference/openapi.json delete /api/public/v1/studies/{study_id} Soft-delete a study and remove its linked research from normal reads. # Estimate Panel Source: https://docs.userintuition.ai/api-reference/public-studies/estimate-panel /api-reference/openapi.json post /api/public/v1/studies/{study_id}/estimate-panel Read-only estimate of one panel recruitment cycle, including balance and card hold. # Generate Report Source: https://docs.userintuition.ai/api-reference/public-studies/generate-report /api-reference/openapi.json post /api/public/v1/studies/{study_id}/report Queue report analysis and return a job to poll; report.ready also fires on completion. # Get Customize Study Job Source: https://docs.userintuition.ai/api-reference/public-studies/get-customize-study-job /api-reference/openapi.json get /api/public/v1/studies/{study_id}/customize-plan/jobs/{job_id} Poll an asynchronous planning turn. A failed turn is not replayed automatically; inspect the saved study before retrying. # Get Fielding Progress Source: https://docs.userintuition.ai/api-reference/public-studies/get-fielding-progress /api-reference/openapi.json get /api/public/v1/studies/{study_id}/fielding-progress Show current target progress, quality grades, and a conservative finish estimate. # Get Report Source: https://docs.userintuition.ai/api-reference/public-studies/get-report /api-reference/openapi.json get /api/public/v1/studies/{study_id}/report Read the latest persisted report. Choose an overview, one section, or the full report with view. # Get Report Job Source: https://docs.userintuition.ai/api-reference/public-studies/get-report-job /api-reference/openapi.json get /api/public/v1/studies/{study_id}/report/jobs/{job_id} Poll an asynchronous report job until it succeeds or fails. # Get Study Source: https://docs.userintuition.ai/api-reference/public-studies/get-study /api-reference/openapi.json get /api/public/v1/studies/{study_id} Retrieve the persisted study, including its current plan, status, and participant link. # Get Study Embed Code Source: https://docs.userintuition.ai/api-reference/public-studies/get-study-embed-code /api-reference/openapi.json get /api/public/v1/studies/{study_id}/embed-code Return copy-ready HTML that launches a study from another website. # Launch Panel Source: https://docs.userintuition.ai/api-reference/public-studies/launch-panel /api-reference/openapi.json post /api/public/v1/studies/{study_id}/launch-panel Launch a paid panel for a Panel-type study (use ``dry_run`` for a cost estimate). # List Studies Source: https://docs.userintuition.ai/api-reference/public-studies/list-studies /api-reference/openapi.json get /api/public/v1/studies/ List studies visible to this account with pagination and optional filters. # Patch Study Source: https://docs.userintuition.ai/api-reference/public-studies/patch-study /api-reference/openapi.json patch /api/public/v1/studies/{study_id} Partially update a study. Only provided fields change; screener_questions and targeting_attributes are patched independently (one doesn't wipe the other). # Pause Study Source: https://docs.userintuition.ai/api-reference/public-studies/pause-study /api-reference/openapi.json post /api/public/v1/studies/{study_id}/pause Pause a study. Panel surveys, target cycles, and reward holds are preserved. # Queue Customize Study Plan Source: https://docs.userintuition.ai/api-reference/public-studies/queue-customize-study-plan /api-reference/openapi.json post /api/public/v1/studies/{study_id}/customize-plan/jobs Queue one planning turn and return immediately with a durable job ID. # Resume Study Source: https://docs.userintuition.ai/api-reference/public-studies/resume-study /api-reference/openapi.json post /api/public/v1/studies/{study_id}/resume Resume a paused study. A preserved panel survey returns to fielding. # Stop Study Source: https://docs.userintuition.ai/api-reference/public-studies/stop-study /api-reference/openapi.json post /api/public/v1/studies/{study_id}/stop Stop recruitment and prevent additional interviews through study links. # Upload Concept Image Source: https://docs.userintuition.ai/api-reference/public-studies/upload-concept-image /api-reference/openapi.json post /api/public/v1/studies/{study_id}/concept-images Upload a participant-facing image stimulus, up to 10 MB, to an owned study. # Upload Concept Image From Url Source: https://docs.userintuition.ai/api-reference/public-studies/upload-concept-image-from-url /api-reference/openapi.json post /api/public/v1/studies/{study_id}/concept-images/from-url Fetch a public image URL with redirect and private-network checks, then attach it to an owned study. # List Targeting Attributes Source: https://docs.userintuition.ai/api-reference/public-targeting/list-targeting-attributes /api-reference/openapi.json get /api/public/v1/targeting-attributes/ Catalog of panel targeting attributes, searchable by name and filterable by category. # Get Interview Usage Source: https://docs.userintuition.ai/api-reference/public-usage/get-interview-usage /api-reference/openapi.json get /api/public/v1/usage/interviews Read bounded usage with the same resolved scope and totals as the dashboard. # Create Webhook Source: https://docs.userintuition.ai/api-reference/public-webhooks/create-webhook /api-reference/openapi.json post /api/public/v1/webhooks/ Register a signed event webhook. The signing secret appears only in the creation response. # Delete Webhook By Id Source: https://docs.userintuition.ai/api-reference/public-webhooks/delete-webhook-by-id /api-reference/openapi.json delete /api/public/v1/webhooks/{webhook_id} Delete a registered webhook by ID. # Get Webhook Source: https://docs.userintuition.ai/api-reference/public-webhooks/get-webhook /api-reference/openapi.json get /api/public/v1/webhooks/{webhook_id} Retrieve one registered webhook without its signing secret. # List Webhook Deliveries Source: https://docs.userintuition.ai/api-reference/public-webhooks/list-webhook-deliveries /api-reference/openapi.json get /api/public/v1/webhooks/{webhook_id}/deliveries List bounded webhook delivery attempts and status without event payloads. # List Webhooks Source: https://docs.userintuition.ai/api-reference/public-webhooks/list-webhooks /api-reference/openapi.json get /api/public/v1/webhooks/ List the account's registered event webhooks without signing secrets. # Rotate Webhook Secret Source: https://docs.userintuition.ai/api-reference/public-webhooks/rotate-webhook-secret /api-reference/openapi.json post /api/public/v1/webhooks/{webhook_id}/rotate-secret Replace the signing secret; the new value is returned once. # Test Webhook Source: https://docs.userintuition.ai/api-reference/public-webhooks/test-webhook /api-reference/openapi.json post /api/public/v1/webhooks/{webhook_id}/test Send a signed test event containing no participant or study data. # Reference catalogs and usage Source: https://docs.userintuition.ai/api-reference/reference-and-usage Read supported study settings and bounded interview usage from the public API. The versioned public API provides read-only configuration catalogs. Each accepts the same API key or dashboard session as the other public endpoints: | Endpoint | Returns | | - | - | | `GET /api/public/v1/reference/languages` | Accepted language codes, names, and native names, including `auto` | | `GET /api/public/v1/reference/modes` | Supported interview formats | | `GET /api/public/v1/reference/voices` | Public `male` and `female` voice values with display names | | `GET /api/public/v1/reference/study-types` | Visible planning templates, paged and without internal prompts | | `GET /api/public/v1/reference/study-types/{slug}` | One visible planning template | | `GET /api/public/v1/usage/interviews` | Eligible interview counts, credits used, and resolved query scope | Use the `voice` value when creating a study; the display name is informational. A study-type planning template describes a use case. Public study creation accepts `in-depth-interview`, `concept-test`, or `prototype-test` as the research method. Study-type responses omit internal planning prompts. Usage accepts optional `start_date`, `end_date`, `cadence` (`daily`, `weekly`, or `monthly`), and `app_id`. Omitted dates resolve to an inclusive 30-day UTC range ending today. The response includes that resolved range and app in `scope`, so a zero total has a defined meaning. `total_interviews` counts eligible non-test interviews; `total_units` also includes non-refunded synthetic runs. Rows include bounded per-period counts and units. # Report slide exports Source: https://docs.userintuition.ai/api-reference/report-slide-exports Download an editable presentation from a saved study report ## Create a deck Call `POST /api/public/v1/studies/{study_id}/exports/report-slides` after the study report has been generated. A read-scoped API key can queue the export. Send an `Idempotency-Key` when retrying the same request after a timeout. ```http theme={null} POST /api/public/v1/studies/{study_id}/exports/report-slides?redact_pii=true Authorization: Bearer ui_sk_... Idempotency-Key: 97127ee4-65c2-4978-8f8f-4a19dd19812d ``` The `202` response includes a `job_id`. Poll `GET /api/public/v1/studies/{study_id}/exports/report-slides/jobs/{job_id}` until `status` is `succeeded`. The successful response includes `slide_count` and a fresh `download_url`. Download the editable PowerPoint (`.pptx`) file from that URL. The deck contains the saved executive summary, key metrics, findings and quotations, participant profiles, evidence coverage and gaps, next steps, and source reference IDs. It flags reports with outdated inputs or unverified evidence. It does not include raw participant response transcripts or recording URLs. Generate a new report first if you need current findings. ## Privacy and retention Exports default to `redact_pii=true`, which masks common email, phone, and US Social Security number patterns in report text. Pattern masking cannot detect every identifier, including names and street addresses. Set `redact_pii=false` only when your use requires unmasked report text. The file lives in the private `research-exports` bucket. The polling endpoint checks study access and job ownership before issuing a signed URL that lasts 15 minutes. The job stops issuing URLs after seven days, when the job processor deletes expired export objects. Store downloaded files according to your own retention policy. ## Export limits and errors Files must be at most 50 MB. A missing saved report returns `404` with `no_report_yet`; generate the report and wait for its job to succeed before exporting. An expired export returns `410`; queue a new export. Download URLs use HTTPS and expire after 15 minutes. # Sandbox quickstart Source: https://docs.userintuition.ai/api-reference/staging-quickstart Test the dashboard, API, and MCP workflows against staging with AI respondents. The sandbox uses staging data and credentials. Study design, analysis, and report workflows use the staging services. Participant links and the public feedback page are disabled: opening one shows a sandbox message, and the interview API rejects participant entry. Use **Test with AI** to preview an interview. | Surface | Sandbox URL | | - | - | | Dashboard | [sandbox.userintuition.ai](https://sandbox.userintuition.ai) | | Public API | `https://staging.userintuition.ai` | | MCP | `https://mcp.sandbox.userintuition.ai/mcp` | Create a staging API key in the sandbox dashboard under **Manage Account → API Keys**. A production key does not authenticate against staging. For a local MCP client, set `BACKEND_URL=https://staging.userintuition.ai`, `APP_URL=https://sandbox.userintuition.ai`, and `USERINTUITION_API_KEY` to the staging key. For hosted MCP clients, connect to the sandbox MCP URL above and complete its OAuth flow. ## Design and test a study Create a chat study with synthetic respondents. Send the research brief through Customize Plan, answer any returned `questions`, and review the saved plan. Wait for `provisioning_status` to become `provisioned`. ```sh theme={null} export UI_API_KEY='ui_sk_...' export UI_API_BASE='https://staging.userintuition.ai' curl -fsS "$UI_API_BASE/api/public/v1/studies/" \ -H "Authorization: Bearer $UI_API_KEY" \ -H 'Content-Type: application/json' \ -H "Idempotency-Key: $(uuidgen)" \ -d '{"name":"Sandbox concept feedback","study_type":"in-depth-interview","recruiting_method":"synthetic_respondents","interview_format":"chat"}' export UI_STUDY_ID='' curl -fsS "$UI_API_BASE/api/public/v1/studies/$UI_STUDY_ID/customize-plan" \ -H "Authorization: Bearer $UI_API_KEY" \ -H 'Content-Type: application/json' \ -H "Idempotency-Key: $(uuidgen)" \ -d '{"message":"Interview early-stage founders about how they evaluate customer research tools and what evidence earns their trust."}' curl -fsS "$UI_API_BASE/api/public/v1/studies/$UI_STUDY_ID" \ -H "Authorization: Bearer $UI_API_KEY" ``` In the dashboard, open **Test Conversation → Test with AI**. This runs one test interview and lets you watch the AI respondent. Test calls are excluded from report sample counts. The public feedback link and **Test it yourself** are unavailable in the sandbox. AI tests are currently unavailable for studies with a concept link. ## Launch three synthetic responses In **Ready to Launch**, choose **Launch Synthetic Study**. The sandbox starts a batch of **three** AI respondent interviews automatically. This is the minimum report sample; the three-response sandbox batch does not debit credits. Wait for all three to finish and pass interview quality checks. If any response is unusable, launch another synthetic batch from the study dashboard. The synthetic launch control and Test with AI are dashboard workflows; they are not operations in the stable public API or MCP tool catalog. API and MCP clients can use the staging study design and reporting endpoints before and after those dashboard steps. ## Generate and retrieve the report Once three usable synthetic responses are complete, open **Dashboard → Reports → Generate Report**, or use the public API (and its `generate_report` MCP equivalent): ```sh theme={null} curl -fsS -X POST "$UI_API_BASE/api/public/v1/studies/$UI_STUDY_ID/report" \ -H "Authorization: Bearer $UI_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" export UI_JOB_ID='' curl -fsS "$UI_API_BASE/api/public/v1/studies/$UI_STUDY_ID/report/jobs/$UI_JOB_ID" \ -H "Authorization: Bearer $UI_API_KEY" curl -fsS "$UI_API_BASE/api/public/v1/studies/$UI_STUDY_ID/report?view=overview" \ -H "Authorization: Bearer $UI_API_KEY" ``` With fewer than three usable synthetic responses, the sandbox rejects report generation with `insufficient_synthetic_responses`. Fetch `view=full` or a named section for detailed evidence. Keep the same idempotency key when retrying an uncertain report request. See the [API introduction](/api-reference/introduction) for job states and report views. # Study lifecycle Source: https://docs.userintuition.ai/api-reference/study-lifecycle Pause, resume, or stop a study before editing an active panel. Panel studies that are currently fielding must be paused or stopped before you edit them with `PATCH /studies/{study_id}`. Only supplied fields change. ## Draft and provisioned states Creating a study does not require every launch setting. A partial study is returned with `provisioning_status: "draft"` and a `missing_requirements` array. Study names supplied on creation or update may contain at most 40 characters. Reads can return longer saved names. Once the name, study plan, voice, and language are present, saving the study automatically provisions its interviewer. A successful response then returns `provisioning_status: "provisioned"`. Do not create participants or launch panel recruitment before that state. `POST /studies/create-with-participants` requires those four settings in the study body. It validates the complete request before creating the study or invitations. If a complete study returns `provisioning_status: "ready"`, it is configured but not yet provisioned. Retry a `PATCH` with its current complete settings. Launch endpoints return `409 Conflict` with `code: "study_not_provisioned"` until provisioning succeeds. ## Concept images Concept images can be attached in a Customize Plan turn or uploaded separately to an accessible study. Use `POST /api/public/v1/studies/{study_id}/concept-images` with a multipart `file` and participant-facing `label`, or `POST /api/public/v1/studies/{study_id}/concept-images/from-url` with JSON `{ "url": "https://…", "label": "Concept A" }`. Supported file types are PNG, JPEG, GIF, and WebP, up to 10 MB. The URL variant rejects private-network targets and checks every redirect. Either endpoint accepts `Idempotency-Key` for safe retries. Images are stored privately. A study read returns a first-party image URL that expires after one hour. Fetch the study again when a URL expires; do not save the URL as a permanent asset identifier. The image `id` remains stable for referring to an attachment. Uploading an image stores it on the study; send its image ID in the research brief if the planning conversation should include it in the Learning Plan. Removing an image or deleting its study revokes existing image links. Deleting a study also removes its uploaded concept images from storage. ## Recruitment status `fielding_status` describes recruitment separately from `provisioning_status`, which only describes interviewer readiness. Do not infer recruitment progress from provisioning or interview counts. `recruiting_method` is `panel`, `byop`, or `synthetic_respondents`. Feasibility requests use lowercase `status`: `received` or `responded`. These values are declared in the response schemas. Panel-country language options and panel launch responses use lowercase language codes such as `en` and `es`. The country codes remain uppercase. The `language` query filter accepts either case. The interview-language catalog also includes `auto` for automatic detection. | Value | Meaning | | - | - | | `not_started` | A Panel study has not begun recruitment, or a BYOP study is not yet provisioned. | | `collecting` | A provisioned BYOP study accepts interviews through its participant links. | | `starting` | Panel recruitment is launching or queued. | | `fielding` | Panel recruitment is active. | | `paused` | Panel recruitment or BYOP collection is paused. | | `complete` | Panel recruitment completed its target. | | `partial` | Panel recruitment ended with a partial result. | | `failed` | Panel recruitment failed. | | `stopped` | Panel recruitment or BYOP collection was stopped or cancelled. | | `not_applicable` | Synthetic respondents do not use recruitment fielding. | | `unknown` | The backend has a newer or unrecognized Panel state. | ## Pause a study ```http theme={null} POST /api/public/v1/studies/{study_id}/pause ``` Pausing temporarily stops new responses. For panel studies, the existing panel, recruitment progress, target cycle, and reward authorization hold are preserved. Resume the study to continue the same panel. ## Resume a study ```http theme={null} POST /api/public/v1/studies/{study_id}/resume ``` Resuming returns the preserved panel survey to fielding. It does not create a replacement panel or a second reward hold. ## Stop a study ```http theme={null} POST /api/public/v1/studies/{study_id}/stop ``` Stopping ends active or paused panel recruitment, closes the panel's target cycle, and settles the reward hold. Any unused authorization is released. Stopping is the appropriate choice when you do not intend to continue the current panel. ## Editing an active panel An edit request for a fielding panel returns `409 Conflict`: ```json theme={null} { "detail": { "code": "active_panel_must_be_paused_or_stopped", "message": "This panel study is currently fielding. Pause or stop the study before editing it. Pausing preserves the panel hold; stopping settles and releases it.", "actions": { "pause": { "method": "POST", "endpoint": "/api/public/v1/studies/study_123/pause", "documentation_url": "https://docs.userintuition.ai/api-reference/study-lifecycle#pause-a-study" }, "stop": { "method": "POST", "endpoint": "/api/public/v1/studies/study_123/stop", "documentation_url": "https://docs.userintuition.ai/api-reference/study-lifecycle#stop-a-study" } } } } ``` After either action succeeds, retry the original edit request. # API versioning Source: https://docs.userintuition.ai/api-reference/versioning-and-deprecation The public API contract and client requirements The integration API is served under `/api/public/v1/`. The [OpenAPI specification](/api-reference/openapi.json) describes its operations, authentication, request schemas, and response schemas. Clients should ignore response fields they do not recognize and process the webhook event types they subscribe to. Optional fields and event types allow the API to support additional workflows within v1. Use the documented public routes and schemas when building an integration. Consult the resource guides for pagination, durable jobs, idempotency, and error handling. # Webhooks Source: https://docs.userintuition.ai/api-reference/webhooks/overview Subscribe to interview, study, and report events at your own HTTPS endpoint. ## Overview Webhooks send an HTTP `POST` to your `hook_url` when subscribed events occur. Choose `interview.completed`, `study.completed`, `report.ready`, `study.paused`, `study.resumed`, `study.stopped`, participant lifecycle events, and/or `study.quota_reached` in `event_types`. Omit `study_id` for an account-wide webhook, or include an owned `study_id` to receive events for one study. The default subscription is `interview.completed`. Each subscribed event uses an envelope with `id`, `type`, `study_id`, and `data`. For `interview.completed`, `data` has the **same public shape** returned by [Get Interview](/api-reference/public-interviews/get-interview), including the participant, quality, messages, recording links, and screener responses. **1. Register a webhook** Call [Create Webhook](/api-reference/public-webhooks/create-webhook) with the `hook_url` that should receive events, with optional `study_id` and `event_types`. The response includes a `signing_secret` — store it securely to verify signatures. Send an `Idempotency-Key` to recover the same response after a timeout without registering a second webhook. The same-key response can be replayed for 30 days while the webhook and secret remain current; ordinary reads hide the secret. **2. Receive interview data** Your endpoint receives a signed `POST` when a subscribed event occurs. The interview payload is described below; study and report events use smaller data objects. **3. Stop receiving data** Delete the webhook by its `id` to stop further deliveries. The URL-based delete endpoint remains available for account-wide registrations. > [!NOTE] > > List and get operations return webhook IDs, scopes, event types, and URLs without > revealing stored signing secrets. Use secret rotation when the original secret > is lost or needs replacement; the new secret appears only in the rotation response. ## Participant lifecycle events | Event | When it fires | Data | | - | - | - | | `participant.screened` | Successful saved screener submission | `participant_id`, `interview_id` | | `participant.started` | VAPI in-progress callback matched to a saved interview and invite | `participant_id`, `interview_id` | | `participant.quality_scored` | Completed interview with an initial public quality rating | `participant_id`, `interview_id`, `quality` | | `study.quota_reached` | Active target cycle reaches its target | `cycle_id`, `completed_at` | These events are opt-in. They add no email, transcript, screener answer, or recording URL. Test interviews and panel fielding control records do not emit participant lifecycle events. Rejected screeners do not emit `participant.screened`. Start coverage is the VAPI callback path; it does not imply every chat or synthetic runtime emits a start event. Quality events cover the initial completion rating, not subsequent manual rescoring. Delivery ordering is not guaranteed. Participant event IDs combine event type and persisted interview ID. Quota event IDs include the target cycle ID. Deduplicate by envelope `id`, independently of signature verification. ## Delivery behavior | Property | Value | | - | - | | Method | `POST` | | Content type | `application/json` | | Trigger | The subscribed interview, study lifecycle, or report event | | Timeout | 30 seconds — respond before then | | Retries | Non-`2xx` responses and network failures retry with exponential backoff, up to 24 attempts | | Expected response | Any `2xx` status. Acknowledge quickly and do heavy processing asynchronously | Return `2xx` promptly and deduplicate using the stable event `id`: a timed-out delivery may have reached your receiver before it is retried. Inspect `/webhooks/{webhook_id}/deliveries` for status, timing, and coarse failure reasons. The history does not store payloads. ## Payload Subscribed events use `{id, type, study_id, data}`. For `interview.completed`, `data` is the completed interview in the same public shape as `GET /interviews/{id}`. The participant is nested under `data.participant`. ```json theme={null} { "id": "a1b2c3d4-0000-0000-0000-000000000000", "type": "interview.completed", "study_id": "11111111-2222-3333-4444-555555555555", "data": { "id": "a1b2c3d4-0000-0000-0000-000000000000", "study_id": "11111111-2222-3333-4444-555555555555", "participant": { "id": "66666666-7777-8888-9999-000000000000", "email": "jordan@example.com" }, "participant_source": "byop", "status": "completed", "quality": "Good", "ended_because": "participant_left", "started_at": "2026-06-30T14:02:11Z", "duration_seconds": 577, "messages": [ { "id": "turn_0", "role": "moderator", "message": "Thanks for joining..." }, { "id": "turn_1", "role": "participant", "message": "Happy to help..." } ], "total_message_segments": 2, "next_message_offset": null, "audio_recording_url": "https://.../recording.mp3", "video_recording_url": null, "screener_responses": [ { "question": "What is your role?", "type": "single_select", "answer": "Product Manager" } ] } } ``` `study.completed` is emitted when its active target cycle reaches its target. Each newly persisted report has its own `report.ready` event ID. ```json theme={null} {"id":"report-id","type":"report.ready","study_id":"study-id","data":{"report_id":"report-id"}} ``` The `study.completed` envelope has the same top-level fields, with a cycle ID as `id` and `data.completed_at` instead of `data.report_id`. A test ping uses `{"type":"webhook.test","id":"webhook-id"}` and contains no participant or study data. Test pings use the same signing headers and appear in delivery history. Public API pause, resume, and stop calls emit `study.paused`, `study.resumed`, and `study.stopped` after the transition succeeds. Their `data` contains only `study_id` and the resulting `fielding_status`. Each transition receives a new event ID; deduplicate redeliveries by that ID. These lifecycle events currently cover the public API routes, not dashboard transitions. ### Fields | Field | Type | Description | | - | - | - | | `id` | string | Stable event identifier; the interview ID for `interview.completed` | | `type` | string | Subscribed event type | | `study_id` | string | Identifier of the study this event belongs to | | `data` | object | Public event data; the following interview fields are inside `data` | | `data.id` | string | Unique identifier of the interview | | `participant` | object \| null | Who took the interview. `null` for anonymous panel interviews | | `participant.id` | string | Participant identifier | | `participant.email` | string \| null | Participant email, when available | | `participant_source` | string | `byop`, `panel`, `external_panel`, `link`, or `unknown`. `participant` is null for anonymous sources | | `status` | string | Final status of the interview, e.g. `completed` | | `quality` | string \| null | Quality label: `Poor`, `Fair`, `Good`, or `Excellent` | | `ended_because` | string \| null | Normalized reason: `completed`, `participant_left`, `time_limit`, `technical_error`, or `screened_out`; null when unknown | | `started_at` | string (date-time) \| null | When the interview started | | `duration_seconds` | integer \| null | Interview length in seconds | | `messages` | array \| null | Spoken turns with `id`, `role` (`moderator` or `participant`), and `message`; system prompts and tool calls are excluded | | `total_message_segments` | integer | Number of spoken turns in the webhook payload | | `next_message_offset` | integer \| null | Always null in completion webhooks, which include the full spoken transcript | | `audio_recording_url` | string \| null | Link to the audio recording, when available | | `video_recording_url` | string \| null | Link to the video recording, for video-mode studies | | `screener_responses` | array \| null | Participant's screener answers as `{ question, type, answer }` | > [!NOTE] > > Anonymous panel interviews have no identifiable participant, so `participant` is > `null` for them. Internal columns (transcripts of the raw call, internal IDs, and > the like) are never included — the webhook delivers exactly the public interview > shape. ## Authentication Every delivery is **signed** so you can verify it genuinely came from User Intuition. When you register a webhook, the response includes a `signing_secret` (prefixed `whsec_`, shown **once**). Each request carries two headers: | Header | Description | | - | - | | `X-UI-Timestamp` | Unix timestamp (seconds) when the request was signed | | `X-UI-Signature` | `sha256=` — HMAC-SHA256 of `"."`, keyed with your `signing_secret` | Copyable [TypeScript and Python SDK companion helpers](https://github.com/user-intuition/examples/blob/main/docs/sdk-helpers.md) verify raw-body signatures and poll existing jobs with bounded waits. They live outside Fern-generated SDK code, so regeneration cannot overwrite them. ### Verifying a signature Recompute the HMAC over `"."` using your stored `signing_secret` and compare it to `X-UI-Signature` in constant time. Use the **raw request body bytes** — do not re-serialize the parsed JSON, or the signature won't match. ```python theme={null} import hmac, hashlib, time def verify(request_body: bytes, timestamp: str, signature: str, secret: str) -> bool: # Reject stale signatures; separately deduplicate event IDs within the window. if abs(time.time() - int(timestamp)) > 300: return False expected = "sha256=" + hmac.new( secret.encode(), f"{timestamp}.".encode() + request_body, hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected, signature) ``` **1. Verify the signature** Reject any request whose `X-UI-Signature` doesn't match your recomputed HMAC. **2. Check the timestamp** Reject requests with an `X-UI-Timestamp` outside a small window (e.g. 5 minutes) to reject stale signatures. Separately deduplicate verified event IDs. **3. Use HTTPS** Always register an `https://` URL so the payload is encrypted in transit. > [!WARNING] > > Store the `signing_secret` securely — it is shown only once, at creation. If you > lose it or need to rotate it, call the secret-rotation endpoint and update your > receiver with the new secret. ## Managing webhooks Use `GET /api/public/v1/webhooks/` to find webhook IDs and `GET /api/public/v1/webhooks/{webhook_id}` to inspect one registration. Neither response includes its stored signing secret. Use `POST /api/public/v1/webhooks/{webhook_id}/rotate-secret` to replace a lost or compromised secret; update the receiver with the new one immediately. Use `POST /api/public/v1/webhooks/{webhook_id}/test` to send a signed, data-free test event. Check `GET /api/public/v1/webhooks/{webhook_id}/deliveries` for recent attempts (`page` and `page_size` are bounded). Delete by ID with `DELETE /api/public/v1/webhooks/{webhook_id}`. Repeating the delete returns 404. Use `DELETE /api/public/v1/webhooks/{webhook_id}` to delete a registered webhook. > **[Create Webhook](/api-reference/public-webhooks/create-webhook)** > > Register a URL, optional study scope, and event subscriptions. > **[Delete Webhook](/api-reference/public-webhooks/delete-webhook-by-id)** > > Stop sending completed interviews to a registered webhook ID. # Command Reference Source: https://docs.userintuition.ai/cli/commands OAuth login, API-key management, discovery, and direct tool invocation from the userintuition-mcp CLI. The CLI supports authentication, API-key management, tool discovery, and direct tool invocation. ``` userintuition-mcp [args...] ``` | Subcommand | Purpose | | - | - | | `login` or `auth login` \[--scopes read,write,...] | Sign in through browser OAuth with PKCE. | | `auth status` | Show whether OAuth and a saved API key are configured. | | `logout` or `auth logout` | Remove locally saved OAuth and API-key credentials. | | `api-key create [--name ] [--scopes read,write,...] [--spend-cap-usd ]` | Create an organization API key and save it locally. | | `api-key list` | List active organization API keys (never raw secrets). | | `api-key revoke ` | Revoke an organization API key. | | `list` | Print every tool name on stdout, one per line. | | `describe [--json]` | Print a tool's metadata and schemas for humans or automation. | | ` [flags]` | Run a tool and write its response to stdout. | \| `help` | Print usage. Also matched by `--help` or `-h`. With no arguments, the binary starts its stdio MCP transport. | *** ## Authentication and API keys ```bash theme={null} userintuition-mcp login userintuition-mcp auth status userintuition-mcp api-key create --name "My laptop" userintuition-mcp api-key list userintuition-mcp api-key revoke userintuition-mcp auth logout ``` `login` uses the hosted MCP OAuth service and opens a temporary callback only on `127.0.0.1`. `api-key create` requires that OAuth login, prints the raw key once, and saves it for subsequent CLI and stdio MCP calls. Login requests `read,write` by default. To authorize paid hosted tools, run `login --scopes read,write,panel:launch,rewards:send` and approve the requested access in the browser. You can grant only the paid scope you need. The CLI creates a read-only key by default. For a research agent that also writes, use `--scopes read,write`. Paid scopes require `write` and a positive lifetime cap, for example `--scopes read,write,panel:launch --spend-cap-usd 100`. *** ## `list` ```bash theme={null} userintuition-mcp list ``` Writes one tool name per line to stdout. Sorted alphabetically. Pipe into other shell tools: ```bash theme={null} # Count tools userintuition-mcp list | wc -l # Grep for a capability userintuition-mcp list | grep ^create_ ``` No backend call is made — `list` works without an API key. *** ## `describe [--json]` ```bash theme={null} userintuition-mcp describe estimate_panel ``` The human-readable form prints: * The tool's title (one line) * Its full description (the same text MCP clients see) * Every input flag (`--name`, optional flag suffix, type, enum choices, default, and description) Use this to discover argument names and types without leaving the terminal. Like `list`, it makes no backend call. Use `--json` before or after the tool name for a stable machine-readable object: ```bash theme={null} userintuition-mcp describe estimate_panel --json | jq .inputSchema userintuition-mcp describe --json estimate_panel ``` The object includes `name`, `title`, `description`, `inputSchema`, `outputSchema`, and `annotations`. Schemas are JSON Schema, so agents and scripts can inspect types, enum values, defaults, and required fields without parsing terminal prose. If the tool name is unknown, prints `Unknown tool: ` to stderr and exits with code `2`. *** ## ` [flags]` ```bash theme={null} userintuition-mcp [--key value ...] userintuition-mcp --input-json '' userintuition-mcp --input-json @ ``` Runs the tool. Output is the tool's text response written to stdout — typically JSON, the same payload an MCP client would receive. Tool errors remain JSON on stdout, but return a non-zero status so shells and agents cannot mistake them for success. ### Argument forms You can pass inputs three ways. They behave identically once parsed. **Inline flags** `--key value` pairs. Values are JSON-parsed when possible, so the right type lands in the schema: ```bash theme={null} userintuition-mcp estimate_panel \ --study_id 11111111-1111-4111-8111-111111111111 \ --target 25 \ --incident_rate 50 \ --country_code US ``` * `--target 25` → number `25` * `--quality '["Excellent"]'` (on `list_interviews`) → array * `--country_code US` → string (JSON parse fails, falls back to string) Flags with no value (e.g. `--verbose`) are treated as boolean `true`. **Inline JSON** For deeply nested inputs: ```bash theme={null} userintuition-mcp create_participants --input-json '{ "study_id": "11111111-1111-4111-8111-111111111111", "participants": [ {"email": "participant@example.com", "silent": true} ] }' ``` When `--input-json` is provided, all other `--flag` arguments are ignored. **JSON file** Prefix the path with `@`: ```bash theme={null} userintuition-mcp create_study --input-json @study.json ``` Best for inputs that live in source control alongside the script that uses them. ### Input validation Inputs are validated against the tool's Zod schema **before** any backend call. Missing required fields, wrong types, and enum mismatches all fail fast: ```bash theme={null} $ userintuition-mcp estimate_panel --study_id 11111111-1111-4111-8111-111111111111 --target notanumber --incident_rate 50 --country_code US Invalid input for estimate_panel: target: Invalid input: expected number, received string $ echo $? 2 ``` ### Exit codes | Code | Meaning | | - | - | | `0` | Tool completed successfully and its response is on stdout. | | `2` | CLI usage error — unknown subcommand, unknown tool, or input failed schema validation. | | `1` | The tool returned an error, or authentication, network, or an unexpected runtime failure occurred. Tool error JSON remains on stdout. | ### Output and pipes Tool responses go to **stdout**. Diagnostic logs (handler errors, stack traces) go to **stderr**. This separation means you can safely pipe into `jq` without log noise: ```bash theme={null} userintuition-mcp list_interviews --study_id 11111111-1111-4111-8111-111111111111 --page_size 1 | jq . ``` Backend errors round-trip as JSON on stdout, so a pipeline never silently drops them: ```bash theme={null} $ userintuition-mcp get_study --study_id 11111111-1111-4111-8111-111111111111 | jq . {"error": "Study not found"} $ echo ${PIPESTATUS[0]} 1 ``` Recoverable API failures may include typed fields in addition to the `error` string: ```json theme={null} { "error": "Service unavailable", "code": "service_unavailable", "http_status": 503, "request_id": "req_123", "retry_after": "30", "outcome": "unknown", "recovery_action": "retrieve_current_state_before_retry" } ``` For consequential writes such as participant rewards, a timeout or server failure means the outcome is unknown. Retrieve the current study state before deciding whether another write is safe; a request ID is diagnostic context, not an idempotency guarantee. *** ## `help` ```bash theme={null} userintuition-mcp help userintuition-mcp --help userintuition-mcp -h ``` All three forms print the same usage summary plus the full tool list. Makes no backend call. *** ## Environment | Variable | Required | Description | | - | - | - | | `USERINTUITION_API_KEY` | No | API key override, prefixed with `ui_sk_`. Takes precedence over saved credentials. | | `USERINTUITION_CONFIG_DIR` | No | Override the directory containing `credentials.json`. | | `USERINTUITION_OAUTH_ISSUER_URL` | No | Override the hosted OAuth issuer. Defaults to `https://mcp.userintuition.ai`. | | `BACKEND_URL` | No | Override the backend API URL. Defaults to `https://api.userintuition.ai`. | | `REQUEST_TIMEOUT_MS` | No | Timeout for ordinary API operations. Defaults to 30,000 ms. | | `LONG_OPERATION_TIMEOUT_MS` | No | Timeout for long-running operations such as customization and report generation. Defaults to 120,000 ms. | *** ## Tool inventory The CLI exposes 75 direct tool commands. Panel launch and review Apps are available through MCP clients; use the CLI for estimates, provisioning, and fielding inspection. For full descriptions grouped by capability, browse the [MCP tool reference](/mcp-server/tools/studies) — shared names, schemas, validation, and responses are identical. The quickest way to see what's available locally: ```bash theme={null} userintuition-mcp list | less userintuition-mcp describe --json ``` # User Intuition CLI Source: https://docs.userintuition.ai/cli/overview Call the same tools as the MCP server from a shell — 75 commands for studies, recruitment, interviews, and analysis, ready for scripts, CI, and ad-hoc debugging. The User Intuition CLI is the **same binary as the MCP server**, invoked as a plain command-line tool. Its 75 direct tool commands include `create_study`, `list_studies`, `estimate_panel`, `generate_report`, `search_research`, and `answer_research`. Paid panel launch and study/answer Apps use an MCP client. No MCP client is required for direct commands. ## When to reach for the CLI * **Shell scripts and CI jobs.** Pipe study results into `jq`, write a cost gate for a Panel estimate, automate cleanup of test studies. * **Cron and scheduled work.** Run nightly status sweeps, refresh cached reports, alert on long-running studies. * **Ad-hoc debugging.** Pin down whether a problem is the tool, the backend, or your MCP client — by isolating the call from the agent. * **Onboarding a teammate.** A browser login and one `userintuition-mcp list_studies` command are enough to get started. ## When to use the MCP server instead If an AI agent should *choose* the tool and fill in arguments (Claude, ChatGPT, Cursor), use the [MCP server](/mcp-server/overview). The CLI assumes you already know which tool and which arguments. ## What you get The CLI ships with the Node build of the MCP server (`@userintuition-ai/mcp` on npm). It uses the same OAuth service, API keys, input validation, public API endpoints, and response shapes — the only thing that changes is the transport. > [!NOTE] > > The CLI is **Node-only**. For Python integrations, use the [REST API](/api-reference/introduction). ## Next steps > **[Quickstart](/cli/quickstart)** > > Install the binary and make your first call in under two minutes. > **[Command reference](/cli/commands)** > > Every subcommand, every flag, with examples. > **[Recipes](/cli/recipes)** > > Practical patterns — CI cost gates, lifecycle scripts, batch operations. > **[Troubleshooting](/cli/troubleshooting)** > > Auth errors, missing binaries, common pitfalls. # Quickstart Source: https://docs.userintuition.ai/cli/quickstart Install the User Intuition CLI and make your first call in under two minutes. ## 1. Install **One-shot (npx)** No install — runs the latest published version on demand: ```bash theme={null} npx -y @userintuition-ai/mcp list ``` Slower per-invocation (npm fetches metadata). Best for occasional use. **Global** ```bash theme={null} npm install -g @userintuition-ai/mcp userintuition-mcp list ``` Installs once, then `userintuition-mcp` is on your `PATH`. Best for daily use. **Project-local** ```bash theme={null} npm install --save-dev @userintuition-ai/mcp npx userintuition-mcp list ``` Pinned to your project's `package.json` and lockfile. Best for CI and reproducible scripts. ## 2. Sign in ```bash theme={null} userintuition-mcp login ``` The CLI opens your browser, completes OAuth with PKCE on a temporary loopback callback, and saves the refreshable login in a private local credentials file. ```bash theme={null} userintuition-mcp auth status ``` > [!NOTE] > > Browser OAuth is best for interactive use. `USERINTUITION_API_KEY` environments are supported and take precedence over saved credentials. ## 3. Verify the connection ```bash theme={null} userintuition-mcp list_studies ``` A JSON object with a `studies` array (possibly empty) confirms the CLI, your login, and network egress to `api.userintuition.ai` are all working. ## 4. Create an API key for stdio or CI After OAuth login, the CLI can create and save an organization-scoped key: ```bash theme={null} userintuition-mcp api-key create --name "My laptop" ``` The raw `ui_sk_...` key is returned once and saved locally with file mode `0600`. Subsequent CLI calls and local stdio MCP sessions use it automatically. For CI, copy it into the `USERINTUITION_API_KEY` secret in your CI provider rather than copying the local credentials file. This key has read access. Add `--scopes read,write` when the agent needs to create or change research. Paid actions require their own scopes and a `--spend-cap-usd` value. ## 5. First real call Estimate the cost of fielding a panel for one of your studies without spending anything: ```bash theme={null} userintuition-mcp estimate_panel \ --study_id \ --target 25 \ --incident_rate 50 \ --country_code US ``` You should see the cost and timeline estimate on stdout — no panel is provisioned and nothing is charged. To launch recruitment, open an MCP client and use its panel review and human approval flow. The CLI supports estimation and fielding inspection. ## Next steps > **[Command reference](/cli/commands)** > > Full reference for `list`, `describe`, `call`, and every flag. > **[Recipes](/cli/recipes)** > > CI cost gates, lifecycle scripts, batch operations. # Recipes Source: https://docs.userintuition.ai/cli/recipes Practical patterns for using the User Intuition CLI in scripts, CI, and day-to-day automation. Concrete patterns you can copy and adapt. Each one assumes `userintuition-mcp` is on your `PATH` and you have either run `userintuition-mcp login` or set `USERINTUITION_API_KEY`. *** ## Cost gate in CI Refuse to merge a PR if its planned panel recruit would exceed a budget. `estimate_panel` returns the current cost and heuristic timeline without launching or charging anything: ```bash theme={null} #!/usr/bin/env bash set -euo pipefail estimate=$(userintuition-mcp estimate_panel \ --study_id "$STUDY_ID" \ --target 25 \ --incident_rate 50 \ --country_code US) cost_usd=$(jq -r '.estimated_total_cost_usd' <<<"$estimate") budget_usd=750 if (( $(echo "$cost_usd > $budget_usd" | bc -l) )); then echo "::error::Panel would cost \$$cost_usd — exceeds \$$budget_usd cap" >&2 exit 1 fi echo "Panel estimate: \$$cost_usd ✓" ``` *** ## Inspect fielding and retrieve a report After a person launches recruitment through an MCP client, inspect its progress and retrieve a generated report. This script observes fielding for up to 24 hours, then queues and polls report generation: ```bash theme={null} #!/usr/bin/env bash set -euo pipefail study_id="$1" target=25 # Recruitment is approved and launched through an MCP client. # 2. Poll — list_interviews returns a total_count envelope, so page_size 1 is # enough. Filter to completed interviews: the unfiltered total also counts # in-progress and failed sessions. deadline=$(( $(date +%s) + 86400 )) while (( $(date +%s) < deadline )); do n=$(userintuition-mcp list_interviews \ --study_id "$study_id" --status completed --page_size 1 \ | jq -r '.total_count // 0') echo " completed=$n/$target" (( n >= target )) && break sleep 600 done # 3. Analyze and export job_id=$(userintuition-mcp generate_report --study_id "$study_id" | jq -er '.job_id') report_deadline=$(( $(date +%s) + 1800 )) while true; do job=$(userintuition-mcp get_report_job --study_id "$study_id" --job_id "$job_id") status=$(jq -r '.status' <<<"$job") case "$status" in succeeded) break ;; failed|cancelled) echo "$job" >&2; exit 1 ;; esac (( $(date +%s) < report_deadline )) || { echo "Report job still pending: $job_id" >&2; exit 1; } sleep 5 done userintuition-mcp get_study_report --study_id "$study_id" \ > "report-$study_id.json" echo "Saved: report-$study_id.json" ``` *** ## Daily standup digest A cron job that writes per-study interview counts into a Slack-ready text file every morning. `list_interviews` with `page_size: 1` is the cheap way to count — the envelope's `total_count` covers the whole study, not just the page: ```bash theme={null} #!/usr/bin/env bash set -euo pipefail userintuition-mcp list_studies --page_size 50 \ | jq -r '.studies[] | "\(.id)\t\(.name)"' \ | while IFS=$'\t' read -r id name; do n=$(userintuition-mcp list_interviews \ --study_id "$id" --status completed --page_size 1 \ | jq -r '.total_count // 0') echo " • $name — $n completed interviews" done > /tmp/studies-digest.txt # Then post via your Slack tool of choice cat /tmp/studies-digest.txt ``` Schedule with cron: ``` 0 9 * * 1-5 USERINTUITION_API_KEY=ui_sk_... /usr/local/bin/digest.sh ``` *** ## Bulk cleanup of test studies Delete every study whose name starts with `test_`: ```bash theme={null} userintuition-mcp list_studies --page_size 100 \ | jq -r '.studies[] | select(.name | startswith("test_")) | .id' \ | while read -r id; do echo "Deleting $id" userintuition-mcp delete_study --study_id "$id" done ``` > [!WARNING] > > `delete_study` is destructive. Sanity-check the `jq` filter against `list_studies` output before running the loop. *** ## Review low-quality interviews List interviews classified as `Poor`, then fetch each full record for review: ```bash theme={null} #!/usr/bin/env bash set -euo pipefail study_id="$1" userintuition-mcp list_interviews \ --study_id "$study_id" --quality '["Poor"]' --page_size 100 \ | jq -r '.interviews[].id' \ | while read -r id; do userintuition-mcp get_interview --interview_id "$id" > "interview-$id.json" echo "Saved interview-$id.json" done ``` > [!WARNING] > > `delete_interview --interview_id ` is available after review, but deletion is destructive. The public API does not expose a reversible hide operation. *** ## Discovering tools by capability The CLI exposes 75 direct tool commands. Use its local inventory to discover commands. To find one for a job: ```bash theme={null} # Anything that creates something userintuition-mcp list | grep ^create_ # Anything related to interviews userintuition-mcp list | grep interview # Inspect a candidate userintuition-mcp describe create_participants ``` This is often faster than scrolling the [tool reference](/mcp-server/tools/studies). *** ## Patterns to avoid * **Don't hard-code IDs.** Always derive them from a fresh `list_*` call. IDs from a teammate's account won't resolve. * **Use MCP for paid panel launch.** The person reviews the saved plan and quote and approves through the App or explicit chat confirmation. * **Don't count by page.** Read `list_interviews.total_count` instead of counting one page's `interviews` array. * **Don't parse stdout in shell with `grep`/`sed`.** Use `jq` — responses are JSON and may add fields between versions. * **Don't share your `USERINTUITION_API_KEY` in CI logs.** Mask it as a secret. Anyone with the key can spend panel budget on your account. # Troubleshooting Source: https://docs.userintuition.ai/cli/troubleshooting Fixes for the most common CLI errors — missing binaries, auth failures, validation errors, and network problems. ## `command not found: userintuition-mcp` The binary isn't on your `PATH`. Pick the install style you used and verify: **Global install** ```bash theme={null} npm install -g @userintuition-ai/mcp which userintuition-mcp # should print a path ``` If `which` is empty, your global `npm` bin directory isn't on `PATH`. Run `npm config get prefix` and add `/bin` to `PATH`. **Project-local install** ```bash theme={null} npm install --save-dev @userintuition-ai/mcp npx userintuition-mcp list # use `npx` — node_modules/.bin/ isn't on PATH by default ``` **One-shot** ```bash theme={null} npx -y @userintuition-ai/mcp list ``` No install needed — npm downloads on demand. **Local checkout (contributors)** A package's own `bin` does **not** appear in its own `node_modules/.bin/`. Use one of: ```bash theme={null} # Symlink globally cd userintuition-mcpserver-ts && npm link userintuition-mcp list # Or run dist directly node ./dist/index.js list # Or run source via tsx (no build step) npx tsx ./src/index.ts list ``` *** ## `No authentication found` ``` No authentication found. Run `userintuition-mcp login` … ``` The CLI could not find a saved OAuth login, a saved API key, or `USERINTUITION_API_KEY`. Start with: ```bash theme={null} userintuition-mcp login userintuition-mcp auth status ``` For non-interactive CI, set `USERINTUITION_API_KEY` as a secret. Common causes: 1. **Not exported in the current shell.** ```bash theme={null} export USERINTUITION_API_KEY=ui_sk_... userintuition-mcp list_studies ``` 2. **Set in `~/.zshrc` but the shell didn't reload.** Open a new terminal or `source ~/.zshrc`. 3. **Running under `sudo` or a different user.** `sudo` strips most env vars — prefix the call: `sudo USERINTUITION_API_KEY=ui_sk_... userintuition-mcp call …` 4. **CI secret not wired.** Confirm the variable is set as a secret in your CI provider *and* exposed to the step that runs the CLI. *** ## `401 Unauthorized` from the backend The key is read but the backend rejected it. * **Revoked or rotated.** Run `userintuition-mcp login`, then `userintuition-mcp api-key create --name "Replacement"`, and update any CI secret. * **Wrong environment.** Production keys (`ui_sk_live_...`) don't work against staging and vice versa. Check `BACKEND_URL` if you've overridden it. * **Typo / wrapping whitespace.** `echo "$USERINTUITION_API_KEY" | wc -c` — should match expected key length (no trailing newline issues). *** ## `Invalid input for : …` Zod schema validation failed *before* the CLI tried to call the backend. The error message names the offending field. ```bash theme={null} $ userintuition-mcp estimate_panel --study_id 11111111-1111-4111-8111-111111111111 --target notanumber --incident_rate 50 --country_code US Invalid input for estimate_panel: target: Invalid input: expected number, received string ``` Re-read the schema: ```bash theme={null} userintuition-mcp describe estimate_panel ``` Common variants: * **Missing required flag.** Add it. * **String where a number/boolean/array is expected.** Make sure the value is JSON-parseable: `--target 25` not `--target "twenty-five"`; `--quality '["Excellent"]'` not `--quality Excellent`. * **Nested objects.** Use `--input-json` rather than flags. *** ## Tool call hangs or times out Network egress to `api.userintuition.ai` may be blocked or slow. ```bash theme={null} curl -sS -w "%{http_code}\n" -o /dev/null https://api.userintuition.ai/health # Expect 200 ``` If the curl works but the CLI hangs, the tool may legitimately be long-running (e.g. `generate_report`, which takes 30–120 seconds). Check the equivalent operation in the dashboard — if it normally takes minutes, the CLI behaves the same way. If you're on a corporate network, confirm a proxy hasn't TLS-intercepted the connection. Node respects `HTTPS_PROXY`; set it explicitly if needed. *** ## `EACCES` / permission denied on the binary After a manual `tsc` build, `dist/index.js` may not be executable. ```bash theme={null} chmod +x ./dist/index.js ``` `npm publish` handles this automatically — only a concern for local builds. *** ## Output isn't valid JSON The CLI writes the tool's text response verbatim to stdout. Most tools return JSON; a few (e.g. PowerPoint generation) return a URL or status string. Use `userintuition-mcp describe ` to confirm the response shape, and check whether the tool returned an `{"error": …}` envelope on a logical failure. If stderr contents are being mixed into your pipe, redirect them out: `userintuition-mcp list_studies 2>/dev/null | jq .`. *** ## Still stuck? Run the equivalent MCP call through the official inspector to isolate whether the issue is the CLI or the underlying tool: ```bash theme={null} npx @modelcontextprotocol/inspector npx -y @userintuition-ai/mcp ``` If it reproduces there, the bug is in the tool or the backend — open an issue at [github.com/userintuition](https://github.com/userintuition). If it only reproduces in the CLI, please include the exact command, your CLI version (`npm ls -g @userintuition-ai/mcp`), and Node version (`node --version`). # Create Study Source: https://docs.userintuition.ai/creating-a-study/create-study Pick the study type that matches what you want to learn: In-depth Interview, Concept Test, or Prototype Test. Pick the study type that matches what you want to learn. All three follow the same setup process. What differs is whether participants react to something, and what. **In-depth Interview** is selected by default. *** ## The three study types | Study type | Best for | What participants do | | - | - | - | | **In-depth Interview** | Understanding experiences, motivations, and decisions | Talk through what they did and why | | **Concept Test** | Reactions to an image or video | React to your concept and explain the reaction | | **Prototype Test** | Watching people use something | Work through your prototype while narrating | ### In-depth Interview **No stimulus, just a conversation.** Use this when you want to learn from people's lived experience. The moderator guides a focused discussion about what they did, why, and what they'd change. Reach for it when you're doing discovery, digging into a decision moment, exploring before you commit to a direction, or hunting for unmet needs. ### Concept Test **You have something to show:** an ad, a landing-page mockup, packaging, a feature explainer. Add the image or video, and the moderator walks participants through reacting to it. Reach for it for creative testing, messaging validation, packaging or pricing-page reactions, or A/B-style concept comparison. ### Prototype Test **You have something to try:** a prototype, a clickable mockup, or a live site. Share the link and participants work through it while narrating their thinking. Reach for it to validate a flow before you build it, find where people get stuck, compare an old design against a new one, or run a pre-launch usability check. *** ## Select your study type **1. Pick a card** Click the study type that matches what you're trying to learn. The selected card is highlighted with a dark background. **2. Continue** Click **Save & Continue** to go to Customize Plan. > [!TIP] > > Not sure? Start with **In-depth Interview**. Charles will help shape the plan once you describe what you want to learn, and you can come back and change it. *** ## Frequently asked questions > **Can I change my study type after selecting it?** > > Yes. Click **Back** at any point during setup to return here and pick a different one. > **Do different study types cost different amounts?** > > No. Cost depends on the interview format (chat, voice, or video), not the study type. See [Billing and credits](/resources/billing-and-credits). > **What if my research spans more than one study type?** > > Pick the one that matches your primary objective. In step 2, tell Charles about your other objectives and he'll work them into the plan. > **Can I show an image in an in-depth interview?** > > Yes. In-depth interviews accept concept images too, so a conversation can turn into a concept test partway through. *** ## Next steps > **[Step 2: Customize Plan](/creating-a-study/customize-plan)** > > Work with Charles to tailor the research plan. > **[Study Types](/study-types/overview)** > > What each study type does, how to set it up, and what you get back. # Customize Plan Source: https://docs.userintuition.ai/creating-a-study/customize-plan Chat with Charles, our AI researcher, to build a research plan around your company, situation, and objectives. Work with Charles, our AI researcher, to design a research plan for your context and objectives. A generic study asks generic questions. One built around your company, recent changes, and hypotheses gets insights you can act on. *** ## Chat with Charles Type your context in the chat, and the research plan builds in the panel on the right as you go. Keep chatting to refine it. At a minimum, Charles needs: * **Company or product name**, so the moderator knows who it's representing * **Core research question**: what you're trying to learn > [!TIP] > > If the default plan meets your needs, type something like "Use your best judgment" to proceed with the standard template. More context usually gives more actionable insights. ### Add attachments Click the **paperclip** in the message box to open **Add attachment**. You can add: * **A project brief (.docx)**: one Word document per message. Charles reads it as context for the plan. * **Concept images** (PNG, JPG, GIF, or WebP): the images you want participants to react to. Each image needs a unique label. See [Concept Test](/study-types/concept-test#attaching-images). Files can be up to 10 MB each. Attachments are sent with your next message. ### Add links To add a concept link or a prototype, paste the URL into the chat and tell Charles what it is. If the page appears to need a login, you're asked for login details to share with participants. See [Prototype Test](/study-types/prototype-test#adding-your-prototype). *** ## What Charles will ask Charles asks clarifying questions about your research context. They depend on your study type and what you share, and usually cover: **Context** * **Company/Product:** What company or product is this research for? * **Situation:** What's happening that prompted this research? * **Hypotheses:** What do you think might be causing the issue or driving the behavior? **Scope** * **Target participants:** Which customer segments should we prioritize? * **Time period:** What timeframe are we focusing on? * **Channels/touchpoints:** Are there specific areas of the experience to focus on? **Objectives** * **Key question:** What's the one question that must be answered for this study to be successful? * **Decisions:** What decisions will this research inform? * **Stakeholders:** Who will be using these insights? ### Example conversation Here's how a conversation with Charles might start for an NPS study. **You:** > "We're Nike Store and our NPS scores have dropped significantly over the past few months. We want to understand why our customers are less satisfied and what's driving the decline." **Charles:** > "Before I draft the Learning Plan, a few quick clarifications will sharpen the objectives and conversation flow: > > 1. **Scope of decline:** Which channels and geographies are included in the NPS drop (Nike.com, Nike App, SNKRS, owned retail, outlet, third-party marketplaces; US only or broader)? Over what exact period? > > 2. **Hypothesis inventory:** Beyond general dissatisfaction, do you have internal theories—pricing changes, inventory issues, shipping delays, recent app updates, return policy changes? > > 3. **Target participants:** Which segments should we prioritize, and which respondent roles? Do you want a balanced mix of detractors, passives, and promoters?" *** ## The research plan panel As you provide context, Charles generates a research plan in the right panel. It includes: | Section | Description | | - | - | | **Objective** | What the study aims to accomplish | | **Background** | Context about your company and situation | | **Learning Goals** | Answerable research questions, with the evidence needed beneath each goal | | **Conversation Flow** | Section-by-section outline with time estimates | | **Study-Specific Rules** | Instructions that shape how the moderator runs the conversation | *** ## Edit the research plan You have two ways to refine the plan. ### Keep chatting Ask Charles for changes, for example: * "Can you add questions about our recent pricing changes?" * "I'd like to focus more on the mobile app experience" * "Remove the section about competitive alternatives" Charles updates the plan based on your feedback. > [!TIP] > > You can ask Charles to add screener questions at any time, for example "add a screener for senior product managers." He'll prefer standard panel qualifications where they fit. ### Edit directly in Review Goals For small wording changes, edit the plan directly in the next step. When the plan covers your key questions, click **Save & Continue**. *** ## Frequently asked questions > **What if Charles asks a question I don't know the answer to?** > > Tell Charles what you do know. He works with whatever context you can provide. > **Can I come back and change the plan later?** > > Yes. Click **Back** to return to this step at any point, or edit the plan directly in step 3. > **How long does this step take?** > > Usually 5–10 minutes. Complex research can take longer. *** ## Next steps > **[Step 3: Review Goals](/creating-a-study/review-goals)** > > Name your study and edit the plan directly. > **[Best Practices](/resources/best-practices)** > > Design focused studies and turn interviews into decisions. # Creating a Study Source: https://docs.userintuition.ai/creating-a-study/overview See the six setup steps for creating a study, what you need before you start, and what to do once it's live. Setting up a study takes about 10–15 minutes across six steps. A seventh, inviting participants, happens on your dashboard once the study is live. *** ## The setup steps | Step | Name | What you'll do | | - | - | - | | 1 | [Create Study](/creating-a-study/create-study) | Pick one of the three study types | | 2 | [Customize Plan](/creating-a-study/customize-plan) | Work with Charles to tailor the research plan | | 3 | [Review Goals](/creating-a-study/review-goals) | Review and edit the generated plan | | 4 | [Setup Interview](/creating-a-study/setup-interview) | Moderator voice, format, language, recruiting method, screeners | | 5 | [Test Conversation](/creating-a-study/test-conversation) | Experience the study as a participant would | | 6 | [Ready to Launch](/creating-a-study/ready-to-launch) | Review everything and launch | | 7 | [Invite Participants](/recruiting/overview) | From your dashboard, once the study is live | *** ## Before you begin Have two things ready: * **A clear research question**: what are you trying to learn? * **Context to share**: background about your company, your situation, or your hypotheses By the end you'll have a research plan tailored to your question, a configured moderator, and a study ready to launch to your participants. *** ## Tips for a good study **Invest time in customization.** The more context you give Charles in step 2, the better your research plan. Don't rush it. **Always test before launch.** A ten-minute test conversation can save you from discovering a problem after twenty participants have already hit it. **Size the study before you launch it.** Most studies are smaller than the confidence people want from them. The [sample size calculator](/resources/sample-size) shows what your planned number buys, and what it would take to reach the confidence you're after. **Keep your research focused.** Resist asking about everything. A study that goes deep on 4–6 topics beats one that skims twelve. **Write for your participants.** Use language your participants use. Avoid internal jargon in your questions. *** ## After launch Once your study is live, you manage it from the study dashboard: * [Dashboard](/managing-your-study/dashboard): metrics, study status, and the tabs * [Study actions](/managing-your-study/study-actions): edit, duplicate, pause, rewards, delete * [Recruiting participants](/recruiting/overview): every way to reach participants * [Calls & transcripts](/results/calls-and-transcripts): review completed interviews * [Reports](/results/reports): generate and interpret insights *** ## Frequently asked questions > **Can I save and return later?** > > Yes. Progress saves automatically, so you can close the browser and pick up where you left off. > **Can I duplicate an existing study?** > > Yes. On the dashboard, open **Actions** and choose **Duplicate Study** to use it as a starting point for a new one. > **What if I make a mistake?** > > Click **Back** at any point to revise an earlier step. Most things can still be changed after launch, though changing questions mid-study makes early and late responses harder to compare. *** ## Next steps > **[Step 1: Create Study](/creating-a-study/create-study)** > > Pick the study type that matches what you want to learn. > **[Study Types](/study-types/overview)** > > Compare the three study types before you start. # Ready to Launch Source: https://docs.userintuition.ai/creating-a-study/ready-to-launch Review your full study configuration, then launch so the study is live and ready to receive participants. Review your complete study configuration and launch. Once launched, your study is live and ready to receive participants. *** ## What you'll see ### Summary cards At the top of the **Review your Study** screen, five cards summarize your configuration: | Card | Shows | | - | - | | **Study Type** | The type you selected (In-depth Interview, Concept Test, or Prototype Test) | | **Interviewer** | The moderator voice you chose | | **Interview Type** | The format you configured (Chat, Voice, or Video) | | **Language** | The interview language you selected | | **Recruiting** | Your recruiting method (BYOP, Panel, or Synthetic Respondent) | ### Study name This is how the study appears in your dashboard. ### Screener questions Each screener question is listed with its answer options and rules: which options **Disqualify**, and on multiple-select questions which are **Must Select**, **May Select**, or **Reject**. Text-input questions show their allowed and disallowed values, number range, or **All values accepted**. ### Research plan preview The complete research plan: Objective, Background, Learning Goals, Conversation Flow, and Study-Specific Rules. *** ## Final review checklist Before launching, confirm: **Research plan** * The objective clearly states what you're trying to learn * Questions are written in participant-friendly language * All important topics are covered * Time allocations are appropriate for each section **Interviewer settings** * The voice matches your brand and audience * The interview mode is appropriate for your participants * The language is the one your participants speak **Recruiting and screeners** * The recruiting method is the one you intend to use * Screener questions qualify and disqualify the right people **Study configuration** * The study name is descriptive and recognizable * You've tested the conversation (recommended) To change anything, click **Back** to return to the relevant step, make your changes, then click **Save & Continue** through the remaining steps to return here. *** ## Launch your study When you're ready, click **Save and Invite Participants**. Your study goes live and you're taken to the study dashboard. Launching doesn't send any invitations; you invite participants from the dashboard. If your workspace has fewer than 3 credits when you launch, you're taken to your **Wallet** to add credits first. Enterprise plans skip this check. > [!NOTE] > > In the [sandbox](/api-reference/staging-quickstart), synthetic studies show **Launch Synthetic Study** instead, which starts three synthetic interviews right away. *** ## What happens after launch **1. Study goes live** Your study is immediately active and can receive participants. **2. Invite participants** From the dashboard, invite participants using the options for your recruiting method: a study link, email invites, the embed widget, or an external panel for BYOP; our panel for Panel; or synthetic respondents for Synthetic. **3. Conversations happen** As participants complete interviews, data flows into your dashboard. **4. Review and analyze** Read transcripts, listen to recordings, and generate reports. **5. Get notified when complete** When your study hits its target, you and your organization's admins receive an email with the top insights at a glance and a link to the full report on your dashboard. *** ## Changes after launch You can rename the study at any time. You can also edit the research plan, interviewer voice, and interview mode, but avoid doing so once participants have responded. > [!WARNING] > > Changing questions or flow after participants have responded means earlier and later responses won't be directly comparable. For significant changes, create a new study instead. *** ## Frequently asked questions > **Can I pause or unpause a launched study?** > > Yes. Open **Actions** on the study dashboard and choose **Pause Study**. While paused, the study stops taking new responses and **Send Email Invites** is disabled, though the rest of the **Invite Participants** menu stays available. Choose **Resume Study** to start it again. A study that has already reached its target is complete and can't be paused. > **What if I need to start over?** > > Delete the study and create a new one. Deleting is permanent, and all of the study's data is lost. > **Is there a limit to how many studies I can have active?** > > No. *** ## Next steps > **[Recruiting overview](/recruiting/overview)** > > Every way to invite participants, and what each costs. > **[Dashboard](/managing-your-study/dashboard)** > > Track responses and manage your live study. # Review Goals Source: https://docs.userintuition.ai/creating-a-study/review-goals Name your study and edit the research plan Charles generated before you set up the interview. Review the research plan Charles generated in the previous step, and edit it directly before the study goes live. *** ## Name your study At the top of the screen, name your study. Charles suggests a name based on your conversation, and you can change it. Names can be up to 40 characters. A good name includes: * The research type (e.g., "NPS Deep Dive") * A date or quarter (e.g., "Q1 2026") * The customer segment, if relevant (e.g., "Enterprise Customers") **Example names:** * "Nike Voice Survey" * "Q4 Churn Analysis - SMB Segment" * "Post-Launch NPS - Mobile App Users" *** ## Check the research plan Below the study name, the full research plan opens in a rich text editor. It includes: * **Objective**: what the study aims to accomplish. It should directly address your business question. * **Background**: context about your company and situation that informs how the moderator approaches conversations. * **Learning Goals**: specific, answerable research questions, each with the evidence needed underneath. A goal can also list relevant perspectives or a boundary. Older plans may also have a separate Key Questions list. * **Conversation Flow**: a section-by-section outline of how each interview will progress, including time estimates. * **Study-Specific Rules**: instructions that guide how the moderator runs the conversation. *** ## Edit the research plan Click into the document and type to edit. The toolbar has undo and redo, a heading dropdown, bold, italic, links, bulleted and numbered lists, and block quotes. | Edit | How | | - | - | | **Add a question** | Go to the relevant section and type your question | | **Remove a question** | Select and delete questions that aren't relevant | | **Adjust focus** | Change time estimates and question counts for each section | | **Refine language** | Adjust wording to match how your customers talk | Changes save automatically as you edit. For bigger changes, click **Back** to return to Customize Plan and tell Charles what you'd like. He updates the plan, and you can review it again here. When the plan is ready, click **Save & Continue**. *** ## Frequently asked questions > **Can I add entirely new sections to the research plan?** > > Yes. Keep new content in the same overall structure so the moderator can follow it. > **What if I accidentally delete something important?** > > Use the **Undo** button to restore deleted content. If you've made many changes and want to start over, click **Back** to return to step 2 and regenerate the plan. > **How long should the research plan be?** > > There's no strict limit, but longer plans mean longer interviews. Most effective studies have 4–6 main topic areas with 2–4 questions each. > **Will participants see this document?** > > No. The plan guides the moderator. Participants only experience the conversation. *** ## Next steps > **[Step 4: Setup Interview](/creating-a-study/setup-interview)** > > Choose the voice, format, language, recruiting method, and screeners. > **[Step 2: Customize Plan](/creating-a-study/customize-plan)** > > Go back to Charles for bigger changes to the plan. # Setup Interview Source: https://docs.userintuition.ai/creating-a-study/setup-interview Set the moderator voice, interview format, language, recruiting method, and screener questions for your study. This step sets how participants experience the interview. It has five collapsible sections. Your choices save automatically. *** ## Moderator voice Choose who will conduct the interview. Each voice is built for research conversations: warm, professional, and easy to sit with for twenty minutes. To preview one, click the **play button** on its card. We recommend listening to each before you choose, since the voice sets the tone of every conversation in the study. Click a card to select it. > [!NOTE] > > The voice applies to voice and video interviews only. In chat, participants never hear the moderator. *** ## Interview format How participants interact with the moderator. | Format | What participants do | Credits per interview | | - | - | - | | **Chat** | Type their responses | 0.5 | | **Voice** | Speak and hear the moderator | 1 | | **Video** | Speak on camera, optionally sharing their screen | 2 | **You choose the format; participants can't change it.** Whatever you set here applies to every interview in the study. Two things limit the choice: * **Studies with concept links can't use chat.** Concept links need a screen-capable interview, so **Chat** is disabled once the study has them. * **Synthetic studies must use chat.** Choosing **Synthetic** as the recruiting method switches the format to chat. Choosing **Voice** or **Video** also adds a consent screener to your [screener questions](#screener-questions-and-targeting-attributes). It tells participants the format and roughly how long the interview takes, based on your plan. It screens out anyone unwilling to take part, and for video, anyone without a webcam they're willing to use. Switching to chat removes it. > **[Interview modes in depth](/getting-started/interview-modes)** > > Permissions, screen sharing, cost, and what each format is good for. *** ## Interview language Select the language for the interview. Eighty-two are available, plus auto-detect. English — `en`\ Afrikaans — `af`\ Albanian (Shqip) — `sq`\ Amharic (አማርኛ) — `am`\ Arabic (العربية) — `ar`\ Armenian (Հայերեն) — `hy`\ Assamese (অসমীয়া) — `as`\ Azerbaijani (Azərbaycanca) — `az`\ Basque (Euskara) — `eu`\ Bengali (বাংলা) — `bn`\ Bosnian (Bosanski) — `bs`\ Bulgarian (Български) — `bg`\ Burmese (မြန်မာ) — `my`\ Cantonese (粵語) — `yue`\ Catalan (Català) — `ca`\ Croatian (Hrvatski) — `hr`\ Czech (Čeština) — `cs`\ Danish (Dansk) — `da`\ Dutch (Nederlands) — `nl`\ Estonian (Eesti) — `et`\ Filipino — `fil`\ Finnish (Suomi) — `fi`\ French (Français) — `fr`\ Galician (Galego) — `gl`\ Georgian (ქართული) — `ka`\ German (Deutsch) — `de`\ Greek (Ελληνικά) — `el`\ Gujarati (ગુજરાતી) — `gu` Hebrew (עברית) — `he`\ Hindi (हिन्दी) — `hi`\ Hungarian (Magyar) — `hu`\ Icelandic (Íslenska) — `is`\ Indonesian (Bahasa Indonesia) — `id`\ Inuktitut (ᐃᓄᒃᑎᑐᑦ) — `iu`\ Irish (Gaeilge) — `ga`\ Italian (Italiano) — `it`\ Japanese (日本語) — `ja`\ Javanese (Basa Jawa) — `jv`\ Kannada (ಕನ್ನಡ) — `kn`\ Kazakh (Қазақша) — `kk`\ Khmer (ភាសាខ្មែរ) — `km`\ Korean (한국어) — `ko`\ Lao (ພາສາລາວ) — `lo`\ Latvian (Latviešu) — `lv`\ Lithuanian (Lietuvių) — `lt`\ Macedonian (Македонски) — `mk`\ Malay (Bahasa Melayu) — `ms`\ Malayalam (മലയാളം) — `ml`\ Maltese (Malti) — `mt`\ Mandarin Chinese (中文) — `zh`\ Marathi (मराठी) — `mr`\ Mongolian (Монгол) — `mn`\ Nepali (नेपाली) — `ne`\ Norwegian Bokmål (Norsk bokmål) — `nb`\ Odia (ଓଡ଼ିଆ) — `or` Pashto (پښتو) — `ps`\ Persian (فارسی) — `fa`\ Polish (Polski) — `pl`\ Portuguese (Português) — `pt`\ Punjabi (ਪੰਜਾਬੀ) — `pa`\ Romanian (Română) — `ro`\ Russian (Русский) — `ru`\ Serbian (Српски) — `sr`\ Sinhala (සිංහල) — `si`\ Slovak (Slovenčina) — `sk`\ Slovenian (Slovenščina) — `sl`\ Somali (Soomaali) — `so`\ Spanish (Español) — `es`\ Sundanese (Basa Sunda) — `su`\ Swahili (Kiswahili) — `sw`\ Swedish (Svenska) — `sv`\ Tamil (தமிழ்) — `ta`\ Telugu (తెలుగు) — `te`\ Thai (ไทย) — `th`\ Turkish (Türkçe) — `tr`\ Ukrainian (Українська) — `uk`\ Urdu (اردو) — `ur`\ Uzbek (Oʻzbekcha) — `uz`\ Vietnamese (Tiếng Việt) — `vi`\ Welsh (Cymraeg) — `cy`\ Wu Chinese (吴语) — `wuu`\ Zulu (isiZulu) — `zu` ### Pick a specific language wherever you can **Setting a specific language localizes the whole participant experience.** The screener questions and the moderator's opening line are translated into it, as well as the conversation. **Auto-detect (Ask Participant)** lets each participant choose their language once the conversation starts. The screener questions and the moderator's opening line stay in **English**. A participant who came for a Spanish interview meets an English screener and greeting first. > [!WARNING] > > If most interviews will be in one language, **set that language**. Reserve auto-detect for mixed audiences where you can't predict the language and can accept an English screener. For multi-market research where each market matters, running one study per language gives every participant a fully localized experience. It also gives you results you can compare market by market. *** ## Recruiting method How you'll reach participants. Three options: | Option | Meaning | | - | - | | **BYOP** | Bring your own participants directly, or connect your own panel provider, while managing recruiting and billing yourself | | **Panel** | Recruit participants from our network of quality respondents | | **Synthetic** | Run chat interviews with AI respondents based on your qualifying screeners and targeting attributes | **This choice determines your invite options after launch.** BYOP studies get a study link, email invites, embed codes, and an [external panel](/recruiting/external-panels) connection. Panel studies get panel recruiting and niche audience requests. Synthetic studies recruit from [synthetic participants](/recruiting/synthetic-respondents). When you first choose **Synthetic**, the format switches to chat, and four targeting attributes are added to your screener to shape the AI respondents: **Age**, **Gender**, **Household Income**, and **Ethnicity**. Remove any you don't need. Synthetic isn't available for studies with concept links. *** ## Screener questions and targeting attributes Qualify participants before they reach the interview. ### Standard attributes Six common attributes are one click away as pills: **Age**, **Gender**, **Zip Code**, **Region**, **Household Income**, and **Ethnicity**. Click one to add it to your screener. For anything beyond those, click **Advanced** to browse the full catalog of standard qualifications. ### Custom questions Click **Add Question** to write your own. Each custom question has one of three types: | Type | What participants do | How you qualify them | | - | - | - | | **Single Select** | Pick one option | Tick **Disqualify** on any option that should screen people out | | **Multiple Select** | Pick several options | Set a rule on each option: **Must Select**, **May Select**, or **Reject** | | **Text Input** | Type an answer | Doesn't screen anyone out. Set what it **Accepts**: **Any text** or **Numbers only**, with an optional allowed input range for numbers | On multiple-select questions, **Must Select** means a participant has to choose that option to qualify, **May Select** means choosing it is fine either way, and **Reject** screens out anyone who chooses it. Click **Add "Other"** to add an Other option, and tick **Allow freeform** so participants can type their own answer. To qualify people on a number, use a select question with options. A number range on a Text Input only limits what participants can enter. Standard attributes follow the same rules. Most are option-based; **Zip Code** is a text input where you list **Allowed ZIP codes** and **Disallowed ZIP codes** (comma-separated; leave the allowed list empty to accept all). Questions can be reordered by dragging, and collapsed while you work on others. ### Randomize answer options When editing a multiple-choice screener question, use the **Randomize options** checkbox next to the question type to shuffle the order of that question's answer options. * When enabled, participants see that question's answer options in a fresh random order each time they open the screener. Which options qualify or disqualify is unchanged. * Randomizing helps reduce **order bias** (the tendency to pick whichever option appears first), so your qualifying data better reflects genuine choices. * Leave it unchecked to always show options in the order you wrote them. That's the better choice when the order is meaningful, such as ranked scales or ascending ranges. *** ## Continue Review your selections and click **Save & Continue**. *** ## Frequently asked questions > **Can I add screener questions later?** > > Yes, either here or by asking Charles in step 2. He'll use standard qualifications where they fit. > **What if a participant's device doesn't support the format?** > > They see an error before the interview starts. Voice and video need a working microphone, and video needs a camera that the participant allows access to. Chat works anywhere. > **Where do I set participant rewards?** > > After launch, from the dashboard **Actions** menu. See [Study actions](/managing-your-study/study-actions). *** ## Next steps > **[Step 5: Test Conversation](/creating-a-study/test-conversation)** > > Take the interview yourself or watch an AI respondent take it. > **[Recruiting overview](/recruiting/overview)** > > How to choose a recruiting method, and what each costs. # Test Conversation Source: https://docs.userintuition.ai/creating-a-study/test-conversation Take your interview yourself or watch an AI respondent take it, then fix problems before real participants arrive. Experience your study from a participant's perspective before launching, and check that the conversation flows naturally and covers what you need. Take the interview yourself, or watch an AI respondent take it. Either way it's the moderator you configured, running your research plan. Testing is optional, but a ten-minute test catches problems while they're cheap to fix. **Test conversations are free and don't count against your usage limits**, for both **Test it yourself** and **Test with AI**. Test as many times as you need. *** ## Run a test ### Start the test Choose one of two options: | Option | What happens | | - | - | | **Test it yourself** | Talk to your moderator as a participant would. The interview opens in a new tab, and you're brought back here when it ends. | | **Test with AI** | Watch an AI respondent take the interview live, in a chat transcript on this screen. | > [!NOTE] > > For studies with concept links, use **Test it yourself**. **Test with AI** isn't available for them. In the [sandbox](/api-reference/staging-quickstart), only **Test with AI** is available. ### During the test Whichever option you choose, the conversation follows the full participant flow: 1. The moderator greets the participant and introduces the study 2. It asks questions from your research plan 3. It probes deeper based on the responses 4. The conversation wraps up **Tips for testing it yourself:** * **Respond naturally:** answer as a real participant would. * **Vary your answers:** give some detailed answers and some brief ones. * **Test edge cases:** see what happens when you give an unexpected answer. * **Finish the conversation:** experience the entire flow. ### Rate the test When the conversation ends, or you end it early, rate it: * Click **View call** to open the test call's details once it's ready. * Click **Good** if it went well. You move straight on to Ready to Launch. * Click **Needs Work** if something was off. Describe the problem in the text box, then choose one: * **Send feedback to the Team**: sends your feedback to us and moves you on to step 6. * **Use feedback to improve your Study**: takes you back to [Customize Plan](/creating-a-study/customize-plan) and sends your feedback to Charles, who revises the plan. * Click **Test Again** to run another test. *** ## Fix problems yourself Besides **Needs Work**, you can change the plan directly: * **Small changes to wording or flow:** click **Back** twice to return to [Review Goals](/creating-a-study/review-goals), edit the plan, then go through the steps again to re-test. * **Significant restructuring:** click **Back** to return to [Customize Plan](/creating-a-study/customize-plan), tell Charles what you need, let him regenerate the plan, then review and test again. *** ## Continue to launch Click **Save & Continue**. You can do this without running a test, or with minor issues noted, but we recommend at least one test first. Otherwise your first real participant is your first test. *** ## Frequently asked questions > **Do test conversations appear in my results?** > > They're labeled with a **Test** badge so you can tell them apart from real participants, and they're never eligible for rewards. > **Can other team members test the conversation?** > > Yes. Anyone with access to the study can run a test conversation. > **How long does a test conversation take?** > > As long as a real interview, usually 10–20 minutes depending on your research plan. You can end early if you've seen enough. > **The moderator responded differently than I expected. Is that a problem?** > > Not necessarily. It adapts to each conversation, so no two run identically. Adjust your research plan if it *consistently* misses an important probe or heads somewhere you don't want. *** ## Next steps > **[Step 6: Ready to Launch](/creating-a-study/ready-to-launch)** > > Review your full configuration and launch. > **[Calls & Transcripts](/results/calls-and-transcripts)** > > Review completed interviews and their transcripts. # Interview Modes Source: https://docs.userintuition.ai/getting-started/interview-modes Compare chat, voice, and video interviews by what they capture, the permissions they need, and their cost, then pick one. Every study runs in one of three formats: chat, voice, or video. You choose the format in [Setup Interview](/creating-a-study/setup-interview), and it applies to every interview in the study. Participants can't change it. *** ## The three formats | | Chat | Voice | Video | | - | - | - | - | | **What participants do** | Type their responses | Speak, and hear the moderator | Speak on camera | | **What's captured** | Transcript | Transcript + audio | Transcript + audio + video | | **Device permission needed** | None | Microphone | Camera and microphone | | **Screen sharing** | — | Available | Available | | **Credits per interview** | 0.5 | 1 | 2 | *** ## Chat Participants type their answers in a text conversation. This is the lowest-friction option. There's nothing to allow or set up, and it works anywhere a browser does. Participants can take their time composing an answer, which suits detailed or technical questions and anyone answering in a second language. The trade-off is that typed answers tend to be shorter and flatter than spoken ones. You lose hesitation, emphasis, and the moment someone talks themselves into a different opinion. *** ## Voice Participants speak and hear the moderator, like a phone call. This is the workhorse format. Spoken answers run longer and reveal more than typed ones, and a twenty-minute conversation isn't tiring in the way twenty minutes of typing would be. You get tone, hesitation, and the moment someone changes their mind. Participants can also **share their screen** in voice interviews, which is enough for most walkthroughs. You see what they're doing without needing them on camera. *** ## Video Participants speak on camera, and can share their screen. Use video when you need to see the person or what they're looking at: reactions to a concept, watching someone work through an interface, or research where facial expression is part of the finding. > [!NOTE] > > **Video interviews require the camera.** Participants can't start until they allow camera access in their browser. Anyone who won't or can't turn their camera on can't take part. *** ## Permissions and privacy Chat needs no device access at all. Voice and video ask for the microphone, and for video the camera, **before the interview starts**. Participants decide on permissions up front, and consent is handled before any recording begins. Voice and video studies also get a consent screener added automatically. It tells participants the format, that the moderator is AI, and roughly how long the interview takes. Anyone unwilling to take part is screened out, and for video, so is anyone without a webcam they're willing to use. If a participant's device or browser can't support the format, or they block the permission, they see an error before the conversation starts. *** ## Cost Interviews are billed in credits, and the format sets the multiplier: chat 0.5, voice 1, video 2. A video interview costs four times a chat interview. If you don't need the camera, voice gets you most of the depth at half the price. > **[Billing and credits](/resources/billing-and-credits)** > > What a credit costs on each plan. *** ## When a format isn't available Two study settings narrow your choice: * **Concept links rule out chat.** A study with concept links needs a screen-capable interview, so **Chat** is disabled. Use voice or video. * **Synthetic respondents are chat only.** Choosing [Synthetic](/recruiting/synthetic-respondents) as the recruiting method switches the study to chat. *** ## Choosing a format Start with **voice**. It's the best depth-per-credit trade in the platform and suits most research. Move to **video** when seeing the participant is part of the finding, and accept that requiring the camera will turn some participants away. If you only need to see their screen, voice with screen sharing gets you there. Use **chat** when speaking isn't practical: participants in open-plan offices, sensitive topics people would rather type, or audiences where typing lowers the barrier enough to matter for your response rate. *** ## Frequently asked questions > **Can I change the format after launch?** > > Yes, from **Actions → Edit Study**, but responses collected before and after won't be directly comparable. If you're partway through, duplicate the study instead. > **Does the moderator appear on camera in video interviews?** > > No. The moderator speaks and listens; there's no on-camera avatar. Participants see themselves and their own screen share. > **Does the voice selection matter in chat studies?** > > No. Participants never hear the moderator in chat, so the voice applies only to voice and video. The moderator's personality is the same across all three. *** ## Next steps > **[Study Types](/study-types/overview)** > > Pick between an interview, a concept test, and a prototype test. > **[Setup Interview](/creating-a-study/setup-interview)** > > Where you set the format, voice, and language. # Key Concepts Source: https://docs.userintuition.ai/getting-started/key-concepts Learn the core concepts behind User Intuition: studies, interviews, Charles, the moderator, reports, and credits. These are the building blocks of User Intuition. Read this page once before you create your first study. *** ## Studies A **study** is a research project focused on a specific question. Each one has: * **A research plan**: the objective, answerable Learning Goals with evidence requirements, and conversation flow * **An interview setup**: moderator voice, format, language, recruiting method, and screeners * **Participants**: who you've invited and where they've got to * **Results**: completed interviews, transcripts, and reports ### Study types There are three. All follow the same setup process; what differs is whether participants react to something, and what. | Type | Best for | | - | - | | **In-depth Interview** | Experiences, motivations, and decisions, with no stimulus | | **Concept Test** | Reactions to an image or video | | **Prototype Test** | Watching people work through a prototype or live site | > **[Study types in depth](/study-types/overview)** > > What each one does and when to reach for it. *** ## Interviews An **interview** (also called a call) is one conversation between the moderator and one participant. Interviews are: * **Conversational**: natural dialogue, not a rigid survey * **Adaptive**: the moderator follows up based on what it hears * **Deep**: it probes past the first answer to get at the reasoning underneath * **Recorded**: transcript captured automatically, with audio or video where the format includes it ### Interview formats | Format | What participants do | Credits | | - | - | - | | **Chat** | Type their responses | 0.5 | | **Voice** | Speak and hear the moderator | 1 | | **Video** | Speak on camera, optionally sharing their screen | 2 | You set the format for the whole study when you build it. > **[Interview modes](/getting-started/interview-modes)** > > How chat, voice, and video differ in permissions, screen sharing, and cost. ### Interview quality Every completed interview is rated **Excellent**, **Good**, **Fair**, or **Poor**, based on how long the conversation ran, how substantive the answers were, and how much of your research plan it covered. *** ## Charles, your AI researcher **Charles** helps you design studies. During setup he asks clarifying questions about your goals, drafts a research plan, and revises it as you give feedback. You work with Charles in chat. *** ## The moderator The **moderator** is the AI that runs the actual conversations with participants. It follows your research plan while adapting to each conversation, probes deeper when something interesting surfaces, and keeps a warm, professional tone throughout. Charles and the moderator are different things: **Charles helps you design the study; the moderator runs it.** *** ## Participants **Participants** are the people who complete your interviews. There are three recruiting methods: | Method | How you reach participants | | - | - | | **BYOP** (bring your own participants) | Share a study link · Send email invites · Embed a widget · [Connect your own panel provider](/recruiting/external-panels) | | **Panel** | Recruit from our panel · Recruit a niche audience | | **Synthetic** | Run chat interviews with [AI respondents](/recruiting/synthetic-respondents) built from your screeners and targeting attributes | You choose one when you set up the study, and it determines your invite options on the dashboard. > **[Recruiting participants](/recruiting/overview)** > > How to choose, and what each method costs. *** ## Reports **Reports** synthesize your interviews into findings, evidence coverage, participant responses and profiles, and recommended next steps. Generate one once you have usable interviews, and regenerate it as more come in. See [Reports](/results/reports). *** ## Intelligence Hub The **Intelligence Hub** is a workspace for analyzing knowledge across studies rather than within one. Sync completed studies, upload external documents, and ask questions in plain language across everything at once. It also generates reports and presentations. It's available on the Pro plan. A per-study report answers "what did this study find?" The Intelligence Hub answers "what do we know?" and gets richer with every study you sync into it. > **[Intelligence Hub guide](/results/intelligence-hub)** > > Sync sources, ask questions, and generate outputs. *** ## Key metrics You'll see these on every study dashboard: | Metric | Meaning | | - | - | | **Responses** | Completed interviews | | **Avg Length** | Average interview duration | | **Quality Interviews** | Responses that meet the quality bar for reports | | **Study Progress** | Responses collected against your target | *** ## Credits Interviews are paid for in **credits**. How many an interview costs depends on its format (chat 0.5, voice 1, video 2), and what a credit costs depends on your plan. Test conversations are free. > **[Billing and credits](/resources/billing-and-credits)** > > Plans, credit pricing, and panel costs. *** ## Next steps > **[Interview Modes](/getting-started/interview-modes)** > > How chat, voice, and video differ. > **[Creating a Study](/creating-a-study/overview)** > > The full setup guide, step by step. # Quickstart Guide Source: https://docs.userintuition.ai/getting-started/quickstart Create, test, and launch your first research study in about 15 minutes. This guide gets you from zero to collecting insights in about 15 minutes. For detail on each step, see [Creating a Study](/creating-a-study/overview). ## Before you begin Have ready: * A clear research question: what are you trying to learn? * Context about your company and situation * A list of people to invite, or a plan to use our research panel or synthetic respondents ## Launch your first study **1. Create Study** Choose one of three study types: **In-depth Interview**, **Concept Test**, or **Prototype Test**. In-depth Interview is selected by default. Click **Save & Continue**. > [!TIP] > > Not sure which? Start with In-depth Interview and tell Charles what you want to learn. You can change it later. **2. Customize Plan** Chat with Charles about your company, what you're trying to learn, and any hypotheses you have. Your research plan builds in the panel on the right as you talk. **Example input:** > "We're Nike Store and our satisfaction scores have dropped over the past few months. We want to understand why customers are less happy and what's driving the decline." This step usually takes 5–10 minutes. The more context you give Charles, the more useful the plan. **3. Review Goals** * Give your study a descriptive name * Review the generated research plan * Edit any questions or flow directly * Click **Save & Continue** **4. Setup Interview** Configure five things: * **Moderator voice**: preview the options and pick one * **Interview format**: Chat, Voice, or Video * **Interview language**: 82 languages, or auto-detect and let the participant pick * **Recruiting method**: BYOP (bring your own participants), Panel, or [Synthetic](/recruiting/synthetic-respondents) (AI respondents, chat only). This determines your invite options later. * **Screener questions**: qualify participants before they reach the interview Click **Save & Continue**. **5. Test Conversation** This step is recommended: a test run catches problems before real participants hit them. Test conversations are free and don't consume credits. * Choose **Test it yourself** to take the interview as a participant would, or **Test with AI** to watch an AI respondent take it live * When it ends, click **Good** to move on, or **Needs Work** to send feedback to our team or back to Charles to improve the plan * Click **Test Again** to run another **6. Ready to Launch** Review your study configuration, screener questions, and research plan, then click **Save and Invite Participants**. Your study is now live. Launching doesn't invite anyone yet. **7. Invite Participants** You're taken to your study dashboard. Open the **Invite Participants** menu. What you see depends on the recruiting method you chose in step 4. | If you chose | Your options | | - | - | | **BYOP** | Copy the study link · Send email invites · Copy the embed code · Bring your own panel | | **Panel** | Recruit from our panel · Recruit a niche audience | | **Synthetic** | Recruit from synthetic participants | See [Recruiting Participants](/recruiting/overview) for how to choose and what each method costs. ## Next steps > **[Key Concepts](/getting-started/key-concepts)** > > How studies, interviews, the moderator, and the Intelligence Hub fit together. > **[Creating a Study](/creating-a-study/overview)** > > Detail on each setup step. # HubSpot Source: https://docs.userintuition.ai/integrations/hubspot Connect HubSpot to sync your CRM contacts and lists, then invite them to any BYOP study with Send Email Invites. Connect HubSpot to use your CRM contacts as a source for [email invites](/recruiting/invite-customers). Your HubSpot contacts and lists sync into User Intuition and appear under **Invite Participants** → **Send Email Invites** on every BYOP study. *** ## Install the app **1. Open the listing** Find **User Intuition** in the HubSpot Marketplace (or use the install link from your team) and click **Install**. **2. Choose your portal** Select the HubSpot account to connect. You must be an admin of that portal. **3. Authorize the requested scopes** The app requests read access to contacts, companies, and deals, plus permission to show its card on CRM records. Click **Connect app**. **4. Land in User Intuition** You're signed in to User Intuition and land on **Create Study**. If your HubSpot email already has a User Intuition account, that account is linked. Otherwise a new one is created. **5. Run the first sync** A default **All Contacts** segment is created automatically. Start the first sync from the User Intuition card on any HubSpot record or from the app settings page. Each portal has one connection. Reinstalling on the same portal updates it rather than creating a duplicate. *** ## Invite HubSpot contacts to a study **1. Open Send Email Invites** On the study's **Invites** tab, click **Invite Participants** → **Send Email Invites**. **2. Select the HubSpot connection** Click the HubSpot card at the top of the panel. It shows the sync status and how many contacts are available. **3. Pick contacts or segments** Use the **Contacts** tab to search by name, email, or phone, or the **Segments** tab to pick whole segments (each shows its customer count). **4. Send** Click **Send N Invitations** (or **Send to N Segments**). Contacts without an email address are skipped, and anyone already invited to this study isn't invited again. **Send Email Invites** is available on BYOP studies that aren't paused. See [Send Email Invites](/recruiting/invite-customers) for the full workflow. *** ## What you see in HubSpot ### CRM record cards A **User Intuition** card appears on contact, company, and deal records in HubSpot. It shows: * The portal's sync state (idle, syncing, completed, or error) * How many contacts have been imported * A button to start a sync * A link to your User Intuition workspace To invite the people on a contact, company, or deal, pick them in a study's **Send Email Invites** panel. ### App settings page Open the User Intuition app from **Settings** → **Integrations** → **Connected apps** in HubSpot. Use this page to see the portal's sync status, start a full sync, or open your User Intuition workspace. *** ## What syncs Data flows one way, from HubSpot into User Intuition. Interview data isn't written back to HubSpot. | HubSpot object | Becomes in User Intuition | Notes | | - | - | - | | Contact | Contact | Email, name, and phone are mapped; other properties are stored with the contact. | | HubSpot list (where applicable) | Segment | Pick from the **Segments** tab when sending invites. | | — | **All Contacts** segment | Created on connection so you can invite every synced contact at once. | Companies and deals aren't imported as separate records. You invite their associated contacts. ### Start a sync You can start a sync from: * The User Intuition card on any HubSpot record * The User Intuition settings page in HubSpot * The re-sync button on the HubSpot connection card in User Intuition's invite panel (shown once the status is **COMPLETE** or **FAILED**) A sync updates existing contacts in place rather than duplicating them. The first sync on a large portal can take several minutes. ### Automatic updates New contacts and contact property changes in HubSpot flow into User Intuition automatically. Changes to properties outside those events are picked up on the next full sync, so run one occasionally as a backstop. *** ## Uninstall the app Uninstalling the app from HubSpot disconnects the portal and stops updates from flowing into User Intuition. Studies, invites, and interviews you've already run stay in your workspace. Reconnecting later starts fresh and re-runs the full sync. On a large portal, plan it for a quiet window. *** ## Pitfalls and known limits > **Admin install only** > > Installing requires HubSpot admin permissions on the portal. If install fails, check the installer's role. > **One portal per account** > > A User Intuition account links to one HubSpot portal. Connecting a different portal replaces the existing link. *** ## Next steps > **[Shopify](/integrations/shopify)** > > Invite your store's customers the same way > **[Send email invites](/recruiting/invite-customers)** > > Manual entry, contacts, segments, and tracking # Shopify Source: https://docs.userintuition.ai/integrations/shopify Connect your Shopify store to sync customers and segments, then invite them to any BYOP study with Send Email Invites. Connect Shopify to use your store's customers as a source for [email invites](/recruiting/invite-customers). Customers and customer segments sync into User Intuition and appear under **Invite Participants** → **Send Email Invites** on every BYOP study. *** ## Install the app Installing the app creates your User Intuition account automatically. You don't need to sign up first. **1. Install from the Shopify App Store** Find the User Intuition listing and install it. **2. Approve the requested scopes** The app requests read-only access to customers and orders. **3. Open the app in your Admin** Shopify redirects you to the app inside your Admin. Your User Intuition account is created from your shop's email on file. **4. Let the initial sync run** Customers and segments start syncing right away. You can keep working while it completes. > [!NOTE] > > If you follow a link from the Shopify app to User Intuition and aren't signed in, sign in or sign up as usual. The shop connects to your account once you're signed in. *** ## Invite Shopify customers to a study **1. Open Send Email Invites** On the study's **Invites** tab, click **Invite Participants** → **Send Email Invites**. **2. Select the Shopify connection** Click the Shopify card at the top of the panel. It shows the sync status and how many contacts are available. **3. Pick customers or segments** Use the **Contacts** tab to search customers by name, email, or phone, or the **Segments** tab to pick whole Shopify segments. Each segment shows its customer count. **4. Send** Click **Send N Invitations** (or **Send to N Segments**). Customers without an email address are skipped, and anyone already invited to the study isn't invited again. See [Send Email Invites](/recruiting/invite-customers) for the full workflow. *** ## The app in your Shopify Admin The app appears in your Shopify Admin under **Apps** and opens inside the Admin. From there you can: * See sync status and how many customers have been imported * Browse your studies and their status * Create a new study * Open your User Intuition workspace for everything else *** ## What syncs Customers (with email, phone, orders, and tags) and customer segments sync from Shopify into User Intuition on install and whenever you start a sync. A default **All Customers** segment is created on first connection. Large stores sync in batches, so you'll see the customer count climb in the app as it runs. Re-running a sync is safe. It refreshes existing customers and segments rather than creating duplicates. *** ## GDPR requests User Intuition handles Shopify's compliance requests automatically: * **Customer data request:** acknowledged so you can fulfill it. Imported customer data lives in your User Intuition account. * **Customer redaction:** that customer's imported record is removed. * **Shop redaction:** all imported segments, customers, and shop data are removed. Shopify sends shop redaction about 48 hours after uninstall. To remove a customer's data immediately, trigger redaction from your Shopify Admin. *** ## Disconnect and uninstall To disconnect, uninstall the app from your Shopify Admin's **Apps** page. The connection and the shop's imported customers and segments are removed right away. Shopify's shop redaction request about 48 hours later removes anything that remains. > [!WARNING] > > If your User Intuition account was created through the Shopify app (or connected to Shopify within 30 minutes of signing up), uninstalling deletes the whole account, including studies, interviews, and your login. If the account existed before you connected Shopify, only the imported customers and segments are removed. Export anything you need first. *** ## Common setup pitfalls > **Shop email missing on Shopify** > > Your User Intuition account is created from the shop's contact email. If it's blank, set it under **Settings → Store details** before opening the app. > **Very large customer bases** > > The initial sync for a very large store can take several minutes. Let it run rather than refreshing. > **No segments visible after install** > > If you haven't created any Shopify segments, only **All Customers** appears. Create segments in **Customers → Segments** in Shopify and re-run the sync. > **Reinstalling on the same shop** > > Reinstalling reconnects the shop and re-runs the sync. If your account was created through the Shopify app, uninstalling deleted it, so you start with a fresh account. *** ## Next steps > **[Stripe](/integrations/stripe)** > > Invite your Stripe customers and subscribers the same way > **[Send email invites](/recruiting/invite-customers)** > > Manual entry, contacts, segments, and tracking # Stripe Source: https://docs.userintuition.ai/integrations/stripe Connect Stripe to sync customers and cohorts, then invite them to any BYOP study with Send Email Invites. Connect Stripe to use your customers as a source for [email invites](/recruiting/invite-customers). Customers and customer cohorts sync into User Intuition and appear under **Invite Participants** → **Send Email Invites** on every BYOP study. The integration runs as a Stripe App alongside your Stripe Dashboard. *** ## Connect Stripe You connect from the Stripe Dashboard, not from inside User Intuition. **1. Install the User Intuition Stripe app** In the Stripe Dashboard, install the User Intuition app and approve the access Stripe shows you. **2. Continue to User Intuition** Follow the app's link to User Intuition. **3. Sign in or sign up** Sign in to your User Intuition account, or create one. The Stripe account connects automatically once you're signed in. **4. Wait for the initial sync** A default **All Customers** segment is created and your customers and cohorts start syncing in the background. Each User Intuition account links to one Stripe account. Connecting a different Stripe account replaces the existing link. *** ## Invite Stripe customers to a study **1. Open Send Email Invites** On the study's **Invites** tab, click **Invite Participants** → **Send Email Invites**. **2. Select the Stripe connection** Click the Stripe card at the top of the panel. It shows the connection status and how many contacts are available. **3. Pick a segment or individual customers** On the **Segments** tab, check the Stripe segments you want. Each shows its customer count. To invite specific people, use the **Contacts** tab and search by name, email, or phone. **4. Send** Click **Send to N Segments** (or **Send N Invitations**). Every customer with an email address gets an invite. Customers without an email are skipped. Customers who already have an invite for the study aren't invited again, so re-sending to a segment is safe. See [Send Email Invites](/recruiting/invite-customers) for the full workflow. *** ## What syncs | Stripe object | Becomes in User Intuition | Notes | | - | - | - | | Customer | Participant | Email, name, phone, currency, and Stripe metadata. | | Subscription | Participant data | Subscription status and plan are stored on the customer's participant record. | | Customer cohorts | Segments | For example, "All Customers", "Active Subscribers", or per-product groupings. | After the initial sync, new customers, customer updates, and subscription changes in Stripe flow in automatically. Card numbers, payment methods, and other sensitive payment data are never synced. *** ## Connection status The Stripe connection card in the invite panel shows a status badge and the number of contacts available. | Status | Meaning | | - | - | | **PENDING** | Connected, but the first sync hasn't started. | | **SYNCING** | Customers and cohorts are being fetched. | | **SEGMENTS\_SYNCED** | Cohorts are imported; customers are still syncing. | | **COMPLETE** | The initial sync finished. Changes in Stripe now flow in automatically. | | **FAILED** | The sync didn't finish. Use the re-sync button on the card to try again. | The re-sync button appears on the card once the status is **COMPLETE** or **FAILED**. *** ## Disconnect To disconnect, uninstall the User Intuition app from the **Stripe Dashboard**. New data stops flowing in. Participants and segments already imported stay available in the invite panel. If you reconnect later, the initial sync runs again. Existing participants are matched to their Stripe customer and updated, not duplicated. *** ## Troubleshooting > **No customers appearing** > > Check the status badge on the Stripe connection card. **syncing** means the initial sync is still running. Large customer lists take longer. > **Stale data in segments** > > If a recent Stripe change isn't showing, confirm the Stripe app is still installed and that webhook delivery is healthy in the Stripe Dashboard. > **Customers without email** > > Customers without an email sync but can't be invited. Add an email in Stripe and the next sync picks it up. > **Switching Stripe accounts** > > Uninstall the app from the old Stripe account first, then connect the new one from its Stripe Dashboard. *** ## Next steps > **[Embed the AI widget](/recruiting/embed-widget)** > > Catch customers inside your product instead > **[Send email invites](/recruiting/invite-customers)** > > Manual entry, contacts, segments, and tracking # Welcome to User Intuition Source: https://docs.userintuition.ai/introduction/welcome Learn what User Intuition does, which study types you can run, and where to start. User Intuition is an **AI-moderated research platform**. An AI moderator runs real conversations with your participants by chat, voice, or video, and probes past the first answer to get at the reasoning underneath. Every conversation is transcribed and analyzed, and you can build what you learn into a searchable body of customer knowledge that gets more useful as it grows. *** ## What you can run Three study types, all set up the same way: | Study type | Use it when | What participants do | | - | - | - | | [**In-depth Interview**](/study-types/in-depth-interview) | You want to understand experiences, motivations, and decisions | Talk through what they did and why | | [**Concept Test**](/study-types/concept-test) | You have an image or video you want reactions to | React to your concept and explain the reaction | | [**Prototype Test**](/study-types/prototype-test) | You have a prototype or live site you want people to try | Work through it while narrating their thinking | Whatever the topic (why deals are won or lost, why customers leave, what's breaking in onboarding, how a new design lands), it's one of these three. *** ## Why User Intuition ### Depth at scale Run hundreds of interviews at once without collapsing them into a survey. The moderator adapts to each conversation and follows up on what it hears. ### Insight that compounds On the Pro plan, sync your studies into your organization's Intelligence Hub and ask questions across all of them at once. What used to be buried in slide decks and people's heads becomes searchable, and each study you add makes the last ones more useful. *** ## Get help Use the search bar at the top of any page, or email **[support@userintuition.ai](mailto:support@userintuition.ai)**. See [Support](/resources/support) for more. *** ## Next steps > **[Quickstart](/getting-started/quickstart)** > > Launch your first study in about 15 minutes. > **[Key Concepts](/getting-started/key-concepts)** > > Studies, interviews, the moderator, and the Intelligence Hub. # Dashboard Source: https://docs.userintuition.ai/managing-your-study/dashboard Monitor your study from the dashboard: key metrics, study status, the Invites, Calls and Reports tabs, and how to invite participants. The Study Dashboard is where you watch progress, invite participants, and reach your results. You land here after launch. To come back later, click **Dashboard** in the left navigation and pick your study. The dashboard updates live as participants finish, so you don't need to reload. *** ## Key metrics Four cards across the top: | Metric | Description | | - | - | | **Responses** | Completed interviews | | **Avg Length** | Average duration of completed conversations | | **Quality Interviews** | Interviews good enough to go into your report | | **Study Progress** | Responses collected against your target | ### Understanding quality An interview counts toward **Quality Interviews** based on how long it ran, how substantive the answers were, and how much of your research plan it covered. Interviews that fall short are still recorded and readable in the **Calls** tab. ### Adjusting your target On studies where you bring your own participants, click the **Study Progress** card to open **Adjust Target**. Enter how many interviews you want going forward and choose a frequency: | Frequency | What it means | | - | - | | **One-time (total)** | Recruit this many interviews once | | **Weekly** / **Monthly** / **Quarterly** | Recruit this many interviews every period | With a recurring target, the card shows progress for the current period (for example, "4 / 10 interviews this month") and the date it resets. Once a study stops collecting, the card shows how many responses came in against how many you requested — for example, "18 responses collected (20 requested)." Panel study targets are set when you recruit from the panel, so the card isn't clickable there. *** ## Study status A badge next to your study name shows where it stands. | Status | Meaning | | - | - | | **Creating** | Still being set up | | **Launching** | Going live | | **Queued** | Waiting to start fielding | | **Fielding** | Actively collecting responses | | **Complete** | Target reached | | **Partial** | Finished short of target | | **Paused** | Stopped by you; no new responses | | **Cancelled** | Stopped and closed out | | **Failed** | Something went wrong — contact support | Panel studies show a status throughout. Studies where you bring your own participants show a badge once they're complete or paused. *** ## Dashboard tabs ### Invites Everyone you've invited and where they've got to — email address, when the invitation was sent, and when the interview was taken. Test invites carry a **Test** badge. Actions per row let you **Resend** the invitation or copy that participant's invite link. Both are unavailable while the study is paused. ### Calls Every completed interview, with its quality rating and end reason. Click a row for the transcript, attributes (screener answers), and summary. See [Calls & transcripts](/results/calls-and-transcripts). ### Reports Synthesis across all completed interviews in the study. See [Reports](/results/reports). *** ## Inviting participants Click **Invite Participants**. What you see depends on the recruiting method you chose in Step 4. | Bring your own participants | Panel | | - | - | | **Copy Study Link** — share it anywhere | **Copy Test Link** — try the study yourself | | **Send Email Invites** — we email your list | **Recruit from Our Panel** — set a target and field it | | **Copy Embed Code** / **Copy Button Embed Code** — put it in your product | **Recruit a Niche Audience** — request a quote for hard-to-reach people | | **Bring Your Own Panel** — connect an external panel provider | | Synthetic studies show **Recruit from synthetic participants** instead. The menu stays available while a study is paused, but **Send Email Invites** is disabled until you resume it. To compare methods and costs, see [Recruiting participants](/recruiting/overview). *** ## Managing the study The **Actions** menu in the top right handles everything else: editing, duplicating, pausing, incentives, and deletion. See [Study actions](/managing-your-study/study-actions). *** ## Tips while your study runs * **Watch quality, not just volume.** Twenty interviews with a low quality share is a study that needs a look, not a study that's nearly done. * **Review the first few.** Listen to your earliest interviews to confirm the conversation is going where you intended, while there's still time to adjust. * **Track your response rate.** Compare invites sent against calls completed. A low rate usually means the invitation, not the study. * **Let it run.** Changing questions mid-study makes early and late responses hard to compare. *** ## Next steps > **[Study actions](/managing-your-study/study-actions)** > > Edit, duplicate, pause, enable incentives, or delete a study. > **[Calls & transcripts](/results/calls-and-transcripts)** > > Review individual interviews in detail. # Study Actions Source: https://docs.userintuition.ai/managing-your-study/study-actions Edit, duplicate, pause, delete, or add incentives to a study from the dashboard Actions menu, and see what you're charged for. The **Actions** menu in the top right of your study dashboard holds everything you can do to a study after it's live. Most actions work the same on every study. Incentives and charges depend on whether you're running a **panel** study or bringing your **own participants**. | Action | Panel studies | Your own participants | | - | :-: | :-: | | View Study | ✓ | ✓ | | Edit Study | ✓ | ✓ | | Duplicate Study | ✓ | ✓ | | Pause / Resume Study | ✓ | ✓ | | Delete Study | ✓ | ✓ | | Enable Incentives | — | ✓ | *** ## Available on every study ### View Study Opens the complete configuration — research plan, moderator voice, format, language, and screener questions — read-only. Use it to check what you asked before interpreting a result, or to show the design to a colleague. ### Edit Study Reopens the setup flow so you can change the research plan, moderator, format, or screeners. > [!WARNING] > > **Editing a study that's already collecting has a cost.** If you change questions or flow partway through, early and late responses aren't directly comparable. Safe at any time: * Renaming the study * Fixing a typo that doesn't change a question's meaning Risky once responses are in: * Adding, removing, or rewording questions * Changing the interview format * Changing the moderator voice * Changing screener criteria For substantial changes after collecting responses, **duplicate the study and edit the copy** instead. The first set of responses stays intact. > [!NOTE] > > Some studies get a mid-study review that suggests up to two questions to add. Accepting it adds them to the live study plan for future interviews. See [Mid-study review](/results/reports#mid-study-review). ### Duplicate Study Copies the research plan, moderator settings, and screeners into a new study, without any responses. Use it to run the same study with a different audience, to re-run it next quarter for comparison, or to make substantial changes without contaminating data you've already collected. ### Pause and Resume **Pause Study** stops the study taking new responses. While paused: * Anyone following your study link sees a **Study Paused** message instead of starting an interview * **Send Email Invites** is disabled, and you can't resend invites or copy their links. The rest of the **Invite Participants** menu stays available * Test conversations still work, so you can keep checking the study yourself * Everything already collected stays exactly where it is **Resume Study** reopens the same links, so you don't need to redistribute anything. A **Complete** study (one that reached its target) can't be paused. ### Delete Study Permanently removes the study and everything attached to it: all interviews, transcripts, recordings, reports, and participant records. > [!WARNING] > > **Deletion cannot be undone.** Save anything you need first — **Download calls (CSV)** from the Calls tab for transcripts, or **Print Report** from the Reports tab. If you might collect more later, **pause** instead. If you want the findings to outlive the study, **sync it to the Intelligence Hub** first. *** ## Studies where you bring your own participants ### Enable Incentives Pay your participants for completing an interview. Panel studies don't have this option: User Intuition sets and pays panel incentives as part of the per-participant cost. **1. Open Enable Incentives** From the **Actions** menu. Once incentives are on, the menu item reads **Incentives: \$X** and opens **Edit Incentives** instead. **2. Set the amount** Enter a reward per participant, between **\$5 and \$500**. It's debited from your wallet when a reward is actually sent. **3. Choose how rewards go out** Tick **Automatically send rewards after quality interviews** to have them sent for you, or leave it unticked to send each one by hand from the **Calls** tab. Rewards are only offered for interviews rated **Excellent** or **Good**, and never for test invites. To turn incentives off, open **Edit Incentives** and click **Disable**. > [!NOTE] > > You need a [payment method on file](/resources/billing-and-credits#payment-methods) to send rewards. Without one, the reward button in the Calls tab is replaced by "No Card on File." *** ## Panel studies ### Stopping a fielding panel A study can field only one panel at a time. Setting up a new one while another is fielding prompts you to stop the existing panel first. **Pausing** the study halts a fielding panel and keeps its recruitment progress and reward hold. Resuming restarts the same panel. **Stopping** is final for the current panel. It closes recruitment, settles completed rewards, and releases any unused hold. When you edit a fielding panel, choose **Pause & Edit** to continue it later or **Stop & Edit** to close it out. *** ## What you're charged for, side by side | Quality rating | Panel studies | Your own participants | | - | :-: | :-: | | **Excellent** | Charged | Charged | | **Good** | Charged | Charged | | **Fair** | Free | Charged | | **Poor** | Free | Free | **Fair** differs because of who chose the participant. On panel studies we recruited them, so a thin conversation is on us. On your own studies you control who gets the link. The **\$30 per-participant** panel cost follows the same rule: you're billed only for Excellent and Good completes. See [Billing and credits](/resources/billing-and-credits). *** ## Frequently asked questions > **Can I edit a study that's actively fielding?** > > Bring-your-own-participant studies can be edited while fielding. For a panel study, first choose **Pause & Edit** to preserve the panel or **Stop & Edit** to close it out. Changes affect only interviews that happen afterwards, so your dataset can contain responses collected under different configurations. > **Who can perform these actions?** > > Anyone with permission to manage the study. **View Study** is available to everyone with access. *** ## Next steps > **[Calls & transcripts](/results/calls-and-transcripts)** > > Review each interview, its quality rating, and rewards. > **[Billing & credits](/resources/billing-and-credits)** > > See how interviews and incentives are charged. # Authentication Source: https://docs.userintuition.ai/mcp-server/authentication Use hosted OAuth or an organization API key, including with headless hosted clients. ## Hosted OAuth (recommended first) The User Intuition MCP server is available at: ```text theme={null} https://mcp.userintuition.ai/mcp ``` Compatible clients discover OAuth automatically. Complete the authorization flow before testing a tool. Seeing the tool catalog alone is not proof of authentication because a client can discover tools before an account-scoped request succeeds. Headless clients can instead send an organization API key to the same hosted endpoint in an `Authorization: Bearer ui_sk_…` header. The server validates the key and its scopes with the backend on every request, so revocation takes effect without a separate hosted MCP login. Call `get_account` to verify the effective workspace before running tools. ## stdio clients Claude Desktop, Cursor, Claude Code, and VS Code can launch the MCP server locally. Set `USERINTUITION_API_KEY` to a key created under **Settings → API Keys**. New keys start with read access; choose write or paid-action permissions when creating one if the local agent needs them. Keep API keys out of source control, screenshots, prompts, and shared configuration files. Rotate a key immediately if it is exposed. ## Authorization behavior Every backend request is scoped to the authenticated account. Resource reads, updates, and deletes also perform ownership checks. A valid OAuth session or API key can still receive `403` or `404` when the requested resource is not accessible. Users can belong to multiple organizations. Call `list_organizations` to find accessible workspaces and pass `organization_id` on subsequent tools to select one for reads, changes, and billing. Ordinary users can select active memberships in the current app; platform administrators have app-wide access. API-key scopes and spend caps apply. See [organization selection](/api-reference/organizations). `read` permits study and result retrieval, including search and estimates. `write` permits non-paid changes. Paid `launch_panel` requires `write` and `panel:launch`; `send_participant_reward` requires `write` and `rewards:send`. Paid API keys also require a positive lifetime USD cap. The amount reserved for an uncertain paid operation continues to count against that cap until reconciled. OAuth clients must request the corresponding scopes for hosted tools. These grants allow a call, but a human still approves the plan and each spend through the tool workflow. ## External side effects The surface includes paid panel launches, participant invitations, rewards, and completed-interview webhooks. Authentication makes those operations available; it does not replace product decisions or user confirmation. Agents must return and obtain approval of the current persisted plan before participant creation or paid launch, and respect each tool's safety annotations before spending money, sending a reward, registering a webhook, stopping recruitment, or deleting data. # Claude directory connector Source: https://docs.userintuition.ai/mcp-server/claude-directory Connect Claude to the full User Intuition research workflow, from study design and recruitment through interview evidence. The User Intuition connector in Claude's directory uses the full MCP server. Sign in with your User Intuition account through OAuth to work with studies, participants, fielding, reports, and source-linked interview evidence. Available actions depend on your account permissions and the scopes granted during sign-in. ## Connect Find **User Intuition Research** in Claude's connector directory and sign in. If you add the remote server manually, use: ```text theme={null} https://mcp.userintuition.ai/mcp ``` This endpoint exposes all 79 MCP tools. The separate `/directory/mcp` URL is an optional eight-tool, read-only profile for custom clients; it is not the URL used by the Claude directory listing. ## What Claude can do * Create and customize studies, then show the saved plan for your review. * Estimate Panel recruitment cost and timing before launch. * Launch paid Panel recruitment only after a separate human approval. A launch can consume credits or place a card hold. * Monitor fielding, inspect interviews, and review reports with source references. * Search existing research, run analysis, and produce research deliverables. * Manage participants, rewards, webhooks, and other workspace operations when your account permits them. For the full catalog and required inputs, see the [MCP tool reference](/mcp-server/tools/studies). The [study-creation playbook](/mcp-server/guides/playbook) explains the approval steps for studies, recruitment, rewards, and destructive actions. ## Try it * “List my studies that have reports.” * “What did participants say about onboarding in this study? Show the interviews behind the findings.” * “Create a draft study for an audience I choose, then show me the saved plan and a Panel estimate before any launch.” Search results depend on the studies and indexes available to your authenticated workspace. If you do not see a study, check that your User Intuition account has access to it. For connection problems, see [Troubleshooting](/mcp-server/guides/troubleshooting) or contact [support@userintuition.ai](mailto:support@userintuition.ai). # Study-creation playbook Source: https://docs.userintuition.ai/mcp-server/guides/playbook Create a metadata draft, conduct the Customize Plan conversation, verify the result, and field the study safely. The MCP server keeps a short set of critical rules in its `instructions` field so clients with small instruction limits still receive them. Step-specific rules appear in the relevant tool descriptions. This page provides the full workflow. A [User Intuition Skill](/skills/overview) adds a reusable workflow on top of it. ## 1. Collect the required setup decision Before creation, understand the research goal and ask for the missing recruiting choice: * `recruiting_method`: `panel`, `byop`, or `synthetic_respondents`; never guess For Panel and BYOP, `create_study` defaults to a voice interview in English with `male` voice configuration. Synthetic respondents use chat. An explicit user choice may instead set `interview_format` to `chat` or `video` where supported, choose another supported language, or choose `female` voice configuration. Chat studies also retain voice configuration; the public choice remains `male` or `female`. Keep the study name to 40 characters or fewer. Read `userintuition://catalog/study-types` when the user needs help choosing a study type, but do not draft a plan from its internal prompts. ## 2. Create only the metadata draft Call `create_study` with a nonblank name, the user's recruiting choice, and ordinary metadata. The MCP schema intentionally does not accept BYOP incentive settings, a study plan, expected duration, audience targeting, screener questions, concept links, or concept images. ## 3. Start the Customize Plan conversation Prefer `queue_customize_study` with the user's natural-language research brief, poll `get_customize_study_job` until it succeeds, and inspect its `result`. Use synchronous `customize_study` for native concept images. Include what they want to learn, who they want to interview, requested screening, and any concept link or image they want participants to see. When the client exposes an attached image as bytes or a readable local path, base64-encode the raw bytes and pass them through `concept_image` on the same call. Pass the user's meaning through in ordinary language. Do not construct or patch `study_plan`, `targeting_attributes`, `screener_questions`, or concept objects yourself. The backend runs the same stateful Customize Plan workflow used by the dashboard, including the study type's `chat_prompt` instructions, canonical targeting selection, validation, duration calculation, conversation-flow formatting, concept checks, and plan reconciliation. ## 4. Keep the human in the loop Each customization call represents one conversation turn; poll queued turns before continuing. Use `decisions: "human"` unless the researcher delegates ordinary research-design choices; then set `decisions: "agent"`, report `assumptions[]`, and still relay any required `questions[]`. Keep workflow constraints such as draft-only in `execution_policy`, outside the research `message`. Inspect `response_type`: * `question`: show `questions[]` to the user, wait for their answer, then call `customize_study` again with that answer * `study_plan` or a completion `message`: continue to verification In human mode, never answer a Customize Plan confirmation yourself. Agent mode covers research-design assumptions only. Client permission settings do not replace a required recruiting choice, plan approval, or paid-launch approval. ## 5. Handle audience and screening through chat Describe audience requirements naturally. Customize Plan should use existing targeting attributes when they fit criteria such as age or household income, and create custom screener questions only when canonical targeting cannot express the requirement or the user explicitly needs one. Never add recording-consent or willingness-to-participate screeners. The platform handles consent separately. ## 6. Handle concepts through chat Send concept-link and concept-image requests through `customize_study`. When the client exposes an attachment's bytes or a readable local path, base64-encode the raw image and pass it through the optional `concept_image` input with its filename, MIME type, and the user's participant-facing label. Public image URLs remain supported in the conversation message. If the client exposes only an opaque attachment reference with no readable bytes, path, or public URL, explain that client limitation and offer the available upload routes. Never request login credentials. The backend owns URL safety, embeddability, login detection, recorder compatibility, file validation, storage, deduplication, IDs, mode compatibility, and plan reconciliation. Studies with concept links cannot use chat interviews. Relay the backend's question or validation result and let the user choose voice or video. ## 7. Verify the persisted study Call `get_study` after customization. Return the complete persisted study plan in a readable form, together with the audience, screeners, concepts, interview settings, and `provisioning_status`. Ask the user to approve that exact plan or request revisions. Do not replace the plan with a short summary or only a dashboard link. Send requested revisions back through `customize_study`, fetch the study again, and return the complete revised plan. Approval of an earlier version does not cover a revised plan. Client permission settings, approval to create a draft, answers to Customize Plan questions, and approval of a cost estimate do not count as study-plan approval. Only create BYOP participants or launch a paid Panel study when `provisioning_status` is `provisioned` and the user has explicitly approved the current returned plan. If the result is incomplete, continue through `customize_study` rather than filling designed fields through another tool. ## 8. Field safely For BYOP, call `create_participants` only after provisioning and plan approval. Poll `get_participant_job` to completion, then list the invitations. For Panel recruitment: 1. Ask the user to choose the launch country explicitly. Each `launch_panel` call fields exactly one country; never infer a country from a broad region such as Europe or Asia. 2. Verify that country/language combination with `userintuition://catalog/panel-countries`. 3. Use `submit_feasibility_request` when incidence is below 10% or the audience requires specialist review. 4. Call the read-only `estimate_panel` with the explicit `country_code`. 5. Show the resolved country, language, cost, and heuristic timeline; retain `estimate_id`. 6. Confirm the user has approved the current returned plan. 7. Call `launch_panel` with the estimate and the same country for a preview. In App-capable clients, the person approves with the App button. `approve_panel_launch` is hidden from the model. Without Apps, show the saved plan and complete quote, wait for explicit human confirmation, then submit the returned `chat_approval_nonce` with `human_confirmed=true`. Never invent confirmation or a nonce. Obtain a fresh estimate and approval if relevant inputs change. For multi-country research, ask the user to select one launch country or create separately reviewed and approved country-specific studies or launches. A multi-country Learning Plan does not turn one Panel launch into multi-country recruitment. ## 9. Read before metadata updates Call `get_study` before `update_study`, and `get_participant` before `update_participant`. `update_study` is for ordinary metadata only; route designed-content changes back through `customize_study`. A fielding Panel study must be paused or stopped before editing. Pause if recruitment should resume; stop when fieldwork is over. ## 10. Confirm external and destructive actions Require explicit confirmation before a paid launch, reward, webhook registration, stop, study deletion, or interview deletion. Treat tool annotations as authoritative. `create_webhook` returns its signing secret once. Tell the user to store it securely without repeating the value. # Screening respondents Source: https://docs.userintuition.ai/mcp-server/guides/screening Describe audience criteria naturally and let Customize Plan choose canonical targeting or custom screeners. ## One conversation for audience design Use `customize_study` for both Panel targeting and custom screener questions. Tell it whom the user wants to interview in ordinary language; do not translate the request into qualification IDs or question schemas in the MCP host. The backend runs the same Customize Plan workflow as the dashboard. It can match criteria such as age or household income to existing targeting attributes, ask the user to confirm choices, and add a custom screener only when appropriate. ## Continue questions with the user If `customize_study` returns `response_type: "question"`: 1. Relay the returned `questions[]` to the user. 2. Wait for their decision. 3. Call `customize_study` again with their answer in ordinary language. In `decisions: "human"` mode, do not answer for the user or convert their answer into MCP-side targeting or screener fields. Use `decisions: "agent"` only when the researcher delegated ordinary research-design choices; any remaining required `questions[]` still need the researcher. ## Screening rules * Do not add screening the user did not request. * Never add recording-consent or willingness-to-participate questions; the platform handles consent separately. * Explain likely recruitment tradeoffs when Customize Plan identifies restrictive criteria. * After the conversation completes, call `get_study` and show the persisted targeting and screeners to the user. ## Safe updates Use `customize_study` again when the user wants to add, change, or remove audience criteria or screener questions. `update_study` is for ordinary metadata and intentionally does not accept these designed fields through MCP. A fielding Panel study must be paused or stopped before its configuration can change. # Study setup Source: https://docs.userintuition.ai/mcp-server/guides/study-modes Choose recruiting method, use sensible interview defaults, and select the appropriate study type before entering Customize Plan. ## Recruiting method | Value | Use when | Recruitment tool | | - | - | - | | `panel` | User Intuition should recruit respondents | `launch_panel` | | `byop` | The user has their own participant list | `create_participants` | | `synthetic_respondents` | The user requests AI respondents | Chat interviews; no participant recruitment | Ask the user when the choice is not explicit. Do not infer it from the research topic. ## Interview format For Panel and BYOP, `create_study` defaults to `voice` when the user does not specify a format. Synthetic respondents use chat. Set `interview_format` to `chat` or `video` only when the user requests it and the recruiting method supports it. Read `userintuition://catalog/modes` for discovery when needed. Concept links are incompatible with chat interviews. Send the concept request through `customize_study` and relay its question so the user can choose voice or video. ## Language and voice Omitted settings default to English (`en`) and `male` voice configuration. Read `userintuition://catalog/languages` when the user requests another language; the catalog includes lowercase language codes and `auto` for automatic detection. The public voice choice is `male` or `female` only, including for chat studies. `userintuition://catalog/voices` provides display names without implementation details. ## Study type and plan Public writes accept `study_type: "in-depth-interview"`, `"concept-test"`, or `"prototype-test"`. The default is `in-depth-interview`. A prototype test cannot use chat; it uses the default voice format or an explicitly requested video format. `userintuition://catalog/study-types` and `userintuition://catalog/study-types/{slug}` can explain the available planning templates, but the MCP host must not build the plan from internal prompt fields. Create the metadata draft, then send the user's brief to `customize_study`. The backend applies the study type's current `chat_prompt` instructions and persists the resulting plan, duration, audience, screeners, and concept material. ## Concept material Describe links and images in the `customize_study` conversation. For an image attachment that the client exposes as bytes or a readable local path, the agent can send the base64-encoded bytes through `customize_study.concept_image`; no public URL is required. A public downloadable URL and label can still be supplied in the message. # Troubleshooting Source: https://docs.userintuition.ai/mcp-server/guides/troubleshooting Resolve authentication, stale package, missing-tool, and backend-domain errors. ## 401 Unauthorized For hosted Streamable HTTP, confirm the client is connected to `https://mcp.userintuition.ai/mcp`, then reconnect OAuth from the client. For stdio, confirm `USERINTUITION_API_KEY` is visible to the process that launches the MCP server and starts with `ui_sk_`. Create or rotate keys under **Settings → API Keys** at [app.userintuition.ai](https://app.userintuition.ai). A valid credential can still receive `403` or `404` for a resource the account does not own. ## A tool is unavailable Confirm that the client connects to the intended [MCP profile](/mcp-server/overview). The full endpoint exposes 79 tools; core, read-only, compact, and directory profiles offer different subsets. Check the [tool reference](/mcp-server/tools/studies) for the tool name and inputs. Hosted clients discover tools through the MCP endpoint. Local stdio clients launch the server with: ```bash theme={null} npx -y @userintuition-ai/mcp@latest ``` ## A tool returns a domain error Not every non-success response is an authentication problem. Examples include: * report generation on a study with no usable interviews * reward delivery for an ineligible or unknown participant * direct Panel launch below 10% incidence * editing a fielding Panel study before pausing or stopping it Read the returned error and use the corresponding lifecycle or feasibility action. Do not reconnect OAuth or regenerate an API key for a valid `400`, `403`, `404`, or `409` domain response. Invalid tool inputs return `validation_error` with a `correct_input` hint. If a report has not been generated, `no_report_yet` points to `generate_report`; if the study has no completed interviews, `no_completed_interviews` points to finishing interviews first. A `404` for an interview or study means that resource could not be found or accessed. Check its public ID and account access before retrying. ## A study plan change does not appear Use `customize_study` for the plan, expected duration, audience, screeners, and concept material. Continue the conversation whenever it returns `response_type: "question"`, then call `get_study` to verify the persisted result. `update_study` is only for ordinary metadata. If a Panel study is actively fielding, call `pause_study` or `stop_study` before editing. ## Getting help Email [support@userintuition.ai](mailto:support@userintuition.ai) with the tool name, timestamp, response status, and a redacted error message. Never send your API key or webhook signing secret. # User Intuition MCP Server Source: https://docs.userintuition.ai/mcp-server/overview Give an AI agent the tools and rules to design studies, recruit participants, manage interviews, and analyze findings. User Intuition's MCP server exposes the complete research workflow to AI agents: **79 tools on every transport**, covering the versioned public API plus account context, catalogs, interview usage, and study review apps. ## MCP tools and Skills The MCP server gives an agent the **tools**. A User Intuition Skill gives it the **workflow**: when to ask for Panel versus BYOP recruitment, how to conduct the Customize Plan conversation, when to dry-run cost, and when confirmation is required. > **[Connect the MCP server](/mcp-server/quickstart)** > > Configure Claude, Cursor, VS Code, or ChatGPT and verify the connection. > **[Install a research Skill](/skills/overview)** > > Teach your agent a repeatable study-creation or analysis workflow. ## One surface on every transport The [Claude directory connector](/mcp-server/claude-directory) uses the full `/mcp` endpoint. * **Streamable HTTP** accepts OAuth for interactive clients and organization API keys for headless clients. Connect to `https://mcp.userintuition.ai/mcp`. * **stdio** remains available for Claude Desktop, Cursor, Claude Code, VS Code, and other local clients. It authenticates with a `ui_sk_` API key. Both transports expose the same 79 tools. Choose the authentication method that fits the client. ### Smaller profiles For the common study → interview → report workflow, connect to `https://mcp.userintuition.ai/core/mcp` (61 tools). It omits webhook, feasibility, and external-panel administration; organization selection is included. For existing research without write actions, connect to `https://mcp.userintuition.ai/read-only/mcp` (31 tools). The `https://mcp.userintuition.ai/compact/mcp` profile keeps the research workflow and groups less common webhook, feasibility, and external-panel operations into 70 tools. Each URL has its own OAuth protected-resource metadata, so authorize the specific URL your client uses. The full `/mcp` URL remains available for all 79 tools. Local stdio clients can pass `--profile core`, `--profile read-only`, or `--profile compact` after the package name. The default is the full profile. Resource and prompt support remains available on these profiles. Measured from the complete `tools/list` response for MCP server v0.17.1: | Profile | Tools | Payload bytes | Approx. tokens | | - | -: | -: | -: | | Full | 79 | 165,137 | 41,284 | | Core | 61 | 130,834 | 32,708 | | Read-only | 31 | 76,745 | 19,186 | | Compact | 70 | 150,446 | 37,612 | | Directory | 8 | 31,440 | 7,860 | The token estimate divides bytes by four; actual model context usage varies by host and tokenizer. CI checks each profile against its payload budget. ## Tool groups | Group | What it covers | | - | - | | Account | Effective workspace, payment readiness, and platform-admin organization search | | Studies | Create, customize, review, estimate, launch, pause, stop, report on, search, and answer questions across studies | | Research sessions | Manage sources, run analysis, and create or edit research outputs | | External panels | Configure a customer-supplied panel bridge for a BYOP study | | Participants | Create and manage BYOP invitations and rewards | | Interviews | Read or delete interviews and inspect usage | | Panel feasibility | Specialist feasibility review | | Webhooks | Create, inspect, test, and remove event subscriptions | | Configuration & catalogs | Targeting attributes; other catalogs are MCP resources | The [tool reference](/mcp-server/tools/studies) documents every registered tool. The [study-creation playbook](/mcp-server/guides/playbook) documents the behavioral rules agents should follow. The server also exposes [attachable study and report resources](/mcp-server/research-resources) for clients that show MCP resources in the conversation. These resources read the same authenticated public API as the research tools. ## Safety model The server advertises MCP safety annotations for every tool. Agents should also follow these product rules: 1. Use `customize_study` for the plan, audience, screeners, and concept material; do not reconstruct those fields in the MCP host. 2. Return the complete persisted study plan and obtain approval of its current version before creating BYOP participants, sharing an external-panel entry link, or launching paid Panel recruitment. 3. Use `estimate_panel`, show the complete estimate, and carry its `estimate_id` into an approved paid panel launch. 4. Require explicit user confirmation before rewards, webhooks, stopping fieldwork, or deleting studies, participants, or interviews. ## Runnable developer examples Use the [developer examples](/api-reference/developer-examples) to inspect study execution, report retrieval, and evidence search. The public repository includes fictional no-spend fixtures, a matching MCP/CLI walkthrough, and release compatibility notes. ## Agent homepage Start at [research.userintuition.ai](https://research.userintuition.ai/) for the three research workflows, connection options, machine-readable guidance, and public examples. This documentation remains the detailed operation reference. # Profiles and prompts Source: https://docs.userintuition.ai/mcp-server/profiles-and-prompts Choose a tool catalog and use reusable research prompts. Connect to the endpoint whose catalog fits your workflow. Each endpoint has its own OAuth authorization. | Profile | Endpoint | Tools | | - | - | -: | | Full | `https://mcp.userintuition.ai/mcp` | 79 | | Core | `https://mcp.userintuition.ai/core/mcp` | 61 | | Read-only | `https://mcp.userintuition.ai/read-only/mcp` | 31 | | Compact | `https://mcp.userintuition.ai/compact/mcp` | 70 | | Directory | `https://mcp.userintuition.ai/directory/mcp` | 8 | ## Compact operations Compact groups 15 webhook, feasibility, and external-panel operations into six tools. Set `operation` to the desired operation name and provide its inputs alongside `operation`. Read operations are separate from writes; grouped writes use conservative destructive annotations. * `inspect_webhooks`: `list_webhooks`, `get_webhook`, or `list_webhook_deliveries`. * `manage_webhook`: `create_webhook`, `rotate_webhook_secret`, or `test_webhook`. * `remove_webhook`: choose `delete_webhook_by_id` and provide the webhook ID. * `inspect_feasibility`: `list_feasibility_requests` or `get_feasibility_request`. * `manage_feasibility`: `submit_feasibility_request` or `cancel_feasibility_request`. * `manage_external_panel`: `configure_external_panel`, `regenerate_external_panel_token`, or `delete_external_panel`. ```json theme={null} {"tool":"inspect_webhooks","arguments":{"operation":"list_webhooks"}} ``` ## Research prompts Clients supporting MCP prompts can discover these with `prompts/list` and request them with `prompts/get`: * `plan_research_study`: guide a research brief through draft creation, customization, persisted-plan review, and human approval. * `review_fielding`: inspect study progress, quality, and estimated finish, then decide whether attention is needed. Prompts supply workflow guidance. They do not perform actions or authorize spending. Follow the queued planning and approval workflow in the [study-creation playbook](/mcp-server/guides/playbook). ## FAQ ### Can I launch a panel from the CLI? Use an MCP client for paid panel launch and human approval. The CLI supports estimates, study management, and progress inspection through its direct tool inventory. ### Do prompts authorize actions? No. Prompts guide the workflow; plan review and paid-action confirmation come from the person. ## Next steps Use the [quickstart](/mcp-server/quickstart) to authenticate, or inspect [account context](/mcp-server/tools/account-context) to select an organization. # Quickstart Source: https://docs.userintuition.ai/mcp-server/quickstart Connect with hosted OAuth first, or use the local stdio setup for Claude Desktop, Cursor, Claude Code, and VS Code. ## 1. Choose a connection Use the hosted Streamable HTTP endpoint with OAuth when your client supports it: ```text theme={null} https://mcp.userintuition.ai/mcp ``` The client discovers OAuth automatically. Sign in and authorize User Intuition when prompted. For a smaller catalog, use `https://mcp.userintuition.ai/core/mcp` for the 61-tool research workflow, `https://mcp.userintuition.ai/read-only/mcp` for 31 read-only tools, or `https://mcp.userintuition.ai/compact/mcp` for 70 tools with grouped administrative operations. Authorize each endpoint separately. The full URL above exposes all 79 tools. Local stdio clients can append `--profile core`, `--profile read-only`, or `--profile compact` to the server command. To try study design and reports in staging, connect to `https://mcp.sandbox.userintuition.ai/mcp` with a staging account. Follow the [sandbox quickstart](/api-reference/staging-quickstart) for Test with AI, three synthetic responses, and the participant-link limitation. Local stdio remains supported for clients that need a local process. Create a key under **Settings → API Keys** at [app.userintuition.ai](https://app.userintuition.ai). Keys start with `ui_sk_`. ## 2. Connect your client **ChatGPT** In ChatGPT, enable developer mode under **Settings → Apps & Connectors → Advanced**, then create a connector: * **MCP Server URL:** `https://mcp.userintuition.ai/mcp` * **Authentication:** OAuth (auto-discovered) **Codex** ```bash theme={null} codex mcp add userintuition --url https://mcp.userintuition.ai/mcp codex mcp login userintuition ``` The add command may start OAuth immediately. If it does, complete that flow; the separate login command is only needed when authorization is still pending. Restart Codex or open a new task after setup so it loads the tool catalog. **Claude Desktop** Add this server to `~/Library/Application Support/Claude/claude_desktop_config.json`, then fully restart Claude Desktop: ```json theme={null} { "mcpServers": { "userintuition": { "command": "npx", "args": ["-y", "@userintuition-ai/mcp@latest"], "env": { "USERINTUITION_API_KEY": "ui_sk_your_key_here" } } } } ``` **Cursor** Add the same `mcpServers` entry to `.cursor/mcp.json`, replace the example key, and restart Cursor. **Claude Code** ```bash theme={null} claude mcp add userintuition -- npx -y @userintuition-ai/mcp@latest ``` Make `USERINTUITION_API_KEY` available to the environment that launches Claude Code. Do not commit the key to your repository. **VS Code** Add the server command and environment variable under `"mcp.servers"` in `.vscode/settings.json`, then reload the window. ## 3. Verify the connection Ask your client: > List my User Intuition studies. The agent should call `get_account`. A successful account-scoped response confirms authentication; merely seeing tool names does not. The current surface contains 79 tools, including `queue_customize_study`, `review_study`, `search_research`, and `answer_research`. ## 4. Give the agent a workflow Connection proves the tools work. A Skill tells the agent how to use them reliably. Install the [create-study-from-brief Skill](/skills/create-study-from-brief), then ask the agent to use it. The Skill adds the question order, readiness checks, plan review, and approval gates needed for a safe study-creation flow. > **[Install the Skill](/skills/create-study-from-brief)** > > Add the reusable study-design workflow to your AI client. > **[Read the MCP playbook](/mcp-server/guides/playbook)** > > Understand the workflow rules already advertised by the server. After installing the Skill, try: > Use the create-study-from-brief Skill to help me design a Panel study about why trial users do not activate. Dry-run the panel cost, but do not launch without my confirmation. For a healthy end-to-end run, the agent should keep the study name to 40 characters, ask you to choose the recruiting method when it is missing, create a metadata draft, and pass your research brief to `queue_customize_study`. Poll `get_customize_study_job` until it succeeds and read its `result`; use synchronous `customize_study` for a native concept image. Omitted interview settings default to an English voice interview with Elliot. The default `decisions: "human"` relays `questions[]` to you. If you delegate research-design choices, `decisions: "agent"` lets the planner proceed with assumptions and report them back; remaining required questions still come back in `questions[]`. The agent must then call `get_study`, return the complete persisted plan for review, and obtain approval of that exact version before creating BYOP participants or launching paid Panel recruitment. A Panel launch also requires an explicit single country and separate approval of its estimate. Public API MCP tools return full JSON in `structuredContent.result`; supplemental tools use `structuredContent` directly. MCP text `content` also contains the full JSON for model tool chaining. `view_research_answer` supplies readable answer text and quotation labels alongside its structured data. ## Troubleshooting If the tools are missing after hosted OAuth setup, restart the client or start a new chat/task. For stdio, restart the client and force a fresh package download with `npx -y @userintuition-ai/mcp@latest`. See [Troubleshooting](/mcp-server/guides/troubleshooting) for authentication and cache checks. # Attach studies and reports Source: https://docs.userintuition.ai/mcp-server/research-resources Use authenticated MCP resources to bring saved research into a conversation. Clients that support MCP resource attachments can add a saved study or its latest report to a conversation. The server lists the 20 most recently updated studies and the 20 most recently updated studies with reports that the current credential can access. Use a resource URI directly for an older study. | Resource URI | Contents | | - | - | | `userintuition://study/{study_id}` | Saved study settings, plan, screeners, and targeting | | `userintuition://report/{study_id}` | Latest report overview | | `userintuition://report/{study_id}/{view}` | One named section of the latest report | | `userintuition://events/{study_id}` | Recent `study.completed` and `report.ready` event envelopes, when live events are enabled | For `{view}`, use `overview`, `study_findings`, `participant_profiles`, `participant_responses`, `evidence_coverage`, `recommended_next_steps`, or `references`. The `full` report view is not offered as an attachment. Use `get_study_report` when you need the entire report or when a section is too large to attach. Resources use the same authorization and workspace checks as the public study and report endpoints. Hosted OAuth access requires the `read` scope. An unavailable or ungenerated report returns the public API error. Attachments are capped at 64 KiB; a larger response contains a `resource_too_large` pointer instead of partial research data. If your client does not expose resource attachments, call `get_study` or `get_study_report` with the same study ID. ## Listen for study and report changes Clients that support the MCP 2026-07-28 `subscriptions/listen` method can subscribe to a study, report, or events URI above. The hosted server checks access to the study before opening the stream. When a study completes or its report becomes ready, the server sends `notifications/resources/updated` for the affected study or report and for the events resource. Read `userintuition://events/{study_id}` to see the event ID, type, study ID, and data. The event envelope matches the webhook payload, so an integration can use webhooks while a chat client listens for the same milestones. The events resource retains the latest 100 envelopes for 24 hours. A listen stream closes after 25 minutes by default; reconnect to keep receiving updates. Set `MCP_EVENT_REDIS_URL` on the backend to the same Redis instance as the MCP service's existing `REDIS_URL`. Webhooks continue to deliver independently. Clients without listen support can use the existing polling tools and webhooks. # Account context Source: https://docs.userintuition.ai/mcp-server/tools/account-context Check the active workspace and payment readiness before account-scoped or paid work. | Tool | Description | | - | - | | `get_account` | Read the effective organization or personal workspace, role, available credits, payment method readiness, and incentive limits | | `list_organizations` | Search accessible organizations by organization name, active owner name, or owner email; return IDs, names, and owner contacts | Call `get_account` when the agent needs to know which workspace its credential can access. The returned `app_id` and `organization_id` describe the scope applied by the backend. Without an explicit selection, an API key uses its default organization and a session uses its active account context. Users can belong to multiple organizations. Use `list_organizations` with optional `search`, then pass `organization_id` to `get_account` and subsequent tools. Results are limited to active memberships for ordinary users; platform administrators have app-wide discovery. Search happens before pagination. The `owners` list can contain multiple active owners or be empty. Confirm the organization with the human before a consequential action. The selected workspace supplies billing and audit context; API-key scopes and spend caps apply. # Panels and external-panel integrations Source: https://docs.userintuition.ai/mcp-server/tools/integrations-panels Feasibility tools, paid panel guidance, and a customer-supplied panel bridge for BYOP studies. | Tool | Description | | - | - | | `submit_feasibility_request` | Submit a low-incidence or specialized audience for manual review | | `list_feasibility_requests` | List the account's feasibility requests newest-first | | `get_feasibility_request` | Fetch one request and its status or estimate | | `cancel_feasibility_request` | Withdraw a request that is still pending | ## Bring Your Own Panel This is a provider integration for a **BYOP study**, distinct from adding individual participants with `create_participants`. The external provider sends respondents through an entry URL with its respondent ID. User Intuition records each session and redirects the respondent to the provider's completion or screen-out URL when the interview ends. It does not launch or charge for User Intuition's paid panel. | Tool | Description | | - | - | | `get_external_panel` | Read the configured entry URL, ID parameter mapping, and outcome redirects | | `configure_external_panel` | Create or replace the configuration for one BYOP study | | `regenerate_external_panel_token` | Issue a new entry URL and immediately invalidate the old one | | `delete_external_panel` | Disable the entry URL; existing interviews remain | Create and customize a study with `recruiting_method: "byop"`, then use `get_study` to confirm it is provisioned and review the current plan. `configure_external_panel` requires absolute HTTP(S) completion and screen-out redirect URLs. You can also set the provider's respondent ID query parameter and placeholder, session and external study ID mappings, and quota-full or technical-failure redirects. The response includes `entry_url`; have the human verify the plan, parameter mapping, and redirects before giving that link to the provider. Changing the configuration with the same PUT keeps the entry token. Token regeneration changes the URL, so the provider must receive the replacement link before the old one is used again. Use a fresh `idempotency_key` for each regeneration and reuse it if its result is uncertain. For the same operations over REST, see [External panels](/api-reference/external-panels). ## Before a panel launch 1. Call `get_study` and confirm `recruiting_method` is `panel`. 2. Return the complete persisted plan, audience, and screeners from `get_study`; obtain explicit approval of that exact version. 3. Ask the user to choose the launch country explicitly. One `launch_panel` call fields exactly one country; it cannot field a region or a list of countries. 4. Read `userintuition://catalog/panel-countries` and verify that the country supports the study's language. If your client cannot read MCP resources, use the authenticated `GET /api/public/v1/panel-countries/` endpoint. 5. Call `estimate_panel` with that `country_code`; show the resolved country, language, cost, and heuristic timeline. 6. Call `launch_panel` with the returned `estimate_id` and the same country to review the saved plan and current estimate. This first call does not spend. In clients advertising MCP Apps support, the human approves with the App button. In other clients, show the complete saved plan as Markdown and the estimate as readable amounts, ask for explicit human confirmation, then call `launch_panel` again with the same inputs, returned `chat_approval_nonce` and `human_confirmed: true`. 7. The review is short-lived and single-use, bound to the credential, organization, study version and estimate. Changed inputs, an expired quote or a changed saved plan require fresh review and human confirmation. After an uncertain response, read `get_study` before any further action; do not automatically create a new approval to retry. Client tool permissions and approval of an earlier plan do not count. The chat fallback relies on the model obtaining genuine human confirmation; the server cannot independently prove who supplied it. Clients advertising App support must use the human button. No dashboard approval is involved. For a brief that names multiple countries, ask the user to select one country or create separately approved country-specific studies or launches. Never allow an omitted country to silently become a different market. Direct launch requires `incident_rate >= 10`. Use `submit_feasibility_request` for lower-incidence or specialized audiences. A feasibility request is a persistent manual-review record; use `cancel_feasibility_request` to withdraw it while pending. Feasibility request status is `received`, `responded`, or `cancelled`. Only a pending request can be cancelled. Panel country responses use uppercase country codes and lowercase language codes; use a lowercase code such as `en` to filter by language. Describe audience criteria in ordinary language through `customize_study`. The backend matches suitable criteria such as age or household income to canonical targeting attributes and decides when a custom screener is needed. Targeting attributes are not accepted by `launch_panel` through MCP. # Intelligence Hub Source: https://docs.userintuition.ai/mcp-server/tools/intelligence-hub Manage research sessions, chat with verified evidence, and generate or edit Studio outputs. > [!NOTE] > > All Hub tools use `/api/public/v1/intelligence-hub/*`, including analysis and export polling. Use the organization-scoped public Hub API through these tools. Platform admins can add studies from other organizations within the same application to a session in their own selected workspace. Create a session, add/sync studies or upload sources, then chat or generate outputs. File Search retrieves relevant evidence; reports and PowerPoints reuse saved findings. You do not need to start exhaustive analysis before creating an output. | Tool | Description | | - | - | | `create_research_session` | Create a Hub session with an idempotency key | | `rename_research_session` | Rename a Hub session | | `delete_research_session` | Delete a Hub session | | `sync_research_study` | Add or refresh one study in a session | | `remove_research_study` | Remove a study source from a session | | `remove_research_source` | Remove a study or document by its opaque source ID | | `add_all_research_studies` | Attach all available studies | | `clear_research_sources` | Remove all source associations from a session | | `inspect_research_session` | List sessions, sources, chat history, outputs; read a session, output, or job | | `upload_research_source` | Upload external evidence as base64 file contents (10 MB decoded maximum) | | `chat_research_session` | Synchronous chat; returns a durable job when the wait expires | | `queue_research_chat` | Queue chat immediately; shares retry keys with synchronous chat | | `generate_research_output` | Queue a report, native PowerPoint, or saved Highlights video | | `edit_research_output` | Prompt an in-place report or PowerPoint edit; retains the output ID | | `rename_research_output` | Rename a saved Studio output | | `delete_research_output` | Delete a saved Studio output | | `upload_research_template` | Upload a report or presentation template (5 MB maximum) | | `download_research_output` | Download Markdown/PPTX/PDF bytes or get a private Highlights video link | | `start_research_analysis` | Start an advanced exhaustive, quick, aggregate, or exploratory run | | `resume_research_analysis` | Resume a run with an additional call allowance | | `cancel_research_analysis` | Cancel an active run | | `get_research_analysis` | Inspect canonical evidence, coverage and analysis run history | | `queue_research_deliverable` | Advanced run-bound presentation, clip, reel or default-report video export | | `get_research_deliverable` | Poll an export job and obtain its private download link | | `cancel_research_deliverable` | Cancel an export job | Use `inspect_research_session` with `view: "job"`, `session_id`, and the returned `job_id` to poll chat, preparation, generation and edits. On success, read the answer/references or the returned `output_id`. Use `parent_job_id` for a chat follow-up. Preserve the required `idempotency_key` (1–200 characters) and the exact input on retries. A sync wait expiring never cancels or duplicates the backend job. Native Tasks remain available for the existing low-level `queue_research_deliverable` tool; the new session tools use explicit durable job polling on both transports. Read outputs before editing. Edits publish in place after success; default reports are read-only. Highlights are generated once per default-report revision, with learning-goal chapters and the report's verified quotations. Original audio is used when available; chat-only studies have no artificial narration. Uploads accept `file_name` and `data_base64`, never server-local paths or arbitrary URLs. The host must supply an attachment's bytes. Downloads return structured `filename`, `mime_type`, `data_base64` and `size_bytes` (64 MB transfer maximum), or a short-lived `download_url` for video. Decode file bytes to a local artifact; do not display base64 to the human. Source access is rechecked on every read. These tools are available on full, core and compact profiles; read-only includes five read tools: `inspect_research_session`, `get_research_analysis`, `get_research_deliverable`, `download_research_output`, and `view_research_answer`. The directory profile exposes eight research read tools. ## Example: research to Studio ```json theme={null} {"tool":"create_research_session","arguments":{"name":"Product research","idempotency_key":"session-001"}} ``` Add a study with `sync_research_study`, or upload an external source. Save the returned session ID and preparation job ID. Then queue a question: ```json theme={null} {"tool":"queue_research_chat","arguments":{"session_id":"SESSION_UUID","prompt":"What drives trust? Include verified quotations.","idempotency_key":"chat-001"}} ``` Poll `inspect_research_session` with `view: "job"` until it succeeds or fails. Return the answer and its source references to the human. For another turn, use `parent_job_id` to preserve the conversation context. ```json theme={null} {"tool":"generate_research_output","arguments":{"session_id":"SESSION_UUID","type":"powerpoint","prompt":"Summarize the saved findings for the product team.","idempotency_key":"deck-001"}} ``` After success, inspect the returned output ID. To apply a user-requested change: ```json theme={null} {"tool":"edit_research_output","arguments":{"session_id":"SESSION_UUID","output_id":"OUTPUT_UUID","prompt":"Shorten the executive summary, retaining citations.","idempotency_key":"edit-001"}} ``` The output ID remains the same. Wait for the edit job to succeed before reading or downloading the updated file. Default reports cannot be edited. Generation and editing need a `write`-scoped key; inspection/download need `read`. A human's request to generate Highlights authorizes using the original participant audio when available; no artificial narrator is introduced for chat studies. See the [REST API reference](/api-reference/intelligence-hub) for exact schemas, source IDs, pagination, templates and retry contracts. Report templates accept Markdown, TXT, or DOCX with placeholders such as `{{title}}` and `{{findings}}`. Presentation templates accept 16:9 PPTX files and reuse their theme and layouts. Templates provide formatting, not research evidence. ## Study questions and clickable evidence | Tool | Description | | - | - | | `view_research_answer` | Show a saved Hub chat answer with clickable citations and authenticated reference cards; also checks pending jobs. | For study findings, comparisons and quotations, resolve the intended studies, create a Hub session if needed, and attach only the requested missing studies. Retain the session for the conversation. Reuse unchanged sources; do not resync or run exhaustive analysis for every question. Follow-ups use the last completed chat job as `parent_job_id`. Study-plan changes still use `customize_study`; status questions use their dedicated tools. Read-only and directory profiles cannot create chat turns. The answer and its reference cards stay inside the MCP conversation. Always call `view_research_answer` after the chat job completes to display the full answer with clickable citations; do not replace it with a link to the Intelligence Hub dashboard. In clients that support MCP Apps, clicking a citation opens a card in the embedded answer, with original audio or video playback and transcript context. Clients without MCP Apps receive the readable answer and quotes, but cannot display interactive cards. `chat_research_session` and `queue_research_chat` expose an MCP App that polls the same durable job. `view_research_answer` can reopen it using `session_id` and `job_id`. Clicking a citation fetches its exact quotation, nearby transcript context, study name and available original recording. Reference access is checked again on every read. Citation labels identify transcript turns, not distinct participants. Hub answer generation and verification group citations by source interview so multiple quotes from one interview are not described as different people. Chat interviews have no generated narration. External-document cards show their verified excerpt and page when available. The App preserves the backend's citation labels and displays no internal IDs or raw JSON. In clients without MCP Apps, the viewer returns readable answer text and quotation labels. Interactive cards are supported inside the embedded App; the MCP server cannot control citation rendering in a host assistant's prose. # Interviews Source: https://docs.userintuition.ai/mcp-server/tools/interviews 4 MCP tools for reading and administering interview records. Use product terminology in user-facing conversation: an interview is the completed or in-progress research session. | Tool | Description | | - | - | | `list_interviews` | List lightweight interviews by study, participant, status, or quality | | `get_interview` | Fetch metadata, a page of spoken messages, recording links, and screener responses | | `delete_interview` | Soft-delete an interview owned by the authenticated user | | `get_interview_usage_stats` | Aggregate interview counts and units over a date range | All four tools use the versioned public API; use `daily`, `weekly`, or `monthly` for its cadence. It reports eligible non-test interview counts and billed units for the selected app, not every interview or interview duration. If `app_id` is omitted, the backend resolves the default app. Missing dates use the 30-day range ending today. The response's `scope` records the applied app, dates, and cadence, including when totals are zero. Use `total_interviews` and each bucket's `interviews`, `audio_interviews`, `video_interviews`, and `chat_interviews` fields. ## Working with results Use `list_interviews` for discovery and `get_interview` for evidence. Filter `list_interviews` by `participant_id` to see one participant's interviews; this is the BYOP invitation ID. You can combine it with `study_id`. Status accepts `pending`, `started`, `live`, `completed`, `ended`, `failed`, or `cancelled`. Quality accepts `Excellent`, `Good`, `Fair`, or `Poor` case-insensitively. Invalid filters return an error. List rows omit transcripts and exclude test or hidden interviews before counting and paging. `participant_source` is `byop`, `panel`, `external_panel`, `link`, or `unknown`. Anonymous sources have `participant: null`, so fabricated addresses are not presented as contactable people. For BYOP, `participant.id` is the invitation ID, not a unique person ID. `ended_because` uses `completed`, `participant_left`, `time_limit`, `technical_error`, or `screened_out`; it is null when the stored reason cannot be classified. `get_interview` requires the public `interview_id`. It returns up to 100 spoken transcript segments per request, stopping near 20 KB of transcript text. Start with `message_offset: 0` and follow `next_message_offset` until it is null; `message_limit` accepts 1–100 and defaults to 50. Each segment is at most 1,500 characters and includes its original turn `id`, speaker role, and `text_offset`. When the source has recording timing, segments include `start_s` and `end_s` in seconds from the interview start. Historical untimed messages omit these fields. The response includes `total_message_segments`. System prompts and tool messages are excluded. Use `generate_report` and `get_study_report` from the Studies group for cross-interview analysis. ## Deletion `delete_interview` is destructive and should only be called when the user explicitly asks to delete a specific interview. There is no public `update_interview` or quality-override tool. Do not imply that an agent can hide, relabel, or bulk-delete interviews. # Participants Source: https://docs.userintuition.ai/mcp-server/tools/participants 7 MCP tools for creating and managing BYOP invitations and rewards. The public participant resource represents a BYOP invitation and its progress, not a deduplicated person. One person can take more than one interview. Panel, external-panel, and open-link respondents are anonymous interviews rather than public participant records. `list_participants` applies an exact, case-insensitive email filter. An exact `external_id` filter is also available when `study_id` is supplied. Test and panel invitations are excluded before `total_count` and pagination are calculated. Each record has a personal `interview_link`, `status`, and `interview_count` of visible non-test sessions. Status is `created` when no email was sent, then `invited`, `started`, `completed`, or `screened_out`. A silent invitation starts as `created` but still has a personal link. Use the returned participant ID as `list_interviews.participant_id` to page through its interviews; the count is sessions, not unique people. | Tool | Description | | - | - | | `list_participants` | List participants by study, exact email, or study-scoped customer ID | | `create_participants` | Queue 1–100 unique participants for one BYOP study | | `get_participant_job` | Poll batch status before listing invitations | | `get_participant` | Read invitation status, personal link, interview count, and reward state | | `update_participant` | PATCH the email, customer ID, or metadata after verifying the invitation | | `delete_participant` | Soft-delete a BYOP invitation, with a separate guard for linked interviews | | `send_participant_reward` | Send the configured BYOP incentive | ## Creating participants `create_participants` accepts a `study_id` and a `participants` array. Email addresses must be unique case-insensitively. Each participant supports `silent: true` to create the record without sending an invitation email. The call returns a durable job ID; poll `get_participant_job` until it succeeds, then use `list_participants` to retrieve the invitations. If a worker stops mid-batch, the job retries missing participants without resending existing invitations. Each participant may also carry an `external_id` from your CRM and a `metadata` object. An external ID is unique among active BYOP invitations **within the study**; the same ID may be used in another study. A batch cannot repeat an external ID. Metadata accepts at most 20 keys, scalar values only, keys up to 64 characters, strings up to 256 characters, and 4 KiB total. These fields are returned by participant reads and lists. An existing email with different CRM fields produces a conflict during a retry; inspect the invitation before changing it. Do not put secrets in metadata. Create and finish the study first. Call `get_study`, return the complete persisted plan to the user, and obtain explicit approval of that exact version. Only call `create_participants` after the study is provisioned and the current plan is approved. Approval to create a draft or answer Customize Plan questions is not plan approval. ## Updates and rewards Call `get_participant` before `update_participant`. Supply only fields to change: `email`, `external_id`, or `metadata`. Send `email: null` only when the user wants to clear the email; `external_id: null` clears the customer ID. Metadata replaces the whole metadata object. Rewards are BYOP-only and can have a real financial side effect. Call `send_participant_reward` only after the user explicitly asks and after confirming the participant is the intended recipient. The backend prevents duplicate payment for an already-paid participant. Pass `idempotency_key` and reuse the same key and participant ID after an uncertain response; check the participant reward state before starting a separate operation. `delete_participant` requires an explicit user request. If the invitation has interviews, deletion returns a conflict. Only set `cascade_interviews: true` after the user separately approves deletion of those interviews; the database soft-deletes them with the invitation. # Studies Source: https://docs.userintuition.ai/mcp-server/tools/studies 23 MCP tools for creating, customizing, reviewing, fielding, reporting on, and searching studies. Studies are the central research object. The 23 tools below use the public API for study data; `review_study` presents that data as a read-only MCP App in supported clients. | Tool | Description | | - | - | | `approve_panel_launch` | App-only approval handler, hidden from the model; the person uses the launch App button | | `queue_report_slides` | Queue an export of an existing saved study report | | `get_report_slide_job` | Poll the saved-study report slide export | | `list_studies` | List study summaries with filters and report availability; use `get_study` before a write | | `create_study` | Create a Panel, BYOP, or synthetic respondent metadata draft | | `customize_study` | Send one natural-language turn to the dashboard's stateful Customize Plan conversation | | `queue_customize_study` | Queue a planning turn and return a durable job ID; use this for text and public image URLs | | `get_customize_study_job` | Poll the queued planning turn until it succeeds or fails | | `get_study` | Fetch the complete study plan, screeners, and targeting | | `review_study` | Open the saved plan and fielding progress in a read-only MCP App; other clients receive the study data as text | | `update_study` | PATCH ordinary metadata only; use `customize_study` for designed content | | `delete_study` | Soft-delete a study and linked records from normal reads; no public restore endpoint | | `estimate_panel` | Get a read-only panel cost and timing estimate with an expiring estimate ID | | `launch_panel` | Review a saved plan and current panel quote; approve through the App or explicit human chat confirmation in clients without Apps | | `pause_study` | Pause recruitment while preserving progress and the reward hold | | `resume_study` | Resume preserved panel recruitment | | `stop_study` | End recruitment and settle or release its hold | | `generate_report` | Queue analysis of completed interviews and return a job ID | | `get_report_job` | Poll report generation status before fetching the result | | `get_fielding_progress` | Compare qualifying completions with target, quality mix, and estimated finish | | `get_study_report` | Fetch the latest report, canonical JSON sections, call-linked citations, interview count, and stale status | | `search_research` | Search indexed study/report content and return only canonical API JSON | | `answer_research` | Answer across selected studies with numbered citations to accessible canonical research records | ## Review study `review_study` cannot approve a plan or start recruitment. Review the persisted study version and obtain explicit approval before any participant creation or paid launch. ## Structured reports and search `generate_report` returns a durable job. Poll `get_report_job` until it succeeds, then call `get_study_report`. `get_fielding_progress` reports current target-cycle completions and quality counts; expected finish is null until a rate estimate is supportable. Reports use schema `report-v2`. The default `view: "overview"` returns report identity, freshness, counts, a short summary, and `available_sections`. Set `view` to `study_findings`, `participant_profiles`, `participant_responses`, `evidence_coverage`, `recommended_next_steps`, or `references` to fetch one section; use `full` only when all sections are needed. `included_sections` distinguishes omitted sections from sections that are present but empty. The complete saved interview-ID list is included only in `full`. `study_findings.learning_goals` nests each finding under its Learning Goal and gives it a stable `finding_id`. Explicit frequency becomes `prevalence: { n, of }`, and resolvable source quotes become `quotes[]` with `reference_id`, `interview_id`, `turn_id`, and `start_s` when timing was stored. Unavailable evidence is represented by null or empty fields. `participant_profiles` is an array keyed by a stable `question_id` derived from the question heading; its `content` is an array of `{ answer, participants, percentage }`. Use `references` and public `interview_id` to inspect source evidence. `search_research` searches 1–20 study IDs and optionally filters by content type or research date. It can retrieve `study_plan`, `study_finding`, `participant_profile`, `participant_response`, and `recommended_next_step` objects. Search ranks candidates, but the tool discards generated prose and returns the exact canonical JSON stored by the Study/Report APIs. Results are grouped in `studies[]` under each requested study; check its `index_status`, `latest_report_id`, and `indexed_report_id` for freshness. Follow `next_cursor` with unchanged query, filters, and limit until null; an empty final page is possible. Participant-response matches include a public `interview_id` to use with `get_interview`. `answer_research` takes a question and the same study/date/content filters. It returns generated prose with numbered citations whose content IDs were verified against accessible canonical search results. `citations[]` identifies each source's study, content type, report, and interview when available; `studies[]` reports index freshness without repeating the full search payload. `insufficient_evidence` means the indexed sources did not support an answer. Use `search_research`, `get_study_report`, or `get_interview` to inspect source content and verify exact quotations. When the primary ranking service is unavailable, search falls back to bounded keyword matching over current indexed research for the same authorized study IDs and filters. Keyword ranking can differ from the primary semantic ranking; results still come from the canonical stored records. ## Finding studies `list_studies` defaults to 20 rows per page and accepts at most 100. Filter by `name`, provisioning `status` (`draft`, `ready`, or `provisioned`), `recruiting_method`, ISO date-time `created_after`, or `has_report`. Filters apply before the count and page. Results are ordered by `updated_at` descending, then study ID descending, so pages have a stable order. Each row's `interview_count` uses the same completed, visible, non-test, quality-filtered set as `list_interviews(status=completed)`; `get_study` returns that count too. `report_status` is `available` or `not_generated`. `study_link` is the live participant interview link when the interviewer is provisioned and the study is not paused; it is not a researcher preview link. Study detail also returns `invitation_count` (invitation records), `interview_attempt_count` (all attempts), and `quality_interview_count` (interviews that passed quality checks). A panel launch can have one invitation record and many interviews. `study_plan.learning_goals_structured` gives each enriched Learning Goal a stable `id`, `question`, and `evidence_needed`. Report `learning_goal_id` values use those IDs. The markdown `learning_goals` field remains for existing clients. Historical study labels appear in `use_case`; `study_type` is always one of the current creation types. ## Study decisions and defaults Before creating a study, ask for the required recruiting decision: * `recruiting_method`: `panel`, `byop`, or `synthetic_respondents` For Panel and BYOP studies, omitted interview settings default to `interview_format: "voice"`, `language: "en"`, and `voice: "male"`. Synthetic respondents use chat. Use explicit alternatives only when the user requests them. Voice is optional for chat studies; an explicit value accepts only `male` or `female`. `create_study` requires a nonblank `name` and an explicit recruiting method; it does not accept `byop_config` or designed content. Prototype tests cannot use chat. Study-name writes have a maximum length of 40 characters; reads can return longer saved names. `study_type` accepts `in-depth-interview`, `concept-test`, and `prototype-test`; the default is `in-depth-interview`. Prototype tests cannot use chat. Catalog tools may help explain the available template, but the MCP host must not turn catalog prompts into a plan. `customize_study` loads and applies the selected study type's instructions on the backend. ## Customize Plan conversation `create_study`, `customize_study`, `queue_customize_study`, `create_participants`, `generate_report`, and `launch_panel` accept an optional `idempotency_key`. Hub session creation, chat, output generation and edits, analysis creation, and deliverable creation require `idempotency_key` (1–200 characters). Use a new key for each approved paid launch. For panel approval, check `get_study` after a timeout before taking any further action. The MCP review nonce is single-use; do not create a new approval merely to retry a launch. Backend idempotency protects the submitted paid request. The planning conversation is stored on the study; continue it with `study_id`, without passing a separate conversation identifier. For a text planning turn, call `queue_customize_study`. It returns a job ID promptly. Poll `get_customize_study_job` until `status` is `succeeded` or `failed`; a successful job includes the next planning response in `result`. Call `get_study` after success to inspect the persisted plan. The synchronous `customize_study` remains available for native concept images, which the queue does not accept. A public image URL may be included in the queued message. After creating the metadata draft, call `customize_study` with the user's ordinary-language brief. Use the same tool for all later changes to: * the study plan and expected duration * canonical audience targeting and custom screeners * concept links and concept images Do not translate the user's request into MCP-side `study_plan`, `targeting_attributes`, `screener_questions`, or concept schemas. The backend owns those fields and performs the same checks and reconciliation as Customize Plan in the dashboard. Use `decisions: "human"` by default: relay `questions[]` to the researcher and call `customize_study` again with their answer. When the researcher delegates ordinary research-design choices, use `decisions: "agent"`; report `assumptions[]`, and relay only questions still returned as required. This never authorizes the agent to choose an unspecified recruiting method, send invitations, or approve a paid launch. Put a draft-only workflow instruction in `execution_policy: "draft_only"`, not in the research `message`; direct launch or invitation commands in `message` return 422. The policy is returned with this turn, and this endpoint never starts recruitment. It does not replace approval checks on later fieldwork calls. When the response contains a plan or completion message, call `get_study` to verify what was persisted. Return the complete persisted plan in a readable form and ask the user to approve that exact version or request revisions. Do not substitute a summary or dashboard link. Route revisions through `customize_study`, fetch the result again, and repeat review. Approval to create a draft, client tool permissions, and approval of a Panel estimate do not count as approval of the current study plan. For an attached concept image, include `concept_image` with the raw bytes encoded as base64, filename, MIME type, and the user's participant-facing label. This works when the client exposes attachment bytes or a readable local path and does not require public hosting. Public downloadable image URLs remain supported in the message. Never ask for login credentials. ## Drafts and provisioning `create_study` supports incremental setup and may return a draft. Every study response includes: | Field | Meaning | | - | - | | **provisioning\_status** | `draft`, `ready`, or `provisioned` | | **fielding\_status** | Recruitment lifecycle: `not_started`, `starting`, `fielding`, `paused`, `complete`, `partial`, `failed`, `stopped`, `unavailable`, `not_applicable`, or `unknown` | | **missing\_requirements** | The fields still needed before the interviewer can be provisioned | When the Customize Plan conversation completes the last missing requirement, provisioning happens automatically. Only create BYOP participants or launch a paid Panel study after `get_study` says `provisioning_status: "provisioned"` and the user has approved the current returned plan. Treat `fielding_status` as distinct from provisioning. Panel studies expose their persisted recruitment state. BYOP returns `unavailable` because progress is tracked on invitations and interviews, while synthetic respondents return `not_applicable`. ## Read before write Call `get_study` before `update_study`. * `update_study` changes ordinary metadata such as name, recruiting method, interview format, language, voice, and BYOP incentives. * `customize_study` changes the plan, expected duration, targeting, screeners, and concept material. A fielding Panel study must be paused or stopped before it can be edited. Pause when recruitment should continue later; stop when recruitment is finished. The raw REST API may expose additional structured study fields. The MCP intentionally routes designed content through Customize Plan so dashboard and agent-created studies follow the same planning behavior. # Configuration resources & targeting Source: https://docs.userintuition.ai/mcp-server/tools/targeting Live MCP resources for languages, modes, voices, and study types, plus one targeting tool. Read these resources for valid public study settings. `list_targeting_attributes` remains a tool because it searches a potentially large targeting catalog. These resources read the same versioned public reference endpoints available to REST integrations. They contain no internal planning prompts or voice implementation fields. | Resource URI | Description | | - | - | | `userintuition://catalog/languages` | Supported interview language codes | | `userintuition://catalog/modes` | Voice, chat, and video modes | | `userintuition://catalog/study-types` | Public study-type planning templates | | `userintuition://catalog/study-types/{slug}` | One template's public details | | `userintuition://catalog/voices` | Usable interviewer voice choices | | `userintuition://catalog/panel-countries` | Supported panel countries and languages | | Tool | Description | | - | - | | `list_targeting_attributes` | Search panel targeting attributes and options by name or category | ## Planning versus public write fields The study-type catalog returns current planning templates in `study_types[]`. These templates describe use cases; `create_study.study_type` describes the research method and accepts `in-depth-interview`, `concept-test`, or `prototype-test`. Do not use catalog prompts to draft a moderator guide in the MCP host. `customize_study` applies the selected template instructions. The voices resource returns `{ voice, name }` choices. Pass only the `voice` value, `male` or `female`, to public study tools; the name is a display label. No external preview URLs are exposed by this catalog. `list_targeting_attributes` gives readable panel targeting labels and their IDs. Saved study targeting also resolves to readable labels; check approximation notes before describing who qualifies. Panel targeting does not apply to BYOP studies. Concept links and images are managed through `customize_study`, not separate MCP tools. # Webhooks Source: https://docs.userintuition.ai/mcp-server/tools/webhooks Create, inspect, test, rotate, and remove webhooks and view delivery attempts. | Tool | Description | | - | - | | `create_webhook` | Register an account or study-scoped webhook with event subscriptions | | `list_webhooks` | List webhook registrations without signing secrets | | `get_webhook` | Inspect one registration without its signing secret | | `rotate_webhook_secret` | Replace its signing secret; the new value is shown once | | `test_webhook` | Send a signed, data-free test event to the registered URL | | `list_webhook_deliveries` | Page through delivery attempts and coarse failure reasons | | `delete_webhook_by_id` | Remove one registration by ID | | `delete_webhook` | Delete a webhook by its registered URL | Webhooks can cover an account or one study. Subscribe to `interview.completed`, `study.completed`, `report.ready`, `study.paused`, `study.resumed`, `study.stopped`, `participant.screened`, `participant.started`, `participant.quality_scored`, or `study.quota_reached`. See the [event coverage and payloads](/api-reference/webhooks/overview#participant-lifecycle-events) before relying on a runtime-specific start event. The three lifecycle events currently cover public API pause, resume, and stop calls. `create_webhook` returns an HMAC signing secret once; `rotate_webhook_secret` returns the replacement once. Store it securely and never repeat it in logs or ordinary chat output. List and get responses never include a secret. Use `test_webhook` to verify the destination and `list_webhook_deliveries` to inspect recent attempts. The test event contains no participant or study data. Delivery history contains status and coarse errors, not request bodies. Creating a webhook changes an external integration and should require user confirmation. If a temporary webhook is created for testing, delete it before finishing. # Embed the AI Widget Source: https://docs.userintuition.ai/recruiting/embed-widget Embed a study in your site or app so people can start a voice or chat interview without leaving. Install with HTML, JavaScript, or React. The User Intuition AI widget lets participants start a voice or chat interview without leaving your product. Responses appear on your study dashboard like any other interview. Use it for in-app feedback, post-purchase surveys, churn intercepts, or always-on listening from inside your product. *** ## From the dashboard On a BYOP study, open the **Invites** tab and click **Invite Participants**. Two items give you ready-made code: | Menu item | What you get | | - | - | | **Copy Embed Code** | Opens the **Copy Embed Code** dialog with the full widget, pre-filled with this study's values. Switch between `tsx` (a React component) and `html` (the custom element plus its script tag), then click copy. | | **Copy Button Embed Code** | Copies a styled **Take the study** button to your clipboard: a plain link to your study with a small `