Docs
First verify in under 5 minutes.
1. 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.
2. Verify
curl -s https://api.skink.dev/v1/verify \
-H "Authorization: Bearer $SKINK_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"jane.doe@acme.com"}'3. 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.
4. 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_resolved_existscatchall_resolved_not_existscatchall_unresolvedno_mxinvalid_mailboxfull_mailboxrole_addressgreylist_timeoutseg_protecteddns_failuresmtp_connect_failedsyntax_errorCommon questions. See the FAQ on skink.dev for details.