Getting started

Skrap API documentation

Verify emails, find work emails, search leads and run bulk jobs from your own code. JSON over HTTPS with one API key header — the same engine and credit rules as the Skrap web app.

Quickstart

  1. 1

    Create an API key

    In the app, open Settings → API keys & MCP and create a key (paid plans). Export it as SKRAP_API_KEY so the samples below run as-is.

  2. 2

    Verify your first email

    Base URL https://api.skrap.ai. Send JSON, get JSON.

    curl -X POST "https://api.skrap.ai/api/v2/verify-email" \  -H "x-api-key: $SKRAP_API_KEY" \  -H "Content-Type: application/json" \  -d '{"email":"[email protected]"}'
  3. 3

    Read the result

    Branch on status. You are charged only for valid and risky answers.

    Response · 200
    1{2  "email": "[email protected]",3  "status": "valid",            // valid | risky | invalid | unknown4  "retryable": false,           // true: unknown for a temporary reason — try later5  "domainInfo": { "domain": "example.com", "hasMxRecords": true },6  "score": 95,                  // 95 valid · 10–70 risky (by risk reason) · 0 invalid · null unknown7  "checks": {8    "syntax": true,9    "mxFound": true,10    "smtp": "accepted",         // accepted | rejected | inconclusive | not_checked11    "catchAll": false,12    "disposable": false,13    "roleAccount": false,14    "freeProvider": false15  },16  "riskReasons": [],            // risky only: catch_all, catch_all_unconfirmed, role_account, disposable17  "didYouMean": null            // typo hint, e.g. "[email protected]" for "[email protected]"18}

Authentication

Every request carries your secret key in the x-api-key header.

Header
x-api-key: sk_live_…
  • Create a key in the app under Settings → API keys & MCP (paid plans). Keys are shown in full only to you; store them like passwords.
  • Send it on every request in the x-api-key header. Keys on a team spend the team's shared credits.
  • Optional per-key controls: an IP allowlist (exact IPs or IPv4 ranges such as 10.0.0.0/8) and an expiry date. Requests from other IPs get 403 IP_NOT_ALLOWED; expired keys get 401 API_KEY_EXPIRED.

Keep keys server-side

Never ship an API key in browser or mobile code. Call Skrap from your backend, or use an integration.

Credits

Credits are shared with the web app. You only pay for useful results.

ActionCost
Verify — Valid or Risky1 credit
Verify — Invalid or UnknownFree
Find — email found (Valid or Risky)1 credit
Find — not foundFree
Lead & company searchFree
Email of a search result1 credit when found
Reverse email lookup — person found2 credits
Person enrichment — profile found (+ work email)1 credit (+1)
Company enrichment — company found (+ headcount breakdown)1 credit (+1)
Company contacts1 credit per person
Enrichment — nothing foundFree
GET /api/v2/account returns the key owner's plan and spendable credits — a good "test connection" call.

Rate limits

PlanLimit
Free30 requests / minute per key
Professional120 requests / minute per key
Enterprise600 requests / minute per key
CustomAgreed with sales

Responses carry standard rate-limit headers. Over the limit you get 429 RATE_LIMITED with a Retry-After header — wait that many seconds and retry.

Verification statuses

StatusMeaning
validThe mailbox exists and accepts mail.
riskyDeliverable but uncertain — catch-all domains, full mailboxes, mail servers that would not confirm the mailbox, and best guesses in the company's email format. Send with care.
invalidThe address or domain cannot receive mail. Free.
unknownWe could not confirm the domain has a mail server (its DNS did not answer), or there was no address to give. Free. When retryable is true, the cause was temporary (try again later).

Errors

Errors use HTTP status codes and a JSON body with a stable code you can branch on.

Error · 402
1{2  "error": "Not enough credits",3  "code": "INSUFFICIENT_CREDITS",4  "details": { "required": 1, "available": 0 }5}
HTTPCodeMeaning
400VALIDATION_ERRORA field is missing or malformed; the message says which.
401INVALID_API_KEYMissing, unknown or revoked key.
401API_KEY_EXPIREDThe key passed its expiry date.
402INSUFFICIENT_CREDITSNot enough credits (details.required / details.available).
402MEMBER_CREDIT_LIMITYour team admin's monthly limit for your account is used up.
403PLAN_REQUIREDThe feature needs a higher plan (requiredPlan in the body).
403IP_NOT_ALLOWEDThe key's IP allowlist does not include the caller.
404NOT_FOUNDUnknown id (task, list, webhook).
429RATE_LIMITEDYour plan's per-minute limit for this key; wait for the Retry-After header.
429RATE_LIMIT_EXCEEDEDToo many requests at once (concurrency) or from one IP; back off and retry.
429ENRICH_DAILY_LIMITYour account's daily enrichment credit limit is used up; it resets at midnight UTC.
503ENRICH_UNAVAILABLEEnrichment is busy or briefly unavailable. Nothing was charged; retry later (Retry-After).
5xxINTERNAL_ERROROur side. Retry with back-off; nothing was charged.