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.
- Base URL:
https://app.salessheets.ai/api/mcp - Protocol: MCP JSON-RPC 2.0 (
protocolVersion: 2024-11-05) - Methods:
initialize,tools/list,tools/call - Auth:
Authorization: Bearer ss_live_<token> - Tools: 54 tools across 16 categories
- Rate limits: None enforced beyond Supabase infrastructure defaults. No published per-minute caps.
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
- Log in at app.salessheets.ai
- Go to Settings → API & MCP
- Click Generate New Key and give it a name (e.g. "Claude Desktop")
- 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:
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
- Maximum 10 active keys per user account.
- Scopes:
readandwrite— both are granted to every key today. There is no read-only key option. - Keys never expire unless explicitly revoked.
Quickstart
All examples use curl. Replace ss_live_YOUR_KEY with your actual key from Settings → API & MCP.
1. Discover available tools
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 -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):
{
"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 -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 -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 -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
- Open Claude Desktop settings (gear icon)
- Click Developer in the sidebar, then Edit Config
- Paste this configuration (replace
YOUR_API_KEY):
{
"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
- Open Cursor Settings (Cmd+, / Ctrl+,)
- Navigate to MCP in the sidebar
- Click Add new MCP server and paste this configuration:
{
"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.
CRM — Contacts
List contacts in the CRM. Returns up to 20 contacts sorted by most recently updated.
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | number | optional | Max contacts to return (default 20, max 50) |
| search | string | optional | Search by name, email, or company |
Response shape: {"contacts": [...], "count": number}. Each contact: id, name, email, phone, company, status, created_at, updated_at.
{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "list_contacts", "arguments": { "limit": 10, "search": "Acme" } }
}Get a single contact by ID with full details including custom fields.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | required | Contact UUID |
Response shape: Full contact object — id, name, email, phone, company, status, data, created_at, updated_at. The data field contains custom JSONB fields.
{
"method": "tools/call",
"params": { "name": "get_contact", "arguments": { "id": "uuid-here" } }
}Search contacts by name, email, or company. Returns up to 10 matches.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | required | Search term |
Response shape: {"contacts": [...], "count": number}. Each contact: id, name, email, phone, company, status.
{
"method": "tools/call",
"params": { "name": "search_contacts", "arguments": { "query": "jane@example.com" } }
}Create a new contact in the CRM. Status defaults to "lead".
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | required | Full name |
| string | optional | Email address | |
| phone | string | optional | Phone number |
| company | string | optional | Company name |
Response shape: {"created": true, "contact": {id, name, email, company}}
{
"method": "tools/call",
"params": {
"name": "create_contact",
"arguments": { "name": "Jane Smith", "email": "jane@example.com", "company": "Acme" }
}
}Update an existing contact. Only include fields you want to change.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | required | Contact UUID |
| name | string | optional | Full name |
| string | optional | Email address | |
| phone | string | optional | Phone number |
| company | string | optional | Company name |
Response shape: {"updated": true, "contact": {id, name, email, company}}
Permanently delete a contact from the CRM.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | required | Contact UUID |
Response shape: {"deleted": true, "id": "uuid"}
Enrich a contact with LinkedIn, company, and web data. Consumes 1 enrichment credit.
| Parameter | Type | Required | Description |
|---|---|---|---|
| contactId | string | required | Contact 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.
CRM — Deals
List deals/opportunities in the pipeline, sorted by revenue descending.
| Parameter | Type | Required | Description |
|---|---|---|---|
| status | string | optional | Filter by stage name (e.g. "Qualified", "Won") |
| limit | number | optional | Max deals to return (default 20, max 50) |
Response shape: {"deals": [...], "count": number}. Each deal: id, opportunity, status, revenue, companyName, closeDate, priority, owner.
Get a single deal by ID with all fields.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | required | Deal UUID |
Response shape: Full deal object with all columns.
Get pipeline summary grouped by stage with counts and revenue.
No parameters required.
Response shape: {"stages": [{stage, count, revenue}, ...], "totalDeals": number, "totalRevenue": number}
{
"method": "tools/call",
"params": { "name": "get_pipeline_summary", "arguments": {} }
}Create a new deal/opportunity. Stage defaults to "Lead/New" if not provided.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | required | Deal name |
| revenue | number | optional | Deal value |
| stage | string | optional | Pipeline stage name |
| companyName | string | optional | Company name |
| closeDate | string | optional | Expected close date (ISO 8601) |
| contactId | string | optional | Related contact UUID |
Response shape: {"created": true, "deal": {id, opportunity, status, revenue, companyName}}
Update an existing deal. Only include fields you want to change.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | required | Deal UUID |
| name | string | optional | Deal name |
| revenue | number | optional | Deal value |
| stage | string | optional | Pipeline stage name |
| closeDate | string | optional | Expected close date (ISO 8601) |
Response shape: {"updated": true, "deal": {id, opportunity, status, revenue}}
Permanently delete a deal/opportunity.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | required | Deal UUID |
Response shape: {"deleted": true, "id": "uuid"}
CRM — Companies
List companies in the CRM sorted by most recently updated.
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | number | optional | Max companies to return (default 20, max 50) |
| search | string | optional | Search 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 a single company by ID with full details.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | required | Company UUID |
Response shape: Full company object including health_score, total_revenue, won_deals, last_activity_at and more.
Search companies by name, domain, or industry. Returns up to 10 matches.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | required | Search term |
Response shape: {"companies": [...], "count": number}
Create a new company record.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | required | Company name |
| domain | string | optional | Company domain (e.g. acme.com) |
| industry | string | optional | Industry |
| website | string | optional | Website URL |
| description | string | optional | Company description |
| size | string | optional | Company size range (e.g. "50-200") |
Response shape: {"created": true, "company": {id, name, domain, industry}}
Tasks
List tasks/to-dos. Filter by status, priority, or contact.
| Parameter | Type | Required | Description |
|---|---|---|---|
| status | string | optional | "pending", "completed", or "overdue" |
| priority | string | optional | "high", "medium", or "low" |
| limit | number | optional | Max tasks to return (default 20, max 50) |
Response shape: {"tasks": [...], "count": number}. Each task: id, title, type, display_status, priority, deadline, contact, description.
Create a new task or follow-up item. Type defaults to "follow_up", priority defaults to "medium".
| Parameter | Type | Required | Description |
|---|---|---|---|
| title | string | required | Task title |
| description | string | optional | Task description |
| priority | string | optional | "high", "medium", or "low" |
| deadline | string | optional | Due date (ISO datetime) |
| contactId | string | optional | Related contact UUID |
| type | string | optional | "follow_up", "call", "email", "meeting", or "other" |
Response shape: {"created": true, "task": {id, title, type, priority, deadline}}
Mark a task as completed.
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskId | string | required | Task UUID |
Response shape: {"completed": true, "task": {id, title, display_status}}
Activities
Get the activity timeline for a contact — notes, emails, calls, meetings, and status changes in reverse-chronological order.
| Parameter | Type | Required | Description |
|---|---|---|---|
| contactId | string | required | Contact UUID |
| limit | number | optional | Max activities to return (default 20, max 50) |
Response shape: {"activities": [{id, type, timestamp, content, fieldName, oldValue, userName}, ...], "count": number}
Log a note on a contact, deal, or company.
| Parameter | Type | Required | Description |
|---|---|---|---|
| entityId | string | required | Contact, deal, or company UUID |
| content | string | required | Note content |
| entityType | string | optional | "contact", "opportunity", or "company" (default: contact) |
Response shape: {"logged": true, "activity": {id, activity_type, new_value, timestamp}}
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 recent emails for a contact by their email address.
| Parameter | Type | Required | Description |
|---|---|---|---|
| contactEmail | string | required | Contact email address |
| limit | number | optional | Max 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 synced emails by keyword across subject, sender, and body.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | required | Search keywords |
| contactEmail | string | optional | Filter to/from a specific email address |
Response shape: {"emails": [{id, subject, snippet, from, to, date, isRead}, ...], "count": number}
Get the full body of an email by its ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
| emailId | string | required | Email UUID |
Response shape: {id, subject, from_email, from_name, to_emails, date, body_text}. HTML is stripped to plain text automatically.
Send an email via the user's connected Gmail account.
| Parameter | Type | Required | Description |
|---|---|---|---|
| to | string | required | Recipient email address |
| subject | string | required | Email subject |
| body | string | required | Email body (plain text or HTML) |
| replyToEmailId | string | optional | Email UUID to reply to (for threading) |
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 Slack messages across all channels. Supports Slack search syntax (e.g. in:#channel).
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | required | Search query |
| count | number | optional | Number of results (default 10, max 50) |
List Slack channels the bot has access to.
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | number | optional | Max channels to return (default 50) |
Read recent messages from a Slack channel.
| Parameter | Type | Required | Description |
|---|---|---|---|
| channel | string | required | Channel ID or name (e.g. "C01ABCDEF" or "general") |
| limit | number | optional | Number of messages (default 20, max 50) |
Post a message to a Slack channel.
| Parameter | Type | Required | Description |
|---|---|---|---|
| channel | string | required | Channel ID or name |
| text | string | required | Message text (supports Slack markdown) |
Send a direct message to a Slack user by their email address.
| Parameter | Type | Required | Description |
|---|---|---|---|
| userEmail | string | required | Slack user email address |
| text | string | required | Message text |
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 upcoming events from the user's Google Calendar.
| Parameter | Type | Required | Description |
|---|---|---|---|
| timeMin | string | optional | Start of time range (ISO datetime). Defaults to now. |
| timeMax | string | optional | End of time range (ISO datetime). Defaults to end of today. |
| maxResults | number | optional | Max events to return (default 10, max 50) |
Create a new event on Google Calendar. Adds a Google Meet link by default.
| Parameter | Type | Required | Description |
|---|---|---|---|
| summary | string | required | Event title |
| startTime | string | required | Start time (ISO datetime) |
| endTime | string | required | End time (ISO datetime) |
| description | string | optional | Event description |
| location | string | optional | Event location |
| attendees | string[] | optional | Attendee email addresses |
| addMeetLink | boolean | optional | Add Google Meet link (default true) |
Update an existing Google Calendar event. Only include fields you want to change.
| Parameter | Type | Required | Description |
|---|---|---|---|
| eventId | string | required | Google Calendar event ID |
| summary | string | optional | New event title |
| startTime | string | optional | New start time (ISO datetime) |
| endTime | string | optional | New end time (ISO datetime) |
| description | string | optional | New description |
| location | string | optional | New location |
| attendees | string[] | optional | Updated attendee emails (replaces full list) |
Delete a Google Calendar event.
| Parameter | Type | Required | Description |
|---|---|---|---|
| eventId | string | required | Google Calendar event ID |
Prospecting
Search the live web for companies and people matching prospecting criteria using AI-powered web search. Returns structured prospect data ready for CRM import.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | required | Natural language search, e.g. "SaaS companies in Austin with 50-200 employees" |
| count | number | optional | Number of prospects to find (1-25, default 10) |
Bulk-create multiple contacts from prospecting results. Deduplicates by email. Maximum 25 contacts per call.
| Parameter | Type | Required | Description |
|---|---|---|---|
| contacts | object[] | required | Array of contacts to create (1-25). Each: {name (required), email, company, title, linkedIn, website, location, industry, signal} |
Lists
Add a contact to a named list (e.g. "Q1 Leads", "Conference Attendees"). Creates the list if it doesn't exist.
| Parameter | Type | Required | Description |
|---|---|---|---|
| contactId | string | required | Contact UUID |
| listName | string | required | List name |
Remove a contact from their current named list.
| Parameter | Type | Required | Description |
|---|---|---|---|
| contactId | string | required | Contact UUID |
Forecast & Risk
Get the sales forecast with weighted pipeline, committed/best-case breakdown, and top deals.
No parameters required.
Identify at-risk deals based on stale activity, overdue close dates, and deal age.
No parameters required.
Automations
List workflow automations with trigger info and enabled status.
| Parameter | Type | Required | Description |
|---|---|---|---|
| enabledOnly | boolean | optional | If true, only return enabled automations |
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.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | required | Automation name |
| trigger | object | required | Trigger config: {type, entity, field?, from?, to?} |
| actions | object[] | required | Array of actions to execute |
| description | string | optional | Optional description |
{
"name": "Notify on Won",
"trigger": { "type": "stage_change", "entity": "opportunity", "to": "Won" },
"actions": [{ "type": "send_slack", "channel": "#deals", "message": "Deal closed!" }]
}Enable or disable an automation.
| Parameter | Type | Required | Description |
|---|---|---|---|
| automationId | string | required | Automation UUID |
| enabled | boolean | required | true to enable, false to disable |
Pipeline Intelligence
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 a daily briefing with pipeline status, recent emails, and upcoming calendar events.
No parameters required.
Reporting
Get activity metrics for the current user: calls, emails, notes, and meetings over a date range.
| Parameter | Type | Required | Description |
|---|---|---|---|
| days | number | optional | Number of days to look back (default 30) |
Comments
Get all comments on an activity (note, email, call, etc.).
| Parameter | Type | Required | Description |
|---|---|---|---|
| activityId | string | required | Activity UUID |
Add a comment on an activity (note, email, call, etc.).
| Parameter | Type | Required | Description |
|---|---|---|---|
| activityId | string | required | Activity UUID to comment on |
| content | string | required | Comment text |
Calls & WhatsApp
Get call history for a contact, including duration, recordings, and AI summaries. Omit contactId to get all calls.
| Parameter | Type | Required | Description |
|---|---|---|---|
| contactId | string | optional | Contact UUID — omit to get all calls |
| limit | number | optional | Max records (default 20) |
Send a WhatsApp message to a phone number.
| Parameter | Type | Required | Description |
|---|---|---|---|
| to | string | required | Phone number with country code (e.g. +1234567890) |
| body | string | required | Message text |
| contactId | string | optional | Contact UUID to link the message |
Custom Fields & Bulk Operations
Update custom fields (stored in a JSONB data column) on a contact. Merges with existing data — only specified keys are changed.
| Parameter | Type | Required | Description |
|---|---|---|---|
| contactId | string | required | Contact UUID |
| fields | object | required | Key-value pairs to set (e.g. {"jobTitle": "VP Sales", "linkedIn": "..."}) |
Response shape: {"updated": true, "contactId": "uuid", "fields": ["jobTitle", "linkedIn"]}
Update a field on multiple contacts at once. Maximum 100 contacts per call.
| Parameter | Type | Required | Description |
|---|---|---|---|
| contactIds | string[] | required | Array of contact UUIDs (max 100) |
| updates | object | required | Fields to update (e.g. {"status": "customer", "company": "Acme"}) |
Response shape: {"updated": true, "count": number}
Delete multiple contacts at once. Irreversible. Maximum 100 per call.
| Parameter | Type | Required | Description |
|---|---|---|---|
| contactIds | string[] | required | Array 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
| Status | Cause |
|---|---|
| 401 | Missing Authorization header, invalid token, or revoked key. |
| 500 | Unhandled 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:
| Code | Meaning | When it happens |
|---|---|---|
| -32601 | Method not found | You called a method other than initialize, tools/list, or tools/call. |
| -32602 | Unknown tool / invalid params | The name in tools/call does not match any tool in MCP_TOOLS. |
| -32603 | Internal error | An 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:
{
"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.
| Tools | Prerequisite | Where 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
- Keys per user: Maximum 10 active Personal Access Tokens per user account.
- Scopes: Every key is granted both
readandwritescopes. There is no read-only key option today. - Rate limits: No per-API-key rate limits are enforced beyond Supabase Edge Functions infrastructure defaults. There is no published requests-per-minute cap.
- Key expiry: Keys do not expire. They remain valid until explicitly revoked.
- Data scope: Each key is scoped to the user who generated it. It can only read and write data belonging to that user's account.
- Tool limits:
batch_create_contactsmax 25 per call;bulk_update_contactsandbulk_delete_contactsmax 100 per call.
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
2024-11-05 with 54 tools across 16 categories. API itself has been available since February 2026.