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.

POST/api/v2/leads/query

Request body

FieldTypeDescription
cursorstringOpaque pagination token from the previous response (meta.next_cursor). Omit it for the first page. Keep the same sort and filters while paginating.
limitintegerNumber of items per page (default 25, maximum 100).
date_fromstringISO 8601 timestamp. Include leads created at or after this date.
date_tostringISO 8601 timestamp. Include leads created at or before this date.
sortstringSort order. Leads are sorted by creation date only. Valid values: created_at:desc (default), created_at:asc.
countriesstring[]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).
citiesobject[]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_idintegerOnly 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_idsinteger[]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_domainstring[]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_handlestring[]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_urlstring[]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:

FieldTypeDescription
created_atstring or nullWhen 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

HeaderDescription
X-Request-IdRequest UUID for debugging and support.
X-Response-TimeServer response time.

On this page