Query Leads
Paginate the leads in your workspace, sorted by creation date.
Returns the leads in the authenticated workspace, sorted by creation date — most recent first by default. Each item has the same shape as Get lead, plus its created_at date.
The list is cursor-paginated: each response includes meta.next_cursor — pass it back as cursor (with the same sort and filters) to fetch the next page, until meta.has_more is false.
Filters are passed as a JSON body, so identifier arrays (company_domain, company_linkedin_handle, company_linkedin_url) are not bound by URL length limits. An empty body returns the first page of every lead in your workspace.
Request body
| Field | Type | Description |
|---|---|---|
| cursor | string | Opaque pagination token from the previous response (meta.next_cursor). Omit it for the first page. Keep the same sort and filters while paginating. |
| limit | integer | Number of items per page (default 25, maximum 100). |
| date_from | string | ISO 8601 timestamp. Include leads created at or after this date. |
| date_to | string | ISO 8601 timestamp. Include leads created at or before this date. |
| sort | string | Sort order. Leads are sorted by creation date only. Valid values: created_at:desc (default), created_at:asc. |
| countries | string[] | Only leads located in one of these countries. Use the country names returned by GET /workspace-leads/locations. Native JSON array. Combined with cities (a lead matches if it is in one of the countries OR one of the cities). |
| cities | object[] | Only leads located in one of these cities. Each entry is { "name": "Paris", "country": "France" } — the country pairing keeps "Paris, France" and "Paris, US" distinct. Use the values returned by GET /workspace-leads/locations. |
| company_id | integer | Only leads whose current company is this company — pass the company.id returned on leads, or the company_id returned by the other v2 endpoints. Takes priority over all identifier fields below. An id that is not in your workspace returns an empty page. |
| company_ids | integer[] | Only leads whose current company is one of these companies. Pass workspace company ids — the company.id returned on leads, or an id from Search companies. Merged with company_id. Native JSON array. Maximum 100 values. |
| company_domain | string[] | Only leads whose current company matches one of these domains (e.g. acme.com). Native JSON array. Maximum 100 values. See company_id for filter priority. |
| company_linkedin_handle | string[] | Only leads whose current company matches one of these LinkedIn handles (slug, e.g. acme-corp). Native JSON array. Maximum 100 values. See company_id for filter priority. |
| company_linkedin_url | string[] | Only leads whose current company matches one of these LinkedIn page URLs. Native JSON array. Maximum 100 values. See company_id for filter priority. |
A company filter that matches no company in your workspace returns an empty page, not an error.
Example request
curl -X POST "https://api.getsillage.com/api/v2/leads/query" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"limit":10,"company_domain":["acme.com"]}'Example response
{
"data": [
{
"id": 123,
"first_name": "Jane",
"last_name": "Doe",
"linkedin_url": "https://www.linkedin.com/in/janedoe",
"linkedin_handle": "janedoe",
"linkedin_headline": "VP Sales at Acme",
"avatar_url": "https://example.com/avatar.png",
"email": "jane.doe@acme.com",
"phone": "+33 1 23 45 67 89",
"position": "VP Sales",
"location": "Paris, France",
"geo": {
"city": "Paris",
"region": "Île-de-France",
"country": "France",
"country_code": "FR"
},
"company": {
"id": 789,
"name": "Acme",
"domain": "acme.com",
"linkedin_url": "https://www.linkedin.com/company/acme",
"linkedin_handle": "acme",
"activity_summary": "Acme builds enterprise sales software.",
"employee_range": "201-500",
"location": "Paris, France"
},
"experiences": [
{
"title": "VP Sales",
"company_name": "Acme",
"company_linkedin_url": "https://www.linkedin.com/company/acme",
"location": "Paris, France",
"start_date": "2022-03-01T00:00:00.000Z",
"end_date": null,
"is_current": true
}
],
"created_at": "2026-06-12T09:15:00.000Z"
}
],
"meta": {
"next_cursor": "eyJjcmVhdGVkQXQiOiIyMDI2LTA2LTEyVDA5OjE1OjAwLjAwMFoiLCJpZCI6MTIzfQ==",
"has_more": true,
"resolved_companies": [
{
"company_id": 789,
"matched_by": "domain",
"identifier": "acme.com"
}
]
}
}Response fields
Each item carries the same fields as Get lead — profile display fields, structured geo, the resolved current company, and experiences — plus:
| Field | Type | Description |
|---|---|---|
| created_at | string or null | When the lead was added to your workspace — the date the list is sorted on. |
As on Get lead, all profile fields are null when the lead has no linked profile, and company is null when the current company cannot be resolved — neither case is an error. Each item also carries the lead's email and phone (both null when not known).
meta.next_cursor is the pagination token for the next page — pass it back as cursor in the next request. It is null, and meta.has_more is false, when there is no next page.
meta.resolved_companies lists the companies matched from a company filter, with the same semantics as on Query Contents. When no company filter is supplied, it is an empty array.
Response headers
| Header | Description |
|---|---|
| X-Request-Id | Request UUID for debugging and support. |
| X-Response-Time | Server response time. |