API reference
Automate Saleso from any tool
The Saleso API lets you add leads to your dialer, update them as they move, send call recordings for AI analysis, read calls and customers, and get an HTTP request the moment something happens. It is the same API the Saleso apps for Make and Zapier use, so anything they do, your own code can do too.
POSTMethodhttps://try.saleso.ioBase URL/api/make/create-lead/Endpoint{teamId}Your Team IDx-api-key: slso_••••••••Header · your API keyWhat you can automate
- WebhooksGet a POST when a call is analyzed, a lead is created or changes status, a call ends, and more.
- LeadsCreate, find and update dialer leads, list a campaign’s open and closed leads, and read your lead fields and statuses.
- Campaigns & ListsList your active dialer campaigns and lead lists, for the campaign_id and list_id lead actions take.
- CallsSend call recordings to Saleso for transcription and AI analysis, and read calls with their analysis.
- Customers & DocumentsFind, list, create and update customers, and store documents on a customer.
- Deny ListManage the do-not-call deny list: block a number everywhere or in chosen campaigns, list entries, and remove them.
- Team & ConnectionCheck that a Team ID and API key are valid, and list your team’s members.
- AIRun a Saleso AI agent on your own prompt with calls and a customer as context, and list the available agents.
33 endpoints in total.
Authentication
Each request needs two credentials from your Saleso team:
- Team ID, in the URL path where the reference shows
{teamId}. - API key, in the
x-api-keyheader.Authorization: Bearer <key>is accepted too.
A team manager finds both in Saleso under Settings › Integrations › Zapier (or Make.com), or in the dialer under Settings › Connections › Automations. The key is checked against that Team ID only: a key from another team is rejected with 401.
Your team has one key. Make, Zapier and your own code all use it, so generating a new key disconnects every one of them until they are given the new key. Keep it out of client-side code and public repositories.
To check a Team ID and key before you use them, call Test Connection.
curl "https://try.saleso.io/api/make/health/$SALESO_TEAM_ID" \
-H "x-api-key: $SALESO_API_KEY"Requests & responses
- All requests go to
https://try.saleso.ioover HTTPS. - Send
GETandDELETEparameters in the query string, andPOSTandPATCHbodies as JSON withContent-Type: application/json. The one file upload usesmultipart/form-data. - Responses are JSON. Dates are ISO 8601 strings in UTC.
- IDs are UUIDs, except list IDs (your dialer's own list IDs) and webhook subscription IDs (
wh_…). - Phone numbers are accepted in any format and matched as Israeli numbers:
+972 50-123-4567and0501234567are the same lead. - List endpoints page with
limitandoffset. Where the response hashas_more, keep going while it is true; otherwise stop at a short page. - Statuses, lead fields and agent names are your team's own and are often in Hebrew. Read them from List Statuses and List Lead Fields instead of typing them.
Errors
Errors use standard HTTP status codes and a JSON body with an error message. Some add a hint, or the value that was rejected.
Messages that come from the dialer's own rules (for example a status that needs a callback date) are in Hebrew. Those errors also carry a stable machine-readable code, such as LEAD_NOT_FOUND, CALLBACK_DATE_REQUIRED or CAMPAIGN_INACTIVE. Branch on the HTTP status and the code, never on the message text.
200Success. The body is the endpoint's result. Some list endpoints answer 200 with"found": falseor per-row errors; check the body.400The request is missing a required field or a value is invalid.errorsays which.401Missing API keyorInvalid API key: the key is absent, wrong, revoked, or belongs to another team.403The feature is turned off for your team (for example customer documents).404The record does not exist in your team (a customer, a lead for comments, a set of call IDs).413Your team's document storage is full.429Over the per-minute budget for that endpoint. Wait forRetry-After(60 seconds).500Unexpected server error. Safe to retry reads; check before retrying writes.
{
"error": "Missing required field: campaign_id"
}{
"error": "Customer not found",
"hint": "Provide at least one of customer_id, customer_phone, or customer_email"
}Rate limits
Limits are counted per team, per minute, and only on the endpoints below. Over the limit, the request is answered 429 with Retry-After: 60. Requests rejected for a bad key do not count.
| Endpoint | Requests per minute, per team |
|---|---|
| Send Call Recording | 30 |
| Run AI Agent | 30 |
| Find Lead | 300 |
| Get Open Leads | 300 |
| Get Closed Leads | 300 |
Endpoints with the same limit share one budget: Send Call Recording and Run AI Agent together get 30 a minute, because each request starts paid processing, and the lead lookups together get 300. Other endpoints have no per-minute limit today; usage is monitored, so keep polling reasonable and prefer webhooks to frequent polling.