Skip to content

TaliCRM API

An HTTP API over your own CRM: meetings and their AI summaries, contacts, companies, tags and action items. Read only by default, with optional write access. Use it from your own apps, or plug it into Claude with the official MCP server and just ask questions about your meetings.

Security model

  • ✓Read only by default. A key can only write if you explicitly gave it the write scope when you created it. Scopes are fixed at creation and cannot be widened later.
  • ✓No delete endpoints in the documented API. Write-scoped keys can create or update data, so keep them secret and revoke them if exposed.
  • ✓Writes obey your plan. API writes go through the same quota and ownership rules as the app, so they cannot be used to bypass plan limits, and they never trigger AI transcription or summarising.
  • ✓Account and organization scope. API keys use the account and organization permissions associated with their owner.
  • ✓Hashed at rest. We store only a SHA-256 of your key. It is shown once at creation and is not recoverable.
  • ✓Revocable and expiring. Revoke instantly, or set an expiry when you create the key.
  • ✓Rate limited. 120 requests per minute per key.
  • !Treat a key like a password. It grants read access to your whole CRM. Keep it in an environment variable, never in a public repo, a browser, or a chat message.

Authentication

Create a key in Settings → API. Keys start with talicrm_sk_. Send it as a bearer token:

curl https://talicrm.com/api/v1/me \
  -H "Authorization: Bearer talicrm_sk_your_key_here"
bash

An X-API-Key header works too. Unknown, revoked and expired keys all return the same 401.

Use it with Claude (MCP)

TaliCRM hosts a remote MCP server at https://talicrm.com/mcp — no install. It connects Claude to your CRM so you can ask things like "what did I agree to with Acme last month?" or "summarise everything tagged pricing". The easiest way is the Integrations page: add the connector and log in with TaliCRM — no key to paste (OAuth). The commands below use an API key instead, for scripts or clients without login support.

Claude Code

claude mcp add --transport http talicrm https://talicrm.com/mcp --header "Authorization: Bearer talicrm_sk_your_key_here"
bash

Claude Desktop

{
  "mcpServers": {
    "talicrm": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://talicrm.com/mcp", "--header", "Authorization: Bearer talicrm_sk_your_key_here"]
    }
  }
}
json

Restart Claude, then ask it to run talicrm_whoami. Tools available: search/get meetings, search/get contacts, list/get companies, list tags, list tasks. All read only.

Endpoints

Base URL https://talicrm.com/api/v1

GET/me
Your account and the organizations it can see.
GET/meetings
Your meetings, newest first. Filters: query, tag, contact_id, company_id, from, to, archived, limit, offset. Free text searches title, summary, transcript and participants.
GET/meetings/:id
One meeting in full, including the transcript.
GET/contacts
Your contacts. Filters: query, tag, tag_id, company_id, limit, offset.
GET/contacts/:id
One contact, with company, tags and their 20 most recent meetings.
GET/companies
Your companies, with contact counts. Filters: query, limit, offset.
GET/companies/:id
One company, with its contacts.
GET/tags
Your tag vocabulary, with contact and meeting counts.
GET/tasks
Open follow ups: standalone tasks plus AI-extracted meeting action items. status=open|done|all.

Writes requires write scope

Create and update only. A read only key gets 403 on every one of these. Rate limited to 30 writes per minute, separately from reads.

POST/contacts
Create a contact. Needs at least one of first_name, last_name, email. Optional company_id, tag_ids, org_id.
PATCH/contacts/:id
Update a contact. Only the fields you send change.
PUT/contacts/:id/tags
Replace a contact's tags. { tag_ids: [1,2] }
POST/companies
Create a company. name required.
PATCH/companies/:id
Update a company.
POST/tasks
Create a follow up. text required; optional due_at, contact_id.
PATCH/tasks/:id
Update a task, e.g. { done: true }.
POST/meetings
Log a typed meeting note. No audio and no AI: transcription and summarising stay an in-app action.
PATCH/meetings/:id
Update a meeting's title or notes. AI fields (summary, transcript, action items) are not writable.
PUT/meetings/:id/tags
Replace a meeting's tags.

Responses

Lists share one envelope. limit defaults to 25 and caps at 100.

{
  "object": "list",
  "data": [ { "id": 153, "title": "Pouria <> Aryan", "met_at": "2026-07-15T21:00:42.135Z",
              "summary": "...", "key_points": [], "action_items": [], "tags": [] } ],
  "pagination": { "limit": 25, "offset": 0, "total": 64, "has_more": true }
}
json

Errors return an error string with the right status:

401 missing, invalid, revoked or expired key

404 the record does not exist, or is not yours (we do not distinguish the two on purpose)

429 over 120 requests per minute

Example

Every meeting tagged pricing since January:

curl -G https://talicrm.com/api/v1/meetings \
  -H "Authorization: Bearer $TALICRM_API_KEY" \
  --data-urlencode "tag=pricing" \
  --data-urlencode "from=2026-01-01"
bash