Contacts
Retrieve a contact research request by external ID and external source. This endpoint allows you to look up contact research requests using identifiers from external systems (e.g., HubSpot contact ID).
Authorization
ApiKeyAuth API key authentication using Bearer token. Format: sk_live_ followed by a secure random string.
In: header
Query Parameters
The external identifier of the contact research request (e.g., HubSpot contact ID)
1 <= length <= 100The source system that provided the external ID (e.g., "hubspot")
1 <= length <= 50Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/contacts/research?externalId=hubspot_12345&externalSource=hubspot"{ "id": "cr_abc123def456", "status": "processing", "firstName": "John", "lastName": "Doe", "companyName": "Acme Corp", "companyDomain": "acme.com", "createdAt": "2024-01-15T10:30:00Z"}Submit contact details to create a new contact research request. The AI will gather information from LinkedIn, email services, and other data sources to provide comprehensive contact insights.
The research will be processed asynchronously. Use the returned contact research ID to check status via the GET endpoint, or configure a webhook to receive completion notifications.
Credits
Each research request charges 2 credits. Credits are deducted on success and released if the research fails.
Authorization
ApiKeyAuth API key authentication using Bearer token. Format: sk_live_ followed by a secure random string.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
First name of the contact
1 <= length <= 100Last name of the contact
1 <= length <= 100Name of the contact's company
1 <= length <= 200Company domain (e.g., "acme.com")
^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$1 <= length <= 253Contact profile URL of the contact (e.g., LinkedIn or other professional profile, optional)
urilength <= 500LinkedIn Sales Navigator profile URL of the contact (optional)
urilength <= 500Job title of the contact (optional)
1 <= length <= 200Optional webhook URL to receive notifications when processing completes
urilength <= 2048Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/contacts/research" \ -H "Content-Type: application/json" \ -d '{ "firstName": "John", "lastName": "Doe", "companyName": "Acme Corp", "companyDomain": "acme.com", "jobTitle": "VP of Sales" }'{ "id": "cr_abc123def456", "status": "processing", "createdAt": "2024-01-15T10:30:00Z"}Retrieve a contact research request by ID, including its status and results if completed. This endpoint returns the current state of the research request.
Authorization
ApiKeyAuth API key authentication using Bearer token. Format: sk_live_ followed by a secure random string.
In: header
Path Parameters
The unique identifier of the contact research request
Response Body
application/json
application/json
application/json
curl -X GET "https://example.com/v1/contacts/research/cr_abc123def456"{ "id": "cr_abc123def456", "status": "processing", "firstName": "John", "lastName": "Doe", "companyName": "Acme Corp", "companyDomain": "acme.com", "createdAt": "2024-01-15T10:30:00Z"}Search for contacts using LinkedIn Sales Navigator. Optionally scoped to one or more companies via companyLinkedInUrls. When multiple URLs are provided, each company is searched separately and results are merged and deduplicated.
Pagination: each request returns exactly one page (default size 25, max 100 via limit);
there is no server-side auto-fetch. Pass the previous response's nextCursor as cursor to
fetch the next page, together with the same limit the cursor was issued for — the
cursor marks where the next page starts, so replaying it at a different limit shifts the
window (offset remains accepted for existing callers; provide cursor or offset, not both).
Paging is capped at a 1000-result-per-search ceiling: a page STARTING at or past it is
rejected with 422, a page that merely runs past it is clamped to the remaining rows, and
nextCursor is omitted once the next page would start at the ceiling; narrow the search
filters instead of paging deeper.
Requirements:
- At least one search parameter must be provided:
companyLinkedInUrls,firstName,lastName,jobTitles,keywords,countries,departments, orseniorityLevels. - LinkedIn Sales Navigator connection is required for the API key owner
Response:
- If Sales Navigator is not connected, returns
salesNavConnected: falsewith empty contacts - If connected, returns matching contacts with profile information and pagination metadata
Authorization
ApiKeyAuth API key authentication using Bearer token. Format: sk_live_ followed by a secure random string.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
LinkedIn company URLs to scope the search (note: plural — pass an array even for a single company). Supports multiple companies; results are merged and deduplicated. Omit to search across all companies.
First name of the contact to search for
length <= 100Last name of the contact to search for
length <= 100Job titles to search for (plural — pass an array)
Keywords to search for in contact profiles (e.g., skills, technologies)
length <= 500Countries to filter contacts by location. Must be ISO 3166-1 alpha-2 codes (e.g., "US", "GB", "DE") — full country names are not accepted.
Department (function) filter using LinkedIn Sales Navigator taxonomy. Multiple values are OR'd together. Combined with other filters via AND. All values are treated as INCLUDED — exclusion is not currently supported.
Seniority level filter using LinkedIn Sales Navigator taxonomy. Multiple values are OR'd together. Combined with other filters via AND. All values are treated as INCLUDED — exclusion is not currently supported.
Maximum number of contacts to return per page
1 <= value <= 10025Zero-based offset for pagination. Mutually exclusive with cursor — provide one or the other. Pages starting at or past the 1000-result search ceiling are rejected with 422 and error code PAGE_BEYOND_CEILING (distinct from the connector-required 422); a page that merely runs past it is clamped to the remaining rows.
0 <= value0Paging handle from the previous response's nextCursor. The documented way to fetch the next page; mutually exclusive with offset. Never construct one yourself, and pass it back with the same limit it was issued for — the cursor marks where the next page starts, so a different limit shifts the window.
length <= 100Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/contacts/search" \ -H "Content-Type: application/json" \ -d '{ "companyLinkedInUrls": [ "https://linkedin.com/company/google" ], "jobTitles": [ "Engineering Manager", "VP Engineering" ], "countries": [ "US" ] }'{ "items": [ { "firstName": "John", "lastName": "Doe", "fullName": "John Doe", "role": "Engineering Manager", "linkedInSalesNavigatorProfileUrl": "https://www.linkedin.com/sales/lead/ACwAAABOW1gBQZCU123", "avatar": "https://media.licdn.com/...", "location": "San Francisco, California" }, { "firstName": "Jane", "lastName": "Smith", "fullName": "Jane Smith", "role": "VP of Engineering", "linkedInSalesNavigatorProfileUrl": "https://www.linkedin.com/sales/lead/ACwAAABOW1gBQZCU456", "location": "New York, New York" } ], "total": 150, "limit": 25, "offset": 0, "hasMore": true, "salesNavConnected": true, "nextCursor": "djE6MjU"}