# 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