The Tally API gives developers full programmatic control over forms and submissions. Create forms on the fly, sync responses to your stack, and automate workflows, all for free. Whether you're building a client portal, an internal tool, or an automated pipeline, the API makes it possible without a single click in the UI.

The Tally API is available for free to all Tally users.
API developer docs
The Tally developer docs are your key to a comprehensive understanding of the Tally API and help you start building quickly.
Want to use Tally with your AI assistant? The Tally MCP server lets you build, update, and fetch forms using natural language, no API calls required. It's the fastest way to manage Tally through AI tools like Claude, Cursor, or Claude Code.
API reference basics
- Base URL:
https://api.tally.so
- Authentication: every request needs an
Authorization: Bearer <token>header. Get your API key here.
- Rate limits: 100 requests/minute. Use webhooks instead of polling to avoid hitting this.
- Versioning: the API is versioned by date. Pin a version with the
tally-versionheader (e.g.tally-version: 2025-02-01) so future changes don't break your integration.
- Pagination: Pagination: list endpoints (GET /forms, GET /forms/{formId}/submissions) return paginated results — pass
pageandlimitas request params, and check thehasMoreboolean in the response (alongsidepage,limit, andtotal) before assuming you've got everything.
- Response codes:
Code | Meaning |
200 | Success - The request completed successfully |
400 | Bad Request - The request was malformed or contained invalid parameters |
401 | Unauthorized - Authentication credentials are missing or invalid |
403 | Forbidden - You don’t have permission to access this resource |
404 | Not Found - The requested resource doesn’t exist |
429 | Rate Limited - You’ve exceeded the allowed number of requests |
500 | Server Error - Something went wrong on our end |
API use cases
Wondering what you can create with Tally’s API? Here’s what our developer community has built with early access to the API:
1. Dynamic Form Creation & Customization
- Programmatically create forms
- Duplicate and personalize a form for a new client; to do so fetch an existing form's structure, then create a new one from it:
curl --request POST \ --url https://api.tally.so/forms \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "status": "PUBLISHED", "blocks": [ { "uuid": "<title-block-uuid>", "type": "FORM_TITLE", "payload": { "title": "Client Intake – Acme Co" } }, ...copied from GET /forms/{formId} ] }'
status is required ("PUBLISHED", or "DRAFT"/blank for a draft). There's no name field, the API ignores it. The form's name comes from its first block, which must be a FORM_TITLE block whose payload.title becomes the form name.2. Real-Time Form Updates
- Enable/disable fields based on business rules or time
- Dynamically change field visibility or values
- Auto-update dropdown options from live data sources (e.g. Notion, Airtable, Google Sheets); to do so pull the latest values from your source, then push them into the form's block schema:
# 1. Fetch the full form — you need every block, not just the dropdown curl --request GET \ --url https://api.tally.so/forms/{formId} \ --header 'Authorization: Bearer <token>' # 2. Each dropdown choice is its own DROPDOWN_OPTION block, sharing a # groupUuid with the DROPDOWN block. Update the ones you need: # { "uuid": "<option-uuid>", "type": "DROPDOWN_OPTION", "groupUuid": "<dropdown-group-uuid>", "payload": { "text": "Option A" } } # 3. PATCH back the ENTIRE blocks array — PATCH replaces the whole set, # so any block you leave out gets deleted curl --request PATCH \ --url https://api.tally.so/forms/{formId} \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "blocks": [ ...full blocks array from step 1, with the DROPDOWN_OPTION blocks updated... ] }'
Always GET the form first and PATCH back the complete
blocks array — partial updates will delete any block you don't include. See the Block Schema Reference for the full dropdown-option block shape.3. Data Access & Management
- Filter and sync submissions into external tools (CRMs, dashboards, databases), to do so list new submissions and forward them downstream:
curl --request GET \ --url https://api.tally.so/forms/{formId}/submissions \ --header 'Authorization: Bearer <token>'
Or use a webhook instead of polling — you'll get each submission pushed to your endpoint the moment it's created, without counting against your rate limit.
- Delete submissions programmatically
curl --request DELETE \ --url https://api.tally.so/forms/{formId}/submissions/{submissionId} \ --header 'Authorization: Bearer <token>'
Returns
204 on success. Deleted submissions move to Trash and follow the same recovery window as manual deletion.API Frequently Asked Questions
How do I create an API key in Tally?
Follow the instructions here.
Is the Tally API free?
Yes, the Tally API is free for all Tally users, including the free plan. No paid plan required to get started.
What can I build with the Tally API?
You can programmatically create and manage forms, update fields dynamically, fetch and delete submissions, and sync data with external tools like Notion, Airtable, Google Sheets, or your own database. Developers have used it to build AI agents, automated onboarding flows, client intake systems, and custom form backends.
Can I use the Tally API with Make, n8n, or Zapier?
Yes. The Tally API works great alongside no-code automation tools. Use it to create or update forms dynamically, then route submission data through your automation stack. Many users combine the API with Make or n8n to build end-to-end workflows.
How do I authenticate with the Tally API?
The Tally API uses token-based authentication. Find your API key in your account settings and include it as a Bearer token in your request headers. Full details in the developer docs.
Does Tally have webhooks or just an API?
Tally has both. Webhooks push data to your tools automatically when a form is submitted. The API gives you full programmatic control — create forms, manage submissions, update fields, and more. Many users use both together.
Can I create forms programmatically and prefill fields?
Yes, you can create forms via the API and dynamically set field values, making it easy to personalise forms per user, event, or client without manual setup.
Is there a rate limit on the API? Yes — 100 requests per minute. If you're syncing submissions continuously, use a webhook instead of polling so you don't hit it.
How do I keep my integration stable across API updates? Pin your requests to a specific API version using the
tally-version header. Check the changelog before upgrading.