Developers
REST API and MCP server for Tiny Ant CRM and proposals
Everything you see in the app is available over a small JSON API, and the same API is exposed as an MCP server so Claude, Cursor and other assistants can read your pipeline and update it for you.
Authentication
Every request carries a workspace API key in the Authorization header:
Authorization: Bearer ta_live_...
Workspace admins create keys on the Settings page of the app (section API and MCP). A key is shown once when created and can be revoked at any time. It acts in the name of the admin who created it: notes, tasks and events are attributed to that person, and anything the key creates is visible to the whole workspace. The API and the MCP server are included in the Pro and Team plans and require the CRM to be enabled for the workspace.
Requests without a valid key get 401. A workspace on the Free plan gets 403.
Base URL
https://app.tinyant.io/api/v1
Bodies and responses are JSON (UTF-8). Ids look like de_, co_, pe_, ta_ and no_ followed by 12 characters; proposal ids are 12 characters without a prefix. Timestamps are Unix milliseconds. The paths, bodies and responses are the same the app itself uses, so what you see in the browser's network tab is what the API returns.
Endpoints
| Method | Path | What it does |
|---|---|---|
| GET | /me | Workspace, plan and the user the key acts as |
| GET | /deals?status=open|won|lost&q= | List deals with stage, value, company, contact and proposal reading status |
| POST | /deals | Create a deal (name, company_id or company_name, person_id, value, currency, stage_id, expected_close) |
| GET PUT DELETE | /deals/:id | One deal with timeline; update fields, stage or status (open, won, lost); delete |
| POST | /deals/:id/proposals | Link a proposal to the deal ({proposal_id}) |
| DELETE | /deals/:id/proposals/:pid | Unlink a proposal |
| GET POST | /companies | List or create companies |
| GET PUT DELETE | /companies/:id | One company with people, deals and timeline |
| GET POST | /people | List or create people (contacts) |
| GET PUT DELETE | /people/:id | One person with deals and timeline |
| GET POST | /tasks | List (scope=mine|all, done=0|1) or create tasks |
| PUT DELETE | /tasks/:id | Update or complete a task; delete |
| POST | /notes | Add a note to a deal, person or company |
| PUT DELETE | /notes/:id | Edit or delete a note |
| GET | /stages | Pipeline stages, members and currency |
| PUT | /stages | Replace the stage list |
| GET | /activity?since=&limit=&deal_id=&person_id=&company_id= | Structured event log, newest first. since is a Unix millisecond timestamp |
| GET | /search?q= | Companies, people and deals in one search |
| GET | /visitors?days=7|30|90 | Tiny Ant Visitors: companies that visited your website, pages, last visit, CRM link and the share of home, mobile and data centre visits |
| GET POST | /visitors/settings | Visitors status and snippet; switch on or off ({enabled}), connect or remove ipapi.is ({ipapi_key}) |
| POST | /visitors/companies/:id/add | Add a visiting company to the CRM |
| GET | /proposals?status=active|won|closed|archived | Proposals with visits, reading time and linked deal |
| GET | /proposals/:id | One proposal with reading time per page, recipients, activity and versions |
| POST | /proposals | Upload a proposal (same body as the app: multipart with a PDF file, name and pages) |
| POST | /proposals/:id/status | Set the status ({status: active|closed|won}) |
Examples
List open deals:
curl https://app.tinyant.io/api/v1/deals?status=open \
-H "Authorization: Bearer ta_live_..."
Create a deal and let Tiny Ant create or match the company by name:
curl -X POST https://app.tinyant.io/api/v1/deals \
-H "Authorization: Bearer ta_live_..." \
-H "Content-Type: application/json" \
-d '{"name": "Website redesign", "company_name": "Acme Oy", "value": 12500}'
Everything that happened since a timestamp, for example to sync your own system:
curl "https://app.tinyant.io/api/v1/activity?since=1760000000000&limit=100" \
-H "Authorization: Bearer ta_live_..."
MCP server
The MCP (Model Context Protocol) server lives at:
https://app.tinyant.io/mcp
Transport is Streamable HTTP, stateless, JSON-RPC over POST. Authentication is the same Bearer key. There are no server-initiated streams, so a plain HTTP client is enough.
Claude Code. One line in your terminal, then ask Claude about your deals:
claude mcp add --transport http tiny-ant https://app.tinyant.io/mcp --header "Authorization: Bearer ta_live_..."
Cursor, Make, Zapier and other clients. Add a remote MCP server of type HTTP (sometimes called Streamable HTTP) with the address above and an Authorization header whose value is Bearer followed by your key. Clients that only support stdio servers can use a bridge such as mcp-remote.
claude.ai. Custom connectors in claude.ai sign in with OAuth rather than a static key. OAuth support for the Tiny Ant MCP server is planned; until then use Claude Code or the REST API.
MCP tools
Each tool calls the same API as above and returns the JSON response as text.
| Tool | Description |
|---|---|
search | Search companies, people and deals in the CRM by name, email or domain. |
list_deals | List deals. |
get_deal | Full view of one deal: details, company, contact, proposals with reading data, tasks and the timeline of notes and events. |
create_deal | Create a deal. |
update_deal | Update a deal: rename, change value, move to a stage, mark won or lost, link a company or contact. |
list_companies | List companies with people count, open deals and open value. |
get_company | One company with its people, deals and timeline. |
create_company | Create a company. |
list_people | List people (contacts), optionally for one company. |
get_person | One person with deals and timeline. |
create_person | Create a contact. |
add_note | Add a note to a deal, person or company. |
list_tasks | List open tasks for the key owner (mine) or everyone. |
create_task | Create a task, optionally linked to a deal, person or company. |
complete_task | Mark a task done (or reopen it with done=false). |
list_stages | Pipeline stages in order, workspace members and currency. |
activity | Structured event log of the workspace, newest first: deals created and moved, won and lost, notes, tasks, proposals linked and read. |
list_proposals | Proposals with reading status: visits, total reading time, reading now, linked deal. |
get_proposal | One proposal: reading time per page, recipients, activity, versions, linked deal. |
list_visitors | Companies that visited your website (Tiny Ant Visitors): named company networks with pages viewed, last visit and the CRM company if linked, plus how many visits came from home, mobile or data centre networks. |
link_proposal | Link an existing proposal to a deal so its reading shows on the deal timeline. |
Rate limits and fair use
There is no per-key rate limit yet. Our edge applies the same protections to the API as to the rest of the service, so sustained bursts from one address may be throttled with 429. Poll /activity with since instead of re-reading whole lists, keep to one key per integration so you can revoke it alone, and do not share a key with people outside your workspace. A workspace can have up to 10 active keys.
Webhooks
If you want Tiny Ant to call you instead, outgoing webhooks are set up on the same Settings page. They send a signed JSON POST when a proposal is opened, when a reading ends, when a status changes and when a deal is created or moves between stages.
Questions
Write to hello@tinyant.io. Changes to the API are announced on this page.