Skip to content

Commit 50c0678

Browse files
committed
fix(hunter): align tools, block, and outputs with Hunter.io v2 API spec
1 parent 408669d commit 50c0678

9 files changed

Lines changed: 664 additions & 262 deletions

File tree

apps/docs/content/docs/en/tools/hunter.mdx

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: Hunter io
2+
title: Hunter.io
33
description: Find and verify professional email addresses
44
---
55

@@ -53,11 +53,16 @@ Returns companies matching a set of criteria using Hunter.io AI-powered search.
5353
| Parameter | Type | Description |
5454
| --------- | ---- | ----------- |
5555
| `results` | array | List of companies matching the search criteria |
56+
|`name` | string | Company name |
5657
|`domain` | string | Company domain |
57-
|`name` | string | Company/organization name |
58-
|`headcount` | number | Company size/headcount |
59-
|`technologies` | array | Technologies used by the company |
60-
|`email_count` | number | Total number of email addresses found |
58+
|`logo` | string | URL of the company logo |
59+
|`linkedin_url` | string | LinkedIn profile URL of the company |
60+
|`company_type` | string | Company type \(e.g., privately held, public company\) |
61+
|`industry` | string | Industry of the company |
62+
|`size` | string | Headcount range of the company |
63+
|`location` | string | Headquarters location |
64+
|`founded_year` | number | Year the company was founded |
65+
|`crunchbase_url` | string | Crunchbase URL of the company |
6166

6267
### `hunter_domain_search`
6368

@@ -86,8 +91,9 @@ Returns all the email addresses found using one given domain name, with sources.
8691
|`first_name` | string | Person's first name |
8792
|`last_name` | string | Person's last name |
8893
|`position` | string | Job title/position |
94+
|`position_raw` | string | Raw job title as found |
8995
|`seniority` | string | Seniority level \(junior, senior, executive\) |
90-
|`department` | string | Department \(executive, it, finance, management, sales, legal, support, hr, marketing, communication\) |
96+
|`department` | string | Department \(executive, it, finance, management, sales, legal, support, hr, marketing, communication, education, design, health, operations\) |
9197
|`linkedin` | string | LinkedIn profile URL |
9298
|`twitter` | string | Twitter handle |
9399
|`phone_number` | string | Phone number |
@@ -106,19 +112,7 @@ Returns all the email addresses found using one given domain name, with sources.
106112
| `accept_all` | boolean | Whether the server accepts all email addresses \(may cause false positives\) |
107113
| `pattern` | string | The email pattern used by the organization \(e.g., \{first\}, \{first\}.\{last\}\) |
108114
| `organization` | string | The organization/company name |
109-
| `description` | string | Description of the organization |
110-
| `industry` | string | Industry classification of the organization |
111-
| `twitter` | string | Twitter handle of the organization |
112-
| `facebook` | string | Facebook page URL of the organization |
113-
| `linkedin` | string | LinkedIn company page URL |
114-
| `instagram` | string | Instagram profile of the organization |
115-
| `youtube` | string | YouTube channel of the organization |
116-
| `technologies` | array | Technologies used by the organization |
117-
| `country` | string | Country where the organization is headquartered |
118-
| `state` | string | State/province where the organization is located |
119-
| `city` | string | City where the organization is located |
120-
| `postal_code` | string | Postal code of the organization |
121-
| `street` | string | Street address of the organization |
115+
| `linked_domains` | array | Other domains linked to the organization |
122116

123117
### `hunter_email_finder`
124118

@@ -147,8 +141,17 @@ Finds the most likely email address for a person given their name and company do
147141
| `verification` | object | Email verification information |
148142
|`date` | string | Date when the email was verified \(YYYY-MM-DD\) |
149143
|`status` | string | Verification status \(valid, invalid, accept_all, webmail, disposable, unknown\) |
144+
| `first_name` | string | Person's first name |
145+
| `last_name` | string | Person's last name |
150146
| `email` | string | The found email address |
151147
| `score` | number | Confidence score \(0-100\) for the found email address |
148+
| `domain` | string | Domain that was searched |
149+
| `accept_all` | boolean | Whether the server accepts all email addresses \(may cause false positives\) |
150+
| `position` | string | Job title/position |
151+
| `twitter` | string | Twitter handle |
152+
| `linkedin_url` | string | LinkedIn profile URL |
153+
| `phone_number` | string | Phone number |
154+
| `company` | string | Company name |
152155

153156
### `hunter_email_verifier`
154157

@@ -200,15 +203,24 @@ Enriches company data using domain name.
200203

201204
| Parameter | Type | Description |
202205
| --------- | ---- | ----------- |
203-
| `company` | object | Company information |
204-
|`name` | string | Company name |
205-
|`domain` | string | Company domain |
206-
|`industry` | string | Industry classification |
207-
|`size` | string | Company size/headcount range |
208-
|`country` | string | Country where the company is located |
209-
|`linkedin` | string | LinkedIn company page URL |
210-
|`twitter` | string | Twitter handle |
211-
| `person` | object | Person information \(undefined for companies_find tool\) |
206+
| `name` | string | Company name |
207+
| `domain` | string | Company domain |
208+
| `description` | string | Company description |
209+
| `industry` | string | Industry classification |
210+
| `sector` | string | Business sector |
211+
| `size` | string | Employee headcount range \(e.g., "11-50"\) |
212+
| `founded_year` | number | Year founded |
213+
| `location` | string | Headquarters location \(formatted\) |
214+
| `country` | string | Country \(full name\) |
215+
| `country_code` | string | ISO 3166-1 alpha-2 country code |
216+
| `state` | string | State/province |
217+
| `city` | string | City |
218+
| `linkedin` | string | LinkedIn handle \(e.g., company/hunterio\) |
219+
| `twitter` | string | Twitter handle |
220+
| `facebook` | string | Facebook handle |
221+
| `logo` | string | Company logo URL |
222+
| `phone` | string | Company phone number |
223+
| `tech` | array | Technologies used by the company |
212224

213225
### `hunter_email_count`
214226

apps/sim/app/(landing)/integrations/data/integrations.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6526,7 +6526,7 @@
65266526
{
65276527
"type": "hunter",
65286528
"slug": "hunter-io",
6529-
"name": "Hunter io",
6529+
"name": "Hunter.io",
65306530
"description": "Find and verify professional email addresses",
65316531
"longDescription": "Integrate Hunter into the workflow. Can search domains, find email addresses, verify email addresses, discover companies, find companies, and count email addresses.",
65326532
"bgColor": "#E0E0E0",

apps/sim/blocks/blocks/hunter.ts

Lines changed: 152 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { HunterResponse } from '@/tools/hunter/types'
44

55
export const HunterBlock: BlockConfig<HunterResponse> = {
66
type: 'hunter',
7-
name: 'Hunter io',
7+
name: 'Hunter.io',
88
description: 'Find and verify professional email addresses',
99
authMode: AuthMode.ApiKey,
1010
longDescription:
@@ -45,6 +45,15 @@ export const HunterBlock: BlockConfig<HunterResponse> = {
4545
type: 'short-input',
4646
placeholder: '10',
4747
condition: { field: 'operation', value: 'hunter_domain_search' },
48+
mode: 'advanced',
49+
},
50+
{
51+
id: 'offset',
52+
title: 'Offset',
53+
type: 'short-input',
54+
placeholder: '0',
55+
condition: { field: 'operation', value: 'hunter_domain_search' },
56+
mode: 'advanced',
4857
},
4958
{
5059
id: 'type',
@@ -57,6 +66,7 @@ export const HunterBlock: BlockConfig<HunterResponse> = {
5766
],
5867
value: () => 'all',
5968
condition: { field: 'operation', value: 'hunter_domain_search' },
69+
mode: 'advanced',
6070
},
6171
{
6272
id: 'seniority',
@@ -70,13 +80,15 @@ export const HunterBlock: BlockConfig<HunterResponse> = {
7080
],
7181
value: () => 'all',
7282
condition: { field: 'operation', value: 'hunter_domain_search' },
83+
mode: 'advanced',
7384
},
7485
{
7586
id: 'department',
7687
title: 'Department',
7788
type: 'short-input',
7889
placeholder: 'e.g., sales, marketing, engineering',
7990
condition: { field: 'operation', value: 'hunter_domain_search' },
91+
mode: 'advanced',
8092
},
8193
// Email Finder operation inputs
8294
{
@@ -109,6 +121,7 @@ export const HunterBlock: BlockConfig<HunterResponse> = {
109121
type: 'short-input',
110122
placeholder: 'Enter company name',
111123
condition: { field: 'operation', value: 'hunter_email_finder' },
124+
mode: 'advanced',
112125
},
113126
// Email Verifier operation inputs
114127
{
@@ -146,6 +159,54 @@ Return ONLY the search query text - no explanations.`,
146159
type: 'short-input',
147160
placeholder: 'Filter by domain',
148161
condition: { field: 'operation', value: 'hunter_discover' },
162+
mode: 'advanced',
163+
},
164+
{
165+
id: 'headcount',
166+
title: 'Headcount',
167+
type: 'dropdown',
168+
options: [
169+
{ label: 'Any', id: '' },
170+
{ label: '1-10', id: '1-10' },
171+
{ label: '11-50', id: '11-50' },
172+
{ label: '51-200', id: '51-200' },
173+
{ label: '201-500', id: '201-500' },
174+
{ label: '501-1000', id: '501-1000' },
175+
{ label: '1001-5000', id: '1001-5000' },
176+
{ label: '5001-10000', id: '5001-10000' },
177+
{ label: '10001+', id: '10001+' },
178+
],
179+
value: () => '',
180+
condition: { field: 'operation', value: 'hunter_discover' },
181+
mode: 'advanced',
182+
},
183+
{
184+
id: 'company_type',
185+
title: 'Company Type',
186+
type: 'dropdown',
187+
options: [
188+
{ label: 'Any', id: '' },
189+
{ label: 'Educational', id: 'educational' },
190+
{ label: 'Government Agency', id: 'government agency' },
191+
{ label: 'Non Profit', id: 'non profit' },
192+
{ label: 'Partnership', id: 'partnership' },
193+
{ label: 'Privately Held', id: 'privately held' },
194+
{ label: 'Public Company', id: 'public company' },
195+
{ label: 'Self Employed', id: 'self employed' },
196+
{ label: 'Self Owned', id: 'self owned' },
197+
{ label: 'Sole Proprietorship', id: 'sole proprietorship' },
198+
],
199+
value: () => '',
200+
condition: { field: 'operation', value: 'hunter_discover' },
201+
mode: 'advanced',
202+
},
203+
{
204+
id: 'technology',
205+
title: 'Technology',
206+
type: 'short-input',
207+
placeholder: 'e.g., react, salesforce',
208+
condition: { field: 'operation', value: 'hunter_discover' },
209+
mode: 'advanced',
149210
},
150211

151212
// Find Company operation inputs
@@ -172,6 +233,7 @@ Return ONLY the search query text - no explanations.`,
172233
type: 'short-input',
173234
placeholder: 'Enter company name',
174235
condition: { field: 'operation', value: 'hunter_email_count' },
236+
mode: 'advanced',
175237
},
176238
{
177239
id: 'type',
@@ -184,6 +246,7 @@ Return ONLY the search query text - no explanations.`,
184246
],
185247
value: () => 'all',
186248
condition: { field: 'operation', value: 'hunter_email_count' },
249+
mode: 'advanced',
187250
},
188251
// API Key (common)
189252
{
@@ -225,7 +288,14 @@ Return ONLY the search query text - no explanations.`,
225288
},
226289
params: (params) => {
227290
const result: Record<string, unknown> = {}
228-
if (params.limit) result.limit = Number(params.limit)
291+
for (const [key, value] of Object.entries(params)) {
292+
if (value === undefined || value === null || value === '') continue
293+
if (key === 'limit' || key === 'offset') {
294+
result[key] = Number(value)
295+
} else {
296+
result[key] = value
297+
}
298+
}
229299
return result
230300
},
231301
},
@@ -253,14 +323,88 @@ Return ONLY the search query text - no explanations.`,
253323
technology: { type: 'string', description: 'Technology filter' },
254324
},
255325
outputs: {
256-
results: { type: 'json', description: 'Search results' },
257-
emails: { type: 'json', description: 'Email addresses found' },
326+
// Domain Search
327+
domain: { type: 'string', description: 'Domain name' },
328+
organization: { type: 'string', description: 'Organization name (domain search)' },
329+
pattern: { type: 'string', description: 'Email pattern (e.g., {first}.{last})' },
330+
disposable: { type: 'boolean', description: 'Whether the domain is disposable' },
331+
webmail: { type: 'boolean', description: 'Whether the domain is a webmail provider' },
332+
accept_all: { type: 'boolean', description: 'Whether the server accepts all emails' },
333+
linked_domains: { type: 'array', description: 'Linked domains' },
334+
emails: {
335+
type: 'array',
336+
description:
337+
'List of emails found for the domain (value, type, confidence, first_name, last_name, position, seniority, department, linkedin, twitter, phone_number, sources, verification)',
338+
},
339+
// Email Finder
258340
email: { type: 'string', description: 'Found email address' },
259-
score: { type: 'number', description: 'Confidence score' },
260-
result: { type: 'string', description: 'Verification result' },
261-
status: { type: 'string', description: 'Status message' },
262-
total: { type: 'number', description: 'Total results count' },
341+
score: { type: 'number', description: 'Confidence score (0-100)' },
342+
first_name: { type: 'string', description: 'Person first name' },
343+
last_name: { type: 'string', description: 'Person last name' },
344+
position: { type: 'string', description: 'Job position' },
345+
linkedin_url: { type: 'string', description: 'LinkedIn profile URL (email-finder, discover)' },
346+
phone_number: { type: 'string', description: 'Phone number' },
347+
company: { type: 'string', description: 'Company name (email-finder)' },
348+
sources: {
349+
type: 'array',
350+
description:
351+
'Source pages where the email was found (domain, uri, extracted_on, last_seen_on, still_on_page)',
352+
},
353+
verification: {
354+
type: 'json',
355+
description: 'Email verification information (date, status)',
356+
},
357+
// Email Verifier
358+
result: {
359+
type: 'string',
360+
description: 'Deliverability result (deliverable, undeliverable, risky)',
361+
},
362+
status: {
363+
type: 'string',
364+
description: 'Verification status (valid, invalid, accept_all, webmail, disposable, unknown)',
365+
},
366+
regexp: { type: 'boolean', description: 'Email passes regex validation' },
367+
gibberish: { type: 'boolean', description: 'Whether email looks auto-generated' },
368+
mx_records: { type: 'boolean', description: 'MX records exist for the domain' },
369+
smtp_server: { type: 'boolean', description: 'SMTP server reachable' },
370+
smtp_check: { type: 'boolean', description: 'Email does not bounce' },
371+
block: { type: 'boolean', description: 'Whether the domain blocks verification' },
372+
// Discover
373+
results: {
374+
type: 'array',
375+
description:
376+
'Companies matching the search (name, domain, logo, linkedin_url, company_type, industry, size, location, founded_year, crunchbase_url)',
377+
},
378+
// Companies Find (flattened)
379+
name: { type: 'string', description: 'Company name (companies-find, discover)' },
380+
description: { type: 'string', description: 'Company description' },
381+
industry: { type: 'string', description: 'Industry classification' },
382+
sector: { type: 'string', description: 'Business sector' },
383+
size: { type: 'string', description: 'Employee headcount range (e.g., "11-50")' },
384+
founded_year: { type: 'number', description: 'Year founded' },
385+
location: { type: 'string', description: 'Headquarters location (formatted)' },
386+
country: { type: 'string', description: 'Country (full name)' },
387+
country_code: { type: 'string', description: 'ISO 3166-1 alpha-2 country code' },
388+
state: { type: 'string', description: 'State/province' },
389+
city: { type: 'string', description: 'City' },
390+
linkedin: { type: 'string', description: 'LinkedIn handle (companies-find)' },
391+
twitter: { type: 'string', description: 'Twitter handle' },
392+
facebook: { type: 'string', description: 'Facebook handle' },
393+
logo: { type: 'string', description: 'Company logo URL' },
394+
phone: { type: 'string', description: 'Company phone number' },
395+
tech: { type: 'array', description: 'Technologies used by the company' },
396+
// Email Count
397+
total: { type: 'number', description: 'Total email count' },
263398
personal_emails: { type: 'number', description: 'Personal emails count' },
264399
generic_emails: { type: 'number', description: 'Generic emails count' },
400+
department: {
401+
type: 'json',
402+
description:
403+
'Email count by department (executive, it, finance, management, sales, legal, support, hr, marketing, communication, education, design, health, operations)',
404+
},
405+
seniority: {
406+
type: 'json',
407+
description: 'Email count by seniority level (junior, senior, executive)',
408+
},
265409
},
266410
}

0 commit comments

Comments
 (0)