API Documentation

Complete guide to integrate with Quick Enrich API

Production Ready API Key Protected Rate Limited
GET /api/employees/search

Email/People Enrich

Search for employees using LinkedIn URL AND/OR company URL, first name, and last name.
If you submit all 4 fields, it will FIRST search for the LinkedIn URL and if nothing is found it will search and verify the emails for the first name, last name, company URL.
Email verification date comes down in the response.
If you are using GTM Unlimited you have access to the Bounceban verification on the fly within the Bulk Email Find & Verify call.

Parameters
Parameter Type Required Description
linkedin_url string No* LinkedIn profile URL (exact match)
company_url string No* Company website URL (exact match)
first_name string No* Employee first name (exact match)
last_name string No* Employee last name (exact match)
Example Response
Response Format
{
  "success": true,
  "message": "Employees fetched",
  "code": 200,
  "data": {
    "first_name": "John",
    "last_name": "Doe",
    "title": "Senior Software Engineer",
    "email": "john.doe@company.com",
    "employee_phone": "+1-555-0123",
    "employee_linkedin": "https://linkedin.com/in/johndoe",
    "email_verification_date": "2024-01-15",
    "company_url": "https://techcorp.com",
    "company_name": "Tech Corp",
    "email_domain": "company.com",
    "company_linked": "https://linkedin.com/company/techcorp",
    "company_phone": "+1-555-9999",
    "industry": "Software",
    "revenue": "10M-50M",
    "employee_count": "51-200",
    "address": "123 Main St",
    "city": "San Francisco",
    "region_code": "CA",
    "zip": "94105",
    "country_code": "US"
  }
}
Test Email/People Enrich
Response:

                        
POST /api/employees/bulk-find-verify

Bulk Email Find & Verify

Submit up to 10,000 people in one JSON request and start a bulk email find and verify task. All emails are validated from Bounceban before you receive them. This is only available in the GTM Unlimited subscription. Because Bounceban tests each email on the fly, response times are longer, however the data is much cleaner.

reverify and include_risky apply to the whole task. reverify left off returns the cached emails, while reverify=1 reverifies every stored email. Risky and unknown emails are left off the result unless include_risky=1.

If a previously valid email is now risky, the last verified date is included in the results.

The response data.task_id is a unique 32-character id. The lookup runs after the call returns. Each person in the finished results has status found or not_found.

Use Bulk Find and Verify Status with data.task_id to check progress. Task status can be pending, completed, or failed.

The Bulk Email Find & Verify call allows 5 tasks in progress at one time.

Parameters
Parameter Type Required Description
people array Yes 1 to 10,000 objects. Each needs linkedin_url, or first_name, last_name, and company_url.
reverify boolean No Default false. True reverifies every stored email in the task.
include_risky boolean No Default false. Used only when reverify is true. Returns risky and unknown emails for every row.
Example Request
JSON body
{
  "reverify": true,
  "include_risky": false,
  "people": [
    {
      "linkedin_url": "https://www.linkedin.com/in/johndoe"
    },
    {
      "first_name": "Jane",
      "last_name": "Doe",
      "company_url": "https://techcorp.com"
    }
  ]
}
Example Response
202 Accepted
{
  "success": true,
  "message": "Bulk email verification started",
  "code": 202,
  "data": {
    "task_id": "a1b2c3d4e5f6789012345678abcdef01",
    "status": "pending",
    "reverify": true,
    "include_risky": false,
    "total_rows": 2
  }
}
GET /api/employees/bulk-verify/{task_id}

Bulk Find and Verify Status

Check a Bulk Find and Verify task with the task_id from the submit response. GTM Unlimited only. data.status can be pending, completed, or failed. data.total_rows is the number of people submitted. When status is completed, data.results is the rows as JSON, 100 per page by default. Each person has status found or not_found, then email_status (deliverable, risky, unknown, or null). The verification date stays in email_verification_date. When status is failed, error_message explains why and no credits are used. One credit is used for each real email in the finished result.

Parameters
Parameter Type Required Description
task_id string Yes 32-character id returned by Bulk Find and Verify.
page integer No Default 1. Used when status is completed.
per_page integer No Default 100. Maximum 500.
Example Response
Pending
{
  "success": true,
  "message": "Bulk email verification status",
  "code": 200,
  "data": {
    "task_id": "a1b2c3d4e5f6789012345678abcdef01",
    "status": "pending",
    "reverify": true,
    "include_risky": false,
    "total_rows": 2
  }
}
Completed
{
  "success": true,
  "message": "Bulk email verification status",
  "code": 200,
  "data": {
    "task_id": "a1b2c3d4e5f6789012345678abcdef01",
    "status": "completed",
    "reverify": true,
    "include_risky": false,
    "total_rows": 2,
    "results": [
      {
        "first_name": "John",
        "last_name": "Doe",
        "company_url": "https://techcorp.com",
        "status": "found",
        "email_status": "deliverable",
        "title": "Senior Software Engineer",
        "email": "john.doe@techcorp.com",
        "employee_phone": "+1-555-0123",
        "employee_phone_type": "direct",
        "employee_linkedin": "https://www.linkedin.com/in/johndoe",
        "email_verification_date": "2026-10-25",
        "company_name": "Tech Corp",
        "email_domain": "techcorp.com",
        "company_linked": "https://linkedin.com/company/techcorp",
        "company_phone": "+1-555-9999",
        "industry": "Software",
        "revenue": "10M-50M",
        "employee_count": "51-200",
        "address": "123 Main St",
        "city": "San Francisco",
        "region_code": "CA",
        "zip": "94105",
        "country_code": "US"
      },
      {
        "first_name": "Jane",
        "last_name": "Doe",
        "company_url": "https://techcorp.com",
        "status": "not_found",
        "email_status": null,
        "title": "N/A",
        "email": "N/A",
        "employee_phone": "N/A",
        "employee_phone_type": "N/A",
        "employee_linkedin": "N/A",
        "email_verification_date": "N/A",
        "company_name": "N/A",
        "email_domain": "N/A",
        "company_linked": "N/A",
        "company_phone": "N/A",
        "industry": "N/A",
        "revenue": "N/A",
        "employee_count": "N/A",
        "address": "N/A",
        "city": "N/A",
        "region_code": "N/A",
        "zip": "N/A",
        "country_code": "N/A"
      }
    ]
  },
  "meta": {
    "page": 1,
    "per_page": 100,
    "total": 2
  }
}
Failed
{
  "success": true,
  "message": "Bulk email verification status",
  "code": 200,
  "data": {
    "task_id": "a1b2c3d4e5f6789012345678abcdef01",
    "status": "failed",
    "reverify": true,
    "include_risky": false,
    "total_rows": 2,
    "error_message": "Verification did not start. No credits were used."
  }
}
POST /api/employees/contact-finder

Contact Finder

Search contacts using multi-value include and exclude filters across company and employee fields. This is a discovery endpoint: responses do not include email or phone values. Set request flags has_email and/or has_phone to true to limit results to contacts that already have that data in the database. Each contact also includes has_email and has_phone booleans in the response so you know whether enrichment data exists before calling Employee Search or Phone Enrich with the returned employee_linkedin (and name/company fields when needed). Rate limit: 120 requests/minute per API key. Search is free (credits_used: 0).

Validated fields: country_code, region_code, industry_linkedin, number_of_employees, revenue, and services must be exact strings from the lookup APIs below (422 if not in the list). region_code is the abbreviation (state_abbrev), not the full state name. All other filter fields are open text.

Deep pagination: page can only retrieve the first 10,000 matching rows. Every response includes meta.next_cursor and meta.has_more. To continue past 10,000, send the previous meta.next_cursor as cursor (repeat until next_cursor is null). When cursor is set, page is ignored. per_page still applies (max 100).

Lookup APIs (allowed values)

Lookup endpoints are public — no API key required. Use the links below to browse all allowed values.

Endpoint Returns
GET /api/lookups/country-codes ["US", "GB", ...] — ISO 2-letter codes from country_codes.country_code_2_character View all values
GET /api/lookups/region-codes [{"region_code":"CA","full_state":"California"}, ...] — from statesregions where include = 1. Send region_code (the abbreviation) in the filter. View all values
GET /api/lookups/industries ["Computer Software", ...] — from industry_linkedin.industry View all values
GET /api/lookups/employee-ranges ["51-200", ...] — from number_of_employees.range View all values
GET /api/lookups/revenue-ranges ["10M-50M", ...] — from yearly_revenues View all values
GET /api/lookups/company-services?q= Service name autocomplete — from UniqueCompanyServices View top values
Filter dimensions
Field Include / exclude Description
titleJSON arraysOpen text — employee job title
localityJSON arraysOpen text — employee locality
company_nameJSON arraysOpen text — company name match
company_urlJSON arraysOpen text — company website / domain
number_of_employeesJSON arrays of stringsExact match — range labels from GET /api/lookups/employee-ranges
revenueJSON arrays of stringsExact match — range labels from GET /api/lookups/revenue-ranges
cityJSON arraysOpen text — company city
country_codeJSON arrays of stringsExact match — values from GET /api/lookups/country-codes (company country)
region_codeJSON arrays of stringsExact match — abbreviations from GET /api/lookups/region-codes (company region/state). Use region_code, not full_state.
industry_linkedinJSON arrays of stringsExact match — values from GET /api/lookups/industries (company industry)
bio_liJSON arraysOpen text — search company LinkedIn "About" description
servicesJSON arrays of stringsExact match — values from GET /api/lookups/company-services
has_emailbooleanWhen true, only return contacts with a non-empty email in the database (not N/A)
has_phonebooleanWhen true, only return contacts with a non-empty phone in the database (not N/A)
pageintegerPage number (default 1). Limited to the first 10,000 results. Ignored when cursor is set.
per_pageintegerResults per page (default 10, max 100)
cursorstringOpaque cursor from meta.next_cursor. Use this to fetch past the first 10,000 rows. Echo it unchanged.

At least one filter is required: a non-empty include or exclude on any dimension, or has_email / has_phone set to true. Values within an include list are combined with OR; active dimensions are combined with AND.

Example Request
{
  "title": { "include": ["CEO", "Chief Executive Officer"], "exclude": ["Intern"] },
  "locality": { "include": ["San Francisco", "Miami"], "exclude": [] },
  "company_name": { "include": ["Acme"], "exclude": [] },
  "company_url": { "include": ["acme.com"], "exclude": [] },
  "city": { "include": ["San Francisco", "Austin"], "exclude": [] },
  "country_code": { "include": ["US"], "exclude": [] },
  "region_code": { "include": ["CA"], "exclude": [] },
  "industry_linkedin": { "include": ["Computer Software"], "exclude": [] },
  "number_of_employees": { "include": ["51-200"], "exclude": [] },
  "revenue": { "include": ["10M-50M"], "exclude": [] },
  "bio_li": { "include": ["cloud solutions"], "exclude": [] },
  "services": { "include": ["DevOps"], "exclude": [] },
  "has_email": true,
  "has_phone": true,
  "page": 1,
  "per_page": 10
}
Example Request (continue past 10,000)
{
  "title": { "include": ["CEO"], "exclude": [] },
  "country_code": { "include": ["US"], "exclude": [] },
  "has_email": true,
  "per_page": 100,
  "cursor": "WzEwLjUsIjIwMjYtMDEtMDFUMDA6MDAwWiIsImVtcC0xIl0"
}
Example Response
{
  "success": true,
  "message": "Contacts fetched",
  "code": 200,
  "data": [
    {
      "first_name": "Jane",
      "last_name": "Doe",
      "title": "Chief Executive Officer",
      "employee_linkedin": "https://linkedin.com/in/janedoe",
      "has_email": true,
      "has_phone": false,
      "company_url": "https://example.com",
      "company_name": "Example Corp",
      "email_domain": "example.com",
      "home_page_email": "info@example.com",
      "city": "San Francisco",
      "locality": "San Francisco Bay Area",
      "country_code": "US"
    }
  ],
  "meta": {
    "page": 1,
    "per_page": 10,
    "total": 1,
    "last_page": 1,
    "credits_used": 0,
    "remaining_credits": 100,
    "next_cursor": null,
    "has_more": false
  }
}
POST /api/companies/company-finder

Company Finder

Search companies by home page text, LinkedIn description, services offered, industry, employee size, revenue, country, region/state, city, URL, and company name. 1 credit is deducted per company returned. Credits are waived for users with an active WebApp Unlimited subscription. Rate limit: 120 requests/minute per API key.

Validated fields: services, industry, country_code, region_code, number_of_employees, and revenue must be exact strings from the lookup APIs below (422 if not in the list). region_code is the abbreviation (state_abbrev), not the full state name. All other filter fields are open text. company_url accepts a single domain value (no include/exclude lists).

Deep pagination: page can only retrieve the first 10,000 matching rows. Every response includes meta.next_cursor and meta.has_more. To continue past 10,000, send the previous meta.next_cursor as cursor (repeat until next_cursor is null). When cursor is set, page is ignored. per_page still applies (max 100).

Lookup APIs (allowed values)

Lookup endpoints are public — no API key required.

Endpoint Returns
GET /api/lookups/company-services?q= Service names + usage counts — searchable by keyword View top values
GET /api/lookups/industries ["Computer Software", ...] — from industry_linkedin.industry View all values
GET /api/lookups/country-codes ["US", "GB", ...] — ISO 2-letter country codes View all values
GET /api/lookups/region-codes [{"region_code":"CA","full_state":"California"}, ...] — from statesregions where include = 1. Send region_code (the abbreviation) in the filter. View all values
GET /api/lookups/employee-ranges ["51-200", ...] — employee size range labels View all values
GET /api/lookups/revenue-ranges ["10M-50M", ...] — annual revenue range labels View all values
Filter dimensions
Field Include / exclude Description
home_page_textJSON arraysOpen text — search against scraped website copy
bio_liJSON arraysOpen text — search company LinkedIn "About" description
servicesJSON arrays of stringsExact match — values from GET /api/lookups/company-services
industryJSON arrays of stringsExact match — values from GET /api/lookups/industries
number_of_employeesJSON arrays of stringsExact match — range labels from GET /api/lookups/employee-ranges
revenueJSON arrays of stringsExact match — range labels from GET /api/lookups/revenue-ranges
country_codeJSON arrays of stringsExact match — ISO 2-letter codes from GET /api/lookups/country-codes
region_codeJSON arrays of stringsExact match — abbreviations from GET /api/lookups/region-codes. Use region_code, not full_state.
cityJSON arraysOpen text — company city
company_nameJSON arraysOpen text — company name
company_urlstringSingle domain or URL — matches url, email_domain, and final_email_domain (no include/exclude lists)
pageintegerPage number (default 1). Limited to the first 10,000 results. Ignored when cursor is set.
per_pageintegerResults per page (default 10, max 100)
cursorstringOpaque cursor from meta.next_cursor. Use this to fetch past the first 10,000 rows. Echo it unchanged.
include_full_textbooleanWhen true, each result also includes full home_page_text. Default false — only home_page_text_snippet is returned

At least one filter is required: a non-empty include or exclude on any dimension, or a company_url value. Values within an include list are combined with OR; active dimensions are combined with AND.

Example Request
{
  "home_page_text": { "include": ["cloud migration"], "exclude": [] },
  "services": { "include": ["DevOps"], "exclude": [] },
  "industry": { "include": ["Computer Software"], "exclude": [] },
  "country_code": { "include": ["US"], "exclude": [] },
  "region_code": { "include": ["TX"], "exclude": [] },
  "number_of_employees": { "include": ["51-200"], "exclude": [] },
  "company_url": "acme.com",
  "include_full_text": true,
  "page": 1,
  "per_page": 10
}
Example Response
{
  "success": true,
  "message": "Companies fetched",
  "code": 200,
  "data": [
    {
      "company_name": "Acme Cloud Solutions",
      "url": "acme.com",
      "email_domain": "acme.com",
      "final_email_domain": "acme.com",
      "home_page_email": "info@acme.com",
      "phone": "+1-555-0100",
      "linkedin_url": "https://linkedin.com/company/acme",
      "city": "Austin",
      "region_code": "TX",
      "country_code": "US",
      "industry": "Computer Software",
      "employee_count": "51-200",
      "revenue": "10M-50M",
      "services": ["DevOps", "AWS", "Cloud Migration"],
      "service_count": 3,
      "home_page_text_snippet": "We help enterprises modernize with cloud migration...",
      "bio_li_snippet": "Leading cloud solutions provider specializing in...",
      "home_page_text": "We help enterprises modernize with cloud migration and DevOps..."
    }
  ],
  "meta": {
    "page": 1,
    "per_page": 10,
    "total": 842,
    "last_page": 85,
    "credits_used": 10,
    "remaining_credits": 90,
    "next_cursor": "WzcuNSwiMjAyNi0wMS0wMlQwMDowMDowMC4wMDBaIiwiY28tMiJd",
    "has_more": true
  }
}
Error Error Responses

Common Error Responses

401 Unauthorized

Invalid or missing API key

{
  "success": false,
  "message": "Invalid API key",
  "code": 401
}
429 Too Many Requests

Rate limit exceeded

{
  "success": false,
  "message": "Rate limit exceeded. Try again later.",
  "code": 429
}
400 Bad Request

Invalid parameters or missing required fields

{
  "success": false,
  "message": "Invalid search parameters. Provide either linkedin_url OR (company_url, first_name, last_name)",
  "code": 400
}