Find people
curl --request POST \
--url https://api.airscale.io/v1/find-people \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": {
"jobTitle": {
"include": [
"Revenue Operations Manager"
]
},
"location": {
"include": [
"Example Country"
]
}
}
}
'const url = 'https://api.airscale.io/v1/find-people';
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: {
jobTitle: {include: ['Revenue Operations Manager']},
location: {include: ['Example Country']}
}
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://api.airscale.io/v1/find-people"
payload = { "query": {
"jobTitle": { "include": ["Revenue Operations Manager"] },
"location": { "include": ["Example Country"] }
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"total": 124,
"leads": [
{
"firstname": "Example",
"lastname": "Person",
"headline": "Revenue Operations Manager at Example Company",
"description": "Synthetic profile summary for API documentation.",
"profileUrl": "https://www.linkedin.com/in/example-person-000000",
"jobTitle": "Revenue Operations Manager",
"jobDescription": "Synthetic role description.",
"jobStartDate": "03-2021",
"address": "Example City, Example State, United States",
"companyName": "Example Company",
"companyUrn": "urn:li:fsd_company:100000002",
"companyUrl": "https://www.linkedin.com/company/example-company-000000",
"companyWebsite": "https://www.example.com",
"companyDescription": "Synthetic company description for API documentation.",
"companySize": 4,
"companyIndustry": "Software Development",
"companyAddress": "1 Example Street, Example City, Example State, United States"
}
],
"next_cursor": "fp_synthetic_cursor"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Find people
Search people using person, role, and company filters. Rate limit: 6 requests per second per workspace.
POST
/
v1
/
find-people
Find people
curl --request POST \
--url https://api.airscale.io/v1/find-people \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": {
"jobTitle": {
"include": [
"Revenue Operations Manager"
]
},
"location": {
"include": [
"Example Country"
]
}
}
}
'const url = 'https://api.airscale.io/v1/find-people';
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: {
jobTitle: {include: ['Revenue Operations Manager']},
location: {include: ['Example Country']}
}
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://api.airscale.io/v1/find-people"
payload = { "query": {
"jobTitle": { "include": ["Revenue Operations Manager"] },
"location": { "include": ["Example Country"] }
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"total": 124,
"leads": [
{
"firstname": "Example",
"lastname": "Person",
"headline": "Revenue Operations Manager at Example Company",
"description": "Synthetic profile summary for API documentation.",
"profileUrl": "https://www.linkedin.com/in/example-person-000000",
"jobTitle": "Revenue Operations Manager",
"jobDescription": "Synthetic role description.",
"jobStartDate": "03-2021",
"address": "Example City, Example State, United States",
"companyName": "Example Company",
"companyUrn": "urn:li:fsd_company:100000002",
"companyUrl": "https://www.linkedin.com/company/example-company-000000",
"companyWebsite": "https://www.example.com",
"companyDescription": "Synthetic company description for API documentation.",
"companySize": 4,
"companyIndustry": "Software Development",
"companyAddress": "1 Example Street, Example City, Example State, United States"
}
],
"next_cursor": "fp_synthetic_cursor"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Search for people using person, role, current-company, and past-experience filters, then page through the matching lead records.
Search returns at most 100 leads per request. When
Use
The Search and Count people operations share a limit of 6 requests per second per workspace. Search costs 0.1 credits per returned lead; empty result pages are not charged. Count accepts the same
query for free.next_cursor is not null, send it unchanged as cursor with the same query. Do not derive or edit cursor contents.
After a 429, wait for the next second and retry with bounded exponential backoff. Failed searches do not return charged leads. For temporary 502 or 503 responses, use a limited number of retries with increasing delays; contact support if errors persist.
Count matching people
UsePOST https://api.airscale.io/v1/find-people/count to estimate this audience before retrieving leads. Send the same query object and Bearer authorization as Find people, with Content-Type: application/json. Omit size and cursor: Count has no pagination fields.
Count is free. It neither reserves nor debits credits and returns only total, the number of matching people. It shares the search rate limit above; after a 429, retry with bounded backoff.
Count request and response
Count request and response
Count request
{
"query": {
"jobTitle": {
"include": ["Founder"]
}
}
}
Count response
{
"total": 1250
}
Combining past-experience filters
All past-experience filters apply to the same prior role. For example, combiningpastJobTitle.include: ["Engineer"] with pastCompanyName.include: ["Example Company"] finds people who worked as an engineer at that company. It does not match someone who was an engineer at another company and held a different role at Example Company.
pastCompany.location accepts country names and ISO alpha-2 country codes, just like location and currentCompany.location.
Lead fields
leads contains public person records. The following fields are common, not a guarantee that every field is present or non-null. Preserve additional public fields your integration needs and tolerate missing values.
| Field | Meaning |
|---|---|
firstname, lastname | Person’s first and last names. |
headline, description | Profile headline and description. |
profileUrl | LinkedIn person profile URL. |
jobTitle | Current role title. |
jobStartDate | Current-role start date, for example 03-2024. |
address | Person location. |
companyName | Current employer name. |
companyUrl, companyWebsite | Employer LinkedIn URL and website. |
companySize | Available company headcount. |
companyIndustry, companyAddress | Employer industry and location. |
next_cursor from the response envelope for pagination. Do not construct a cursor from a lead’s fields.
Next step
Use the samequery to retrieve the counted audience, Find companies to discover organizations, or Rate limits before adding concurrency.Authorizations
Use an Airscale workspace API key. Never expose the key in client-side code.
Body
application/json
Provide at least one supported query filter. Search pagination accepts a page size from 1 to 100 and an optional opaque cursor.
Show child attributes
Show child attributes
A page size from 1 through 100 supplied as an integer JSON number or one of the equivalent canonical decimal strings. OpenAPI intentionally uses canonical decimal strings even though runtime Number() accepts additional JS-coercible spellings.
Required range:
1 <= x <= 100An opaque value returned as next_cursor by the preceding page. Send it unchanged.
Minimum string length:
1