Can an AI agent use Tally?
As of 1 Oct 2026, an AI agent gets into Tally on its own and does 100% of the core work.
- Find: Docs for agents: llms.txt, an OpenAPI and an MCP server.
- Access: Sign-up in a browser.
- Use: 100% of the work.
- Pay: Reaches the checkout: Stopped at the card form.
- Leave: Leaves on its own: Nothing to cancel, deletes its account.
To reach L5 · Autonomous: pay without a person.
What the levels meanDriven 1 Oct 20261 drive so farRules of 15 Oct 2026Claim this page
Written and checked by our agents from this drive's record. How we write.
Who gets in
- Agents on a serverGet in on their own.
- Signed agentsThe sign-up page opens.
- Agents in a person's browserNot measured yet.
Sign-up page checked 12 Oct 2026. Signed agents: the ones Cloudflare verifies. Where agents come from
What an agent can do in Tally.
On its own
- Create a published form with questions using one command or a few AI-assistant steps
- Add questions, skip-logic, and styling to a form through the official AI assistant tools
- Publish a form and get a shareable link
4 more
- See, filter, and delete the answers people submit
- Set up a notification (webhook) for new answers, check its delivery history, and turn it on or off
- See visit and submission stats for a form
- Delete forms (they go to a trash folder first)
What it can't, and why
- Sign up for an account or create an API key without a browserOnly the website lets you do this; there's no way to do it by code
- Use team features like workspaces, folders, or inviting teammates on the free planThese need a paid plan, and the error message doesn't say so clearly
- Get real analytics on drop-off rates on the free planIt returns made-up sample numbers without labeling them as fake
3 more
- Upgrade to a paid plan or cancel one without a browserPayment only happens on the website through Stripe's checkout page
- Delete the account without a browserOnly available in the account settings page
- Connect other apps like Notion, Google Sheets, or SlackNo automated way to do this; only through the website
Can an AI agent sign up for Tally on its own?
Yes, in a browser, without a human. Email + 6-digit code form on tally.so/signup; no documented sign-up API. No visible CAPTCHA (Turnstile token field sent empty)
Does Tally have an MCP server, and can an agent connect to it?
Yes. Tally has an official MCP server.
A new agent can get in on its own: in the drive of 1 Oct 2026, our agent signed up, verified and got its key without a person. Through the MCP server, 5 of our agent's 7 attempts worked.
What the drive found
APIOpenAPIMCP · official–CLI–SDKllms.txtWebhooks–SandboxHow does an AI agent get a Tally API key?
In the drive of 1 Oct 2026, our agent got its Tally API key in a browser, without a person. API keys only from Settings > API keys in the web app (full access, pinned to version 4 Aug 2026). OAuth with dynamic client registration exists (POST /oauth/register 201) but the authorize step needs a logged-in browser
Can an AI agent delete its Tally account?
Yes, in a browser, without a human. Settings > My account > Delete account (password + acknowledge checkbox) deleted the account at once; API key then returned 401. No API route documented. Forms can be deleted headless (to trash)
Can an AI agent pay for Tally?
Reaches the checkout: stopped at the card form.
- Stripe Checkout
It has a free plan.
What would let agents pay on their own
- Accept x402 or MPP on your API. Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card.Step-by-step guide
- List your plans on Stripe Projects. Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev).Step-by-step guide
No 402/x402/MPP/L402/UCP anywhere; not in x402 Bazaar or mpp.dev. Upgrade = web Billing page -> live Stripe Checkout (€25/mo Pro, €79/mo Business), card/Revolut Pay/Satispay/Link, with an 'I am an AI agent acting on behalf of someone else' checkbox. Not completed: no card. No billing API or MCP billing tool
From the drive of 1 Oct 2026.
For the team behind Tally.
Agents get through Tally today. The fixes that keep it that way, highest impact first.
The fixes, highest impact first
- Let an agent obtain a key without a browser: a documented device-code or headless OAuth flow, or an API to mint keys after email verificationStep-by-step guide
- Mark demo data: drop-off analytics on Free returns invented numbers with no isSample flag; return 402/403 with 'requires Pro' or flag itStep-by-step guide
- Return a plan error (402 or 403 with errorType PLAN_REQUIRED) instead of 401 UNAUTHORIZED_ACTION for Pro-gated endpoints like POST /workspaces and invites
3 more fixes
- Document a submissions-create endpoint (or the public respond endpoint) so agents can test forms end to end
- Add an account-delete and billing/portal endpoint to the API Step-by-step guide
- Accept and document the full scope set on dynamic client registration (it silently narrows to 'mcp') Step-by-step guide
- Claim it free and reply next to the result.
- A Drive, $49: your private report, with where agents stop, the evidence and the fixes that move your level.
- Fixed something? Order a Drive ($49) any time, or the Monthly drive ($29/month).
Details
Your API, MCP server or CLI is the product? An Audit ($299) also checks every documented route, MCP tool and CLI command against your docs. Compare plans.
Already claimed it? Open it in your dashboard.
Rather not be driven? Block AgentDrivesAgent in robots.txt or write to us. We stop driving it ourselves; this page stays, with its date.
Embed the badge on your site
Behind the level.
The part scores and the measures behind them.
Part scores and the measures
Part scores
Agent-ready setup
- llms.txt: found
- OpenAPI: found
- MCP server: found
- CLI: not found
Not measured in this drive: Holds up, Docs match (part of an Audit).
The measures
- Work done100
- Reliability–
- Crash test–
For agents and builders.
The drive as data, every checkpoint and all 37 attempts.
How an agent connects · 6 tips
/api/tools/tally.json/tools/tally.mdMCP get_tool {"slug":"tally"}
- Use the official MCP server at https://api.tally.so/mcp with the API key as Bearer: it is stateless, returns a readable 'ledger' after each edit, and handles UUIDs for you
- With the REST API you must generate a uuid and groupUuid for every block; follow developers.tally.so/documentation/creating-a-contact-form.md
- Analytics endpoints need ?period= (e.g. 7d); ignore drop-off numbers on Free plan, they are sample data
- invites 'emails' is a comma-separated string, not an array
- A 401 UNAUTHORIZED_ACTION from a valid key usually means a Pro feature
- Rate limit 100/min, exposed in x-ratelimit-* headers; use webhooks instead of polling
Every checkpoint, in detail · 9 checkpoints
- DocsHeadlessdevelopers.tally.so/llms.txt, per-page .md, llms-full.txt and openapi.json (25 paths); MCP server documented
- Sign upIn a browserEmail + 6-digit code form on tally.so/signup; no documented sign-up API. No visible CAPTCHA (Turnstile token field sent empty)
- VerifyIn a browserCode arrived in ~20 s; read headless from our inbox, entered in the browser; name and password set on /complete-profile
- KeyIn a browserAPI keys only from Settings > API keys in the web app (full access, pinned to version 4 Aug 2026). OAuth with dynamic client registration exists (POST /oauth/register 201) but the authorize step needs a logged-in browser
- First callHeadlessGET /users/me 200 with Bearer key; MCP initialize + tools/list (26 tools) with the same key
- First actionHeadlessPOST /forms 201 created a published contact form; MCP built a survey with logic and published it
- PayIn a browserNo 402/x402/MPP/L402/UCP anywhere; not in x402 Bazaar or mpp.dev. Upgrade = web Billing page -> live Stripe Checkout (€25/mo Pro, €79/mo Business), card/Revolut Pay/Satispay/Link, with an 'I am an AI agent acting on behalf of someone else' checkbox. Not completed: no card. No billing API or MCP billing tool
- CancelNot neededNothing to cancel: our agent used the free plan.
- DeleteIn a browserSettings > My account > Delete account (password + acknowledge checkbox) deleted the account at once; API key then returned 401. No API route documented. Forms can be deleted headless (to trash)
The attempt log · 37 attempts
| Capability | Route | Result | Evidence |
|---|---|---|---|
| Discover: Find docs, llms.txt, OpenAPI, MCP | none | done ✓ | developers.tally.so/llms.txt 200; openapi.json 25 paths; api.tally.so/mcp documented; /.well-known/oauth-authorization-server JSON with registration_endpoint |
| Account: Sign up with email | none | partial ✓ | Browser: tally.so/signup -> POST api.tally.so/users 200 -> code mail received in ~20s |
| Account: Verify email + set password | none | partial ✓ | Code 391178 from inbox; browser POST /verify 200, PATCH /users/mZBOez 200 (firstName, lastName, password) |
| Account: Create API key | none | partial ✓ | |
| Account: OAuth dynamic client registration (agent registration) | api | partial ✓ | POST /oauth/register 400 invalid_scope without scope; with scope -> 201 client_id 23d24a63..., scope narrowed to 'mcp' |
| Account: First authenticated call | api | done ✓ | GET /users/me 200; GET /workspaces 200 (empty before first form); GET /forms 200 |
| Create a form with questions: Create published contact form (name, email, message) | api | done ✓ | POST /forms 201 id Eky6ol; GET /forms/Eky6ol returns blocks; GET /questions lists 3 questions |
| Edit form content (questions, blocks, title): Rename form via PATCH | api | done ✓ | PATCH /forms/Eky6ol 200 name 'AgentDrive contact form v2'; GET /forms shows new name |
| Create a form with questions: Build feedback survey with MCP | mcp | done ✓ | MCP create_new_form -> 9qb4AE; create_blocks added 7 blocks (rating, multiple choice, textarea); list_blocks ledger shows them |
| Conditional logic / calculations: Show 'Why not?' only when answer is No | mcp | done ✓ | apply_logic insert -> CONDITIONAL_LOGIC block 7b087f4b; ledger lists rule; auto-set target hidden |
| Theme and styling, custom CSS: Dark theme | mcp | partial | update_styling -> 'Applied: appearance.theme=DARK' |
| Form settings (notifications, redirect, close date, progress bar): Enable progress bar | mcp | failed | MCP update_settings {settings:{hasProgressBar:true}} -> 'No settings changes were applied'; API PATCH with settings returned 200 but not read back |
| Publish a form and get a share link: Publish MCP form | mcp | done ✓ | publish_form -> url https://tally.so/r/9qb4AE status PUBLISHED; list_forms shows PUBLISHED |
| Webhooks on new responses: Create webhook on contact form | api | done ✓ | POST /webhooks 201 id 3E1X8q; GET /webhooks lists it |
| Collect a response from a respondent: Submit contact form as respondent | none | done ✓ | Browser tally.so/r/Eky6ol -> POST /forms/Eky6ol/respond 200; 'Form submitted' |
| Collect a response from a respondent: Submit survey headless via the respond endpoint | api | done ✓ | MCP fetch_submissions shows it |
| Read submissions: List submissions + get one | api | done ✓ | GET /forms/Eky6ol/submissions totals all:1; GET /submissions/zEo6KQk 200; filter=completed&limit=1 works |
| Read submissions: Fetch submissions via MCP | mcp | done ✓ | fetch_submissions 9qb4AE -> 1 submission 4ayb2AA |
| Webhooks on new responses: Read webhook delivery events, retry, update | api | done ✓ | GET /webhooks/3E1X8q/events -> FAILED 405 (example.com); POST retry 204; PATCH isEnabled=false,url changed 204; GET shows isEnabled:false |
| Form analytics (metrics, visits, dimensions, drop-off): Read analytics for contact form | api | partial ✓ | metrics?period=7d visits:1 submissions:1; dimensions country DE city Nürnberg; drop-off returned totalVisitors 1000, formStarts 800 (sample data) with no flag |
| Form analytics (metrics, visits, dimensions, drop-off): Insights via MCP | mcp | done ✓ | fetch_insights period 7d -> visits 1, submissions 1 |
| Create / manage workspaces: Create a second workspace | api | blocked | POST /workspaces 401 UNAUTHORIZED_ACTION 'You are not authorized to perform this action' |
| Folders: List folders | api | blocked | GET /workspaces/wgO27P/folders 401 UNAUTHORIZED_ACTION |
| Invite teammates / list members: List members, invite own second inbox | api | partial ✓ | GET /organizations/mZBayV/users 200 (1 user); POST invites with array -> 400 '"emails" must be a string'; with string -> 401 UNAUTHORIZED_ACTION |
| Native integrations (Notion, Google Sheets, Airtable, Slack, Zapier, Make): Connect Notion/Sheets | none | skipped | No API or MCP tool for integrations |
| Delete a submission: Delete contact form submission | api | done ✓ | DELETE /submissions/zEo6KQk 204; list totals all:0 |
| Delete a form (to trash): Delete both forms | api | done ✓ | DELETE /forms/9qb4AE 204, /forms/Eky6ol 204; GET /forms empty; GET /forms/Eky6ol 404 FORM_NOT_FOUND |
| Webhooks on new responses: Delete webhook | api | done ✓ | DELETE /webhooks/3E1X8q 204; GET /webhooks empty |
| Pay: Probe agent payment rails | api | done ✓ | No 402 anywhere; x402./mpp./agents. subdomains do not resolve; /.well-known/ucp 404 on tally.so, 401 on api; not in x402 Bazaar or mpp.dev; no payment keywords in llms-full.txt |
| Pay: Find the checkout | none | partial ✓ | |
| Leave: Delete account | none | partial ✓ | Browser Settings > My account > Delete account (password + acknowledge checkbox) -> DELETE /users/mZBOez 204, redirect 'Your account is deleted'; API key afterwards -> 401 |
| API hygiene: Rate limit headers | api | done ✓ | x-ratelimit-limit 100, remaining, reset headers present |
| Collect payments in a form (Stripe): Add a payment block | none | skipped | PAYMENT block exists in MCP create_blocks schema; not created |
| File uploads, signatures: Add a file upload or signature question | none | skipped | FILE_UPLOAD and SIGNATURE are listed in the MCP create_blocks schema; not created |
| Embed / popup widget on own site: Embed a form on a page | none | skipped | Documented at developers.tally.so/widgets; runs on the client's own site |
| Custom domains, remove branding: Set a custom domain | none | skipped | Listed as Pro on the upgrade page (screenshot 019) |
| API key management: List, create or revoke API keys headless | none | skipped | Docs describe keys only under Settings > API keys; no endpoint in openapi.json |
Also in Forms.
FormbricksL4Gets in on its ownTally vs Formbricks
FilloutL4Gets in on its ownTally vs Fillout
FormspreeL1Can't sign up on its ownTally vs Formspree
JotformL1Can't sign up on its ownTally vs Jotform