Count leads
Count the leads that match filters.
Returns how many leads of your workspace match the filters. It takes exactly the filters of Query leads, in the same JSON body, without cursor, limit and sort.
It counts the same leads as Query leads returns: the ones your Sillage dashboard shows, prospects only, with expired leads, leads without a profile and leads outside your ideal customer profile left out. This is why the count can differ from the number of contacts in your CRM.
Route
Access modes
Use a workspace API key. The workspace is inferred from the key.
Authorization: Bearer sk_live_...Body parameters
All filters are optional; an empty body counts every lead. The four company filters add up: a lead matches when its company is any of the company_ids, domains, LinkedIn handles or LinkedIn URLs you send. A value that matches no company in your workspace matches nothing, so the count is 0, never an error. Company filters combine with every other filter, and all of those have to match.
| Parameter | Type | Description |
|---|---|---|
| created_at_from | string | Only leads created at or after this moment, the moment itself included. ISO 8601 date and time with a UTC offset, for example 2026-09-01T00:00:00Z. A date without a time is refused with 422. |
| created_at_to | string | Only leads created at or before this moment, the moment itself included. ISO 8601 date and time with a UTC offset, for example 2026-09-30T23:59:59Z. A date without a time is refused with 422. |
| company_ids | array of integer | Only leads whose company is one of these companies. Up to 100 company IDs, as returned by the company endpoints and by a lead's company.id. |
| company_domains | array of string | Only leads whose company has one of these website domains, for example acme.com. Up to 100 values. |
| company_linkedin_handles | array of string | Only leads whose company has one of these LinkedIn handles (the last part of the LinkedIn page address). Up to 100 values. |
| company_linkedin_urls | array of string | Only leads whose company has one of these LinkedIn page URLs. Up to 100 values. |
| countries | array of string | Only leads located in one of these countries, for example ["France", "Germany"]. Up to 100 values. Combined with cities: a lead matches when it is in one of the countries or one of the cities. |
| cities | array of object | Only leads located in one of these cities. Each city is an object { "name", "country" }, so Paris, France and Paris, United States stay distinct. Up to 100 values. |
Example request
curl -X POST "https://api.getsillage.com/api/v3/leads/count" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"company_domains": [
"acme.com"
],
"countries": [
"France"
]
}'Success response
Status: 200 OK
{
"data": {
"total": 42
}
}Response fields
| Field | Type | Description |
|---|---|---|
| data.total | integer | The number of leads that match. |
Errors
| Status | Meaning |
|---|---|
| 401 | The API key is missing or invalid. |
| 422 | A filter is not known or not valid, or a date has no time. A range that ends before it starts (created_at_from after created_at_to) is refused with the code invalid_date_range; errors.created_at_from says "must be on or before created_at_to". |
| 429 | Rate limit exceeded. |
| 500 | An unexpected server error occurred. |
Error responses use RFC 9457 problem documents with Content-Type: application/problem+json. type is always about:blank; code tells one problem from another, detail says what went wrong this time, and errors names the field at fault.