Everything an AI agent can do with the Tally API.

A reference guide for building AI agents: every method, how to authenticate, and the permissions each one needs.

Endpoints34
API version2025-02-01
Last updated23 June 2026
Orientation

How the Tally API works.

The Tally API is how an app or AI agent works with a Tally account: creating a form, updating its questions, reading the submissions people send in, or managing workspaces and webhooks. Access is granted through an API key or an OAuth token, and either one inherits the full access of the user it belongs to, since Tally has no per-area permissions yet. A change to a response shape ships under a new dated version, and a new submission can be pushed to a registered endpoint rather than polled for.

34Endpoints
8Capability groups
18Read
16Write
0Permissions
Authentication
Tally authenticates a call with a Bearer token in the Authorization header. The token is either a personal API key created at Settings, API keys (prefixed tly-), or an OAuth 2.0 access token obtained by sending a user through the authorize flow and exchanging the code for a token that can be refreshed. The API is free for every Tally user, including the free plan.
Permissions
Tally has no scopes or fine-grained permissions today. The api-keys docs state plainly that an API key reaches all of the user's resources, and that fine-grained permissions are not an option right now. So a key or OAuth token is all-or-nothing, which is exactly the boundary a gateway in front of Tally is needed to narrow.
Versioning
Tally versions the API by date, like 2025-02-01, in the style Stripe uses. A key is tied to the version current when it was created and cannot be changed at the key level; a request overrides it by sending the tally-version header. A dated cut is where a response shape can change, such as the 2025-02-01 move that wrapped list results in an items array with pagination metadata.
Data model
A form is built from blocks, the ordered pieces that render it; questions are the answerable blocks within it. A submission holds the responses to one form, each response keyed to a question. Workspaces group forms, and an organization holds the workspaces and the people in them. A webhook ties a form to a URL that receives a FORM_RESPONSE payload on each submission.
Connect & authenticate

Connection & authentication methods.

How an app or AI agent connects to Tally determines what it can reach. There is a route for making calls, a route for receiving submissions as they arrive, and a hosted server that exposes Tally tools to agents, and each is governed by the key or token behind it.

Ways to connect

REST API

The REST API takes JSON request bodies, returns JSON, and lives at https://api.tally.so. A call authenticates with a Bearer token, either a personal API key or an OAuth access token. List endpoints page with a page number and limit. The path carries no version segment; the version is selected by the key's default or the tally-version header.

Best forConnecting an app or AI agent to Tally.
Governed byThe Bearer token, which reaches all of the user's resources.
Docs ↗

Webhooks

Tally POSTs a FORM_RESPONSE payload to a registered URL when a form is submitted. The receiver verifies the Tally-Signature header, an HMAC-SHA256 hash of the raw body computed with the webhook's signing secret, and returns a 2XX within 10 seconds. Webhooks are created through the API or in a form's Integrations tab.

Best forReceiving new submissions at an app or AI agent without polling.
Governed byThe signing secret on the webhook.
Docs ↗

MCP server

A first-party hosted Model Context Protocol server at https://api.tally.so/mcp lets an AI assistant build Tally forms and retrieve forms or submissions in natural language. It authenticates with OAuth (recommended for assistants that support it) or with a Bearer API key. Tally states the MCP server is in beta and subject to change.

Best forConnecting an AI agent to Tally through MCP.
Governed byThe OAuth grant or the API key behind the connection.
Docs ↗
Authentication

API key

A personal API key is created in the dashboard at Settings, API keys, and is shown only once. It is sent as a Bearer token and reaches all of the user's resources; Tally has no scopes to narrow it. Removing the user from an organization deactivates their keys.

TokenBearer API key (tly-...)
Best forServer-side calls for a single account.
Docs ↗

OAuth 2.0

OAuth 2.0 uses the authorization-code flow: an integration sends the user to tally.so/oauth/authorize with response_type=code, then exchanges the code at the token endpoint for an access token that can be refreshed. Tally does not define scopes, so the token, like an API key, reaches all of that user's resources.

TokenOAuth 2.0 access token (refreshable)
Best forAn integration connecting on behalf of other Tally users.
Docs ↗
Capability map

What an AI agent can do in Tally.

The Tally API is split into areas an agent can act on, like forms, the questions and blocks inside them, submissions, workspaces, the organization's people, and webhooks. Each area has its own methods, and a write in some areas changes a live form or removes a response.

Endpoint reference

Every Tally API method.

Filter by method, access, or permission, or search any path. Select a row for version detail, rate limits, the related webhook event, and the source.

MethodEndpointWhat it doesAccessPermissionVersion

Forms

Methods for listing, reading, creating, updating, and deleting forms.5

Read-only. Tally has no scopes; any valid token reaches all of the user's forms.

Acts onform
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

A core write. No scope narrows it; the token's user owns the new form.

Acts onform
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only.

Acts onform
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Changes a live form. Block payloads are validated against the schema, so an invalid structure returns a 400.

Acts onform
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Moves the form to trash rather than erasing it immediately.

Acts onform
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Questions & blocks

Methods for reading and updating the questions and blocks that make up a form.4

Read-only.

Acts onquestion
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Changes what a live form asks.

Acts onquestion
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only.

Acts onblock
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Changes how a live form renders. Block payloads are validated against the schema, so an invalid structure returns a 400.

Acts onblock
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Submissions

Methods for listing, reading, and deleting the responses people send in.3

Read-only. Accepts filter (all, completed, partial), startDate, endDate, and afterId; limit can run up to 500.

Acts onsubmission
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only. Returns the answers a person submitted.

Acts onsubmission
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Permanently removes a person's response.

Acts onsubmission
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Analytics

Read-only methods for visit, submission, and drop-off statistics on a form.5

Read-only. Returns aggregate counts, not raw responses.

Acts onanalytics
Permission (capability)None required
VersionIntroduced 2026-06-19
Webhook eventNone
Rate limitStandard limits apply

Read-only.

Acts onanalytics
Permission (capability)None required
VersionIntroduced 2026-06-19
Webhook eventNone
Rate limitStandard limits apply

Read-only. Counts only, not the responses themselves.

Acts onanalytics
Permission (capability)None required
VersionIntroduced 2026-06-19
Webhook eventNone
Rate limitStandard limits apply

Read-only.

Acts onanalytics
Permission (capability)None required
VersionIntroduced 2026-06-19
Webhook eventNone
Rate limitStandard limits apply

Read-only.

Acts onanalytics
Permission (capability)None required
VersionIntroduced 2026-06-19
Webhook eventNone
Rate limitStandard limits apply

Workspaces

Methods for listing, reading, creating, updating, and deleting the workspaces that group forms.5

Read-only.

Acts onworkspace
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Requires a Pro subscription on the account.

Acts onworkspace
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only.

Acts onworkspace
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Changes a shared workspace's settings.

Acts onworkspace
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Removes every form inside the workspace along with it.

Acts onworkspace
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Organization & users

Methods for the people in an organization: listing users, removing them, and managing invites.5

Read-only. Returns the people in the organization.

Acts onuser
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Removes a person's access; also deactivates that user's API keys.

Acts onuser
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only.

Acts oninvite
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Grants a new person access to the named workspaces.

Acts oninvite
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Withdraws an invite before it is accepted.

Acts oninvite
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

User

A read-only method for the current authenticated user.1

Read-only. Replaced the older /me endpoint, deprecated in the 2025-02-01 version.

Acts onuser
Permission (capability)None required
VersionIntroduced 2025-02-01
Webhook eventNone
Rate limitStandard limits apply

Webhooks

Methods for creating, listing, updating, and deleting webhooks, and inspecting or retrying their deliveries.6

Read-only. Shows where forms' submissions are being sent.

Acts onwebhook
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Takes formId, url, and eventTypes (FORM_RESPONSE), plus an optional signingSecret and custom HTTP headers.

Acts onwebhook
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventFORM_RESPONSE
Rate limitStandard limits apply

Can change the destination URL or enabled status of a webhook.

Acts onwebhook
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Stops a form's submissions from being delivered to that URL.

Acts onwebhook
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only. Useful for diagnosing failed deliveries.

Acts onwebhook_event
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Re-sends a previously failed delivery to the endpoint.

Acts onwebhook_event
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply
No endpoints match those filters.
Webhooks

Webhook events.

Tally can notify an app when a form is submitted. It sends a FORM_RESPONSE payload describing the response and its fields, so an integration learns about a new submission without polling.

EventWhat it signalsTriggered by
FORM_RESPONSEA form was submitted. The payload carries an eventId, the eventType, a createdAt timestamp, and a data object with the responseId, formId, formName, and a fields array of each answer's key, label, type, and value./webhooks
No events match that search.
Rate limits & pagination

Rate limits, pagination & request size.

Tally limits how fast an app can call, by a request rate measured per minute across the key, and pages list results so a single call returns a bounded set.

Request rate

Tally allows 100 requests per minute, measured per API key. Going over returns HTTP 429. The docs recommend receiving new submissions through a webhook rather than repeatedly listing them, so polling does not consume the limit. There is no documented per-method cost or weighting; every call counts the same against the per-minute rate.

Pagination

List endpoints page with a page number and a limit. A response carries pagination metadata, including hasMore, and (from the 2025-02-01 version) wraps the results in an items array. The submissions list also accepts afterId to continue past a known submission and filter, startDate, and endDate to narrow the set. A limit can run up to 500 on the submissions list.

Request size

A list page returns a bounded set, up to the limit (as high as 500 on the submissions list, default 50). A webhook receiver must return a 2XX status within 10 seconds, or Tally treats the delivery as failed and the event can be retried.

Errors

Status codes & error handling.

The status codes an agent should handle, and what to do about each.

StatusCodeMeaningWhat to do
400Bad RequestThe request was malformed, for example an invalid block payload structure, which is validated against the schema and rejected.Fix the request body to match the documented shape and resend.
401UnauthorizedNo valid Bearer token was provided, or the token is missing or expired.Send a valid API key or OAuth access token in the Authorization header; refresh the token if it has expired.
403ForbiddenThe authenticated user is not allowed to perform this request, for example acting on a workspace or organization they cannot access, or an action that needs a Pro subscription.Use a token for a user with access, or upgrade the plan where the action requires it.
404Not FoundThe requested resource does not exist or is not visible to this user, for example a wrong form, submission, or workspace ID.Verify the ID and that it belongs to the authenticated user's account.
429Rate LimitedMore than 100 requests were made in a minute on the key.Slow the request rate, and receive new submissions through a webhook rather than polling.
500Server ErrorAn error on Tally's side.Retry after a short delay, and contact Tally support if it persists.
Versioning & freshness

Version history.

Tally pins a dated version to each API key and lets a request override it with a header, so a change to a response shape ships under a new date rather than breaking existing callers.

Version history

What changed, and when

Latest version2025-02-01
2026-06-19Feature update
Analytics endpoints (v0.8.0)

Five analytics endpoints were added for a form: aggregate metrics, visits over time, submissions over time, visitor dimensions, and per-question drop-off.

What changed
  • New: GET /forms/{formId}/analytics/metrics, /visits, /submissions, /dimensions, and /drop-off.
2026-06-02Feature update
Rich text in form settings (v0.7.0)

Form settings began supporting rich text with HTML and mentions for email and redirect fields.

What changed
  • Email and redirect settings accept rich text with HTML and mentions.
2026-05-07Feature update
Submission preview and PDF URLs (v0.6.0)

Submission responses began including preview and PDF URLs.

What changed
  • Submission objects now carry previewUrl and pdfUrl.
2026-02-05Feature update
Block payload validation (v0.4.0)

Block payloads are now validated against the schema, so a request with an invalid block structure is rejected.

What changed
  • Invalid block payload structures are rejected with a 400 error.
2025-05-30Feature update
Questions, submissions filtering, org and webhook endpoints (v0.3.0)

Multiple endpoints were added for questions, submissions, organization users and invites, and webhooks, and submission filtering was enhanced.

What changed
  • New endpoints across questions, submissions, organizations, and webhooks.
  • Submission listing gained filtering.
2025-02-01Current version
Pagination and /users/me (v0.2.0)

Forms and workspaces list responses became paginated and wrapped in an items array with pagination metadata, a breaking change to the response shape. A /users/me endpoint was added and the older /me endpoint was deprecated.

What changed
  • List responses for forms and workspaces wrapped in items with page, limit, total, and hasMore.
  • Added GET /users/me; deprecated /me.
2025-01-15Feature update
Initial API release (v0.1.0)

The first public version of the Tally API.

What changed
  • Initial release.

A key keeps the version it was created with; move up deliberately by sending the newer date.

Tally API changelog ↗
Questions

Tally API, answered.

How do I authenticate with the Tally API?+
Send a Bearer token in the Authorization header, like Authorization: Bearer tly-xxxx. The token is either a personal API key created in the dashboard under Settings, API keys, shown only once when created, or an OAuth 2.0 access token from the authorize flow. Removing a user from an organization deactivates that user's API keys.
Does Tally support OAuth and scopes?+
Tally has an OAuth 2.0 authorization-code flow for building an integration that connects on a user's behalf: an app sends the user to tally.so/oauth/authorize with response_type=code, then exchanges the code for an access token that can be refreshed. Tally does not currently define scopes, so the resulting token, like an API key, reaches all of that user's resources.
How does API versioning work?+
Tally uses date-based versioning. A key is bound to the version that was current when it was created, and that default cannot be changed at the key level. A single request can target a different version by sending the tally-version header with a date, such as 2025-02-01. Dated cuts are where a response shape can change, so existing callers stay stable.
How do I verify a webhook came from Tally?+
Each webhook request carries a Tally-Signature header whose value is an HMAC-SHA256 hash of the raw payload, computed with the signing secret set on the webhook. The receiver recomputes the hash over the raw body and compares it to the header, rejecting a mismatch. A receiver should return a 2XX within 10 seconds, or the delivery is treated as failed.
What events can a webhook subscribe to?+
A webhook receives the FORM_RESPONSE event, sent when someone submits the form. The POST body includes an eventId, the eventType, a createdAt timestamp, and a data object with the responseId, formId, formName, and a fields array carrying each answer's key, label, type, and value.
What's the rate limit, and how do I avoid hitting it?+
Tally allows 100 requests per minute per key, and returns HTTP 429 when exceeded. To learn about new submissions without polling, register a webhook so Tally pushes each FORM_RESPONSE to an endpoint, which keeps list calls and their rate cost out of the loop.
Related

More forms API guides for agents

What is Bollard AI?

Control what every AI agent can do in Tally.

Bollard AI sits between a team's AI agents and Tally. Grant each agent exactly the access it needs, read or write, area by area, and every call is checked and logged, even though a Tally key by itself grants full account access.

  • Set read, write, or full access per agent, never a shared Tally key that reaches everything.
  • Denied by default, so an agent reaches only what has been explicitly allowed.
  • Every call recorded in plain English: who, what, where, and the decision.
Tally
Lead Intake Agent
Read submissions ResourceOffReadFull use
Delete submissions ActionOffReadFull use
Forms ResourceOffReadFull use
Delete workspace ActionOffReadFull use
Per-agent access, set in Bollard AI, not in Tally