image/svg+xml

Back to Hunter

Get a free API key

Introduction

You can enjoy our service's features with our simple JSON API:

  • Discover returns companies matching a set of criteria.
  • The Domain Search returns all the email addresses found using one given domain name, with sources.
  • The Email Finder finds the most likely email address from a domain name, a first name and a last name.
  • The Email Verifier checks the deliverability of a given email address, verifies if it has been found in our database, and returns their sources.
  • The Enrichment returns all the information we have about a person or a company.

Our API also provides you a RESTful way to manage your Hunter's resources. These are the resources you can Create, Read, Update and Delete with our API:

API endpoint
https://api.hunter.io/v2/

Structure

Our API is designed to be as simple to use as possible. We always use the same basic structure:

  • data contains the data you requested.
  • meta provides information regarding your request.
  • errors shows errors with insights regarding what made the request fail. Learn more about the errors responses.
Successful response
{
  "data": {
    ...
  },
  "meta": {
    ...
  }
}


Error response
{
  "errors": {
    ...
  }
}

Authentication

Authentication is made with a key you will have to add to every call you make to our API. This parameter is always required. We'll return an error if the key is either missing or invalid.

It can be passed in the api_key query parameter, in the X-API-KEY header, or in the Authorization header (Bearer YOUR_API_KEY).

Your API key is what identifies your account, so make sure to keep it secret! You can at anytime retrieve, generate or delete API keys on your dashboard.

A special API key can be used to test our API: test-api-key. It will validate the provided parameters, but will always return the same, dummy, response. It is available on our three main endpoints: the Domain Search, the Email Finder, and the Email Verifier.

Sign up to get your free API key.

Errors

Hunter's API uses conventional HTTP response codes to indicate the success or failure of an API request. In case of error, the API returns an array of errors containing information regarding what happened.

HTTP Status Code Summary
200 - OK The request was successful.
201 - Created The request was successful and the resource was created.
204 - No content The request was successful and no additional content was sent.
400 - Bad request Your request was not valid. It was missing a required parameter or a supplied parameter was invalid.
401 - Unauthorized No valid API key was provided.
403 - Forbidden You have reached the rate limit.
404 - Not found The requested resource does not exist.
422 - Unprocessable entity Your request is valid but the creation of the resource failed. Check the errors.
429 - Too many requests You have reached your usage limit. Upgrade your plan if necessary.
451 - Unavailable for legal reasons We have been requested not to process personal identifiable information linked to this person. Therefore, we cannot proceed with your request.
5XX - Server errors Something went wrong on Hunter's end.


Error example
{
  "errors": [
    {
      "id": "wrong_params",
      "code": 400,
      "details": "You are missing the domain parameter"
    }
  ]
}

Discover

Returns companies matching a set of criteria. This call is free.

Each response will return a maximum of 100 companies. Premium users can use the offset and limit parameters to paginate through results. The limit parameter allows you to request fewer than 100 companies per page if needed.

You can use our other endpoints to get more information about the returned results. For instance, you can find email addresses for the surfaced companies using the Domain Search , or you can get more information about the companies using Company Enrichment.

You can either manually specify the filters for your search using the specific filter parameters, or use natural language with the query parameter to describe the attributes of your target companies, and an AI assistant will select appropriate filters for you.

Requirements: You must provide either query (natural language) or at least one filter parameter.
query required unless a filter is set Search query, in your natural language. For example, "Companies in Europe in the Tech Industry".
organization You can specify a list of domains in the domain field to select on and/or a list of company names in the name field to select on. When you supply both, the API will combine the results into a set of domain names.
similar_to You can either specify a domain or a name of a company to find similar companies for. If you specify both then the domain will be used.

This filter is only available on a Premium plan.
headquarters_location Locations of the headquarters of the companies you want to find. You can specify lists of locations in the include field to select on and/or in the exclude field to exclude.

Each location can have either a continent or business_region or country, state and/or city.

continent can be one of the following: Europe, Asia, North America, Africa, Antarctica, South America or Oceania

business_region can be one of the following: AMER, EMEA, APAC or LATAM

country must contain a valid ISO 3166-1 alpha-2 country code, for example "US" for the United States.

state must contain a valid US state code, for example "CA" for California. You can only use this field when the country is set to "US".

city must contain a city name, for example "San Francisco". Please note that when a city is provided, a country must also be specified:
{
  "headquarters_location": {
    "include": [
      { "city": "Paris", "country": "FR" }
    ]
  }
}
industry The industries you want to select companies by, you can specify a list of industries to include and/or a list to exclude. See industries.json for the list of valid industries.
headcount The company sizes you want to include in the results. The possible values are 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000 or 10001+
company_type The types of companies you want to select on. You can specify a list of types to include and/or exclude. The possible values are educational, educational institution, government agency, non profit, partnership, privately held, public company, self employed, self owned or sole proprietorship
year_founded Premium only The years in which the companies were founded, for example "2010". You can specify either multiple years to include and/or exclude or you can specify a range by giving a value for from and/or to.

This filter is only available on a Premium plan.
keywords Keywords to narrow down your selection of companies. You can specify a list of keywords in the include field to select on and/or a list in the exclude field to exclude from the results. You can specify to match on any or all keywords in the match field (the default value is all).
technology Premium only Technologies to narrow down your selection of companies. You can specify a list of technologies in the include field to select on and/or a list in the exclude field to exclude from the results. You can specify to match on any or all technologies in the match field (the default value is all). See technologies.json for the list of valid technologies.

This filter is only available on a Premium plan.
funding Premium only You can provide a list of funding series in the series field to narrow down your selection of companies. The possible values are pre_seed, seed, pre_series_a, series_a, pre_series_b, series_b, pre_series_c, series_c+ or other

You can also specify a range of funding amounts in the amount field, you can specify a from and/or to value

Finally you can also specify a range of funding dates in the date field, here you can also specify a from and/or to value.

This filter is only available on a Premium plan.
limit Premium only Specifies the number of companies to return per page. The default and maximum values are 100. You can use this parameter to request fewer results per page (e.g., 50 or 25). You can only change the limit if you are on a Premium plan.
offset Premium only Specifies the number of companies to skip. The default is 0. The maximum value is 10,000. You can only change the offset if you are on a Premium plan.
api_key required Your secret API key. You can retrieve it in your dashboard.

Each response will return up to 100 companies (this is the maximum per request). Use the offset parameter to paginate through more results, up to a maximum offset of 10,000 (this requires a Premium plan).

filters in the meta section returns the filters that were applied based on the input parameters. If you want to paginate the results of the AI assistant, we strongly recommend using these filters instead of natural language on consecutive calls—this will ensure your set of desired filters stays consistent.

The Discover API endpoint is rate limited to 5 requests per second and 50 requests per minute.

Errors

Here are the errors specific to the Discover API call. If you can't find an error in the list, please also check the general API errors.

400 invalid_company_type One of the supplied company_type values is invalid.
400 invalid_funding

One of the supplied funding input is invalid.

400 invalid_funding_series

One of the supplied funding[series] values is invalid.

400 invalid_funding_date_from

The supplied funding[date][from] is invalid.

400 invalid_funding_date_to

The supplied funding[date][to] is invalid.

400 invalid_funding_date_range

The funding[date][from] must be before the funding[date][to].

400 invalid_funding_amount_from

The supplied funding[amount][from] is invalid.

400 invalid_funding_amount_to

The supplied funding[amount][to] is invalid.

400 invalid_funding_amount_range

The funding[amount][to] must be greater than the funding[amount][from].

400 invalid_headcount One of the supplied headcount values is invalid.
400 invalid_headquarters_location The supplied headquarters_location input is not valid.
400 invalid_headquarters_location_include_combination The combination of values in a headquarters_location[include] value is invalid.
400 invalid_headquarters_location_include_business_region The headquarters_location[include][business_region] value is invalid.
400 invalid_headquarters_location_include_continent The headquarters_location[include][continent] value is invalid.
400 invalid_headquarters_location_include_country The headquarters_location[include][country] value is invalid.
400 invalid_headquarters_location_include_state The headquarters_location[include][state] value is given while the country is not US or is not a valid US state code.
400 invalid_headquarters_location_exclude_combination The combination of values in a headquarters_location[exclude] value is invalid.
400 invalid_headquarters_location_exclude_business_region The headquarters_location[exclude][business_region] value is invalid.
400 invalid_headquarters_location_exclude_continent The headquarters_location[exclude][continent] value is invalid.
400 invalid_headquarters_location_exclude_country The headquarters_location[exclude][country] value is invalid.
400 invalid_headquarters_location_exclude_state The headquarters_location[exclude][state] value is given while the country is not US or is not a valid US state code
400 invalid_industry One of the supplied industry values is invalid.
400 invalid_keywords The supplied keywords input is not valid.
400 invalid_keywords_match The value in the keywords[match] field must be either any or all.
400 invalid_technology One of the supplied technology values is invalid.
400 invalid_technology_match The value in the technology[match] field must be either any or all..
400 invalid_year_founded_combination The combination of fields used in year_founded is invalid.
400 invalid_year_founded_include One of the values supplied in year_founded[include] is invalid.
400 invalid_year_founded_from The supplied year_founded[from] value is invalid.
400 invalid_year_founded_to The supplied year_founded[to] value is invalid.
400 pagination_error

The supplied limit or offset is invalid. This error can also be returned when changing the default values for a Free plan user.

403 no_discover_access

Your plan does not include access to the Discover endpoint (applies to Data Platform users).

HTTP request example

POST https://api.hunter.io/v2/discover?api_key=API_KEY

Get my free API key

Request Body
{
  "organization": {
    "domain": ["hunter.io"]
  }
}


Response: 200 OK
{
  "data": [
    {
      "domain": "hunter.io",
      "organization": "Hunter",
      "emails_count": {
        "personal": 23,
        "generic": 5,
        "total": 28
      }
    }
  ],
  "meta": {
    "results": 1,
    "limit": 100,
    "offset": 0,
    "params": {
      "organization": {
        "domain": [
          "hunter.io"
        ],
      }
    },
    "filters": {
      "organization": {
        "domain": [
          "hunter.io",
        ]
      }
    }
  }
}



Request Body using the AI assistant
{
  "query": "Companies in Europe that specialize in software development"
}



Request Body using various filters
{
  "headquarters_location": {
    "include": [
      { "continent": "Europe" },
      { "country": "US" }
    ],
    "exclude": [
      { "country": "BE" }
    ]
  },
  "industry": {
    "exclude": [
      "Accommodation Services",
      "Staffing and Recruiting"
    ]
  },
  "headcount": [
    "1-10",
    "11-50",
    "51-200"
  ],
  "company_type": {
    "exclude": [
      "educational",
      "non profit",
      "government agency"
    ]
  },
  "year_founded": {
    "from": 1980,
    "to": 2010
  },
  "technology": {
    "match": "any",
    "include": [
      "php",
      "java"
    ]
  }
}

Discover People Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Returns the same companies as the Discover endpoint, surfaced from a people-extraction angle: each company comes with its personal and generic email counts, and the meta section adds the aggregate email totals across all matching companies. This is useful to estimate how many people you can reach before running a Domain Search. on each company.

This call accepts the exact same parameters as Discover (the query natural-language assistant and every filter: organization, headquarters_location, industry, headcount, company_type, year_founded, keywords, technology, funding, and similar_to), and is paginated the same way. This call is free.

Requirements: You must provide either query (natural language) or at least one filter parameter, exactly like Discover.
query required unless a filter is set Search query, in your natural language. For example, "Companies in Europe in the Tech Industry".
filters Every filter accepted by the Discover endpoint is valid here too. See the Discover documentation for the full list and their possible values.
limit Premium only Specifies the number of companies to return per page. The default and maximum values are 100. You can only change the limit if you are on a Premium plan.
offset Premium only Specifies the number of companies to skip. The default is 0. The maximum value is 10,000. You can only change the offset if you are on a Premium plan.
api_key required Your secret API key. You can retrieve it in your dashboard.

total_emails in the meta section returns the aggregate personal, generic, and total email counts across every company matching your filters, not just the current page.

The errors returned by this endpoint are identical to those of the Discover endpoint.

HTTP request example

GET https://api.hunter.io/v2/discover/people?api_key=API_KEY&industry[include][]=Financial Services

Get my free API key

Response: 200 OK
{
  "data": [
    {
      "domain": "stripe.com",
      "organization": "Stripe",
      "emails_count": {
        "personal": 32,
        "generic": 8,
        "total": 40
      }
    }
  ],
  "meta": {
    "results": 1247,
    "total_emails": {
      "personal": 50000,
      "generic": 8000,
      "total": 58000
    },
    "limit": 100,
    "offset": 0,
    "params": {
      "industry": {
        "include": [
          "Financial Services"
        ]
      }
    },
    "filters": {
      "industry": {
        "include": [
          "Financial Services"
        ]
      }
    }
  }
}

Domain Search

One key feature of Hunter is to search all the email addresses corresponding to one website. You give one domain name and it returns email addresses found for that domain on the internet. Results are paginated: use the limit and offset parameters to retrieve all available results.

Requirements: You must provide at least one of domain or company. If both are provided, domain takes precedence.
domain required unless company Domain name from which you want to find the email addresses. For example, "stripe.com".
company required unless domain The company name from which you want to find the email addresses. For example, "stripe". Note that you'll get better results by supplying the domain name as we won't have to find it. If you send a request with both the domain and the company name, we'll use the domain name. It doesn't need to be in lowercase.
limit Specifies the max number of email addresses to return. The default is 10.
offset Specifies the number of email addresses to skip. The default is 0.
type Get only personal or generic email addresses.
seniority Get only email addresses for people with the selected seniority level. The possible values are junior, senior or executive. Several seniority levels can be selected (delimited by a comma).
department Get only email addresses for people working in the selected department(s). The possible values are executive, it, finance, management, sales, legal, support, hr, marketing, communication, education, design, health or operations. Several departments can be selected (comma-delimited).
required_field Get only email addresses for people that have the selected field(s). The possible values are full_name, position and phone_number. Several fields can be selected (comma-delimited).
verification_status Get only email addresses that have the selected verification status(es). The possible values are valid, accept_all and unknown. Several statuses can be selected (comma-delimited).
location Get only email addresses for people with the selected location(s). You can specify lists of locations in the include field to select on and/or in the exclude field to exclude.

Each location can have either a continent or business_region or country, state and/or city.

continent can be one of the following: Africa, Antarctica, Asia, Europe, North America, Oceania or South America

business_region can be one of the following: AMER, EMEA, APAC or LATAM

country must contain a valid ISO 3166-1 alpha-2 country code, for example "US" for the United States.

state must contain a valid US state code, for example "CA" for California. You can only use this field when the country is set to "US".

city must contain a city name, for example "San Francisco". Please note that when a city is provided, a country must also be specified:
{
  "location": {
    "include": [
      { "city": "Paris", "country": "FR" }
    ]
  }
}
Please note that using this filter requires to use a POST request.
job_titles Get only email addresses for people that have the selected job title(s). Several job titles can be selected (comma-delimited).

Common executive titles match their well-known equivalents, so you don’t have to list every spelling. For example, Chief Technology Officer, Chief Technical Officer, and CTO match each other, and VP matches Vice President (covers CEO, CTO, CFO, COO, CMO, CIO, CISO, CHRO, VP, and HR).

Titles match on whole words and common word forms: CTO matches “Co-founder & CTO” but not “Director”, and engineer also finds “Engineering” and “Engineers”.

Use job_titles for a specific role wording. To target a whole tier of people (for example, all the leaders at a company), use the seniority, department, and decision_maker filters.
api_key required Your secret API key. You can retrieve it in your dashboard.

Each response returns 10 emails by default. You can increase this up to a maximum of 100 using the limit parameter. To retrieve all available results, paginate through them using limit and offset together. A new query is counted for calls returning at least one result.

The number of sources is limited to 20 for each email address. The extracted_on attribute of a source contains the date it was found for the first time, whereas the last_seen_on attribute contains the date it was found for the last time.

type returns the value "personal" or "generic". A "generic" email address is a role-based email address, like contact@hunter.io. On the contrary, a "personal" email address is the address of someone in the company.

confidence is our estimation of the probability the email address returned is correct. It depends on several criteria such as the number and quality of sources.

The Domain Search API endpoint is rate limited to 15 requests per second and 500 requests per minute.

Errors

Here are the errors specific to the Domain Search API call. If you can't find an error in the list, please also check the general API errors.

400
wrong_params
domain or company is missing in the parameters.
400
invalid_type

The supplied type is invalid.

400
invalid_seniority

The supplied seniority is invalid.

400
invalid_department

The supplied department is invalid.

400
pagination_error

The supplied limit or offset is invalid. This error can also be returned if the limit additioned to the offset is higher than 10 for a Free plan user.

HTTP request example

GET https://api.hunter.io/v2/domain-search?domain=intercom.com&api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "domain": "intercom.com",
    "disposable": false,
    "webmail": false,
    "accept_all": true,
    "pattern": "{first}",
    "organization": "Intercom",
    "linked_domains": [],
    "emails": [
      {
        "value": "ciaran@intercom.com",
        "type": "personal",
        "confidence": 92,
        "sources": [
          {
            "domain": "github.com",
            "uri": "http://github.com/ciaranlee",
            "extracted_on": "2015-07-29",
            "last_seen_on": "2017-07-01",
            "still_on_page": true
          },
          {
            "domain": "blog.intercom.com",
            "uri": "http://blog.intercom.com/were-hiring-a-support-engineer/",
            "extracted_on": "2015-08-29",
            "last_seen_on": "2017-07-01",
            "still_on_page": true
          },
          ...
        ],
        "first_name": "Ciaran",
        "last_name": "Lee",
        "position": "Support Engineer",
        "position_raw": "Support Engineer",
        "seniority": "senior",
        "department": "it",
        "linkedin": null,
        "twitter": "ciaran_lee",
        "phone_number": null,
        "verification": {
          "date": "2019-12-06",
          "status": "valid"
        }
      },
      ...
    ]
  },
  "meta": {
    "results": 35,
    "limit": 10,
    "offset": 0,
    "params": {
      "domain": "intercom.com",
      "company": null,
      "type": null,
      "seniority": null,
      "department": null
    }
  }
}

Domain Finder Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

This API endpoint returns the most likely domain name(s) for a given company name. It’s the canonical way to resolve a company name into a domain before calling other endpoints like Domain Search or Email Finder.

Pricing: The Domain Finder endpoint is free — it does not consume credits and does not decrement your monthly search call limit. Calls are still blocked once your monthly search quota is exhausted.
Note: each result includes the resolved company_name in addition to the domain.
company required The company name to resolve into a domain. For example, stripe or "Y Combinator". It doesn’t need to be in lowercase. It must be composed of at least 3 characters.
api_key required Your secret API key. You can retrieve it in your dashboard.
limit The maximum number of suggestions to return. Must range between 1 and 10. Defaults to 5.
perfect_match When set to true, only returns suggestions with a very high similarity to the supplied company name. Useful when you want a single confident answer rather than a list of candidates. Defaults to false.

Errors

Here are the errors specific to the Domain Finder API call. If you can’t find an error in the list, please also check the general API errors.

400
wrong_params
company is missing, shorter than 3 characters, limit is outside the 1–10 range, or perfect_match is not a boolean.
HTTP request example

GET https://api.hunter.io/v2/domain-finder?company=stripe&api_key=API_KEY

Get my free API key

Response: 200 OK
{
                "data": [
                  {
                    "domain": "stripe.com",
                    "company_name": "Stripe",
                    "logo": "https://logos.hunter.io/stripe.com",
                    "email_count": 281
                  }
                ],
                "meta": {
                  "results": 1,
                  "params": {
                    "company": "stripe",
                    "limit": 5,
                    "perfect_match": false
                  }
                }
              }

Email Finder

This API endpoint finds the most likely email address from a domain name, a first name and a last name.

Requirements: You must provide at least one of domain, company, or linkedin_handle. You must also provide a name — either first_name + last_name, or full_name — unless linkedin_handle is provided.
domain required unless company or linkedin_handle The domain name of the company.
company required unless domain or linkedin_handle The company name from which you want to find the email addresses. For example, "stripe". Note that providing the domain name gives better results as it removes the conversion from the company name. If you send a request with both the domain and the company name, the domain name will be used. The company name doesn't need to be in lowercase.
linkedin_handle required unless domain or company The handle of the LinkedIn profile for which you to find the email address.
first_name required unless full_name or linkedin_handle The person's first name. It doesn't need to be in lowercase.
last_name required unless full_name or linkedin_handle The person's last name. It doesn't need to be in lowercase.
full_name required unless first_name and last_name, or linkedin_handle The person's full name. Note that you'll get better results by supplying the person's first and last name if you can. It doesn't need to be in lowercase.
max_duration The maximum duration of the request in seconds. Setting a longer duration allows us to refine the results and provide more accurate data. It must range between 3 and 20. The default is 10.
api_key required Your secret API key. You can retrieve it in your dashboard.

A verification is automatically performed on each email found. If no email can be found, no credit is charged. The verification information is displayed in verification. The possible statuses are valid, accept_all, and unknown.

For accept-all emails, the score estimates the probability that the email address is valid.

If the email address can be found publicly on the web, the URLs are returned in sources. The extracted_on attribute contains the date it was found for the first time, whereas the last_seen_on attribute contains the date it was found for the last time. The number of sources that can be returned is limited to 20.

The Email Finder API endpoint is rate limited to 15 requests per second and 500 requests per minute.

Errors

Here are the errors specific to the Email Finder API call. If you can't find an error in the list, please also check the general API errors.

400
wrong_params
A required parameter is missing.
400
invalid_first_name

The supplied first_name is invalid.

400
invalid_last_name

The supplied last_name is invalid.

400
invalid_full_name

The supplied full_name is invalid.

400
invalid_domain

The domain name is invalid, has no MX record or its owner has asked us to stop the processing of the associated data.

400
invalid_max_duration

The supplied max_duration is invalid.

451
claimed_email

The person owning the email address asked us directly or indirectly to stop the processing of their personal data. For this reason, you shouldn't process it yourself in any way.

HTTP request example

GET https://api.hunter.io/v2/email-finder?domain=reddit.com&first_name=Alexis&last_name=Ohanian&api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "first_name": "Alexis",
    "last_name": "Ohanian",
    "email": "alexis@reddit.com",
    "score": 97,
    "domain": "reddit.com",
    "accept_all": false,
    "position": "Cofounder",
    "twitter": null,
    "linkedin_url": null,
    "phone_number": null,
    "company": "Reddit",
    "sources": [
      {
        "domain": "redditblog.com",
        "uri": "http://redditblog.com/2008/10/22/widgets-get-an-upgrade-and-a-firefox-extension-that-will-rock-your-world",
        "extracted_on": "2018-10-19",
        "last_seen_on": "2021-05-18",
        "still_on_page": true
      },
      ...
    ],
    "verification": {
      "date": "2021-06-14",
      "status": "valid"
    }
  },
  "meta": {
    "params": {
      "first_name": "Alexis",
      "last_name": "Ohanian",
      "full_name": null,
      "domain": "reddit.com",
      "company": null,
      "max_duration": null
    }
  }
}

Email Verifier

This API endpoint allows you to verify the deliverability of an email address.

The request will run for 20 seconds. If it was not able to provide a response in time, we will return a 202 status code. You will then be able to poll the same endpoint to get the verification's result. Of course, all the requests in this case are counted only once.

email required The email address you want to verify.
api_key required Your secret API key. You can retrieve it in your dashboard.

status returns the status of the email address. It takes 1 out of 6 possible values:

  • "valid": the email address is valid.
  • "invalid": the email address is not valid.
  • "accept_all": the email address is valid but any email address is accepted by the server.
  • "webmail": the email address comes from an email service provider such as Gmail or Outlook.
  • "disposable": the email address comes from a disposable email service provider.
  • "unknown": we failed to verify the email address.

result returns the main status of the verification. It takes 1 out of 3 possible values:

  • "deliverable": the email verification is successful and the email address is valid.
  • "undeliverable": the email address is not valid.
  • "risky": the verification can't be validated.

It is deprecated; use status instead to get the detailed status of the email address.

score is the deliverability score we give to the email address. For webmail and disposable emails, we provide an arbitrary score of 50.

regexp is true if the email address passes our regular expression.

gibberish is true if we find this is an automatically generated email address (for example "e65rc109q@company.com").

disposable is true if we find this is an email address from a disposable email service.

webmail is true if we find this is an email from a webmail (for example Gmail).

mx_records is true if we find MX records exist on the domain of the given email address.

smtp_server is true if we connect to the SMTP server successfully.

smtp_check is true if the email address doesn't bounce.

accept_all is true if the SMTP server accepts all the email addresses. It means you can have have false positives on SMTP checks.

block is true if the SMTP server prevented us to perform the SMTP check.

sources If we have found the given email address somewhere on the web, we display the sources here. The number of sources is limited to 20. The extracted_on attribute contains the date it was found for the first time, whereas the last_seen_on attribute contains the date it was found for the last time.

The Email Verifier API endpoint is rate limited to 10 requests per second and 300 requests per minute.

Errors

Here are the errors specific to the Email Verifier API call. If you can't find an error in the list, please also check the general API errors.

202 The verification is still in progress. Feel free to make the API call again as often as necessary. It will only count as a single request until we return the response.
222 The verification failed because of an unexpected response from the remote SMTP server. This failure is outside of our control. We recommend to retry later.
400
wrong_params
The email parameter is missing.
400
invalid_email

The supplied email is invalid.

451
claimed_email

The person owning the email address asked us directly or indirectly to stop the processing of their personal data. For this reason, you shouldn't process it yourself in any way.

HTTP request example

GET https://api.hunter.io/v2/email-verifier?email=patrick@stripe.com&api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "status": "valid",
    "score": 100,
    "email": "patrick@stripe.com",
    "regexp": true,
    "gibberish": false,
    "disposable": false,
    "webmail": false,
    "mx_records": true,
    "smtp_server": true,
    "smtp_check": true,
    "accept_all": false,
    "block": false,
    "sources": [
      {
        "domain": "beta.paganresearch.io",
        "uri": "http://beta.paganresearch.io/details/stripe",
        "extracted_on": "2020-06-17",
        "last_seen_on": "2020-06-17",
        "still_on_page": true
      },
      {
        "domain": "icloudnewz.blogspot.com",
        "uri": "http://icloudnewz.blogspot.com/2017/11/follow-patrick-collison-mike-birbiglia.html",
        "extracted_on": "2020-03-25",
        "last_seen_on": "2020-06-29",
        "still_on_page": true
      }
    ]
  },
  "meta": {
    "params": {
      "email": "patrick@stripe.com"
    }
  }
}

Enrichment

Our Enrichment endpoints allow you to retrieve all the information we have about a person, a company, or both.

Here is the list of the available endpoints:

Email Enrichment

Returns all the information associated with an email address or LinkedIn handle, such as a person's name, location and social handles.

Requirements: You must provide at least one of email or linkedin_handle. When both are provided, linkedin_handle takes precedence.
email required unless linkedin_handle The email address name for which you to find associated information.
linkedin_handle required unless email The handle of the LinkedIn profile for which you to find associated information.
api_key required Your secret API key. You can retrieve it in your dashboard.
clearbit_format As more customers switch to Clearbit, we've updated the Enrichment API to support the same Clearbit schema. Any value you provide will now be formatted to match Clearbit's schema for consistency.

If we can find the person we'll return a 200 status containing the person's attributes.

If we can't find any information associated with the email address, we'll return a 404 status.

The Email Enrichment API endpoint is rate limited to 15 requests per second and 500 requests per minute.

HTTP request example

GET https://api.hunter.io/v2/people/find?email=matt@hunter.io&api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "id": "b3ae14fb-6725-56d1-ac68-a76f8ce04dec",
    "name": {
      "fullName": "Matthew Tharp",
      "givenName": "Matthew",
      "familyName": "Tharp"
    },
    "email": "matt@hunter.io",
    "location": "Framingham, Massachusetts, United States",
    "timeZone": "America/New_York",
    "utcOffset": -5,
    "geo": {
      "city": "Framingham",
      "state": "Massachusetts",
      "stateCode": "MA",
      "country": "United States",
      "countryCode": "US",
      "lat": 42.27926,
      "lng": -71.41617
    },
    "bio": null,
    "site": null,
    "avatar": null,
    "employment": {
      "domain": "hunter.io",
      "name": "Hunter",
      "title": "Chief Executive Officer",
      "role": "executive",
      "subRole": null,
      "seniority": "executive"
    },
    "facebook": {
      "handle": null
    },
    "github": {
      "handle": null,
      "id": null,
      "avatar": null,
      "company": null,
      "blog": null,
      "followers": null,
      "following": null
    },
    "twitter": {
      "handle": "matttharp",
      "id": null,
      "bio": null,
      "followers": null,
      "following": null,
      "statuses": null,
      "favorites": null,
      "location": null,
      "site": null,
      "avatar": null
    },
    "linkedin": {
      "handle": "matttharp"
    },
    "googleplus": {
      "handle": null
    },
    "gravatar": {
      "handle": null,
      "urls": [],
      "avatar": null,
      "avatars": []
    },
    "fuzzy": false,
    "emailProvider": "google.com",
    "indexedAt": "2025-08-30",
    "phone": null,
    "activeAt": "2025-09-03",
    "inactiveAt": null
  },
  "meta": {
    "email": "matt@hunter.io"
  }
}

Company Enrichment

Returns all the information associated with a domain name, such as the industry, the description, or headquarters' location.

domain required The domain name for which you to find associated information.
api_key required Your secret API key. You can retrieve it in your dashboard.
clearbit_format As more customers switch to Clearbit, we've updated the Enrichment API to support the same Clearbit schema. Any value you provide will now be formatted to match Clearbit's schema for consistency.

If we can find the company we'll return a 200 status containing the company's attributes.

If we can't find any information associated with the domain name, we'll return a 404 status.

The Company Enrichment API endpoint is rate limited to 15 requests per second and 500 requests per minute.

HTTP request example

GET https://api.hunter.io/v2/companies/find?domain=hunter.io&api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "id": "95ca56a8-a019-5c41-881e-293d9ca4741a",
    "name": "Hunter",
    "legalName": "Hunter",
    "domain": "hunter.io",
    "domainAliases": [],
    "site": {
      "phoneNumbers": [
        "+1 415 712 0049"
      ],
      "emailAddresses": [
        "support@hunter.io",
        "security@hunter.io",
        "contact@hunter.io",
        "engineering@hunter.io",
        "affiliates@hunter.io",
        "press@hunter.io"
      ]
    },
    "category": {
      "sector": "Information Technology",
      "industryGroup": "Software & Services",
      "industry": "Internet Software & Services",
      "subIndustry": "Internet",
      "gicsCode": "45103010",
      "sicCode": "36",
      "sic4Codes": [
        "73"
      ],
      "naicsCode": "51",
      "naics6Codes": [
        "519130"
      ],
      "naics6Codes2022": [
        "519290"
      ]
    },
    "tags": [
      "email marketing",
      "lead generation",
      "data enrichment",
      "sales intelligence",
      "business tools"
    ],
    "description": "Hunter is an email marketing company that specializes in lead generation and data enrichment.",
    "foundedYear": 2015,
    "location": "Wilmington, Delaware, United States",
    "timeZone": "America/New_York",
    "utcOffset": -5,
    "geo": {
      "streetNumber": null,
      "streetName": null,
      "subPremise": null,
      "streetAddress": null,
      "city": "Wilmington",
      "postalCode": null,
      "state": "Delaware",
      "stateCode": "DE",
      "country": "United States",
      "countryCode": "US",
      "lat": 39.74595,
      "lng": -75.54659
    },
    "logo": "https://logos.hunter.io/hunter.io",
    "facebook": {
      "handle": null,
      "likes": null
    },
    "linkedin": {
      "handle": "company/hunterio"
    },
    "twitter": {
      "handle": null,
      "id": null,
      "bio": null,
      "followers": null,
      "following": null,
      "location": null,
      "site": null,
      "avatar": null
    },
    "crunchbase": {
      "handle": null
    },
    "instagram": {
      "handle": null
    },
    "emailProvider": "google.com",
    "type": "private",
    "company_type": "privately held",
    "ticker": null,
    "identifiers": {
      "usEIN": null
    },
    "phone": "+1 415 712 0049",
    "metrics": {
      "alexaUsRank": null,
      "alexaGlobalRank": null,
      "trafficRank": "very_high",
      "employees": "11-50",
      "marketCap": null,
      "raised": null,
      "annualRevenue": null,
      "estimatedAnnualRevenue": null,
      "fiscalYearEnd": null
    },
    "indexedAt": "2024-09-09",
    "tech": [
      "cloudflare",
      "cloudflare-browser-insights",
      "hsts",
      "http-3",
      "ruby",
      "stimulus"
    ],
    "techCategories": [
      "analytics",
      "dns",
      "marketing_automation",
      "programming_framework",
      "security",
      "web_servers"
    ],
    "fundingRounds": [],
    "parent": {
      "domain": null
    },
    "ultimateParent": {
      "domain": null
    }
  },
  "meta": {
    "domain": "hunter.io"
  }
}

Combined Enrichment

Returns all the information associated with an email address and its domain name.

email required The email address name for which you to find associated information.
api_key required Your secret API key. You can retrieve it in your dashboard.
clearbit_format As more customers switch to Clearbit, we've updated the Enrichment API to support the same Clearbit schema. Any value you provide will now be formatted to match Clearbit's schema for consistency.

If we can find the person we'll return a 200 status containing the person and their company's attributes.

If we can't find any information associated with the email, we'll return a 404 status.

The Combined Enrichment API endpoint is rate limited to 15 requests per second and 500 requests per minute.

HTTP request example

GET https://api.hunter.io/v2/combined/find?email=matt@hunter.io&api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "person": {
      "id": "b3ae14fb-6725-56d1-ac68-a76f8ce04dec",
      "name": {
        "fullName": "Matthew Tharp",
        "givenName": "Matthew",
        "familyName": "Tharp"
      },
      "email": "matt@hunter.io",
      "location": "Framingham, Massachusetts, United States",
      "timeZone": "America/New_York",
      "utcOffset": -5,
      "geo": {
        "city": "Framingham",
        "state": "Massachusetts",
        "stateCode": "MA",
        "country": "United States",
        "countryCode": "US",
        "lat": 42.27926,
        "lng": -71.41617
      },
      "bio": null,
      "site": null,
      "avatar": null,
      "employment": {
        "domain": "hunter.io",
        "name": "Hunter",
        "title": "Chief Executive Officer",
        "role": "executive",
        "subRole": null,
        "seniority": "executive"
      },
      "facebook": {
        "handle": null
      },
      "github": {
        "handle": null,
        "id": null,
        "avatar": null,
        "company": null,
        "blog": null,
        "followers": null,
        "following": null
      },
      "twitter": {
        "handle": "matttharp",
        "id": null,
        "bio": null,
        "followers": null,
        "following": null,
        "statuses": null,
        "favorites": null,
        "location": null,
        "site": null,
        "avatar": null
      },
      "linkedin": {
        "handle": "matttharp"
      },
      "googleplus": {
        "handle": null
      },
      "gravatar": {
        "handle": null,
        "urls": [],
        "avatar": null,
        "avatars": []
      },
      "fuzzy": false,
      "emailProvider": "google.com",
      "indexedAt": "2025-08-30",
      "phone": null,
      "activeAt": "2025-09-03",
      "inactiveAt": null
    },
    "company": {
      "id": "95ca56a8-a019-5c41-881e-293d9ca4741a",
      "name": "Hunter",
      "legalName": "Hunter",
      "domain": "hunter.io",
      "domainAliases": [],
      "site": {
        "phoneNumbers": [
          "+1 415 712 0049"
        ],
        "emailAddresses": [
          "support@hunter.io",
          "security@hunter.io",
          "contact@hunter.io",
          "engineering@hunter.io",
          "affiliates@hunter.io",
          "press@hunter.io"
        ]
      },
      "category": {
        "sector": "Information Technology",
        "industryGroup": "Software & Services",
        "industry": "Internet Software & Services",
        "subIndustry": "Internet",
        "gicsCode": "45103010",
        "sicCode": "36",
        "sic4Codes": [
          "73"
        ],
        "naicsCode": "51",
        "naics6Codes": [
          "519130"
        ],
        "naics6Codes2022": [
          "519290"
        ]
      },
      "tags": [
        "email marketing",
        "lead generation",
        "data enrichment",
        "sales intelligence",
        "business tools"
      ],
      "description": "Hunter is an email marketing company that specializes in lead generation and data enrichment.",
      "foundedYear": 2015,
      "location": "Wilmington, Delaware, United States",
      "timeZone": "America/New_York",
      "utcOffset": -5,
      "geo": {
        "streetNumber": null,
        "streetName": null,
        "subPremise": null,
        "streetAddress": null,
        "city": "Wilmington",
        "postalCode": null,
        "state": "Delaware",
        "stateCode": "DE",
        "country": "United States",
        "countryCode": "US",
        "lat": 39.74595,
        "lng": -75.54659
      },
      "logo": "https://logos.hunter.io/hunter.io",
      "facebook": {
        "handle": null,
        "likes": null
      },
      "linkedin": {
        "handle": "company/hunterio"
      },
      "twitter": {
        "handle": null,
        "id": null,
        "bio": null,
        "followers": null,
        "following": null,
        "location": null,
        "site": null,
        "avatar": null
      },
      "crunchbase": {
        "handle": null
      },
      "instagram": {
        "handle": null
      },
      "emailProvider": "google.com",
      "type": "private",
      "company_type": "privately held",
      "ticker": null,
      "identifiers": {
        "usEIN": null
      },
      "phone": "+1 415 712 0049",
      "metrics": {
        "alexaUsRank": null,
        "alexaGlobalRank": null,
        "trafficRank": "very_high",
        "employees": "11-50",
        "marketCap": null,
        "raised": null,
        "annualRevenue": null,
        "estimatedAnnualRevenue": null,
        "fiscalYearEnd": null
      },
      "indexedAt": "2024-09-09",
      "tech": [
        "cloudflare",
        "cloudflare-browser-insights",
        "hsts",
        "http-3",
        "ruby",
        "stimulus"
      ],
      "techCategories": [
        "analytics",
        "dns",
        "marketing_automation",
        "programming_framework",
        "security",
        "web_servers"
      ],
      "fundingRounds": [],
      "parent": {
        "domain": null
      },
      "ultimateParent": {
        "domain": null
      }
    }
  },
  "meta": {
    "email": "maat@hunter.io"
  }
}

Email Count

This API endpoint allows you to know how many email addresses we have for one domain or for one company.

Requirements: You must provide at least one of domain or company. If both are provided, domain takes precedence.
domain required unless company The domain name for which you want to know how many email addresses we have.
company required unless domain The company name for which you want to know how many email addresses we have. For example, "stripe". Note that you'll get better results by supplying the domain name as we won't have to find it. If you send a request with both the domain and the company name, we'll use the domain name. It doesn't need to be in lowercase. It must be composed of at least 3 characters.
api_key required Your secret API key. You can retrieve it in your dashboard.
type Get the count of only personal or generic email addresses.

The Email Count API endpoint is rate limited to 15 requests per second.

Errors

Here are the errors specific to the Email Count API call. If you can't find an error in the list, please also check the general API errors.

400
wrong_params
domain or company is missing in the parameters.
400
invalid_type

The supplied type is invalid.

HTTP request example

GET https://api.hunter.io/v2/email-count?domain=stripe.com&api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "total": 81,
    "personal_emails": 65,
    "generic_emails": 16,
    "department": {
      "executive": 10,
      "it": 0,
      "finance": 8,
      "management": 0,
      "sales": 0,
      "legal": 0,
      "support": 6,
      "hr": 0,
      "marketing": 0,
      "communication": 2,
      "education": 0,
      "design": 0,
      "health": 0,
      "operations": 0
    },
    "seniority": {
      "junior": 13,
      "senior": 5,
      "executive": 2
    }
  },
  "meta": {
    "params": {
      "domain": "stripe.com",
      "company": null,
      "type": null
    }
  }
}

Account Information

This API endpoint enables you to get information regarding your Hunter account at any time. This call is free.

api_key required Your secret API key. You can retrieve it in your dashboard.

calls is the sum of search and verification requests made during the current billing period. It is deprecated; use requests instead to get the detailed usage per request type.

HTTP request example

GET https://api.hunter.io/v2/account?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "first_name": "Antoine",
    "last_name": "Finkelstein",
    "email": "antoine@hunter.io",
    "plan_name": "Growth",
    "plan_level": 2,
    "reset_date": 2026-07-09,
    "team_id": 1,
    "requests": {
      "credits": {
        "used": 550.0,
        "available": 10000.0
      },
      "searches": {
        "used": 500,
        "available": 10000
      },
      "verifications": {
        "used": 100,
        "available": 20000
      }
    },
    "calls": {
      "_deprecation_notice": "Sums the searches and the verifications, giving an unprecise look of the requests available",
      "used": 18526,
      "available": 20000
    }
  }
}

Usage Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

This API endpoint returns your team's current usage and the requests remaining for the ongoing billing period. It is useful to check whether enough requests are left before starting a workflow. This call is free and does not consume any credits.

api_key required Your secret API key. You can retrieve it in your dashboard.
show_overage_requests optional Set to a truthy value to include each request type's over_quota count in the response. Only available for premium plans with overage requests enabled.

reset_date is the date your current billing period ends and your requests reset. Each entry in requests reports the requests used and the total available for that request type during the current period.

requests.credits is only present when the team is on a unified credits bucket. Otherwise the per-type searches and verifications blocks expose the same data scoped to each request type.

On a unified credits bucket, requests.credits also includes remaining , the credits left for the current period, matching the value shown on the usage page and dashboard.

HTTP request example

GET https://api.hunter.io/v2/usage?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "reset_date": 2026-07-09,
    "requests": {
      "searches": {
        "used": 500,
        "available": 10000
      },
      "verifications": {
        "used": 100,
        "available": 20000
      }
    }
  }
}

Company list favorites Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Mark and unmark a company list as a favorite for the authenticated user. Favoriting a list pins it to the top of the sidebar in the Hunter web app for quick access. Both endpoints are idempotent — repeating the same call does not duplicate or error.

api_key required Your secret API key. You can retrieve it in your dashboard.
id required The numeric identifier of the company list, taken from the URL of the list in the web app.

A 404 is returned when the list does not exist or belongs to another team. A 401 is returned when the API key is missing or invalid.

Favorite a list

POST https://api.hunter.io/v2/company-lists/42/favorite?api_key=API_KEY


Response: 201 Created
{
                "data": {
                  "id": 42,
                  "favorited": true
                }
              }


Unfavorite a list

DELETE https://api.hunter.io/v2/company-lists/42/favorite?api_key=API_KEY


Response: 200 OK
{
                "data": {
                  "id": 42,
                  "favorited": false
                }
              }

Leads list favorites Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Mark and unmark a leads list as a favorite for the authenticated user. Favoriting a list pins it to the top of the sidebar in the Hunter web app for quick access. Both endpoints are idempotent — repeating the same call does not duplicate or error.

api_key required Your secret API key. You can retrieve it in your dashboard.
id required The numeric identifier of the leads list, taken from the URL of the list in the web app.

A 404 is returned when the list does not exist or belongs to another team. A 401 is returned when the API key is missing or invalid.

Favorite a list

POST https://api.hunter.io/v2/leads_lists/42/favorite?api_key=API_KEY


Response: 201 Created
{
                "data": {
                  "id": 42,
                  "favorited": true
                }
              }


Unfavorite a list

DELETE https://api.hunter.io/v2/leads_lists/42/favorite?api_key=API_KEY


Response: 200 OK
{
                "data": {
                  "id": 42,
                  "favorited": false
                }
              }

Connected Apps Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Returns the third-party apps connected to the team — CRMs, email accounts, automation tools, and spreadsheets. Read-only. Useful for agents to discover which integrations are available before deciding where to push or sync data.

api_key required Your secret API key. You can retrieve it in your dashboard.
limit optional Page size for the index call. Defaults to 20.
offset optional Skip the first N apps for pagination. Defaults to 0.

Each app exposes provider (a stable slug like hubspot), name (display name), category (one of crm, emailing, automation, spreadsheet, connect_as, mcp_server), and connection metadata. The show endpoint additionally returns attribute_mappings — the field mapping configured between Hunter leads and the connected provider.

Push leads to a CRM

Triggers an asynchronous sync of selected leads to a connected CRM (HubSpot, Salesforce, Pipedrive, Zoho, or Zapier). Provide either a list of lead_ids or a leads_list_id. The call responds with 202 Accepted; the leads are pushed in the background.

lead_ids optional Array of lead ids to push. Required unless leads_list_id is provided.
leads_list_id optional Push every lead in this list. Takes precedence over lead_ids when both are provided.
List connected apps

GET https://api.hunter.io/v2/connected-apps?api_key=API_KEY

Get my free API key

Response: 200 OK
{
                "data": [
                  {
                    "id": 42,
                    "provider": "hubspot",
                    "name": "HubSpot",
                    "category": "crm",
                    "provider_email": "ops@example.com",
                    "connected_at": "2026-01-15T10:00:00Z",
                    "updated_at": "2026-05-07T13:00:00Z"
                  }
                ],
                "meta": { "total": 1, "limit": 20, "offset": 0 }
              }


Show one app

GET https://api.hunter.io/v2/connected-apps/42?api_key=API_KEY


Response: 200 OK
{
                "data": {
                  "id": 42,
                  "provider": "hubspot",
                  "name": "HubSpot",
                  "category": "crm",
                  "provider_email": "ops@example.com",
                  "connected_at": "2026-01-15T10:00:00Z",
                  "updated_at": "2026-05-07T13:00:00Z",
                  "attribute_mappings": [
                    { "target_field": "firstname", "source_field": "first_name" },
                    { "target_field": "lastname", "source_field": "last_name" }
                  ]
                }
              }


Push leads to a CRM

POST https://api.hunter.io/v2/connected-apps/42/push?api_key=API_KEY

Body
{ "lead_ids": [101, 102, 103] }

Response: 202 Accepted
{
                "data": {
                  "connected_app_id": 42,
                  "provider": "hubspot",
                  "leads_count": 3,
                  "status": "queued"
                },
                "meta": { "params": { "lead_ids": [101, 102, 103], "leads_list_id": null } }
              }

API keys Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Manage your API keys programmatically. Each key authenticates your requests to the API. You can have up to 100 keys and must always keep at least one.

Here is the list of the available methods:

For security, listed keys are masked and only show the last 4 characters. The full token is returned only once, in the response to the create call, so make sure to store it safely.

All these calls are free.

List all your API keys

Returns all your API keys. The keys are returned in sorted order, with the most recent keys appearing first. Tokens are masked.

limit A limit on the number of keys to be returned. Limit can range between 1 and 100 keys. Default is 20.
offset The number of keys to skip. Use this parameter to fetch all the keys.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/api-keys?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "status": "success",
  "data": [
    {
      "id": 2,
      "name": "CI server",
      "token": "********cdef",
      "created_at": "2024-01-02T09:00:00Z"
    },
    {
      "id": 1,
      "name": null,
      "token": "********89ab",
      "created_at": "2024-01-01T09:00:00Z"
    }
  ],
  "meta": {
    "total": 2,
    "limit": 20,
    "offset": 0
  }
}

Create an API key

Creates a new API key. The response includes the full token, which is shown only this once.

name An optional name to help you identify the key. Must be at most 255 characters and unique among your keys.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/api-keys?api_key=API_KEY

Get my free API key

Request Body
{
  "name": "CI server"
}


Response: 201 Created
{
  "status": "success",
  "data": {
    "id": 3,
    "name": "CI server",
    "token": "0123456789abcdef0123456789abcdef01234567",
    "created_at": "2024-01-03T09:00:00Z"
  }
}

Rename an API key

Renames an existing API key. The name is the only field you can change, the token itself never changes. The masked key is returned.

id required Identifier of the API key.
name required The new name for the key. Must be at most 255 characters and unique among your keys.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

PUT https://api.hunter.io/v2/api-keys/1?api_key=API_KEY

Get my free API key

Request Body
{
  "name": "Production server"
}


Response: 200 OK
{
  "status": "success",
  "data": {
    "id": 1,
    "name": "Production server",
    "token": "********89ab",
    "created_at": "2024-01-01T09:00:00Z"
  }
}

Delete an API key

Deletes an existing API key. The identifier is passed as part of the path. You cannot delete your last key.

id required Identifier of the API key.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/api-keys/1?api_key=API_KEY

Get my free API key

Response: 204 No Content

Webhooks Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Manage webhooks through the API. A webhook registers a target URL that Hunter calls when one of the supported events happens in your team, so you can push activity into your own systems.

Here is the list of the available methods:

The event attribute must be one of: lead.created, message.sent, message.read, message.clicked, message.replied, export.completed, import.completed, sequence.paused, or sequence.resumed.

lead.created is delivered through the Zapier integration, so it only fires once Hunter Leads is connected to Zapier; the message.* events fire for any webhook.

All these calls are free.

List all your webhooks

Returns all the webhooks in your team. The webhooks are returned in sorted order, with the most recent webhooks appearing first.

limit A limit on the number of webhooks to be returned. Limit can range between 1 and 100 webhooks. Default is 20.
offset The number of webhooks to skip. Use this parameter to fetch all the webhooks.
api_key required Your secret API key. You can generate it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/webhooks?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "status": "success",
  "data": [
    {
      "id": 2,
      "target_url": "https://example.com/hooks/replies",
      "event": "message.replied"
    },
    {
      "id": 1,
      "target_url": "https://example.com/hooks/leads",
      "event": "lead.created"
    }
  ],
  "meta": {
    "total": 2,
    "limit": 20,
    "offset": 0
  }
}

Get a webhook

Retrieves all the fields of a webhook.

id required Identifier of the webhook.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/webhooks/1?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "status": "success",
  "data": {
    "id": 1,
    "target_url": "https://example.com/hooks/leads",
    "event": "lead.created"
  }
}

Create a webhook

Creates a new webhook. The parameters must be passed as a JSON hash.

target_url required The URL Hunter calls when the event happens. Must be a valid HTTP URL between 12 and 500 characters.
event required The event that triggers the webhook. See the list of supported values above.
filter_on Restrict the webhook to a single resource, passed as a global ID (for example a campaign). When omitted, the webhook fires for every matching event in your team.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/webhooks?api_key=API_KEY

Get my free API key

Request Body
{
  "target_url": "https://example.com/hooks/messages",
  "event": "message.sent"
}


Response: 201 Created
{
  "status": "success",
  "data": {
    "id": 3,
    "target_url": "https://example.com/hooks/messages",
    "event": "message.sent"
  }
}

Update a webhook

Updates an existing webhook. The updated values must be passed as a JSON hash.

id required Identifier of the webhook.
target_url The new URL Hunter calls when the event happens.
event The new event that triggers the webhook. See the list of supported values above.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

PUT https://api.hunter.io/v2/webhooks/1?api_key=API_KEY

Get my free API key

Request Body
{
  "target_url": "https://example.com/hooks/new-leads",
  "event": "message.replied"
}


Response: 200 OK
{
  "status": "success",
  "data": {
    "id": 1,
    "target_url": "https://example.com/hooks/new-leads",
    "event": "message.replied"
  }
}

Delete a webhook

Deletes an existing webhook. The identifier is passed as a query parameter.

id required Identifier of the webhook.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/webhooks?id=1&api_key=API_KEY

Get my free API key

Response: 204 No Content

Email Accounts Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Returns the email accounts the requesting user can act on for sending sequences. Read-only. Useful for agents to discover sending accounts before starting a campaign — sequences cannot start without at least one email account.

On paid plans this returns every email account on the team. On the Free plan it returns only the accounts owned by the user whose API key is making the request, matching what the user sees in the dashboard.

api_key required Your secret API key. You can retrieve it in your dashboard.
limit optional Page size for the index call. Defaults to 20.
offset optional Skip the first N accounts for pagination. Defaults to 0.

Each account exposes email (the address used in the From header), the owner's first_name and last_name, sending_status (one of active, paused, warming), daily_limit (the maximum number of messages this account can send per day), and provider (a stable slug such as gmail, outlook, or smtp_imap).

email, first_name, and last_name can be null when the underlying record has no value set.

sending_status values:

  • active — the account is connected and ready to send.
  • warming — the account is in warmup or ramp-up. This takes precedence over connection state, so a warming account that is also disconnected still reports warming.
  • paused — the account cannot send right now. Covers both temporary backoffs (e.g. SMTP/IMAP transient errors that auto-recover) and hard disconnections that require user action to reconnect.

meta.total reflects the count of accounts the requesting user can see, not the entire team. On the Free plan it will rise after a plan upgrade as team-wide accounts become visible.

Retrieve a single account

GET /v2/email-accounts/:id returns the full configuration of one account, so an agent can inspect its settings before using it for a sequence. Read-only, with the same plan-aware scoping as the list — an account the requesting user cannot see returns 404. No credentials or secrets are ever returned.

On top of the list fields, the response adds:

  • sender_name — the locally-stored display name used in the From header. May be null for Outlook accounts that haven't set a custom name, since their sender name lives in the Microsoft profile and is fetched live rather than returned here.
  • default_account — whether this is the owner's default sending account. This is a per-user flag, so on a multi-member team several accounts can each be the default for their own owner.
  • signature — the account's stored signature, or null when none is set.
  • profile_picture_url — the account owner's avatar.
  • custom_tracking_domain — the team's active custom tracking domain, or null when the shared Hunter domain is used.
  • sending_schedule — the default send windows a new sequence created from your account would use: days (integers, 0=Monday to 6=Sunday), start_time and end_time (HH:MM), and time_zone. A sequence can override these. Resolved from the requesting user's defaults, since a new sequence is owned by the requester.
  • warmup — an inbox-protection summary: enabled, status, and end_date.
List email accounts

GET https://api.hunter.io/v2/email-accounts?api_key=API_KEY

Get my free API key

Response: 200 OK
{
                "data": [
                  {
                    "id": 42,
                    "email": "ops@example.com",
                    "first_name": "Alex",
                    "last_name": "Doe",
                    "sending_status": "active",
                    "daily_limit": 50,
                    "provider": "gmail"
                  }
                ],
                "meta": { "total": 1, "limit": 20, "offset": 0 }
              }


Retrieve a single account

GET https://api.hunter.io/v2/email-accounts/42?api_key=API_KEY


Response: 200 OK
{
                "data": {
                  "id": 42,
                  "email": "ops@example.com",
                  "first_name": "Alex",
                  "last_name": "Doe",
                  "sending_status": "active",
                  "daily_limit": 50,
                  "provider": "gmail",
                  "sender_name": "Alex Doe",
                  "default_account": true,
                  "signature": "<p>Best, Alex</p>",
                  "profile_picture_url": "https://www.gravatar.com/avatar/...",
                  "custom_tracking_domain": "track.example.com",
                  "sending_schedule": {
                    "days": [0, 1, 2, 3, 4],
                    "start_time": "09:00",
                    "end_time": "16:59",
                    "time_zone": "UTC"
                  },
                  "warmup": {
                    "enabled": false,
                    "status": null,
                    "end_date": null
                  }
                }
              }

Sequences using an email account Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Returns the sequences that send from a given email account. Read-only. Useful for agents to see which sequences depend on a sending account before adjusting its daily_limit, pausing it, or disconnecting it.

The account is scoped to the ones the requesting user can act on (the same set the email accounts endpoint returns). Requesting an account outside the team returns 404.

api_key required Your secret API key. You can retrieve it in your dashboard.
include_archived optional Set to true to include archived sequences. Archived sequences are excluded by default.
limit optional Page size. Defaults to 20.
offset optional Skip the first N sequences for pagination. Defaults to 0.

Each sequence exposes id, name, status, recipients_allocated (the number of recipients assigned to this account within the sequence), and emails_scheduled (the number of emails still waiting to be sent from this account).

status values: draft, planned, active, paused, and archived.

List sequences using an email account

GET https://api.hunter.io/v2/email-accounts/:email_account_id/sequences?api_key=API_KEY


Response: 200 OK
{
                "data": [
                  {
                    "id": 128,
                    "name": "Q3 outreach",
                    "status": "active",
                    "recipients_allocated": 240,
                    "emails_scheduled": 18
                  }
                ],
                "meta": { "total": 1, "limit": 20, "offset": 0 }
              }

Messages Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Returns the messages sent from your team's sequences, with their delivery and engagement state, the lead they were sent to, the owning sequence, and the user who sent them. Read-only.

Outgoing messages are returned newest first (by id); incoming replies are returned by receipt time, most recent first. Every filter below is optional and combinable: passing several narrows the results to messages matching all of them. Filter values that don't match any of your data return an empty list. By default only outgoing messages are returned; pass direction to include incoming replies.

api_key required Your secret API key. You can retrieve it in your dashboard.
status optional Filter on one or more delivery statuses. Pass a comma-separated list to combine values. Allowed values: pending, error, sent, bounced, opened, clicked, replied, reply, unsubscribed, canceled, successful.
direction optional Restrict to a single direction. Allowed values: outgoing (messages your team sent, the default) or incoming (replies and auto-responses received on your connected accounts).
read optional true or false. Filters on whether the message has been read.
replied optional true or false. Filters on whether the message received a reply.
bounced optional true or false. Filters on whether the message bounced.
unsubscribed optional true or false. Filters on whether the recipient unsubscribed.
out_of_office optional true or false. Filters on out-of-office auto-responses (incoming messages).
lead_id optional Restrict to messages exchanged with a specific lead, matched on the lead's email address.
sequence_id optional Restrict the response to messages from a given sequence (campaign). campaign_id is accepted as an alias.
campaign_id optional Alias of sequence_id, kept for backwards compatibility.
email_account_id optional Restrict to messages on a specific connected email account.
sent_after, sent_before optional Bound the send date (sent_at). Accepts an ISO 8601 timestamp; an unparseable value is ignored.
received_after, received_before optional Bound the receipt date of incoming replies. Like sent_after/sent_before these filter the message timestamp (sent_at), which for an incoming reply is when it was received. Accepts an ISO 8601 timestamp; an unparseable value is ignored.
q optional Full-text search on the message subject and body.
limit optional Page size for the index call. Defaults to 20, maximum 100.
offset optional Skip the first N messages for pagination. Defaults to 0.

Each message exposes id, status, message_id and thread_id (provider-side identifiers used to thread replies), to, subject, body, manually_edited, the engagement counters opens and clicks, the boolean flags bounced and replied, last_activity_at, and sent_at.

Each message also embeds the lead it was sent to (resolved from the sequence recipient when available, otherwise by matching the recipient's email to a lead on the team, so this value may be null for messages whose recipient is no longer in the team's leads), the campaign the message belongs to (or null for one-off messages), and the owner (the user who sent it).

List messages

GET https://api.hunter.io/v2/messages?api_key=API_KEY

Get my free API key

Filter example

GET https://api.hunter.io/v2/messages?status=sent,opened&sequence_id=42&replied=true&api_key=API_KEY


Response: 200 OK
{
                "data": {
                  "messages": [
                    {
                      "id": 1001,
                      "status": "opened",
                      "message_id": "<CAKf...@mail.gmail.com>",
                      "thread_id": "1830abc...",
                      "to": "marcus@example.com",
                      "subject": "Quick question about Example",
                      "body": "Hi Marcus, ...",
                      "manually_edited": false,
                      "opens": 2,
                      "clicks": 0,
                      "bounced": false,
                      "replied": false,
                      "last_activity_at": "2026-05-19T15:11:22Z",
                      "sent_at": "2026-05-18T09:00:00Z",
                      "lead": {
                        "id": 501,
                        "email": "marcus@example.com",
                        "first_name": "Marcus",
                        "last_name": "Doe"
                      },
                      "campaign": {
                        "id": 42,
                        "name": "Spring outreach",
                        "recipients_count": 85,
                        "started": true,
                        "archived": false,
                        "paused": false,
                        "last_email_sent_at": "2026-05-20T08:00:00Z"
                      },
                      "owner": {
                        "id": 7,
                        "email": "alex@example.com"
                      }
                    }
                  ]
                },
                "meta": { "limit": 20, "offset": 0 }
              }

Leads

Saving and managing leads in Hunter can be done entirely through the RESTful API.

Here is the list of the available methods:

All these calls are free.

List all your leads

Returns all the leads already saved in your account. The leads are returned in sorted order, with the most recent leads appearing first.

The leads can be filtered by attributes. Three kind of values can be given:

  • *: select all the leads where the attribute has any value.
  • ~: select all the leads where the attribute is empty.
  • Any other string: select all the leads where the attribute contains the given value.

These filtering options apply for the following attributes: email, first_name, last_name, position, company, industry, website, country_code, company_size, source, twitter, linkedin_url and phone_number.

leads_list_id Only returns the leads belonging to this list.
email Filters the leads by email.
first_name Filters the leads by first name.
last_name Filters the leads by last name.
position Filters the leads by position.
company Filters the leads by company.
industry Filters the leads by industry.
website Filters the leads by website.
country_code Filters the leads by country. The country code is defined in the ISO 3166-1 alpha-2 standard.
company_size Filters the leads by company size.
source Filters the leads by source.
twitter Filters the leads by Twitter handle.
linkedin_url Filters the leads by LinkedIn URL.
phone_number Filters the leads by phone number.
sync_status Only returns the leads matching this synchronization status. It can be one of the following values: pending, error or success.
sending_status[] Only returns the leads matching these sending status(es). It can be some of the following values: clicked, opened, sent, pending, error, bounced, unsubscribed, replied or ~ (unset).
verification_status[] Only returns the leads matching these verification status(es). It can be some of the following values: accept_all, disposable, invalid, unknown, valid, webmail or pending.
last_activity_at Only returns the leads matching this last activity. It can be one of the following values: * (any value) or ~ (unset).
last_contacted_at Only returns the leads matching this last contact date. It can be one of the following values: * (any value) or ~ (unset).
custom_attributes[] Filters the leads by custom attributes. The key of this field must match the slug of the custom attribute you wish to filter on, the value can be * (any value), ~ (unset) or any other string.
query Only returns the leads with first_name, last_name or email matching the query.
limit A limit on the number of leads to be returned. Limit can range between 1 and 1,000. Default is 20.
offset The number of leads to skip. Use this parameter to fetch all the leads. Offset can range between 0 and 100,000.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/leads?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "leads": [
      {
        "id": 1,
        "email": "hoon@stripe.com",
        "first_name": "Jeremy",
        "last_name": "Hoon",
        "position": null,
        "company": "Stripe",
        "company_industry": null,
        "company_size": null,
        "confidence_score": null,
        "website": "stripe.com",
        "country_code": null,
        "source": null,
        "linkedin_url": null,
        "phone_number": null,
        "twitter": null,
        "sync_status": null,
        "notes": null,
        "sending_status": null,
        "last_activity_at": null,
        "last_contacted_at": null,
        "verification": {
          "date": "2021-01-01 12:00:00 UTC",
          "status": "deliverable"
        },
        "leads_list": {
          "id": 1,
          "name": "My leads list",
          "leads_count": 2
        },
        "created_at": "2021-01-01 12:00:00 UTC"
      },
      {
        "id": 2,
        "email": "alexis@reddit.com",
        "first_name": "Alexis",
        "last_name": "Ohanian",
        "position": "Cofounder",
        "company": "Reddit",
        "company_industry": null,
        "company_size": null,
        "confidence_score": 97,
        "website": "reddit.com",
        "country_code": "US",
        "source": null,
        "linkedin_url": null,
        "phone_number": null,
        "twitter": null,
        "sync_status": null,
        "notes": null,
        "sending_status": null,
        "last_activity_at": null,
        "last_contacted_at": null,
        "verification": {
          "date": "2021-01-01 12:00:00 UTC",
          "status": "deliverable"
        },
        "leads_list": {
          "id": 1,
          "name": "My leads list",
          "leads_count": 2
        },
        "created_at": "2021-01-01 12:00:00 UTC"
      }
    }
  },
  "meta": {
    "count": 2,
    "total": 2,
    "params": {
      "limit": 20,
      "offset": 0
    }
  }
}

Get a lead

Retrieves all the fields of a lead.

id required Identifier of the lead.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/leads/1?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "id": 1,
    "email": "hoon@stripe.com",
    "first_name": "Jeremy",
    "last_name": "Hoon",
    "position": null,
    "company": "Stripe",
    "company_industry": null,
    "company_size": null,
    "confidence_score": null,
    "website": "stripe.com",
    "country_code": null,
    "source": null,
    "linkedin_url": null,
    "phone_number": null,
    "twitter": null,
    "sync_status": null,
    "notes": null,
    "sending_status": null,
    "last_activity_at": null,
    "last_contacted_at": null,
    "verification": {
      "date": "2021-01-01 12:00:00 UTC",
      "status": "deliverable"
    },
    "leads_list": {
      "id": 1,
      "name": "My leads list",
      "leads_count": 2
    },
    "created_at": "2021-01-01 12:00:00 UTC"
  }
}

Create a lead

Creates a new lead. The parameters must be passed as a JSON hash.

email required The email address of the lead.
first_name The first name of the leads.
last_name The last name of the lead.
position The job title of the lead.
company The name of the company the lead is working in.
company_industry The sector of the company. It can be any value, but we recommend using one of the following: Animal, Art & Entertainment, Automotive, Beauty & Fitness, Books & Literature, Education & Career, Finance, Food & Drink, Game, Health, Hobby & Leisure, Home & Garden, Industry, Internet & Telecom, Law & Government, Manufacturing, News, Real Estate, Science, Retail, Sport, Technology or Travel.
company_size The size of the company the lead is working in.
confidence_score Estimation of the probability the email address returned is correct, between 0 and 100. In Hunter's products, the confidence score is the score returned by the Email Finder.
website The domain name of the company.
country_code The country of the lead. The country code is defined in the ISO 3166-1 alpha-2 standard.
linkedin_url The address of the public profile on LinkedIn.
phone_number The phone number of the lead.
twitter The Twitter handle of the lead.
notes Some personal notes about the lead.
source The source where the lead has been found.
leads_list_id The identifier of the list the lead belongs to. If it's not specified, the lead is saved in the last list created.
leads_list_ids The identifiers of the lists the lead belongs to. If it's not specified, the lead is saved in the last list created.
custom_attributes[slug] The value of the custom attribute identified by its slug.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/leads?api_key=API_KEY

Get my free API key

Request Body
{
  "email": "alexis@reddit.com",
  "first_name": "Alexis",
  "last_name": "Ohanian",
  "position": "Cofounder",
  "company": "Reddit",
  "company_industry": "Internet & Telecom",
  "company_size": "201-500 employees",
  "confidence_score": 97,
  "website": "reddit.com",
  "custom_attributes": {
    "customer_id": "cus-1234abcd"
  }
}


Response: 201 Created
{
  "data": {
    "id": 3,
    "email": "alexis@reddit.com",
    "first_name": "Alexis",
    "last_name": "Ohanian",
    "position": "Cofounder",
    "company": "Reddit",
    "company_industry": "Internet & Telecom",
    "company_size": "201-500 employees",
    "confidence_score": 97,
    "website": "reddit.com",
    "country_code": null,
    "source": null,
    "linkedin_url": null,
    "phone_number": null,
    "twitter": null,
    "sync_status": null,
    "notes": null,
    "sending_status": null,
    "last_activity_at": null,
    "last_contacted_at": null,
    "verification": {
      "date": null,
      "status": null
    },
    "customer_id": "cus1234-abcd",
    "leads_list": {
      "id": 1,
      "name": "My leads list",
      "leads_count": 3
    },
    "created_at": "2021-01-01 12:00:00 UTC"
  }
}

Create or update a lead

Creates a new lead if it doesn't exist yet based on email address, or updates it if it does. The updated values must be passed as a JSON hash.

The fields you can update are the same params you can give when you create a lead.

When the lead already exists, custom attributes are updated as a partial merge: any field omitted from the payload is left unchanged. To clear a custom attribute, send it with an empty string (for example "custom_attributes": { "municipio": "" } ).

HTTP request example

PUT https://api.hunter.io/v2/leads?api_key=API_KEY

Get my free API key

Request Body
{
  "email": "alexis@reddit.com",
  "first_name": "Alexis",
  "last_name": "Ohanian"
}


Response: 201 Created when resource is created, 200 OK when resource is updated
{
  "data": {
    "id": 3,
    "email": "alexis@reddit.com",
    "first_name": "Alexis",
    "last_name": "Ohanian",
    "position": "Cofounder",
    "company": "Reddit",
    "company_industry": "Internet & Telecom",
    "company_size": "201-500 employees",
    "confidence_score": 97,
    "website": "reddit.com",
    "country_code": null,
    "source": null,
    "linkedin_url": null,
    "phone_number": null,
    "twitter": null,
    "sync_status": null,
    "notes": null,
    "sending_status": null,
    "last_activity_at": null,
    "last_contacted_at": null,
    "verification": {
      "date": null,
      "status": null
    },
    "customer_id": "cus1234-abcd",
    "leads_list": {
      "id": 1,
      "name": "My leads list",
      "leads_count": 3
    },
    "created_at": "2021-01-01 12:00:00 UTC"
  }
}

Update a lead

Updates an existing lead. The updated values must be passed as a JSON hash.

The fields you can update are the same params you can give when you create a lead.

Custom attributes are updated as a partial merge: any field omitted from the payload is left unchanged. To update a single custom attribute, send only that key under custom_attributes . To clear a custom attribute, send it with an empty string (for example "custom_attributes": { "municipio": "" } ).

HTTP request example

PUT https://api.hunter.io/v2/leads/1?api_key=API_KEY

Get my free API key

Request Body
{
  "company": "Facebook"
}


Response: 204 No Content

Delete a lead

Deletes an existing lead.

id required Identifier of the lead.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/leads/1?api_key=API_KEY

Get my free API key

Response: 204 No Content

Lead tags Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Manage the tags used to organize your leads and attach them to individual leads through the RESTful API. Tags are shared across your team and are the same labels you manage from the Leads table in the Hunter web app.

Here is the list of the available methods:

All these calls are free.

List all your lead tags

Returns all the lead tags in your team. The tags are returned in sorted order, with the most recent tags appearing first.

limit A limit on the number of tags to be returned. Limit can range between 1 and 100 tags. Default is 25.
offset The number of tags to skip. Use this parameter to fetch all the tags.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/tags?api_key=API_KEY


Response: 200 OK
{
  "data": {
    "tags": [
      {
        "id": 1,
        "name": "Prospect",
        "color": "3489F9",
        "created_at": "2026-05-26 12:00:00 UTC"
      },
      {
        "id": 2,
        "name": "Important",
        "color": "10B981",
        "created_at": "2026-05-26 12:00:01 UTC"
      }
    ]
  },
  "meta": {
    "total": 2,
    "params": { "limit": 25, "offset": 0 }
  }
}

Get a lead tag

Retrieves all the fields of a lead tag.

id required Identifier of the lead tag.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/tags/1?api_key=API_KEY


Response: 200 OK
{
  "data": {
    "id": 1,
    "name": "Prospect",
    "color": "3489F9",
    "created_at": "2026-05-26 12:00:00 UTC"
  }
}

Create a lead tag

Creates a new lead tag. The parameters must be passed as a JSON hash.

name required The name of the tag. Must be unique within your team.
color A hex color (without the leading #), for example 3489F9. Must be one of the supported palette values. Defaults to a random palette color when omitted.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/tags?api_key=API_KEY


Request Body
{
  "name": "Prospect",
  "color": "3489F9"
}

Response: 201 Created
{
  "data": {
    "id": 3,
    "name": "Prospect",
    "color": "3489F9",
    "created_at": "2026-05-26 12:00:00 UTC"
  }
}

Update a lead tag

Updates an existing lead tag. The updated values must be passed as a JSON hash.

id required Identifier of the lead tag.
name The new name of the tag.
color The new hex color of the tag (without the leading #).
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

PUT https://api.hunter.io/v2/tags/1?api_key=API_KEY


Request Body
{
  "name": "Hot prospect",
  "color": "10B981"
}

Response: 200 OK
{
  "data": {
    "id": 1,
    "name": "Hot prospect",
    "color": "10B981",
    "created_at": "2026-05-26 12:00:00 UTC"
  }
}

Delete a lead tag

Deletes an existing lead tag. The tag is also removed from any lead it was attached to.

id required Identifier of the lead tag.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/tags/1?api_key=API_KEY


Response: 204 No Content

A successful delete returns an empty body.

Attach a tag to a lead

Adds an existing tag to one of your leads. The call is idempotent: attaching a tag the lead already has does nothing and still returns the lead's current tags.

id required Identifier of the lead.
tag_id required Identifier of an existing tag belonging to your team.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/leads/1/tags?api_key=API_KEY


Response: 201 Created
{
                  "data": {
                    "tags": [
                      {
                        "id": 42,
                        "name": "Priority",
                        "color": "EF4444"
                      }
                    ]
                  },
                  "meta": {
                    "params": { "id": "1", "tag_id": "42" }
                  }
                }

Detach a tag from a lead

Removes a tag from a lead. The tag itself is kept on your team and stays attached to any other leads. Detaching a tag the lead does not have is a no-op and still returns a successful response.

id required Identifier of the lead.
tag_id required Identifier of the tag to remove from the lead.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/leads/1/tags/42?api_key=API_KEY


Response: 204 No Content

A successful detach returns an empty body.

Custom Attributes

Saving and managing your custom attributes in Hunter can be done entirely through the RESTful API.

Here is the list of the available methods:

All these calls are free.

List all your custom attributes

Returns all the custom attributes already saved in your account. The custom attributes are returned in sorted order, with the most recent custom attributes appearing first.

api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/leads_custom_attributes?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "leads_custom_attributes": [
      {
        "id": 2,
        "label": "Customer ID",
        "slug": "customer_id"
      },
      {
        "id": 1,
        "label": "Campaign ID",
        "slug": "campaign_id"
      }
    ]
  },
  "meta": {
    "total": 2,
  }
}

Get a custom attribute

Retrieves all the fields of a custom attribute.

id required Identifier of the custom attribute.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/leads_custom_attributes/1?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "id": 1,
    "label": "Campaign ID",
    "slug": "campaign_id"
  }
}

Create a custom attribute

Creates a new custom attribute. The parameters must be passed as a JSON hash.

label required The name, or label, of your custom attribute. Has to be unique.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/leads_custom_attributes?api_key=API_KEY

Get my free API key

Request Body
{
  "label": "Campaign ID"
}


Response: 201 Created
{
  "data": {
    "id": 1,
    "label": "Campaign ID",
    "slug": "campaign_id"
  }
}

Update a custom attribute

Updates an existing custom attribute. The updated values must be passed as a JSON hash.

The fields you can update are the same params you can give when you create a custom attribute.

HTTP request example

PUT https://api.hunter.io/v2/leads_custom_attributes/1?api_key=API_KEY

Get my free API key

Request Body
{
  "label": "Outreach Campaign ID"
}


Response: 204 No Content

Delete a custom attribute

Deletes an existing custom attribute.

id required Identifier of the custom attribute.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/leads_custom_attributes/1?api_key=API_KEY

Get my free API key

Response: 204 No Content

Leads Lists

Saving and managing leads lists in Hunter can be done entirely through the RESTful API.

Here is the list of the available methods:

All these calls are free.

List all your leads lists

Returns all the leads lists already saved in your account. The leads lists are returned in sorted order, with the most recent leads lists appearing first.

limit A limit on the number of lists to be returned. Limit can range between 1 and 100 lists. Default is 20.
offset The number of lists to skip. Use this parameter to fetch all the lists.
api_key required Your secret API key. You can generate it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/leads_lists?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "leads_lists": [
      {
        "id": 1,
        "name": "My first list",
        "leads_count": 10,
        "created_at": "2021-01-01 12:00:00 UTC"
      },
      {
        "id": 2,
        "name": "My second list",
        "leads_count": 1,
        "created_at": "2021-01-01 12:00:01 UTC"
      },
    }
  },
  "meta": {
    "total": 2,
    "params": {
      "limit": 20,
      "offset": 0
    }
  }
}

Get a leads list

Retrieves all the fields of a leads list.

id required Identifier of the leads list.
limit A limit on the number of leads to be returned. Limit can range between 1 and 100 lists. Default is 20.
offset The number of leads to skip. Use this parameter to fetch all the leads in the list.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/leads_lists/1?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "id": 1,
    "name": "My leads",
    "leads_count": 10,
    "created_at": "2021-01-01 12:00:00 UTC",
    "leads": [
      {
        "id": 1,
        "first_name": "Jeremy",
        "last_name": "Hoon",
        "position": null,
        "company": "Stripe",
        "company_industry": null,
        "company_size": null,
        "email": "hoon@stripe.com",
        "confidence_score": null,
        "website": "https://stripe.com",
        "country_code": null,
        "source": null,
        "linkedin_url": null,
        "phone_number": null,
        "twitter": null,
        "sync_status": null,
        "notes": null,
        "sending_status": null,
        "last_activity_at": null,
        "last_contacted_at": null,
        "verification": {
          "date": "2021-01-01 12:00:00 UTC",
          "status": "deliverable"
        },
        "leads_list_id": 1,
        "created_at": "2021-01-01 12:00:00 UTC"
      },
      ...
    ]
  },
  "meta": {
    "params": {
      "limit": 20,
      "offset": 0,
      "leads_list_id": 1
    }
  }
}

Create a leads list

Creates a new leads list. The parameters must be passed as a JSON hash.

name required The name of the leads list.
leads_list_folder_id optional The ID of the folder to place the new list in. Omit it to leave the list unfiled.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/leads_lists?api_key=API_KEY

Get my free API key

Request Body
{
  "name": "My new leads list",
}


Response: 201 Created
{
  "data": {
    "id": 3,
    "name": "My new leads list",
    "leads_count": 0,
    "created_at": "2021-01-01 12:00:00 UTC"
  }
}

Update a leads list

Updates an existing leads list. The updated values must be passed as a JSON hash.

name required The name of the leads list.
leads_list_folder_id optional The ID of the folder to move the list to. Pass null to remove the list from its folder.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

PUT https://api.hunter.io/v2/leads_lists/1?api_key=API_KEY

Get my free API key

Request Body
{
  "name": "New leads list name"
}


Response: 204 No Content

Delete a leads list

Deletes an existing leads list.

id required Identifier of the leads list.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/leads_lists/1?api_key=API_KEY

Get my free API key

Response: 204 No Content

Leads list folders Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Organize leads lists into folders. A folder has a name and a color, and groups any number of leads lists belonging to the same team. Folders are surfaced in the sidebar of the Hunter web app and referenced by leads lists through their leads_list_folder_id field.

Here is the list of the available methods:

All these calls are free.

List all your folders

Returns every folder on your team, sorted by id descending (most recent first). Each folder embeds leads_lists_count, the number of leads lists currently in it.

api_key required Your secret API key. You can retrieve it in your dashboard.
limit optional Page size for the index call. Defaults to 20, maximum 100.
offset optional Skip the first N folders for pagination. Defaults to 0.
HTTP request example

GET https://api.hunter.io/v2/leads_lists/folders?api_key=API_KEY

Get my free API key

Response: 200 OK
{
                  "data": {
                    "folders": [
                      {
                        "id": 1,
                        "name": "Q2 prospects",
                        "color": "374151",
                        "leads_lists_count": 4,
                        "created_at": "2026-04-12T10:15:00Z"
                      }
                    ]
                  },
                  "meta": {
                    "total": 1,
                    "params": { "limit": 20, "offset": 0 }
                  }
                }

Retrieve one of your folders

Returns one folder by id.

id required Identifier of the folder.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/leads_lists/folders/1?api_key=API_KEY


Response: 200 OK
{
                  "data": {
                    "id": 1,
                    "name": "Q2 prospects",
                    "color": "374151",
                    "leads_lists_count": 4,
                    "created_at": "2026-04-12T10:15:00Z"
                  }
                }

Create a new folder

Creates a new folder on the requesting user's team.

name required Display name of the folder.
color required Color of the folder shown in the web app sidebar. Must be one of the supported hex values: 374151, 3489F9, 10B981, F5BA0B, EF4444, 7C3AED, F97316, E5E7EB, B4D9F7, BAE6B0, FDE68A, FBD0D0, D4C4F8, FFD79B.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/leads_lists/folders?api_key=API_KEY


Response: 201 Created
{
                  "data": {
                    "id": 1,
                    "name": "Q2 prospects",
                    "color": "374151",
                    "leads_lists_count": 0,
                    "created_at": "2026-04-12T10:15:00Z"
                  }
                }

Update an existing folder

Updates the name or color of an existing folder.

id required Identifier of the folder.
name optional New display name.
color optional New color. Must be one of the supported hex values (see Create a new folder).
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

PUT https://api.hunter.io/v2/leads_lists/folders/1?api_key=API_KEY


Response: 204 No Content

Delete a folder

Deletes an existing folder. Leads lists that were in the folder are not deleted; their leads_list_folder_id is reset to null.

id required Identifier of the folder.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/leads_lists/folders/1?api_key=API_KEY


Response: 204 No Content

Bulk lead operations Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Move or delete many leads in a single call. These endpoints select leads either by an explicit list of identifiers or by a list, then apply the operation in the background for large selections.

Here is the list of the available methods:

All these calls are free.

Move leads between lists

Moves leads from a source list to a destination list. The leads are added to the destination list and removed from the source list. Both lists must be static lists that belong to your team.

The move is processed in the background, so the response confirms the number of leads that matched the selection and were scheduled.

leads_list_id required Identifier of the source list. The leads are removed from this list.
target_leads_list_id required Identifier of the destination list. The leads are added to this list.
lead_ids An optional array of lead identifiers. When provided, only these leads, among those in the source list, are moved. When omitted, every lead in the source list is moved.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/leads/bulk/move?api_key=API_KEY

Get my free API key

Request Body
{
  "leads_list_id": 10,
  "target_leads_list_id": 22,
  "lead_ids": [1, 2, 3]
}


Response: 202 Accepted
{
  "data": {
    "source_leads_list_id": 10,
    "target_leads_list_id": 22,
    "leads_count": 3,
    "status": "queued"
  },
  "meta": {
    "params": {
      "leads_list_id": 10,
      "target_leads_list_id": 22,
      "lead_ids": [1, 2, 3]
    }
  }
}

Delete leads in bulk

Permanently deletes leads from your account. The leads to delete are selected by an explicit list of identifiers, by a list, or by both.

Selections of 10 leads or fewer are deleted immediately and the response returns the number of deleted leads. Larger selections are processed in the background and the response confirms how many leads were scheduled for deletion.

lead_ids An array of lead identifiers to delete. Required unless leads_list_id is provided.
leads_list_id Identifier of a list. Every lead in the list is deleted. Required unless lead_ids is provided.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/leads/bulk/delete?api_key=API_KEY

Get my free API key

Request Body
{
  "lead_ids": [1, 2, 3]
}


Response: 200 OK
{
  "data": {
    "requested_count": 3,
    "deleted_count": 3,
    "status": "completed"
  },
  "meta": {
    "params": {
      "lead_ids": [1, 2, 3],
      "leads_list_id": null
    }
  }
}


Response: 202 Accepted (large selection)
{
  "data": {
    "requested_count": 150,
    "status": "queued"
  },
  "meta": {
    "params": {
      "lead_ids": null,
      "leads_list_id": 10
    }
  }
}

Companies Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Track companies in Hunter Leads through the RESTful API. A company is identified by a domain and is scoped to your team.

Here is the list of the available methods:

All these calls are free.

List all your companies

Returns all the companies tracked in your team. The companies are returned in sorted order, with the most recent companies appearing first.

limit A limit on the number of companies to be returned. Limit can range between 1 and 100 companies. Default is 20.
offset The number of companies to skip. Use this parameter to fetch all the companies.
api_key required Your secret API key. You can generate it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/companies?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "companies": [
      {
        "id": 1,
        "domain": "stripe.com",
        "leads_count": 12,
        "created_at": "2026-05-26 12:00:00 UTC"
      },
      {
        "id": 2,
        "domain": "intercom.com",
        "leads_count": 4,
        "created_at": "2026-05-26 12:00:01 UTC"
      }
    ]
  },
  "meta": {
    "total": 2,
    "params": {
      "limit": 20,
      "offset": 0
    }
  }
}

Get a company

Retrieves all the fields of a company.

id required Identifier of the company.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/companies/1?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "id": 1,
    "domain": "stripe.com",
    "leads_count": 12,
    "created_at": "2026-05-26 12:00:00 UTC"
  },
  "meta": {
    "params": {
      "id": 1
    }
  }
}

Create a company

Creates a new company from a domain name. If a company already exists for this domain in your team, it is returned as-is and no new record is created.

domain required The domain name of the company to track, for example stripe.com. The domain must be a valid domain name and must already exist in our database.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/companies?api_key=API_KEY

Get my free API key

Request Body
{
  "domain": "stripe.com"
}


Response: 201 Created
{
  "data": {
    "id": 3,
    "domain": "stripe.com",
    "leads_count": 0,
    "created_at": "2026-05-26 12:00:00 UTC"
  },
  "meta": {
    "params": {
      "domain": "stripe.com"
    }
  }
}

Delete a company

Deletes an existing company. Any tag assignments on this company are also removed; tags themselves are not deleted.

id required Identifier of the company.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/companies/1?api_key=API_KEY

Get my free API key

Response: 204 No Content

Company Lists Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Saving and managing company lists in Hunter can be done entirely through the RESTful API. Company lists can be either static (manually curated) or dynamic (auto-populated from saved filters).

Here is the list of the available methods:

All these calls are free.

List all your company lists

Returns all the company lists already saved in your account. The company lists are returned in sorted order, with the most recent company lists appearing first.

limit A limit on the number of lists to be returned. Limit can range between 1 and 1000 lists. Default is 20.
offset The number of lists to skip. Use this parameter to fetch all the lists.
api_key required Your secret API key. You can generate it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/company-lists?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "company_lists": [
      {
        "id": 1,
        "name": "My static list",
        "type": "static",
        "company_list_folder_id": null,
        "created_at": "2026-03-18T19:00:00Z"
      },
      {
        "id": 2,
        "name": "My dynamic list",
        "type": "dynamic",
        "filters": {
          "company_name": "Acme"
        },
        "company_list_folder_id": 1,
        "created_at": "2026-03-18T19:00:01Z"
      }
    ]
  },
  "meta": {
    "total": 2,
    "params": {
      "limit": 20,
      "offset": 0
    }
  }
}

Get a company list

Retrieves all the fields of a company list, including the count of companies it contains.

id required Identifier of the company list.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/company-lists/1?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "id": 1,
    "name": "My static list",
    "type": "static",
    "companies_count": 10,
    "company_list_folder_id": null,
    "created_at": "2026-03-18T19:00:00Z"
  }
}

Create a company list

Creates a new company list. The parameters must be passed as a JSON hash. To create a dynamic list, set type to "dynamic" and provide filters.

name required The name of the company list.
type The type of the list. Either "static" (default) or "dynamic".
filters The filters used to populate a dynamic list. Required when type is "dynamic".
company_list_folder_id Optional identifier of the folder this list belongs to.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/company-lists?api_key=API_KEY

Get my free API key

Request Body (static)
{
  "name": "My new company list"
}


Request Body (dynamic)
{
  "name": "My dynamic list",
  "type": "dynamic",
  "filters": {
    "company_name": "Acme"
  }
}


Response: 201 Created
{
  "data": {
    "id": 3,
    "name": "My new company list",
    "type": "static",
    "companies_count": 0,
    "company_list_folder_id": null,
    "created_at": "2026-03-18T19:00:00Z"
  }
}

Update a company list

Updates an existing company list. The updated values must be passed as a JSON hash. For dynamic lists, filters can also be updated.

id required Identifier of the company list.
name The name of the company list.
filters The filters of a dynamic list. Ignored for static lists.
company_list_folder_id Identifier of the folder this list belongs to.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

PUT https://api.hunter.io/v2/company-lists/1?api_key=API_KEY

Get my free API key

Request Body
{
  "name": "New company list name"
}


Response: 204 No Content

Delete a company list

Deletes an existing company list. Static lists with companies are deleted asynchronously and return 202 Accepted ; otherwise the response is 204 No Content.

id required Identifier of the company list.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/company-lists/1?api_key=API_KEY

Get my free API key

Response: 204 No Content

Company list folders Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Organize company lists into folders. A folder has a name and a color, and groups any number of company lists belonging to the same team. Folders are surfaced in the sidebar of the Hunter web app and referenced by company lists through their company_list_folder_id field.

Here is the list of the available methods:

All these calls are free.

List all your folders

Returns every folder on your team, sorted by id descending (most recent first). Each folder embeds company_lists_count, the number of company lists currently in it.

api_key required Your secret API key. You can retrieve it in your dashboard.
limit optional Page size for the index call. Defaults to 20, maximum 100.
offset optional Skip the first N folders for pagination. Defaults to 0.
HTTP request example

GET https://api.hunter.io/v2/company-lists/folders?api_key=API_KEY

Get my free API key

Response: 200 OK
{
                  "data": {
                    "folders": [
                      {
                        "id": 1,
                        "name": "Q2 prospects",
                        "color": "blue",
                        "company_lists_count": 4,
                        "created_at": "2026-04-12T10:15:00Z"
                      }
                    ]
                  },
                  "meta": {
                    "total": 1,
                    "params": { "limit": 20, "offset": 0 }
                  }
                }

Retrieve one of your folders

Returns one folder by id.

id required Identifier of the folder.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/company-lists/folders/1?api_key=API_KEY


Response: 200 OK
{
                  "data": {
                    "id": 1,
                    "name": "Q2 prospects",
                    "color": "blue",
                    "company_lists_count": 4,
                    "created_at": "2026-04-12T10:15:00Z"
                  }
                }

Create a new folder

Creates a new folder on the requesting user's team.

name required Display name of the folder.
color optional Color label shown in the web app sidebar.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/company-lists/folders?api_key=API_KEY


Response: 201 Created
{
                  "data": {
                    "id": 1,
                    "name": "Q2 prospects",
                    "color": "blue",
                    "company_lists_count": 0,
                    "created_at": "2026-04-12T10:15:00Z"
                  }
                }

Update an existing folder

Updates the name or color of an existing folder.

id required Identifier of the folder.
name optional New display name.
color optional New color label.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

PUT https://api.hunter.io/v2/company-lists/folders/1?api_key=API_KEY


Response: 204 No Content

Delete a folder

Deletes an existing folder. Company lists that were in the folder are not deleted — their company_list_folder_id is reset to null.

id required Identifier of the folder.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/company-lists/folders/1?api_key=API_KEY


Response: 204 No Content

Companies in a company list Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Add or remove a company in a static company list. Only static lists are supported — dynamic lists are populated automatically from their saved filters and cannot be edited this way.

Here is the list of the available methods:

All these calls are free.

Add a company to a list

Adds an existing company to a static company list. The company must already exist on your team — typically because it was created from a lead via the leads endpoints.

Returns 404 when the list or company is missing or belongs to another team, and 400 when company_id is not provided.

company_list_id required Identifier of the static company list to add to.
company_id required Identifier of the company to add.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/company-lists/1/companies?api_key=API_KEY


Response: 201 Created
{
                  "data": {
                    "id": 84,
                    "domain": "example.com",
                    "created_at": "2026-05-20T09:00:00Z"
                  }
                }

Remove a company from a list

Removes a company from a static company list. The company itself is not deleted — only its membership in the list. Returns 404 when the company is not in the list.

company_list_id required Identifier of the static company list.
id required Identifier of the company to remove.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/company-lists/1/companies/84?api_key=API_KEY


Response: 204 No Content

Company Tags Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Manage company-level tags and apply them to companies in Hunter Leads through the RESTful API.

Here is the list of the available methods:

All these calls are free.

List all your company tags

Returns all the company tags in your team. The tags are returned in sorted order, with the most recent tags appearing first.

limit A limit on the number of tags to be returned. Limit can range between 1 and 100 tags. Default is 25.
offset The number of tags to skip. Use this parameter to fetch all the tags.
api_key required Your secret API key. You can generate it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/company-tags?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "company_tags": [
      {
        "id": 1,
        "name": "Partner",
        "color": "3489F9",
        "created_at": "2026-05-26 12:00:00 UTC"
      },
      {
        "id": 2,
        "name": "VIP",
        "color": "10B981",
        "created_at": "2026-05-26 12:00:01 UTC"
      }
    ]
  },
  "meta": {
    "total": 2,
    "params": {
      "limit": 25,
      "offset": 0
    }
  }
}

Get a company tag

Retrieves all the fields of a company tag.

id required Identifier of the company tag.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/company-tags/1?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "id": 1,
    "name": "Partner",
    "color": "3489F9",
    "created_at": "2026-05-26 12:00:00 UTC"
  }
}

Create a company tag

Creates a new company tag. The parameters must be passed as a JSON hash.

name required The name of the tag. Must be unique within your team.
color A hex color (without the leading #), for example 3489F9. Must be one of the supported palette values. Defaults to a random palette color when omitted.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/company-tags?api_key=API_KEY

Get my free API key

Request Body
{
  "name": "Partner",
  "color": "3489F9"
}


Response: 201 Created
{
  "data": {
    "id": 3,
    "name": "Partner",
    "color": "3489F9",
    "created_at": "2026-05-26 12:00:00 UTC"
  }
}

Update a company tag

Updates an existing company tag. The updated values must be passed as a JSON hash.

id required Identifier of the company tag.
name The new name of the tag.
color The new hex color of the tag (without the leading #).
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

PUT https://api.hunter.io/v2/company-tags/1?api_key=API_KEY

Get my free API key

Request Body
{
  "name": "Strategic Partner",
  "color": "10B981"
}


Response: 200 OK
{
  "data": {
    "id": 1,
    "name": "Strategic Partner",
    "color": "10B981",
    "created_at": "2026-05-26 12:00:00 UTC"
  }
}

Delete a company tag

Deletes an existing company tag. The tag is also removed from any company it was assigned to.

id required Identifier of the company tag.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/company-tags/1?api_key=API_KEY

Get my free API key

Response: 204 No Content

Assign a tag to a company

Assigns a tag to a company. You can either pass tag_id for an existing tag or tag_name to create the tag on the fly if it does not exist yet. New tags created this way get a random color from the default palette.

company_id required Identifier of the company. Passed in the URL.
tag_id Identifier of an existing tag to assign. Required when tag_name is not provided.
tag_name Name of the tag to assign. If a tag with this name does not exist in your team, it will be created. Required when tag_id is not provided.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/companies/1/tags?api_key=API_KEY

Get my free API key

Request Body
{
  "tag_name": "Partner"
}


Response: 201 Created
{
  "data": {
    "id": 1,
    "name": "Partner",
    "color": "3489F9",
    "created_at": "2026-05-26 12:00:00 UTC"
  }
}

Remove a tag from a company

Removes a tag from a company. The tag itself is not deleted and remains available for other companies. Returns 204 No Content when the tag exists in the team, whether or not it was already assigned to this company. Returns 404 Not Found when the tag_id doesn't exist in the team.

company_id required Identifier of the company. Passed in the URL.
tag_id required Identifier of the tag to remove. Passed in the URL.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/companies/1/tags/1?api_key=API_KEY

Get my free API key

Response: 204 No Content

Bulk company operations Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Move, copy, delete, or tag many companies in a single call. These endpoints select companies either by an explicit list of identifiers or by a company list, then apply the operation in the background for large selections.

Here is the list of the available methods:

All these calls are free.

Move companies between lists

Moves companies from a source list to a destination list. The companies are added to the destination list and removed from the source list. Both lists must be static lists that belong to your team.

The move is processed in the background, so the response confirms the number of companies that matched the selection and were scheduled.

company_list_id required Identifier of the source list. The companies are removed from this list.
target_company_list_id required Identifier of the destination list. The companies are added to this list.
company_ids An optional array of company identifiers. When provided, only these companies, among those in the source list, are moved. When omitted, every company in the source list is moved.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/companies/bulk/move?api_key=API_KEY


Request Body
{
                  "company_list_id": 10,
                  "target_company_list_id": 22,
                  "company_ids": [1, 2, 3]
                }

Response: 202 Accepted
{
                  "data": {
                    "source_company_list_id": 10,
                    "target_company_list_id": 22,
                    "companies_count": 3,
                    "status": "queued"
                  },
                  "meta": {
                    "params": {
                      "company_list_id": 10,
                      "target_company_list_id": 22,
                      "company_ids": [1, 2, 3]
                    }
                  }
                }

Copy companies to a list

Copies companies into a destination list, leaving the source selection untouched. The destination must be a static list. The companies to copy are selected by an explicit list of identifiers, by a source list, or by both.

target_company_list_id required Identifier of the destination static list. The companies are added to this list.
company_ids An array of company identifiers to copy. Required unless company_list_id is provided.
company_list_id Identifier of a source list. Every company in the list is copied. Required unless company_ids is provided.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/companies/bulk/copy?api_key=API_KEY


Request Body
{
                  "company_list_id": 10,
                  "target_company_list_id": 22
                }

Response: 202 Accepted
{
                  "data": {
                    "target_company_list_id": 22,
                    "companies_count": 3,
                    "status": "queued"
                  },
                  "meta": {
                    "params": {
                      "company_list_id": 10,
                      "target_company_list_id": 22,
                      "company_ids": null
                    }
                  }
                }

Delete companies in bulk

Permanently deletes companies from your account. The companies to delete are selected by an explicit list of identifiers, by a list, or by both.

Selections of 10 companies or fewer are deleted immediately and the response returns the number of deleted companies. Larger selections are processed in the background and the response confirms how many companies were scheduled for deletion.

company_ids An array of company identifiers to delete. Required unless company_list_id is provided.
company_list_id Identifier of a list. Every company in the list is deleted. Required unless company_ids is provided.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/companies/bulk/delete?api_key=API_KEY


Request Body
{
                  "company_ids": [1, 2, 3]
                }

Response: 200 OK
{
                  "data": {
                    "requested_count": 3,
                    "deleted_count": 3,
                    "status": "completed"
                  },
                  "meta": {
                    "params": {
                      "company_ids": [1, 2, 3],
                      "company_list_id": null
                    }
                  }
                }

Response: 202 Accepted (large selection)
{
                  "data": {
                    "requested_count": 150,
                    "status": "queued"
                  },
                  "meta": {
                    "params": {
                      "company_ids": null,
                      "company_list_id": 10
                    }
                  }
                }

Tag companies in bulk

Applies a single tag to every company matching the selection. The tag is referenced by its identifier, or created on the fly from a name. The tagging is processed in the background.

company_ids An array of company identifiers to tag. Required unless company_list_id is provided.
company_list_id Identifier of a list. Every company in the list is tagged. Required unless company_ids is provided.
tag_id Identifier of an existing company tag. Required unless tag_name is provided.
tag_name Name of the tag to apply. When no tag with this name exists, it is created. Required unless tag_id is provided.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/companies/bulk/tag?api_key=API_KEY


Request Body
{
                  "company_list_id": 10,
                  "tag_name": "Prospects"
                }

Response: 202 Accepted
{
                  "data": {
                    "tag": {
                      "id": 42,
                      "name": "Prospects",
                      "color": "blue"
                    },
                    "companies_count": 3,
                    "status": "queued"
                  },
                  "meta": {
                    "params": {
                      "company_ids": null,
                      "company_list_id": 10,
                      "tag_id": null,
                      "tag_name": "Prospects"
                    }
                  }
                }

Templates Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Manage reusable email templates through the API. Templates can be referenced from follow-up creation in Sequences to pre-fill the subject, body, and message format.

Here is the list of the available methods:

All these calls are free.

List all your templates

Returns all the templates in your team. The templates are returned in sorted order, with the most recent templates appearing first.

limit A limit on the number of templates to be returned. Limit can range between 1 and 100 templates. Default is 25.
offset The number of templates to skip. Use this parameter to fetch all the templates.
api_key required Your secret API key. You can generate it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/message-templates?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "message_templates": [
      {
        "id": 1,
        "name": "Intro email",
        "subject": "Hi {{first_name|fallback:\"there\"}}",
        "body": "Hi {{first_name|fallback:\"there\"}}, ...",
        "message_format": "html",
        "created_at": "2026-05-26 12:00:00 UTC",
        "updated_at": "2026-05-26 12:00:00 UTC"
      },
      {
        "id": 2,
        "name": "Follow-up",
        "subject": "Following up",
        "body": "Just checking in...",
        "message_format": "text",
        "created_at": "2026-05-26 12:00:01 UTC",
        "updated_at": "2026-05-26 12:00:01 UTC"
      }
    ]
  },
  "meta": {
    "total": 2,
    "params": {
      "limit": 25,
      "offset": 0
    }
  }
}

Get a template

Retrieves all the fields of a template.

id required Identifier of the template.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/message-templates/1?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "id": 1,
    "name": "Intro email",
    "subject": "Hi {{first_name|fallback:\"there\"}}",
    "body": "Hi {{first_name|fallback:\"there\"}}, ...",
    "message_format": "html",
    "created_at": "2026-05-26 12:00:00 UTC",
    "updated_at": "2026-05-26 12:00:00 UTC"
  }
}

Create a template

Creates a new template. The parameters must be passed as a JSON hash. Any merge tags used in the subject or body must include a fallback value, for example {{first_name|fallback:"there"}}.

name required The name of the template.
subject The email subject. Limited to 255 characters.
body required The body of the email. Can include merge tags with fallback values.
message_format The format of the email body. Must be html or text. Defaults to html.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/message-templates?api_key=API_KEY

Get my free API key

Request Body
{
  "name": "Intro email",
  "subject": "Hi {{first_name|fallback:\"there\"}}",
  "body": "Hi {{first_name|fallback:\"there\"}}, ...",
  "message_format": "html"
}


Response: 201 Created
{
  "data": {
    "id": 3,
    "name": "Intro email",
    "subject": "Hi {{first_name|fallback:\"there\"}}",
    "body": "Hi {{first_name|fallback:\"there\"}}, ...",
    "message_format": "html",
    "created_at": "2026-05-26 12:00:00 UTC",
    "updated_at": "2026-05-26 12:00:00 UTC"
  }
}

Update a template

Updates an existing template. The updated values must be passed as a JSON hash.

id required Identifier of the template.
name The new name of the template.
subject The new email subject.
body The new body of the email.
message_format The new format of the email body. Must be html or text.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

PUT https://api.hunter.io/v2/message-templates/1?api_key=API_KEY

Get my free API key

Request Body
{
  "name": "Updated intro",
  "subject": "Hi {{first_name|fallback:\"there\"}}",
  "body": "Updated copy..."
}


Response: 200 OK
{
  "data": {
    "id": 1,
    "name": "Updated intro",
    "subject": "Hi {{first_name|fallback:\"there\"}}",
    "body": "Updated copy...",
    "message_format": "html",
    "created_at": "2026-05-26 12:00:00 UTC",
    "updated_at": "2026-05-26 12:30:00 UTC"
  }
}

Delete a template

Deletes an existing template.

id required Identifier of the template.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/message-templates/1?api_key=API_KEY

Get my free API key

Response: 204 No Content

Discover saved searches Beta

This endpoint is in Beta. It’s fully functional, but its parameters and response format may still change as we refine it, so expect occasional breaking changes during the Beta period.

Save and retrieve Discover filter configurations so you can reuse them later. Saved searches are scoped to the API key's user.

Here is the list of the available methods:

All these calls are free.

List all your saved searches

Returns all your Discover saved searches, with the most recent ones appearing first.

limit A limit on the number of saved searches to be returned. Limit can range between 1 and 100. Default is 25.
offset The number of saved searches to skip. Use this parameter to fetch all your saved searches.
api_key required Your secret API key. You can generate it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/discover/views?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "views": [
      {
        "id": 1,
        "name": "Recent US SaaS",
        "filters": {
          "location_country_included": ["US"],
          "industry_included": ["saas"]
        },
        "created_at": "2026-05-26 12:00:00 UTC",
        "updated_at": "2026-05-26 12:00:00 UTC"
      }
    ]
  },
  "meta": {
    "total": 1,
    "params": {
      "limit": 25,
      "offset": 0
    }
  }
}

Get a saved search

Retrieves all the fields of one of your saved searches.

id required Identifier of the saved search.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/discover/views/1?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "id": 1,
    "name": "Recent US SaaS",
    "filters": {
      "location_country_included": ["US"],
      "industry_included": ["saas"]
    },
    "created_at": "2026-05-26 12:00:00 UTC",
    "updated_at": "2026-05-26 12:00:00 UTC"
  }
}

Save a new search

Saves a new Discover search. The parameters must be passed as a JSON hash.

name required The name of the saved search. Must be unique within your team.
filters A JSON object describing the Discover filters to save. Each key is a filter name and each value is an array of selected options. Defaults to an empty object when omitted.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/discover/views?api_key=API_KEY

Get my free API key

Request Body
{
  "name": "Recent US SaaS",
  "filters": {
    "location_country_included": ["US"],
    "industry_included": ["saas"]
  }
}


Response: 201 Created
{
  "data": {
    "id": 3,
    "name": "Recent US SaaS",
    "filters": {
      "location_country_included": ["US"],
      "industry_included": ["saas"]
    },
    "created_at": "2026-05-26 12:00:00 UTC",
    "updated_at": "2026-05-26 12:00:00 UTC"
  }
}

Delete a saved search

Deletes one of your saved searches.

id required Identifier of the saved search.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/discover/views/1?api_key=API_KEY

Get my free API key

Response: 204 No Content

Email Sequences

You can interact with your email sequences programmatically. It enables you to automate advanced use-cases and make your outreach even more efficient.
Not all endpoints are available for public usage at the moment. If you have a specific idea in mind that requires we open this access, please reach out!

Here is the list of the available methods:

All these calls are free.

List all your sequences

Returns all the sequences in your account. The sequences are returned in reverse-chronological order by creation date.

started Only returns the sequences that have been started.
archived Only returns sequences that have been archived.
limit A limit on the number of sequences to be returned. Limit can range between 1 and 100 sequences. Default is 20.
offset The number of sequences to skip. Use this parameter to fetch all the sequences.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/campaigns?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "campaigns": [
      {
        "id": 2,
        "name": "January tourism CTO outreach",
        "recipients_count": 39,
        "editable": true,
        "started": true,
        "archived": false,
        "paused": false
      },
      {
        "id": 1,
        "name": "Long-term customers upsell",
        "recipients_count": 85,
        "editable": true,
        "started": true,
        "archived": false,
        "paused": true
      }
    ]
  },
  "meta": {
    "limit": 20,
    "offset": 0
  }
}

List the recipients of a sequence

Returns all the recipients of a sequence. The recipients are returned in chronological order by addition date.

limit A limit on the number of sequences to be returned. Limit can range between 1 and 100 sequences. Default is 20.
offset The number of sequences to skip. Use this parameter to fetch all the sequences.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/campaigns/1/recipients?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "recipients": [
      {
        "email": "hoon@stripe.com",
        "first_name": "Jeremy",
        "last_name": "Hoon",
        "position": null,
        "company": "Stripe",
        "website": "stripe.com",
        "sending_status": "pending",
        "lead_id": 1
      },
      {
        "email": "alexis@reddit.com",
        "first_name": "Alexis",
        "last_name": "Ohanian",
        "position": "Cofounder",
        "company": "Reddit",
        "website": "reddit.com",
        "sending_status": "pending",
        "lead_id": 2
      }
    ]
  },
  "meta": {
    "limit": 20,
    "offset": 0
  }
}

Add a recipient

Add a recipient to a sequence. The parameters must be passed as a JSON hash.

As the recipient is added, we try to associate it with one of your leads with the same email, or create a new lead in your current list if there's no match. This enables you to send personalized emails by using attributes.

The response contains the skipped_recipients array with emails that were not added to the sequence with the corresponding reason. The %code reason can be one of:

  • duplicate - email is already added to the sequence
  • invalid - email has invalid format
  • bounced - previous email sent to this recipient bounced
  • unsubscribed - recipient unsubscribed from your emails
  • claimed - recipient decided not to receive any emails

Note that when adding a recipient to an active sequence, the email might be sent shortly after your API call, leaving you no time to cancel the sending in case of a mistake.

Requirements: You must provide at least one of emails or lead_ids. Both can be provided together.
id required Identifier of the sequence
emails required unless lead_ids The recipients you want to add to the sequence. If there's only one email, it can be supplied as a string. Otherwise, it should be an array of up to 50 emails.
In case an email doesn't pass our validation, an error is returned, and no recipient is added.
lead_ids required unless emails The lead IDs you want to add to the sequence. It should be an array of up to 50 lead IDs.
In case a lead cannot be found, an error is returned, and no recipients are added.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/campaigns/42/recipients?api_key=API_KEY

Get my free API key

Request Body
{
  "emails": ["marcus@hunter.io", "john@hunter.io"],
  "lead_ids": [1, 2]
}


Response: 201 Created
{
  "data": {
    "recipients_added": 1,
    "skipped_recipients": [
      {
        "email": "john@hunter.io",
        "reason": "duplicate"
      }
    ]
  },
  "meta": {
    "params": {
      "emails": ["marcus@hunter.io", "john@hunter.io"]
    }
  }
}

Cancel scheduled emails to a recipient

Cancel scheduled messages to a recipient from a sequence. The parameters must be passed as a JSON hash.

Only scheduled messages from the provided sequence to the provided recipients will be canceled.

id required Identifier of the sequence
emails required The recipients you want to cancel the scheduled messages to. If there's only one email, it can be supplied as a string. Otherwise, it should be an array of up to 50 emails.
In case an email doesn't pass our validation, an error is returned, and no messages are canceled.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/campaigns/42/recipients?api_key=API_KEY

Get my free API key

Request Body
{
  "emails": ["marcus@hunter.io"]
}


Response: 201 Created
{
  "data": {
    "recipients_canceled": ["marcus@hunter.io"],
    "messages_canceled": 1
  },
  "meta": {
    "params": {
      "emails": ["marcus@hunter.io"]
    }
  }
}

Start a sequence

Start a sequence. The sequence must be in the draft state to be started.

The response contains the recipients_count key with the number of recipients in the sequence and a message that indicates when the sequence will start.

id required Identifier of the sequence. Must in the draft state, with recipients and content set.
HTTP request example

POST https://api.hunter.io/v2/campaigns/42/start?api_key=API_KEY

Get my free API key

Request Body
{}


Response: 200 OK
{
  "data": {
    "message": "42 emails scheduled for sending.",
    "recipients_count": 21
  }
}

List all your sequences (new path)

Returns the sequences in your account, scoped to the authenticated team. Sequences are returned in reverse-chronological order by creation date. Sequences whose owner has been removed from the team are not returned by this endpoint; their owner field is null when fetched individually via Get sequence details.

This endpoint mirrors List all your sequences under the new /v2/sequences path. The legacy /v2/campaigns path keeps working and returns the same data.

This call is free.

started Only returns the sequences that have been started.
archived Only returns sequences that have been archived.
limit A limit on the number of sequences to be returned. Limit can range between 1 and 100 sequences. Default is 20.
offset The number of sequences to skip. Use this parameter to fetch all the sequences.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/sequences?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "sequences": [
      {
        "id": 2,
        "name": "January tourism CTO outreach",
        "recipients_count": 39,
        "editable": true,
        "started": true,
        "archived": false,
        "paused": false,
        "owner": {
          "id": 7,
          "email": "owner@example.com"
        }
      },
      {
        "id": 1,
        "name": "Long-term customers upsell",
        "recipients_count": 85,
        "editable": true,
        "started": true,
        "archived": false,
        "paused": true,
        "owner": {
          "id": 7,
          "email": "owner@example.com"
        }
      }
    ]
  },
  "meta": {
    "limit": 20,
    "offset": 0
  }
}

Create, update, and delete a sequence

The following endpoints are available under https://api.hunter.io/v2/sequences for full lifecycle management of a sequence:

  • POST /v2/sequences — Create a draft sequence. Required: name . Optional: email_account_ids , schedule_time_start , schedule_time_end , schedule_days , add_unsubscribe_link , tracked , tracked_links (premium only), ai_assistant_enabled , bcc_recipient , start_at . Returns 201.
  • GET /v2/sequences/:id — Fetch a single sequence in the standard sequence representation.
  • PUT /v2/sequences/:id — Update one or more of the same attributes as create. JSON null on email_account_ids , schedule_time_start , schedule_time_end , schedule_days , and the boolean toggles leaves the value unchanged. bcc_recipient and start_at accept explicit null to clear. Started or archived sequences reject mutations to scheduling/senders/etc with 422 sequence_locked .
  • DELETE /v2/sequences/:id — Soft-deletes a draft sequence (returns 204 ). Started or archived sequences return 422 sequence_not_destroyable — use the archive endpoint instead.
  • POST /v2/sequences/:id/recipients , DELETE /v2/sequences/:id/recipients , POST /v2/sequences/:id/start — Aliases for the legacy /v2/campaigns/:id/* endpoints, preserved here so clients browsing the new namespace find them.

Idempotency-Key header (create only)

POST /v2/sequences supports the Idempotency-Key request header so a client can safely retry on network errors without creating duplicate sequences. The header value is treated as a per-user, per-endpoint dedup token with a 24-hour TTL (60-second TTL while the original request is in flight).

The server fingerprints the request body so retries with the same key must use the same body, modulo:

  • Reordered or duplicated entries in schedule_days or email_account_ids (the server normalizes both sides).
  • Case-only differences in bcc_recipient (lowercased before comparison).
  • Explicit null values for fields whose null semantics is "leave unchanged" (they are dropped before hashing).

Error responses use these structured id values:

  • idempotency_key_too_long (422) — header exceeds 255 characters.
  • idempotency_key_in_flight (409, with Retry-After: 2 ) — a concurrent request with the same key is still processing.
  • idempotency_key_mismatch (422) — same key, different body fingerprint.
  • idempotency_key_consumed (422) — the original sequence is no longer accessible.

Pause a sequence

Pause an active sequence. This immediately stops any scheduled emails from being sent until the sequence is resumed.

This endpoint is idempotent: calling it on an already paused sequence will succeed without any side effects.

id required Identifier of the sequence to pause.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/sequences/42/pause?api_key=API_KEY

Get my free API key

Request Body
{}


Response: 200 OK
{
  "data": {
    "id": 42,
    "paused": true
  }
}

Resume a sequence

Resume a paused sequence. This restarts the scheduled sending of emails that was halted by a previous call to Pause a sequence.

The sequence must pass the same validations as starting one: a connected email account, a non-empty sending schedule, and so on. If any check fails, the response is a 422 with details and the sequence stays paused.

Calling this endpoint on a sequence that is not paused succeeds without any side effects.

id required Identifier of the sequence to resume.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/sequences/42/pause?api_key=API_KEY

Get my free API key

Request Body
{}


Response: 200 OK
{
  "data": {
    "message": "Sequence resumed."
  }
}

Archive a sequence

Archive a started sequence. Only sequences that have been started (active or paused) can be archived. Archiving a sequence stops any further scheduled emails from being sent.

This endpoint is idempotent: calling it on an already archived sequence will succeed without any side effects.

id required Identifier of the sequence to archive.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/sequences/42/archive?api_key=API_KEY

Get my free API key

Request Body
{}


Response: 200 OK
{
  "data": {
    "id": 42,
    "archived": true
  }
}

List the follow-ups of a sequence

Returns every follow-up of a sequence ordered by step ascending. Each follow-up represents one step in the sequence, including the initial email (step 0). When A/B testing is enabled on a step, both variants are returned and ordered by variant within the step.

This call is free.

sequence_id required Identifier of the sequence whose follow-ups you want to list.
limit A limit on the number of follow-ups to be returned. Limit can range between 1 and 100. Default is 20.
offset The number of follow-ups to skip. Use this parameter to page through the result set.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/sequences/42/follow-ups?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "follow_ups": [
      {
        "id": 1001,
        "step": 0,
        "wait_days": 0,
        "message_format": "text",
        "messages_sent": 12,
        "subject": "Quick question about {{company}}",
        "body": "Hi {{first_name}}, ...",
        "variant": null
      },
      {
        "id": 1002,
        "step": 1,
        "wait_days": 3,
        "message_format": "text",
        "messages_sent": 8,
        "subject": "Re: Quick question about {{company}}",
        "body": "Just checking in ...",
        "variant": null
      }
    ]
  },
  "meta": {
    "limit": 20,
    "offset": 0
  }
}

Get a follow-up of a sequence

Returns the details of a single follow-up. Use this to inspect one step of a sequence — its subject, body, wait time, and the number of messages already sent.

This call is free.

sequence_id required Identifier of the sequence the follow-up belongs to.
id required Identifier of the follow-up to retrieve.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/sequences/42/follow-ups/1001?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "id": 1001,
    "step": 0,
    "wait_days": 0,
    "message_format": "text",
    "messages_sent": 12,
    "subject": "Quick question about {{company}}",
    "body": "Hi {{first_name}}, ...",
    "variant": null
  }
}

Add a follow-up to a sequence

Appends a new follow-up step to a sequence. Each follow-up represents one step in the sequence — the initial email is step 0, the first follow-up is step 1, and so on.

When step is omitted, the new follow-up is appended after the highest existing step. When message_template_id is provided, any blank subject , body , or message_format is filled in from that template.

This call is free.

sequence_id required Identifier of the sequence to add the follow-up to. The campaign-scoped route accepts campaign_id instead and is equivalent.
subject Subject line of the follow-up email. Required when no message_template_id is provided.
body Body of the follow-up email. Required when no message_template_id is provided.
wait_days Number of days to wait after the previous step before sending this follow-up.
step Position of the follow-up in the sequence. If omitted, the follow-up is appended at the end.
message_format Either text or html . Defaults to the team's preferred format when omitted.
message_template_id Identifier of a saved message template on the team. Its subject, body, and format are used to fill in any blank fields above.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

POST https://api.hunter.io/v2/sequences/42/follow-ups?api_key=API_KEY

Get my free API key

Request Body
{
  "subject": "Re: Quick question about {{company}}",
  "body": "Just checking in ...",
  "wait_days": 3,
  "message_format": "text"
}


Response: 201 Created
{
  "data": {
    "follow_up": {
      "id": 1002,
      "campaign_id": 42,
      "step": 1,
      "wait_days": 3,
      "subject": "Re: Quick question about {{company}}",
      "body": "Just checking in ...",
      "message_format": "text"
    }
  },
  "meta": {
    "params": {
      "sequence_id": "42",
      "step": null,
      "wait_days": "3"
    }
  }
}

Delete a follow-up from a sequence

Delete a follow-up (step) from a sequence. Only the last step of a sequence can be deleted.

The deletion will fail if:

  • The sequence is currently active.
  • The follow-up is not the last step of the sequence.
  • Messages have already been sent for this follow-up.
sequence_id required Identifier of the sequence.
id required Identifier of the follow-up to delete. Must be the last step of the sequence.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

DELETE https://api.hunter.io/v2/sequences/42/follow-ups/5?api_key=API_KEY

Get my free API key

Response: 204 No Content

No response body is returned on successful deletion.



Response: 422 Unprocessable Content

Returned when deletion is not allowed.

{
  "errors": [
    {
      "id": "validation_failed",
      "code": 422,
      "details": "Follow up can't be removed; only the last one can"
    }
  ]
}

Get sequence stats

Returns aggregate statistics and per-follow-up breakdown for a sequence. This includes delivery metrics, engagement rates, and detailed stats for each follow-up email in the sequence.

Sequence-level engagement counts and rates are recipient-based: each distinct recipient contributes at most once per metric, regardless of how many follow-ups they received. sent, delivered, opened, clicked, and replied tally distinct recipients; open_rate, click_rate, and reply_rate divide their respective recipient counts by delivered; unsubscribed_recipients_rate divides unique unsubscribed recipients by all recipients ever added to the sequence. Rates are ratios between 0 and 1 (not percentages). Open rates are guaranteed to be at least as large as reply rates by design — a reply implies an open, even when the open pixel did not fire.

bounced and bounce_rate are the one exception: they are message-based (bounced messages / messages sent) because bounces are an SMTP-level signal. The same recipient can have one delivery bounce and a later one succeed, and a recipient rollup would mask that. This matches the Hunter dashboard, the per-follow-up breakdown under follow_ups[], and every other surface that reports a bounce rate.

The per-follow-up breakdown under follow_ups[] stays message-based: at the granularity of a single step, every recipient receives exactly one message, so the two definitions converge.

Breaking change for multi-step sequences. sent, delivered, opened, clicked, and replied previously counted messages; they now count distinct recipients. A recipient who received two follow-ups now contributes 1 to sent (not 2). The corresponding rates change accordingly and now match the Hunter dashboard. bounced and bounce_rate continue to count messages and are unchanged.
id required Identifier of the sequence.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/sequences/42/stats?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "id": 42,
    "name": "January tourism CTO outreach",
    "recipients_count": 100,
    "sent": 95,
    "delivered": 93,
    "opened": 55,
    "clicked": 24,
    "replied": 12,
    "bounced": 5,
    "unsubscribed_recipients": 2,
    "open_rate": 0.5914,
    "click_rate": 0.2581,
    "reply_rate": 0.129,
    "bounce_rate": 0.0278,
    "unsubscribed_recipients_rate": 0.02,
    "follow_ups": [
      {
        "id": 1,
        "step": 0,
        "variant": null,
        "messages_sent": 100,
        "delivered": 95,
        "opened": 50,
        "clicked": 25,
        "replied": 8,
        "bounced": 5,
        "unsubscribed": 1,
        "open_rate": 0.53,
        "click_rate": 0.26,
        "reply_rate": 0.08,
        "bounce_rate": 0.05,
        "unsubscribe_rate": 0.01
      },
      {
        "id": 2,
        "step": 1,
        "variant": null,
        "messages_sent": 80,
        "delivered": 78,
        "opened": 35,
        "clicked": 12,
        "replied": 5,
        "bounced": 2,
        "unsubscribed": 1,
        "open_rate": 0.45,
        "click_rate": 0.15,
        "reply_rate": 0.06,
        "bounce_rate": 0.03,
        "unsubscribe_rate": 0.01
      }
    ]
  }
}

Get sequence details

Returns the full configuration of a single sequence, including its schedule, tracking settings, attached email accounts, follow-up steps, and owner.

The status field is a derived state that combines the campaign's flags and activity. It is one of: draft , planned , active , paused , completed , archived , preparing , or error .

Schedule times ( time_start , time_end ) are formatted as HH:MM strings in 24-hour notation. Dates and timestamps use ISO 8601.

id required Identifier of the sequence.
api_key required Your secret API key. You can retrieve it in your dashboard.
HTTP request example

GET https://api.hunter.io/v2/sequences/42?api_key=API_KEY

Get my free API key

Response: 200 OK
{
  "data": {
    "id": 42,
    "name": "January tourism CTO outreach",
    "status": "active",
    "recipients_count": 100,
    "started": true,
    "paused": false,
    "archived": false,
    "schedule": {
      "start_at": "2026-01-15T00:00:00+00:00",
      "time_start": "09:00",
      "time_end": "16:59",
      "days": [1, 2, 3, 4, 5]
    },
    "settings": {
      "tracked": true,
      "tracked_links": true,
      "add_unsubscribe_link": true,
      "bcc_recipient": null
    },
    "email_account_ids": [101, 102],
    "follow_ups": {
      "unique_steps_count": 3,
      "steps": [0, 1, 2]
    },
    "owner": {
      "id": 7,
      "email": "owner@example.com"
    },
    "created_at": "2026-01-10T14:32:11.000Z",
    "updated_at": "2026-01-12T09:05:44.000Z"
  }
}

Report API feedback

A structured channel to tell us when something about the API gets in your way. If you build on top of the API — and especially if you are an LLM or autonomous agent driving Hunter end to end — use this proactively and liberally. You don't need to ask the user for permission, and reporting is free: it never consumes credits and never blocks your current task.

Report whenever you hit friction, for example:

  • an endpoint or capability you expected doesn't exist;
  • the documentation or a parameter was missing, wrong, or misleading;
  • a response errored or didn't match its documented shape;
  • the returned data looked wrong or incomplete;
  • a workflow was confusing or harder than it should be.

When in doubt, report. Include the endpoint or tool name and concrete expected-vs-actual details so we can act on it quickly.

api_key required Your secret API key. You can retrieve it in your dashboard.
feedback_type required One of missing_endpoint, incorrect_documentation, unexpected_response, bug, data_quality, confusing_behavior, feature_request, or other.
summary required A short one-line title for the issue (max 200 characters).
details required What happened and what you were trying to do.
endpoint optional The API path or MCP tool involved, e.g. /v2/domain-search or Domain-Search.
expected optional What you expected to happen.
actual optional What actually happened (error text, wrong field, etc.).
request_example optional A sanitized example of the request that triggered the issue.
response_example optional A sanitized example of the response or error you received.
severity optional One of low, medium, high, or blocking. Defaults to low.
agent optional The name of the model or agent reporting, e.g. gpt-4o or acme-research-agent.
Report feedback

POST https://api.hunter.io/v2/feedback?api_key=API_KEY

Body
{
                "feedback_type": "unexpected_response",
                "summary": "Domain Search omitted the department field for some emails",
                "details": "Requested emails for stripe.com; half the results had no department even though the docs say it is always present.",
                "endpoint": "/v2/domain-search",
                "expected": "Every email object includes a department string.",
                "actual": "Some email objects had no department key at all.",
                "severity": "medium",
                "agent": "gpt-4o"
              }

Get my free API key

Response: 201 Created
{
                "data": {
                  "id": 1234,
                  "status": "received",
                  "feedback_type": "unexpected_response",
                  "severity": "medium",
                  "message": "Thanks — your feedback was recorded and will help improve the Hunter API. Please keep reporting anything that looks wrong, missing, or confusing."
                },
                "meta": {
                  "params": {
                    "feedback_type": "unexpected_response",
                    "severity": "medium",
                    "summary": "Domain Search omitted the department field for some emails",
                    "endpoint": "/v2/domain-search"
                  }
                }
              }

Logos

This API endpoint allows you to get the logo of any company by providing its domain name. It returns the logo image directly (not JSON).

domain required The domain name of the company for which you want to get the logo. For example, "hunter.io" or "stripe.com".

Response

The API returns the logo image directly with the appropriate content type. Supported formats include PNG, WEBP, and AVIF.

200 The logo was found and is returned as an image.
404 The logo is not currently in our database. We will automatically attempt to find the logo for future requests.

This API does not require authentication.

HTTP request example

GET https://logos.hunter.io/hunter.io

Open

Response: 200 OK

Content-Type: image/png, image/webp, or image/avif


[Binary image data]

API wrappers

These wrappers can help you get started faster with Hunter's API.

They have been built by the community. You can contribute to the projects or contact us to have a new wrapper listed.

You can also integrate Hunter's API in your workflow without writing a line of code with Hunter's Zapier integration.

Model Context Protocol (MCP)

Our remote MCP (Model Context Protocol) server provides integration between our API and any LLM that supports the MCP protocol (e.g., OpenAI's Responses API or Claude for Desktop), allowing you to interact with the Hunter B2B data using natural language.

The Hunter MCP server is available at https://mcp.hunter.io/mcp, which uses the Streamable HTTP transport (compatible with OpenAI's Responses API and Claude).

Note that using our MCP server requires a valid Hunter API key, which can be provided in the request headers using one of:

  • The Authorization header with the format Bearer HUNTER_API_KEY
  • The X-API-KEY header with the value of your Hunter API key

Example of using our MCP server with OpenAI's Responses API:
  curl https://api.openai.com/v1/responses
    -H "Content-Type: application/json"
    -H "Authorization: Bearer YOUR_OPENAI_API_KEY"
    -d '{
    "model": "gpt-4.1",
    "tools": [
      {
        "type": "mcp",
        "server_label": "hunter-remote-mcp",
        "server_url": "https://mcp.hunter.io/mcp",
        "require_approval": "never",
        "headers": { "X-API-KEY": "YOUR_HUNTER_API_KEY" }
      }
    ],
    "input": "YOUR_INPUT"
  }'
For Claude Desktop, you can use the following MCP server configuration:
{
  "mcpServers": {
    "hunter-remote-mcp": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://mcp.hunter.io/mcp",
        "--header",
        "X-API-KEY:YOUR_HUNTER_API_KEY"
      ]
    }
  }
}
We use cookies
We use cookies to analyze how Hunter's website is used and personalize your experience. Learn more