List forms
Authorization
ApiKeyAuth API key from Settings → API Keys.
In: header
Query Parameters
Filter by publish state. Any value other than draft or published returns 422.
Value in
- "draft"
- "published"
1–100. Defaults to 20.
The next_cursor from the previous page.
Response Body
application/json
application/json
application/json
curl -X GET "https://example.com/api/v1/forms"{ "forms": [ { "id": "string", "self": "http://example.com", "title": "string", "status": "draft", "version": 0, "public_url": "http://example.com", "embed_url": "http://example.com", "accepting_submissions": true, "closed": true, "closed_reason": "manual", "closed_message": "string", "archived": true, "captcha": true, "submission_count": 0, "fields": [ { "key": "string", "type": "string", "label": "string", "required": true, "description": "string", "placeholder": "string", "options": [ { "value": "string", "label": "string" } ], "editable": true } ], "heading": "string", "description": "string", "appearance": { "background": "string", "surface": "string", "card": "card" }, "submit_label": "string", "sender_name": "string", "notifications": { "emails": [ "user@example.com" ], "reply_to_field": "string", "include_document_link": true }, "respondent_confirmation": { "email_field": "string", "subject": "string", "message": "string", "include_document": true, "include_answers": true, "reply_to": "user@example.com" }, "limits": { "close_at": "2019-08-24T14:15:22Z", "max_submissions": 1, "one_submission_per_device": true }, "after_submit": { "action": "show_page", "redirect_url": "http://example.com" }, "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z" } ], "next_cursor": "string"}Sign an on-demand URL POST
Generates a signed URL that renders a template on first request and serves from CDN forever after. The URL is HMAC-signed so it cannot be tampered with. No API key is required to fetch it — paste it into `<img src>`, an email, or a share link. Signing also pre-warms the render so the first visitor hits a cached file, not a cold render. You pay the credit at sign time; visitors pay nothing. The signature is computed over `(url_base, data, format)`. Two calls with the same data return the same signed URL and hit the same cache. Changing any field in `data` produces a new URL and a fresh render. **Before signing**, the template must have a `url_base` — generate one with `POST /api/v1/templates/{id}/url_base`.
Create a form POST
Creates a form as a **draft**. Nothing is reachable by respondents until you call publish. You choose each field's `key`, and that key is what you will receive back in webhooks and in the submissions endpoint. Keys must match `[a-z][a-z0-9_]*` and be unique within the form. Design — theme, layout, logic, multi-page flow — belongs in the dashboard builder. This endpoint provisions the questions; editing the look of a form afterwards never disturbs them.