---
title: "Create a form"
method: POST
path: "/signup-forms"
tags: ["Signup forms"]
---

# Create a form

`POST /signup-forms`

## Request

- Base URL: `https://api.poststack.dev`
- URL: `https://api.poststack.dev/signup-forms`
- Auth: one of:
  - HTTP bearer
  - OAuth 2
    - Authorization code: `https://poststack.dev/oauth/authorize`
    - Token URL: `https://poststack.dev/oauth/token`
- TypeScript: <https://skmtc.dev/poststack/apis/poststack-api/docs/signup-forms/post.ts> (a function with typed inputs; its response is checked against the schema)

## Request body

- CreateSignupFormInput
  - `name` string, required
  - `segment_id` string
  - `topic_id` string
  - `fields` object[], required
    - `name` string, required
    - `type` 'email' | 'text' | 'select', required
    - `required` boolean, required
    - `label` string, required
    - `placeholder` string
    - `options` string[]
  - `success_message` string
  - `redirect_url` string, uri
  - `human_check` object
    - `site_key` string, required
    - `secret` string, required

## Response `201`

Created.

- object
  - `signupForm` SignupForm, required
    - `id` integer, required
    - `publicId` string, required: `sf_…` id.
    - `name` string, required
    - `segmentId` integer, nullable
    - `topicId` integer, nullable
    - `fields` object[], required
    - `styling` object, nullable
    - `successMessage` string, nullable
    - `redirectUrl` string, nullable
    - `humanCheckSiteKey` string, nullable: Public sitekey of the form's HostStack Human Check, or null when off.
    - `humanCheckEnabled` boolean: Whether submissions must pass Human Check. The secret is write-only and never returned.
    - `active` boolean, required
    - `submissionCount` integer
    - `createdAt` string, date-time
    - `updatedAt` string, date-time

## Other responses

- `400`: Validation failed — `error` names each offending field (`field: message`).
- `401`: Missing, malformed or unknown credentials (`WWW-Authenticate: Bearer …` is set).
- `403`: The credential lacks the `signup-forms:manage` scope (body `{ error: "insufficient_scope", required, missing }`), or the team is suspended.
- `404`: Segment or topic not found.
- `429`: Rate limited (30/min). `Retry-After` gives the seconds to wait; `X-RateLimit-*` headers are sent on every response.

## Changes

- **2026-11-12** `0d3971e3a670`: 3 info
  - added the new optional request property `human_check`
  - added the optional property `signupForm/humanCheckEnabled` to the response with the `201` status
  - added the optional property `signupForm/humanCheckSiteKey` to the response with the `201` status
- **2026-09-30** `4dc1e20989c8`: 15 warning
  - added the new `daily_limit_exceeded` enum value to the `anyOf[#/components/schemas/Error]/code` response property for the response status `403`
  - added the new `daily_limit_exceeded` enum value to the `code` response property for the response status `400`
  - added the new `daily_limit_exceeded` enum value to the `code` response property for the response status `401`
  - added the new `daily_limit_exceeded` enum value to the `code` response property for the response status `404`
  - …11 more
- **2026-09-29** `ef5b22b98333`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/poststack/apis/poststack-api/changes/signup-forms/post.md)

---

[API](https://skmtc.dev/poststack/apis/poststack-api.md) - [All operations](https://skmtc.dev/poststack/apis/poststack-api/llms.txt) - [OpenAPI document](https://skmtc.dev/poststack/apis/poststack-api/revisions/0d3971e3a670?raw)
