FlowForm API v1 Reference
Canonical reference for the currently implemented Flask v1 API.
Base URL
Section titled “Base URL”- API base:
/api/v1 - Request content type:
application/jsonfor body-based endpoints - Timestamp format: ISO-8601 datetime strings
- Versioning: path-based (
/api/v1) - Mounted prefixes:
/api/v1/health/api/v1/auth/api/v1/public/api/v1/projects
- Health endpoints currently resolve under
/api/v1/health/health/...because the health blueprint also defines its own/healthprefix. project_refaccepts either a numeric project ID or a project slug.
Authentication
Section titled “Authentication”require_auth: endpoint requires an authenticated user.optional_auth: endpoint accepts both authenticated and unauthenticated callers.- Public/no-auth: endpoint is available without authentication.
Current route behavior:
/api/v1/projects/...:require_authPOST /api/v1/auth/bootstrap-user:require_authGET /api/v1/public/links/resolve:require_authPOST /api/v1/public/submissions/link:require_authPOST /api/v1/public/submissions/slug:optional_authGET /api/v1/public/surveysandGET /api/v1/public/surveys/{public_slug}: public/no-auth
Errors
Section titled “Errors”Errors use JSON responses. The lists under each endpoint are the most obvious/common failures, not an exhaustive catalog.
AppError
Section titled “AppError”Used for domain/service errors.
{ "code": "SURVEY_NOT_FOUND", "message": "Survey 22 was not found in project 9.", "details": {}}Validation Error
Section titled “Validation Error”Returned when request parsing or model validation fails.
{ "code": "VALIDATION_ERROR", "message": "Request validation failed.", "errors": [ { "field": "page_size", "message": "Input should be less than or equal to 100", "type": "less_than_equal" } ]}HTTP Exception
Section titled “HTTP Exception”Used for framework-level HTTP parsing or request-shape failures.
{ "code": "HTTP_415", "message": "Request body must be JSON"}Auth Error
Section titled “Auth Error”Used for authentication failures.
{ "code": "AUTHORIZATION_HEADER_MISSING", "message": "Authorization header is expected", "details": {}}Internal Server Error
Section titled “Internal Server Error”{ "code": "INTERNAL_SERVER_ERROR", "message": "An unexpected error occurred."}Integrity Fallback
Section titled “Integrity Fallback”Unhandled database integrity errors are normalized to:
{ "code": "UNHANDLED_INTEGRITY_ERROR", "message": "A database integrity error occurred."}HTTP status: 409 Conflict
Shared Schemas
Section titled “Shared Schemas”Response Shapes
Section titled “Response Shapes”ProjectOut
idnameslugcreated_by_user_idcreated_at
SurveyOut
idproject_idtitlevisibilitypublic_slugdefault_response_store_idpublished_version_idcreated_by_user_idcreated_atupdated_at
SurveyVersionOut
idsurvey_idversion_numberstatuscompiled_schemapublished_atcreated_by_user_idcreated_atupdated_at
QuestionOut
idsurvey_version_idquestion_keyquestion_schemacreated_atupdated_at
RuleOut
idsurvey_version_idrule_keyrule_schemacreated_atupdated_at
ScoringRuleOut
idsurvey_version_idscoring_keyscoring_schemacreated_atupdated_at
PublicLinkOut
idsurvey_idtoken_prefixis_activeassigned_emailexpires_atcreated_at
CoreSubmissionOut
idproject_idsurvey_idsurvey_version_idresponse_store_idsubmission_channelsubmitted_by_user_idsurvey_link_idsubmitteris_anonymousstatusstarted_atsubmitted_atcreated_at
SubmitterOut
idemaildisplay_name
AnswerOut
idquestion_keyanswer_familyanswer_valuecreated_at
LinkedSubmissionOut
core:CoreSubmissionOutanswers:AnswerOut[]
Common Request Shapes
Section titled “Common Request Shapes”CreateProjectRequest
name: stringslug: string
UpdateProjectRequest
name?: stringslug?: string
CreateSurveyRequest
title: stringvisibility: "private" | "link_only" | "public"public_slug?: stringdefault_response_store_id?: integer
Rules:
public_slugis required whenvisibility = "public"public_slugis forbidden unlessvisibility = "public"
UpdateSurveyRequest
title?: stringvisibility?: "private" | "link_only" | "public"public_slug?: stringdefault_response_store_id?: integer
CreatePublicLinkRequest
assigned_email?: stringexpires_at?: datetime
UpdatePublicLinkRequest
is_active?: booleanassigned_email?: stringexpires_at?: datetime
SlugSubmissionRequest
public_slug: stringsurvey_version_id: integerstarted_at?: datetimesubmitted_at?: datetimeanswers: AnswerIn[]metadata?: object
LinkSubmissionRequest
token: stringsurvey_version_id: integerstarted_at?: datetimesubmitted_at?: datetimeanswers: AnswerIn[]metadata?: object
ListPublicSurveysRequest
page?: integerpage_size?: integer
ResolveTokenRequest
token: string
ListSubmissionsRequest
survey_id?: integerstatus?: "pending" | "stored" | "failed"submission_channel?: "link" | "slug" | "system"page?: integerpage_size?: integer
GetSubmissionRequest
include_answers?: booleanresolve_identity?: boolean
Minimal Polymorphic Payload Examples
Section titled “Minimal Polymorphic Payload Examples”Question payloads are discriminated by question_schema.family.
{ "question_key": "email", "question_schema": { "family": "field", "label": "Email", "schema": { "field_type": "email" }, "ui": {} }}Rule payloads use a condition object and one or more effects.
{ "rule_key": "show_followup", "rule_schema": { "target": "followup_question", "sort_order": 0, "condition": { "fact": "answers.email_opt_in", "operator": "equals", "value": true }, "effects": { "visible": true } }}Scoring payloads are discriminated by scoring_schema.strategy.
{ "scoring_key": "satisfaction_score", "scoring_schema": { "target": "satisfaction_rating", "bucket": "overall", "strategy": "rating_direct", "config": { "multiplier": 1 } }}Answer payloads are discriminated by answer_family.
{ "question_key": "satisfaction_rating", "answer_family": "rating", "answer_value": { "value": 8 }}Endpoints
Section titled “Endpoints”Health
Section titled “Health”GET /api/v1/health/health/
Section titled “GET /api/v1/health/health/”- Purpose: simple liveness check.
- Auth: public/no-auth.
- Path/query params: none.
- Request shape: none.
- Success responses:
200 OK:{ "message": "Service is healthy", "data": { "timestamp": "<datetime>" } }
- Obvious errors:
500 INTERNAL_SERVER_ERROR
GET /api/v1/health/health/ready
Section titled “GET /api/v1/health/health/ready”- Purpose: readiness check including database connectivity.
- Auth: public/no-auth.
- Path/query params: none.
- Request shape: none.
- Success responses:
200 OK:{ "message": "Service is ready", "data": { "timestamp": "<datetime>" } }503 Service Unavailable:{ "message": "Database connectivity Failed: ...", "data": { "timestamp": "<datetime>" } }
- Obvious errors:
500 INTERNAL_SERVER_ERROR
POST /api/v1/auth/bootstrap-user
Section titled “POST /api/v1/auth/bootstrap-user”- Purpose: create or confirm the currently authenticated user in the local database.
- Auth:
require_auth. - Path/query params: none.
- Request shape:
id_token: string
- Success responses:
200 OK:BootstrapUserOut201 Created:BootstrapUserOut
- Response shape:
created: booleanuser: { id, auth0_user_id, email, display_name }
- Obvious errors:
401auth required422 VALIDATION_ERROR409 UNHANDLED_INTEGRITY_ERROR
Public
Section titled “Public”GET /api/v1/public/surveys
Section titled “GET /api/v1/public/surveys”- Purpose: list publicly browsable surveys.
- Auth: public/no-auth.
- Path/query params:
page?: integerpage_size?: integer
- Request shape: none.
- Success responses:
200 OK:PaginatedPublicSurveysOut
- Response shape:
items: SurveyOut[]total: integerpage: integerpage_size: integer
- Obvious errors:
422 VALIDATION_ERROR
GET /api/v1/public/surveys/{public_slug}
Section titled “GET /api/v1/public/surveys/{public_slug}”- Purpose: fetch one public survey and its published version.
- Auth: public/no-auth.
- Path/query params:
public_slug: string
- Request shape: none.
- Success responses:
200 OK:PublicSurveyOut
- Response shape:
survey: SurveyOutpublished_version: SurveyVersionOut | null
- Obvious errors:
404survey not found404survey is not publicly accessible
GET /api/v1/public/links/resolve
Section titled “GET /api/v1/public/links/resolve”- Purpose: resolve a link token to the survey and published version it grants access to.
- Auth:
require_auth. - Path/query params:
token: string
- Request shape: none.
- Success responses:
200 OK:ResolveLinkOut
- Response shape:
link: PublicLinkOutsurvey: SurveyOutpublished_version: SurveyVersionOut
- Obvious errors:
401auth required403link assigned to a different user/email404token not found409link inactive, expired, or survey unpublished422 VALIDATION_ERROR
POST /api/v1/public/submissions/slug
Section titled “POST /api/v1/public/submissions/slug”- Purpose: create a submission for a public survey slug; authenticated callers are recorded, unauthenticated callers become anonymous submitters.
- Auth:
optional_auth. - Path/query params: none.
- Request shape:
public_slugsurvey_version_idstarted_at?submitted_at?answersmetadata?
- Minimal example:
{ "public_slug": "customer-intake", "survey_version_id": 3, "started_at": "2026-04-13T08:00:00Z", "submitted_at": "2026-04-13T08:01:00Z", "answers": [ { "question_key": "satisfaction_rating", "answer_family": "rating", "answer_value": { "value": 8 } } ], "metadata": {}}- Success responses:
201 Created:LinkedSubmissionOut
- Obvious errors:
404public survey not found409survey version not publishable or does not match the public survey422 VALIDATION_ERROR
POST /api/v1/public/submissions/link
Section titled “POST /api/v1/public/submissions/link”- Purpose: create a submission using an authenticated survey link token.
- Auth:
require_auth. - Path/query params: none.
- Request shape:
tokensurvey_version_idstarted_at?submitted_at?answersmetadata?
- Success responses:
201 Created:LinkedSubmissionOut
- Obvious errors:
401auth required403link assigned to a different user/email404token not found409link inactive, expired, or survey unpublished422 VALIDATION_ERROR
Projects
Section titled “Projects”GET /api/v1/projects
Section titled “GET /api/v1/projects”- Purpose: list projects visible to the authenticated actor.
- Auth:
require_auth. - Path/query params: none.
- Request shape: none.
- Success responses:
200 OK:ProjectOut[]
- Obvious errors:
401auth required
POST /api/v1/projects
Section titled “POST /api/v1/projects”- Purpose: create a project.
- Auth:
require_auth. - Path/query params: none.
- Request shape:
nameslug
- Success responses:
201 Created:ProjectOut
- Obvious errors:
401auth required409duplicate slug422 VALIDATION_ERROR
GET /api/v1/projects/{project_ref}
Section titled “GET /api/v1/projects/{project_ref}”- Purpose: fetch one project by numeric ID or slug.
- Auth:
require_auth. - Path/query params:
project_ref: string | integer
- Request shape: none.
- Success responses:
200 OK:ProjectOut
- Obvious errors:
401auth required404project not found403access denied
PATCH /api/v1/projects/{project_ref}
Section titled “PATCH /api/v1/projects/{project_ref}”- Purpose: partially update a project.
- Auth:
require_auth. - Path/query params:
project_ref: string | integer
- Request shape:
name?slug?
- Success responses:
200 OK:ProjectOut
- Obvious errors:
401auth required404project not found409duplicate slug422 VALIDATION_ERROR
DELETE /api/v1/projects/{project_ref}
Section titled “DELETE /api/v1/projects/{project_ref}”- Purpose: delete a project.
- Auth:
require_auth. - Path/query params:
project_ref: string | integer
- Request shape: none.
- Success responses:
200 OK:{ "message": "Project deleted" }
- Obvious errors:
401auth required404project not found403access denied
Surveys
Section titled “Surveys”GET /api/v1/projects/{project_ref}/surveys
Section titled “GET /api/v1/projects/{project_ref}/surveys”- Purpose: list surveys in a project.
- Auth:
require_auth. - Path/query params:
project_ref: string | integer
- Request shape: none.
- Success responses:
200 OK:SurveyOut[]
- Obvious errors:
401auth required404project not found
POST /api/v1/projects/{project_ref}/surveys
Section titled “POST /api/v1/projects/{project_ref}/surveys”- Purpose: create a survey in a project.
- Auth:
require_auth. - Path/query params:
project_ref: string | integer
- Request shape:
titlevisibilitypublic_slug?default_response_store_id?
- Success responses:
201 Created:SurveyOut
- Obvious errors:
401auth required404project not found409duplicate public slug or invalid survey state422 VALIDATION_ERROR
GET /api/v1/projects/{project_ref}/surveys/{survey_id}
Section titled “GET /api/v1/projects/{project_ref}/surveys/{survey_id}”- Purpose: fetch one survey in a project.
- Auth:
require_auth. - Path/query params:
project_ref: string | integersurvey_id: integer
- Request shape: none.
- Success responses:
200 OK:SurveyOut
- Obvious errors:
401auth required404project or survey not found
PATCH /api/v1/projects/{project_ref}/surveys/{survey_id}
Section titled “PATCH /api/v1/projects/{project_ref}/surveys/{survey_id}”- Purpose: partially update a survey.
- Auth:
require_auth. - Path/query params:
project_ref: string | integersurvey_id: integer
- Request shape:
title?visibility?public_slug?default_response_store_id?
- Success responses:
200 OK:SurveyOut
- Obvious errors:
401auth required404project or survey not found409duplicate public slug or invalid state transition422 VALIDATION_ERROR
DELETE /api/v1/projects/{project_ref}/surveys/{survey_id}
Section titled “DELETE /api/v1/projects/{project_ref}/surveys/{survey_id}”- Purpose: delete a survey.
- Auth:
require_auth. - Path/query params:
project_ref: string | integersurvey_id: integer
- Request shape: none.
- Success responses:
200 OK:{ "message": "Survey deleted" }
- Obvious errors:
401auth required404project or survey not found
Versions
Section titled “Versions”GET /api/v1/projects/{project_ref}/surveys/{survey_id}/versions
Section titled “GET /api/v1/projects/{project_ref}/surveys/{survey_id}/versions”- Purpose: list survey versions.
- Auth:
require_auth. - Path/query params:
project_refsurvey_id
- Request shape: none.
- Success responses:
200 OK:SurveyVersionOut[]
- Obvious errors:
401auth required404project or survey not found
POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions
Section titled “POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions”- Purpose: create a new survey version.
- Auth:
require_auth. - Path/query params:
project_refsurvey_id
- Request shape: none.
- Success responses:
201 Created:SurveyVersionOut
- Obvious errors:
401auth required404project or survey not found409version lifecycle conflict
GET /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}
Section titled “GET /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}”- Purpose: fetch one survey version.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_number
- Request shape: none.
- Success responses:
200 OK:SurveyVersionOut
- Obvious errors:
401auth required404project, survey, or version not found
POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/copy-to-draft
Section titled “POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/copy-to-draft”- Purpose: copy an existing version into a new draft version.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_number
- Request shape: none.
- Success responses:
201 Created:SurveyVersionOut
- Obvious errors:
401auth required404project, survey, or version not found409version lifecycle conflict
POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/publish
Section titled “POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/publish”- Purpose: publish a version.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_number
- Request shape: none.
- Success responses:
200 OK:SurveyVersionOut
- Obvious errors:
401auth required404project, survey, or version not found409invalid publish transition
POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/archive
Section titled “POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/archive”- Purpose: archive a version.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_number
- Request shape: none.
- Success responses:
200 OK:SurveyVersionOut
- Obvious errors:
401auth required404project, survey, or version not found409invalid archive transition
Content
Section titled “Content”GET /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/questions
Section titled “GET /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/questions”- Purpose: list questions for a survey version.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_number
- Request shape: none.
- Success responses:
200 OK:QuestionOut[]
- Obvious errors:
401auth required404project, survey, or version not found
POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/questions
Section titled “POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/questions”- Purpose: create a question for a survey version.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_number
- Request shape:
question_keyquestion_schema
- Success responses:
201 Created:QuestionOut
- Obvious errors:
401auth required404project, survey, or version not found409duplicate question key or draft-state conflict422 VALIDATION_ERROR
PATCH /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/questions/{question_id}
Section titled “PATCH /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/questions/{question_id}”- Purpose: partially update a question.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_numberquestion_id
- Request shape:
question_key?question_schema?
- Success responses:
200 OK:QuestionOut
- Obvious errors:
401auth required404question or parent resources not found409duplicate key or non-draft version422 VALIDATION_ERROR
DELETE /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/questions/{question_id}
Section titled “DELETE /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/questions/{question_id}”- Purpose: delete a question.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_numberquestion_id
- Request shape: none.
- Success responses:
200 OK:{ "message": "Question deleted" }
- Obvious errors:
401auth required404question or parent resources not found409non-draft version
GET /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/rules
Section titled “GET /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/rules”- Purpose: list rules for a survey version.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_number
- Request shape: none.
- Success responses:
200 OK:RuleOut[]
- Obvious errors:
401auth required404project, survey, or version not found
POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/rules
Section titled “POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/rules”- Purpose: create a rule for a survey version.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_number
- Request shape:
rule_keyrule_schema
- Success responses:
201 Created:RuleOut
- Obvious errors:
401auth required404project, survey, or version not found409duplicate rule key or non-draft version422 VALIDATION_ERROR
PATCH /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/rules/{rule_id}
Section titled “PATCH /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/rules/{rule_id}”- Purpose: partially update a rule.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_numberrule_id
- Request shape:
rule_key?rule_schema?
- Success responses:
200 OK:RuleOut
- Obvious errors:
401auth required404rule or parent resources not found409duplicate key or non-draft version422 VALIDATION_ERROR
DELETE /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/rules/{rule_id}
Section titled “DELETE /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/rules/{rule_id}”- Purpose: delete a rule.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_numberrule_id
- Request shape: none.
- Success responses:
200 OK:{ "message": "Rule deleted" }
- Obvious errors:
401auth required404rule or parent resources not found409non-draft version
GET /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/scoring-rules
Section titled “GET /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/scoring-rules”- Purpose: list scoring rules for a survey version.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_number
- Request shape: none.
- Success responses:
200 OK:ScoringRuleOut[]
- Obvious errors:
401auth required404project, survey, or version not found
POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/scoring-rules
Section titled “POST /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/scoring-rules”- Purpose: create a scoring rule for a survey version.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_number
- Request shape:
scoring_keyscoring_schema
- Success responses:
201 Created:ScoringRuleOut
- Obvious errors:
401auth required404project, survey, or version not found409duplicate scoring key or non-draft version422 VALIDATION_ERROR
PATCH /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/scoring-rules/{scoring_rule_id}
Section titled “PATCH /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/scoring-rules/{scoring_rule_id}”- Purpose: partially update a scoring rule.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_numberscoring_rule_id
- Request shape:
scoring_key?scoring_schema?
- Success responses:
200 OK:ScoringRuleOut
- Obvious errors:
401auth required404scoring rule or parent resources not found409duplicate key or non-draft version422 VALIDATION_ERROR
DELETE /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/scoring-rules/{scoring_rule_id}
Section titled “DELETE /api/v1/projects/{project_ref}/surveys/{survey_id}/versions/{version_number}/scoring-rules/{scoring_rule_id}”- Purpose: delete a scoring rule.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idversion_numberscoring_rule_id
- Request shape: none.
- Success responses:
200 OK:{ "message": "Scoring rule deleted" }
- Obvious errors:
401auth required404scoring rule or parent resources not found409non-draft version
GET /api/v1/projects/{project_ref}/surveys/{survey_id}/links
Section titled “GET /api/v1/projects/{project_ref}/surveys/{survey_id}/links”- Purpose: list links for a survey.
- Auth:
require_auth. - Path/query params:
project_refsurvey_id
- Request shape: none.
- Success responses:
200 OK:{ "links": PublicLinkOut[] }
- Obvious errors:
401auth required404project or survey not found
POST /api/v1/projects/{project_ref}/surveys/{survey_id}/links
Section titled “POST /api/v1/projects/{project_ref}/surveys/{survey_id}/links”- Purpose: create a link for a survey.
- Auth:
require_auth. - Path/query params:
project_refsurvey_id
- Request shape:
assigned_email?expires_at?
- Success responses:
201 Created:CreatePublicLinkOut
- Response shape:
link: PublicLinkOuttoken: stringurl: string
- Obvious errors:
401auth required404project or survey not found409invalid visibility/link assignment combination422 VALIDATION_ERROR
PATCH /api/v1/projects/{project_ref}/surveys/{survey_id}/links/{link_id}
Section titled “PATCH /api/v1/projects/{project_ref}/surveys/{survey_id}/links/{link_id}”- Purpose: partially update a link.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idlink_id
- Request shape:
is_active?assigned_email?expires_at?
- Success responses:
200 OK:PublicLinkOut
- Obvious errors:
401auth required404project, survey, or link not found409invalid visibility/link assignment combination422 VALIDATION_ERROR
DELETE /api/v1/projects/{project_ref}/surveys/{survey_id}/links/{link_id}
Section titled “DELETE /api/v1/projects/{project_ref}/surveys/{survey_id}/links/{link_id}”- Purpose: delete a link.
- Auth:
require_auth. - Path/query params:
project_refsurvey_idlink_id
- Request shape: none.
- Success responses:
200 OK:{ "message": "Link deleted" }
- Obvious errors:
401auth required404project, survey, or link not found
Submissions
Section titled “Submissions”GET /api/v1/projects/{project_ref}/submissions
Section titled “GET /api/v1/projects/{project_ref}/submissions”- Purpose: list submissions for a project.
- Auth:
require_auth. - Path/query params:
project_refsurvey_id?status?submission_channel?page?page_size?
- Request shape: none.
- Success responses:
200 OK:PaginatedSubmissionsOut
- Response shape:
items: CoreSubmissionOut[]total: integerpage: integerpage_size: integer
- Obvious errors:
401auth required404project not found422 VALIDATION_ERROR
GET /api/v1/projects/{project_ref}/submissions/{submission_id}
Section titled “GET /api/v1/projects/{project_ref}/submissions/{submission_id}”- Purpose: fetch one submission and its stored answers.
- Auth:
require_auth. - Path/query params:
project_refsubmission_idinclude_answers?: booleanresolve_identity?: boolean
- Request shape: none.
- Success responses:
200 OK:LinkedSubmissionOut
- Obvious errors:
401auth required404project or submission not found403access denied422 VALIDATION_ERROR