Skip to content
Questionnaires

API reference

API plan access: External personal/service tokens require the workspace’s configured api capability (Pro by default). New issuance and bearer requests return pro_required when it is unavailable. Roles, scopes and project restrictions still apply. Free browser authoring, public collection, documentation, token inventory and revocation remain available. Downgrade retains credentials; eligible recovery restores unexpired, unrevoked tokens without resetting usage.

Open the interactive OpenAPI reference to browse the public API routes and schemas, or download the OpenAPI JSON.

JSON request bodies

The API accepts JSON objects for survey creation, draft saving, project and workspace creation, profile updates, token issuance and invitations. Set Content-Type: application/json. Validation and publication are POST endpoints without bodies; they use the current saved draft. Google sign-in uses GET redirects, and sign-out is a bodyless POST.

Create and publish a survey in this order:

  1. Create: POST /api/v1/projects/{projectId}/surveys.
  2. Read the draft: GET /api/v1/surveys/{surveyId}.
  3. Save your changes: PUT /api/v1/surveys/{surveyId}/draft.
  4. Validate: POST /api/v1/surveys/{surveyId}/validate.
  5. Publish: POST /api/v1/surveys/{surveyId}/publish.

See authentication for cookies, CSRF, token scopes, and roles. See creating surveys for complete examples.

Access and retry rules

OpenAPI describes supported contracts; schema validity does not replace graph validation, current permissions, live collection gates or optimistic revision checks. Error envelopes normally have error.code and error.message. Shared error responses list possible API failures, not a promise that every route emits every status.

Operation familyCredential and permissionRetry or concurrency rule
Published contentPublic reads; live gates still applyPublished definitions/pages are versioned; collection/protection remain live.
Project readSession membership or projects:readWorkspace and optional project restriction apply on every request.
Survey create/read/save/validate/publishSession editor or the respective survey scopeDraft revision protects saves. Create and publication do not promise universal idempotency.
Tracked link and QR readsSession membership or surveys:readCreation/rename and live collection/protection/embed updates are session-only.
Results, reports and CSVSession membership or responses:read; report/brief writes also need reports:write and editor roleSnapshot/after cursors are actor-scoped. Report creation requires Idempotency-Key. Brief writes use revision.
Workspace/profile/token/team settingsSigned-in session, appropriate membership/role and write CSRFTokens cannot administer workspaces or create projects. Personal workspaces cannot invite teammates.
Research deletionWorkspace owner session and write CSRFRequest key plus explicit confirmation; advance resumes one bounded batch.
BillingOwner/admin session for reads; owner session and CSRF for Checkout/portalRequest key identifies one intention; return URLs never grant Pro.

Token scopes are independent: surveys:publish cannot validate without surveys:write, and surveys:* does not grant results access. Use authentication for the sorted scope list and wildcard rules.

Browser session writes require CSRF even on routes that also accept bearer tokens. Response collection is handled by the hosted survey or embed, not the developer integration API.

Endpoint inventory

The following inventory is kept in sync with the published OpenAPI contract. Request/response names refer to schemas in the interactive reference. — means no JSON body. Admin, HTML application pages, widget scripts, images and static assets are outside this API inventory.

MethodPathAccessRequestSuccess response
GET/api/docspublic—200 Html
GET/api/healthpublic—200 Health
GET/api/openapi.jsonpublic—200 OpenApi
GET/api/openapi.yamlpublic—200 OpenApi
POST/api/v1/invitations/acceptsessionInvitationAccept200 InvitationAccepted
GET/api/v1/mesession—200 Me
PUT/api/v1/me/avatarsessionAvatarInput200 AvatarResult
PUT/api/v1/me/profilesessionProfileInput200 ProfileResult
GET/api/v1/projectstoken—200 Projects
POST/api/v1/projectssessionProjectInput201 ProjectCreated
PATCH/api/v1/projects/{projectId}sessionProjectUpdate200 ProjectResult
GET/api/v1/projects/{projectId}token—200 ProjectResult
GET/api/v1/projects/{projectId}/research-deletionssession—200 DeletionPreview
POST/api/v1/projects/{projectId}/research-deletionssessionDeletionInput202 DeletionJob
GET/api/v1/projects/{projectId}/research-deletions/{deletionId}session—200 DeletionJob
POST/api/v1/projects/{projectId}/research-deletions/{deletionId}/advancesessionEmptyInput200 DeletionJob
GET/api/v1/projects/{projectId}/surveystoken—200 Surveys
POST/api/v1/projects/{projectId}/surveystokenSurveyCreate201 SurveyCreated
GET/api/v1/public/{workspace}/{project}/{survey}public—200 SurveyDefinition
GET/api/v1/public/{workspace}/{project}/{survey}/pagepublic—200 SurveyPage
PATCH/api/v1/survey-links/{linkId}sessionSurveyLinkRename200 SurveyLink
GET/api/v1/survey-links/{linkId}/qr.pngtoken—200 QrPng
GET/api/v1/survey-links/{linkId}/qr.svgtoken—200 QrSvg
GET/api/v1/surveys/{surveyId}token—200 SurveyDraft
GET/api/v1/surveys/{surveyId}/analysis-runstoken—200 AnalysisRunList
POST/api/v1/surveys/{surveyId}/analysis-runstokenAnalysisRunInput201 AnalysisRun
GET/api/v1/surveys/{surveyId}/analysis-runs/{runId}token—200 AnalysisRun
PUT/api/v1/surveys/{surveyId}/collectionsessionCollectionInput200 CollectionWindow
GET/api/v1/surveys/{surveyId}/drafttoken—200 SurveyDraft
PUT/api/v1/surveys/{surveyId}/drafttokenDraftInput200 DraftSaved
GET/api/v1/surveys/{surveyId}/embedssession—200 EmbedSettings
PUT/api/v1/surveys/{surveyId}/embedssessionEmbedInput200 EmbedSettings
GET/api/v1/surveys/{surveyId}/exports/aggregates.csvtoken—200 Csv
GET/api/v1/surveys/{surveyId}/exports/codebook.csvtoken—200 Csv
GET/api/v1/surveys/{surveyId}/exports/responses.csvtoken—200 Csv
GET/api/v1/surveys/{surveyId}/link-resultstoken—200 LinkResults
GET/api/v1/surveys/{surveyId}/linkstoken—200 SurveyLinks
POST/api/v1/surveys/{surveyId}/linkssessionSurveyLinkInput201 SurveyLink
GET/api/v1/surveys/{surveyId}/protectionsession—200 ProtectionSettings
PUT/api/v1/surveys/{surveyId}/protectionsessionProtectionInput200 ProtectionSettings
POST/api/v1/surveys/{surveyId}/publishtoken—200 Published
GET/api/v1/surveys/{surveyId}/research-brieftoken—200 ResearchBriefResult
PUT/api/v1/surveys/{surveyId}/research-brieftokenResearchBriefInput200 ResearchBriefResult
GET/api/v1/surveys/{surveyId}/research-deletionssession—200 DeletionPreview
POST/api/v1/surveys/{surveyId}/research-deletionssessionDeletionInput202 DeletionJob
GET/api/v1/surveys/{surveyId}/research-deletions/{deletionId}session—200 DeletionJob
POST/api/v1/surveys/{surveyId}/research-deletions/{deletionId}/advancesessionEmptyInput200 DeletionJob
GET/api/v1/surveys/{surveyId}/resultstoken—200 Results
POST/api/v1/surveys/{surveyId}/validatetoken—200 Validated
GET/api/v1/planspublic—200 PublicPlans
GET/api/v1/workspacessession—200 WorkspaceList
POST/api/v1/workspaces/personalsessionWorkspaceCreate201 WorkspaceCreated
POST/api/v1/workspaces/teamsessionTeamWorkspaceCreate201 WorkspaceCreated
GET/api/v1/workspaces/{id}/billingsession—200 WorkspaceUsage
POST/api/v1/workspaces/{id}/billing/checkoutsessionEmptyInput200 BillingRedirect
POST/api/v1/workspaces/{id}/billing/portalsessionEmptyInput200 BillingRedirect
PATCH/api/v1/workspaces/{workspaceId}sessionWorkspaceRename200 WorkspaceRenamed
GET/api/v1/workspaces/{workspaceId}/auditsession—200 Audit
GET/api/v1/workspaces/{workspaceId}/invitationssession—200 Invitations
POST/api/v1/workspaces/{workspaceId}/invitationssessionInvitationInput201 InvitationCreated
GET/api/v1/workspaces/{workspaceId}/memberssession—200 Members
DELETE/api/v1/workspaces/{workspaceId}/members/{userId}session—204 —
PATCH/api/v1/workspaces/{workspaceId}/members/{userId}sessionMemberRoleInput200 MemberRoleResult
GET/api/v1/workspaces/{workspaceId}/featuresRead effective workspace capabilitiesBrowser session—WorkspaceFeatures
GET/api/v1/workspaces/{workspaceId}/included-teamRead included-team selectionBrowser session—IncludedTeamDetails
PUT/api/v1/workspaces/{workspaceId}/included-teamSelect the included teamBrowser sessionIncludedTeamSelectionIncludedTeamDetails
GET/api/v1/workspaces/{workspaceId}/tokenssession—200 Tokens
POST/api/v1/workspaces/{workspaceId}/tokenssessionTokenInput201 TokenCreated
DELETE/api/v1/workspaces/{workspaceId}/tokens/{tokenId}session—204 —

Authentication routes, provider webhook receivers and platform administration are excluded from this public contract.