API reference

Apollo Scraper API

Create Apollo people, company and mobile number exports, find emails and phone numbers, and verify email lists from your own apps, track their progress, and download the finished CSV. It's a simple JSON REST API that uses the same credits as your dashboard.

Base URLhttps://api.apolloscrapers.com/api/v1

How it works

  1. 1

    Create an order

    POST an Apollo search URL to a scraper endpoint, or a list to a data tool. Credits are deducted up front.

  2. 2

    Track progress

    Poll the order, or receive a webhook as it moves to processing and delivered.

  3. 3

    Download the CSV

    Fetch the file from download_url. Undelivered leads are refunded automatically.

Quickstart

Three requests take you from a fresh API key to a downloaded CSV.

1

Check your key and balance

Store your key in an environment variable, then call /me. A 200 response means you're connected.

GET /me
curl "https://api.apolloscrapers.com/api/v1/me" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY"
2

Create an order

Send an Apollo search URL to a scraper endpoint. Save the order_id from the response.

POST /apollo-people-scraper
curl -X POST "https://api.apolloscrapers.com/api/v1/apollo-people-scraper" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: people-order-2026-09-10-001" \
  -d '{
    "search_url": "https://app.apollo.io/#/people?personTitles[]=founder&personLocations[]=United%20States",
    "results_file_name": "apollo-founders-usa",
    "contact_count": 1000,
    "verify_emails": "yes",
    "note": "US founders only",
    "callback_url": "https://example.com/webhooks/apollo-scraper"
  }'
3

Check status and download

Poll the order until status is completed, then download the file from download_url. Or skip polling with a callback_url.

GET /orders/{order_id}
curl "https://api.apolloscrapers.com/api/v1/orders/ord_8f2c41d9a7b34e01" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY"

Authentication

Every request needs your API key in the Authorization header as a bearer token. Create, view or regenerate your key on the API Key page.

Your key can spend your credits. Keep it on your server, never in browser or mobile code, and regenerate it right away if it leaks. Regenerating instantly disables the old key.
Authorization: Bearer YOUR_API_KEY
Store your key
export APOLLO_SCRAPER_API_KEY="as_live_..."

Credits & pricing

Each scraper has its own credit rate (see the table below). Credits are deducted when an order is accepted; if fewer leads are delivered or the order is cancelled, the difference is refunded automatically. Credits cost $3 per 1,000.

ServiceEndpointCredits / 1,000Min. per order
People/apollo-people-scraper1,000(+300 with verify_emails)1,000
Company/apollo-company-scraper8341,000
Mobile Number/apollo-mobile-scraper20,000100
Email Finder/email-finder5,000100
Phone Number Finder/phone-finder20,000100
Email Verifier/email-verifier500100

Maximum 1,000,000 leads per order. Live values are always available from GET /pricing.

Errors

Errors use standard HTTP status codes and always return the same JSON shape, with a stable code you can branch on and a readable message.

Status codes

  • 400Invalid request: the message names the field
  • 401Missing, invalid or revoked API key
  • 402Not enough credits for this order
  • 403Account suspended
  • 404Order not found
  • 409File not ready yet
  • 410File expired
  • 429Rate limit exceeded
  • 500Something went wrong on our side
Error response
{
  "error": {
    "code": "insufficient_credits",
    "message": "Insufficient credits for this order."
  }
}

Rate limits

Each API key can make 60 requests per minute. Every response includes X-RateLimit-Limit and X-RateLimit-Remaining. Over the limit you get a 429; wait a few seconds and retry.

Polling an order? Once a minute is plenty, or use webhooks and skip polling entirely.

Idempotency

Network hiccups happen. Add an Idempotency-Key header (8–100 characters, unique per order) to create requests. If you retry with the same key, you get the original order back instead of being charged twice.

Scrapers

Apollo People Scraper

POSThttps://api.apolloscrapers.com/api/v1/apollo-people-scraper

Create an Apollo people export from a filtered Apollo people search URL. Add email verification and a note when the filter setup needs extra context.

Body parameters

  • search_urlstringrequired

    Full Apollo people search URL copied from the browser address bar (https://app.apollo.io/#/people?...).

  • results_file_namestringrequired

    Name used for the order in your history and for the delivered CSV (1–120 characters).

  • contact_countnumberrequired

    Number of leads to export. Minimum 1,000, maximum 1,000,000.

  • verify_emailsstringoptional

    Set to yes to verify emails before delivery (+300 credits per 1,000 leads). Defaults to no. Booleans are accepted too.

    yesno
  • notestringoptional

    Optional filter notes or delivery instructions for our team (max 1,000 characters).

  • callback_urlstringoptional

    Public HTTPS URL notified when the order moves to processing, delivered or cancelled.

Headers

  • Authorizationstringrequired

    Bearer YOUR_API_KEY

  • Content-Typestringrequired

    application/json

  • Idempotency-Keystringoptional

    Makes retries safe. Sending the same key again returns the original order.

Returns

  • messagestring

    Human-readable confirmation for the accepted order.

  • order_idstring

    Unique order ID. Use it to check status and download the result file.

  • order_numbernumber

    Short order number shown in your dashboard.

  • servicestring

    Service that received the order.

    peoplecompanymobileemail_finderphone_finderemail_verifier
  • statusstring

    Current processing status. New orders start as pending.

    pendingqueuedprocessingcompletedcancelled
  • contact_countnumber

    Number of leads requested.

  • credits_deductednumber

    Credits deducted from your balance for this order. Undelivered leads are refunded automatically.

  • new_balancenumber

    Your credit balance after the deduction.

  • status_urlstring

    Authenticated endpoint to poll for status and result details.

  • download_urlstring | null

    Public link to the result file once the order is completed (no API key needed, valid until the file expires); null until then.

  • callback_urlstring | null

    Webhook URL accepted for this order, or null when none was supplied.

  • callback_signing_secretstring | null

    Returned once when callback_url is supplied. Store it to verify webhook signatures.

Status codes

  • 201Order created
  • 400Invalid request
  • 401API key missing or invalid
  • 402Insufficient credits
  • 403Account suspended
  • 429Rate limit exceeded
  • 500Server error

Good to know

  • Minimum contact_count is 1,000; maximum is 1,000,000.
  • Costs 1,000 credits per 1,000 leads, plus 300 per 1,000 with verify_emails.
  • Credits are checked and deducted when the order is accepted. If fewer leads are delivered, or the order is cancelled, the difference is refunded automatically.
  • Send an Idempotency-Key header to retry safely: the same key returns the original order instead of creating a new one.
  • Poll status_url with the same bearer token. download_url is populated only after status becomes completed.
  • When callback_url is provided, store callback_signing_secret securely; it is shown only in the creation response.
  • Delivered files remain available for up to six months from the delivery date.
POST /apollo-people-scraper
curl -X POST "https://api.apolloscrapers.com/api/v1/apollo-people-scraper" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: people-order-2026-09-10-001" \
  -d '{
    "search_url": "https://app.apollo.io/#/people?personTitles[]=founder&personLocations[]=United%20States",
    "results_file_name": "apollo-founders-usa",
    "contact_count": 1000,
    "verify_emails": "yes",
    "note": "US founders only",
    "callback_url": "https://example.com/webhooks/apollo-scraper"
  }'
Response · 201
{
  "message": "Order created successfully",
  "order_id": "ord_8f2c41d9a7b34e01",
  "order_number": 1042,
  "service": "people",
  "status": "pending",
  "contact_count": 1000,
  "credits_deducted": 1300,
  "new_balance": 11100,
  "status_url": "https://api.apolloscrapers.com/api/v1/orders/ord_8f2c41d9a7b34e01",
  "download_url": null,
  "callback_url": "https://example.com/webhooks/apollo-scraper",
  "callback_signing_secret": "whsec_3b9f0c2e7d41a8b6c5e0f19d2a7c4b81e6f3d905"
}

Scrapers

Apollo Company Scraper

POSThttps://api.apolloscrapers.com/api/v1/apollo-company-scraper

Create an Apollo company export from a filtered Apollo companies search URL: domains, industries, headcount, revenue and locations.

Body parameters

  • search_urlstringrequired

    Full Apollo companies search URL copied from the browser address bar (https://app.apollo.io/#/companies?...).

  • results_file_namestringrequired

    Name used for the order in your history and for the delivered CSV (1–120 characters).

  • contact_countnumberrequired

    Number of leads to export. Minimum 1,000, maximum 1,000,000.

  • notestringoptional

    Optional filter notes or delivery instructions for our team (max 1,000 characters).

  • callback_urlstringoptional

    Public HTTPS URL notified when the order moves to processing, delivered or cancelled.

Headers

  • Authorizationstringrequired

    Bearer YOUR_API_KEY

  • Content-Typestringrequired

    application/json

  • Idempotency-Keystringoptional

    Makes retries safe. Sending the same key again returns the original order.

Returns

  • messagestring

    Human-readable confirmation for the accepted order.

  • order_idstring

    Unique order ID. Use it to check status and download the result file.

  • order_numbernumber

    Short order number shown in your dashboard.

  • servicestring

    Service that received the order.

    peoplecompanymobileemail_finderphone_finderemail_verifier
  • statusstring

    Current processing status. New orders start as pending.

    pendingqueuedprocessingcompletedcancelled
  • contact_countnumber

    Number of leads requested.

  • credits_deductednumber

    Credits deducted from your balance for this order. Undelivered leads are refunded automatically.

  • new_balancenumber

    Your credit balance after the deduction.

  • status_urlstring

    Authenticated endpoint to poll for status and result details.

  • download_urlstring | null

    Public link to the result file once the order is completed (no API key needed, valid until the file expires); null until then.

  • callback_urlstring | null

    Webhook URL accepted for this order, or null when none was supplied.

  • callback_signing_secretstring | null

    Returned once when callback_url is supplied. Store it to verify webhook signatures.

Status codes

  • 201Order created
  • 400Invalid request
  • 401API key missing or invalid
  • 402Insufficient credits
  • 403Account suspended
  • 429Rate limit exceeded
  • 500Server error

Good to know

  • Minimum contact_count is 1,000; maximum is 1,000,000.
  • Costs 834 credits per 1,000 leads.
  • Credits are checked and deducted when the order is accepted. If fewer leads are delivered, or the order is cancelled, the difference is refunded automatically.
  • Send an Idempotency-Key header to retry safely: the same key returns the original order instead of creating a new one.
  • Poll status_url with the same bearer token. download_url is populated only after status becomes completed.
  • When callback_url is provided, store callback_signing_secret securely; it is shown only in the creation response.
  • Delivered files remain available for up to six months from the delivery date.
POST /apollo-company-scraper
curl -X POST "https://api.apolloscrapers.com/api/v1/apollo-company-scraper" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: company-order-2026-09-10-001" \
  -d '{
    "search_url": "https://app.apollo.io/#/companies?organizationLocations[]=Germany&organizationNumEmployeesRanges[]=51%2C200",
    "results_file_name": "saas-companies-germany",
    "contact_count": 1000,
    "note": "B2B SaaS only",
    "callback_url": "https://example.com/webhooks/apollo-scraper"
  }'
Response · 201
{
  "message": "Order created successfully",
  "order_id": "ord_8f2c41d9a7b34e01",
  "order_number": 1042,
  "service": "company",
  "status": "pending",
  "contact_count": 1000,
  "credits_deducted": 834,
  "new_balance": 11566,
  "status_url": "https://api.apolloscrapers.com/api/v1/orders/ord_8f2c41d9a7b34e01",
  "download_url": null,
  "callback_url": "https://example.com/webhooks/apollo-scraper",
  "callback_signing_secret": "whsec_3b9f0c2e7d41a8b6c5e0f19d2a7c4b81e6f3d905"
}

Scrapers

Apollo Mobile Number Scraper

POSThttps://api.apolloscrapers.com/api/v1/apollo-mobile-scraper

Create an Apollo people export that includes direct dial and mobile phone numbers where available.

Body parameters

  • search_urlstringrequired

    Full Apollo people search URL copied from the browser address bar (https://app.apollo.io/#/people?...).

  • results_file_namestringrequired

    Name used for the order in your history and for the delivered CSV (1–120 characters).

  • contact_countnumberrequired

    Number of leads to export. Minimum 100, maximum 1,000,000.

  • notestringoptional

    Optional filter notes or delivery instructions for our team (max 1,000 characters).

  • callback_urlstringoptional

    Public HTTPS URL notified when the order moves to processing, delivered or cancelled.

Headers

  • Authorizationstringrequired

    Bearer YOUR_API_KEY

  • Content-Typestringrequired

    application/json

  • Idempotency-Keystringoptional

    Makes retries safe. Sending the same key again returns the original order.

Returns

  • messagestring

    Human-readable confirmation for the accepted order.

  • order_idstring

    Unique order ID. Use it to check status and download the result file.

  • order_numbernumber

    Short order number shown in your dashboard.

  • servicestring

    Service that received the order.

    peoplecompanymobileemail_finderphone_finderemail_verifier
  • statusstring

    Current processing status. New orders start as pending.

    pendingqueuedprocessingcompletedcancelled
  • contact_countnumber

    Number of leads requested.

  • credits_deductednumber

    Credits deducted from your balance for this order. Undelivered leads are refunded automatically.

  • new_balancenumber

    Your credit balance after the deduction.

  • status_urlstring

    Authenticated endpoint to poll for status and result details.

  • download_urlstring | null

    Public link to the result file once the order is completed (no API key needed, valid until the file expires); null until then.

  • callback_urlstring | null

    Webhook URL accepted for this order, or null when none was supplied.

  • callback_signing_secretstring | null

    Returned once when callback_url is supplied. Store it to verify webhook signatures.

Status codes

  • 201Order created
  • 400Invalid request
  • 401API key missing or invalid
  • 402Insufficient credits
  • 403Account suspended
  • 429Rate limit exceeded
  • 500Server error

Good to know

  • Minimum contact_count is 100; maximum is 1,000,000.
  • Costs 20,000 credits per 1,000 leads.
  • Credits are checked and deducted when the order is accepted. If fewer leads are delivered, or the order is cancelled, the difference is refunded automatically.
  • Send an Idempotency-Key header to retry safely: the same key returns the original order instead of creating a new one.
  • Poll status_url with the same bearer token. download_url is populated only after status becomes completed.
  • When callback_url is provided, store callback_signing_secret securely; it is shown only in the creation response.
  • Delivered files remain available for up to six months from the delivery date.
POST /apollo-mobile-scraper
curl -X POST "https://api.apolloscrapers.com/api/v1/apollo-mobile-scraper" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: mobile-order-2026-09-10-001" \
  -d '{
    "search_url": "https://app.apollo.io/#/people?personTitles[]=head%20of%20sales&personLocations[]=United%20Kingdom",
    "results_file_name": "uk-sales-leaders-mobile",
    "contact_count": 500,
    "note": "Prioritise contacts with mobile numbers",
    "callback_url": "https://example.com/webhooks/apollo-scraper"
  }'
Response · 201
{
  "message": "Order created successfully",
  "order_id": "ord_8f2c41d9a7b34e01",
  "order_number": 1042,
  "service": "mobile",
  "status": "pending",
  "contact_count": 500,
  "credits_deducted": 10000,
  "new_balance": 2400,
  "status_url": "https://api.apolloscrapers.com/api/v1/orders/ord_8f2c41d9a7b34e01",
  "download_url": null,
  "callback_url": "https://example.com/webhooks/apollo-scraper",
  "callback_signing_secret": "whsec_3b9f0c2e7d41a8b6c5e0f19d2a7c4b81e6f3d905"
}

Data tools

Email Finder

POSThttps://api.apolloscrapers.com/api/v1/email-finder

Find work emails for a list of people. Send names with a company domain (or company name, or LinkedIn URL) and get each row back with email and email_status.

Body parameters

  • rowsobject[]required

    Your list, one object per person. Needs first_name, last_name and company_domain (company_name or linkedin_url also work). Extra keys are kept and returned in the result. Between 100 and 100,000 rows per order. With multipart/form-data, send a CSV file instead.

  • filefileoptional

    multipart/form-data only: your list as a UTF-8 CSV with a header row (max 1 GB). Use it instead of rows.

  • results_file_namestringrequired

    Name used for the order in your history and for the delivered CSV (1–120 characters).

  • notestringoptional

    Optional instructions for our team (max 1,000 characters).

  • callback_urlstringoptional

    Public HTTPS URL notified when the order moves to processing, delivered or cancelled.

Headers

  • Authorizationstringrequired

    Bearer YOUR_API_KEY

  • Content-Typestringrequired

    application/json or multipart/form-data

  • Idempotency-Keystringoptional

    Makes retries safe. Sending the same key again returns the original order.

Returns

  • messagestring

    Human-readable confirmation for the accepted order.

  • order_idstring

    Unique order ID. Use it to check status and download the result file.

  • order_numbernumber

    Short order number shown in your dashboard.

  • servicestring

    Service that received the order.

    peoplecompanymobileemail_finderphone_finderemail_verifier
  • statusstring

    Current processing status. New orders start as pending.

    pendingqueuedprocessingcompletedcancelled
  • row_countnumber

    Rows we counted in your list.

  • credits_deductednumber

    Credits deducted from your balance for this order. Undelivered leads are refunded automatically.

  • new_balancenumber

    Your credit balance after the deduction.

  • status_urlstring

    Authenticated endpoint to poll for status and result details.

  • download_urlstring | null

    Public link to the result file once the order is completed (no API key needed, valid until the file expires); null until then.

  • callback_urlstring | null

    Webhook URL accepted for this order, or null when none was supplied.

  • callback_signing_secretstring | null

    Returned once when callback_url is supplied. Store it to verify webhook signatures.

Status codes

  • 201Order created
  • 400Invalid request
  • 401API key missing or invalid
  • 402Insufficient credits
  • 403Account suspended
  • 429Rate limit exceeded
  • 500Server error

Good to know

  • Costs 5,000 credits per 1,000 results found.
  • Credits for every row are reserved when the order is accepted. When the file is delivered you're only charged for the results we found; the rest is refunded automatically.
  • Between 100 and 100,000 rows per order. Split bigger lists into several orders.
  • Send an Idempotency-Key header to retry safely: the same key returns the original order instead of creating a new one.
  • The delivered CSV is your list with the new columns added. Poll status_url or use callback_url, then download it from download_url.
POST /email-finder
curl -X POST "https://api.apolloscrapers.com/api/v1/email-finder" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: email_finder-order-2026-10-27-001" \
  -d '{
    "results_file_name": "q4-target-accounts-emails",
    "rows": [
      {
        "first_name": "Ava",
        "last_name": "Reed",
        "company_domain": "northwindlabs.com"
      },
      {
        "first_name": "Liam",
        "last_name": "Hart",
        "company_domain": "globexcloud.com"
      }
    ],
    "note": "Priority list for Q4",
    "callback_url": "https://example.com/webhooks/apollo-scraper"
  }'
Or upload a CSV (multipart/form-data)
curl -X POST "https://api.apolloscrapers.com/api/v1/email-finder" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY" \
  -H "Idempotency-Key: email_finder-upload-2026-10-27-001" \
  -F "results_file_name=q4-target-accounts-emails" \
  -F "file=@people.csv" \
  -F "callback_url=https://example.com/webhooks/apollo-scraper"
Response · 201
{
  "message": "Order created successfully",
  "order_id": "ord_8f2c41d9a7b34e01",
  "order_number": 1043,
  "service": "email_finder",
  "status": "pending",
  "row_count": 100,
  "credits_deducted": 500,
  "new_balance": 11900,
  "status_url": "https://api.apolloscrapers.com/api/v1/orders/ord_8f2c41d9a7b34e01",
  "download_url": null,
  "callback_url": "https://example.com/webhooks/apollo-scraper",
  "callback_signing_secret": "whsec_3b9f0c2e7d41a8b6c5e0f19d2a7c4b81e6f3d905"
}

Data tools

Phone Number Finder

POSThttps://api.apolloscrapers.com/api/v1/phone-finder

Find mobile and direct-dial numbers for a list of people. LinkedIn URLs give the best match rate; names with a company domain work too. Rows come back with phone and phone_type.

Body parameters

  • rowsobject[]required

    Your list, one object per person. Needs linkedin_url, or first_name, last_name and company_domain. Extra keys are kept and returned in the result. Between 100 and 100,000 rows per order. With multipart/form-data, send a CSV file instead.

  • filefileoptional

    multipart/form-data only: your list as a UTF-8 CSV with a header row (max 1 GB). Use it instead of rows.

  • results_file_namestringrequired

    Name used for the order in your history and for the delivered CSV (1–120 characters).

  • notestringoptional

    Optional instructions for our team (max 1,000 characters).

  • callback_urlstringoptional

    Public HTTPS URL notified when the order moves to processing, delivered or cancelled.

Headers

  • Authorizationstringrequired

    Bearer YOUR_API_KEY

  • Content-Typestringrequired

    application/json or multipart/form-data

  • Idempotency-Keystringoptional

    Makes retries safe. Sending the same key again returns the original order.

Returns

  • messagestring

    Human-readable confirmation for the accepted order.

  • order_idstring

    Unique order ID. Use it to check status and download the result file.

  • order_numbernumber

    Short order number shown in your dashboard.

  • servicestring

    Service that received the order.

    peoplecompanymobileemail_finderphone_finderemail_verifier
  • statusstring

    Current processing status. New orders start as pending.

    pendingqueuedprocessingcompletedcancelled
  • row_countnumber

    Rows we counted in your list.

  • credits_deductednumber

    Credits deducted from your balance for this order. Undelivered leads are refunded automatically.

  • new_balancenumber

    Your credit balance after the deduction.

  • status_urlstring

    Authenticated endpoint to poll for status and result details.

  • download_urlstring | null

    Public link to the result file once the order is completed (no API key needed, valid until the file expires); null until then.

  • callback_urlstring | null

    Webhook URL accepted for this order, or null when none was supplied.

  • callback_signing_secretstring | null

    Returned once when callback_url is supplied. Store it to verify webhook signatures.

Status codes

  • 201Order created
  • 400Invalid request
  • 401API key missing or invalid
  • 402Insufficient credits
  • 403Account suspended
  • 429Rate limit exceeded
  • 500Server error

Good to know

  • Costs 20,000 credits per 1,000 results found.
  • Credits for every row are reserved when the order is accepted. When the file is delivered you're only charged for the results we found; the rest is refunded automatically.
  • Between 100 and 100,000 rows per order. Split bigger lists into several orders.
  • Send an Idempotency-Key header to retry safely: the same key returns the original order instead of creating a new one.
  • The delivered CSV is your list with the new columns added. Poll status_url or use callback_url, then download it from download_url.
POST /phone-finder
curl -X POST "https://api.apolloscrapers.com/api/v1/phone-finder" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: phone_finder-order-2026-10-27-001" \
  -d '{
    "results_file_name": "q4-call-list",
    "rows": [
      {
        "linkedin_url": "https://www.linkedin.com/in/ava-reed"
      },
      {
        "first_name": "Liam",
        "last_name": "Hart",
        "company_domain": "globexcloud.com"
      }
    ],
    "note": "Priority list for Q4",
    "callback_url": "https://example.com/webhooks/apollo-scraper"
  }'
Or upload a CSV (multipart/form-data)
curl -X POST "https://api.apolloscrapers.com/api/v1/phone-finder" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY" \
  -H "Idempotency-Key: phone_finder-upload-2026-10-27-001" \
  -F "results_file_name=q4-call-list" \
  -F "file=@contacts.csv" \
  -F "callback_url=https://example.com/webhooks/apollo-scraper"
Response · 201
{
  "message": "Order created successfully",
  "order_id": "ord_8f2c41d9a7b34e01",
  "order_number": 1043,
  "service": "phone_finder",
  "status": "pending",
  "row_count": 100,
  "credits_deducted": 2000,
  "new_balance": 10400,
  "status_url": "https://api.apolloscrapers.com/api/v1/orders/ord_8f2c41d9a7b34e01",
  "download_url": null,
  "callback_url": "https://example.com/webhooks/apollo-scraper",
  "callback_signing_secret": "whsec_3b9f0c2e7d41a8b6c5e0f19d2a7c4b81e6f3d905"
}

Data tools

Email Verifier

POSThttps://api.apolloscrapers.com/api/v1/email-verifier

Check a list of emails before you send. Every address comes back with email_status (valid, invalid, risky, catch_all, unknown) and a short reason.

Body parameters

  • emailsstring[]required

    The emails to check, as an array of strings (or send rows with objects that have an email key). Between 100 and 500,000 rows per order. With multipart/form-data, send a CSV file instead.

  • filefileoptional

    multipart/form-data only: your list as a UTF-8 CSV with a header row (max 1 GB). Use it instead of rows.

  • results_file_namestringrequired

    Name used for the order in your history and for the delivered CSV (1–120 characters).

  • notestringoptional

    Optional instructions for our team (max 1,000 characters).

  • callback_urlstringoptional

    Public HTTPS URL notified when the order moves to processing, delivered or cancelled.

Headers

  • Authorizationstringrequired

    Bearer YOUR_API_KEY

  • Content-Typestringrequired

    application/json or multipart/form-data

  • Idempotency-Keystringoptional

    Makes retries safe. Sending the same key again returns the original order.

Returns

  • messagestring

    Human-readable confirmation for the accepted order.

  • order_idstring

    Unique order ID. Use it to check status and download the result file.

  • order_numbernumber

    Short order number shown in your dashboard.

  • servicestring

    Service that received the order.

    peoplecompanymobileemail_finderphone_finderemail_verifier
  • statusstring

    Current processing status. New orders start as pending.

    pendingqueuedprocessingcompletedcancelled
  • row_countnumber

    Rows we counted in your list.

  • credits_deductednumber

    Credits deducted from your balance for this order. Undelivered leads are refunded automatically.

  • new_balancenumber

    Your credit balance after the deduction.

  • status_urlstring

    Authenticated endpoint to poll for status and result details.

  • download_urlstring | null

    Public link to the result file once the order is completed (no API key needed, valid until the file expires); null until then.

  • callback_urlstring | null

    Webhook URL accepted for this order, or null when none was supplied.

  • callback_signing_secretstring | null

    Returned once when callback_url is supplied. Store it to verify webhook signatures.

Status codes

  • 201Order created
  • 400Invalid request
  • 401API key missing or invalid
  • 402Insufficient credits
  • 403Account suspended
  • 429Rate limit exceeded
  • 500Server error

Good to know

  • Costs 500 credits per 1,000 emails checked.
  • Credits for every row are reserved when the order is accepted. Duplicates and rows without a usable email are refunded automatically on delivery.
  • Between 100 and 500,000 rows per order. Split bigger lists into several orders.
  • Send an Idempotency-Key header to retry safely: the same key returns the original order instead of creating a new one.
  • The delivered CSV is your list with the new columns added. Poll status_url or use callback_url, then download it from download_url.
POST /email-verifier
curl -X POST "https://api.apolloscrapers.com/api/v1/email-verifier" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: email_verifier-order-2026-10-27-001" \
  -d '{
    "results_file_name": "newsletter-cleanup",
    "emails": [
      "ava.reed@northwindlabs.com",
      "liam@globexcloud.com"
    ],
    "note": "Priority list for Q4",
    "callback_url": "https://example.com/webhooks/apollo-scraper"
  }'
Or upload a CSV (multipart/form-data)
curl -X POST "https://api.apolloscrapers.com/api/v1/email-verifier" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY" \
  -H "Idempotency-Key: email_verifier-upload-2026-10-27-001" \
  -F "results_file_name=newsletter-cleanup" \
  -F "file=@emails.csv" \
  -F "callback_url=https://example.com/webhooks/apollo-scraper"
Response · 201
{
  "message": "Order created successfully",
  "order_id": "ord_8f2c41d9a7b34e01",
  "order_number": 1043,
  "service": "email_verifier",
  "status": "pending",
  "row_count": 100,
  "credits_deducted": 50,
  "new_balance": 12350,
  "status_url": "https://api.apolloscrapers.com/api/v1/orders/ord_8f2c41d9a7b34e01",
  "download_url": null,
  "callback_url": "https://example.com/webhooks/apollo-scraper",
  "callback_signing_secret": "whsec_3b9f0c2e7d41a8b6c5e0f19d2a7c4b81e6f3d905"
}

Orders

Get Order Status

GEThttps://api.apolloscrapers.com/api/v1/orders/{order_id}

Fetch one order's status, credits and result details. Poll this until status is completed, then download the file from download_url.

Path parameters

  • order_idstringrequired

    The order_id returned when the order was created.

Returns

  • order_idstring

    Unique order ID.

  • order_numbernumber

    Short order number shown in your dashboard.

  • servicestring

    Service the order was placed with.

    peoplecompanymobileemail_finderphone_finderemail_verifier
  • statusstring

    Current processing status.

    pendingqueuedprocessingcompletedcancelled
  • search_urlstring | null

    Apollo search URL submitted with the order (null for data tools).

  • input_fileobject | null

    Data tools only: name, rows and size_bytes of the list you sent.

  • results_file_namestring

    Name given to the order and its CSV.

  • requested_countnumber

    Leads requested.

  • delivered_countnumber

    Leads delivered in the file (0 until completed).

  • verify_emailsboolean

    Whether email verification was requested.

  • notestring | null

    Filter notes or delivery instructions sent with the order.

  • creditsobject

    deducted (charged up front), refunded (returned for undelivered leads or cancellation) and charged (final cost).

  • status_urlstring

    This endpoint.

  • download_urlstring | null

    Public CSV download link — works without an API key, so you can share it or open it in a browser. null while processing, after cancellation or once the file expired.

  • fileobject | null

    name, rows and size_bytes of the delivered CSV.

  • callback_urlstring | null

    Webhook URL attached to the order.

  • cancel_reasonstring | null

    Why the order was cancelled, when it was.

  • created_atstring

    ISO 8601 timestamp of order creation.

  • delivered_atstring | null

    ISO 8601 timestamp of delivery.

  • expires_atstring | null

    When the delivered file stops being downloadable.

  • delivery_expiredboolean

    true once expires_at has passed.

Status codes

  • 200Success
  • 401API key missing or invalid
  • 404Order not found
  • 429Rate limit exceeded

Good to know

  • You can only read orders that belong to the account that owns the API key; anything else returns 404.
  • pending and queued mean the order is waiting for our team; processing means the file is being prepared.
  • Poll no more often than once a minute, or use callback_url to be notified instead.
GET /orders/{order_id}
curl "https://api.apolloscrapers.com/api/v1/orders/ord_8f2c41d9a7b34e01" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY"
Response · 200
{
  "order_id": "ord_8f2c41d9a7b34e01",
  "order_number": 1042,
  "service": "people",
  "status": "completed",
  "search_url": "https://app.apollo.io/#/people?personTitles[]=founder&personLocations[]=United%20States",
  "results_file_name": "apollo-founders-usa",
  "requested_count": 2000,
  "delivered_count": 1970,
  "verify_emails": true,
  "note": "US founders only",
  "credits": {
    "deducted": 2600,
    "refunded": 39,
    "charged": 2561
  },
  "status_url": "https://api.apolloscrapers.com/api/v1/orders/ord_8f2c41d9a7b34e01",
  "download_url": "https://api.apolloscrapers.com/api/orders/ord_8f2c41d9a7b34e01/download?file=0&t=8kq2XvR1mW",
  "file": {
    "name": "apollo-founders-usa.csv",
    "rows": 1970,
    "size_bytes": 421580
  },
  "callback_url": "https://example.com/webhooks/apollo-scraper",
  "cancel_reason": null,
  "created_at": "2026-09-10T09:24:11.000Z",
  "delivered_at": "2026-09-10T13:45:01.000Z",
  "expires_at": "2027-03-09T13:45:01.000Z",
  "delivery_expired": false
}

Orders

Download Result File

GEThttps://api.apolloscrapers.com/api/v1/orders/{order_id}/download

Download the delivered CSV for a completed order with your API key. The order status response also includes download_url, a public link that works without a key.

Path parameters

  • order_idstringrequired

    ID of a completed order.

Status codes

  • 200CSV file
  • 401API key missing or invalid
  • 404Order not found
  • 409File not ready yet
  • 410File expired
  • 429Rate limit exceeded

Good to know

  • Responds with Content-Type: text/csv and a Content-Disposition filename.
  • Returns 409 until the order is completed and 410 after the file expires (six months after delivery).
GET /orders/{order_id}/download
curl "https://api.apolloscrapers.com/api/v1/orders/ord_8f2c41d9a7b34e01/download" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY" \
  -L -o "apollo-founders-usa.csv"
Response · 200
first_name,last_name,title,company,email,linkedin_url
Jane,Cooper,Founder & CEO,Northwind Labs,jane@northwindlabs.com,https://linkedin.com/in/janecooper
Marcus,Lee,Co-founder,Brightline,marcus@brightline.io,https://linkedin.com/in/marcuslee

Orders

List Orders

GEThttps://api.apolloscrapers.com/api/v1/orders

List your orders, newest first, with optional status filtering and offset pagination.

Query parameters

  • statusstringoptional

    Only return orders with this status.

    pendingqueuedprocessingcompletedcancelled
  • limitnumberoptional

    Page size, 1–100. Defaults to 20.

  • offsetnumberoptional

    Number of orders to skip. Defaults to 0.

Returns

  • dataarray

    Orders in the same shape as Get Order Status.

  • totalnumber

    Total orders matching the filter.

  • limitnumber

    Page size used.

  • offsetnumber

    Offset used.

  • has_moreboolean

    true when another page is available.

Status codes

  • 200Success
  • 400Invalid status filter
  • 401API key missing or invalid
  • 429Rate limit exceeded

Good to know

  • Combine limit and offset to page through results; stop when has_more is false.
GET /orders
curl "https://api.apolloscrapers.com/api/v1/orders?status=completed&limit=20" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY"
Response · 200
{
  "data": [
    {
      "order_id": "ord_8f2c41d9a7b34e01",
      "order_number": 1042,
      "service": "people",
      "status": "completed",
      "search_url": "https://app.apollo.io/#/people?personTitles[]=founder&personLocations[]=United%20States",
      "results_file_name": "apollo-founders-usa",
      "requested_count": 2000,
      "delivered_count": 1970,
      "verify_emails": true,
      "note": "US founders only",
      "credits": {
        "deducted": 2600,
        "refunded": 39,
        "charged": 2561
      },
      "status_url": "https://api.apolloscrapers.com/api/v1/orders/ord_8f2c41d9a7b34e01",
      "download_url": "https://api.apolloscrapers.com/api/orders/ord_8f2c41d9a7b34e01/download?file=0&t=8kq2XvR1mW",
      "file": {
        "name": "apollo-founders-usa.csv",
        "rows": 1970,
        "size_bytes": 421580
      },
      "callback_url": "https://example.com/webhooks/apollo-scraper",
      "cancel_reason": null,
      "created_at": "2026-09-10T09:24:11.000Z",
      "delivered_at": "2026-09-10T13:45:01.000Z",
      "expires_at": "2027-03-09T13:45:01.000Z",
      "delivery_expired": false
    }
  ],
  "total": 37,
  "limit": 20,
  "offset": 0,
  "has_more": true
}

Account

Get Account & Balance

GEThttps://api.apolloscrapers.com/api/v1/me

Return the account that owns the API key and its available credit balance. Handy as a connection test.

Parameters

No parameters. Just send the Authorization header.

Returns

  • idstring

    Account ID.

  • namestring

    Account holder name.

  • emailstring

    Account email.

  • credits.availablenumber

    Credits available for new orders.

Status codes

  • 200Success
  • 401API key missing or invalid
  • 429Rate limit exceeded

Good to know

  • Check credits.available before large orders to avoid 402 responses.
GET /me
curl "https://api.apolloscrapers.com/api/v1/me" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY"
Response · 200
{
  "id": "usr_4b1d9e2a",
  "name": "Alex Morgan",
  "email": "alex@example.com",
  "credits": {
    "available": 12400
  }
}

Account

Get Pricing

GEThttps://api.apolloscrapers.com/api/v1/pricing

Live credit costs and order limits for each scraper, so you can estimate credits before ordering.

Parameters

No parameters. Just send the Authorization header.

Returns

  • credit_price_usd_per_1000number

    Price in USD for 1,000 credits.

  • max_countnumber

    Largest contact_count accepted per order.

  • services[].servicestring

    Service key.

    peoplecompanymobile
  • services[].endpointstring

    Create-order endpoint for the service.

  • services[].credits_per_1000number

    Credits charged per 1,000 leads.

  • services[].min_countnumber

    Smallest contact_count accepted.

  • services[].add_onsarray

    Optional extras and their cost per 1,000 leads.

Status codes

  • 200Success
  • 401API key missing or invalid
  • 429Rate limit exceeded

Good to know

  • Estimated credits = ceil(contact_count × (credits_per_1000 + add-ons) ÷ 1,000).
GET /pricing
curl "https://api.apolloscrapers.com/api/v1/pricing" \
  -H "Authorization: Bearer $APOLLO_SCRAPER_API_KEY"
Response · 200
{
  "credit_price_usd_per_1000": 3,
  "max_count": 1000000,
  "services": [
    {
      "service": "people",
      "endpoint": "/apollo-people-scraper",
      "credits_per_1000": 1000,
      "min_count": 1000,
      "add_ons": [
        {
          "key": "verify_emails",
          "credits_per_1000": 300
        }
      ]
    },
    {
      "service": "company",
      "endpoint": "/apollo-company-scraper",
      "credits_per_1000": 834,
      "min_count": 1000,
      "add_ons": []
    },
    {
      "service": "mobile",
      "endpoint": "/apollo-mobile-scraper",
      "credits_per_1000": 20000,
      "min_count": 100,
      "add_ons": []
    },
    {
      "service": "email_finder",
      "endpoint": "/email-finder",
      "credits_per_1000": 5000,
      "min_count": 100,
      "max_count": 100000,
      "charged_for": "found",
      "enabled": true,
      "add_ons": []
    },
    {
      "service": "phone_finder",
      "endpoint": "/phone-finder",
      "credits_per_1000": 20000,
      "min_count": 100,
      "max_count": 100000,
      "charged_for": "found",
      "enabled": true,
      "add_ons": []
    },
    {
      "service": "email_verifier",
      "endpoint": "/email-verifier",
      "credits_per_1000": 500,
      "min_count": 100,
      "max_count": 500000,
      "charged_for": "checked",
      "enabled": true,
      "add_ons": []
    }
  ]
}

Webhook events

Pass a public HTTPS callback_url when you create an order and we'll POST a JSON event to it whenever the order changes. Reply with any 2xx within 10 seconds.

Events

  • order.processingevent

    Our team started preparing your file.

  • order.deliveredevent

    The CSV is ready. download_url is included.

  • order.cancelledevent

    The order was cancelled and its credits refunded.

Headers

  • X-ApolloScraper-Eventstring

    The event name.

  • X-ApolloScraper-Signaturestring

    sha256= followed by the HMAC-SHA256 of the raw body, keyed with your callback_signing_secret.

Failed deliveries are retried up to 5 times with exponential backoff (30s, 2m, 8m, 32m).

order.delivered payload
{
  "id": "whd_7c2e9a41f0b84d16a3c5",
  "event": "order.delivered",
  "created_at": "2026-09-10T13:45:01.000Z",
  "data": {
    "order_id": "ord_8f2c41d9a7b34e01",
    "order_number": 1042,
    "service": "people",
    "status": "completed",
    "delivered_count": 1970,
    "credits": {
      "deducted": 2600,
      "refunded": 39,
      "charged": 2561
    },
    "status_url": "https://api.apolloscrapers.com/api/v1/orders/ord_8f2c41d9a7b34e01",
    "download_url": "https://api.apolloscrapers.com/api/orders/ord_8f2c41d9a7b34e01/download?file=0&t=8kq2XvR1mW",
    "cancel_reason": null
  }
}

Verify signatures

Every webhook is signed so you can be sure it came from us. Compute the HMAC-SHA256 of the raw request body with the callback_signing_secret you received when creating the order, and compare it to X-ApolloScraper-Signature using a constant-time check.

The signing secret is shown only once, in the create-order response. Store it alongside the order ID.
Node.js
import crypto from "node:crypto";

// Use the raw request body exactly as received (before JSON parsing).
export function isValidSignature(rawBody, signatureHeader, secret) {
  const expected = "sha256=" + crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  const a = Buffer.from(expected);
  const b = Buffer.from(signatureHeader ?? "");
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}