Skip to main content
PATCH

Authorizations

next-auth.session-token
string
cookie
required

NextAuth session JWT cookie. Development: often next-auth.session-token. Production (HTTPS): often __Secure-next-auth.session-token. Send the cookie your browser receives after sign-in.

Path Parameters

surveyId
string<cuid2>
required

Survey identifier.

Body

application/json

Patch payload shape. Top-level fields are partial; any provided nested object or array fully replaces that subtree. Omitted top-level fields are preserved.

The server-owned fields GET returns — id, workspaceId, type, createdAt, updatedAt, archivedAt, defaultLanguage and languages[].alias — are accepted and verified, so a survey fetched with GET can be sent straight back. Echoing the value you were given is a no-op; changing one is a 422 read_only_field. visibility, owner and access are accepted the same way, but a changed value is a 422 unsupported_field: visibility changes go through POST /api/v3/surveys/{surveyId}/visibility. A round-tripped updatedAt additionally acts as an optimistic-concurrency precondition, and a stale one is rejected with 409. questions, analytics, styling and scripts remain rejected outright. App surveys (stored type: app) additionally accept distribution and targeting; both are rejected for link surveys, and changing targeting filters requires the Contacts entitlement.

metadata, languages, welcomeCard, blocks, endings, hiddenFields, and variables replace their full top-level value when provided. Missing ids in replaced arrays are deletions. Non-default locale keys in translatable maps must be declared in languages; undeclared locale keys are rejected with unsupported_locale. To remove a language, remove it from both languages and every translatable map that contains that locale key. Use /api/v3/surveys/validate with operation: patch before committing automated or agentic changes.

id
string

Read-only echo. Must match the survey being patched.

workspaceId
string

Read-only echo. A survey cannot be moved between workspaces.

type
enum<string>

Read-only echo. Immutable after creation.

Available options:
link,
app
createdAt
string<date-time>

Read-only echo of the creation timestamp.

updatedAt
string<date-time>

Read-only echo, and an optimistic-concurrency precondition: the write is applied only if the survey has not changed since the read this value came from, and is otherwise a 409.

archivedAt
string<date-time> | null

Read-only echo. Use /archive and /restore to change it.

visibility
enum<string>

Read-only echo. Accepted only unchanged, so a survey fetched with GET can be sent back; any other value is a 422 unsupported_field. Change it with POST /api/v3/surveys/{surveyId}/visibility.

Available options:
restricted,
workspace
owner
object | null

Read-only echo, accepted only unchanged (otherwise 422 unsupported_field).

access
object

Read-only echo, accepted only unchanged (otherwise 422 unsupported_field).

defaultLanguage
string

Read-only echo of the survey default language, in whatever shape GET returned — legacy surveys carry language-only codes, so this is not constrained to LocaleCode.

name
string
Minimum string length: 1
status
enum<string>
Available options:
draft,
inProgress,
paused,
completed
metadata
object

Arbitrary JSON survey context for customer- or operation-specific metadata. v3 preserves arbitrary metadata values as-is. If present, title and description are treated as translatable text maps and returned with real locale-code keys.

languages
object[]

Replaces the survey language configuration. The default language cannot be changed through PATCH; any default: true entry must match the existing default language. Languages referenced by metadata, welcomeCard, blocks, or endings translatable maps must be explicitly declared here, so remove the locale key from those maps as well when intentionally removing a language.

Maximum array length: 50
showLanguageSwitch
boolean | null

Show respondents a language switch on multi-language surveys. null and false both mean off. Omit to keep the stored value.

autoSelectLanguage
boolean | null

Open link and app surveys in the respondent's browser language when it matches an enabled survey language; otherwise the default language is used. null and false both mean off. Omit to keep the stored value.

welcomeCard
object

Optional card shown before the first survey block.

blocks
object[]
Required array length: 1 - 1000 elements
endings
object[]
Maximum array length: 100

Ending reached after the last block or a jump action. type selects the allowed shape; unsupported fields are rejected instead of ignored.

hiddenFields
object

Hidden fields, sometimes called embedded data in other survey products. Field ids are stable public identifiers and may be referenced by logic, recall, quotas, integrations, and response data.

Naming rule for new field ids — the same rule the survey editor applies (ENG-2539): a new id must start with a lowercase letter and then contain only lowercase letters, numbers and underscores (^[a-z][a-z0-9_]*$), and must not take a reserved name. Reserved are the link-survey system params and internal ids — userId, source, suid, end, start, welcomeCard, hidden, verifiedEmail, multiLanguage, embed, verify, suToken, lang, preview, startAt, skipPrefilled, offlineSupport (matched case-insensitively) — and the names of auto-captured system fields, which every survey can already read without declaring them: source, url, country, action, browser, os, deviceType, ipAddress, finished, language, locale, responseId, surveyId, durationSeconds, startedAt, finishedAt, pagePath, pageReferrer, utmSource, utmMedium, utmCampaign, utmTerm, utmContent, screenWidth, screenHeight, viewportWidth, viewportHeight, timezone.

Ids a survey already declares are grandfathered: they always load, and re-sending the survey unchanged never fails validation — only adding such a name as a new field is refused. Deleting a grandfathered field spends the reprieve: once it is gone from the saved survey, the name can no longer be re-added. Note this means re-creating a survey from an exported document can fail with a 400 when the export declares a name the rule refuses; rename the field in the payload before importing. The pattern below describes what stored surveys may hold (the pre-existing lenient charset), not what a new id may look like.

variables
object[]
Maximum array length: 100

Survey variable. Variable ids are stable references used by logic and calculation actions. Variable names are human-readable labels and must be unique within the survey.

distribution
object

App-survey runtime/display settings. Only valid for stored type: app. Replaces the full distribution; omitted scalars reset to their defaults.

Example:
targeting
object

App-survey contact targeting. Only valid for stored app surveys.

customCss
object | null

Survey custom CSS source. Omitted: unchanged. null: clears both fields. An object replaces both fields and needs both keys. Change is judged on normalized source, so echoing the value GET returned is a no-op that needs no plan. Adding or editing needs the Scale plan on Formbricks Cloud (403 custom_css_plan_required); clearing never does. A failed write keeps the saved CSS. Only an addition or edit is processed, so only it counts against the custom CSS budget of 60 per minute per user or API key, shared with custom CSS validation; beyond it the patch is a 429.

Response

Survey updated successfully

data
object
required

The three fields every SurveyListItem and SurveyResource carries, merged into both via allOf. All required, always present.

warnings
object[]

Processing warnings for this write: constructs the processor removed. Additive, returned beside data (never inside it, so data can be sent back unchanged); present only when the write processed custom CSS.

Maximum array length: 50