{"components":{"responses":{},"schemas":{},"securitySchemes":{"bearerAuth":{"description":"Tenant API key. Use your `vlt_…` key from the portal.","scheme":"bearer","type":"http"}}},"info":{"description":"Pay-per-use email and phone validation API.\n\nAll endpoints require a Bearer API key (`Authorization: Bearer <api_key>`).\nRequests are billed against your prepaid wallet, which holds credits\n(1 credit = $0.0005 (2,000 credits = $1)). Insufficient balance returns HTTP 402.\n\n**Base URL:** https://getvalidator.io\n\n## Services catalog\n\nRetail operations and selectors are sourced from Admin → Services (`billing_rates`).\n\n| Service | Operation | Price | Method | Path | How to select |\n| --- | --- | --- | --- | --- | --- |\n| Phone check | `check_phone` | 2 credits ($0.0010) | POST | `/v1/check/phone` | — (send the identifier only) |\n| Carrier check | `check_phone_carrier` | 49 credits ($0.0245) | POST | `/v1/check/phone` | `carrierCheck: true` |\n| Ported check | `check_phone_ported` | 8 credits ($0.0040) | POST | `/v1/check/phone` | `portedCheck: true` |\n| Email check | `check_email` | 1 credit ($0.0005) | POST | `/v1/check/email` | — (send the identifier only) |\n| Email verify | `check_email_verify` | 20 credits ($0.0100) | POST | `/v1/check/email` | `emailVerify: true` |\n| Email premium | `check_email_premium` | 77 credits ($0.0385) | POST | `/v1/check/email` | `emailPremium: true` |\n| DNC screening | `check_phone_dnc` | 79 credits ($0.0395) | POST | `/v1/check/phone` | `dncCheck: true` |\n| check_phone_dnc_overlay | `check_phone_dnc_overlay` | 79 credits ($0.0395) | POST | `/v1/check/phone` | `dncCheck: true` |\n| Live line | `check_phone_active` | 28 credits ($0.0140) | POST | `/v1/check/phone` | `activeCheck: true` |\n| Caller name (CNAM) | `check_phone_caller_name` | 12 credits ($0.0060) | POST | `/v1/check/phone` | `callerName: true` |\n| Phone premium | `check_phone_premium` | 390 credits ($0.1950) | POST | `/v1/check/phone` | `phonePremium: true` |\n| Session start | `session_start` | 1 credit ($0.0005) | POST | `/v1/sessions` | — (send the identifier only) |\n| Email resend | `email_send` | 1 credit ($0.0005) | POST | `/v1/sessions/resend` | `channel=email` |\n| SMS OTP | `sms_otp` | 100 credits ($0.0500) | POST | `/v1/sessions/resend` | `channel=phone` |\n","title":"Validator API","version":"1.0.0"},"openapi":"3.0.0","paths":{"/v1/check":{"post":{"callbacks":{},"deprecated":false,"description":"Pick the base check and tick components. At least one of `phone` or `email` is required; each half runs and bills on its own.\n\n| Option | Component | Effect | Already includes | Response fields |\n| --- | --- | --- | --- | --- |\n| `carrierCheck` | Normalized carrier | replaces the base | portedCheck | carrierName, portability |\n| `portedCheck` | Ported check | replaces the base | — | portability |\n| `dncCheck` (with `includeTcpaScreening`) | DNC screening | adds to the base | — | dnc |\n| `activeCheck` | Live line | adds to the base | — | active |\n| `callerName` | Caller name | adds to the base | — | callerName |\n| `phonePremium` | Premium | replaces the base | carrierCheck, portedCheck, dncCheck, activeCheck, callerName | carrierName, portability, active, dnc, callerName |\n| `emailVerify` | Verify | replaces the base | — | mailboxVerified |\n| `emailPremium` | Premium | replaces the base | emailVerify | mailboxVerified, catchAll, abuseScore |\n\nOrder of work: the body is validated, then cached answers, then internal\nreference data and free checks, then — only for what is still unanswered —\nvendor lookups, run concurrently. A conclusive internal answer is served\nwithout any vendor call.\n\nBilling follows the outcome. Every completed check is billed at its\npublished price, `valid` or `invalid`. A component whose lookup produced no\nanswer is listed in `unavailable` and is not billed. A replacement tier that\ncannot complete charges the base check alone. `dncCheck` is billed by what\nsettled it: the cheaper list-settled operation when the account's own\nuploaded registry list answered, the on-demand operation when a lookup (or\na cached lookup answer) did; `billing.operations` names the one charged.\n`GET /v1/pricing` is the price list; never hardcode a price.\n\nAn option enabled for a family whose identifier is missing is a 400 —\nthe caller expected that check to run. Unknown options are a 400 that\nlists the valid ones; an option sold but not currently priced is a 503.\n\nSet `test` to `true` to exercise auth and routing without live lookups or\nwallet charges; the halves are synthetic.\n\nRequest cadence: at most 2 requests\nper second per API key, on every `/v1` endpoint. A request over the cadence\nis a 429 with a `Retry-After` header; it never runs and is never billed.\nSend batches at a steady pace rather than in bursts. Identical requests in\nflight at the same moment (same identifier, base check and upgrades) share\none lookup and receive the same answer; each completed check is billed.\n","operationId":"checkBoth","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"activeCheck":{"default":false,"description":"Live line: Confirms the number is live and assigned to a subscriber — not that the handset is answering right now. Adds to the base check and bills on top.","type":"boolean"},"callerName":{"default":false,"description":"Caller name: Caller name lookup; also included with Premium. Adds to the base check and bills on top.","type":"boolean"},"carrierCheck":{"default":false,"description":"Normalized carrier: A normalized name for the current serving carrier, with ported status. Replaces the base check and already includes portedCheck — selecting those too is one charge.","type":"boolean"},"checkDnsbl":{"default":true,"description":"Email: run the DNSBL blocklist check.","type":"boolean"},"checkExchange":{"default":true,"description":"Phone: reject unassigned area code + exchange from reference data.","type":"boolean"},"checkMx":{"default":true,"description":"Email: run the MX record check.","type":"boolean"},"dncCheck":{"default":false,"description":"DNC screening: Federal and state DNC, litigator and complainer signals. Adds to the base check and bills on top.","type":"boolean"},"email":{"description":"Email address","example":"alex@example.com","type":"string"},"emailPremium":{"default":false,"description":"Premium: Mailbox verification, deliverability, catch-all and abuse scoring. Replaces the base check and already includes emailVerify — selecting those too is one charge.","type":"boolean"},"emailVerify":{"default":false,"description":"Verify: Mailbox-level verification. Replaces the base check; its price covers the base's work.","type":"boolean"},"includeTcpaScreening":{"default":false,"description":"With `dncCheck`, upgrades it to dnc overlay.","type":"boolean"},"phone":{"description":"Phone number, E.164 or US national format","example":"+18134696697","type":"string"},"phonePremium":{"default":false,"description":"Premium: Every phone upgrade: carrier, ported status, live line, DNC, TCPA and caller name. Replaces the base check and already includes carrierCheck, portedCheck, dncCheck, activeCheck, callerName — selecting those too is one charge.","type":"boolean"},"portedCheck":{"default":false,"description":"Ported check: Live line type, ported status and ported date. Replaces the base check; its price covers the base's work.","type":"boolean"},"rejectSmsGateway":{"default":false,"description":"Phone: reject email-to-SMS gateway numbers.","type":"boolean"},"skipBlocklist":{"default":false,"description":"Skip the tenant blocklist.","type":"boolean"},"test":{"default":false,"description":"Integration test mode: synthetic result, no lookups, no charge.","type":"boolean"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"billing":{"properties":{"charged":{"type":"boolean"},"operations":{"description":"Catalog operations debited, base first","items":{"type":"string"},"type":"array"},"totalCredits":{"description":"The same total in credits (1 credit = 500 micro-USD = $0.0005). A whole number at catalog prices; custom pricing may add up to three decimals.","example":8,"type":"number"},"totalMicroUsd":{"description":"Sum of the prices charged for the debited operations (your price, including any custom pricing), micro-USD (1,000,000 = $1). The exact source of truth.","type":"integer"}},"type":"object"},"email":{"description":"Absent fields mean not checked, never false.","properties":{"abuseScore":{"type":"number"},"catchAll":{"type":"boolean"},"checked":{"description":"`base` plus every component that answered","items":{"type":"string"},"type":"array"},"confidence":{"description":"1.0 for a vendor or cache answer; the strength of the internal evidence otherwise","maximum":1,"minimum":0,"type":"number"},"disposable":{"type":"boolean"},"dnsblHit":{"type":"boolean"},"hasMx":{"type":"boolean"},"mailboxVerified":{"type":"boolean"},"reason":{"type":"string"},"roleBased":{"type":"boolean"},"source":{"description":"Where the answer came from","enum":["vendor","cache","internal"],"type":"string"},"status":{"enum":["valid","invalid","risky","unknown"],"type":"string"},"test":{"description":"Present and true only in integration test mode: the half is synthetic and nothing was charged","type":"boolean"},"unavailable":{"description":"Components that produced no answer; present only when non-empty. Not billed.","items":{"properties":{"option":{"type":"string"},"reason":{"enum":["vendor_unavailable","vendor_error","paid_call_blocked","unpriced","not_applicable","no_answer"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"ok":{"description":"True when every supplied half produced an answer. Whether the identifier is usable is each half's `status`.","type":"boolean"},"phone":{"description":"Absent fields mean not checked, never false.","properties":{"active":{"description":"Live line: the number is live and assigned to a subscriber. Absent when unknown.","type":"boolean"},"callerName":{"type":"string"},"carrierName":{"type":"string"},"checked":{"description":"`base` plus every component that answered","items":{"type":"string"},"type":"array"},"confidence":{"description":"1.0 for a vendor or cache answer; the strength of the internal evidence otherwise","maximum":1,"minimum":0,"type":"number"},"dnc":{"properties":{"callable":{"type":"boolean"},"onComplainer":{"type":"boolean"},"onFederalDnc":{"type":"boolean"},"onLitigator":{"type":"boolean"},"onStateDnc":{"type":"boolean"},"overlayUnavailable":{"type":"boolean"},"recommendation":{"type":"string"},"resolvedState":{"type":"string"},"stateDncApplicable":{"type":"boolean"}},"type":"object"},"e164":{"example":"+18134696697","type":"string"},"lineType":{"description":"`test` only in integration test mode","enum":["mobile","landline","voip","tollfree","unknown","test"],"type":"string"},"portability":{"properties":{"carrierChanged":{"type":"boolean"},"carrierNative":{"type":"string"},"carrierServing":{"type":"string"},"ported":{"description":"Absent when unknown — never false for an unanswered question","type":"boolean"},"portedDate":{"format":"date","type":"string"},"provenance":{"description":"npac is authoritative; lrn_derived and internal are real answers from licensed data","enum":["npac","lrn_derived","internal","unknown"],"type":"string"}},"type":"object"},"reason":{"type":"string"},"reference":{"description":"Licensed reference data, included with the base check","properties":{"carrierName":{"type":"string"},"city":{"type":"string"},"companyType":{"type":"string"},"county":{"type":"string"},"lata":{"type":"string"},"lineType":{"type":"string"},"ocn":{"type":"string"},"rateCenter":{"type":"string"},"smsGateway":{"type":"boolean"},"state":{"type":"string"},"timezone":{"type":"string"},"zip":{"type":"string"}},"type":"object"},"source":{"description":"Where the answer came from","enum":["vendor","cache","internal"],"type":"string"},"status":{"enum":["valid","invalid","risky","unknown"],"type":"string"},"test":{"description":"Present and true only in integration test mode: the half is synthetic and nothing was charged","type":"boolean"},"unavailable":{"description":"Components that produced no answer; present only when non-empty. Not billed.","items":{"properties":{"option":{"type":"string"},"reason":{"enum":["vendor_unavailable","vendor_error","paid_call_blocked","unpriced","not_applicable","no_answer"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"}},"required":["ok","billing"],"type":"object"}}},"description":"Check result — one envelope, `phone` and/or `email` halves plus `billing`"},"400":{"content":{"application/json":{"schema":{"description":"Bad request","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Bad request — missing identifier, an option enabled without its identifier, or an unknown option"},"401":{"content":{"application/json":{"schema":{"description":"Unauthorized","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Unauthorized — missing or invalid Bearer API key"},"402":{"content":{"application/json":{"schema":{"description":"Insufficient balance","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Payment required — the wallet does not hold enough credits for the whole selection; nothing ran"},"403":{"content":{"application/json":{"schema":{"description":"Forbidden","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Forbidden — the account is suspended, or `test: true` was sent and test mode is not enabled for the account; nothing ran"},"429":{"content":{"application/json":{"schema":{"description":"Too many requests","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Too many requests — more than 2 requests in one second on this API key; nothing ran and nothing was billed. Wait for `Retry-After` (seconds) and resend; or the daily test-mode limit was reached (test: true)"},"500":{"content":{"application/json":{"schema":{"description":"Check failed","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"A half failed before it could answer. Nothing was charged: debits happen only after every half has answered."},"503":{"content":{"application/json":{"schema":{"description":"Service unavailable","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Unavailable — an option we sell but cannot currently price; retry later"},"504":{"content":{"application/json":{"schema":{"description":"Check timed out","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"A half did not finish within the vendor budget. Nothing was charged; retry later."}},"security":[{"bearerAuth":[]}],"summary":"Check a phone number and an email address in one call","tags":["Phone","Email"]}},"/v1/check/email":{"post":{"callbacks":{},"deprecated":false,"description":"Pick the base check and tick components. `email` is required.\n\n| Option | Component | Effect | Already includes | Response fields |\n| --- | --- | --- | --- | --- |\n| `emailVerify` | Verify | replaces the base | — | mailboxVerified |\n| `emailPremium` | Premium | replaces the base | emailVerify | mailboxVerified, catchAll, abuseScore |\n\nOrder of work: the body is validated, then cached answers, then internal\nreference data and free checks, then — only for what is still unanswered —\nvendor lookups, run concurrently. A conclusive internal answer is served\nwithout any vendor call.\n\nBilling follows the outcome. Every completed check is billed at its\npublished price, `valid` or `invalid`. A component whose lookup produced no\nanswer is listed in `unavailable` and is not billed. A replacement tier that\ncannot complete charges the base check alone. `dncCheck` is billed by what\nsettled it: the cheaper list-settled operation when the account's own\nuploaded registry list answered, the on-demand operation when a lookup (or\na cached lookup answer) did; `billing.operations` names the one charged.\n`GET /v1/pricing` is the price list; never hardcode a price.\n\nAn option enabled for a family whose identifier is missing is a 400 —\nthe caller expected that check to run. Unknown options are a 400 that\nlists the valid ones; an option sold but not currently priced is a 503.\n\nSet `test` to `true` to exercise auth and routing without live lookups or\nwallet charges; the halves are synthetic.\n\nRequest cadence: at most 2 requests\nper second per API key, on every `/v1` endpoint. A request over the cadence\nis a 429 with a `Retry-After` header; it never runs and is never billed.\nSend batches at a steady pace rather than in bursts. Identical requests in\nflight at the same moment (same identifier, base check and upgrades) share\none lookup and receive the same answer; each completed check is billed.\n","operationId":"checkEmail","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"checkDnsbl":{"default":true,"description":"Email: run the DNSBL blocklist check.","type":"boolean"},"checkExchange":{"default":true,"description":"Phone: reject unassigned area code + exchange from reference data.","type":"boolean"},"checkMx":{"default":true,"description":"Email: run the MX record check.","type":"boolean"},"email":{"description":"Email address","example":"alex@example.com","type":"string"},"emailPremium":{"default":false,"description":"Premium: Mailbox verification, deliverability, catch-all and abuse scoring. Replaces the base check and already includes emailVerify — selecting those too is one charge.","type":"boolean"},"emailVerify":{"default":false,"description":"Verify: Mailbox-level verification. Replaces the base check; its price covers the base's work.","type":"boolean"},"rejectSmsGateway":{"default":false,"description":"Phone: reject email-to-SMS gateway numbers.","type":"boolean"},"skipBlocklist":{"default":false,"description":"Skip the tenant blocklist.","type":"boolean"},"test":{"default":false,"description":"Integration test mode: synthetic result, no lookups, no charge.","type":"boolean"}},"required":["email"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"billing":{"properties":{"charged":{"type":"boolean"},"operations":{"description":"Catalog operations debited, base first","items":{"type":"string"},"type":"array"},"totalCredits":{"description":"The same total in credits (1 credit = 500 micro-USD = $0.0005). A whole number at catalog prices; custom pricing may add up to three decimals.","example":8,"type":"number"},"totalMicroUsd":{"description":"Sum of the prices charged for the debited operations (your price, including any custom pricing), micro-USD (1,000,000 = $1). The exact source of truth.","type":"integer"}},"type":"object"},"email":{"description":"Absent fields mean not checked, never false.","properties":{"abuseScore":{"type":"number"},"catchAll":{"type":"boolean"},"checked":{"description":"`base` plus every component that answered","items":{"type":"string"},"type":"array"},"confidence":{"description":"1.0 for a vendor or cache answer; the strength of the internal evidence otherwise","maximum":1,"minimum":0,"type":"number"},"disposable":{"type":"boolean"},"dnsblHit":{"type":"boolean"},"hasMx":{"type":"boolean"},"mailboxVerified":{"type":"boolean"},"reason":{"type":"string"},"roleBased":{"type":"boolean"},"source":{"description":"Where the answer came from","enum":["vendor","cache","internal"],"type":"string"},"status":{"enum":["valid","invalid","risky","unknown"],"type":"string"},"test":{"description":"Present and true only in integration test mode: the half is synthetic and nothing was charged","type":"boolean"},"unavailable":{"description":"Components that produced no answer; present only when non-empty. Not billed.","items":{"properties":{"option":{"type":"string"},"reason":{"enum":["vendor_unavailable","vendor_error","paid_call_blocked","unpriced","not_applicable","no_answer"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"ok":{"description":"True when every supplied half produced an answer. Whether the identifier is usable is each half's `status`.","type":"boolean"}},"required":["ok","billing"],"type":"object"}}},"description":"Check result — one envelope, `phone` and/or `email` halves plus `billing`"},"400":{"content":{"application/json":{"schema":{"description":"Bad request","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Bad request — missing identifier, an option enabled without its identifier, or an unknown option"},"401":{"content":{"application/json":{"schema":{"description":"Unauthorized","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Unauthorized — missing or invalid Bearer API key"},"402":{"content":{"application/json":{"schema":{"description":"Insufficient balance","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Payment required — the wallet does not hold enough credits for the whole selection; nothing ran"},"403":{"content":{"application/json":{"schema":{"description":"Forbidden","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Forbidden — the account is suspended, or `test: true` was sent and test mode is not enabled for the account; nothing ran"},"429":{"content":{"application/json":{"schema":{"description":"Too many requests","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Too many requests — more than 2 requests in one second on this API key; nothing ran and nothing was billed. Wait for `Retry-After` (seconds) and resend; or the daily test-mode limit was reached (test: true)"},"500":{"content":{"application/json":{"schema":{"description":"Check failed","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"A half failed before it could answer. Nothing was charged: debits happen only after every half has answered."},"503":{"content":{"application/json":{"schema":{"description":"Service unavailable","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Unavailable — an option we sell but cannot currently price; retry later"},"504":{"content":{"application/json":{"schema":{"description":"Check timed out","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"A half did not finish within the vendor budget. Nothing was charged; retry later."}},"security":[{"bearerAuth":[]}],"summary":"Check an email address","tags":["Email"]}},"/v1/check/phone":{"post":{"callbacks":{},"deprecated":false,"description":"Pick the base check and tick components. `phone` is required.\n\n| Option | Component | Effect | Already includes | Response fields |\n| --- | --- | --- | --- | --- |\n| `carrierCheck` | Normalized carrier | replaces the base | portedCheck | carrierName, portability |\n| `portedCheck` | Ported check | replaces the base | — | portability |\n| `dncCheck` (with `includeTcpaScreening`) | DNC screening | adds to the base | — | dnc |\n| `activeCheck` | Live line | adds to the base | — | active |\n| `callerName` | Caller name | adds to the base | — | callerName |\n| `phonePremium` | Premium | replaces the base | carrierCheck, portedCheck, dncCheck, activeCheck, callerName | carrierName, portability, active, dnc, callerName |\n\nOrder of work: the body is validated, then cached answers, then internal\nreference data and free checks, then — only for what is still unanswered —\nvendor lookups, run concurrently. A conclusive internal answer is served\nwithout any vendor call.\n\nBilling follows the outcome. Every completed check is billed at its\npublished price, `valid` or `invalid`. A component whose lookup produced no\nanswer is listed in `unavailable` and is not billed. A replacement tier that\ncannot complete charges the base check alone. `dncCheck` is billed by what\nsettled it: the cheaper list-settled operation when the account's own\nuploaded registry list answered, the on-demand operation when a lookup (or\na cached lookup answer) did; `billing.operations` names the one charged.\n`GET /v1/pricing` is the price list; never hardcode a price.\n\nAn option enabled for a family whose identifier is missing is a 400 —\nthe caller expected that check to run. Unknown options are a 400 that\nlists the valid ones; an option sold but not currently priced is a 503.\n\nSet `test` to `true` to exercise auth and routing without live lookups or\nwallet charges; the halves are synthetic.\n\nRequest cadence: at most 2 requests\nper second per API key, on every `/v1` endpoint. A request over the cadence\nis a 429 with a `Retry-After` header; it never runs and is never billed.\nSend batches at a steady pace rather than in bursts. Identical requests in\nflight at the same moment (same identifier, base check and upgrades) share\none lookup and receive the same answer; each completed check is billed.\n","operationId":"checkPhone","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"activeCheck":{"default":false,"description":"Live line: Confirms the number is live and assigned to a subscriber — not that the handset is answering right now. Adds to the base check and bills on top.","type":"boolean"},"callerName":{"default":false,"description":"Caller name: Caller name lookup; also included with Premium. Adds to the base check and bills on top.","type":"boolean"},"carrierCheck":{"default":false,"description":"Normalized carrier: A normalized name for the current serving carrier, with ported status. Replaces the base check and already includes portedCheck — selecting those too is one charge.","type":"boolean"},"checkDnsbl":{"default":true,"description":"Email: run the DNSBL blocklist check.","type":"boolean"},"checkExchange":{"default":true,"description":"Phone: reject unassigned area code + exchange from reference data.","type":"boolean"},"checkMx":{"default":true,"description":"Email: run the MX record check.","type":"boolean"},"dncCheck":{"default":false,"description":"DNC screening: Federal and state DNC, litigator and complainer signals. Adds to the base check and bills on top.","type":"boolean"},"includeTcpaScreening":{"default":false,"description":"With `dncCheck`, upgrades it to dnc overlay.","type":"boolean"},"phone":{"description":"Phone number, E.164 or US national format","example":"+18134696697","type":"string"},"phonePremium":{"default":false,"description":"Premium: Every phone upgrade: carrier, ported status, live line, DNC, TCPA and caller name. Replaces the base check and already includes carrierCheck, portedCheck, dncCheck, activeCheck, callerName — selecting those too is one charge.","type":"boolean"},"portedCheck":{"default":false,"description":"Ported check: Live line type, ported status and ported date. Replaces the base check; its price covers the base's work.","type":"boolean"},"rejectSmsGateway":{"default":false,"description":"Phone: reject email-to-SMS gateway numbers.","type":"boolean"},"skipBlocklist":{"default":false,"description":"Skip the tenant blocklist.","type":"boolean"},"test":{"default":false,"description":"Integration test mode: synthetic result, no lookups, no charge.","type":"boolean"}},"required":["phone"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"billing":{"properties":{"charged":{"type":"boolean"},"operations":{"description":"Catalog operations debited, base first","items":{"type":"string"},"type":"array"},"totalCredits":{"description":"The same total in credits (1 credit = 500 micro-USD = $0.0005). A whole number at catalog prices; custom pricing may add up to three decimals.","example":8,"type":"number"},"totalMicroUsd":{"description":"Sum of the prices charged for the debited operations (your price, including any custom pricing), micro-USD (1,000,000 = $1). The exact source of truth.","type":"integer"}},"type":"object"},"ok":{"description":"True when every supplied half produced an answer. Whether the identifier is usable is each half's `status`.","type":"boolean"},"phone":{"description":"Absent fields mean not checked, never false.","properties":{"active":{"description":"Live line: the number is live and assigned to a subscriber. Absent when unknown.","type":"boolean"},"callerName":{"type":"string"},"carrierName":{"type":"string"},"checked":{"description":"`base` plus every component that answered","items":{"type":"string"},"type":"array"},"confidence":{"description":"1.0 for a vendor or cache answer; the strength of the internal evidence otherwise","maximum":1,"minimum":0,"type":"number"},"dnc":{"properties":{"callable":{"type":"boolean"},"onComplainer":{"type":"boolean"},"onFederalDnc":{"type":"boolean"},"onLitigator":{"type":"boolean"},"onStateDnc":{"type":"boolean"},"overlayUnavailable":{"type":"boolean"},"recommendation":{"type":"string"},"resolvedState":{"type":"string"},"stateDncApplicable":{"type":"boolean"}},"type":"object"},"e164":{"example":"+18134696697","type":"string"},"lineType":{"description":"`test` only in integration test mode","enum":["mobile","landline","voip","tollfree","unknown","test"],"type":"string"},"portability":{"properties":{"carrierChanged":{"type":"boolean"},"carrierNative":{"type":"string"},"carrierServing":{"type":"string"},"ported":{"description":"Absent when unknown — never false for an unanswered question","type":"boolean"},"portedDate":{"format":"date","type":"string"},"provenance":{"description":"npac is authoritative; lrn_derived and internal are real answers from licensed data","enum":["npac","lrn_derived","internal","unknown"],"type":"string"}},"type":"object"},"reason":{"type":"string"},"reference":{"description":"Licensed reference data, included with the base check","properties":{"carrierName":{"type":"string"},"city":{"type":"string"},"companyType":{"type":"string"},"county":{"type":"string"},"lata":{"type":"string"},"lineType":{"type":"string"},"ocn":{"type":"string"},"rateCenter":{"type":"string"},"smsGateway":{"type":"boolean"},"state":{"type":"string"},"timezone":{"type":"string"},"zip":{"type":"string"}},"type":"object"},"source":{"description":"Where the answer came from","enum":["vendor","cache","internal"],"type":"string"},"status":{"enum":["valid","invalid","risky","unknown"],"type":"string"},"test":{"description":"Present and true only in integration test mode: the half is synthetic and nothing was charged","type":"boolean"},"unavailable":{"description":"Components that produced no answer; present only when non-empty. Not billed.","items":{"properties":{"option":{"type":"string"},"reason":{"enum":["vendor_unavailable","vendor_error","paid_call_blocked","unpriced","not_applicable","no_answer"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"}},"required":["ok","billing"],"type":"object"}}},"description":"Check result — one envelope, `phone` and/or `email` halves plus `billing`"},"400":{"content":{"application/json":{"schema":{"description":"Bad request","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Bad request — missing identifier, an option enabled without its identifier, or an unknown option"},"401":{"content":{"application/json":{"schema":{"description":"Unauthorized","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Unauthorized — missing or invalid Bearer API key"},"402":{"content":{"application/json":{"schema":{"description":"Insufficient balance","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Payment required — the wallet does not hold enough credits for the whole selection; nothing ran"},"403":{"content":{"application/json":{"schema":{"description":"Forbidden","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Forbidden — the account is suspended, or `test: true` was sent and test mode is not enabled for the account; nothing ran"},"429":{"content":{"application/json":{"schema":{"description":"Too many requests","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Too many requests — more than 2 requests in one second on this API key; nothing ran and nothing was billed. Wait for `Retry-After` (seconds) and resend; or the daily test-mode limit was reached (test: true)"},"500":{"content":{"application/json":{"schema":{"description":"Check failed","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"A half failed before it could answer. Nothing was charged: debits happen only after every half has answered."},"503":{"content":{"application/json":{"schema":{"description":"Service unavailable","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Unavailable — an option we sell but cannot currently price; retry later"},"504":{"content":{"application/json":{"schema":{"description":"Check timed out","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"A half did not finish within the vendor budget. Nothing was charged; retry later."}},"security":[{"bearerAuth":[]}],"summary":"Check a phone number","tags":["Phone"]}},"/v1/pricing":{"get":{"callbacks":{},"deprecated":false,"description":"The live price list every check bills against. No API key is needed.\n\nRead `skus`: each SKU is a base check plus the components it accepts,\npriced by billing operation in micro-USD (1,000,000 = $1) and in credits\n(1 credit = 500 micro-USD = $0.0005; see `creditsPerUsd`). `services` is\nthe flat per-operation view of the same catalog. `packages` is empty until\nmonthly packages are published. Prices change with the catalog — read\nthem here rather than hardcoding one. Responses may be cached for five\nminutes (`Cache-Control`).\n","operationId":"pricing","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"creditMicroUsd":{"description":"The value of one credit in micro-USD","example":500,"type":"integer"},"creditUsd":{"description":"The value of one credit","example":"$0.0005","type":"string"},"creditsPerUsd":{"description":"Credits per US dollar. Wallet balances and prices are shown in credits.","example":2000,"type":"integer"},"currency":{"enum":["USD"],"type":"string"},"minimumTopUp":{"example":"$25.00","type":"string"},"packages":{"description":"Monthly packages. Empty until packages are published.","items":{"properties":{"includedChecks":{"nullable":true,"type":"integer"},"monthly":{"description":"Monthly fee, USD","type":"string"},"monthlyCredits":{"description":"Credits the package grants each month","type":"number"},"monthlyMicroUsd":{"type":"integer"},"name":{"type":"string"},"overage":{"description":"USD","nullable":true,"type":"string"},"overageCredits":{"nullable":true,"type":"number"},"slug":{"type":"string"}},"type":"object"},"type":"array"},"services":{"items":{"description":"Flat per-operation view of the same catalog. Check operations carry the component's name and description.","properties":{"category":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"key":{"description":"Billing operation","type":"string"},"name":{"type":"string"},"policy":{"nullable":true,"type":"string"},"prices":{"description":"Price per rail; null when the operation has no price on any rail","nullable":false,"properties":{"leadconnector_marketplace":{"description":"Absent (null) when the operation is not priced — never zero","nullable":true,"properties":{"credits":{"description":"The price in credits (1 credit = $0.0005)","example":3,"type":"number"},"microUsd":{"description":"Micro-USD (1,000,000 = $1)","type":"integer"},"usd":{"example":"$0.0015","type":"string"}},"required":["microUsd","usd","credits"],"type":"object"},"wallet":{"description":"Absent (null) when the operation is not priced — never zero","nullable":true,"properties":{"credits":{"description":"The price in credits (1 credit = $0.0005)","example":3,"type":"number"},"microUsd":{"description":"Micro-USD (1,000,000 = $1)","type":"integer"},"usd":{"example":"$0.0015","type":"string"}},"required":["microUsd","usd","credits"],"type":"object"}},"type":"object"},"unit":{"description":"`per_call` for every check operation","nullable":true,"type":"string"}},"required":["key","name","prices"],"type":"object"},"type":"array"},"skus":{"description":"What to read: each SKU is a base check plus the components it accepts","items":{"properties":{"base":{"description":"The base check; null for `both`","nullable":true,"properties":{"description":{"type":"string"},"includes":{"description":"Option keys this component already answers","items":{"type":"string"},"type":"array"},"key":{"description":"Request option key","example":"dncCheck","type":"string"},"label":{"type":"string"},"mode":{"enum":["base","add","replace"],"type":"string"},"modifiers":{"items":{"type":"string"},"type":"array"},"operation":{"description":"Billing operation debited","type":"string"},"prices":{"description":"Price per rail; null when the operation has no price on any rail","nullable":true,"properties":{"leadconnector_marketplace":{"description":"Absent (null) when the operation is not priced — never zero","nullable":true,"properties":{"credits":{"description":"The price in credits (1 credit = $0.0005)","example":3,"type":"number"},"microUsd":{"description":"Micro-USD (1,000,000 = $1)","type":"integer"},"usd":{"example":"$0.0015","type":"string"}},"required":["microUsd","usd","credits"],"type":"object"},"wallet":{"description":"Absent (null) when the operation is not priced — never zero","nullable":true,"properties":{"credits":{"description":"The price in credits (1 credit = $0.0005)","example":3,"type":"number"},"microUsd":{"description":"Micro-USD (1,000,000 = $1)","type":"integer"},"usd":{"example":"$0.0015","type":"string"}},"required":["microUsd","usd","credits"],"type":"object"}},"type":"object"},"responseFields":{"items":{"type":"string"},"type":"array"}},"required":["key","label","description","operation","mode","includes","responseFields"],"type":"object"},"components":{"items":{"properties":{"description":{"type":"string"},"includes":{"description":"Option keys this component already answers","items":{"type":"string"},"type":"array"},"key":{"description":"Request option key","example":"dncCheck","type":"string"},"label":{"type":"string"},"mode":{"enum":["base","add","replace"],"type":"string"},"modifiers":{"items":{"type":"string"},"type":"array"},"operation":{"description":"Billing operation debited","type":"string"},"prices":{"description":"Price per rail; null when the operation has no price on any rail","nullable":true,"properties":{"leadconnector_marketplace":{"description":"Absent (null) when the operation is not priced — never zero","nullable":true,"properties":{"credits":{"description":"The price in credits (1 credit = $0.0005)","example":3,"type":"number"},"microUsd":{"description":"Micro-USD (1,000,000 = $1)","type":"integer"},"usd":{"example":"$0.0015","type":"string"}},"required":["microUsd","usd","credits"],"type":"object"},"wallet":{"description":"Absent (null) when the operation is not priced — never zero","nullable":true,"properties":{"credits":{"description":"The price in credits (1 credit = $0.0005)","example":3,"type":"number"},"microUsd":{"description":"Micro-USD (1,000,000 = $1)","type":"integer"},"usd":{"example":"$0.0015","type":"string"}},"required":["microUsd","usd","credits"],"type":"object"}},"type":"object"},"responseFields":{"items":{"type":"string"},"type":"array"}},"required":["key","label","description","operation","mode","includes","responseFields"],"type":"object"},"type":"array"},"description":{"type":"string"},"key":{"enum":["phone","email","both"],"type":"string"},"name":{"type":"string"}},"required":["key","name","description","components"],"type":"object"},"type":"array"},"unitNote":{"description":"The billing rule in one sentence","type":"string"}},"required":["currency","creditsPerUsd","creditMicroUsd","creditUsd","unitNote","minimumTopUp","skus","services","packages"],"type":"object"}}},"description":"Price list"},"503":{"content":{"application/json":{"schema":{"description":"Unavailable — the catalog could not be read; retry later","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Unavailable — the catalog could not be read; retry later"}},"security":[],"summary":"Public price list","tags":["Pricing"]}},"/v1/sessions":{"post":{"callbacks":{},"deprecated":false,"description":"Start a new identity verification session. Sends an initial verification email\n(magic link or OTP) to the provided address.\n","operationId":"sessionCreate","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"callbackBaseUrl":{"description":"Override tenant app_base_url for this request","type":"string"},"email":{"example":"user@example.com","type":"string"},"emailMethod":{"default":"magic_link","enum":["magic_link","otp"],"type":"string"},"metadata":{"type":"object"},"name":{"type":"string"},"phone":{"example":"+12065550100","type":"string"},"purpose":{"example":"lead_verification","type":"string"},"tcpaTimestamp":{"format":"date-time","type":"string"}},"required":["email","purpose"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"sessionToken":{"type":"string"},"verificationToken":{"type":"string"}},"required":["verificationToken","sessionToken"],"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"description":"Bad request","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"description":"Unauthorized","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"description":"Insufficient balance","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Insufficient balance"},"404":{"content":{"application/json":{"schema":{"description":"Not found","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Not found"},"502":{"content":{"application/json":{"schema":{"description":"Upstream error","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Upstream error"},"503":{"content":{"application/json":{"schema":{"description":"Service unavailable","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Service unavailable"}},"security":[{"bearerAuth":[]}],"summary":"Create a verification session","tags":["Sessions"]}},"/v1/sessions/confirm-email":{"post":{"callbacks":{},"deprecated":false,"description":"Confirm the email address for a session. For magic links, omit `code`.\nFor email OTP, include the 6-digit `code` from the email.\n","operationId":"sessionConfirmEmail","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"code":{"description":"Required for emailMethod=otp; omit for magic links","type":"string"},"token":{"type":"string"}},"required":["token"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"example":true,"type":"boolean"},"sessionToken":{"type":"string"},"status":{"enum":["awaiting_email","awaiting_phone","complete"],"type":"string"}},"required":["ok"],"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"description":"Bad request","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"description":"Unauthorized","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"description":"Insufficient balance","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Insufficient balance"},"404":{"content":{"application/json":{"schema":{"description":"Not found","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Not found"},"502":{"content":{"application/json":{"schema":{"description":"Upstream error","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Upstream error"},"503":{"content":{"application/json":{"schema":{"description":"Service unavailable","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Service unavailable"}},"security":[{"bearerAuth":[]}],"summary":"Confirm email","tags":["Sessions"]}},"/v1/sessions/resend":{"post":{"callbacks":{},"deprecated":false,"description":"Resend email verification or request an SMS OTP for phone verification.","operationId":"sessionResend","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"channel":{"enum":["email","phone"],"type":"string"},"token":{"type":"string"}},"required":["token","channel"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"example":true,"type":"boolean"},"sessionToken":{"type":"string"},"status":{"enum":["awaiting_email","awaiting_phone","complete"],"type":"string"}},"required":["ok"],"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"description":"Bad request","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"description":"Unauthorized","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"description":"Insufficient balance","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Insufficient balance"},"404":{"content":{"application/json":{"schema":{"description":"Not found","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Not found"},"502":{"content":{"application/json":{"schema":{"description":"Upstream error","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Upstream error"},"503":{"content":{"application/json":{"schema":{"description":"Service unavailable","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Service unavailable"}},"security":[{"bearerAuth":[]}],"summary":"Resend verification","tags":["Sessions"]}},"/v1/sessions/status":{"get":{"callbacks":{},"deprecated":false,"description":"Poll verification progress for a session token.","operationId":"sessionStatus","parameters":[{"in":"query","name":"token","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"emailVerifiedAt":{"format":"date-time","nullable":true,"type":"string"},"metadata":{"type":"object"},"phoneVerifiedAt":{"format":"date-time","nullable":true,"type":"string"},"status":{"enum":["awaiting_email","awaiting_phone","complete"],"type":"string"}},"required":["status"],"type":"object"}}},"description":"Session status"},"400":{"content":{"application/json":{"schema":{"description":"Bad request","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"description":"Unauthorized","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"Not found","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Not found"}},"security":[{"bearerAuth":[]}],"summary":"Get session status","tags":["Sessions"]}},"/v1/sessions/verify-phone":{"post":{"callbacks":{},"deprecated":false,"description":"Confirm the SMS OTP code for phone verification.","operationId":"sessionVerifyPhone","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"code":{"example":"123456","type":"string"},"token":{"type":"string"}},"required":["token","code"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"example":true,"type":"boolean"},"sessionToken":{"type":"string"},"status":{"enum":["awaiting_email","awaiting_phone","complete"],"type":"string"}},"required":["ok"],"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"description":"Bad request","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Bad request"},"401":{"content":{"application/json":{"schema":{"description":"Unauthorized","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"description":"Insufficient balance","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Insufficient balance"},"404":{"content":{"application/json":{"schema":{"description":"Not found","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Not found"},"502":{"content":{"application/json":{"schema":{"description":"Upstream error","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Upstream error"},"503":{"content":{"application/json":{"schema":{"description":"Service unavailable","properties":{"error":{"description":"Human-readable error message","type":"string"},"ok":{"description":"Always false for error responses","example":false,"type":"boolean"}},"required":["error"],"type":"object"}}},"description":"Service unavailable"}},"security":[{"bearerAuth":[]}],"summary":"Verify phone","tags":["Sessions"]}}},"security":[{"bearerAuth":[]}],"servers":[{"description":"Production","url":"https://getvalidator.io","variables":{}}],"tags":[{"description":"Email deliverability validation","name":"Email"},{"description":"Phone line status, carrier lookup, and caller name","name":"Phone"},{"description":"Do-not-call registry screening","name":"DNC"},{"description":"Identity verification sessions","name":"Sessions"},{"description":"Public price list — no API key","name":"Pricing"},{"description":"Billing catalog reference (see description table)","name":"Services"}]}