Browse leads
POST /api/v1/leads/browse
Cost: Free — contact details are masked
The middle step between counts and a bulk export: look at the rows, pick the ones worth paying for, reveal those. Charges nothing, exactly like the app’s finder. Leads this account has already revealed are dropped from the results.
Try it
curl https://app.leadsonar.io/api/v1/leads/browse \
-H "X-API-Key: $LS_KEY" \
-H "Content-Type: application/json" \
-d '{
"jobTitles": ["Head of Sales"],
"exactMatch": true,
"industry": ["Software Development"],
"companySize": ["51-200"],
"country": ["US"],
"page": 1,
"limit": 2
}'Authorizations
Section titled “Authorizations ”Request Body required
Section titled “Request Body required ”Same filters as /leads/search, plus paging.
object
ISO country codes. The source is ~99.9% US.
Free text, whole-word matched against the job title.
Matched against the company description, not the title.
Cap contacts per company.
Page in order. A cold jump to a deep page walks forward and is slower.
Company type, derived from each company’s industry (the source has no ownership field). Values OR together. Public (listed) company filtering is not available yet; sending “public” or any other value returns 400 with code COMPANY_TYPE_NOT_AVAILABLE or UNKNOWN_COMPANY_TYPE.
Match jobTitles (and keywords) as whole words. Without it titles match as substrings, so “CFO” can hit unrelated titles. The app always sends true; set it yourself.
Drop anyone whose job title contains any of these words, e.g. [“intern”, “assistant”].
Example
{ "jobTitles": ["Head of Sales"], "exactMatch": true, "industry": ["Software Development"], "companySize": ["51-200"], "country": ["US"], "page": 1, "limit": 2}Responses
Section titled “ Responses ”A page of masked leads
object
Null when the page came back short — that is the end.
A lead as the app’s browse page shows it. Email, last name, company domain and LinkedIn URL are withheld until the row is revealed.
object
Feed this to /leads/reveal.
Masked, e.g. “J.”
Masked, e.g. ”•••@•••.org”
Masked.
Null until revealed.
Null until revealed.
Explains estimates or masking for this page, when relevant.
Example
{ "page": 1, "limit": 2, "returned": 2, "total": 179984, "total_is_exact": false, "total_is_estimate": true, "next_page": 2, "leads": [ { "id": "3f1c2a90-0000-4000-8000-000000000001", "firstName": "Jordan", "lastName": "Reyes", "fullName": "Jordan Reyes", "email": "•••@•••.com", "phone": "+1512****10", "companyName": "Example Software Inc.", "companyDomain": null, "jobTitle": "Head Of Sales Amer", "seniority": "", "department": "", "country": "US", "countryCode": "US", "state": "TX", "city": "Austin", "companySize": "101 to 250", "linkedinUrl": null, "industryName": "Software Development", "categoryName": null }, { "id": "3f1c2a90-0000-4000-8000-000000000002", "firstName": "Priya", "lastName": "Natarajan", "fullName": "Priya Natarajan", "email": "•••@•••.com", "phone": null, "companyName": "Northwind Analytics", "companyDomain": null, "jobTitle": "Head Of Discovery Sales/ Engagement Manager", "seniority": "", "department": "", "country": "US", "countryCode": "US", "state": "", "city": "", "companySize": "101 to 250", "linkedinUrl": null, "industryName": "Software Development", "categoryName": null } ], "note": "Browsing is free and returns masked rows. Email, last name, company domain and LinkedIn URL unlock via POST /api/v1/leads/reveal, which charges credits per NEW lead exactly as the app does. Leads you have already revealed are dropped from these results."}Lead source unavailable (LEADS_SOURCE_DOWN)
object
Human-readable error message
Additional details