# API key
Source: https://docs.prontohq.com/api-reference/API-key
## Get my API key
You need your personal API key to use the Pronto API, which you can generate [here](https://app.prontohq.com/settings/apis/keys).
# Company hiring (job postings)
Source: https://docs.prontohq.com/api-reference/endpoints/accounts/company-hiring
POST /accounts/company_hiring
Retrieve the list of open job postings for a given company
Get the list of open job postings indexed for a company using one company identifier (domain, company name, or LinkedIn URL). Results are sourced from TheirStack.
## Credits and rate limits
* Credits: **3 credits** per request
* Rate limit: **20 requests per second** per user
## Required identification
Provide at least one of:
* `company_domain`
* `company_name`
* `company_linkedin_url`
If none are provided, the API returns:
```json theme={null}
{
"error": 400,
"message": "Provide at least one of: company_domain, company_name, company_linkedin_url"
}
```
## Optional parameters
* `posted_within_days`: Only return jobs posted within the last N days
## Example request
```json theme={null}
{
"company_domain": "notion.so",
"posted_within_days": 30
}
```
## Example response
```json theme={null}
{
"total_jobs": 1,
"jobs": [
{
"job_title": "Senior Backend Engineer",
"job_url": "https://example.com/jobs/1",
"job_location": "Paris France",
"employment_statuses": ["full_time"],
"date_posted": "2026-05-30",
"description": "Build cool stuff with Rails.",
"hiring_team": [
{
"name": "Alice Doe",
"title": "Engineering Manager",
"linkedin_url": "https://linkedin.com/in/alice"
}
],
"company": {
"name": "Acme",
"domain": "acme.com",
"linkedin_url": "https://linkedin.com/company/acme"
}
}
]
}
```
# Company stack (technographics)
Source: https://docs.prontohq.com/api-reference/endpoints/accounts/company-stack
POST /accounts/company_stack
Retrieve a company technology stack
Get a company's technology stack using one company identifier (domain, company name, or LinkedIn URL).
## Credits and rate limits
* Credits: **3 credits** per request
* Rate limit: **20 requests per second** per user
## Required identification
Provide at least one of:
* `company_domain`
* `company_name`
* `company_linkedin_url`
If none are provided, the API returns:
```json theme={null}
{
"error": 400,
"message": "Provide at least one of: company_domain, company_name, company_linkedin_url"
}
```
## Example request
```json theme={null}
{
"company_name": "Notion",
"company_domain": "notion.so",
"company_linkedin": "https://www.linkedin.com/company/notionhq/"
}
```
## Example response
```json theme={null}
{
"technologies": ["Amazon Web Services", "React", "Segment"],
"technologies_with_confidence": [
{ "name": "Amazon Web Services", "confidence": 0.97 },
{ "name": "React", "confidence": 0.93 },
{ "name": "Segment", "confidence": 0.74 }
]
}
```
# # people at company
Source: https://docs.prontohq.com/api-reference/endpoints/accounts/count-profiles
POST /accounts/count_profiles
Count matching profiles based on job titles and locations.
**Rate limit:** 2 requests per minute
# Count Profiles
The Count Profiles endpoint allows you to count the number of employee profiles matching specific criteria for a company. You can filter by job titles and locations to get precise counts of potential prospects.
## Required Parameters
You must provide one of the following to identify the target company:
* `company_linkedin_id`: The LinkedIn company identifier
* `company_linkedin_url`: The full URL of the company's LinkedIn profile (regular or Sales Navigator)
## Location IDs Reference
Location IDs used in this endpoint can be retrieved using the [Location Ids endpoint](/api-reference/endpoints/miscellaneous/location-ids). Simply provide a location name (e.g., "San Francisco") and the API will return all matching locations with their IDs.
## Request Example
```json theme={null}
{
"company_linkedin_id": "1234567", // Required if company_linkedin_url is not provided
"title_to_include": ["Software Engineer", "Developer"],
"title_to_exclude": ["Junior"],
"included_locations": ["105015875", "102221843"],
"excluded_locations": ["103644278"]
}
```
Alternative company identification:
```json theme={null}
{
"company_linkedin_url": "https://www.linkedin.com/company/microsoft", // Required if company_linkedin_id is not provided
// ... other parameters ...
}
```
## Response Example
```json theme={null}
{
"total": 26,
"title_to_include": ["Software Engineer", "Developer"],
"title_to_exclude": ["Junior"],
"included_locations": ["105015875", "102221843"],
"excluded_locations": ["103644278"]
}
```
## Understanding the Response
* `total`: The total number of profiles matching your criteria
* `title_to_include`: List of job titles that were included in the search
* `title_to_exclude`: List of job titles that were excluded from the search
* `included_locations`: List of Location IDs that were included
* `excluded_locations`: List of Location IDs that were excluded
## Tips
* Use location IDs to target specific geographic areas
* Combine title inclusions and exclusions to refine your search
* Keep your title filters relevant to ensure accurate results
# Department headcount
Source: https://docs.prontohq.com/api-reference/endpoints/accounts/headcount
POST /accounts/headcount
Retrieve headcount information for specified departments or all departments if none specified.
**Rate limit:** 2 requests per minute
# Search accounts by filters
Source: https://docs.prontohq.com/api-reference/endpoints/accounts/search
POST /accounts/search
Search and extract company accounts based on industry, location, size, and keyword filters
Search and extract company accounts using powerful filters including industry, location, company size, and keywords. This endpoint processes results asynchronously and sends enriched account data to your webhook URL.
## Overview
This endpoint allows you to search for companies based on various criteria without needing to provide a LinkedIn Sales Navigator URL. The process is asynchronous - you'll receive an immediate response with the import job details and a preview of matching accounts, and the complete enriched results will be sent to your webhook URL when processing is complete.
## Rate Limits
* **1 request per second** per user/IP address
## Search Filters
### Industries
Target or exclude specific industries using industry IDs. Multiple industry IDs are combined with OR logic.
**Parameters:**
* `included_industries`: Array of industry IDs to target
* `excluded_industries`: Array of industry IDs to exclude from results
For the complete list of industry IDs, see the [LinkedIn Industry List](https://docs.google.com/spreadsheets/d/1qTFPVfcSHnL5PU1AcQlzD8mCmfSICKJ4WuU-OBGhkdI/edit?gid=0#gid=0).
Common industry IDs include:
* `4` - Automotive
* `6` - Technology, Information and Internet
* `12` - Education
* `43` - Financial Services
* `96` - Software Development
### Locations
Use the [Location IDs endpoint](/api-reference/endpoints/miscellaneous/location-ids) to find valid location IDs. You can include or exclude specific locations:
* `included_locations`: Target specific countries, states, or cities
* `excluded_locations`: Exclude specific locations from results
### Company Size
Filter by employee count ranges:
* `1-10` - Startup/Very Small
* `11-50` - Small
* `51-200` - Medium
* `201-500` - Medium-Large
* `501-1000` - Large
* `1001-5000` - Very Large
* `5001-10000` - Enterprise
* `10001+` - Mega Corporation
Multiple size ranges can be used
### Keyword
Search for companies by keyword in their name or description. This is useful for targeting specific niches or technologies (e.g., "saas", "fintech", "healthcare").
### Revenue
Filter companies by their annual revenue range. Revenue values are specified in millions and can be combined with a currency code.
**Parameters:**
* `min_revenue`: Minimum annual revenue (in millions). Valid values: `0`, `0.5`, `1`, `2.5`, `5`, `10`, `20`, `50`, `100`, `500`, `1000`
* `max_revenue`: Maximum annual revenue (in millions). Valid values: `0.5`, `1`, `2.5`, `5`, `10`, `20`, `50`, `100`, `500`, `1000`, `1001` (where `1001` represents \$1B+)
* `revenue_currency`: Currency code for revenue values. Defaults to `USD` if not specified.
**Supported currencies:**
`USD`, `EUR`, `GBP`, `CAD`, `AUD`, `JPY`, `CNY`, `INR`, `BRL`, `SEK`, `NOK`, `DKK`, `SGD`, `HKD`, `NZD`, `THB`, `IDR`, `TRY`, `TWD`, `ILS`, `AED`, `RUB`
**Example:** To find companies with revenue between $10M-$50M:
```json theme={null}
{
"min_revenue": 10,
"max_revenue": 50,
"revenue_currency": "USD"
}
```
## Limits
By default, the endpoint will process up to 1,000 matching accounts. You can set a lower limit using the `limit` parameter. The minimum of your specified limit and 1,000 will be used.
## Streaming Mode
When `streaming` is set to `true`, results will be sent to your webhook in batches as they are processed, rather than all at once when complete. This is useful for large searches where you want to start processing results immediately.
## Response
The endpoint returns immediately with:
* A unique import job ID for tracking
* The total number of accounts that will be processed
* A preview of the first 10 matching accounts
The complete enriched results will be sent to your webhook URL when processing is complete.
## Example Use Cases
### Find SaaS companies in US tech hubs
```json theme={null}
{
"webhook_url": "https://your-webhook.com/accounts",
"name": "US Tech SaaS Companies",
"included_industries": ["6", "96"],
"included_locations": ["103644278"],
"company_size": ["51-200", "201-500"],
"keyword": "saas"
}
```
### Target European fintech startups
```json theme={null}
{
"webhook_url": "https://your-webhook.com/accounts",
"name": "European Fintech Startups",
"included_industries": ["43"],
"included_locations": ["100506914", "105015875", "101165590"],
"company_size": ["11-50", "51-200"],
"limit": 500
}
```
### Find large automotive companies excluding specific regions
```json theme={null}
{
"webhook_url": "https://your-webhook.com/accounts",
"name": "Global Automotive Giants",
"included_industries": ["4"],
"excluded_locations": ["102221843"],
"company_size": ["5001-10000", "10001+"]
}
```
### Find high-revenue tech companies in Europe
```json theme={null}
{
"webhook_url": "https://your-webhook.com/accounts",
"name": "High Revenue European Tech",
"included_industries": ["6", "96"],
"included_locations": ["100506914", "105015875"],
"min_revenue": 100,
"max_revenue": 1001,
"revenue_currency": "EUR"
}
```
# Preview
Source: https://docs.prontohq.com/api-reference/endpoints/accounts/search_preview
POST /accounts/search/preview
Synchronously preview the first 25 matches and the total estimated count for a set of account search filters, without creating an import or consuming credits.
Run the same filters as [`POST /accounts/search`](/api-reference/endpoints/accounts/search) and get back a synchronous **preview**: the total estimated account count plus the first **25** matching companies. Use it to validate filters and size an audience before kicking off the real search.
## Overview
Compared to `POST /accounts/search`, the preview:
* Does **not** create an import job.
* Does **not** call your webhook.
* Does **not** consume credits.
* Does **not** require `webhook_url`.
The body accepts the exact same filter parameters as the regular account search — see [Search accounts by filters](/api-reference/endpoints/accounts/search) for the full reference (`included_industries`, `excluded_industries`, `included_locations`, `excluded_locations`, `company_size`, `keyword`, `min_revenue`, `max_revenue`, `revenue_currency`, …). `webhook_url`, `name`, `limit`, and `streaming` are accepted but ignored: the response always contains up to 25 accounts.
## Rate Limits
* **1 request per second** per user/IP address.
## Response
`200 OK` — returns immediately with:
```json theme={null}
{
"total_count": 4321,
"preview": [
{
"company_name": "Pronto",
"industry": "Technology, Information and Internet",
"linkedin_id": "104885158",
"linkedin_url": "https://www.linkedin.com/company/104885158"
}
]
}
```
| Field | Type | Notes |
| ------------- | ---------------- | --------------------------------------------------------------------------------------- |
| `total_count` | integer | Total estimated number of accounts matching the filters (not capped to 25). |
| `preview` | array of objects | Up to 25 matching accounts. Each entry contains the fields listed above when available. |
## Example
```json theme={null}
{
"included_industries": ["6", "96"],
"included_locations": ["103644278"],
"company_size": ["51-200", "201-500"],
"keyword": "saas"
}
```
# Enrich account
Source: https://docs.prontohq.com/api-reference/endpoints/accounts/single
POST /accounts/single_enrich
Enrich a single company account with firmographic data.
**Rate limit:** 20 requests per second
# Find Enrichment result
Source: https://docs.prontohq.com/api-reference/endpoints/contacts/single_enrich
GET /contacts/{id}
Retrieve enrichment results for a single contact
# Synchronous Single Contact Enrichment
Source: https://docs.prontohq.com/api-reference/endpoints/contacts/sync_single_enrich
sync-enrichments POST /contacts/single_enrich
Enrich a single contact with email, phone, and/or personal email data and get results instantly
Enrich a single contact with email, phone, and/or personal email data using our waterfall enrichment system. Unlike the async enrichment endpoint, this endpoint returns results **synchronously** in the response - no webhook polling required.
## Overview
This endpoint performs real-time waterfall enrichment across multiple data providers to find the most accurate email, phone number, and/or personal email for a contact. Results are returned immediately in the API response, making it ideal for interactive applications, Chrome extensions, and real-time workflows.
## Rate Limits
* **50 requests per second** per user
This generous rate limit makes it suitable for high-volume interactive use cases while protecting our infrastructure.
## Enrichment Types
You can specify which data points you want to enrich by passing the `enrichment_type` array parameter:
* `["email"]` - Find and validate professional email addresses only
* `["phone"]` - Find phone numbers only
* `["personal_email"]` - Find personal email addresses only (requires user consent — see below)
* Any combination, e.g. `["email", "phone"]`, `["email", "personal_email"]`, or `["email", "phone", "personal_email"]`
Requesting `personal_email` requires the authenticated user to have consented
to personal email enrichment in their account settings. If consent is missing,
the API responds with `422 Unprocessable Entity` and the message
`"You can't use the personal email enrichment feature without consenting with our terms of use"`.
This consent gate is required for GDPR compliance.
Requests including `phone` or `personal_email` must include `linkedin_url`.
### Waterfall Enrichment
When you request multiple enrichment types, our system uses a sophisticated waterfall approach:
1. Attempts to find the professional email from the most reliable providers first
2. Searches for personal email through dedicated personal-email providers (Pronto, LeadMagic, Airscale)
3. Searches for phone numbers using provider prioritization
4. Returns results as soon as all requested data points are found or all providers are exhausted
This approach maximizes data quality while minimizing enrichment time and cost.
## Response Format
### Success Response
When enrichment succeeds, you'll receive a 200 response with the enriched data:
**Email Only:**
```json theme={null}
{
"enrichment_id": "123e4567-e89b-12d3-a456-426614174000",
"first_name": "Mathieu",
"last_name": "Brun-Picard",
"linkedin_profile_url": "https://www.linkedin.com/in/mathieu-brun-picard/",
"status": "success",
"email": "mathieu@prontohq.com",
"email_status": "valid"
}
```
**Phone Only:**
```json theme={null}
{
"enrichment_id": "123e4567-e89b-12d3-a456-426614174000",
"first_name": "Mathieu",
"last_name": "Brun-Picard",
"linkedin_profile_url": "https://www.linkedin.com/in/mathieu-brun-picard/",
"status": "success",
"phones": [
"+33612345678"
],
"phone_status": "valid"
}
```
**Email and Phone:**
```json theme={null}
{
"enrichment_id": "123e4567-e89b-12d3-a456-426614174000",
"first_name": "Mathieu",
"last_name": "Brun-Picard",
"linkedin_profile_url": "https://www.linkedin.com/in/mathieu-brun-picard/",
"status": "success",
"email": "mathieu@prontohq.com",
"email_status": "valid",
"phones": [
"+33612345678"
],
"phone_status": "valid"
}
```
**Personal Email Only:**
```json theme={null}
{
"enrichment_id": "123e4567-e89b-12d3-a456-426614174000",
"first_name": "Mathieu",
"last_name": "Brun-Picard",
"linkedin_profile_url": "https://www.linkedin.com/in/mathieu-brun-picard/",
"status": "success",
"personal_email": "mathieu.bp@gmail.com",
"personal_email_status": "valid"
}
```
### Error Response
When no data is found, the response includes a message and empty data fields:
```json theme={null}
{
"enrichment_id": "123e4567-e89b-12d3-a456-426614174000",
"first_name": "Mathieu",
"last_name": "Brun-Picard",
"linkedin_profile_url": "https://www.linkedin.com/in/mathieu-brun-picard/",
"status": "error",
"message": "No email or phone found for this profile",
"email": null,
"email_status": "N/A",
"phones": [],
"phone_status": "not_found"
}
```
## Required Fields
At minimum, you must provide:
* `firstname` - Contact's first name
* `lastname` - Contact's last name
* `enrichment_type` - Array containing any combination of `"email"`, `"phone"`, and/or `"personal_email"`
* `linkedin_url` - Required when `enrichment_type` includes `"phone"` or `"personal_email"`
## Recommended Fields
For best results, include as much information as possible:
* `linkedin_url` - LinkedIn profile URL (highly recommended for accuracy)
* `domain` - Company website domain
* `company_name` - Company name
The more context you provide, the higher the accuracy of the enrichment.
## Custom Fields
You can include custom fields that will be returned in the response:
```json theme={null}
{
"firstname": "Mathieu",
"lastname": "Brun-Picard",
"linkedin_url": "https://www.linkedin.com/in/mathieu-brun-picard/",
"enrichment_type": ["email"],
"custom": {
"crm_id": "12345",
"campaign": "outbound_q1",
"segment": "enterprise"
}
}
```
These custom fields are passed through unchanged and returned in the `custom` field of the response, making it easy to correlate results with your internal systems.
## Email Status Values
The `email_status` field indicates the validation state of the email:
* `deliverable` - Email is deliverable
* `catch-all` - Email hasa catch-all status but was validated by our debouncing waterfall
* `N/A` - Email enrichment was not requested or no email was found
## Personal Email Status Values
The `personal_email_status` field indicates the validation state of the personal email:
* `valid` - Personal email was found and validated
* `invalid` - Personal email enrichment ran but the result is not deliverable
* `N/A` - Personal email enrichment was not requested or no personal email was found
## Phone Status Values
The `phone_status` field indicates whether valid phone numbers were found:
* `valid` - At least one valid phone number found
* `not_found` - No phone numbers found or phone enrichment not requested
## Pricing
Each enrichment request consumes credits based on the enrichment type requested and the providers used. Check your account credits using the [Account Credits endpoint](/api-reference/endpoints/miscellaneous/account-credits).
# Bulk Contact Enrichment
Source: https://docs.prontohq.com/api-reference/endpoints/enrichments/batch
POST /contacts/bulk_enrich
Enrich up to 100 contacts in a single asynchronous batch
Enqueue up to **100 contacts** for waterfall enrichment in a single request.
The endpoint returns immediately with an `enrichment_id` for the bulk job;
each contact is enriched asynchronously and results are delivered to your
`webhook_url` as each contact completes.
## Constraints
* **Minimum:** 2 contacts per request. For a single contact, use the
[single async endpoint](/api-reference/endpoints/enrichments/single).
* **Maximum:** 100 contacts per request.
* A single `enrichment_type` applies to every contact in the batch.
## Enrichment Types
Pass `enrichment_type` as an array containing one of:
* `["email"]` — Find and validate professional emails
* `["phone"]` — Find phone numbers (requires `linkedin_url` on every contact)
* `["personal_email"]` — Find personal emails (requires `linkedin_url` **and** account-level consent — see below)
Requesting `personal_email` requires the authenticated user to have
consented to personal email enrichment in their account settings.
If consent is missing the entire batch is rejected with
`422 Unprocessable Entity`. This consent gate is required for GDPR compliance.
## Required Fields per contact
* `firstname`
* `lastname`
* `domain` or `company_name` (when `enrichment_type` is `["email"]`)
* `linkedin_url` (when `enrichment_type` is `["phone"]` or `["personal_email"]`)
## Receiving results
Provide `webhook_url` to receive results — we POST one payload per contact as
each one finishes. The webhook payload echoes the `custom` fields you sent
with that contact, so you can correlate results back to your records.
## Credits
Credits are checked up-front for the entire batch. If your balance is
insufficient the request is rejected with `422 Unprocessable Entity` and no
contacts are enqueued.
# Asynchronous Single Contact Enrichment
Source: https://docs.prontohq.com/api-reference/endpoints/enrichments/single
enrichments POST /contacts/single_enrich
Enrich a single contact record with email, phone, and / or personal email data
Enqueue a single contact for waterfall enrichment. The endpoint returns
immediately with an `enrichment_id` and `status: "pending"`; the waterfall
runs asynchronously in the background.
## When to use this endpoint
Use the async endpoint when:
* You can accept results via webhook, or you can poll for them later.
* You're enriching at scale and don't want to hold an HTTP connection per contact.
* You want to retain the enrichment result on the contact record for later retrieval via [`GET /contacts/{id}`](/api-reference/endpoints/contacts/single_enrich).
If you need results inline (Chrome extension, interactive UI, real-time
workflow), use the [synchronous endpoint](/api-reference/endpoints/contacts/sync_single_enrich) instead.
## Enrichment Types
Pass `enrichment_type` as an array containing one of:
* `["email"]` — Find and validate the professional email
* `["phone"]` — Find phone numbers (requires `linkedin_url`)
* `["personal_email"]` — Find a personal email (requires `linkedin_url` **and** account-level consent — see below)
Requesting `personal_email` requires the authenticated user to have
consented to personal email enrichment in their account settings.
If consent is missing, the API responds with `422 Unprocessable Entity`
and the message `"You can't use the personal email enrichment feature
without consenting with our terms of use"`. This consent gate is required
for GDPR compliance.
## Required Fields
* `firstname`
* `lastname`
* `enrichment_type`
* `domain` or `company_name` (when `enrichment_type` is `["email"]`)
* `linkedin_url` (when `enrichment_type` is `["phone"]` or `["personal_email"]`)
## Receiving results
You have two options:
1. **Webhook** — pass `webhook_url` in the request. We POST the final result
to that URL once the waterfall completes.
2. **Polling** — call [`GET /contacts/{id}`](/api-reference/specs/enrichments)
with the returned `enrichment_id`. While the waterfall is running the
`status` is `pending`; once it has completed (with or without data) the
`status` flips to `finished`.
## Custom Fields
Pass `custom: { ... }` in the request to attach arbitrary correlation data
(e.g. your CRM record ID). The same payload is echoed back on
`GET /contacts/{id}` and on the webhook callback.
## Pricing
Each enrichment consumes credits based on the requested `enrichment_type` and
the providers used. Check your account credits via the
[Account Credits endpoint](/api-reference/endpoints/miscellaneous/account-credits).
# Account search
Source: https://docs.prontohq.com/api-reference/endpoints/extract/accounts
POST /accounts/
Extract company accounts from a LinkedIn Sales Navigator search URL and process them asynchronously.
**Rate limit:** 1 request per second
This endpoint creates an import job that will process the search results in the background. Results will be sent to the specified webhook URL when processing is complete.
Extract company accounts from LinkedIn Sales Navigator search results and process them asynchronously. This endpoint creates an import job that will process the search results in the background and send the results to your specified webhook URL when complete.
## Overview
This endpoint allows you to extract company data from LinkedIn Sales Navigator search URLs. The process is asynchronous - you'll receive an immediate response with the import job details, and the actual results will be sent to your webhook URL when processing is complete.
## Rate Limits
* **1 request per second** per user/IP address
# People search
Source: https://docs.prontohq.com/api-reference/endpoints/extract/leads
POST /leads
Initiates a new lead search based on the provided parameters.
**Rate limit:** 1 request per second
## Scale Parameter
The `scale` parameter (boolean, optional) allows you to increase your volume of requests by omitting the following fields:
* `connections_count`
* `headline`
* Vanity LinkedIn profile URL (like `https://www.linkedin.com/in/mathieu-brun-picard/`)
When `scale` is set to `true`, you will still receive a LinkedIn profile URL, but it will use the user ID instead of the vanity URL format (like `https://linkedin.com/in/ACwAACaX8uYBfAh-5YxmfObz4mVOKYih3zxa-TM`).
# Find people at company
Source: https://docs.prontohq.com/api-reference/endpoints/extract/leads_from_company
POST /leads/search
Searches for leads based on job titles and a company (LinkedIn company ID or URL). Optionally narrow results by location, LinkedIn **function** (department), and **seniority** level using the authorized ID lists below.
# Find 2x people than with Clay
* Input : Job titles + Company
* Output : Live matching people data
# Prerequisites
## In Pronto
* A Pronto account with API access
* A valid **[sync](https://app.prontohq.com/settings/extension)**
* Your Pronto **API key** ([How to get your API key](/api-reference/API-key))
## In Clay
A **Companies** table with at least:
* Company Name
* Domain
* Company LinkedIn URL (or LinkedIn Org ID)
These fields tell Pronto which company to search on LinkedIn.
# Step 1 — Create a Webhook Table in Clay
Pronto needs an endpoint to “deliver” the people it finds.
We’ll use a **Monitor Webhook** table.
1. In Clay, click **Add** → **Monitor Webhook**
2. Clay creates a new table with a **Webhook column**
3. Click the **Webhook column** → **Sources** → **Pull data from webhook**
4. Copy the **Webhook URL**
You will paste this URL into Pronto’s API request later.
# Step 2 — Add an HTTP API Column to Your Companies Table
1. Go back to your **Companies** table
2. Click **Add Column**
3. Choose **Add Enrichment**
4. Select **HTTP API**
This is the column that will call Pronto’s Find People API for each company.
# Step 3 — Configure the API Call
### Method
`POST`
### Endpoint
```
https://app.prontohq.com/api/v2/leads/search
```
### Body (JSON)
Paste this JSON and customize it as needed:
```json theme={null}
{
"name": "Find people at {{Company Name}}",
"webhook_url": "PASTE_YOUR_WEBHOOK_URL_HERE",
"company_linkedin_url": "{{Company Linkedin URL}}",
"job_titles": [
"Head of Talent",
"HR Director",
"Talent Acquisition Manager"
],
"excluded_job_titles": [
"Intern"
],
"functions": ["12", "15"],
"seniority_levels": ["220", "300"],
"streaming": true,
"limit": 50
}
```
#### Using a saved Persona instead of inlining job titles
If you've already defined a Persona in Pronto, you can reference it by `persona_id`. Pronto will use that persona's included and excluded job titles automatically — do **not** pass `job_titles` or `excluded_job_titles` alongside `persona_id`.
```json theme={null}
{
"name": "Find people at {{Company Name}}",
"webhook_url": "PASTE_YOUR_WEBHOOK_URL_HERE",
"company_linkedin_url": "{{Company Linkedin URL}}",
"persona_id": "1f6b0f5a-2d8e-4c3a-9b8f-1a2b3c4d5e6f",
"streaming": true,
"limit": 50
}
```
> **At least one people filter is required.** The request must include at least one of `job_titles`, `excluded_job_titles`, `functions`, `seniority_levels`, `included_locations`, `excluded_locations`, or `persona_id`. Requests with none of these return `400`.
### Field explanations
* **name**: Label used inside Pronto
* **webhook\_url**: Clay webhook URL (Step 1)
* **company\_linkedin\_url**: Clay variable for the company’s LinkedIn profile
* **job\_titles**: The personas you want to target. If you pass `[*]` we will return every person in the company, regardless of their job title.
* **excluded\_job\_titles**: Optional list
* **persona\_id** (optional): UUID of a Pronto Persona. When provided, `job_titles` and `excluded_job_titles` are taken from the persona definition and **must not** be passed in the request — doing so returns `422`. Use this when you want a saved persona to drive the search instead of inlining job titles.
* **included\_locations** (optional): If used, we will return only leads with matching location. Location ids can be retrieved via this [endpoint](/api-reference/endpoints/miscellaneous/location-ids).
* **excluded\_locations** (optional): Location IDs to exclude (same ID source as above).
* **functions** (optional): Array of LinkedIn function IDs (department / job function). Only the IDs listed in [Authorized function IDs](#authorized-function-ids) are accepted. Multiple values use OR logic.
* **seniority\_levels** (optional): Array of LinkedIn seniority level IDs. Only the IDs listed in [Authorized seniority level IDs](#authorized-seniority-level-ids) are accepted. Multiple values use OR logic.
* **streaming**: Sends results to Clay row by row
* **limit**: Max number of people to return per company
If `functions` or `seniority_levels` is present, it must be a JSON array. Invalid IDs return `422` with a message listing the invalid values and the full set of valid IDs.
### Authorized function IDs
| ID | Label |
| -- | -------------------------------- |
| 1 | Accounting |
| 2 | Administrative |
| 3 | Arts and Design |
| 4 | Business Development |
| 5 | Community and Social Services |
| 6 | Consulting |
| 7 | Education |
| 8 | Engineering |
| 9 | Entrepreneurship |
| 10 | Finance |
| 11 | Healthcare Services |
| 12 | Human Resources |
| 13 | Information Technology |
| 14 | Legal |
| 15 | Marketing |
| 16 | Media and Communication |
| 17 | Military and Protective Services |
| 18 | Operations |
| 19 | Product Management |
| 20 | Program and Project Management |
| 21 | Purchasing |
| 22 | Quality Assurance |
| 23 | Real Estate |
| 24 | Research |
| 25 | Sales |
| 26 | Customer Success and Support |
### Authorized seniority level IDs
| ID | Label |
| --- | ------------------- |
| 100 | In Training |
| 110 | Entry Level |
| 120 | Senior |
| 130 | Strategic |
| 200 | Entry Level Manager |
| 210 | Experienced Manager |
| 220 | Director |
| 300 | Vice President |
| 310 | CXO |
| 320 | Owner / Partner |
Click **Save & Don’t Run**.
> **Clay JSON formatting errors?** Double-check commas, spacing, or [copy our template](https://app.clay.com/shared-workbook/share_0swi80wycWeW9mHM64p) to fix issues.
### Headers
| Key | Value |
| --------- | ------------------- |
| X-API-KEY | Your Pronto API key |
# Step 4 — Run Your First Find People Request
1. In your **Companies** table
2. Go to your new **HTTP API** column
3. Click the **▶️ Play** button on any company row
Pronto will immediately:
* query LinkedIn for your persona
* extract matching profiles
* stream the results into your Webhook table
# Step 5 — View and Use the Results
Go to your **Webhook table**.
You’ll see people appear row by row as Pronto finds them.
Click **Add Column** → search and add:
* `full_name`
* `title`
* `linkedin_url`
* `linkedin_id`
* `company_name`
* `status`
* `rejection_reasons`
You now have a **live Find People pipeline** inside Clay.
# FAQ
### Does this use my Clay credits?
No, Pronto handles the search, so you don’t use any Clay Find People credits.
### Is the data live?
Yes, Pronto searches in real-time using your synced session.
### Can I run this at scale?
Yes, You can run it on thousands of companies. Pronto streams results progressively to avoid rate limits.
### What if my sync breaks?
Just re-sync your account in Pronto Settings.
# Need help?
If you need help customizing your Find people, please book a 15min set up with me : [https://zcal.co/mathieu-pronto/enterprise](https://zcal.co/mathieu-pronto/enterprise)
# Want to scale further ?
The `scale` parameter (boolean, optional) allows you to increase your volume of requests by omitting the following fields:
* `connections_count`
* `headline`
* Vanity LinkedIn profile URL (like `https://www.linkedin.com/in/mathieu-brun-picard/`)
When `scale` is set to `true`, you will still receive a LinkedIn profile URL, but it will use the user ID instead of the vanity URL format (like `https://linkedin.com/in/ACwAACaX8uYBfAh-5YxmfObz4mVOKYih3zxa-TM`).
# Search leads by filters
Source: https://docs.prontohq.com/api-reference/endpoints/leads/advanced_search
POST /leads/advanced_search
Run a lead search with the full set of structured filters and stream enriched leads to your webhook.
Run a full lead search using structured filters. Pronto builds the underlying query for you, creates an asynchronous `Search`, and streams enriched leads to your `webhook_url`.
## Overview
Use this endpoint when you want to extract leads matching a precise persona definition (titles + seniority + function + tenure + company filters + signals). Pronto:
1. Validates and translates your filters into a search URL.
2. Estimates the number of matching profiles.
3. Enqueues the search and returns immediately with a `Search` record.
4. Streams leads to your webhook.
## Requirements
* A valid **integration** must be connected on the authenticated user.
* `webhook_url` is **required**.
* At least one filter or `keyword` must be provided.
## Rate Limits
* **1 request per second** per user.
## Request body
### Top-level options
| Field | Type | Description |
| ------------- | ------------------ | -------------------------------------------------------------------------------- |
| `webhook_url` | string (HTTPS URL) | **Required.** Where Pronto sends the enriched leads. |
| `name` | string | Friendly name. Defaults to `Lead search - API - `. |
| `keyword` | string | Free-text keyword. Spell correction is automatically enabled when set. |
| `limit` | integer | Cap on enriched leads. Effective value is `min(limit, MAX_RESULTS_COUNT)`. |
| `streaming` | boolean | If `true`, leads are pushed to the webhook as they are scraped. Default `false`. |
| `scale` | boolean | If `true`, skips some data retrieval, for higher volume. Default `false`. |
| `custom` | object | Arbitrary JSON stored on the search and echoed back in every webhook payload. |
### Title filters
| Field | Type | Notes |
| ---------------------- | ---------------- | ----------------------------------------------------- |
| `job_titles` | array of strings | Current titles to include (`CURRENT_TITLE` INCLUDED). |
| `excluded_job_titles` | array of strings | Current titles to exclude (`CURRENT_TITLE` EXCLUDED). |
| `past_titles` | array of strings | Past titles to include (`PAST_TITLE` INCLUDED). |
| `excluded_past_titles` | array of strings | Past titles to exclude (`PAST_TITLE` EXCLUDED). |
### Location filters
| Field | Type |
| -------------------- | --------------------------------- |
| `included_locations` | array of LinkedIn `geoRegion` IDs |
| `excluded_locations` | array of LinkedIn `geoRegion` IDs |
Resolve region names to IDs with the [Location IDs endpoint](/api-reference/endpoints/miscellaneous/location-ids).
### Industry filters
| Field | Type |
| --------------------- | ------------------------------ |
| `included_industries` | array of LinkedIn industry IDs |
| `excluded_industries` | array of LinkedIn industry IDs |
For the full list of industry IDs see the [LinkedIn Industry List](https://docs.google.com/spreadsheets/d/1qTFPVfcSHnL5PU1AcQlzD8mCmfSICKJ4WuU-OBGhkdI/edit?gid=0#gid=0). Common values:
* `4` Automotive
* `6` Technology, Information and Internet
* `12` Education
* `43` Financial Services
* `96` Software Development
### Company filters
| Field | Type | Notes |
| ---------------------- | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| `included_companies` | array of ids or `{ id }` objects | Current company (`CURRENT_COMPANY` INCLUDED). `id` is the numeric LinkedIn organization id (the integer in `urn:li:organization:`). |
| `excluded_companies` | array of ids or `{ id }` objects | Current company to exclude (`CURRENT_COMPANY` EXCLUDED). |
| `past_companies` | array of ids or `{ id }` objects | Past company (`PAST_COMPANY` INCLUDED). |
| `company_headquarters` | array of `geoRegion` IDs | Filters by the lead's company HQ region (`COMPANY_HEADQUARTERS`). |
Each entry can be a plain LinkedIn organization id (string or integer) or an object with an `id` key (e.g. `"1441"`, `1441`, or `{ "id": "1441" }`). Other shapes return `422`.
### Function & seniority
| Field | Maps to | Valid IDs |
| ------------------ | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `functions` | `FUNCTION` | `1` Accounting · `2` Administrative · `3` Arts and Design · `4` Business Development · `5` Community and Social Services · `6` Consulting · `7` Education · `8` Engineering · `9` Entrepreneurship · `10` Finance · `11` Healthcare Services · `12` Human Resources · `13` Information Technology · `14` Legal · `15` Marketing · `16` Media and Communication · `17` Military and Protective Services · `18` Operations · `19` Product Management · `20` Program and Project Management · `21` Purchasing · `22` Quality Assurance · `23` Real Estate · `24` Research · `25` Sales · `26` Customer Success and Support |
| `seniority_levels` | `SENIORITY_LEVEL` | `100` In Training · `110` Entry Level · `120` Senior · `130` Strategic · `200` Entry Level Manager · `210` Experienced Manager · `220` Director · `300` Vice President · `310` CXO · `320` Owner / Partner |
Multiple IDs are combined with **OR** logic.
### Tenure filters
LinkedIn uses bucketed IDs `"1"`–`"8"` for these filters:
| Field | Maps to |
| --------------------------- | --------------------------- |
| `years_of_experience` | `YEARS_OF_EXPERIENCE` |
| `years_at_current_company` | `YEARS_AT_CURRENT_COMPANY` |
| `years_in_current_position` | `YEARS_IN_CURRENT_POSITION` |
Bucket meanings (same scale for all three): `"1"` Less than 1 year · `"2"` 1 to 2 years · `"3"` 3 to 5 years · `"4"` 6 to 10 years · `"5"` More than 10 years. Buckets `"6"`–`"8"` are reserved by LinkedIn.
### Company size & type
| Field | Maps to | Valid values (same strings as [account search](/api-reference/endpoints/accounts/search)) |
| -------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `company_size` | `COMPANY_HEADCOUNT` | `1-10` · `11-50` · `51-200` · `201-500` · `501-1000` · `1001-5000` · `5001-10000` · `10001+` (en-dashes in requests are normalized to hyphens on the server) |
| `company_type` | `COMPANY_TYPE` | `C` Public Company · `E` Educational Institution · `G` Government Agency · `N` Non-Profit · `P` Privately Held · `S` Self-Employed · `X` Self-Owned |
### Lists & relationship
| Field | Maps to | Value type |
| ------------------------ | -------------------------- | --------------------------------------------------------------------------------------------- |
| `included_account_lists` | `ACCOUNT_LIST` (INCLUDED) | array of account list IDs |
| `excluded_account_lists` | `ACCOUNT_LIST` (EXCLUDED) | array of account list IDs |
| `included_lead_lists` | `LEAD_LIST` (INCLUDED) | array of lead list IDs |
| `excluded_lead_lists` | `LEAD_LIST` (EXCLUDED) | array of lead list IDs |
| `relationship` | `RELATIONSHIP` | array of IDs: `F` 1st degree · `S` 2nd degree · `O` 3rd degree and beyond · `A` Group members |
| `recently_changed_jobs` | `RECENTLY_CHANGED_JOBS` | pass `["RPC"]` to enable |
| `connections_of_profile` | `CONNECTION_OF` (INCLUDED) | single LinkedIn profile URL — returns 1st-degree connections of that profile |
`connections_of_profile` accepts any recognized LinkedIn profile URL:
* `https://www.linkedin.com/in/`
* `https://www.linkedin.com/in/`
* `https://www.linkedin.com/sales/lead/`
The server resolves the URL to the target member's internal id via LinkedIn before building the search. Returns `422` if the URL is malformed or can't be resolved.
### Boolean signal filters
These send a single fixed value when truthy. Pass `true` to apply.
| Field | Maps to |
| ------------------------- | ------------------------------------- |
| `follows_your_company` | `FOLLOWS_YOUR_COMPANY` (id `CF`) |
| `viewed_your_profile` | `VIEW_YOUR_PROFILE` (id `VYP`) |
| `with_shared_experiences` | `WITH_SHARED_EXPERIENCES` (id `COMM`) |
| `posted_on_linkedin` | `POSTED_ON_LINKEDIN` (id `RPOL`) |
| `past_colleague` | `PAST_COLLEAGUE` (id `CL`) |
## Response
`201 Created` — returns immediately with the created `Search`:
```json theme={null}
{
"message": {
"id": "8e1dcba0-f0bb-4071-99fc-f18ba6559ccc",
"search_name": "EU SaaS VPs of Sales",
"search_url": "https://www.linkedin.com/sales/search/people?query=(filters%3AList(...))",
"expected_profiles_count": 842,
"created_at": "2026-05-04T12:34:56Z",
"custom": { "hubspot_id": "134567" }
}
}
```
Enriched leads are then POSTed to your `webhook_url` (one-shot at the end of the search, or per-batch when `streaming: true`).
## Errors
| Status | When |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `400 Bad Request` | Missing `webhook_url`, invalid webhook URL format, or no filter/keyword provided. |
| `401 Unauthorized` | Invalid API key, or credentials missing/expired. |
| `403 Forbidden` | API key does not have access to this endpoint. |
| `422 Unprocessable Entity` | Invalid filter shape, or enum ID outside the authorized list (e.g. unknown `functions`, `seniority_levels`, `company_size`, etc.). |
| `429 Too Many Requests` | Per-user rate limit (1 req/s) or upstream LinkedIn rate limit. |
## Examples
### EU SaaS VPs of Sales
```json theme={null}
{
"name": "EU SaaS VPs of Sales",
"webhook_url": "https://hooks.example.com/leads",
"limit": 500,
"streaming": true,
"job_titles": ["VP of Sales", "Chief Revenue Officer"],
"seniority_levels": ["300", "310"],
"functions": ["25"],
"included_industries": ["96", "4"],
"included_locations": ["101452733", "105015875"],
"company_size": ["51-200", "201-500", "501-1000"],
"years_in_current_position": ["3", "4"],
"custom": { "hubspot_id": "134567" }
}
```
### Engineering leaders at specific companies who recently changed jobs
```json theme={null}
{
"name": "Eng leaders — recent movers",
"webhook_url": "https://hooks.example.com/leads",
"job_titles": ["VP Engineering", "Head of Engineering"],
"functions": ["8"],
"seniority_levels": ["220", "300"],
"included_companies": ["1441", { "id": "162479" }],
"recently_changed_jobs": ["RPC"]
}
```
### Target an account list while excluding an existing lead list
```json theme={null}
{
"webhook_url": "https://hooks.example.com/leads",
"job_titles": ["Head of Marketing"],
"included_account_lists": ["12345678"],
"excluded_lead_lists": ["87654321"]
}
```
### Past colleagues who posted on LinkedIn recently
```json theme={null}
{
"webhook_url": "https://hooks.example.com/leads",
"past_colleague": true,
"posted_on_linkedin": true,
"included_locations": ["103644278"]
}
```
### Keyword + tenure filter, scale mode
```json theme={null}
{
"webhook_url": "https://hooks.example.com/leads",
"keyword": "cybersecurity",
"years_of_experience": ["4", "5"],
"company_type": ["P", "C"],
"scale": true,
"limit": 1000
}
```
### 1st-degree connections of a target profile
```json theme={null}
{
"webhook_url": "https://hooks.example.com/leads",
"connections_of_profile": "https://www.linkedin.com/in/williamhgates",
"seniority_levels": ["300", "310"],
"functions": ["25"]
}
```
# Preview
Source: https://docs.prontohq.com/api-reference/endpoints/leads/advanced_search_preview
POST /leads/advanced_search/preview
Synchronously preview the first 25 matches and the total estimated count for a set of advanced lead search filters, without creating a Search or consuming credits.
Run the same filters as [`POST /leads/advanced_search`](/api-reference/endpoints/leads/advanced_search) and get back a synchronous **preview**: the total estimated profile count plus the first **25** matching leads. Use it to validate filters and size an audience before kicking off the real search.
## Overview
Compared to `POST /leads/advanced_search`, the preview:
* Does **not** create a `Search` record.
* Does **not** call your webhook.
* Does **not** consume credits.
* Does **not** require `webhook_url`.
The body accepts the exact same filter parameters as the regular advanced search — see [Search leads by filters](/api-reference/endpoints/leads/advanced_search) for the full reference. `webhook_url`, `name`, `limit`, `streaming`, `scale`, and `custom` are accepted but ignored: the response always contains up to 25 leads.
## Requirements
* A valid **integration** must be connected on the authenticated user.
* At least one filter or `keyword` must be provided.
## Rate Limits
* **1 request per second** per user.
## Response
`200 OK` — returns immediately with:
```json theme={null}
{
"total_count": 1234,
"preview": [
{
"full_name": "Ada Lovelace",
"headline": "VP of Sales at Acme",
"current_company": "Acme",
"current_title": "VP of Sales",
"linkedin_id": "104885158",
"profile_url": "https://www.linkedin.com/in/urn:li:fs_salesProfile:(ACoAAAxxxx,NAME_SEARCH,abcde)"
}
]
}
```
| Field | Type | Notes |
| ------------- | ---------------- | ------------------------------------------------------------------------------------ |
| `total_count` | integer | Total estimated number of leads matching the filters (not capped to 25). |
| `preview` | array of objects | Up to 25 matching leads. Each entry contains the fields listed above when available. |
## Errors
| Status | When |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `400 Bad Request` | No filter or `keyword` provided. |
| `401 Unauthorized` | Invalid API key, or credentials missing/expired. |
| `403 Forbidden` | API key does not have access to this endpoint. |
| `422 Unprocessable Entity` | Invalid filter shape, or enum ID outside the authorized list (e.g. unknown `functions`, `seniority_levels`, `company_size`, etc.). |
| `429 Too Many Requests` | Per-user rate limit (1 req/s) or upstream LinkedIn rate limit. |
## Example
```json theme={null}
{
"job_titles": ["VP of Sales", "Chief Revenue Officer"],
"seniority_levels": ["300", "310"],
"functions": ["25"],
"included_industries": ["96"],
"included_locations": ["101452733"]
}
```
# Enrich people
Source: https://docs.prontohq.com/api-reference/endpoints/leads/single
POST /leads/single_enrich
Enrich a single lead account with firmographic data. No email or phone included.
**Rate limit:** 500 requests per day
# Create a List
Source: https://docs.prontohq.com/api-reference/endpoints/lists/create
POST /lists
Creates a new list in the system.
# Retrieve all Lists
Source: https://docs.prontohq.com/api-reference/endpoints/lists/index
GET /lists
Retrieve all your lists
# Retrieve a List
Source: https://docs.prontohq.com/api-reference/endpoints/lists/show
GET /lists/{id}
Retrieve a specific list by its ID
# Update a List
Source: https://docs.prontohq.com/api-reference/endpoints/lists/update
PUT /lists/{id}
Updates a list in the system.
# Current credit balance
Source: https://docs.prontohq.com/api-reference/endpoints/miscellaneous/account-credits
GET /credits
Get your current credit balance and usage information
# Account Info
Source: https://docs.prontohq.com/api-reference/endpoints/miscellaneous/get-account-info
GET /account
Get information about your account including credits and usage
# Location Ids
Source: https://docs.prontohq.com/api-reference/endpoints/miscellaneous/location-ids
POST /locations
Get the location id of a specific location
# List Personas
Source: https://docs.prontohq.com/api-reference/endpoints/personas/index
GET /personas
Retrieves a list of all personas available in the system
# Get Persona
Source: https://docs.prontohq.com/api-reference/endpoints/personas/show
GET /personas/{uuid}
Retrieves detailed information about a specific persona
# Delete a Search
Source: https://docs.prontohq.com/api-reference/endpoints/searches/destroy
DELETE /searches/{id}
Deletes a specific search by its ID. This operation will permanently remove the search and all associated tasks from the system. Only the owner of the search can delete it.
## Description
Deletes a specific search by its ID. This operation will permanently remove the search and all associated tasks from the system. Only the owner of the search can delete it.
## Parameters
### Path Parameters
* **`id`** (required, string, UUID): The unique identifier of the search to delete
## Responses
### 200 OK
The search was successfully deleted.
```json theme={null}
{
"message": "Search deleted successfully"
}
```
### 401 Unauthorized
You are not authorized to delete this search. This may be because you do not own the search, or the search owner is not part of your workspace.
```json theme={null}
{
"error": "Unauthorized"
}
```
### 404 Not Found
The search with the specified ID does not exist.
```json theme={null}
{
"error": "Search not found"
}
```
### 422 Unprocessable Entity
The search deletion failed for an unknown reason.
```json theme={null}
{
"error": "Failed to delete search"
}
```
## Notes
* When a search is deleted, all related tasks are also deleted automatically
* This operation cannot be undone
* Only searches owned by the authenticated user or within the user's workspace can be deleted
# Retrieve all Searches
Source: https://docs.prontohq.com/api-reference/endpoints/searches/index
GET /searches
Returns all searches from the system that the user has access to.
# Retrieve the details of a Search
Source: https://docs.prontohq.com/api-reference/endpoints/searches/show
GET /searches/{id}
Returns a specific search and its leads by ID.
## Search Status
The search object includes a `status` field that indicates the current state of the search operation. The possible status values are:
### Active Statuses
* **`NOT_STARTED`**: The search has been created but has not yet begun processing
* **`ONGOING`**: The search is currently being processed and generating results
* **`FINISHED`**: The search has completed successfully and all results are available
### Error Statuses
* **`RATE_LIMITED`**: The search was interrupted due to rate limiting constraints
* **`UNAUTHORIZED`**: The search failed due to authentication issues
* **`FORBIDDEN`**: The search failed due to insufficient permissions
* **`ERROR`**: The search encountered an error during processing
When a search has a status of `FINISHED`, all leads are available and ready to be retrieved. For searches with error statuses, you may need to retry the search or check your API credentials and permissions.
# Extract comments from LinkedIn profile
Source: https://docs.prontohq.com/api-reference/endpoints/signals/comments
POST /intents/leads/comments
Extract comments left by a LinkedIn profile on other posts. Uses the voyagerFeedDashProfileUpdates endpoint and paginates until all comments are retrieved or the requested limit is reached.
Extract comments left by a LinkedIn profile on other posts. This endpoint paginates through the profile's feed activity and filters for comment-type elements, returning up to the specified limit.
## Use Cases
* Surface intent signals from prospects actively engaging with relevant content
* Identify which topics a lead is commenting on to personalise outreach
* Track engagement patterns of key prospects or customers
* Enrich lead profiles with recent activity data
## Parameters
### Required Parameters
* `linkedin_profile_url`: LinkedIn profile URL to extract comments from (e.g., `https://www.linkedin.com/in/mathieu-brun-picard/`)
* `limit`: Maximum number of comments to extract (minimum: 1)
## Response
The response includes an array of comments with the following fields:
* `id`: Numeric activity ID extracted from the URN
* `comment_url`: Full LinkedIn URL with `commentUrn` query parameter — links directly to the comment
* `author`: Full name of the commenter
* `author_url`: LinkedIn profile URL of the commenter (query params stripped)
* `comment_text`: Text content of the comment
* `commented_at`: ISO 8601 timestamp of when the comment was posted
* `urn`: LinkedIn URN identifying the comment (`urn:li:comment:(parentActivity,commentId)`)
## Example Request
```bash theme={null}
curl --request POST \
--url https://app.prontohq.com/api/v2/intents/leads/comments \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: your-api-key' \
--data '{
"linkedin_profile_url": "https://www.linkedin.com/in/mathieu-brun-picard/",
"limit": 10
}'
```
## Example Response
```json theme={null}
{
"comments": [
{
"id": "7241056783920183297",
"comment_url": "https://www.linkedin.com/feed/update/urn:li:activity:7241056783920183297?commentUrn=urn%3Ali%3Acomment%3A%28urn%3Ali%3Aactivity%3A7241056783920183297%2C7241089034521346049%29",
"author": "Mathieu Brun-Picard",
"author_url": "https://www.linkedin.com/in/mathieu-brun-picard/",
"comment_text": "Great point — we've been seeing the same pattern at Pronto. The signal quality improves significantly once you filter by recency and engagement depth.",
"commented_at": "2025-11-20T14:17:00Z",
"urn": "urn:li:comment:(urn:li:activity:7241056783920183297,7241089034521346049)"
},
{
"id": "7238912047563218945",
"comment_url": "https://www.linkedin.com/feed/update/urn:li:activity:7238912047563218945?commentUrn=urn%3Ali%3Acomment%3A%28urn%3Ali%3Aactivity%3A7238912047563218945%2C7238945301827563521%29",
"author": "Mathieu Brun-Picard",
"author_url": "https://www.linkedin.com/in/mathieu-brun-picard/",
"comment_text": "This is exactly why we built intent signals into Pronto. Knowing when a prospect is actively commenting on topics relevant to your product is a game changer for outbound timing.",
"commented_at": "2025-11-17T10:44:00Z",
"urn": "urn:li:comment:(urn:li:activity:7238912047563218945,7238945301827563521)"
}
]
}
```
## Notes
* This endpoint returns results synchronously (HTTP 200 OK) — no polling required
* Comments are detected from the profile's feed when the share URL contains `commentUrn` or `/comment/`, or when `parentUrn`/`baseUpdate` fields are present on the feed element
* The service paginates through the feed in pages of 20 until the limit is reached or the feed is exhausted
* `author_url` is returned with tracking query parameters stripped
# Find companies lookalikes
Source: https://docs.prontohq.com/api-reference/endpoints/signals/company_lookalike
POST /intents/accounts/lookalikes
Find companies that look like your target accounts. Provide one or more LinkedIn company URLs; the API uses them to generate a lookalike search and streams results to your webhook. Location IDs can be retrieved using the Location IDs endpoint.
Find companies that look like your target accounts. Send one or more LinkedIn company URLs; the API uses them (up to 3 for keyword generation) to build a lookalike search and delivers results to your webhook. The response includes an import `id`, `total` count, and a `preview` of the first 10 matching companies.
You must provide either `company_linkedin_url` or `company_linkedin_urls`, plus `webhook_url`. Optionally filter by `company_size`, `included_locations`, and `excluded_locations`, and cap results with `limit`.
## Location IDs Reference
Location IDs used in `included_locations` and `excluded_locations` can be retrieved using the [Location IDs endpoint](/api-reference/endpoints/miscellaneous/location-ids). Provide a location name (e.g. "San Francisco") and the API returns matching locations with their IDs.
# Find connections
Source: https://docs.prontohq.com/api-reference/endpoints/signals/connections
POST /intents/leads/connections
Returns mutual connections between your LinkedIn account and a target lead via LinkedIn Sales Navigator. Results are 1st-degree connections you share with the target. Requires a connected LinkedIn account with Sales Navigator access.
Find mutual connections between your LinkedIn account and a target lead via LinkedIn Sales Navigator.
Returns 1st-degree connections you share with the target.
### Use Cases
* Find mutual connections with a prospect before reaching out
* Discover shared alumni, colleagues, or group members with a target
## Notes
* Requires a connected LinkedIn account with Sales Navigator access
* Accepts public LinkedIn URLs, Sales Nav URLs, or internal URNs
# Find new hires
Source: https://docs.prontohq.com/api-reference/endpoints/signals/find_new_hires
POST /intents/leads/find_new_hires
Find people who recently changed jobs and match your ICP
Track when companies make new hires matching specific ICP.
This endpoint creates a weekly tracking task that will notify you through a webhook when matching new hires are found.
### Use Cases
* Monitor when competitors hire for specific roles
* Track hiring trends in your target market
* Identify companies expanding specific departments
* Get notified about potential customer expansion signals
## Location IDs Reference
Location IDs used in this endpoint can be retrieved using the [Location Ids endpoint](/api-reference/endpoints/miscellaneous/location-ids). Simply provide a location name (e.g., "San Francisco") and the API will return all matching locations with their IDs.
# Find companies growing
Source: https://docs.prontohq.com/api-reference/endpoints/signals/growth
POST /intents/accounts/growth
Start a LinkedIn account (company) search by growth criteria. Only documented fields are allowed; unknown keys return 422.
**Valid criteria (choose one mode):**
1. **Company-wide headcount growth:** Provide at least one of `min_headcount_growth_percentage` or `max_headcount_growth_percentage`. Do not send `department` in this mode.
2. **Department metrics:** Send `department` (LinkedIn function ID as a string, e.g. `"1"`) plus at least one of `min_department_headcount`, `max_department_headcount`, `min_department_headcount_growth_percentage`, or `max_department_headcount_growth_percentage`.
Department fields cannot be combined with company-wide headcount growth fields.
Find companies that are experiencing growth using company-wide headcount growth or department-level metrics. The search runs against LinkedIn account data; matching companies are imported and sent to your webhook.
Send parameters inside a top-level JSON object under the key `account`. Only documented fields are allowed; extra keys under `account` are rejected with a validation error.
## Growth criteria (pick one approach)
**1. Company-wide headcount growth**
Provide at least one of:
* `min_headcount_growth_percentage`
* `max_headcount_growth_percentage`
Do not send `department` in this mode. Company-wide headcount growth and department filters cannot be used together.
**2. Department-level metrics**
Always send `department` (a string ID for the LinkedIn function to target, for example `"1"`). Also include at least one of:
* `min_department_headcount` and/or `max_department_headcount`, or
* `min_department_headcount_growth_percentage` and/or `max_department_headcount_growth_percentage`
`department` alone is not enough. Department headcount or department growth fields without `department` are not allowed.
### Other fields (inside `account`)
* `webhook_url` (**required**): URL that receives results when processing completes.
* `streaming` (optional): Whether to stream results as they are processed.
* `limit` (optional): Maximum number of companies to import. If omitted, the import is still capped at **1000** companies even when the search finds more; the `total` field in the response reflects the full match count from the search when no limit is set.
### Filters
* `company_size`: Array of company size range strings (LinkedIn-style buckets). En-dash characters in values are normalized to hyphens on the server.
* `included_locations`: Array of location IDs to include.
* `excluded_locations`: Array of location IDs to exclude.
* `included_industries`: Array of industry IDs to include.
Allowed `company_size` values:
* `1-10`
* `11-50`
* `51-200`
* `201-500`
* `501-1000`
* `1001-5000`
* `5001-10000`
* `10001+`
For the complete list of industry IDs, see the [LinkedIn Industry List](https://docs.google.com/spreadsheets/d/1qTFPVfcSHnL5PU1AcQlzD8mCmfSICKJ4WuU-OBGhkdI/edit?gid=0#gid=0).
Common industry IDs include:
* `4` - Automotive
* `6` - Technology, Information and Internet
* `12` - Education
* `43` - Financial Services
* `96` - Software Development
### Department validation
`department` must be a string and must be one of the allowed LinkedIn function IDs used by the API.
## Response
Successful requests return **201 Created** with:
* `message`: Confirmation that the account search started and results will be sent to the webhook.
* `id`: UUID of the import job.
* `total`: If `limit` is set, this is the smaller of the search size and `limit`. If `limit` is omitted, this is the full search size (import volume may still be capped at 1000 as above).
* `preview`: Up to **10** sample companies, each with `company_name`, `industry`, `linkedin_id` (numeric ID from the result), and `linkedin_url` in the form `https://www.linkedin.com/company/{linkedin_id}`.
In development environments, responses may also include `account_url` for debugging.
## Example request
```json theme={null}
{
"webhook_url": "https://your-company.com/webhooks/growth",
"min_headcount_growth_percentage": 10,
"company_size": ["51-200"],
"included_locations": [103644278],
"streaming": false
}
```
## Example response
```json theme={null}
{
"message": "Account search started successfully. You will receive the results on your webhook shortly.",
"id": "5d4fabd2-e26d-47d1-b0de-4bf370f7b799",
"total": 150,
"preview": [
{
"company_name": "Acme Inc",
"industry": "Software Development",
"linkedin_id": "123456",
"linkedin_url": "https://www.linkedin.com/company/123456"
}
]
}
```
## Errors
* **401**: Not enough credits to create a list for the number of companies returned by the search (`Insufficient credits`), or Sales Navigator requirements are not met.
* **422**: Invalid combinations of growth parameters, disallowed extra parameters, invalid `department` type or value, or invalid optional filters (company size, locations, industries).
## Location IDs reference
Resolve IDs for `included_locations` and `excluded_locations` using the [Location Ids endpoint](/api-reference/endpoints/miscellaneous/location-ids).
# Find companies hiring
Source: https://docs.prontohq.com/api-reference/endpoints/signals/hiring
POST /intents/accounts/hiring
Start a company hiring-intent search based on job posting activity. Only documented fields are allowed; unknown keys return 422.
Find companies that are actively hiring based on their job posting activity. This endpoint allows you to track companies that are recruiting for specific roles, technologies, or departments.
## Parameters
### Required Parameters
* `webhook_url`: URL to receive hiring intent notifications
### Job Search Parameters
* `selected_keywords`: Array of keywords to include in job search
* `excluded_keywords`: Array of keywords to exclude from job search
* `selected_titles`: Array of job titles to include
* `excluded_titles`: Array of job titles to exclude
* `exclude_consulting_recruiting`: Boolean to exclude consulting and recruiting companies
* `exclude_internships`: Boolean to exclude internship positions
* `published_date`: Time range for job postings (e.g., "last\_24\_hours", "last\_7\_days", etc.)
### Location Parameters
* `included_locations`: Array of cities to include
* `excluded_locations`: Array of cities to exclude
> **Note**: You can specify cities by name (e.g., "New York", "San Francisco", "London", "Paris"). The system will automatically match cities and their surrounding areas.
### Company Filters
* `company_size`: Array of company size ranges to include
* `included_industries`: Array of industry IDs to include
Allowed `company_size` values:
* `1-10`
* `11-50`
* `51-200`
* `201-500`
* `501-1000`
* `1001-5000`
* `5001-10000`
* `10001+`
For the complete list of industry IDs, see the [LinkedIn Industry List](https://docs.google.com/spreadsheets/d/1qTFPVfcSHnL5PU1AcQlzD8mCmfSICKJ4WuU-OBGhkdI/edit?gid=0#gid=0).
Common industry IDs include:
* `4` - Automotive
* `6` - Technology, Information and Internet
* `12` - Education
* `43` - Financial Services
* `96` - Software Development
## Response
The response includes:
* A unique identifier for the hiring intent
* Number of matching job postings
* Optional message about the results
## Example Response
```json theme={null}
{
"preview_count": 13,
"message": "More than 100 results returned, we will only fetch the first 100 results and return it to your webhook",
"id": "5d4fabd2-e26d-47d1-b0de-4bf370f7b799"
}
```
## Notes
* Results will be delivered to your webhook URL as they become available
* If more than 100 results are found, only the first 100 will be processeds
# Post engagers
Source: https://docs.prontohq.com/api-reference/endpoints/signals/post_engagers
POST /intents/leads/posts_engagers
Start an asynchronous extraction of leads that engaged with a LinkedIn post.
Start an asynchronous extraction of leads that engaged with a LinkedIn post. You must provide:
* **post\_url** — A valid LinkedIn post URL (use the link from the **Share** button on the post).
* **webhook\_url** — URL where results will be sent when the job completes.
* **engagement\_type** — One of `reactions`, `comments`, or `all`.
Optionally filter by **persona** (UUID), set a **lead\_list\_name**, **company\_size**, or **exclude\_people\_from\_same\_company**. The API responds immediately with a `search_id` and `expected_profiles_count`; the actual engager profiles are delivered to your webhook.
# Extract posts from a LinkedIn profile or company page
Source: https://docs.prontohq.com/api-reference/endpoints/signals/posts
POST /intents/leads/posts
Returns up to the specified limit of posts for a LinkedIn person profile or company page. The URL is detected automatically: company page URLs use the organization feed; profile URLs use the member profile feed. Results can be narrowed with `posted_within`.
## Use Cases
* Monitor content published by key prospects, customers, or their companies
* Track thought leadership from individuals and brand pages
* Analyze posting patterns and content strategy
* Extract posts for further analysis or engagement tracking
## Parameters
### Required
* `linkedin_url`: LinkedIn profile URL (e.g. `https://www.linkedin.com/in/...`) or company page URL (e.g. `https://www.linkedin.com/company/...`)
* `limit`: Maximum number of posts to return (minimum: 1)
### Optional
* `posted_within`: `last_24_hours`, `last_7_days`, or `last_30_days`. Omit to return posts without this recency filter. Any other value returns `400`.
The Pronto account used for the request must have valid LinkedIn credentials connected.
## Response
The response is a JSON object with a `posts` array. Each post may include:
* `author`: Post author name
* `author_url`: LinkedIn URL of the author (profile or company)
* `content`: Post text content
* `id`: Post ID
* `urn`: LinkedIn URN for the post
* `base_url`: Base post URL
* `post_url`: Full post URL
* `published_at`: Date when the post was published (YYYY-MM-DD format)
* `engagement_count`: Total engagement on the post (reactions + comments)
* `reactions_count`: Number of reactions on the post
* `comments_count`: Number of comments on the post
If the company ID or profile cannot be resolved from the URL, the API returns `200` with an empty `posts` array.
## Example Request
```bash theme={null}
curl --request POST \
--url https://app.prontohq.com/api/v2/intents/leads/posts \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: your-api-key' \
--data '{
"linkedin_url": "https://www.linkedin.com/in/profile",
"limit": 5,
"posted_within": "last_7_days"
}'
```
For a company page, use the same field with the company URL, for example `"linkedin_url": "https://www.linkedin.com/company/example"`.
## Example Response
```json theme={null}
{
"posts": [
{
"author": "Author Name",
"author_url": "https://www.linkedin.com/in/author-profile",
"content": "Post content text...",
"id": "1234567890",
"urn": "urn:li:activity:1234567890",
"base_url": "https://www.linkedin.com/feed/update/...",
"post_url": "https://www.linkedin.com/posts/...",
"published_at": "2026-01-15",
"engagement_count": 142,
"reactions_count": 128,
"comments_count": 14
}
]
}
```
## Errors (400)
* Missing `limit`: `Missing required keys: limit`
* Missing `linkedin_url`: `Missing required keys: linkedin_url`
* Invalid `posted_within`: `Invalid posted_within. Use last_24_hours, last_7_days, last_30_days, or omit the key.`
## Notes
* Synchronous response (`200 OK`) with `{ "posts": [...] }`
* Recency filtering is applied after posts are fetched from LinkedIn
# Extract reactions from LinkedIn profile
Source: https://docs.prontohq.com/api-reference/endpoints/signals/reactions
POST /intents/leads/reactions
Extract reactions left by a LinkedIn profile on other posts. Paginates through the profile's feed activity and filters for reaction-type elements, returning up to the specified limit.
Extract the LinkedIn reactions left by a profile on other people's posts. This endpoint paginates through the profile's feed activity and filters for reaction-type elements, returning up to the specified limit.
## Use Cases
* Surface intent signals from prospects actively engaging with relevant content
* Identify which topics a lead is reacting to (celebrating, finding insightful, etc.) to personalise outreach
* Track engagement patterns of key prospects or customers
* Enrich lead profiles with recent activity data
## Parameters
### Required Parameters
* `linkedin_profile_url`: LinkedIn profile URL to extract reactions from (e.g., `https://www.linkedin.com/in/mathieu-brun-picard/`)
* `limit`: Maximum number of reactions to extract (minimum: 1)
## Response
The response includes an array of reactions with the following fields:
* `id`: Numeric activity ID extracted from the URN
* `reaction_type`: Type of reaction — one of `LIKE`, `CELEBRATE`, `INSIGHTFUL`, `FUNNY`, `SUPPORT`, `LOVE`
* `post_url`: Full LinkedIn URL of the post that was reacted to
* `author`: Full name of the post author
* `author_url`: LinkedIn profile URL of the post author
* `reacted_at`: Date when the reaction was made (`YYYY-MM-DD` format)
* `urn`: LinkedIn URN identifying the activity (`urn:li:activity:`)
## Example Request
```bash theme={null}
curl --request POST \
--url https://app.prontohq.com/api/v2/intents/leads/reactions \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: your-api-key' \
--data '{
"linkedin_profile_url": "https://www.linkedin.com/in/mathieu-brun-picard/",
"limit": 10
}'
```
## Example Response
```json theme={null}
{
"reactions": [
{
"id": "1234567890123456789",
"reaction_type": "CELEBRATE",
"post_url": "https://www.linkedin.com/posts/jane-smith_post-title-activity-1234567890123456789-abcd",
"author": "Jane Smith",
"author_url": "https://www.linkedin.com/in/jane-smith",
"reacted_at": "2026-03-11",
"urn": "urn:li:activity:1234567890123456789"
},
{
"id": "9876543210987654321",
"reaction_type": "INSIGHTFUL",
"post_url": "https://www.linkedin.com/posts/bob-jones_another-post-activity-9876543210987654321-efgh",
"author": "Bob Jones",
"author_url": "https://www.linkedin.com/in/bob-jones",
"reacted_at": "2026-03-10",
"urn": "urn:li:activity:9876543210987654321"
},
{
"id": "1122334455667788990",
"reaction_type": "LIKE",
"post_url": "https://www.linkedin.com/posts/alice-martin_third-post-activity-1122334455667788990-ijkl",
"author": "Alice Martin",
"author_url": "https://www.linkedin.com/in/alice-martin",
"reacted_at": "2026-03-09",
"urn": "urn:li:activity:1122334455667788990"
}
]
}
```
## Notes
* This endpoint returns results synchronously (HTTP 200 OK) — no polling required
* The service paginates through the profile's feed until the limit is reached or the feed is exhausted
* `reaction_type` reflects the LinkedIn reaction emoji: `LIKE` (👍), `CELEBRATE` (👏), `INSIGHTFUL` (💡), `FUNNY` (😄), `SUPPORT` (🤝), `LOVE` (❤️)
* `author_url` is returned with tracking query parameters stripped
# Track job changes
Source: https://docs.prontohq.com/api-reference/endpoints/signals/track_job_changes
POST /intents/leads/track_job_changes
Track job changes for a list of LinkedIn profiles
This endpoint allows you to monitor job changes for a list of contacts on LinkedIn. When any of the tracked contacts changes their job, you'll receive a notification through the specified webhook URL.
## Use Cases
* Monitor when your champions or product users change jobs
* Track career movements of potential leads
* Stay informed about your network's professional changes
## Important Notes
* You can identify contacts either by their LinkedIn URL or by their name and current company
* The system checks for job changes daily
## Contact Identification
You can identify contacts in two ways:
1. **Using LinkedIn URL**
```json theme={null}
{
"linkedin_url": "https://www.linkedin.com/in/mathieu-brun-picard/"
}
```
2. **Using Name and Company**
```json theme={null}
{
"first_name": "Nicolas",
"last_name": "Fernandez Le Follic",
"company_name": "Pronto"
}
```
## Webhook Notifications
When a contact changes their job, you'll receive a webhook notification with details about the change. Make sure your webhook endpoint is ready to receive POST requests.
# Main use cases
Source: https://docs.prontohq.com/api-reference/main-use-cases
## How to use Pronto API
Find leads using live data in a specific company
-> 2x results than Clay
Enrich company accounts with specific data
-> # of SDR, Growth rate,...
Enrich contacts with email & phone
-> 20+ sources
## Get my API key
You need your personal API key to use the Pronto API, which you can generate [here](https://app.prontohq.com/settings/apis/keys).
# MCP Server
Source: https://docs.prontohq.com/api-reference/mcp
Connect any MCP-compatible AI assistant to Pronto to find companies, search leads, and enrich contacts from a chat interface.
The Pronto MCP server enables your AI agents and tools to interact directly with Pronto's products via the [Model Context Protocol](https://modelcontextprotocol.io). Once connected, your AI assistant can find companies, search leads, and enrich contacts on your behalf.
**Server URL:** `https://mcp.prontohq.com/mcp`
Two authentication methods are supported: **OAuth** (for Claude and ChatGPT) and **API key** (for Claude Code, Cursor, and any MCP-compatible tool that supports custom headers).
## Prerequisites
* A Pronto account with an [API key](/api-reference/API-key)
* Node.js — only required for Claude Code and Cursor
## Installation
### Claude
In the Claude sidebar, click **Customize**, then go to **Connectors**.
Click **+**, then **Add custom connector**.
Set **Name** to `Pronto` and **URL** to `https://mcp.prontohq.com/mcp`, then save.
Follow the OAuth flow to connect your Pronto account.
### ChatGPT
Go to **Settings → Apps → Advanced settings** and activate **Developer mode**.
Click **Create app**.
Set **Name** to `Pronto`, **MCP server URL** to `https://mcp.prontohq.com/mcp`, and **Authentication** to `OAuth`, then save.
Follow the OAuth flow to connect your Pronto account.
### Claude Code
Run the following command in your terminal, replacing `YOUR-API-KEY` with your Pronto API key:
```bash theme={null}
claude mcp add pronto -e API_KEY=YOUR-API-KEY -- npx mcp-remote https://mcp.prontohq.com/mcp --header "X-API-Key:\${API_KEY}"
```
## Available tools
Tools trigger actions on behalf of the user based on the goals and information already in the LLM's context.
### Companies
| Tool | Description |
| -------------------------- | ------------------------------------------------------------------------------------ |
| `enrich_account` | Enrich a company with firmographic data |
| `search_accounts` | Search companies on LinkedIn Sales Navigator by filters |
| `preview_search_accounts` | Preview an account search to estimate result count and credit cost before running it |
| `find_lookalike_companies` | Find companies similar to one or more reference companies |
| `get_company_stack` | Get the technology stack of a company |
| `get_company_hiring` | Get active job openings for a company |
| `get_headcount` | Get department headcount evolution (3-month, 6-month, 12-month) for a company |
### Leads
| Tool | Description |
| ------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| `search_leads` | Extract leads from a LinkedIn Sales Navigator URL |
| `search_leads_in_company` | Search for leads at a specific company |
| `advanced_search_leads` | Search for leads using advanced filters (job titles, locations, seniority, company size, industries, signals…) |
| `preview_advanced_search_leads` | Preview an advanced lead search to estimate result count and credit cost before running it |
| `get_searches` | Retrieve all lead searches |
| `get_search` | Get the status and results of a lead search |
### Contacts
| Tool | Description |
| ------------------------ | ------------------------------------------------------------- |
| `single_enrich_contact` | Synchronously enrich a single contact with email and/or phone |
| `bulk_enrich_contacts` | Enrich multiple contacts with email or phone (min 2, max 100) |
| `get_contact_enrichment` | Get the enrichment result for a contact by its enrichment ID |
### Lists
| Tool | Description |
| ------------- | -------------------------------------------------------------------------------- |
| `create_list` | Create a new company list and push companies into it on LinkedIn Sales Navigator |
| `get_lists` | Retrieve all Sales Navigator lists |
| `get_list` | Retrieve a single list by its ID |
| `update_list` | Add companies to an existing Sales Navigator list |
### Personas
| Tool | Description |
| ---------------- | --------------------------------------------------- |
| `list_personas` | Retrieve all personas defined in the Pronto account |
| `get_persona` | Retrieve a single persona by its UUID |
| `create_persona` | Create a new persona |
| `update_persona` | Update an existing persona by its UUID |
| `delete_persona` | Delete a persona by its UUID |
### Signals
| Tool | Description |
| ----------------------- | ---------------------------------------------------------------------------------------------- |
| `extract_posts` | Extract recent posts from a LinkedIn profile or company page |
| `extract_reactions` | Extract posts that a LinkedIn member has reacted to |
| `extract_comments` | Extract comments made by a LinkedIn member |
| `extract_post_engagers` | Extract people who reacted or commented on a LinkedIn post |
| `find_connections` | Find mutual 1st-degree LinkedIn connections between your account and a target LinkedIn profile |
### Jobs
| Tool | Description |
| ---------------- | ----------------------------------- |
| `get_job_result` | Poll for the result of an async job |
### Utilities
| Tool | Description |
| ------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| `search_locations` | Search for LinkedIn Sales Navigator location IDs by name |
| `search_industries` | Search for LinkedIn industry IDs by name — call this before `advanced_search_leads` when the user mentions an industry |
| `get_credits` | Get remaining Pronto credits |
## Example prompts
Here are some examples of what you can ask your AI agent to do with the Pronto MCP server.
### People enrichment
> Find the workers at ProntoHQ and find their phones and emails.
The agent uses `enrich_account` to find ProntoHQ's LinkedIn ID, then `search_leads_in_company` to list employees, then `bulk_enrich_contacts` to retrieve their emails and phones.
### Targeted prospecting
> Find the \[job title] of \[industry] companies in Paris.
The agent uses `search_locations` to get the Paris location ID, then `search_accounts` to find \[industry] companies, then `search_leads_in_company` to find \[job title] at each company, then `bulk_enrich_contacts` to retrieve their emails and phones.
## Roadmap
The MCP server is updated regularly. Upcoming work:
* Additional tools for Signals and Lists
* CSV download support
* Custom UI cards
* Token-usage optimizations
# Changelog
Source: https://docs.prontohq.com/changelog
Recent updates and improvements to the Pronto API.
## Week of May 31, 2026
### New features
* **Company hiring (job postings).** The new [`POST /accounts/company_hiring`](/api-reference/endpoints/accounts/company-hiring) endpoint returns the list of open job postings indexed for a company. Identify the company with `company_domain`, `company_name`, or `company_linkedin_url`, and optionally narrow to recent posts with `posted_within_days`. Each job includes title, URL, location, employment status, posting date, description, hiring team, and company info. Costs 3 credits per request and is rate-limited to 20 requests per second.
## Week of May 10, 2026
### Updates
* **Filter leads by connections of a profile.** [`POST /leads/advanced_search`](/api-reference/endpoints/leads/advanced_search) and its [preview](/api-reference/endpoints/leads/advanced_search_preview) now accept `connections_of_profile`, a LinkedIn profile URL whose 1st-degree connections become the search audience. Combine it with the usual title, seniority, function, and company filters to mine a specific person's network.
* **Personal email enrichment.** Waterfall enrichment now supports `personal_email` as an `enrichment_type` on both the [async](/api-reference/endpoints/contacts/single_enrich) and [synchronous](/api-reference/endpoints/contacts/sync_single_enrich) waterfall endpoints (single and bulk). Combine it with `email` and `phone` in a single call to retrieve professional email, personal email, and phone in one waterfall. Requests with `personal_email` (or `phone`) must include `linkedin_url`, and personal email enrichment requires per-user GDPR consent — without it, the API returns `422`.
* **Scope phone lookups by country.** All [waterfall enrichment endpoints](/api-reference/endpoints/contacts/single_enrich) (sync, async single, and async bulk) now accept an optional `phone_country_codes` array. Pass ISO country codes to restrict phone results to specific regions and avoid spending credits on out-of-scope numbers.
* **Validation status on enriched emails.** Contact responses now include `email_status` (and `personal_email_status` once a personal email is found) so you can see at a glance whether each address is `valid`, `risky`, or `invalid` without a separate verification call. Returned by [`GET /contacts/{id}`](/api-reference/endpoints/contacts/single_enrich) and the synchronous waterfall.
* **Multiple phone numbers per contact.** The `phone` field in waterfall responses is now an array of E.164-formatted strings, so contacts with several numbers no longer have results truncated to one.
## Week of May 3, 2026
### New features
* **Advanced lead search.** The new [`POST /leads/advanced_search`](/api-reference/endpoints/leads/advanced_search) endpoint runs a full lead search from a structured filter set (titles, seniority, function, tenure, locations, industries, company size, signals, and more) and streams enriched leads to your webhook. No need to build a Sales Navigator URL yourself — Pronto translates the filters for you.
* **Search previews for leads and accounts.** Validate filters and size an audience before kicking off a full run. The new preview endpoints return synchronously with the total estimated count plus the first 25 matches, and don't consume credits or trigger webhooks:
* [`POST /leads/advanced_search/preview`](/api-reference/endpoints/leads/advanced_search_preview)
* [`POST /accounts/search/preview`](/api-reference/endpoints/accounts/search_preview)
### Updates
* **Engagement counts on LinkedIn posts.** [Extract posts](/api-reference/endpoints/signals/posts) responses now include `engagement_count`, `reactions_count`, and `comments_count` for each post, so you can rank or filter content by traction without a second call.
* **More MCP tools.** The [Pronto MCP server](/api-reference/mcp) now exposes `advanced_search_leads` for filter-based lead search, plus list management tools (`create_list`, `get_lists`, `get_list`, `update_list`) so AI assistants can build and update Sales Navigator lists on your behalf.
## Week of April 26, 2026
### New features
* **MCP server for AI assistants.** Connect any MCP-compatible AI assistant — including Claude Desktop, Claude Code, and Cursor — directly to Pronto. Once installed, your assistant can find companies, search leads, and enrich contacts from a chat interface using your existing API key. See the [MCP server guide](/api-reference/mcp) for installation instructions and example prompts.
* **Search by saved Persona on Find People in Company.** You can now pass a `persona_id` to the [Find People in Company](/api-reference/endpoints/extract/leads_from_company) endpoint to drive a search from a Persona you've already defined in Pronto. When `persona_id` is provided, included and excluded job titles are taken from the saved Persona — no need to inline them in the request.
Pass one or the other: combining `persona_id` with `job_titles` or `excluded_job_titles` returns a `422`. See the [Personas endpoints](/api-reference/endpoints/personas/index) to list available Persona IDs.
### Updates
* **More flexible people filters on Find People in Company.** [Find People in Company](/api-reference/endpoints/extract/leads_from_company) now accepts any one of `job_titles`, `excluded_job_titles`, `functions`, `seniority_levels`, `included_locations`, `excluded_locations`, or `persona_id` to satisfy the "at least one filter" requirement. Previously only `job_titles` or `persona_id` counted. Requests with none of these return `400`.