apikey, which is how the verification endpoint documents it.
Things to know before you call:
- A refused key and a spent balance are both a 403. A refused key carries
code: "FORBIDDEN"; a spent balance carries onlymessage: "Insufficient balance", which the plugin reports asINSUFFICIENT_BALANCE(isQuotaError), not as an auth error. The plugin also throws on any200whose body says"success": false, so a verification result with every field missing is never returned as an answer. - Testing without credits. A Sandbox key (it starts with
test_) returns mock results and spends nothing. Addresses such asrejected-email@example.com,low-quality@example.comorinsufficient-balance@example.comforce each result; anything else comes backdeliverable. verify.verifyspends one credit. It is a write for that reason.verify.disposableis free and uses Kickbox’s open host, which takes no key.- The four results.
deliverablemeans accepted by the SMTP server;undeliverablerejected;riskyaccepted but with a quality problem such as an accept-all domain;unknownwhen the server could not be reached.reasonsays which of those applied. - Accept-all domains.
accept_all: truemeans the domain accepts every address, sodeliverablethere is weaker evidence than elsewhere. Kickbox usually reports that asrisky. - The Sendex score runs from 0 (no quality) to 1 (perfect) and is a different measure from the verdict: a
deliverableaddress can still score low. - No automatic replay of a paid check. A verification that times out or loses its connection is not retried, because Kickbox may already have charged for it; retry it yourself if you want to. A 429 or a 5xx, which carry no verdict, are retried. The free disposable check is retried on any of these.
- A refused key is not retried. Regenerating a key in the dashboard kills the old one, so a 403 usually means it was replaced.
- The EU host. An account created at
app.eu.kickbox.comis served fromapi.eu.kickbox.com, so set theregionoption toeuor every verification answers 403FORBIDDEN. A key from one host is refused on the other. - The address never reaches a log. The plugin logs the domain and the verdict rather than the address, because an email is personal data.
- Webhooks. The plugin does not receive Kickbox webhooks; none are configured here.
- 2 typed API operations
Setup
1
Install
2
Add the plugin
corsair.ts
multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.3
Choose authentication
- API Key (Recommended)
Store the Kickbox API key before the first call: More: API Key
pnpm corsair setup --plugin=kickbox --tenant=acme api_key=<your-key> (leave out --tenant without multiTenancy), or pass it as key in the plugin options. With Hub, each tenant enters their own key on the connect page. See API key auth.4
Connect a tenant
Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.
Example API calls
Check a disposable domainWhat’s next
API reference
Every
kickbox.api.* operation with input and output types.Connect / OAuth
createLink, Hub delivery, and tenant connect flows.
Use with agents
Expose this plugin’s operations as MCP tools.