SalesSheet API Reference

This is the complete reference for the SalesSheet API. This is the same API that Claude Desktop and Cursor talk to when you install SalesSheet as an MCP server.

The API is MCP-native: it speaks Model Context Protocol JSON-RPC 2.0 over plain HTTP. There is no separate REST API. Every operation — reading contacts, creating deals, sending emails — goes through a single endpoint via tools/call.

All requests are POST to https://app.salessheets.ai/api/mcp with Content-Type: application/json. There is no versioned URL path — the MCP protocol version is negotiated in the initialize handshake.

Authentication

SalesSheet uses Personal Access Tokens (PATs) for API access. Keys are per-user: every key acts as the user who generated it, with full access to that user's CRM data.

Generating a key

  1. Log in at app.salessheets.ai
  2. Go to Settings → API & MCP
  3. Click Generate New Key and give it a name (e.g. "Claude Desktop")
  4. Copy the key immediately — it is shown only once and cannot be retrieved again.

Key format

Every API key follows the format ss_live_ followed by 43 characters of base64url-encoded random bytes. Example:

ss_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v

Store this key securely. Treat it like a password. It is hashed at rest and cannot be recovered — if you lose it, generate a new one and revoke the old one.

Using the key

Pass the key in the Authorization header on every request:

HTTP Header
Authorization: Bearer ss_live_YOUR_KEY

Revoking a key

Go to Settings → API & MCP, find the key by name, and click Revoke. Revocation is immediate — any in-flight request using that key will return HTTP 401 on the next call.

Limits

Quickstart

All examples use curl. Replace ss_live_YOUR_KEY with your actual key from Settings → API & MCP.

1. Discover available tools

cURL
curl -X POST https://app.salessheets.ai/api/mcp \
  -H "Authorization: Bearer ss_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list"
  }'

Returns the full list of 54 tools with their names, descriptions, and input schemas.

2. List contacts

cURL
curl -X POST https://app.salessheets.ai/api/mcp \
  -H "Authorization: Bearer ss_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "list_contacts",
      "arguments": { "limit": 10 }
    }
  }'

Response (success):

JSON Response
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "content": [{
      "type": "text",
      "text": "{\"contacts\":[...],\"count\":10}"
    }]
  }
}

The result.content[0].text field always contains a JSON-serialized string with the tool's actual output.

3. Create a contact

cURL
curl -X POST https://app.salessheets.ai/api/mcp \
  -H "Authorization: Bearer ss_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "create_contact",
      "arguments": {
        "name": "Jane Smith",
        "email": "jane@example.com",
        "company": "Acme Corp"
      }
    }
  }'

4. Create a deal

cURL
curl -X POST https://app.salessheets.ai/api/mcp \
  -H "Authorization: Bearer ss_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 4,
    "method": "tools/call",
    "params": {
      "name": "create_deal",
      "arguments": {
        "name": "Acme Corp - Enterprise",
        "revenue": 24000,
        "stage": "Qualified",
        "companyName": "Acme Corp",
        "closeDate": "2026-06-30"
      }
    }
  }'

5. Get pipeline summary

cURL
curl -X POST https://app.salessheets.ai/api/mcp \
  -H "Authorization: Bearer ss_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 5,
    "method": "tools/call",
    "params": {
      "name": "get_pipeline_summary",
      "arguments": {}
    }
  }'

MCP Client Setup

Any MCP-compatible client can connect to SalesSheet using the config below. Generate your API key at Settings → API & MCP first.

Claude Desktop

  1. Open Claude Desktop settings (gear icon)
  2. Click Developer in the sidebar, then Edit Config
  3. Paste this configuration (replace YOUR_API_KEY):
claude_desktop_config.json
{
  "mcpServers": {
    "salessheet": {
      "type": "http",
      "url": "https://app.salessheets.ai/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Save the file and restart Claude Desktop.

Cursor

  1. Open Cursor Settings (Cmd+, / Ctrl+,)
  2. Navigate to MCP in the sidebar
  3. Click Add new MCP server and paste this configuration:
.cursor/mcp.json
{
  "mcpServers": {
    "salessheet": {
      "type": "http",
      "url": "https://app.salessheets.ai/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Save and restart Cursor.

Generic MCP client

Any MCP-compatible client can connect with these settings:

Server URL:   https://app.salessheets.ai/api/mcp
Transport:    HTTP (Streamable)
Auth Header:  Authorization: Bearer YOUR_API_KEY
Protocol:     MCP JSON-RPC 2024-11-05

Tool Reference

54 tools across 16 categories. Every tool is called via tools/call. read tools are side-effect-free. write tools create or modify data.

Every tool result is returned in result.content[0].text as a JSON string. Parse it to access the fields documented below. On failure, tools return {"error": "message"} in the same field.

Category 1 of 16

CRM — Contacts

list_contacts read

List contacts in the CRM. Returns up to 20 contacts sorted by most recently updated.

ParameterTypeRequiredDescription
limitnumberoptionalMax contacts to return (default 20, max 50)
searchstringoptionalSearch by name, email, or company

Response shape: {"contacts": [...], "count": number}. Each contact: id, name, email, phone, company, status, created_at, updated_at.

Example request body
{
  "jsonrpc": "2.0", "id": 1, "method": "tools/call",
  "params": { "name": "list_contacts", "arguments": { "limit": 10, "search": "Acme" } }
}
get_contact read

Get a single contact by ID with full details including custom fields.

ParameterTypeRequiredDescription
idstringrequiredContact UUID

Response shape: Full contact object — id, name, email, phone, company, status, data, created_at, updated_at. The data field contains custom JSONB fields.

Example
{
  "method": "tools/call",
  "params": { "name": "get_contact", "arguments": { "id": "uuid-here" } }
}
search_contacts read

Search contacts by name, email, or company. Returns up to 10 matches.

ParameterTypeRequiredDescription
querystringrequiredSearch term

Response shape: {"contacts": [...], "count": number}. Each contact: id, name, email, phone, company, status.

Example
{
  "method": "tools/call",
  "params": { "name": "search_contacts", "arguments": { "query": "jane@example.com" } }
}
create_contact write

Create a new contact in the CRM. Status defaults to "lead".

ParameterTypeRequiredDescription
namestringrequiredFull name
emailstringoptionalEmail address
phonestringoptionalPhone number
companystringoptionalCompany name

Response shape: {"created": true, "contact": {id, name, email, company}}

Example
{
  "method": "tools/call",
  "params": {
    "name": "create_contact",
    "arguments": { "name": "Jane Smith", "email": "jane@example.com", "company": "Acme" }
  }
}
update_contact write

Update an existing contact. Only include fields you want to change.

ParameterTypeRequiredDescription
idstringrequiredContact UUID
namestringoptionalFull name
emailstringoptionalEmail address
phonestringoptionalPhone number
companystringoptionalCompany name

Response shape: {"updated": true, "contact": {id, name, email, company}}

delete_contact write

Permanently delete a contact from the CRM.

ParameterTypeRequiredDescription
idstringrequiredContact UUID

Response shape: {"deleted": true, "id": "uuid"}

enrich_contact write

Enrich a contact with LinkedIn, company, and web data. Consumes 1 enrichment credit.

ParameterTypeRequiredDescription
contactIdstringrequiredContact UUID to enrich

Response shape: Enrichment result object. Fields vary based on what data was found (LinkedIn URL, job title, company details, etc.).

This tool consumes 1 enrichment credit from your account balance each time it is called successfully. Check your credits at Settings → Billing before bulk enriching contacts.

Category 2 of 16

CRM — Deals

list_dealsread

List deals/opportunities in the pipeline, sorted by revenue descending.

ParameterTypeRequiredDescription
statusstringoptionalFilter by stage name (e.g. "Qualified", "Won")
limitnumberoptionalMax deals to return (default 20, max 50)

Response shape: {"deals": [...], "count": number}. Each deal: id, opportunity, status, revenue, companyName, closeDate, priority, owner.

get_dealread

Get a single deal by ID with all fields.

ParameterTypeRequiredDescription
idstringrequiredDeal UUID

Response shape: Full deal object with all columns.

get_pipeline_summaryread

Get pipeline summary grouped by stage with counts and revenue.

No parameters required.

Response shape: {"stages": [{stage, count, revenue}, ...], "totalDeals": number, "totalRevenue": number}

Example
{
  "method": "tools/call",
  "params": { "name": "get_pipeline_summary", "arguments": {} }
}
create_dealwrite

Create a new deal/opportunity. Stage defaults to "Lead/New" if not provided.

ParameterTypeRequiredDescription
namestringrequiredDeal name
revenuenumberoptionalDeal value
stagestringoptionalPipeline stage name
companyNamestringoptionalCompany name
closeDatestringoptionalExpected close date (ISO 8601)
contactIdstringoptionalRelated contact UUID

Response shape: {"created": true, "deal": {id, opportunity, status, revenue, companyName}}

update_dealwrite

Update an existing deal. Only include fields you want to change.

ParameterTypeRequiredDescription
idstringrequiredDeal UUID
namestringoptionalDeal name
revenuenumberoptionalDeal value
stagestringoptionalPipeline stage name
closeDatestringoptionalExpected close date (ISO 8601)

Response shape: {"updated": true, "deal": {id, opportunity, status, revenue}}

delete_dealwrite

Permanently delete a deal/opportunity.

ParameterTypeRequiredDescription
idstringrequiredDeal UUID

Response shape: {"deleted": true, "id": "uuid"}

Category 3 of 16

CRM — Companies

list_companiesread

List companies in the CRM sorted by most recently updated.

ParameterTypeRequiredDescription
limitnumberoptionalMax companies to return (default 20, max 50)
searchstringoptionalSearch by name, domain, or industry

Response shape: {"companies": [...], "count": number}. Each company: id, name, domain, industry, size, website, location, tier, total_contacts, open_deals, total_revenue, updated_at.

get_companyread

Get a single company by ID with full details.

ParameterTypeRequiredDescription
idstringrequiredCompany UUID

Response shape: Full company object including health_score, total_revenue, won_deals, last_activity_at and more.

search_companiesread

Search companies by name, domain, or industry. Returns up to 10 matches.

ParameterTypeRequiredDescription
querystringrequiredSearch term

Response shape: {"companies": [...], "count": number}

create_companywrite

Create a new company record.

ParameterTypeRequiredDescription
namestringrequiredCompany name
domainstringoptionalCompany domain (e.g. acme.com)
industrystringoptionalIndustry
websitestringoptionalWebsite URL
descriptionstringoptionalCompany description
sizestringoptionalCompany size range (e.g. "50-200")

Response shape: {"created": true, "company": {id, name, domain, industry}}

Category 4 of 16

Tasks

list_tasksread

List tasks/to-dos. Filter by status, priority, or contact.

ParameterTypeRequiredDescription
statusstringoptional"pending", "completed", or "overdue"
prioritystringoptional"high", "medium", or "low"
limitnumberoptionalMax tasks to return (default 20, max 50)

Response shape: {"tasks": [...], "count": number}. Each task: id, title, type, display_status, priority, deadline, contact, description.

create_taskwrite

Create a new task or follow-up item. Type defaults to "follow_up", priority defaults to "medium".

ParameterTypeRequiredDescription
titlestringrequiredTask title
descriptionstringoptionalTask description
prioritystringoptional"high", "medium", or "low"
deadlinestringoptionalDue date (ISO datetime)
contactIdstringoptionalRelated contact UUID
typestringoptional"follow_up", "call", "email", "meeting", or "other"

Response shape: {"created": true, "task": {id, title, type, priority, deadline}}

complete_taskwrite

Mark a task as completed.

ParameterTypeRequiredDescription
taskIdstringrequiredTask UUID

Response shape: {"completed": true, "task": {id, title, display_status}}

Category 5 of 16

Activities

get_contact_timelineread

Get the activity timeline for a contact — notes, emails, calls, meetings, and status changes in reverse-chronological order.

ParameterTypeRequiredDescription
contactIdstringrequiredContact UUID
limitnumberoptionalMax activities to return (default 20, max 50)

Response shape: {"activities": [{id, type, timestamp, content, fieldName, oldValue, userName}, ...], "count": number}

log_notewrite

Log a note on a contact, deal, or company.

ParameterTypeRequiredDescription
entityIdstringrequiredContact, deal, or company UUID
contentstringrequiredNote content
entityTypestringoptional"contact", "opportunity", or "company" (default: contact)

Response shape: {"logged": true, "activity": {id, activity_type, new_value, timestamp}}

Category 6 of 16

Email

Prerequisite: Gmail must be connected via OAuth. Go to Settings → Integrations → Gmail to connect. Email tools will return an error if no Google account is connected.

list_emailsread

List recent emails for a contact by their email address.

ParameterTypeRequiredDescription
contactEmailstringrequiredContact email address
limitnumberoptionalMax emails to return (default 10, max 20)

Response shape: {"emails": [{id, subject, snippet, from_email, from_name, to_emails, date, is_sent, is_read}, ...], "count": number}

search_emailsread

Search synced emails by keyword across subject, sender, and body.

ParameterTypeRequiredDescription
querystringrequiredSearch keywords
contactEmailstringoptionalFilter to/from a specific email address

Response shape: {"emails": [{id, subject, snippet, from, to, date, isRead}, ...], "count": number}

get_email_bodyread

Get the full body of an email by its ID.

ParameterTypeRequiredDescription
emailIdstringrequiredEmail UUID

Response shape: {id, subject, from_email, from_name, to_emails, date, body_text}. HTML is stripped to plain text automatically.

send_emailwrite

Send an email via the user's connected Gmail account.

ParameterTypeRequiredDescription
tostringrequiredRecipient email address
subjectstringrequiredEmail subject
bodystringrequiredEmail body (plain text or HTML)
replyToEmailIdstringoptionalEmail UUID to reply to (for threading)
Category 7 of 16

Slack

Prerequisite: Slack must be connected via OAuth at the organization level. Go to Settings → Integrations → Slack. Slack tools will return an error if no Slack workspace is connected.

search_slackread

Search Slack messages across all channels. Supports Slack search syntax (e.g. in:#channel).

ParameterTypeRequiredDescription
querystringrequiredSearch query
countnumberoptionalNumber of results (default 10, max 50)
list_slack_channelsread

List Slack channels the bot has access to.

ParameterTypeRequiredDescription
limitnumberoptionalMax channels to return (default 50)
read_slack_channelread

Read recent messages from a Slack channel.

ParameterTypeRequiredDescription
channelstringrequiredChannel ID or name (e.g. "C01ABCDEF" or "general")
limitnumberoptionalNumber of messages (default 20, max 50)
post_slack_messagewrite

Post a message to a Slack channel.

ParameterTypeRequiredDescription
channelstringrequiredChannel ID or name
textstringrequiredMessage text (supports Slack markdown)
send_slack_dmwrite

Send a direct message to a Slack user by their email address.

ParameterTypeRequiredDescription
userEmailstringrequiredSlack user email address
textstringrequiredMessage text
Category 8 of 16

Calendar

Prerequisite: Google Calendar must be connected via the same Gmail OAuth flow. Go to Settings → Integrations → Gmail. Calendar tools will return an error if no Google account is connected.

list_calendar_eventsread

List upcoming events from the user's Google Calendar.

ParameterTypeRequiredDescription
timeMinstringoptionalStart of time range (ISO datetime). Defaults to now.
timeMaxstringoptionalEnd of time range (ISO datetime). Defaults to end of today.
maxResultsnumberoptionalMax events to return (default 10, max 50)
create_calendar_eventwrite

Create a new event on Google Calendar. Adds a Google Meet link by default.

ParameterTypeRequiredDescription
summarystringrequiredEvent title
startTimestringrequiredStart time (ISO datetime)
endTimestringrequiredEnd time (ISO datetime)
descriptionstringoptionalEvent description
locationstringoptionalEvent location
attendeesstring[]optionalAttendee email addresses
addMeetLinkbooleanoptionalAdd Google Meet link (default true)
update_calendar_eventwrite

Update an existing Google Calendar event. Only include fields you want to change.

ParameterTypeRequiredDescription
eventIdstringrequiredGoogle Calendar event ID
summarystringoptionalNew event title
startTimestringoptionalNew start time (ISO datetime)
endTimestringoptionalNew end time (ISO datetime)
descriptionstringoptionalNew description
locationstringoptionalNew location
attendeesstring[]optionalUpdated attendee emails (replaces full list)
delete_calendar_eventwrite

Delete a Google Calendar event.

ParameterTypeRequiredDescription
eventIdstringrequiredGoogle Calendar event ID
Category 9 of 16

Prospecting

prospect_searchread

Search the live web for companies and people matching prospecting criteria using AI-powered web search. Returns structured prospect data ready for CRM import.

ParameterTypeRequiredDescription
querystringrequiredNatural language search, e.g. "SaaS companies in Austin with 50-200 employees"
countnumberoptionalNumber of prospects to find (1-25, default 10)
batch_create_contactswrite

Bulk-create multiple contacts from prospecting results. Deduplicates by email. Maximum 25 contacts per call.

ParameterTypeRequiredDescription
contactsobject[]requiredArray of contacts to create (1-25). Each: {name (required), email, company, title, linkedIn, website, location, industry, signal}
Category 10 of 16

Lists

add_to_listwrite

Add a contact to a named list (e.g. "Q1 Leads", "Conference Attendees"). Creates the list if it doesn't exist.

ParameterTypeRequiredDescription
contactIdstringrequiredContact UUID
listNamestringrequiredList name
remove_from_listwrite

Remove a contact from their current named list.

ParameterTypeRequiredDescription
contactIdstringrequiredContact UUID
Category 11 of 16

Forecast & Risk

get_forecastread

Get the sales forecast with weighted pipeline, committed/best-case breakdown, and top deals.

No parameters required.

get_deal_risksread

Identify at-risk deals based on stale activity, overdue close dates, and deal age.

No parameters required.

Category 12 of 16

Automations

list_automationsread

List workflow automations with trigger info and enabled status.

ParameterTypeRequiredDescription
enabledOnlybooleanoptionalIf true, only return enabled automations
create_automationwrite

Create a workflow automation. Supported trigger types: stage_change, field_change, new_record, time_based. Supported action types: create_task, send_notification, update_field, send_slack.

ParameterTypeRequiredDescription
namestringrequiredAutomation name
triggerobjectrequiredTrigger config: {type, entity, field?, from?, to?}
actionsobject[]requiredArray of actions to execute
descriptionstringoptionalOptional description
Example — notify on stage change
{
  "name": "Notify on Won",
  "trigger": { "type": "stage_change", "entity": "opportunity", "to": "Won" },
  "actions": [{ "type": "send_slack", "channel": "#deals", "message": "Deal closed!" }]
}
toggle_automationwrite

Enable or disable an automation.

ParameterTypeRequiredDescription
automationIdstringrequiredAutomation UUID
enabledbooleanrequiredtrue to enable, false to disable
Category 13 of 16

Pipeline Intelligence

work_my_pipelineread

Analyze active pipeline and return prioritized actions with email context. This is the highest-signal tool for understanding what to do next in your sales workflow.

No parameters required.

get_morning_briefingread

Get a daily briefing with pipeline status, recent emails, and upcoming calendar events.

No parameters required.

Category 14 of 16

Reporting

get_activity_reportread

Get activity metrics for the current user: calls, emails, notes, and meetings over a date range.

ParameterTypeRequiredDescription
daysnumberoptionalNumber of days to look back (default 30)
Category 15 of 16

Comments

get_commentsread

Get all comments on an activity (note, email, call, etc.).

ParameterTypeRequiredDescription
activityIdstringrequiredActivity UUID
add_commentwrite

Add a comment on an activity (note, email, call, etc.).

ParameterTypeRequiredDescription
activityIdstringrequiredActivity UUID to comment on
contentstringrequiredComment text
Category 16 of 16 (part 1)

Calls & WhatsApp

get_call_recordsread

Get call history for a contact, including duration, recordings, and AI summaries. Omit contactId to get all calls.

ParameterTypeRequiredDescription
contactIdstringoptionalContact UUID — omit to get all calls
limitnumberoptionalMax records (default 20)
send_whatsappwrite

Send a WhatsApp message to a phone number.

ParameterTypeRequiredDescription
tostringrequiredPhone number with country code (e.g. +1234567890)
bodystringrequiredMessage text
contactIdstringoptionalContact UUID to link the message
Category 16 of 16 (part 2)

Custom Fields & Bulk Operations

update_custom_fieldswrite

Update custom fields (stored in a JSONB data column) on a contact. Merges with existing data — only specified keys are changed.

ParameterTypeRequiredDescription
contactIdstringrequiredContact UUID
fieldsobjectrequiredKey-value pairs to set (e.g. {"jobTitle": "VP Sales", "linkedIn": "..."})

Response shape: {"updated": true, "contactId": "uuid", "fields": ["jobTitle", "linkedIn"]}

bulk_update_contactswrite

Update a field on multiple contacts at once. Maximum 100 contacts per call.

ParameterTypeRequiredDescription
contactIdsstring[]requiredArray of contact UUIDs (max 100)
updatesobjectrequiredFields to update (e.g. {"status": "customer", "company": "Acme"})

Response shape: {"updated": true, "count": number}

bulk_delete_contactswrite

Delete multiple contacts at once. Irreversible. Maximum 100 per call.

ParameterTypeRequiredDescription
contactIdsstring[]requiredArray of contact UUIDs (max 100)

Response shape: {"deleted": true, "count": number}

Errors

The API returns errors at two levels: HTTP-level for auth failures, and JSON-RPC-level for protocol and tool errors.

HTTP errors

StatusCause
401Missing Authorization header, invalid token, or revoked key.
500Unhandled server error. The body contains a JSON-RPC error envelope.

JSON-RPC errors

JSON-RPC protocol errors use standard error codes in the response body:

CodeMeaningWhen it happens
-32601Method not foundYou called a method other than initialize, tools/list, or tools/call.
-32602Unknown tool / invalid paramsThe name in tools/call does not match any tool in MCP_TOOLS.
-32603Internal errorAn uncaught exception inside the server. Transient — retry is appropriate.

Tool-level errors

When a tool fails (e.g. contact not found, missing required field, integration not connected), it returns an error inside the normal successful JSON-RPC response:

Tool error example
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [{
      "type": "text",
      "text": "{\"error\": \"Contact not found\"}"
    }]
  }
}

Always parse result.content[0].text as JSON and check for an error key before reading the success fields.

Integration Prerequisites

Some tools require external service connections that must be set up through the SalesSheet web UI first. API keys cannot configure these connections — they inherit the connected integrations of the user who generated the key.

ToolsPrerequisiteWhere to connect
list_emails, search_emails, get_email_body, send_email, list_calendar_events, create_calendar_event, update_calendar_event, delete_calendar_event Gmail (Google OAuth) Settings → Integrations → Gmail
search_slack, list_slack_channels, read_slack_channel, post_slack_message, send_slack_dm Slack OAuth (org-level) Settings → Integrations → Slack
enrich_contact Enrichment credits Each call consumes 1 credit. Check balance at Settings → Billing.

Limits & Scopes

Reseller & Programmatic Provisioning

API keys are per-user and must be generated through the web UI at Settings → API & MCP. There is currently no endpoint for programmatic key creation, org-level master keys, or reseller provisioning.

If you need programmatic key provisioning for a multi-tenant integration or reseller use case, contact hello@salessheets.ai.

Changelog

April 2026
Initial public documentation
First public release of the SalesSheet developer docs. Documents the MCP API at protocol version 2024-11-05 with 54 tools across 16 categories. API itself has been available since February 2026.