Skip to content

Forms

A form is a Shout survey, quiz or poll. The API lets you list forms, read a form’s full structure, and create new forms with any of the 19 supported question types in a single call.

Reading requires the forms:read scope; creating requires forms:write.

GET /v1/forms/{id} returns the form with its pages, and each page with its questions:

  • Question text is stored as HTML (that’s how the builder saves it).
  • Page and question ids are integers; the form id is a UUID.
  • status is "active" (live/collecting) or "inactive" (closed). Trashed forms are never returned.
  • Use the question ids to match answers when reading responses.

POST /v1/forms creates a whole form — title, optional description/workspace, and its questions — in one atomic call. On success you get 201 Created, a Location: /v1/forms/{id} header, and the created form in the same shape as a read.

Provide questions either as a flat questions array (single-page shorthand) or as pages, each with its own questions. If both are given, pages wins.

Every question object takes these, regardless of type:

FieldTypeNotes
typestringOne of the type identifiers in the table below. Required.
textstringThe question text (simple HTML allowed).
requiredbooleanWhether an answer is mandatory. Default false.
friendlyIdstringOptional uppercase snake_case id to reference the question in formulas.

19 types are supported. The type identifier is the value you send (and, for most types, the value you get back on read).

typeWhat it isKey fields
choose_oneSingle choice (radio)options (≥2), otherText
dropdownSingle choice as a dropdownoptions (≥2), otherText
choose_anyMultiple choice (checkboxes)options (≥2), otherText, minSelections, maxSelections
multi_dropdownMultiple choice as a dropdownoptions (≥2), otherText, minSelections, maxSelections
likertOpinion scale, shown as buttonsscales ([{text, opposingText}]), scaleStart, scaleEnd
likert_sliderOpinion scale, shown as a sliderscales, scaleStart, scaleEnd
npsNet Promoter Score, 0–10(no extra fields)
binaryYes/No, True/FalsetrueLabel, falseLabel, icon
star_ratingStar ratingmaxStars (default 5, max 10)
textboxFree-text inputrows, inputLimitation
matrixRows rated against a shared scalerowHeadings (≥1), columnHeadings, lastColumnIsNotWeighted
rankingDrag-and-drop orderingrankOptions
contact_detailsContact detail fieldscontactFields ([{field, label, visible}])
dateSingle datedatePlaceholder, collectTime
date_rangeA from/to date rangestartDatePlaceholder, endDatePlaceholder, collectTime
numericNumeric value(created with default numeric formatting)
file_uploadOne or more upload slotsfileUploadSlots (labels, ≥1)
signatureSignature capture(no extra fields)
paymentStripe paymentamount (smallest currency unit, e.g. 1000 = $10.00), currency (ISO 4217), formula

Field details:

  • options — a JSON array of label strings. Choice questions need at least 2.
  • otherText — set it to add a free-text “other” option; omit for none.
  • scales — one or more { "text": "...", "opposingText": "..." } pairs (both ends required), e.g. {"text": "Very poor", "opposingText": "Excellent"}.
  • icon (binary) — thumbs (default), tick_cross, or faces.
  • contactFields[].field — one of: first_name, last_name, company, address_line_1, address_line_2, city, state, zip_code, country, email, phone_number. label is optional; visible defaults to false, so set it to true for fields you want shown.
  • inputLimitation (textbox) — restricts accepted input, e.g. Email or Telephone. Default is unrestricted.

Limits: a form may contain at most 200 questions.

StatusWhen
400 invalid_requestMissing title, an unknown type, an unknown enum value (icon/contact field), or a structurally invalid question (e.g. fewer than 2 options). The message names the problem.
422 unprocessable_entityThe form couldn’t be assigned an owner (no billable user on the tenant).

Forms can be filed under a workspace. GET /v1/workspaces lists them (requires forms:read). Workspaces are small by nature, so the list is returned unpaginated. Use a workspace id when filtering forms (workspace_id) or when creating a form (workspaceId).