API reference
First verify in under 5 minutes.
curl -s https://api.skink.dev/v1/verify \
-H "Authorization: Bearer $SKINK_KEY" \
-d '{"email":"jane@acme.com"}'
{ "status": "deliverable", "confidence": 0.91 }01 — setup
Get a key.
Sign up at app.skink.dev — 100 free, never-expiring credits, no card. Create an API key in the dashboard (shown once).
Server-side only — a leaked key spends your credits. If exposed, revoke it from the dashboard.
02 — request
Verify.
One POST, two headers, a JSON body — pick your language, that’s the whole integration.
curl -s https://api.skink.dev/v1/verify \
-H "Authorization: Bearer $SKINK_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"jane.doe@acme.com"}'03 — response
Read the result.
{
"email": "jane.doe@acme.com",
"status": "deliverable",
"sub_status": "catchall_resolved_exists",
"confidence": 0.91,
"accept_all": true,
"mx_provider": "microsoft365",
"signals": {
"is_catchall": true,
"catchall_resolution": "verified",
"reasons": [
"SMTP accepted (250)",
"Catch-all domain — SMTP alone cannot determine individual mailbox existence",
"Additional verification checks resolved mailbox existence"
]
},
"recommendation": "send"
}signals.reasons explains why — including how a catch-all verdict was reached.
04 — reference
Status reference.
| status | meaning |
|---|---|
| deliverable | Safe to send. |
| undeliverable | Hard bounce — don't send. |
| risky | Role address, full mailbox, or an unresolved catch-all. |
| unknown | Couldn't determine a verdict (timeout, greylist, DNS failure). |
sub_status values (stable keys for parsing — signals.reasons is the human-readable version):
catchall_resolvedcatchall_uncertainprobe_inconclusiveno_mxinvalid_mailboxmailbox_fulldisposablegreylist_timeoutdns_failuresmtp_throttledsyntax_errorHave a question this page didn’t answer?
See the FAQ