Skip to content

Commit 2577135

Browse files
waleedlatif1TheodoreSpeaksclaude
authored
feat(enrichment): add ZeroBounce, NeverBounce, and MillionVerifier email verification (#4854)
* feat(enrichment): add ZeroBounce, NeverBounce, and MillionVerifier email verification * docs gen * mdx * fix(zerobounce): handle 200-status API errors and guard JSON parsing * fix(byok): render new email-verify providers + raise hosted rate limits - Add zerobounce/neverbounce/millionverifier to the Enrichment PROVIDER_SECTIONS so they render in the workspace BYOK settings UI (they were in PROVIDERS + the API allowlist but no section listed them). - Raise ZeroBounce and MillionVerifier hosted per-workspace rate limits from 60 to 1200 req/min, sized against documented upstream ceilings (ZeroBounce 80k/10s; MillionVerifier 160/sec). NeverBounce stays at 60 pending its account-configured throttle. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Theodore Li <theo@sim.ai> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent ec256d2 commit 2577135

35 files changed

Lines changed: 1667 additions & 1 deletion

File tree

apps/docs/components/icons.tsx

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2391,6 +2391,97 @@ export function FindymailIcon(props: SVGProps<SVGSVGElement>) {
23912391
</svg>
23922392
)
23932393
}
2394+
export function ZeroBounceIcon(props: SVGProps<SVGSVGElement>) {
2395+
return (
2396+
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 180 51' fill='none'>
2397+
<path
2398+
fill='#171D21'
2399+
d='m12.1 46.6h-4.3c-0.6 0-1-0.7-0.6-1.1l6.8-8.2c0.1-0.1 0.1-0.3 0.1-0.4v-2.6c0-0.3-0.2-0.5-0.5-0.5h-12.7c-0.3 0-0.5 0.2-0.5 0.5v3.1c0 0.3 0.2 0.5 0.5 0.5h5.6c0.6 0 1 0.7 0.6 1.1l-7 8c-0.1 0.1-0.1 0.2-0.1 0.4v2.5c0 0.3 0.2 0.6 0.5 0.6h13.4c0.4 0 0.7-0.4 0.5-0.8l-1.8-2.9c-0.2-0.1-0.3-0.2-0.5-0.2z'
2400+
/>
2401+
<path
2402+
fill='#171D21'
2403+
d='m23.2 33.8c-4.9 0-8.9 3.3-8.8 8.5 0 5.2 3.5 8.5 8.8 8.5 2.9 0 5.4-1 7.1-2.6 0.2-0.2 0.2-0.5 0-0.7l-2-2.1c-0.2-0.2-0.5-0.2-0.7 0-1.1 0.8-2.3 1.3-3.7 1.3-1.7 0-3-0.8-3.8-2.2-0.2-0.4 0.1-1 0.6-1h10.5c0.3 0 0.6-0.2 0.6-0.5 0-5.5-2.5-9.2-8.6-9.2zm2.6 7h-5.1c-0.5 0-0.8-0.5-0.6-0.9 0.6-1.5 1.7-2.6 3.2-2.6 1.7-0.1 2.9 0.9 3.3 2.6 0 0.5-0.3 0.9-0.8 0.9z'
2404+
/>
2405+
<path
2406+
fill='#171D21'
2407+
d='m38.7 35.7v-1.3c0-0.4-0.2-0.6-0.5-0.6h-4.5c-0.3 0-0.5 0.3-0.5 0.6v15.5c0 0.3 0.2 0.6 0.5 0.6h4.3c0.3 0 0.6-0.2 0.6-0.5v-7.6c0-2.4 1.8-4 4.7-4h0.7c0.3 0 0.5-0.2 0.5-0.5v-3.7c0-0.3-0.3-0.6-0.6-0.5-1.6 0.2-2.9 1-3.9 2.3-0.4 0.7-1.3 0.4-1.3-0.3z'
2408+
/>
2409+
<path
2410+
fill='#171D21'
2411+
d='m53.5 33.8c-5.4 0-9.4 3.2-9.4 8.5s3.8 8.4 9.4 8.4c5.3 0 9.6-3.1 9.6-8.4 0-4.9-3.4-8.6-9.6-8.5zm-0.1 12.8c-2.2 0-4-1.7-4-4.3 0-2.5 1.5-4.4 4-4.4 2.3 0 4 1.8 4 4.4 0 2.5-1.5 4.3-4 4.3z'
2412+
/>
2413+
<path
2414+
fill='#171D21'
2415+
d='m81.2 33.6c-1.6 0-2.9 0.5-4 1.4-0.5 0.4-1.3 0.1-1.3-0.5v-6.6c0-0.3-0.2-0.5-0.5-0.5h-4.4c-0.3 0-0.6 0.2-0.6 0.5v21.9c0 0.3 0.2 0.6 0.5 0.6h4.5c0.3 0 0.5-0.2 0.5-0.5v-0.3c0-0.6 0.7-1 1.2-0.6 1.1 0.9 2.5 1.5 4.3 1.5 4.3 0 7.1-2.7 7.6-6.9 0.5-5.9-2.5-10-7.8-10zm-1.4 12.9c-2.1 0-3.9-1.8-3.9-4.4-0.2-2.3 1.6-4.4 3.7-4.4h0.2c2.3 0 3.8 1.8 3.8 4.4 0 2.5-1.7 4.4-3.8 4.4z'
2416+
/>
2417+
<path
2418+
fill='#171D21'
2419+
d='m98 33.8c-5 0-9 2.9-9 8.3s3.7 8.5 9 8.5 9.5-2.9 9.5-8.3c0-5.2-3.1-8.6-9.5-8.5zm0.1 12.8c-2.2 0-3.9-1.7-3.9-4.2s1.4-4.5 3.9-4.5c2.3 0 4 1.8 4 4.5 0 2.4-1.6 4.2-4 4.2z'
2420+
/>
2421+
<path
2422+
fill='#171D21'
2423+
d='m120.4 34.2v8.3c0 1.9-1.5 3.3-3.2 3.3s-3-1.1-3-2.9v-8.7c0-0.3-0.2-0.5-0.5-0.5h-4.5c-0.3 0-0.5 0.2-0.5 0.5v10.3c0 3.7 2.3 6 5.9 6 1.9 0 3.4-0.5 4.5-1.6 0.4-0.4 1.1-0.4 1.3 0.2l0.2 0.4c0.1 0.3 0.5 0.4 0.7 0.2l4.4-3c0.1-0.1 0.2-0.2 0.2-0.4v-12.1c0-0.3-0.2-0.5-0.5-0.5h-4.5c-0.3 0-0.5 0.2-0.5 0.5z'
2424+
/>
2425+
<path
2426+
fill='#171D21'
2427+
d='m140.3 33.6c-1.7 0-3.3 0.6-4.4 1.8-0.4 0.4-1.2 0.2-1.2-0.5v-0.5c0-0.3-0.2-0.6-0.5-0.6h-4.9c-0.3 0-0.6 0.2-0.6 0.5v11.9c0 0.2 0.1 0.3 0.2 0.4l4.7 3.3c0.4 0.2 0.9 0 0.9-0.5v-7.3c0-2.1 1.4-3.9 3.4-3.9 1.7 0 3 1.3 3 3v8.6c0 0.3 0.2 0.6 0.5 0.6h4.4c0.3 0 0.6-0.2 0.6-0.5v-10.3c0-3.7-2.4-6-6.1-6z'
2428+
/>
2429+
<path
2430+
fill='#171D21'
2431+
d='m156.9 46.4c-2.2 0.2-3.9-1.5-3.9-4.1 0-2.5 1.5-4.3 3.7-4.3 1.1 0 2.2 0.5 3.1 1.4 0.2 0.2 0.4 0.3 0.6 0.1l3.4-1.9c0.2-0.1 0.3-0.5 0.2-0.7-1.5-2.1-3.9-3.3-7.3-3.3-5.2 0-9.3 3.1-9.3 8.7 0 5.4 3.6 8.3 9 8.3 2.9 0 5.5-1.1 7.6-3.3 0.2-0.2 0.2-0.6-0.1-0.7l-2.9-2c-0.2-0.1-0.4-0.1-0.6 0.1-0.9 1-2 1.7-3.5 1.7z'
2432+
/>
2433+
<path
2434+
fill='#171D21'
2435+
d='m172 33.8c-5 0-8.4 3.1-8.4 8.5 0 5.3 3.3 8.4 8.5 8.4 2.9 0 5.1-0.7 6.5-2.3 0.4-0.3 0.4-0.8 0-1.1l-1.9-1.9c-0.2-0.2-0.5-0.2-0.7 0-0.9 0.8-2.2 1.3-3.6 1.3-1.7 0-3-0.8-3.6-2.2-0.2-0.4 0.1-1 0.6-1h9.7c0.3 0 0.5-0.2 0.5-0.5 0.1-6-2.5-9.2-7.6-9.2zm2.3 7.2h-4.8c-0.8 0-1-0.7-0.6-1.4 0.6-1.4 1.7-2.2 3.2-2.2 1.7 0 2.9 0.9 3.2 2.6 0 0.6-0.3 1-1 1z'
2436+
/>
2437+
<path
2438+
fill='#FADC41'
2439+
d='m80.8 15.2c-2.8 0.9-10.8 3.8-13.9 9.4l-1.1 3c-0.1 0.5-0.4 0.5-0.5 0-1.7-3.8-7.9-17.4-28-18.3-9.5-0.5-18.1 0.9-25.4 2.7-0.6 0.2-0.4 1.1 0.2 1 5.2-0.8 11.6-1.5 16.5-1.2 20.1 0.7 31.3 9.3 36.6 16.9l0.7 1.2v0.1c0 0.1 0.1 0.2 0.2 0.4 0.1 0.4 0.1 0.7 0.4 0.7s0.3-0.5 0.4-0.8l0.9-1.9c2.8-4.5 9.8-9.3 13.7-11.8 1-0.4 0.2-1.6-0.7-1.4z'
2440+
/>
2441+
<path
2442+
fill='#171D21'
2443+
d='m113.6 0.4c0-0.3-0.3-0.5-0.6-0.4l-23 4.8c-0.3 0-0.5 0.3-0.4 0.6l2.9 15c0.1 0.3 0.3 0.4 0.6 0.4l21.3-4.3-20.4 3c-0.3 0-0.6-0.2-0.7-0.5l-2.2-11.1c-0.1-0.4 0.3-0.8 0.7-0.6l11.4 4.5 8.8-8.7c0.3-0.3 0.8-0.1 0.9 0.3l1.7 8.1-1-11.1zm-4 3.2-5.9 6.6c-0.2 0.2-0.4 0.3-0.6 0.2l-8.9-3.6c-0.6-0.3-0.5-1.1 0.1-1.2l14.8-3c0.5-0.1 0.9 0.6 0.5 1z'
2444+
/>
2445+
</svg>
2446+
)
2447+
}
2448+
export function NeverBounceIcon(props: SVGProps<SVGSVGElement>) {
2449+
return (
2450+
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 50 51' fill='none'>
2451+
<path
2452+
fillRule='evenodd'
2453+
clipRule='evenodd'
2454+
d='M45.083.5C47.8.5 50 2.354 50 4.64v41.72c0 2.286-2.201 4.14-4.917 4.14H4.917C2.201 50.5 0 48.646 0 46.36V30.406c0-1.754 1.902-2.847 3.417-1.964l1.997 1.164a2.273 2.273 0 0 0 2.29-3.927l-6.576-3.832A2.273 2.273 0 0 1 0 19.885v-.465c0-1.78 1.954-2.87 3.468-1.933l20.335 12.578a2.273 2.273 0 0 0 2.398-.004l12.844-8.008a2.273 2.273 0 0 0-2.405-3.858L26.192 24.71a2.273 2.273 0 0 1-2.398.004L1.077 10.664A2.273 2.273 0 0 1 0 8.73V4.64C0 2.354 2.201.5 4.917.5h40.166Z'
2455+
fill='#1A6DF0'
2456+
/>
2457+
</svg>
2458+
)
2459+
}
2460+
export function MillionVerifierIcon(props: SVGProps<SVGSVGElement>) {
2461+
const id = useId()
2462+
const gradient = `millionverifier_${id}`
2463+
return (
2464+
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='-37 -15 50 50' fill='none'>
2465+
<path fill='#0C1516' d='M-35.7,8.2v22h5.8V14L-35.7,8.2z' />
2466+
<path fill='#0C1516' d='M-12.5,15.5v14.7h5.8V9.7L-12.5,15.5z' />
2467+
<g transform='translate(-36 -14)'>
2468+
<linearGradient
2469+
id={gradient}
2470+
gradientUnits='userSpaceOnUse'
2471+
x1='-903.2258'
2472+
y1='565.0618'
2473+
x2='-902.2228'
2474+
y2='564.5618'
2475+
gradientTransform='matrix(47.912 0 0 -32.672 43287.0039 18472.4121)'
2476+
>
2477+
<stop offset='0' stopColor='#20CC95' />
2478+
<stop offset='1' stopColor='#205CCC' />
2479+
</linearGradient>
2480+
<path fill={`url(#${gradient})`} d='M0.3,18.7l15.2,15.2L48.2,1.3l-32.7,25L0.3,18.7z' />
2481+
</g>
2482+
</svg>
2483+
)
2484+
}
23942485
export function FathomIcon(props: SVGProps<SVGSVGElement>) {
23952486
return (
23962487
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1000 1000' fill='none'>

apps/docs/components/ui/icon-mapping.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,12 @@ import {
124124
MicrosoftPlannerIcon,
125125
MicrosoftSharepointIcon,
126126
MicrosoftTeamsIcon,
127+
MillionVerifierIcon,
127128
MistralIcon,
128129
MondayIcon,
129130
MongoDBIcon,
130131
Neo4jIcon,
132+
NeverBounceIcon,
131133
NewRelicIcon,
132134
NotionIcon,
133135
ObsidianIcon,
@@ -201,6 +203,7 @@ import {
201203
YouTubeIcon,
202204
ZendeskIcon,
203205
ZepIcon,
206+
ZeroBounceIcon,
204207
ZoomIcon,
205208
ZoomInfoIcon,
206209
} from '@/components/icons'
@@ -342,12 +345,14 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
342345
microsoft_excel_v2: MicrosoftExcelIcon,
343346
microsoft_planner: MicrosoftPlannerIcon,
344347
microsoft_teams: MicrosoftTeamsIcon,
348+
millionverifier: MillionVerifierIcon,
345349
mistral_parse: MistralIcon,
346350
mistral_parse_v2: MistralIcon,
347351
mistral_parse_v3: MistralIcon,
348352
monday: MondayIcon,
349353
mongodb: MongoDBIcon,
350354
neo4j: Neo4jIcon,
355+
neverbounce: NeverBounceIcon,
351356
new_relic: NewRelicIcon,
352357
notion: NotionIcon,
353358
notion_v2: NotionIcon,
@@ -432,6 +437,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
432437
youtube: YouTubeIcon,
433438
zendesk: ZendeskIcon,
434439
zep: ZepIcon,
440+
zerobounce: ZeroBounceIcon,
435441
zoom: ZoomIcon,
436442
zoominfo: ZoomInfoIcon,
437443
}

apps/docs/content/docs/en/tools/meta.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,12 @@
115115
"microsoft_excel",
116116
"microsoft_planner",
117117
"microsoft_teams",
118+
"millionverifier",
118119
"mistral_parse",
119120
"monday",
120121
"mongodb",
121122
"neo4j",
123+
"neverbounce",
122124
"new_relic",
123125
"notion",
124126
"obsidian",
@@ -192,6 +194,7 @@
192194
"youtube",
193195
"zendesk",
194196
"zep",
197+
"zerobounce",
195198
"zoom",
196199
"zoominfo"
197200
]
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
---
2+
title: MillionVerifier
3+
description: Verify email deliverability and check account credits
4+
---
5+
6+
import { BlockInfoCard } from "@/components/ui/block-info-card"
7+
8+
<BlockInfoCard
9+
type="millionverifier"
10+
color="#00B67A"
11+
/>
12+
13+
{/* MANUAL-CONTENT-START:intro */}
14+
MillionVerifier is a high-volume, low-cost email verification service. Use this integration to verify an individual email in real time — it returns ok, catch-all, unknown, invalid, disposable, or unverified along with role-account and free-provider flags — and to check the verification credits remaining on your account. It's a cost-efficient choice for cleaning large lists before a campaign.
15+
{/* MANUAL-CONTENT-END */}
16+
17+
18+
## Usage Instructions
19+
20+
Integrate MillionVerifier to verify email deliverability in real time — classify addresses as valid, invalid, catch-all, disposable, or unknown — and check your remaining verification credits.
21+
22+
23+
24+
## Tools
25+
26+
### `millionverifier_verify_email`
27+
28+
Verify the deliverability of an email address. Uses one verification credit.
29+
30+
#### Input
31+
32+
| Parameter | Type | Required | Description |
33+
| --------- | ---- | -------- | ----------- |
34+
| `email` | string | Yes | Email address to verify \(e.g., john@example.com\) |
35+
| `apiKey` | string | Yes | MillionVerifier API Key |
36+
37+
#### Output
38+
39+
| Parameter | Type | Description |
40+
| --------- | ---- | ----------- |
41+
| `email` | string | The verified email address |
42+
| `status` | string | Verification status \(valid, invalid, catch_all, disposable, unknown, unverified\) |
43+
| `deliverable` | boolean | Whether the email is valid and safe to send |
44+
| `freeEmail` | boolean | Whether the address is on a free email provider |
45+
| `roleAccount` | boolean | Whether the address is a role account \(e.g., info@, sales@\) |
46+
| `didYouMean` | string | Suggested correction for a likely typo |
47+
| `subResult` | string | Additional MillionVerifier classification detail |
48+
49+
### `millionverifier_get_credits`
50+
51+
Retrieve the remaining verification credits for the authenticated account.
52+
53+
#### Input
54+
55+
| Parameter | Type | Required | Description |
56+
| --------- | ---- | -------- | ----------- |
57+
| `apiKey` | string | Yes | MillionVerifier API Key |
58+
59+
#### Output
60+
61+
| Parameter | Type | Description |
62+
| --------- | ---- | ----------- |
63+
| `credits` | number | Remaining verification credits |
64+
65+
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
---
2+
title: NeverBounce
3+
description: Verify email deliverability and check account credits
4+
---
5+
6+
import { BlockInfoCard } from "@/components/ui/block-info-card"
7+
8+
<BlockInfoCard
9+
type="neverbounce"
10+
color="#1A6DF0"
11+
/>
12+
13+
{/* MANUAL-CONTENT-START:intro */}
14+
NeverBounce is a real-time email verification and list-cleaning service. Use this integration to check whether an email address is deliverable — it classifies each address as valid, invalid, disposable, catch-all, or unknown and surfaces role-account and free-provider flags — and to read the paid and free verification credits left on your account. Verify addresses before sending to cut bounces and keep your domain reputation healthy.
15+
{/* MANUAL-CONTENT-END */}
16+
17+
18+
## Usage Instructions
19+
20+
Integrate NeverBounce to verify email deliverability in real time — classify addresses as valid, invalid, catch-all, disposable, or unknown — and check your remaining verification credits.
21+
22+
23+
24+
## Tools
25+
26+
### `neverbounce_verify_email`
27+
28+
Verify the deliverability of an email address. Uses one verification credit.
29+
30+
#### Input
31+
32+
| Parameter | Type | Required | Description |
33+
| --------- | ---- | -------- | ----------- |
34+
| `email` | string | Yes | Email address to verify \(e.g., john@example.com\) |
35+
| `apiKey` | string | Yes | NeverBounce API Key |
36+
37+
#### Output
38+
39+
| Parameter | Type | Description |
40+
| --------- | ---- | ----------- |
41+
| `email` | string | The verified email address |
42+
| `status` | string | Verification status \(valid, invalid, catch_all, disposable, unknown\) |
43+
| `deliverable` | boolean | Whether the email is valid and safe to send |
44+
| `roleAccount` | boolean | Whether the address is a role account \(e.g., info@, sales@\) |
45+
| `freeEmail` | boolean | Whether the address is on a free email provider |
46+
| `didYouMean` | string | Suggested correction for a likely typo |
47+
| `flags` | array | Raw NeverBounce flags for the address |
48+
49+
### `neverbounce_get_credits`
50+
51+
Retrieve the remaining paid and free verification credits for the account.
52+
53+
#### Input
54+
55+
| Parameter | Type | Required | Description |
56+
| --------- | ---- | -------- | ----------- |
57+
| `apiKey` | string | Yes | NeverBounce API Key |
58+
59+
#### Output
60+
61+
| Parameter | Type | Description |
62+
| --------- | ---- | ----------- |
63+
| `credits` | number | Remaining paid verification credits |
64+
| `freeCredits` | number | Remaining free verification credits |
65+
66+
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
---
2+
title: ZeroBounce
3+
description: Validate email deliverability and check account credits
4+
---
5+
6+
import { BlockInfoCard } from "@/components/ui/block-info-card"
7+
8+
<BlockInfoCard
9+
type="zerobounce"
10+
color="#00B894"
11+
/>
12+
13+
{/* MANUAL-CONTENT-START:intro */}
14+
ZeroBounce is a real-time email validation and deliverability service. Use this integration to validate individual email addresses before outreach — it flags invalid, catch-all, spamtrap, abuse, and do-not-mail addresses so you can drop risky contacts and protect your sender reputation — and to check the validation credits remaining on your account. ZeroBounce is the default verifier behind many email-finding waterfalls.
15+
{/* MANUAL-CONTENT-END */}
16+
17+
18+
## Usage Instructions
19+
20+
Integrate ZeroBounce to validate email deliverability in real time — detect invalid, catch-all, spamtrap, abuse, and do-not-mail addresses — and check your remaining validation credits.
21+
22+
23+
24+
## Tools
25+
26+
### `zerobounce_verify_email`
27+
28+
Validate an email address deliverability in real time. Uses one validation credit.
29+
30+
#### Input
31+
32+
| Parameter | Type | Required | Description |
33+
| --------- | ---- | -------- | ----------- |
34+
| `email` | string | Yes | Email address to validate \(e.g., john@example.com\) |
35+
| `apiKey` | string | Yes | ZeroBounce API Key |
36+
37+
#### Output
38+
39+
| Parameter | Type | Description |
40+
| --------- | ---- | ----------- |
41+
| `email` | string | The validated email address |
42+
| `status` | string | Validation status \(valid, invalid, catch_all, unknown, spamtrap, abuse, do_not_mail\) |
43+
| `deliverable` | boolean | Whether the email is valid and safe to send |
44+
| `subStatus` | string | Detailed sub-status from ZeroBounce |
45+
| `freeEmail` | boolean | Whether the address is on a free email provider |
46+
| `didYouMean` | string | Suggested correction for a likely typo |
47+
48+
### `zerobounce_get_credits`
49+
50+
Retrieve the remaining validation credits for the authenticated account.
51+
52+
#### Input
53+
54+
| Parameter | Type | Required | Description |
55+
| --------- | ---- | -------- | ----------- |
56+
| `apiKey` | string | Yes | ZeroBounce API Key |
57+
58+
#### Output
59+
60+
| Parameter | Type | Description |
61+
| --------- | ---- | ----------- |
62+
| `credits` | number | Remaining validation credits \(-1 if unavailable\) |
63+
64+

0 commit comments

Comments
 (0)