identity · Listed · Found · 183 endpoints · Gateway-eligible
Hunter API
Hunter API
Find and verify professional email addresses and manage Hunter resources.
Indexed from this operator's public /.well-known/x402.json. Found is not operator-owned and is not attested. Claim or opt out.
Agent Read · Cleared Index
ROUTE
Route when you need identity at published x402 prices.
confidence
78%
source
signal
Index before you pay. Same payload for agents:
GET /api/cleared/agent-read?slug=hunter-api-6szt
When to call
- Need identity via x402 and want Cleared-indexed payTo with a live scorecard.
- Find and verify professional email addresses and manage Hunter resources.
Risks
- Found — not operator-owned; claim status unknown.
- No Cleared settlement receipt on file yet.
- No Gateway traffic yet — market share unproven.
Price posture
183 endpoints — confirm price on manifest before pay.
Category · Gateway
identity · no Gateway routes yet — early / unproven on Cleared market share.
Endpoint hints
POST /discoverFind companies matching a structured filter set. This operation is free.
GET /domain-searchDiscovery call — use when you lack a known handle.
POST /domain-searchUse POST for nested location filters. The body can be JSON or URL-encoded form data.
GET /email-finderSupply a LinkedIn handle, or supply a domain/company plus either a full name or first and last name. A found email address is also saved automatically to your l
GET /email-verifierCheck the deliverability of an email address. A `valid` or `accept_all` email address is also saved automatically to your leads, and a lead you already have get
GET /email-countReturn aggregate counts without revealing individual email addresses. This operation is free.
GET /people/findDiscovery call — use when you lack a known handle.
GET /companies/findDiscovery call — use when you lack a known handle.
Evidence (Cleared)
- → Intake verified · Gateway-eligible
- → Trust 70/100 · pass · tier listed
- → Protocol mpp
- → Manifest reachable · schema valid
- → Found listing — indexed from public x402.json, not operator-attested.
Endpoints
Discover companies
Not used$MeteredPOST https://hunter.io/discoverFind companies matching a structured filter set. This operation is free.
Find email addresses by domain
$MeteredGET https://hunter.io/domain-searchFind email addresses by domain using request-body parameters
Not used$MeteredPOST https://hunter.io/domain-searchUse POST for nested location filters. The body can be JSON or URL-encoded form data.
Find a professional email address
$MeteredGET https://hunter.io/email-finderSupply a LinkedIn handle, or supply a domain/company plus either a full name or first and last name. A found email address is also saved automatically to your leads. This is enabled by default and can be disabled for your account. The saved lead leaves out a phone number that is on a data broker deletion list, such as California's DROP.
Verify an email address
$MeteredGET https://hunter.io/email-verifierCheck the deliverability of an email address. A `valid` or `accept_all` email address is also saved automatically to your leads, and a lead you already have gets the new verification result. This is enabled by default and can be disabled for your account. The saved lead leaves out a phone number that is on a data broker deletion list, such as California's DROP.
Count email addresses for a domain
$MeteredGET https://hunter.io/email-countReturn aggregate counts without revealing individual email addresses. This operation is free.
Enrich a person
$MeteredGET https://hunter.io/people/findEnrich a company
$MeteredGET https://hunter.io/companies/findEnrich a person and company
$MeteredGET https://hunter.io/combined/findGet account details and usage
$MeteredGET https://hunter.io/accountWhen `data.requests.credits` is present, the team has a single credits pool: plan with `credits.remaining`. A search costs 1 credit and a verification 0.5 credit. `searches` and `verifications` are then approximate views of the same pool (rounded down, with request-pack usage counted per type), not separate quotas. Without `credits`, `searches` and `verifications` are separate quotas.
Update account details
$MeteredGET https://hunter.io/accountGet account profile summary
$MeteredGET https://hunter.io/account-statsGet credit usage summary
$MeteredGET https://hunter.io/usageWhen `data.requests.credits` is present, the team has a single credits pool: plan with `credits.remaining`. A search costs 1 credit and a verification 0.5 credit. `searches` and `verifications` are then approximate views of the same pool (rounded down, with request-pack usage counted per type), not separate quotas. Without `credits`, `searches` and `verifications` are separate quotas.
Get credit usage history
$MeteredGET https://hunter.io/usage/historyList team members
$MeteredGET https://hunter.io/team/membersList connected apps
$MeteredGET https://hunter.io/connected-appsGet a connected app
$MeteredGET https://hunter.io/connected-apps/{id}Push data to a connected app
$MeteredPOST https://hunter.io/connected-apps/{id}/pushList email accounts
$MeteredGET https://hunter.io/email-accountsGet email account sending capacities
$MeteredGET https://hunter.io/email-accounts/capacitiesGet an email account
$MeteredGET https://hunter.io/email-accounts/{id}The account's `signature` is returned HTML-sanitized (HUN-22571).
Replace an email account
$MeteredGET https://hunter.io/email-accounts/{id}Update an email account
$MeteredGET https://hunter.io/email-accounts/{id}Get an email account health report
$MeteredGET https://hunter.io/email-accounts/{id}/health-reportGet an email account usage report
$MeteredGET https://hunter.io/email-accounts/{id}/usageGet an email account warmup report
$MeteredGET https://hunter.io/email-accounts/{id}/warmup-reportList sequences using an email account
$MeteredGET https://hunter.io/email-accounts/{id}/sequencesList campaigns
$MeteredGET https://hunter.io/campaignsEach campaign carries `editable`. It is true when the API key's user owns the campaign or is a team admin or owner, and only then can that user add recipients to it.
List campaign recipients
$MeteredGET https://hunter.io/campaigns/{id}/recipientsWhen a recipient has asked Hunter to delete their address, with a claim or a California DROP request, their `email` is null (HUN-23599).
Add campaign recipients
$MeteredPOST https://hunter.io/campaigns/{id}/recipientsRemove campaign recipients
$MeteredGET https://hunter.io/campaigns/{id}/recipientsStart a campaign
$MeteredPOST https://hunter.io/campaigns/{id}/startAdd a campaign follow-up step
$MeteredPOST https://hunter.io/campaigns/{id}/follow-upsGet a campaign follow-up step
$MeteredGET https://hunter.io/campaigns/{id}/follow-ups/{follow_up_id}List sequences
$MeteredGET https://hunter.io/sequencesEach sequence carries `editable`. It is true when the API key's user owns the sequence or is a team admin or owner, and only then can that user add recipients to it.
Create a sequence
$MeteredPOST https://hunter.io/sequencesSender IDs must be available for outreach to the sequence owner. On the Free plan, extra or SMTP accounts retained only for a paid Inbox Protection period cannot be selected as senders. Submitting one returns 422 with error ID unknown_email_account_ids. Enabling `ai_assistant_enabled` requires a plan that includes the AI writing assistant. A request that turns it on without that entitlement is rejected with `ai_assistant_requires_upgrade` (422).
Get a sequence
$MeteredGET https://hunter.io/sequences/{id}The `ab_testing` object reports the A/B test state: `enabled`, the split in `variant_a_percentage` and `variant_b_percentage`, and `winner_variant` with `winner_selected_at`. When `enabled` is false, the other fields are null.
Replace a sequence
$MeteredGET https://hunter.io/sequences/{id}Sender IDs must be available for outreach to the sequence owner. On the Free plan, extra or SMTP accounts retained only for a paid Inbox Protection period cannot be selected as senders. Submitting one returns 422 with error ID unknown_email_account_ids. Enabling `ai_assistant_enabled` requires a plan that includes the AI writing assistant. A request that turns it on without that entitlement is rejected with `ai_assistant_requires_upgrade` (422).
Update a sequence
$MeteredGET https://hunter.io/sequences/{id}Sender IDs must be available for outreach to the sequence owner. On the Free plan, extra or SMTP accounts retained only for a paid Inbox Protection period cannot be selected as senders. Submitting one returns 422 with error ID unknown_email_account_ids. Enabling `ai_assistant_enabled` requires a plan that includes the AI writing assistant. A request that turns it on without that entitlement is rejected with `ai_assistant_requires_upgrade` (422).
Delete a sequence
$MeteredGET https://hunter.io/sequences/{id}List sequence follow-up steps
$MeteredGET https://hunter.io/sequences/{id}/follow-upsAdd a sequence follow-up step
$MeteredPOST https://hunter.io/sequences/{id}/follow-upsGet a sequence follow-up step
$MeteredGET https://hunter.io/sequences/{id}/follow-ups/{follow_up_id}Replace a sequence follow-up step
$MeteredGET https://hunter.io/sequences/{id}/follow-ups/{follow_up_id}A `body` in plain text or HTML keeps its line breaks and paragraphs. It is stored as the editor's HTML (`<div>` and `<br>`), also when `message_format` is `text`, so a read after the write can differ from the submitted body.
Update a sequence follow-up step
$MeteredGET https://hunter.io/sequences/{id}/follow-ups/{follow_up_id}A `body` in plain text or HTML keeps its line breaks and paragraphs. It is stored as the editor's HTML (`<div>` and `<br>`), also when `message_format` is `text`, so a read after the write can differ from the submitted body.
Delete a sequence follow-up step
$MeteredGET https://hunter.io/sequences/{id}/follow-ups/{follow_up_id}Get sequence performance stats
$MeteredGET https://hunter.io/sequences/{id}/statsList sequence recipients
$MeteredGET https://hunter.io/sequences/{id}/recipientsWhen a recipient has asked Hunter to delete their address, with a claim or a California DROP request, their `email` is null (HUN-23599).
Add sequence recipients
$MeteredPOST https://hunter.io/sequences/{id}/recipientsRemove sequence recipients
$MeteredGET https://hunter.io/sequences/{id}/recipientsStart a sequence
$MeteredPOST https://hunter.io/sequences/{id}/startPause a sequence
$MeteredPOST https://hunter.io/sequences/{sequence_id}/pauseResume a paused sequence
$MeteredGET https://hunter.io/sequences/{sequence_id}/pauseArchive a sequence
$MeteredPOST https://hunter.io/sequences/{sequence_id}/archiveSend a test email for every step of a sequence
$MeteredPOST https://hunter.io/sequences/{sequence_id}/testQueues one test message per follow-up of the sequence, in step order, to the supplied address. When A/B testing is enabled on a step, both variants are sent. Subjects are prefixed with [TEST]. Returns 422 when the sequence has no step, a step is missing its subject or body, the sequence has no email account, the account cannot send, or the recipient cannot be contacted. At most 30 test emails can be queued per 10 minutes.
Discover people matching filters
$MeteredGET https://hunter.io/discover/peopleDiscover people using request-body filters
$MeteredPOST https://hunter.io/discover/peopleCount domains matching discovery filters
$MeteredGET https://hunter.io/domain-countFind the domain for a company
$MeteredGET https://hunter.io/domain-finderFind the domain for a company via POST
$MeteredPOST https://hunter.io/domain-finderMulti-domain search
$MeteredPOST https://hunter.io/multi-domain-searchSearch professional email addresses across many companies at once using a structured filter set. Returns masked rows — no email address or phone number; use the reveal endpoint to unmask. This masked survey operation is free. At least one filter is required. Filters may be sent in the request body (JSON or form-encoded) or as query-string parameters; the body is therefore optional.
Reveal emails from a multi-domain search
$MeteredPOST https://hunter.io/multi-domain-search/revealSuggest domains for a company name
$MeteredGET https://hunter.io/domains-suggestionGet a previously found email address
$MeteredGET https://hunter.io/email-finder/foundFound-only variant of email finder. Supply a LinkedIn handle, or supply a domain/company plus either a full name or first and last name.
Get a previously found email address via POST
$MeteredPOST https://hunter.io/email-finder/foundFound-only variant of email finder using request-body parameters.
Get deliverability insight for an email address
$MeteredGET https://hunter.io/email-insightList leads
$MeteredGET https://hunter.io/leadsEach lead carries `department` since HUN-23171. It was already a filter on this endpoint, but was never emitted, so a caller could filter on a field it could not read back. When the person behind a lead has asked Hunter to delete their address, with a claim or a California DROP request, the lead is returned without it: `email`, `confidence_score`, `verification.date` and `verification.status` are null (HUN-23599). A manually claimed phone number, or one covered by DROP, is returned as `phone_number: null`. The phone is also withheld when screening is unavailable; the lead and its other contact details remain. Filter by sequence with `sequence_ids[]`. The former name `campaign_ids[]` is still accepted as an alias; when both are sent, `sequence_ids[]` is used (HUN-20893).
Create a lead
$MeteredPOST https://hunter.io/leadsA manually claimed phone number, or one covered by DROP, is returned as `phone_number: null`. The phone is also withheld when screening is unavailable; the lead and its other contact details remain. Creates a lead, or adds an existing lead to the requested lists. When an `email` matches a lead already on your team, the request is additive: it adds only the missing list memberships and returns 201 rather than an email duplicate error. When the matched lead belongs to a teammate, the request still adds it to your lists, and the teammate's lead itself is only updated if you have permission to edit it. A request without an `email` is never matched by email — it does not reuse an existing email-less lead — though a lead with an identical name, company, and list is still rejected as a duplicate. Accepts `department` since HUN-23171, normalized to its canonical key so a localized display label ("Sales") is stored as `sales`. Lead attributes are not modelled field-by-field in this contract yet — the response uses the generic resource envelope — so this note is where the accepted set is recorded. When another request is creating leads for the team, returns 409 with `lead_creation_in_progress` and `Retry-After: 1`. Retry the request after one second.
Upsert a lead
$MeteredGET https://hunter.io/leadsA manually claimed phone number, or one covered by DROP, is returned as `phone_number: null`. The phone is also withheld when screening is unavailable; the lead and its other contact details remain. Accepts `department`, normalized to its canonical key so a localized display label ("Sales") is stored as `sales`. This operation keeps its own allowlist, separate from the one `createLead` uses, so the two can differ — it does not currently accept `company_type`, `lead_country_code`, `lead_city` or `lead_state`. When creating a new lead while another request is creating leads for the team, returns 409 with `lead_creation_in_progress` and `Retry-After: 1`. Retry the request after one second. Existing leads can still be updated.
Get a lead
$MeteredGET https://hunter.io/leads/{id}Returns `department` since HUN-23171. It was filterable on the collection endpoint and settable by enrichment before that, but never emitted, so a caller could filter on a field it could not read back. When the person behind a lead has asked Hunter to delete their address, with a claim or a California DROP request, the lead is returned without it: `email`, `confidence_score`, `verification.date` and `verification.status` are null (HUN-23599). A manually claimed phone number, or one covered by DROP, is returned as `phone_number: null`. The phone is also withheld when screening is unavailable; the lead and its other contact details remain.
Replace a lead
$MeteredGET https://hunter.io/leads/{id}Accepts `department` since HUN-23171. The value is normalized to its canonical key, so a localized display label ("Sales") is stored as `sales`. Lead attributes are not modelled field-by-field in this contract yet — the response uses the generic resource envelope — so this note is where the accepted set is recorded.
Update a lead
$MeteredGET https://hunter.io/leads/{id}Accepts `department` since HUN-23171. The value is normalized to its canonical key, so a localized display label ("Sales") is stored as `sales`. Lead attributes are not modelled field-by-field in this contract yet — the response uses the generic resource envelope — so this note is where the accepted set is recorded.
Delete a lead
$MeteredGET https://hunter.io/leads/{id}Check whether a lead exists
$MeteredGET https://hunter.io/leads/existUpsert leads in bulk
$MeteredGET https://hunter.io/leads/bulkCreate or update up to 100 leads in one call. Each lead is matched on `email` and written in its own transaction, so one invalid lead does not cancel the others. The team's lead limit is checked for each new lead using the current committed lead count. If an item would exceed that limit, earlier successful items remain saved and that item returns a `leads_limit_reached` error. If another request is creating leads for the team, the new lead's item returns `status: failed` with error `lead_creation_in_progress` and code 409. Retry only those failed items after one second; other items still run normally. The response is always 200: read `status` and `errors` of each result to know what happened to each lead. The call is free and consumes no request. When the person behind a lead has asked Hunter to delete their address, with a claim or a California DROP request, the lead is returned without it: `email`, `confidence_score`, `verification.date` and `verification.status` are null (HUN-23599). A manually claimed phone number, or one covered by DROP, is returned as `phone_number: null`. The phone is also withheld when screening is unavailable; the lead and its other contact details remain.
Check whether leads exist in bulk
$MeteredGET https://hunter.io/leads/bulk/existMove leads to another list in bulk
$MeteredPOST https://hunter.io/leads/bulk/moveDelete leads in bulk
$MeteredPOST https://hunter.io/leads/bulk/deleteTag a lead
$MeteredPOST https://hunter.io/leads/{id}/tagsRemove a tag from a lead
$MeteredGET https://hunter.io/leads/{id}/tags/{tag_id}Enrich a lead
$MeteredPOST https://hunter.io/leads/{id}/enrichA manually claimed phone number, or one covered by DROP, is returned as `phone_number: null`. The phone is also withheld when screening is unavailable; the lead and its other contact details remain.
List lead custom attributes
$MeteredGET https://hunter.io/leads_custom_attributesCreate a lead custom attribute
$MeteredPOST https://hunter.io/leads_custom_attributesGet a lead custom attribute
$MeteredGET https://hunter.io/leads_custom_attributes/{id}Replace a lead custom attribute
$MeteredGET https://hunter.io/leads_custom_attributes/{id}Update a lead custom attribute
$MeteredGET https://hunter.io/leads_custom_attributes/{id}Delete a lead custom attribute
$MeteredGET https://hunter.io/leads_custom_attributes/{id}List saved companies
$MeteredGET https://hunter.io/companiesSave a company
$MeteredPOST https://hunter.io/companiesGet a saved company
$MeteredGET https://hunter.io/companies/{id}Delete a saved company
$MeteredGET https://hunter.io/companies/{id}Move companies to another list in bulk
$MeteredPOST https://hunter.io/companies/bulk/moveCopy companies to another list in bulk
$MeteredPOST https://hunter.io/companies/bulk/copyDelete companies in bulk
$MeteredPOST https://hunter.io/companies/bulk/deleteTag companies in bulk
$MeteredPOST https://hunter.io/companies/bulk/tagTag a saved company
$MeteredPOST https://hunter.io/companies/{id}/tagsRemove a tag from a saved company
$MeteredGET https://hunter.io/companies/{id}/tags/{tag_id}List lead lists
$MeteredGET https://hunter.io/leads_listsCreate a lead list
$MeteredPOST https://hunter.io/leads_listsGet a lead list
$MeteredGET https://hunter.io/leads_lists/{id}When the person behind a lead has asked Hunter to delete their address, with a claim or a California DROP request, the lead is returned without it: `email`, `confidence_score`, `verification.date` and `verification.status` are null (HUN-23599).
Replace a lead list
$MeteredGET https://hunter.io/leads_lists/{id}Update a lead list
$MeteredGET https://hunter.io/leads_lists/{id}Delete a lead list
$MeteredGET https://hunter.io/leads_lists/{id}List lead list folders
$MeteredGET https://hunter.io/leads_lists/foldersCreate a lead list folder
$MeteredPOST https://hunter.io/leads_lists/foldersWhen `color` is omitted the folder gets a random color from the palette's vivid swatches.
Get a lead list folder
$MeteredGET https://hunter.io/leads_lists/folders/{id}Replace a lead list folder
$MeteredGET https://hunter.io/leads_lists/folders/{id}Update a lead list folder
$MeteredGET https://hunter.io/leads_lists/folders/{id}Delete a lead list folder
$MeteredGET https://hunter.io/leads_lists/folders/{id}Favorite a lead list
$MeteredPOST https://hunter.io/leads_lists/{id}/favoriteUnfavorite a lead list
$MeteredGET https://hunter.io/leads_lists/{id}/favoriteMerge lead lists
$MeteredPOST https://hunter.io/leads_lists/{id}/mergeList lead lists (hyphen alias)
$MeteredGET https://hunter.io/leads-listsCreate a lead list (hyphen alias)
$MeteredPOST https://hunter.io/leads-listsGet a lead list (hyphen alias)
$MeteredGET https://hunter.io/leads-lists/{id}When the person behind a lead has asked Hunter to delete their address, with a claim or a California DROP request, the lead is returned without it: `email`, `confidence_score`, `verification.date` and `verification.status` are null (HUN-23599).
Replace a lead list (hyphen alias)
$MeteredGET https://hunter.io/leads-lists/{id}Update a lead list (hyphen alias)
$MeteredGET https://hunter.io/leads-lists/{id}Delete a lead list (hyphen alias)
$MeteredGET https://hunter.io/leads-lists/{id}List lead list folders (hyphen alias)
$MeteredGET https://hunter.io/leads-lists/foldersCreate a lead list folder (hyphen alias)
$MeteredPOST https://hunter.io/leads-lists/foldersWhen `color` is omitted the folder gets a random color from the palette's vivid swatches.
Get a lead list folder (hyphen alias)
$MeteredGET https://hunter.io/leads-lists/folders/{id}Replace a lead list folder (hyphen alias)
$MeteredGET https://hunter.io/leads-lists/folders/{id}Update a lead list folder (hyphen alias)
$MeteredGET https://hunter.io/leads-lists/folders/{id}Delete a lead list folder (hyphen alias)
$MeteredGET https://hunter.io/leads-lists/folders/{id}Favorite a lead list (hyphen alias)
$MeteredPOST https://hunter.io/leads-lists/{id}/favoriteUnfavorite a lead list (hyphen alias)
$MeteredGET https://hunter.io/leads-lists/{id}/favoriteMerge lead lists (hyphen alias)
$MeteredPOST https://hunter.io/leads-lists/{id}/mergeCreate a leads import from CSV data
$MeteredPOST https://hunter.io/leads-importsCreates a draft leads import and returns its id, the guessed column matching, and a configuration_url. This call does not import anything: a person must open that URL in a browser and complete the mapping step before any lead is created. It is intended for clients that can hand off to a browser session, not for unattended automation. csv_data must be sent in the request body; it is rejected in the query string, where it would reach access logs verbatim.
List company lists
$MeteredGET https://hunter.io/company-listsCreate a company list
$MeteredPOST https://hunter.io/company-listsGet a company list
$MeteredGET https://hunter.io/company-lists/{id}Replace a company list
$MeteredGET https://hunter.io/company-lists/{id}Update a company list
$MeteredGET https://hunter.io/company-lists/{id}Delete a company list
$MeteredGET https://hunter.io/company-lists/{id}List company list folders
$MeteredGET https://hunter.io/company-lists/foldersCreate a company list folder
$MeteredPOST https://hunter.io/company-lists/foldersWhen `color` is omitted the folder gets a random color from the palette's vivid swatches.
Get a company list folder
$MeteredGET https://hunter.io/company-lists/folders/{id}Replace a company list folder
$MeteredGET https://hunter.io/company-lists/folders/{id}Update a company list folder
$MeteredGET https://hunter.io/company-lists/folders/{id}Delete a company list folder
$MeteredGET https://hunter.io/company-lists/folders/{id}Favorite a company list
$MeteredPOST https://hunter.io/company-lists/{id}/favoriteUnfavorite a company list
$MeteredGET https://hunter.io/company-lists/{id}/favoriteAdd a company to a company list
$MeteredPOST https://hunter.io/company-lists/{id}/companiesRemove a company from a company list
$MeteredGET https://hunter.io/company-lists/{id}/companies/{company_id}Find lookalike companies from a company list or a domain
$MeteredGET https://hunter.io/lookalikesFinds companies that look like the ones in one of your company lists, or like one company given by its domain. The seed companies are excluded, and we return the most similar companies ranked by a similarity score. This endpoint is not paginated: it returns a single ranked page of the top limit results, so the offset parameter is not supported and returns 400 if supplied. This call is free.
List lead tags
$MeteredGET https://hunter.io/tagsCreate a lead tag
$MeteredPOST https://hunter.io/tagsGet a lead tag
$MeteredGET https://hunter.io/tags/{id}Replace a lead tag
$MeteredGET https://hunter.io/tags/{id}Update a lead tag
$MeteredGET https://hunter.io/tags/{id}Delete a lead tag
$MeteredGET https://hunter.io/tags/{id}List company tags
$MeteredGET https://hunter.io/company-tagsCreate a company tag
$MeteredPOST https://hunter.io/company-tagsGet a company tag
$MeteredGET https://hunter.io/company-tags/{id}Replace a company tag
$MeteredGET https://hunter.io/company-tags/{id}Update a company tag
$MeteredGET https://hunter.io/company-tags/{id}Delete a company tag
$MeteredGET https://hunter.io/company-tags/{id}Submit product feedback
$MeteredPOST https://hunter.io/feedbackList saved discover views
$MeteredGET https://hunter.io/discover/viewsCreate a saved discover view
$MeteredPOST https://hunter.io/discover/viewsGet a saved discover view
$MeteredGET https://hunter.io/discover/views/{id}Delete a saved discover view
$MeteredGET https://hunter.io/discover/views/{id}List message templates
$MeteredGET https://hunter.io/message-templatesCreate a message template
$MeteredPOST https://hunter.io/message-templatesA `body` in plain text or HTML keeps its line breaks and paragraphs. It is stored as the editor's HTML (`<div>` and `<br>`), also when `message_format` is `text`, so a read after the write can differ from the submitted body.
Get a message template
$MeteredGET https://hunter.io/message-templates/{id}Replace a message template
$MeteredGET https://hunter.io/message-templates/{id}A `body` in plain text or HTML keeps its line breaks and paragraphs. It is stored as the editor's HTML (`<div>` and `<br>`), also when `message_format` is `text`, so a read after the write can differ from the submitted body.
Update a message template
$MeteredGET https://hunter.io/message-templates/{id}A `body` in plain text or HTML keeps its line breaks and paragraphs. It is stored as the editor's HTML (`<div>` and `<br>`), also when `message_format` is `text`, so a read after the write can differ from the submitted body.
Delete a message template
$MeteredGET https://hunter.io/message-templates/{id}List messages
$MeteredGET https://hunter.io/messagesEach message embeds the lead at its contact address. When that person has asked Hunter to delete their address, with a claim or a California DROP request, the address is left out: an outgoing message's `to` is null, and so are the lead's `email`, `confidence_score`, `verification.date` and `verification.status` (HUN-23599). The `message.*` webhooks leave it out the same way.
Send a one-off message
$MeteredPOST https://hunter.io/messagesThe sender must be available for outreach to the authenticated user. On the Free plan, extra or SMTP accounts retained only for Inbox Protection cannot send one-off messages. Selecting one returns 422 with error ID email_account_not_found.
List webhooks
$MeteredGET https://hunter.io/webhooksCreate a webhook
$MeteredPOST https://hunter.io/webhooksDelete webhooks by identifier (legacy)
$MeteredGET https://hunter.io/webhooksGet a webhook
$MeteredGET https://hunter.io/webhooks/{id}Replace a webhook
$MeteredGET https://hunter.io/webhooks/{id}Update a webhook
$MeteredGET https://hunter.io/webhooks/{id}Delete a webhook
$MeteredGET https://hunter.io/webhooks/{id}List API keys
$MeteredGET https://hunter.io/api-keysCreate an API key
$MeteredPOST https://hunter.io/api-keysReplace an API key
$MeteredGET https://hunter.io/api-keys/{id}Update an API key
$MeteredGET https://hunter.io/api-keys/{id}Delete an API key
$MeteredGET https://hunter.io/api-keys/{id}Checks
reachable
valid
2026-10-20T23:47:05.313Z
No settlement evidence found in chain signals.
Gateway routing
Score ≥70/100 — Cleared attestation pass. Route via Gateway before pay.
Claim this listing to upgrade to Cleared attestation.
Claim listing