> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Hunter

The Hunter connector lets your AI agent act in each user's Hunter account. Each user connects their own Hunter API key once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 21 tools.

**Authentication:** API Key
**Categories:** CRM & Sales, Marketing
**Tools:** 21: 14 read, 5 write, 2 destructive
**Users sign in with:** API key
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=HUNTER)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Hunter connection

   In **AgentKit > Connections**, create a Hunter connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'hunter'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Hunter:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'hunter_get_account',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "hunter"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Hunter:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="hunter_get_account",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Hunter credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'hunter_count_emails',
  toolInput: {},
  connector: 'hunter',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="hunter_count_emails",
    tool_input={},
    connection_name="hunter",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `hunter_count_emails`

Count Emails · Read-only

Count how many email addresses Hunter holds for a domain or company, without returning the addresses. Free: uses no credits.
Returns the total, the personal and generic split, and counts by department and seniority, optionally also by job title. Department and seniority counts only include addresses where that value is known, so they can sum to less than the total.
Use hunter_count_emails to size a company before spending credits. Use hunter_domain_search to get the addresses themselves.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `company` (`string`, optional): Company name, used when the domain is unknown, for example Stripe. Supplying the domain gives better results; when both are sent, the domain is used. Provide domain or company. At least 3 characters.
- `domain` (`string`, optional): Company domain name, for example stripe.com. A URL or a leading @ is also accepted and reduced to the domain. Provide domain or company.
- `include_job_titles` (`string`, optional): Set to 1 to add counts by job title (data.job_titles). Omit to leave them out. One of: `1`.
- `type` (`string`, optional): Count only personal addresses (named people) or only generic, role-based addresses. Omit for both. One of: `personal`, `generic`.

Example input: `{}`

### `hunter_domain_search`

Domain Search · Read-only

Search the email addresses Hunter has found for a company, by domain or company name, with filters for seniority, department, job title, decision makers and verification status.
Returns the domain's email pattern and organization name, then a page of people with email, type, confidence score, name, position, seniority, department, LinkedIn, phone number and verification status; meta.results holds the total count. Uses 1 search credit when at least one email is returned.
Use hunter_domain_search to list many contacts at one company. Use hunter_find_email for one named person. Use hunter_count_emails to size a domain for free before searching.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `aggregations` (`boolean`, optional): When true, adds meta.aggregations with personal-email counts per department, the number of decision makers and the personal/generic split, all reflecting the filters.
- `company` (`string`, optional): Company name, used when the domain is unknown, for example Stripe. Supplying the domain gives better results; when both are sent, the domain is used. Provide domain or company.
- `decision_maker` (`boolean`, optional): true returns only the company's likely decision makers (people with buying authority, inferred from seniority and department); false returns only people classified as non-decision-makers. Omit for everyone.
- `department` (`string`, optional): Comma-separated departments to keep, for example sales,marketing. Values: executive, it, finance, management, sales, legal, support, hr, marketing, communication, education, design, health, operations, product, research, consulting, administrative, procurement. Unknown values are ignored; a list with no valid value returns 400.
- `domain` (`string`, optional): Company domain name, for example stripe.com. A URL or a leading @ is also accepted and reduced to the domain. Provide domain or company.
- `job_titles` (`string`, optional): Comma-separated job titles to keep. Titles match whole words and common equivalents (CTO matches Chief Technology Officer). Example: CTO,VP Sales.
- `limit` (`integer`, optional): Maximum number of email addresses to return, from 1 to 100. Hunter's default is 10. Example: 25.
- `offset` (`integer`, optional): Number of email addresses to skip, for paging. Increase it by the limit on each call. Default 0. On the Free plan, limit plus offset cannot exceed 10.
- `required_field` (`string`, optional): Comma-separated fields a person must have to be returned: full_name, position, phone_number. Example: full_name,position.
- `seniority` (`string`, optional): Comma-separated seniority levels to keep: junior, senior, executive. Example: senior,executive.
- `type` (`string`, optional): Return only personal addresses (a named person) or only generic, role-based addresses such as contact@. Omit for both. One of: `personal`, `generic`.
- `verification_status` (`string`, optional): Comma-separated verification statuses to keep: valid, accept_all, unknown. Example: valid.

Example input: `{}`

### `hunter_enrich_company`

Enrich Company · Read-only

Look up a company's profile from its domain name.
Returns name and legal name, description, industry and sector codes, founding year, headquarters address, headcount range, company type, technologies, funding rounds, parent company, social handles and Hunter's email counts. Returns 404 when Hunter has no data for the domain.
Use hunter_enrich_company when you have a domain. Use hunter_enrich_person_and_company when you start from a person's email. Use hunter_discover_companies to find companies by criteria.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `domain` (`string`, required): The company's domain name. Example: hunter.io.

Example input: `{"domain":"<domain>"}`

### `hunter_enrich_person`

Enrich Person · Read-only

Look up a person's profile from their email address or LinkedIn handle.
Returns full name, location and time zone, current employment (company domain and name, title, role, seniority) and social handles such as LinkedIn, X/Twitter, GitHub and Facebook. Returns 404 when Hunter has no data for the person and 451 when the person asked Hunter to stop processing their data.
Use hunter_enrich_person for the person only. Use hunter_enrich_person_and_company to also get their employer's company profile in one call. Use hunter_find_email when you have a name but no email.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `email` (`string`, optional): The person's email address. Provide email or linkedin_handle; when both are given, linkedin_handle is used. Example: matt@hunter.io.
- `linkedin_handle` (`string`, optional): Handle of the person's LinkedIn profile, the part after linkedin.com/in/. Provide email or linkedin_handle. Example: matttharp.

Example input: `{}`

### `hunter_enrich_person_and_company`

Enrich Person and Company · Read-only

Look up a person and their employer in one call, from the person's email address.
Returns a person object (name, location, employment, social handles) and a company object (description, industry, location, headcount, technologies, funding and social handles), the same shapes as hunter_enrich_person and hunter_enrich_company. Returns 404 when Hunter has no data for the email.
Use hunter_enrich_person_and_company when you need both. Use hunter_enrich_person or hunter_enrich_company for only one of them.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `email` (`string`, optional): The person's email address. Example: matt@hunter.io.
- `linkedin_handle` (`string`, optional): Handle of the person's LinkedIn profile, the part after linkedin.com/in/, used instead of email. Example: matttharp.

Example input: `{}`

### `hunter_find_email`

Find Email · Read-only

Find the most likely professional email address of one person, from their name plus the company domain or name, or from their LinkedIn handle.
Returns the email with a confidence score, its verification status (valid, accept_all or unknown), position, LinkedIn URL, phone number and the public web pages where it was found; email is null and no credit is used when nothing is found. A found email is also saved to your Hunter leads unless that is turned off for the account.
Use hunter_find_email for one known person. Use hunter_domain_search to list everyone at a company. Use hunter_verify_email to check an address you already have.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `company` (`string`, optional): Company name, used when the domain is unknown, for example Stripe. Supplying the domain gives better results; when both are sent, the domain is used. Provide domain, company or linkedin_handle.
- `domain` (`string`, optional): Company domain name, for example stripe.com. A URL or a leading @ is also accepted and reduced to the domain. Provide domain, company or linkedin_handle.
- `first_name` (`string`, optional): The person's first name. Required with last_name unless full_name or linkedin_handle is given. Example: Alexis.
- `full_name` (`string`, optional): The person's full name, used instead of first_name and last_name. Separate first and last names give better results. Example: Alexis Ohanian.
- `last_name` (`string`, optional): The person's last name. Required with first_name unless full_name or linkedin_handle is given. Example: Ohanian.
- `linkedin_handle` (`string`, optional): Handle of the person's LinkedIn profile, the part after linkedin.com/in/. On its own it is enough to search; no name or company needed. Example: alexisohanian.
- `max_duration` (`integer`, optional): Maximum time Hunter may spend on the search, in seconds, from 3 to 20. Longer allows more refined results. Default 10.

Example input: `{}`

### `hunter_get_account`

Get Account · Read-only

Get the Hunter account behind the API key: owner, plan and remaining credits.
Returns first and last name, email, plan name and level, team ID, the quota reset date, and usage per request type. When requests.credits is present the team has one credit pool (a search costs 1 credit, a verification 0.5, an enrichment 0.2) and searches and verifications are approximate views of it; otherwise they are separate quotas. Free.
Use hunter_get_account to check how many credits are left before a large search.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `hunter_get_lead`

Get Lead · Read-only

Get one saved lead by its ID.
Returns every field of the lead: email, name, position, company, industry, size, website, country, phone, LinkedIn, Twitter, notes, source, confidence score, verification and sending status, last activity, leads list and custom attributes.
Use hunter_get_lead when you have the lead ID. Use hunter_list_leads to search for a lead by email or name.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `lead_id` (`integer`, required): ID of the lead, as returned by hunter_list_leads or hunter_create_lead. Example: 12345.

Example input: `{"lead_id":12345}`

### `hunter_get_leads_list`

Get Leads List · Read-only

Get one leads list by its ID, with a page of the leads in it.
Returns the list's id, name, lead count, type and created date, plus its leads with their main fields.
Use hunter_get_leads_list to read one list. Use hunter_list_leads with leads_list_id to filter or search the leads in a list.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `leads_list_id` (`integer`, required): ID of the leads list, as returned by hunter_list_leads_lists or hunter_create_leads_list. Example: 42.
- `limit` (`integer`, optional): Maximum number of leads to return, from 1 to 100. Hunter's default is 20. Example: 25.
- `offset` (`integer`, optional): Number of leads to skip, for paging. Increase it by the limit on each call. Default 0.

Example input: `{"leads_list_id":42}`

### `hunter_list_campaign_recipients`

List Campaign Recipients · Read-only

List the recipients of one email campaign (sequence), in the order they were added.
Returns each recipient's email, name, position, company, website, lead ID and sending status: pending, error, sent, opened, clicked, replied, bounced, unsubscribed or canceled (with sending_status_comment giving the reason for canceled).
Use hunter_list_campaign_recipients to track outreach progress. Use hunter_list_campaigns to find the campaign ID first.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_id` (`integer`, required): ID of the campaign (sequence), as returned by hunter_list_campaigns. Example: 42.
- `limit` (`integer`, optional): Maximum number of recipients to return, from 1 to 100. Hunter's default is 20. Example: 25.
- `offset` (`integer`, optional): Number of recipients to skip, for paging. Increase it by the limit on each call. Default 0.

Example input: `{"campaign_id":42}`

### `hunter_list_campaigns`

List Campaigns · Read-only

List the email campaigns (called sequences in the Hunter app) in your account, newest first.
Returns each campaign's id, name, recipient count and whether it is editable, started, paused or archived. Free.
Use hunter_list_campaigns to find a campaign ID. Use hunter_list_campaign_recipients to see who is in a campaign and their sending status.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `archived` (`boolean`, optional): true returns only campaigns that have been archived.
- `limit` (`integer`, optional): Maximum number of campaigns to return, from 1 to 100. Hunter's default is 20. Example: 25.
- `offset` (`integer`, optional): Number of campaigns to skip, for paging. Increase it by the limit on each call. Default 0.
- `started` (`boolean`, optional): true returns only campaigns that have been started.

Example input: `{}`

### `hunter_list_leads`

List Leads · Read-only

List the leads saved in your Hunter account, newest first, with optional text search and attribute filters.
Returns leads with id, email, name, position, company, website, country, phone, LinkedIn, notes, verification status, sending status, leads list and created date; meta.total holds the total count. Free.
Use hunter_list_leads to browse or search saved leads. Use hunter_get_lead for one lead by ID. Use hunter_domain_search to find new contacts that are not saved yet.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `company` (`string`, optional): Filter by company name: contained text, * for any value, ~ for empty. Example: Stripe.
- `country_code` (`string`, optional): Filter by country, as an ISO 3166-1 alpha-2 code. Example: US.
- `email` (`string`, optional): Filter by email. Any text matches leads whose email contains it; * matches leads with any email; ~ matches leads with no email. Example: @stripe.com.
- `first_name` (`string`, optional): Filter by first name: contained text, * for any value, ~ for empty. Example: Jeremy.
- `industry` (`string`, optional): Filter by company industry: contained text, * for any value, ~ for empty. Example: Technology.
- `last_name` (`string`, optional): Filter by last name: contained text, * for any value, ~ for empty. Example: Hoon.
- `leads_list_id` (`integer`, optional): Only return leads in this leads list. Example: 42.
- `limit` (`integer`, optional): Maximum number of leads to return, from 1 to 1000. Hunter's default is 20. Example: 25.
- `offset` (`integer`, optional): Number of leads to skip, for paging, from 0 to 100000. Default 0.
- `position` (`string`, optional): Filter by job position: contained text, * for any value, ~ for empty. Example: CEO.
- `query` (`string`, optional): Free-text search over first name, last name, company, website and email. Every word must match one of these fields. An email address returns only the lead with that exact email. Example: stripe.
- `sort` (`string`, optional): Order of the leads: newest (default), oldest, or relevance (best matches first when query or position is set). One of: `newest`, `oldest`, `relevance`.
- `verification_status` (`array`, optional): Only return leads with one of these email verification statuses: accept_all, disposable, invalid, unknown, valid, webmail, pending. Example: ["valid", "accept_all"].
- `website` (`string`, optional): Filter by company website: contained text, * for any value, ~ for empty. Example: stripe.com.

Example input: `{}`

### `hunter_list_leads_lists`

List Leads Lists · Read-only

List the leads lists in your Hunter account, newest first.
Returns each list's id, name, lead count, type (static lists hold saved leads; dynamic lists are defined by filters) and created date; meta.total holds the total count. Free.
Use hunter_list_leads_lists to find a list ID. Use hunter_get_leads_list to read one list and its leads.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `limit` (`integer`, optional): Maximum number of lists to return, from 1 to 100. Hunter's default is 20. Example: 25.
- `offset` (`integer`, optional): Number of lists to skip, for paging. Increase it by the limit on each call. Default 0.

Example input: `{}`

### `hunter_verify_email`

Verify Email · Read-only

Verify whether an email address is deliverable by checking its format, domain MX records and mail server.
Returns status (valid, invalid, accept_all, webmail, disposable or unknown), a deliverability score, each check (regexp, gibberish, MX records, SMTP server, SMTP check, accept-all, block) and any public sources. HTTP 202 means the check is still running: call again with the same email, counted once. HTTP 222 means the remote mail server failed the check; retry later. A valid or accept_all address is also saved to your leads unless that is turned off. Uses 0.5 credit.
Use hunter_verify_email for an address you already have. Use hunter_find_email to discover an address from a person's name.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `email` (`string`, required): The email address to verify. Example: patrick@stripe.com.
- `domain_metadata` (`string`, optional): Set to 1 to add metadata about the email's domain (company name, whether it is webmail) to meta. Omit to leave it out. One of: `1`.

Example input: `{"email":"<email>"}`

### `hunter_create_lead`

Create Lead · Write

Save a new lead to your Hunter account, or add an existing lead with the same email to another list.
Returns the saved lead with its id, all fields and its leads list. Free.
Use hunter_create_lead to save a contact. Use hunter_update_lead to change a lead you already have.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `email` (`string`, required): Email address of the lead. Example: alexis@reddit.com. If a lead with this email already exists on your team, it is added to the requested list instead of duplicated.
- `company` (`string`, optional): Name of the company the lead works at. Example: Reddit.
- `company_industry` (`string`, optional): Sector of the company. Any text is accepted; Hunter recommends one of: 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, Travel.
- `company_size` (`string`, optional): Size of the company, as free text. Example: 201-500 employees.
- `confidence_score` (`integer`, optional): Estimated probability (0 to 100) that the email is correct, such as the score from hunter_find_email. Example: 97.
- `country_code` (`string`, optional): Country of the lead, as an ISO 3166-1 alpha-2 code. Example: US.
- `custom_attributes` (`object`, optional): Values for your team's custom attributes, keyed by attribute slug. An unknown slug returns 422. Example: {"customer_id": "cus-1234abcd"}.
- `department` (`string`, optional): Department the lead works in, for example sales. A display label such as Sales is stored as sales.
- `first_name` (`string`, optional): First name of the lead. Example: Alexis.
- `last_name` (`string`, optional): Last name of the lead. Example: Ohanian.
- `leads_list_id` (`integer`, optional): ID of the leads list to put the lead in. If neither this nor leads_list_name is set, the lead goes into the most recently created list. Cannot be combined with leads_list_name (422). Example: 42.
- `leads_list_name` (`string`, optional): Name of a leads list to put the lead in (up to 255 characters). An existing list with that name is reused (case-insensitive); otherwise a new list is created. Cannot be combined with leads_list_id (422). Example: Q4 prospects.
- `linkedin_url` (`string`, optional): URL of the lead's public LinkedIn profile. Example: https://www.linkedin.com/in/alexisohanian.
- `notes` (`string`, optional): Personal notes about the lead. Example: Met at SaaStr 2026.
- `phone_number` (`string`, optional): Phone number of the lead. Example: +1 415 555 0100.
- `position` (`string`, optional): Job title of the lead. Example: Cofounder.
- `source` (`string`, optional): Where the lead was found. Example: Conference list.
- `twitter` (`string`, optional): Twitter (X) handle of the lead. Example: alexisohanian.
- `website` (`string`, optional): Domain name of the lead's company. Example: reddit.com.

Example input: `{"email":"<email>"}`

### `hunter_create_leads_list`

Create Leads List · Write

Create a new static leads list.
Returns the new list with its id, name and lead count. Free.
Use hunter_create_leads_list before saving leads into a new list. Use hunter_create_lead with leads_list_name to create a list and save a lead in one call.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Name of the leads list. Example: Q4 prospects.
- `leads_list_folder_id` (`integer`, optional): ID of the folder to put the list in. Omit to leave the list unfiled. Example: 7.

Example input: `{"name":"<name>"}`

### `hunter_discover_companies`

Discover Companies · Write

Search Hunter's company database with a natural-language query or structured filters: headquarters location, industry, headcount, company type, keywords, technology, funding, job openings, specific organizations or lookalikes. Free: uses no credits.
Returns up to 100 companies per page with domain, name, email counts, industry, location, headcount, company type and technologies; meta.results holds the total and meta.filters the filters Hunter applied, which you can resend to page through a natural-language search consistently.
Use hunter_discover_companies to build a target company list. Then use hunter_domain_search on a returned domain to get contacts, or hunter_enrich_company for a full profile.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `company_type` (`object`, optional): Company types to include and/or exclude. Values: educational, educational institution, government agency, non profit, partnership, privately held, public company, self employed, self owned, sole proprietorship. Example: {"exclude": ["non profit", "government agency"]}.
- `funding` (`object`, optional): Funding filters. series is a list of pre_seed, seed, pre_series_a, series_a, pre_series_b, series_b, pre_series_c, series_c+ or other; amount is a range with from and to in USD; date is an inclusive range with from and/or to in YYYY-MM-DD. Premium plans only. Example: {"series": ["series_a", "series_b"], "date": {"from": "2025-01-01"}}.
- `headcount` (`array`, optional): Company size ranges to include, as Hunter's ranges: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+. Example: ["11-50", "51-200"].
- `headquarters_location` (`object`, optional): Headquarters locations to include and/or exclude. Each location sets a continent (Europe, Asia, North America, Africa, Antarctica, South America, Oceania), a business_region (AMER, EMEA, APAC, LATAM), or a country as an ISO 3166-1 alpha-2 code with an optional state and city. A city needs a country; state codes are US codes such as CA or ISO 3166-2 codes such as FR-IDF. Example: {"include": [{"continent": "Europe"}, {"country": "US", "state": "CA"}], "exclude": [{"country": "BE"}]}.
- `industry` (`object`, optional): Industries to include and/or exclude, using Hunter's industry names (see https://hunter.io/api/industries.json). Example: {"include": ["Software Development"], "exclude": ["Staffing and Recruiting"]}.
- `job_openings` (`object`, optional): Filter by open job postings. Set hiring to true for companies hiring now, or narrow by department (case-sensitive names such as sales, engineering, marketing), job_title include/exclude keyword lists, posted_date (last7d, last30d, last90d) and an open_roles range with from and/or to. Set include_closed_roles to true to also match closed roles. Example: {"hiring": true, "department": ["sales"], "posted_date": "last30d"}.
- `keywords` (`object`, optional): Keywords to include and/or exclude, and whether a company must match all or any of them (default all). Example: {"include": ["saas", "crm"], "match": "any"}.
- `limit` (`integer`, optional): Number of companies to return, from 1 to 100. Default 100.
- `offset` (`integer`, optional): Number of companies to skip, up to 10000. Only plans with Discover paging (Premium) can set an offset above 0; others get a 400 pagination_error.
- `organization` (`object`, optional): Specific companies to select, by domain and/or name. Example: {"domain": ["hunter.io", "stripe.com"], "name": ["Intercom"]}.
- `query` (`string`, optional): Natural-language description of the companies you want; an AI assistant turns it into filters. Required unless at least one filter is set. Up to 2000 characters. Example: Companies in Europe that specialize in software development.
- `similar_to` (`object`, optional): Find companies similar to one company, by domain or name; the domain is used if both are given. Premium plans only. Example: {"domain": "hunter.io"}.
- `technology` (`object`, optional): Technologies to include and/or exclude, using Hunter's technology slugs (see https://hunter.io/api/technologies.json), and whether to match all or any (default all). Premium plans only. Example: {"include": ["stripe", "hubspot"], "match": "any"}.
- `year_founded` (`object`, optional): Founding years to include or exclude, or a range with from and/or to. Premium plans only. Example: {"from": 2010, "to": 2020}.

Example input: `{}`

### `hunter_update_lead`

Update Lead · Write

Update fields of an existing lead. Only the fields you send change.
Returns an empty response (HTTP 204) on success.
Use hunter_update_lead to edit a saved lead by ID. Use hunter_create_lead to save a new one. Use hunter_get_lead to read the result.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `lead_id` (`integer`, required): ID of the lead, as returned by hunter_list_leads or hunter_create_lead. Example: 12345.
- `company` (`string`, optional): Name of the company the lead works at. Example: Reddit.
- `company_industry` (`string`, optional): Sector of the company. Any text is accepted; Hunter recommends one of: 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, Travel.
- `company_size` (`string`, optional): Size of the company, as free text. Example: 201-500 employees.
- `confidence_score` (`integer`, optional): Estimated probability (0 to 100) that the email is correct, such as the score from hunter_find_email. Example: 97.
- `country_code` (`string`, optional): Country of the lead, as an ISO 3166-1 alpha-2 code. Example: US.
- `custom_attributes` (`object`, optional): Values for your team's custom attributes, keyed by attribute slug. Only the keys you send change; send an empty string to clear one. An unknown slug returns 422. Example: {"customer_id": "cus-1234abcd"}.
- `department` (`string`, optional): Department the lead works in, for example sales. A display label such as Sales is stored as sales.
- `email` (`string`, optional): Email address of the lead. Example: alexis@reddit.com.
- `first_name` (`string`, optional): First name of the lead. Example: Alexis.
- `last_name` (`string`, optional): Last name of the lead. Example: Ohanian.
- `leads_list_id` (`integer`, optional): ID of the leads list to put the lead in. Moves the lead to this list. Example: 42.
- `linkedin_url` (`string`, optional): URL of the lead's public LinkedIn profile. Example: https://www.linkedin.com/in/alexisohanian.
- `notes` (`string`, optional): Personal notes about the lead. Example: Met at SaaStr 2026.
- `phone_number` (`string`, optional): Phone number of the lead. Example: +1 415 555 0100.
- `position` (`string`, optional): Job title of the lead. Example: Cofounder.
- `source` (`string`, optional): Where the lead was found. Example: Conference list.
- `twitter` (`string`, optional): Twitter (X) handle of the lead. Example: alexisohanian.
- `website` (`string`, optional): Domain name of the lead's company. Example: reddit.com.

Example input: `{"lead_id":12345}`

### `hunter_update_leads_list`

Update Leads List · Write

Rename a leads list or move it to another folder.
Returns an empty response (HTTP 204) on success.
Use hunter_update_leads_list to change a list's name or folder. Use hunter_create_leads_list for a new list.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `leads_list_id` (`integer`, required): ID of the leads list, as returned by hunter_list_leads_lists or hunter_create_leads_list. Example: 42.
- `name` (`string`, required): New name of the leads list. Example: Q4 prospects (EMEA).
- `leads_list_folder_id` (`integer`, optional): ID of the folder to move the list to. Omit to keep the current folder. Example: 7.

Example input: `{"leads_list_id":42,"name":"<name>"}`

### `hunter_delete_lead`

Delete Lead · Destructive

Permanently delete a saved lead by its ID.
Returns an empty response (HTTP 204) on success.
Use hunter_delete_lead to remove one lead. Use hunter_delete_leads_list to remove a whole list.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `lead_id` (`integer`, required): ID of the lead, as returned by hunter_list_leads or hunter_create_lead. Example: 12345.

Example input: `{"lead_id":12345}`

### `hunter_delete_leads_list`

Delete Leads List · Destructive

Permanently delete a leads list by its ID.
Returns an empty response: HTTP 204 when deleted, or 202 when a large list is queued for deletion in the background.
Use hunter_delete_leads_list to remove a whole list. Use hunter_delete_lead to remove one lead.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `leads_list_id` (`integer`, required): ID of the leads list, as returned by hunter_list_leads_lists or hunter_create_leads_list. Example: 42.

Example input: `{"leads_list_id":42}`

## Related

Other CRM & Sales connectors ([all 103](/agentkit/connectors/?category=crm-sales)):

- [Insightly](/agentkit/connectors/insightly/): Scalekit connector, API key, 108 tools
- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Salesforce](/agentkit/connectors/salesforce/): Scalekit connector, OAuth, 74 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
