API reference
Generated from openapi.json. Base path /api/v1.
Forms
get/formsList forms
Operation id: listForms
status(query)folderId(query)q(query)tag(query) Only forms with this tag.
post/formsCreate a form (blank, from template or from definition)
Operation id: createForm
post/forms/importImport FormFlow JSON, Typeform-like JSON, CSV (type,label,required,options), XLSX or Word
Operation id: importForm
get/forms/{id}Get a form (including the draft)
Operation id: getForm
patch/forms/{id}Update metadata and/or the draft definition (needs expectedRevision, 409 on conflict)
Operation id: updateForm
delete/forms/{id}Soft-delete a form
Operation id: deleteForm
post/forms/{id}/archiveArchive a form
Operation id: archiveForm
post/forms/{id}/restoreRestore an archived or deleted form
Operation id: restoreForm
post/forms/{id}/publishPublish the draft as a new immutable version. Fails with 422 and `details.issues` when the definition has errors.
Operation id: publishForm
get/forms/{id}/versionsList published versions
Operation id: listVersions
get/forms/{id}/versions/{version}Get one published version with its definition
Operation id: getVersion
version(path, required)
get/templatesList templates (metadata)
Operation id: listTemplates
typeId(query) Only designs of this template type.category(query)q(query)formType(query) Facet: form, survey, quiz, poll, calculator, checklist, report.industry(query)role(query)tag(query)
get/option-listsList shared option lists
Operation id: listOptionLists
post/option-listsCreate a shared option list; choice fields reference it with listId
Operation id: createOptionList
get/option-lists/{id}Get an option list
Operation id: getOptionList
patch/option-lists/{id}Rename a list or replace its choices
Operation id: updateOptionList
delete/option-lists/{id}Delete an option list
Operation id: deleteOptionList
get/saved-blocksList saved fields and sections
Operation id: listSavedBlocks
kind(query)
post/saved-blocksSave a field or section to the workspace library
Operation id: saveBlock
delete/saved-blocks/{id}Delete a saved block
Operation id: deleteSavedBlock
get/community-templatesApproved community templates (search with q, filter with category)
Operation id: listCommunityTemplates
q(query)category(query)
post/community-templatesSubmit a form to the public gallery (status starts as pending)
Operation id: submitCommunityTemplate
get/community-templates/mineYour community template submissions with moderation status
Operation id: listOwnCommunityTemplates
get/community-templates/moderationModeration queue (platform administrators only)
Operation id: listCommunityModerationQueue
status(query)
patch/community-templates/{id}Approve or reject a community template (platform administrators only)
Operation id: moderateCommunityTemplate
post/community-templates/{id}/useCreate a form from an approved community template
Operation id: useCommunityTemplate
get/question-bankCurated question library
Operation id: listQuestionBank
category(query)tag(query)q(query)
post/products/importParse a product CSV into product choices
Operation id: importProductsCsv
get/templates/typesList template types with the designs each is offered in
Operation id: listTemplateTypes
category(query)q(query)formType(query) Facet: form, survey, quiz, poll, calculator, checklist, report.industry(query)role(query)tag(query)
get/templates/{id}Get a template with its full definition (id is `typeId--designId`, or a bare typeId for the original look)
Operation id: getTemplate
get/forms/{id}/shareHosted URL, embed URL, QR code URLs and embed snippets
Operation id: getShareLinks
post/forms/{id}/duplicateDuplicate a form, optionally into another workspace
Operation id: duplicateForm
post/media/validateValidate an image or video URL before using it in Media.url
Operation id: validateMedia
Draft
get/forms/{id}/fieldsList draft fields
Operation id: listFields
post/forms/{id}/fieldsAdd a field to the draft
Operation id: addField
post/forms/{id}/fields/reorderReorder draft fields
Operation id: reorderFields
patch/forms/{id}/fields/{fieldId}Update a draft field
Operation id: updateField
fieldId(path, required)
delete/forms/{id}/fields/{fieldId}Delete a draft field
Operation id: deleteField
fieldId(path, required)
get/forms/{id}/sectionsList draft sections
Operation id: listSections
post/forms/{id}/sectionsAdd a section
Operation id: addSection
patch/forms/{id}/sections/{sectionId}Update a section
Operation id: updateSection
sectionId(path, required)
delete/forms/{id}/sections/{sectionId}Delete a section (its fields move to the first remaining section)
Operation id: deleteSection
sectionId(path, required)
get/forms/{id}/logicList logic rules
Operation id: listLogic
post/forms/{id}/logicAdd a logic rule
Operation id: addRule
patch/forms/{id}/logic/{ruleId}Update a logic rule
Operation id: updateRule
ruleId(path, required)
delete/forms/{id}/logic/{ruleId}Delete a logic rule
Operation id: deleteRule
ruleId(path, required)
post/forms/{id}/insert-blockInsert a saved field or section into the draft; clashing ids get a numeric suffix
Operation id: insertSavedBlock
post/forms/{id}/designApply a design to the draft
Operation id: applyDesign
post/forms/{id}/operationsAtomic batch edit of the draft (add/update/move/delete fields, sections, logic, theme, settings...)
Operation id: applyOperations
Submissions
get/forms/{id}/submissionsList submissions
Operation id: listSubmissions
status(query)from(query) Epoch ms or ISO date-timeto(query)q(query) Free text over answersfilters(query) JSON-encoded Conditionsort(query)
get/submissions/{id}Get a submission
Operation id: getSubmission
patch/submissions/{id}Edit answers or status (audited)
Operation id: updateSubmission
delete/submissions/{id}Soft-delete a submission
Operation id: deleteSubmission
post/submissions/bulk-deleteDelete up to 500 submissions
Operation id: bulkDeleteSubmissions
get/submissions/{id}/recordingsRecorded answers with transcript, consent and share link
Operation id: listRecordings
post/submissions/{id}/recordings/{fileId}/sharePublish a recording as a shareable embed; needs the respondent's consent
Operation id: shareRecording
fileId(path, required)
delete/submissions/{id}/recordings/{fileId}/shareRevoke a recording's public link
Operation id: unshareRecording
fileId(path, required)
post/submissions/{id}/transcribeTranscribe the recordings of a response with the workspace AI provider
Operation id: transcribeRecordings
post/forms/{id}/submissions/searchSearch responses with the full filter syntax in a body
Operation id: searchSubmissions
post/submissions/bulk-exportExport many responses
Operation id: bulkExportSubmissions
post/forms/{id}/exportsStart an export of matching responses
Operation id: createExport
get/exports/{id}Poll an export; `url` is a short-lived download link when done
Operation id: getExport
post/forms/{id}/submissions/bulkCreate many responses
Operation id: bulkCreateSubmissions
post/submissions/bulk-updateUpdate many responses
Operation id: bulkUpdateSubmissions
Themes
get/themesList built-in presets and workspace themes
Operation id: listThemes
post/themesCreate a workspace theme
Operation id: createTheme
get/themes/{id}Get a theme
Operation id: getTheme
patch/themes/{id}Update a workspace theme
Operation id: updateTheme
delete/themes/{id}Delete a workspace theme
Operation id: deleteTheme
get/themes/presetsBuilt-in theme presets
Operation id: listThemePresets
get/designsList designs (theme, imagery and layout presets)
Operation id: listDesigns
category(query) Only designs that suit this template category.
Workspace
get/workspaces/{id}Get the current workspace (`id` = current or its id)
Operation id: getWorkspace
patch/workspaces/{id}Set the workspace default theme (preset or saved theme id; null clears it)
Operation id: setWorkspaceDefaultTheme
get/membersList members
Operation id: listMembers
post/membersInvite a member
Operation id: inviteMember
patch/members/{membershipId}Change a member role
Operation id: updateMemberRole
membershipId(path, required)
delete/members/{membershipId}Remove a member
Operation id: removeMember
membershipId(path, required)transferTo(query) User id of a colleague who takes over the member's forms, views, schedules and templates; the member's API keys are revoked. With it the response is 200 with the counts.
get/api-keysList API keys (never returns secrets)
Operation id: listApiKeys
post/api-keysCreate an API key. The full key is returned once.
Operation id: createApiKey
delete/api-keys/{id}Revoke an API key
Operation id: revokeApiKey
get/usageUsage and entitlements for a period (YYYY-MM)
Operation id: getUsage
period(query)
get/audit-eventsList audit events
Operation id: listAuditEvents
action(query)resourceType(query)from(query)to(query)
get/workspacesList workspaces of the organization
Operation id: listWorkspaces
post/workspacesCreate a workspace
Operation id: createWorkspace
get/foldersList folders
Operation id: listFolders
post/foldersCreate a folder
Operation id: createFolder
patch/folders/{id}Rename or move a folder
Operation id: updateFolder
delete/folders/{id}Delete a folder (forms move to the root)
Operation id: deleteFolder
get/domainsList custom domains
Operation id: listDomains
post/domainsAdd a custom domain
Operation id: addDomain
delete/domains/{id}Remove a custom domain
Operation id: removeDomain
post/domains/{id}/verifyRun DNS and TLS checks for a domain now
Operation id: verifyDomain
get/mediaList the media library
Operation id: listMedia
search(query)kind(query)cursor(query)
post/mediaUpload an image, video or font
Operation id: uploadMedia
Experiments
get/experimentsList experiments
Operation id: listExperiments
formId(query)status(query)
post/experimentsCreate a draft experiment (A/B/n, multivariate or question-level)
Operation id: createExperiment
get/experiments/{id}Get an experiment
Operation id: getExperiment
patch/experiments/{id}Start, stop, declare a winner, personalize by segment, or update a draft
Operation id: updateExperiment
delete/experiments/{id}Delete an experiment (not while running)
Operation id: deleteExperiment
get/experiments/{id}/resultsResults: frequentist and Bayesian numbers, sample ratio check, funnels, versions, series, segments
Operation id: getExperimentResults
post/experiments/{id}/conversionsReport a downstream conversion for a user (needs form:write)
Operation id: reportExperimentConversion
post/experiments/{id}/ai/explainPlain-language explanation of the results (statistics only; blocked in Protected data mode)
Operation id: explainExperiment
post/experiments/{id}/ai/suggestSuggest 2-3 variant ideas with hypotheses
Operation id: suggestExperimentVariants
Destinations
get/destinationsList analytics destinations (PostHog, Amplitude, Mixpanel, Segment)
Operation id: listDestinations
post/destinationsCreate an analytics destination. Credentials are encrypted and write-only.
Operation id: createDestination
patch/destinations/{id}Update a destination
Operation id: updateDestination
delete/destinations/{id}Delete a destination
Operation id: deleteDestination
post/destinations/{id}/testSend a test event to a destination
Operation id: testDestination
get/forms/{id}/analytics-settingsGet server-side forwarding settings of a form
Operation id: getFormAnalyticsSettings
put/forms/{id}/analytics-settingsSet server-side forwarding settings of a form
Operation id: putFormAnalyticsSettings
Webhooks
get/webhooksList webhook endpoints
Operation id: listWebhooks
post/webhooksCreate a webhook endpoint. The signing secret is returned once.
Operation id: createWebhook
patch/webhooks/{id}Update a webhook endpoint
Operation id: updateWebhook
delete/webhooks/{id}Delete a webhook endpoint
Operation id: deleteWebhook
get/webhooks/{id}/deliveriesList deliveries
Operation id: listDeliveries
post/webhooks/{id}/deliveries/{deliveryId}/redeliverRedeliver an event
Operation id: redeliver
deliveryId(path, required)
Meta
get/field-typesField type registry
Operation id: listFieldTypes
get/meWho am I: credential, workspace, role, permissions and scopes
Operation id: getMe
AI
post/ai/editAI edit of a form from an instruction
Operation id: aiEditForm
post/ai/translateAI translation of form copy into one locale
Operation id: aiTranslateForm
post/ai/rewriteAI rewrite of question wording (proposal)
Operation id: aiRewriteQuestions
post/ai/suggest-logicAI logic rule suggestions (proposal)
Operation id: aiSuggestLogic
post/ai/formulaAI formula writer for calculated fields
Operation id: aiWriteFormula
post/ai/importGenerate a form from pasted text or an uploaded document or scan
Operation id: aiImportDocument
post/ai/brand-kitTheme from a website, logo or brief
Operation id: aiBrandKit
post/ai/generate-formGenerate a validated form definition from a prompt (optionally save it)
Operation id: generateForm
post/forms/{id}/ai/analyzeAI analysis of responses with caveats
Operation id: analyzeResponses
post/forms/{id}/ai/chatAsk a question about the results
Operation id: chatAboutResults
Integrations
get/integrations/providersList integration providers with credential fields and actions
Operation id: listIntegrationProviders
get/integrations/connectionsList integration connections (no credentials)
Operation id: listConnections
post/integrations/connectionsCreate an API-key or webhook-URL connection
Operation id: createConnection
patch/integrations/connections/{id}Rename a connection or replace credential fields
Operation id: updateConnection
delete/integrations/connections/{id}Delete a connection
Operation id: deleteConnection
get/forms/{id}/quick-integrationsOne-click integration presets for the form: availability, field mapping, matching connections and the values still needed.
Operation id: listQuickIntegrations
post/forms/{id}/quick-integrationsCreate a workflow (trigger submission.completed) from a preset. Connection and form are validated against the workspace.
Operation id: applyQuickIntegration
Workflows
get/workflowsList workflows
Operation id: listWorkflows
formId(query)
post/workflowsCreate a workflow
Operation id: createWorkflow
get/workflows/{id}Get a workflow
Operation id: getWorkflow
patch/workflows/{id}Update a workflow
Operation id: updateWorkflow
delete/workflows/{id}Delete a workflow
Operation id: deleteWorkflow
get/workflows/{id}/executionsRecent runs with step results
Operation id: listWorkflowExecutions
post/workflows/draftDescribe a workflow in plain language and get a draft definition to review. Nothing is saved.
Operation id: draftWorkflow
get/workflows/{id}/step-reportPer-step runs, failures, average duration and assignment statuses
Operation id: workflowStepReport
get/assignmentsTasks that form_request, payment_request and sign steps handed to people
Operation id: listAssignments
workflowId(query)status(query)email(query)limit(query)
post/assignments/{id}/cancelCancel an open assignment
Operation id: cancelAssignment
Sharing
post/forms/{id}/prefill-linkBuild a hosted URL with answers prefilled
Operation id: createPrefillLink
get/forms/{id}/htmlA complete HTML page embedding the live form
Operation id: getFormHtml
get/forms/{id}/share-linksList public results links
Operation id: listShareLinks
id(path, required)
post/forms/{id}/share-linksCreate a signed, revocable, read-only results link (aggregated unless mode is respondents)
Operation id: createShareLink
id(path, required)
delete/share-links/{linkId}Revoke a link immediately
Operation id: revokeShareLink
linkId(path, required)
post/public/shared/{token}Read a shared report (no authentication; send `password` if the link has one)
Operation id: readSharedReport (no authentication)
token(path, required)
OAuth
post/oauth/registerDynamic client registration (RFC 7591)
Operation id: registerOAuthClient (no authentication)
get/oauth/authorizeAuthorization endpoint (code + PKCE S256). Redirects to redirect_uri.
Operation id: oauthAuthorize
response_type(query, required)client_id(query, required)redirect_uri(query, required)scope(query)state(query)code_challenge(query, required)code_challenge_method(query)
post/oauth/authorizeSame endpoint, form-encoded: the consent screen submits here
Operation id: oauthAuthorizeSubmit
post/oauth/tokenExchange a code or refresh token
Operation id: oauthToken (no authentication)
post/oauth/revokeRevoke a token (RFC 7009)
Operation id: oauthRevoke (no authentication)
Public
get/public/forms/{slug}/prefillAnswers of the respondent's earlier submission, limited to the fields mapped in settings.prefillFromPrevious
Operation id: prefillFromPrevious (no authentication)
slug(path, required)key(query, required)
post/public/forms/{slug}/unlockUnlock a password-protected form
Operation id: unlockPublicForm (no authentication)
get/public/forms/{slug}Published definition, resolved theme and availability. Password-protected forms return passwordRequired=true and no `version` until unlocked (see PublicForm).
Operation id: getPublicForm (no authentication)
post/public/forms/{slug}/submissionsRespondent actions: start, save, complete, resume
Operation id: publicSubmit (no authentication)
post/public/forms/{slug}/eventsAnalytics beacon
Operation id: publicEvents (no authentication)
get/public/forms/{slug}/addressAddress suggestions through the provider the deployment configured. Answers `{ available: false }` when none is configured, so forms keep their manual fields. `q` lists suggestions (3+ characters), `id` resolves one.
Operation id: suggestAddress (no authentication)
fieldId(query, required)session(query, required)q(query)id(query)country(query)lang(query)
post/public/forms/{slug}/couponCheck a coupon code. Answers only `{ valid }`; unknown, expired and used-up codes look the same. The discount is applied and limits are enforced at submit.
Operation id: checkCoupon (no authentication)
post/public/forms/{slug}/quoteServer-side order summary (lines, discount, shipping, tax, total) for the answers so far. The same function the checkout charges from.
Operation id: quoteOrder (no authentication)
post/public/forms/{slug}/verifySend a one-time code to an email address or phone number, or check one. The proof returned by `check` goes back with the submission as answers._verify.
Operation id: verifyContact (no authentication)
get/public/forms/{slug}/editThe response behind a signed edit link: the definition it was made with and its current answers
Operation id: getResponseForEdit (no authentication)
token(query, required)
put/public/forms/{slug}/editSave changed answers. Validated like a first submit; every change is kept in the edit history. `proofs` carries verification proofs for a changed verified field.
Operation id: saveResponseEdit (no authentication)
get/public/payments/{submissionId}Payment status of a response. Poll this after the provider redirect: the redirect is not proof of payment, this status is.
Operation id: getPublicPaymentStatus (no authentication)
submissionId(path, required)
post/public/payments/{submissionId}/checkoutRecovery: a saved response whose checkout failed or lapsed gets a fresh (or the same still-open) checkout link. Never creates a second charge for a paid order.
Operation id: recoverCheckout (no authentication)
submissionId(path, required)wallet(query)
post/public/payments/{submissionId}/portalCustomer portal link for a subscription. `token` is the `pt` parameter from the success redirect.
Operation id: createPortalLink (no authentication)
submissionId(path, required)
post/public/payments/{submissionId}/cancel-subscriptionCancel a PayPal subscription paid through this form. `token` is the `pt` parameter from the success redirect.
Operation id: cancelSubscription (no authentication)
submissionId(path, required)
get/public/targetingEnabled targeting rules (trigger, audience, sample rate, recontact days) of published forms in a workspace. Contains no answers. Cached 60 seconds.
Operation id: getTargetingRules (no authentication)
workspace(query, required)
get/public/dashboards/{token}Read a shared dashboard
Operation id: readSharedDashboard
token(path, required)
get/public/forms/{slug}/results-summaryCombined answers shown after submitting
Operation id: getResultsSummary
submissionId(query, required)
post/public/forms/{slug}/access/requestEmail a sign-in link to a respondent of a restricted form
Operation id: requestFormAccessLink (no authentication)
slug(path, required)
get/public/forms/{slug}/access/verifyConsume a sign-in link, set the form cookie and redirect to the form
Operation id: verifyFormAccessLink (no authentication)
slug(path, required)token(query)
get/public/forms/{slug}/availability/{fieldId}Open slots of an appointment field with native availability (weekly hours, buffers, notice, capacity, connected-calendar busy times). Defaults to 14 days, capped at 45.
Operation id: getAvailability (no authentication)
slug(path, required)fieldId(path, required)from(query)to(query)
get/public/bookings/{token}The booking behind the signed link in the confirmation email.
Operation id: getBooking (no authentication)
token(path, required)
get/public/bookings/{token}/slotsSlots the booking can move to (its own seat counts as free).
Operation id: getBookingSlots (no authentication)
token(path, required)from(query)to(query)
post/public/bookings/{token}/cancelCancel the booking from its signed link. Repeating it is harmless.
Operation id: cancelBookingByLink (no authentication)
token(path, required)
post/public/bookings/{token}/rescheduleMove the booking to another open slot; availability and capacity are re-checked.
Operation id: rescheduleBooking (no authentication)
token(path, required)
post/public/payments/{submissionId}/chargeBraintree and Authorize.Net: charge the submission's open payment with a token from the provider's browser SDK (Braintree nonce, or Authorize.Net Accept.js dataDescriptor and dataValue). The amount is the server-priced one; the body cannot change it.
Operation id: chargeWithToken (no authentication)
submissionId(path, required)
get/public/t/{kind}Invitation tracking: open returns a 1x1 GIF, click records the click and redirects (optional `a` answers a one-click question), unsub shows a confirm page.
Operation id: getInvitationTrack (no authentication)
kind(path, required)i(query, required) Invitation id.s(query, required) Signature over the invitation id and kind.a(query)
post/public/t/{kind}Unsubscribe the invitation's contact (one-click List-Unsubscribe-Post target). Only kind=unsub.
Operation id: postInvitationUnsubscribe (no authentication)
kind(path, required)i(query, required) Invitation id.s(query, required) Signature over the invitation id and kind.
Media
get/media/stockSearch stock photos (Unsplash); enabled=false without UNSPLASH_ACCESS_KEY
Operation id: searchStockImages
q(query, required)page(query)
Analytics
get/forms/{id}/analyticsMetrics: views, starts, completions, rates, drop-off, trends, devices, sources
Operation id: getFormMetrics
from(query) epoch ms or ISO date-timeto(query)versionId(query)bucket(query)
get/forms/{id}/analytics/questions/{fieldId}Summary of one question
Operation id: getQuestionSummary
fieldId(path, required)from(query) epoch ms or ISO date-timeto(query)status(query)filters(query) JSON Condition
get/forms/{id}/analytics/funnelStep funnel
Operation id: getFunnel
from(query) epoch ms or ISO date-timeto(query)
get/forms/{id}/analytics/satisfactionNPS / CSAT / CES results
Operation id: getSatisfaction
from(query) epoch ms or ISO date-timeto(query)fieldId(query)
get/forms/{id}/analytics/scoresQuiz and lead score distributions
Operation id: getScores
get/forms/{id}/analytics/significanceCrosstab with significance tests
Operation id: getCrosstabSignificance
rowFieldId(query, required)colFieldId(query, required)alpha(query)filters(query)
get/forms/{id}/compare-rulesList saved compare rules
Operation id: listCompareRules
post/forms/{id}/compare-rulesSave a compare rule
Operation id: createCompareRule
get/compare-rules/{id}Run a saved compare rule
Operation id: runCompareRule
delete/compare-rules/{id}Delete a compare rule
Operation id: deleteCompareRule
get/activityWorkspace activity
Operation id: getActivity
days(query)
Results
get/forms/{id}/triageStatus, assignee and tags for every response, plus assignable people
Operation id: getTriage
id(path, required)
patch/submissions/{id}/triageSet a response's status, assignee or tags
Operation id: updateTriage
id(path, required)
post/submissions/bulk-triageApply a status, assignee or tags to up to 500 responses
Operation id: bulkTriage
get/submissions/{id}/editsEdit history of a response (originals included)
Operation id: listEdits
id(path, required)
post/submissions/{id}/editsCorrect one answer; the original stays recoverable
Operation id: editAnswer
id(path, required)
post/submissions/{id}/edits/{editId}/revertRestore the value that an edit replaced
Operation id: revertEdit
id(path, required)editId(path, required)
get/forms/{id}/viewsSaved views (own and shared)
Operation id: listViews
id(path, required)
post/forms/{id}/viewsSave a view; shared views are visible to the workspace
Operation id: createView
id(path, required)
patch/views/{viewId}Update a saved view
Operation id: updateView
viewId(path, required)
delete/views/{viewId}Delete a saved view
Operation id: deleteView
viewId(path, required)
get/forms/{id}/gradingResponses to grade
Operation id: getGradingQueue
pendingOnly(query)limit(query)
post/submissions/{id}/gradeGive manual points
Operation id: gradeSubmission
post/forms/{id}/grading/releaseRelease graded scores
Operation id: releaseGrades
get/forms/{id}/tag-rulesList tag rules
Operation id: listTagRules
post/forms/{id}/tag-rulesCreate a tag rule
Operation id: createTagRule
post/forms/{id}/tag-rules/applyApply tag rules to existing responses
Operation id: applyTagRules
patch/tag-rules/{id}Update a tag rule
Operation id: updateTagRule
delete/tag-rules/{id}Delete a tag rule
Operation id: deleteTagRule
get/submissions/{id}/commentsList internal comments
Operation id: listComments
post/submissions/{id}/commentsAdd an internal comment
Operation id: addComment
delete/comments/{id}Delete an internal comment
Operation id: deleteComment
Documents
get/forms/{id}/document-templatesList PDF document templates
Operation id: listDocumentTemplates
id(path, required)
post/forms/{id}/document-templatesCreate a branded PDF template with piped answers
Operation id: createDocumentTemplate
id(path, required)
patch/document-templates/{templateId}Update a template
Operation id: updateDocumentTemplate
templateId(path, required)
delete/document-templates/{templateId}Delete a template
Operation id: deleteDocumentTemplate
templateId(path, required)
get/submissions/{id}/documentDownload a response as a PDF
Operation id: downloadSubmissionDocument
id(path, required)templateId(query)sensitive(query) 1 to include sensitive answers (workspace admins only)
post/submissions/{id}/document/emailEmail a signed link (7 days) to the PDF
Operation id: emailSubmissionDocument
id(path, required)
Exports
get/forms/{id}/export-schedulesList scheduled exports
Operation id: listExportSchedules
id(path, required)
post/forms/{id}/export-schedulesSchedule a recurring export (cron, csv/json/xlsx/bundle, email link or storage)
Operation id: createExportSchedule
id(path, required)
patch/export-schedules/{scheduleId}Pause, resume or change a schedule
Operation id: updateExportSchedule
scheduleId(path, required)
delete/export-schedules/{scheduleId}Delete a schedule
Operation id: deleteExportSchedule
scheduleId(path, required)
post/export-schedules/{scheduleId}/runQueue a scheduled export now
Operation id: runExportSchedule
scheduleId(path, required)
get/forms/{id}/feed-tokensList BI feed tokens
Operation id: listFeedTokens
post/forms/{id}/feed-tokensCreate a BI feed token
Operation id: createFeedToken
delete/feed-tokens/{id}Revoke a BI feed token
Operation id: revokeFeedToken
post/forms/{id}/importImport responses from CSV or XLSX
Operation id: importResponses
get/forms/{id}/reportWord, PowerPoint, HTML, SPSS or print file
Operation id: getReportFile
format(query, required)filters(query)
Version history
get/forms/{id}/version-historyPublished versions with plain-language summaries, the draft's pending changes and undoable restores
Operation id: getVersionHistory
id(path, required)
get/forms/{id}/versions/compareDescribe in plain language what differs between two versions (or the draft)
Operation id: compareVersions
id(path, required)from(query, required)to(query, required)
post/forms/{id}/versions/{version}/restoreRestore a version as the draft; the previous draft is snapshotted first
Operation id: restoreVersion
id(path, required)version(path, required)
post/forms/{id}/restores/{snapshotId}/undoUndo a restore: bring back the draft as it was
Operation id: undoRestore
id(path, required)snapshotId(path, required)
Portals
get/portalsList portals
Operation id: listPortals
post/portalsCreate a portal: several forms for one audience behind a branded landing page at /p/{slug}
Operation id: createPortal
get/portals/{id}Get a portal
Operation id: getPortal
patch/portals/{id}Update a portal
Operation id: updatePortal
delete/portals/{id}Delete a portal and its invitations
Operation id: deletePortal
post/portals/{id}/invitesEmail personal portal links. The links are returned once.
Operation id: invitePortalPeople
get/portals/{id}/progressForms completed per invited person
Operation id: getPortalProgress
get/public/portals/{slug}Landing-page data of a published portal; t is the personal invite token
Operation id: getPublicPortal (no authentication)
t(query)
Widgets
get/widgetsBuilt-in and registered custom-field widgets
Operation id: listWidgets
post/widgetsRegister a sandboxed widget manifest
Operation id: registerWidget
delete/widgets/{id}Delete a registered widget (id is the registrationId)
Operation id: deleteWidget
Compliance
put/forms/{id}/encryptionEncrypt chosen answers in the respondent's browser with an RSA public key (JWK). Never send a private key.
Operation id: setFormEncryption
delete/forms/{id}/encryptionTurn browser-side encryption off for new responses
Operation id: clearFormEncryption
Approvals
get/approvalsList approval requests (filter: status, mine=true)
Operation id: listApprovals
status(query)mine(query)
get/approvals/{id}Get an approval with stages and full history
Operation id: getApproval
post/approvals/{id}/decisionApprove or reject in app. The signed-in user must be a current-stage approver.
Operation id: decideApproval
post/approvals/{id}/cancelCancel a pending approval and revoke its links
Operation id: cancelApproval
post/approvals/{id}/resendRevoke open links and email fresh ones to approvers who have not answered
Operation id: resendApproval
get/public/approvals/{token}Read an approval via a personal one-time link. Never decides.
Operation id: getApprovalByLink (no authentication)
token(path, required)
post/public/approvals/{token}Decide via a personal one-time link
Operation id: decideApprovalByLink (no authentication)
token(path, required)
Signing
get/signingList signature requests
Operation id: listSigningRequests
post/signingCreate a signature request. Signer links are returned once. Legal validity depends on jurisdiction; no compliance certification is claimed.
Operation id: createSigningRequest
get/signing/{id}Get a request with signers and the audit trail
Operation id: getSigningRequest
post/signing/{id}/voidVoid a pending request and revoke every link
Operation id: voidSigningRequest
get/signing/{id}/verifyRecompute the audit hash chain and document hash (tamper detection)
Operation id: verifySigningRequest
get/signing/{id}/certificateCompletion certificate (PDF), available once every signer has signed
Operation id: getSigningCertificate
get/signing/{id}/finalSigned PDF: original pages, a signature page and the certificate. Built once when the last signer signs; its SHA-256 is in the audit trail (x-content-sha256 header). Not a PAdES or other cryptographic PDF signature.
Operation id: getSigningFinalDocument
get/public/signing/final/{id}Signed PDF for one signer through the signed link emailed on completion
Operation id: getSigningFinalDocumentForSigner (no authentication)
s(query, required)exp(query, required)sig(query, required)
post/signing/{id}/signers/{signerId}/resendIssue a new link for a pending signer; the old link stops working
Operation id: resendSignerLink
signerId(path, required)
post/signing/{id}/signers/{signerId}/revokeRevoke a signer's link
Operation id: revokeSignerLink
signerId(path, required)
get/public/signing/{token}Signer view (records a viewed event). Blocks if the document hash changed.
Operation id: getSigningView (no authentication)
token(path, required)
post/public/signing/{token}Sign or decline (action: sign | decline)
Operation id: submitSigning (no authentication)
token(path, required)
get/public/signing/{token}/documentDownload a file document via the signer link
Operation id: getSigningDocument (no authentication)
token(path, required)
Integration health
get/integrations/healthPer-connection last success, failing step, error, retry state
Operation id: getIntegrationHealth
post/integrations/connections/{id}/testRead-only connection test. Providers that cannot be tested without sending data answer status=unchecked.
Operation id: testConnection
post/integrations/executions/{id}/replayReplay the failed steps of a failed workflow execution. Idempotent per failure state. `warnings` lists steps whose target cannot dedupe.
Operation id: replayExecution
Data sources
get/data-sourcesList data sources (filter: formId)
Operation id: listDataSources
post/data-sourcesCreate a server-side lookup (Airtable, Google Sheets, Notion)
Operation id: createDataSource
patch/data-sources/{id}Replace a data source's configuration
Operation id: updateDataSource
delete/data-sources/{id}Delete a data source
Operation id: deleteDataSource
get/public/forms/{slug}/choices/{fieldId}Choices for a database-backed field (record picker). `q` searches server side over all rows; `cursor` and `limit` page. `origin` is live, cache, stale, fallback or unavailable.
Operation id: getFieldChoices (no authentication)
slug(path, required)fieldId(path, required)q(query)cursor(query) nextCursor from the previous pagelimit(query)
get/public/forms/{slug}/lookup/{sourceId}Prefill from one record by exact key match; only exposed columns are returned
Operation id: lookupRecord (no authentication)
slug(path, required)sourceId(path, required)key(query, required)
Onboarding
get/profile-sourcesList profile sources (secrets are never returned)
Operation id: listProfileSources
post/profile-sourcesCreate a profile source: an HTTPS endpoint signed with an HMAC header, or PostHog person properties
Operation id: createProfileSource
patch/profile-sources/{id}Replace a profile source
Operation id: updateProfileSource
delete/profile-sources/{id}Delete a profile source
Operation id: deleteProfileSource
post/onboarding/decideServer variant of decide for backends: the uid is trusted, no signature needed
Operation id: decideOnboarding
post/onboarding/generateAI: from a description of your app and users, create a draft onboarding form, 2-3 variant drafts with hypotheses and a suggested experiment config. Nothing is published.
Operation id: generateOnboarding
post/onboarding/digestBuild the weekly experiment digest (plain-language results, risks, next test) and optionally send it through notifications
Operation id: weeklyDigest
get/forms/{id}/themesAI themes in open-text answers with counts and example quotes (PII removed), optionally per variant
Operation id: formThemes
fieldId(query)variantId(query)
post/public/onboarding/decideHeadless decide: what should this uid see now? Holdout answers show:false; an excluded visitor (outside traffic or targeting) answers show:true with the original form, untracked. Rate limited per IP and per workspace.
Operation id: decideOnboardingPublic (no authentication)
post/public/forms/{slug}/aiAdaptive AI for a form that opted in: followup (one clarifying question), classify (answer to category) or copy (personalised text). Falls back to the author's static content when AI is off, blocked by protected data mode, lacks consent or fails.
Operation id: adaptiveAi (no authentication)
post/public/forms/{slug}/profileLoad-time profile: typed attributes and prefill from the form's profile lookup, for a signed uid. Never fails the form: an empty profile is returned on error.
Operation id: loadProfile (no authentication)
Journeys
get/journeysList journeys
Operation id: listJourneys
post/journeysCreate a journey: ordered stages with entry conditions
Operation id: createJourney
get/journeys/{id}Get a journey
Operation id: getJourney
patch/journeys/{id}Replace a journey
Operation id: updateJourney
delete/journeys/{id}Delete a journey
Operation id: deleteJourney
post/journeys/{id}/eventsReport a product event for a uid; stage entry conditions read it
Operation id: reportJourneyEvent
get/journeys/{id}/analyticsStage-to-stage conversion: started, completed and conversion from the previous stage, plus distinct uids per event
Operation id: journeyAnalytics
Autopilot
get/autopilotAutopilot settings of an experiment
Operation id: getAutopilot
experimentId(query, required)
put/autopilotTurn autopilot on or off. autoApply stays off unless set, and then works only inside the limits.
Operation id: setAutopilot
get/autopilot/actionsApproval queue and log of autopilot steps
Operation id: listAutopilotActions
experimentId(query)status(query)
post/autopilot/proposeAsk the AI to propose the next variant or retire a losing arm; it lands in the approval queue
Operation id: proposeAutopilotStep
post/autopilot/actions/{id}/approveApprove a pending step; it is applied now (draft variant added to the experiment, or the arm retired)
Operation id: approveAutopilotAction
post/autopilot/actions/{id}/rejectReject a pending step
Operation id: rejectAutopilotAction
Anti-spam
get/captchaWorkspace captcha status. Never returns the secret; `source: env` means the deployment-wide key is used.
Operation id: getCaptcha
put/captchaSet the workspace captcha provider and keys (the secret is stored encrypted and is write-only)
Operation id: setCaptcha
delete/captchaRemove the workspace captcha keys
Operation id: clearCaptcha
post/submissions/{id}/spamFile a response as spam. It is excluded from results and does not fire completion events.
Operation id: markSubmissionSpam
post/submissions/{id}/restoreSpam to completed. The completed event, webhooks and notifications fire now.
Operation id: restoreSubmission
Invitations
get/forms/{id}/invitationsList invitations (token hashes are never returned)
Operation id: listInvitations
post/forms/{id}/invitationsCreate up to 500 single-use or reusable invitation links. Each token and link is returned once; only a hash is stored.
Operation id: createInvitations
delete/forms/{id}/invitations/{invitationId}Revoke an invitation
Operation id: revokeInvitation
invitationId(path, required)
Contacts
get/contactsList contacts (filter by q, tag, listId)
Operation id: listContacts
q(query) Search email, name, phonetag(query) Only contacts with this taglistId(query) Only members of this listoffset(query) Skip this many
post/contactsCreate a contact, or update the one with the same email
Operation id: createContact
post/contacts/importImport contacts from CSV text (header: email, phone, name, language, tags, other columns become attributes) or an array, optionally into a list
Operation id: importContacts
get/contacts/{id}Contact profile: lists, invitations and linked responses
Operation id: getContact
patch/contacts/{id}Update a contact, including channel opt-outs
Operation id: updateContact
delete/contacts/{id}Delete a contact and its list memberships
Operation id: deleteContact
get/contact-listsList contact lists with member counts
Operation id: listContactLists
post/contact-listsCreate a contact list
Operation id: createContactList
delete/contact-lists/{id}Delete a list (contacts stay)
Operation id: deleteContactList
post/contact-lists/{id}/membersAdd and/or remove list members by contact id, or add every contact with a tag
Operation id: changeContactListMembers
Distribution
get/forms/{id}/distributionsScheduled, recurring and finished sends of this form
Operation id: listDistributions
post/forms/{id}/distributionsSend the form to a contact list now, later, or on a cadence. Opted-out contacts are skipped; the queue rate limits sending.
Operation id: createDistribution
delete/distributions/{id}Cancel a scheduled or recurring send
Operation id: cancelDistribution
post/forms/{id}/manual-responseEnter a response on someone's behalf; validated like a public one and marked manual
Operation id: createManualResponse
Payments
get/forms/{id}/payment-settingsTax, shipping and subscription rules for a form
Operation id: getPaymentSettings
put/forms/{id}/payment-settingsReplace the form's tax, shipping and subscription rules
Operation id: setPaymentSettings
get/paymentsList payments reconciled against responses. `flagged` returns only mismatches (paid without a response, amount differences, missing webhooks).
Operation id: listPayments
status(query)formId(query)flagged(query)before(query) Created before this epoch mslimit(query)
post/payments/{id}/refundRefund a paid one-time payment through the workspace's own provider account. `confirmAmountMinor` must equal the refund amount so a stale screen cannot refund a different sum. Subscription charges are refunded in the provider dashboard.
Operation id: refundPayment
post/payments/{id}/syncAsk the provider for the payment's current state and repair what a missed webhook left behind. Never lowers a confirmed status.
Operation id: syncPayment
get/payments/connectionsPayment provider connections of the workspace. Credentials are never returned.
Operation id: listPaymentConnections
post/payments/connectionsConnect the workspace's own Stripe or PayPal account. Credentials are verified with the provider, stored encrypted and never returned. Register the returned `webhookUrl` and `webhookEvents` in the provider dashboard, then send the Stripe signing secret with kind `stripe_webhook_secret`.
Operation id: connectPayments
post/payments/connections/stripe/authorizeStripe Connect OAuth URL for a signed-in owner to open. Only works when the instance operator configured Stripe Connect.
Operation id: stripeConnectAuthorize
delete/payments/connections/{id}Disconnect a payment account
Operation id: disconnectPayments
Dashboards
get/dashboardsList dashboards
Operation id: listDashboards
post/dashboardsCreate a dashboard
Operation id: createDashboard
get/dashboards/{id}Get a dashboard
Operation id: getDashboard
patch/dashboards/{id}Update a dashboard
Operation id: updateDashboard
delete/dashboards/{id}Delete a dashboard
Operation id: deleteDashboard
get/dashboards/{id}/dataDashboard widgets with data
Operation id: getDashboardData
post/dashboards/{id}/shareTurn the public link on or off
Operation id: shareDashboard
Access and admin
get/forms/{id}/accessGet a form's audience rules
Operation id: getFormAccess
put/forms/{id}/accessSet who can open and answer a form
Operation id: setFormAccess
get/forms/{id}/tagsGet a form's tags
Operation id: getFormTags
put/forms/{id}/tagsReplace a form's tags
Operation id: setFormTags
get/tagsList form tags with counts
Operation id: listTags
post/forms/{id}/moveMove a form to another workspace of the organization
Operation id: moveForm
get/workspace-templatesList team templates
Operation id: listWorkspaceTemplates
post/workspace-templatesSave a form as a team template
Operation id: saveWorkspaceTemplate
get/workspace-templates/{id}Get a team template
Operation id: getWorkspaceTemplate
patch/workspace-templates/{id}Update a team template
Operation id: updateWorkspaceTemplate
delete/workspace-templates/{id}Delete a team template
Operation id: deleteWorkspaceTemplate
post/workspace-templates/{id}/useCreate a form from a team template
Operation id: useWorkspaceTemplate
get/org/securityGet organization security settings
Operation id: getOrgSecurity
put/org/securityUpdate 2FA enforcement, idle timeout and IP lists
Operation id: updateOrgSecurity
get/org/brand-kitGet the organization brand kit
Operation id: getBrandKit
put/org/brand-kitSet the organization brand kit
Operation id: setBrandKit
get/org/domain-joinGet domain-enforced join settings
Operation id: getDomainJoin
patch/org/domain-joinUpdate domain-enforced join settings
Operation id: updateDomainJoin
post/org/domain-join/domainsClaim a join domain
Operation id: addJoinDomain
delete/org/domain-join/domainsRemove a join domain
Operation id: removeJoinDomain
domain(query)
post/org/domain-join/domains/verifyVerify a join domain by DNS TXT record
Operation id: verifyJoinDomain
get/org/join-requestsList join requests
Operation id: listJoinRequests
status(query)
post/org/join-requests/{id}Approve or reject a join request
Operation id: decideJoinRequest
get/org/rolesList custom roles
Operation id: listCustomRoles
post/org/rolesCreate a custom role
Operation id: createCustomRole
patch/org/roles/{id}Update a custom role
Operation id: updateCustomRole
delete/org/roles/{id}Delete a custom role
Operation id: deleteCustomRole
put/org/members/{membershipId}/accessAssign a custom role or make a member a guest
Operation id: setMemberAccess
membershipId(path, required)
get/org/groupsList user groups
Operation id: listUserGroups
post/org/groupsCreate a user group
Operation id: createUserGroup
patch/org/groups/{id}Rename a user group
Operation id: renameUserGroup
delete/org/groups/{id}Delete a user group
Operation id: deleteUserGroup
put/org/groups/{id}/membersReplace a group's members
Operation id: setGroupMembers
get/org/grantsList access grants
Operation id: listAccessGrants
workspaceId(query)principalId(query)
post/org/grantsGrant a user or group access to a folder, form or view
Operation id: createAccessGrant
delete/org/grants/{id}Remove an access grant
Operation id: deleteAccessGrant
get/org/email-logEmail delivery log
Operation id: listEmailLog
event(query)email(query)cursor(query)limit(query)
put/org/partnerEnable or disable partner provisioning (platform administrators)
Operation id: setPartnerStatus
get/org/partner/organizationsList sub-organizations
Operation id: listPartnerOrganizations
post/org/partner/organizationsCreate a sub-organization
Operation id: createPartnerOrganization
delete/org/partner/organizations/{id}Delete a sub-organization
Operation id: deletePartnerOrganization
post/org/partner/organizations/{id}/workspacesCreate a workspace in a sub-organization
Operation id: createPartnerWorkspace
get/org/partner/organizations/{id}/keysList a sub-organization workspace's API keys
Operation id: listPartnerKeys
workspaceId(query)
post/org/partner/organizations/{id}/keysIssue a scoped API key (returned once)
Operation id: issuePartnerKey
delete/org/partner/organizations/{id}/keys/{keyId}Revoke a sub-organization API key
Operation id: revokePartnerKey
keyId(path, required)workspaceId(query)
Scheduling
get/forms/{id}/bookingsBookings made through the form's appointment fields, newest slot first.
Operation id: listBookings
status(query)limit(query)
post/bookings/{id}/cancelCancel a booking: frees the seat and emails the respondent a calendar cancellation.
Operation id: cancelBooking