Troubleshooting
If requests fail, run zero doctor check-connector --env-name TYPEFORM_TOKEN or zero doctor check-connector --url https://api.typeform.com/forms --method GET
Authentication
All endpoints require a personal access token passed as a Bearer token:
Authorization: Bearer $TYPEFORM_TOKEN
Token format is tfp_<40-hex>.
Environment Variables
| Variable | Description |
|---|---|
TYPEFORM_TOKEN |
Typeform personal access token (tfp_...) |
Base URL
https://api.typeform.com (EU-data-residency accounts use https://api.eu.typeform.com).
Rate limit: 2 requests/second per account on Create and Responses APIs.
Forms
List Forms
curl -s "https://api.typeform.com/forms" --header "Authorization: Bearer $TYPEFORM_TOKEN"
With pagination and search:
curl -s "https://api.typeform.com/forms?page=1&page_size=25&search=<your-query>" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Retrieve a Form
Replace <form-id>:
curl -s "https://api.typeform.com/forms/<form-id>" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Create a Form
Write to /tmp/typeform_form.json:
{
"title": "<your-form-title>",
"fields": [
{
"title": "What is your name?",
"type": "short_text",
"ref": "name"
},
{
"title": "How would you rate us?",
"type": "rating",
"ref": "rating",
"properties": {
"shape": "star",
"steps": 5
}
}
]
}
curl -s -X POST "https://api.typeform.com/forms" --header "Authorization: Bearer $TYPEFORM_TOKEN" --header "Content-Type: application/json" -d @/tmp/typeform_form.json
Update a Form (Full Replace)
Write the complete form definition to /tmp/typeform_form.json, then replace <form-id>:
curl -s -X PUT "https://api.typeform.com/forms/<form-id>" --header "Authorization: Bearer $TYPEFORM_TOKEN" --header "Content-Type: application/json" -d @/tmp/typeform_form.json
Update a Form (JSON Patch)
Write a JSON Patch array to /tmp/typeform_patch.json:
[
{ "op": "replace", "path": "/title", "value": "<your-new-title>" }
]
curl -s -X PATCH "https://api.typeform.com/forms/<form-id>" --header "Authorization: Bearer $TYPEFORM_TOKEN" --header "Content-Type: application/json" -d @/tmp/typeform_patch.json
Delete a Form
curl -s -X DELETE "https://api.typeform.com/forms/<form-id>" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Retrieve Form Messages (validation text)
curl -s "https://api.typeform.com/forms/<form-id>/messages" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Responses
List Responses
curl -s "https://api.typeform.com/forms/<form-id>/responses" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Useful query parameters:
| Parameter | Description |
|---|---|
page_size |
Max 1000, default 25 |
since / until |
ISO 8601 timestamps |
after / before |
Cursor tokens (exclusive) |
response_type |
completed, partial, or started |
included_response_ids |
Comma-separated response IDs |
query |
Search string matched against answers |
fields |
Comma-separated field refs to include |
sort |
`{field_id},{asc |
Example — only completed responses in the last 7 days:
curl -s "https://api.typeform.com/forms/<form-id>/responses?response_type=completed&since=2026-04-11T00:00:00Z&page_size=100" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Delete Responses
Pass comma-separated response IDs:
curl -s -X DELETE "https://api.typeform.com/forms/<form-id>/responses?included_response_ids=<response-id-1>,<response-id-2>" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Download a File Upload
Replace <form-id>, <response-id>, and <filename> (all returned in the response payload):
curl -s -L "https://api.typeform.com/forms/<form-id>/responses/<response-id>/fields/<field-id>/files/<filename>" --header "Authorization: Bearer $TYPEFORM_TOKEN" -o /tmp/typeform_upload
Webhooks
List Webhooks on a Form
curl -s "https://api.typeform.com/forms/<form-id>/webhooks" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Create or Update a Webhook
Webhooks are addressed by a user-chosen <tag> (string key you pick). A PUT creates or replaces the webhook under that tag.
Write to /tmp/typeform_webhook.json:
{
"url": "<your-callback-url>",
"enabled": true,
"verify_ssl": true,
"secret": "<your-signing-secret>"
}
curl -s -X PUT "https://api.typeform.com/forms/<form-id>/webhooks/<tag>" --header "Authorization: Bearer $TYPEFORM_TOKEN" --header "Content-Type: application/json" -d @/tmp/typeform_webhook.json
Retrieve a Single Webhook
curl -s "https://api.typeform.com/forms/<form-id>/webhooks/<tag>" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Delete a Webhook
curl -s -X DELETE "https://api.typeform.com/forms/<form-id>/webhooks/<tag>" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Workspaces
List Workspaces
curl -s "https://api.typeform.com/workspaces" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Create a Workspace
Write to /tmp/typeform_workspace.json:
{
"name": "<your-workspace-name>"
}
curl -s -X POST "https://api.typeform.com/workspaces" --header "Authorization: Bearer $TYPEFORM_TOKEN" --header "Content-Type: application/json" -d @/tmp/typeform_workspace.json
Themes
List Themes
curl -s "https://api.typeform.com/themes" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Retrieve a Theme
curl -s "https://api.typeform.com/themes/<theme-id>" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Account
curl -s "https://api.typeform.com/me" --header "Authorization: Bearer $TYPEFORM_TOKEN"
Common Field Types
When building forms, these are the values for the type field:
short_text,long_text,email,phone_number,website,numbermultiple_choice,dropdown,picture_choice,yes_no,legalrating,opinion_scale,npsdate,file_upload,payment,matrix,ranking- Layout:
statement,group,welcome_screen,thankyou_screen
Response Codes
| Status | Description |
|---|---|
200 |
Success |
201 |
Created |
204 |
No content (delete success) |
400 |
Bad request / invalid JSON |
401 |
Missing or invalid token |
403 |
Token lacks required scope |
404 |
Form/response/webhook not found |
429 |
Rate limit exceeded (2 req/sec) |
Guidelines
- Scopes matter — personal access tokens only work for actions covered by the scopes they were minted with (
forms:read,forms:write,responses:read,responses:write,webhooks:read,webhooks:write,workspaces:read,workspaces:write,themes:read,themes:write,accounts:read). A 403 usually means the token needs a wider scope. - EU accounts — if a user's workspace is on the EU data residency tier, swap
https://api.typeform.comforhttps://api.eu.typeform.comin every call. - Paginate responses — use
after/beforecursor tokens for datasets above ~1000 responses rather thanpage_sizealone. - Webhook signing — pass a
secretwhen creating a webhook; incoming payloads then carry aTypeform-Signatureheader you should verify on the receiving end.
API Reference
- API docs: https://www.typeform.com/developers/
- Create API: https://www.typeform.com/developers/create/
- Responses API: https://www.typeform.com/developers/responses/
- Webhooks API: https://www.typeform.com/developers/webhooks/
- Scopes: https://www.typeform.com/developers/get-started/scopes/