{"openapi":"3.1.0","info":{"title":"Veqen API","description":"\nCheck whether a signup, email address, IP address, phone number or domain is real, throwaway or risky.\n\nEvery response includes a `risk` block: a 0-100 `score`, a `verdict` (`admit`, `review`, `refuse`) and\nplain-English `reasons`. Authenticate with `Authorization: Bearer vq_live_...`. Each check spends prepaid\ncredits; see `/v1/account` for your balance. Human-friendly docs: /docs. MCP server: /mcp.\n","contact":{"name":"Veqen support","email":"support@veqen-app.com"},"version":"0.1.0"},"servers":[{"url":"https://veqen-app.com"}],"paths":{"/v1/email/check":{"post":{"tags":["Checks"],"summary":"Check an email address","description":"Syntax, throwaway domains, typos, mail servers, domain age, role and +tag addresses, and optionally the mailbox itself. Costs 1 credit (+5 with `verify_mailbox`).","operationId":"email_check_v1_email_check_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Retrying with the same key returns the first response and never charges twice.","title":"Idempotency-Key"},"description":"Optional. Retrying with the same key returns the first response and never charges twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailCheck"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Not enough credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests per second.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["Checks"],"summary":"Check an email address (GET)","operationId":"email_check_get_v1_email_check_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","description":"The address to check.","title":"Email"},"description":"The address to check."},{"name":"verify_mailbox","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Verify Mailbox"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailCheck"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Not enough credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests per second.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/email/batch":{"post":{"tags":["Checks"],"summary":"Check up to 100 email addresses","description":"Same as the email check, for a list. Costs 1 credit per address (+5 each with `verify_mailbox`).","operationId":"email_batch_v1_email_batch_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Retrying with the same key returns the first response and never charges twice.","title":"Idempotency-Key"},"description":"Optional. Retrying with the same key returns the first response and never charges twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailBatchResult"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Not enough credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests per second.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/ip/check":{"post":{"tags":["Checks"],"summary":"Check an IP address","description":"Location, network owner, and whether it is a datacenter, VPN network, relay or Tor exit. Costs 1 credit.","operationId":"ip_check_v1_ip_check_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Retrying with the same key returns the first response and never charges twice.","title":"Idempotency-Key"},"description":"Optional. Retrying with the same key returns the first response and never charges twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpCheck"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Not enough credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests per second.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["Checks"],"summary":"Check an IP address (GET)","description":"Leave out `ip` to check the address the request came from.","operationId":"ip_check_get_v1_ip_check_get","parameters":[{"name":"ip","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Address to check. Defaults to the caller's IP.","title":"Ip"},"description":"Address to check. Defaults to the caller's IP."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpCheck"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Not enough credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests per second.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/phone/check":{"post":{"tags":["Checks"],"summary":"Check a phone number","description":"Validity, standard formats (E.164), country, line type (mobile, VoIP, toll-free...) and the carrier the range was assigned to. Costs 1 credit.","operationId":"phone_check_v1_phone_check_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Retrying with the same key returns the first response and never charges twice.","title":"Idempotency-Key"},"description":"Optional. Retrying with the same key returns the first response and never charges twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneCheck"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Not enough credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests per second.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["Checks"],"summary":"Check a phone number (GET)","operationId":"phone_check_get_v1_phone_check_get","parameters":[{"name":"phone","in":"query","required":true,"schema":{"type":"string","description":"The number, ideally in +international format.","title":"Phone"},"description":"The number, ideally in +international format."},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Two-letter country for national-format numbers.","title":"Country"},"description":"Two-letter country for national-format numbers."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneCheck"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Not enough credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests per second.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/domain/check":{"post":{"tags":["Checks"],"summary":"Check a domain","description":"Whether a domain exists, receives email, is a throwaway provider, and how old it is. Accepts a bare domain, a URL or an email address. Costs 1 credit.","operationId":"domain_check_v1_domain_check_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Retrying with the same key returns the first response and never charges twice.","title":"Idempotency-Key"},"description":"Optional. Retrying with the same key returns the first response and never charges twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainCheck"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Not enough credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests per second.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["Checks"],"summary":"Check a domain (GET)","operationId":"domain_check_get_v1_domain_check_get","parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"Domain, URL or email address.","title":"Domain"},"description":"Domain, URL or email address."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainCheck"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Not enough credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests per second.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/signup/check":{"post":{"tags":["Checks"],"summary":"Check a whole signup","description":"Email, IP and phone in one call, plus cross-checks between them, with one verdict: admit, review or refuse. Send any combination of the three. Costs 3 credits (+5 with `verify_mailbox`).","operationId":"signup_check_v1_signup_check_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Retrying with the same key returns the first response and never charges twice.","title":"Idempotency-Key"},"description":"Optional. Retrying with the same key returns the first response and never charges twice."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupCheck"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Not enough credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests per second.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/account":{"get":{"tags":["Checks","Account"],"summary":"Balance and limits","operationId":"account_v1_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountInfo"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Not enough credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests per second.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/usage":{"get":{"tags":["Checks","Account"],"summary":"Daily usage","operationId":"usage_v1_usage_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Not enough credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests per second.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"AccountInfo":{"properties":{"email":{"type":"string","title":"Email"},"balance":{"$ref":"#/components/schemas/Balance"},"free_monthly_credits":{"type":"integer","title":"Free Monthly Credits"},"free_resets_at":{"type":"string","title":"Free Resets At","description":"When free credits next reset (UTC, ISO 8601)."},"costs":{"additionalProperties":{"type":"integer"},"type":"object","title":"Costs","description":"Credits charged per check."},"rate_limit_per_second":{"type":"number","title":"Rate Limit Per Second"}},"type":"object","required":["email","balance","free_monthly_credits","free_resets_at","costs","rate_limit_per_second"],"title":"AccountInfo"},"Balance":{"properties":{"free":{"type":"integer","title":"Free","description":"Free credits left this month."},"paid":{"type":"integer","title":"Paid","description":"Prepaid credits. They never expire."},"total":{"type":"integer","title":"Total"}},"type":"object","required":["free","paid","total"],"title":"Balance"},"DomainCheck":{"properties":{"input":{"type":"string","title":"Input"},"valid":{"type":"boolean","title":"Valid"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"disposable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disposable"},"free_provider":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Free Provider"},"exists":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Exists"},"accepts_mail":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Accepts Mail"},"mx":{"items":{"type":"string"},"type":"array","title":"Mx"},"null_mx":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Null Mx"},"spf":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Spf"},"dmarc":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dmarc"},"registered_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered At"},"age_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age Days"},"registrar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registrar"},"risk":{"$ref":"#/components/schemas/Risk"}},"type":"object","required":["input","valid","risk"],"title":"DomainCheck"},"DomainCheckRequest":{"properties":{"domain":{"type":"string","title":"Domain","description":"A domain, URL or email address. We extract the domain.","examples":["acme.com"]}},"type":"object","required":["domain"],"title":"DomainCheckRequest"},"DomainInfo":{"properties":{"exists":{"type":"boolean","title":"Exists","description":"False when the domain is not registered (NXDOMAIN)."},"accepts_mail":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Accepts Mail","description":"True if the domain has a mail server. Null if DNS was unreachable."},"mx":{"items":{"type":"string"},"type":"array","title":"Mx","description":"Mail servers, most preferred first."},"null_mx":{"type":"boolean","title":"Null Mx","description":"True if the domain explicitly refuses all email (RFC 7505)."},"spf":{"type":"boolean","title":"Spf","description":"The domain publishes an SPF record."},"dmarc":{"type":"boolean","title":"Dmarc","description":"The domain publishes a DMARC record."},"registered_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered At","description":"Registration date (YYYY-MM-DD) from RDAP, when available."},"age_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age Days","description":"Days since registration, when known."},"registrar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registrar","description":"Registrar name from RDAP, when available."}},"type":"object","required":["exists","accepts_mail","mx","null_mx","spf","dmarc","registered_at","age_days","registrar"],"title":"DomainInfo"},"EmailBatchRequest":{"properties":{"emails":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Emails","description":"Up to 100 addresses."},"verify_mailbox":{"type":"boolean","title":"Verify Mailbox","default":false}},"type":"object","required":["emails"],"title":"EmailBatchRequest"},"EmailBatchResult":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EmailCheck"},"type":"array","title":"Results"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["results","count"],"title":"EmailBatchResult"},"EmailCheck":{"properties":{"email":{"type":"string","title":"Email","description":"The address exactly as you sent it."},"valid_syntax":{"type":"boolean","title":"Valid Syntax","description":"False if this is not an email address at all."},"syntax_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Syntax Error","description":"What is wrong with the syntax, if anything."},"normalized":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized","description":"Lower-cased domain, Unicode-normalized address."},"canonical":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical","description":"The inbox this really lands in: +tags removed, and dots removed for Gmail. Use it to spot one person creating many accounts."},"local_part":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Part"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"disposable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disposable","description":"The domain hands out throwaway inboxes."},"free_provider":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Free Provider","description":"A consumer mailbox such as Gmail or Outlook."},"role_account":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Role Account","description":"A shared inbox such as info@ or support@."},"plus_addressed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Plus Addressed","description":"The address uses a +tag."},"did_you_mean":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Did You Mean","description":"Suggested correction for a likely typo."},"domain_info":{"anyOf":[{"$ref":"#/components/schemas/DomainInfo"},{"type":"null"}]},"mailbox":{"anyOf":[{"$ref":"#/components/schemas/Mailbox"},{"type":"null"}],"description":"Present when verify_mailbox was requested."},"risk":{"$ref":"#/components/schemas/Risk"}},"type":"object","required":["email","valid_syntax","risk"],"title":"EmailCheck"},"EmailCheckRequest":{"properties":{"email":{"type":"string","title":"Email","description":"The address to check.","examples":["jane@mailinator.com"]},"verify_mailbox":{"type":"boolean","title":"Verify Mailbox","description":"Also ask the domain's mail server whether the mailbox exists (SMTP). Costs 5 extra credits and adds up to a few seconds. Only charged when the check actually runs.","default":false}},"type":"object","required":["email"],"title":"EmailCheckRequest"},"ErrorBody":{"properties":{"type":{"type":"string","title":"Type"},"message":{"type":"string","title":"Message"},"docs":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Docs"}},"type":"object","required":["type","message"],"title":"ErrorBody"},"ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}},"type":"object","required":["error"],"title":"ErrorResponse"},"IpCheck":{"properties":{"ip":{"type":"string","title":"Ip"},"valid":{"type":"boolean","title":"Valid"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"type":{"anyOf":[{"type":"string","enum":["public","private","loopback","link_local","multicast","reserved","special"]},{"type":"null"}],"title":"Type"},"location":{"anyOf":[{"$ref":"#/components/schemas/IpLocation"},{"type":"null"}]},"network":{"anyOf":[{"$ref":"#/components/schemas/IpNetwork"},{"type":"null"}]},"flags":{"anyOf":[{"$ref":"#/components/schemas/IpFlags"},{"type":"null"}]},"data_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Note"},"risk":{"$ref":"#/components/schemas/Risk"}},"type":"object","required":["ip","valid","risk"],"title":"IpCheck"},"IpCheckRequest":{"properties":{"ip":{"type":"string","title":"Ip","description":"IPv4 or IPv6 address of the visitor.","examples":["185.220.101.1"]}},"type":"object","required":["ip"],"title":"IpCheckRequest"},"IpFlags":{"properties":{"hosting":{"type":"boolean","title":"Hosting","description":"Address is in a cloud or hosting network, not a home or mobile one."},"vpn_likely":{"type":"boolean","title":"Vpn Likely","description":"Network is mainly used by commercial VPN services."},"relay":{"type":"boolean","title":"Relay","description":"Traffic comes through a CDN or privacy relay (e.g. Cloudflare WARP)."},"tor":{"type":"boolean","title":"Tor","description":"Address is a current Tor exit node."}},"type":"object","required":["hosting","vpn_likely","relay","tor"],"title":"IpFlags"},"IpLocation":{"properties":{"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"in_eu":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Eu"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"continent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Continent"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"}},"type":"object","title":"IpLocation"},"IpNetwork":{"properties":{"asn":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Asn","description":"Autonomous system number of the network that owns the address."},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization","description":"Who owns the network."},"kind":{"type":"string","enum":["cloud","hosting","cdn","vpn_hosting","isp","unknown"],"title":"Kind"},"kind_label":{"type":"string","title":"Kind Label"},"known_network":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Known Network","description":"Our name for the network if it is on our curated list."}},"type":"object","required":["asn","organization","kind","kind_label","known_network"],"title":"IpNetwork"},"Mailbox":{"properties":{"checked":{"type":"boolean","title":"Checked","description":"True if the mail server gave a usable answer."},"result":{"type":"string","enum":["deliverable","undeliverable","catch_all","unknown"],"title":"Result"},"smtp_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Smtp Code"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Why the mailbox wasn't checked, if it wasn't."}},"type":"object","required":["checked","result"],"title":"Mailbox"},"PhoneCheck":{"properties":{"input":{"type":"string","title":"Input"},"valid":{"type":"boolean","title":"Valid","description":"A real, assignable number for its country."},"possible":{"type":"boolean","title":"Possible","description":"Right length for its country (weaker than valid)."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"e164":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"E164","description":"Canonical format for storage and SMS APIs, e.g. +14155552671."},"international":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"International"},"national":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"National"},"calling_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Calling Code"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location","description":"Area the number range is assigned to, when known."},"line_type":{"anyOf":[{"type":"string","enum":["fixed_line","mobile","fixed_line_or_mobile","toll_free","premium_rate","shared_cost","voip","personal_number","pager","uan","voicemail","unknown"]},{"type":"null"}],"title":"Line Type"},"line_type_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Line Type Label"},"carrier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Carrier","description":"Carrier that was assigned the range (numbers can be ported)."},"time_zones":{"items":{"type":"string"},"type":"array","title":"Time Zones"},"risk":{"$ref":"#/components/schemas/Risk"}},"type":"object","required":["input","valid","possible","risk"],"title":"PhoneCheck"},"PhoneCheckRequest":{"properties":{"phone":{"type":"string","title":"Phone","description":"The number. Use international format (+44...) or pass `country`.","examples":["+1 415 555 2671"]},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Two-letter country (ISO 3166) to read national-format numbers, e.g. `GB`."}},"type":"object","required":["phone"],"title":"PhoneCheckRequest"},"Reason":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine-readable reason, e.g. `disposable_domain`."},"impact":{"type":"integer","title":"Impact","description":"How strongly this reason alone points to a fake signup, 0-100."},"message":{"type":"string","title":"Message","description":"One plain-English sentence you can show in logs or an admin tool."},"source":{"anyOf":[{"type":"string","enum":["email","ip","phone","signup"]},{"type":"null"}],"title":"Source","description":"Which input produced the reason (signup check only)."}},"type":"object","required":["code","impact","message"],"title":"Reason"},"Risk":{"properties":{"score":{"type":"integer","title":"Score","description":"0 (clean) to 100 (certainly fake or unusable)."},"level":{"type":"string","enum":["low","medium","high"],"title":"Level","description":"low < 30 <= medium < 70 <= high."},"verdict":{"type":"string","enum":["admit","review","refuse"],"title":"Verdict","description":"Suggested action: admit (let them in), review (add friction, e.g. verify email or phone), refuse (block or require another method)."},"reasons":{"items":{"$ref":"#/components/schemas/Reason"},"type":"array","title":"Reasons","description":"Every signal found, strongest first. Empty when nothing is wrong."}},"type":"object","required":["score","level","verdict","reasons"],"title":"Risk"},"SignupCheck":{"properties":{"email":{"anyOf":[{"$ref":"#/components/schemas/EmailCheck"},{"type":"null"}]},"ip":{"anyOf":[{"$ref":"#/components/schemas/IpCheck"},{"type":"null"}]},"phone":{"anyOf":[{"$ref":"#/components/schemas/PhoneCheck"},{"type":"null"}]},"risk":{"$ref":"#/components/schemas/Risk"}},"type":"object","required":["risk"],"title":"SignupCheck"},"SignupCheckRequest":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Email the person signed up with."},"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip","description":"The visitor's IP address (from your server, not the browser)."},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone","description":"Phone number, if you collect one."},"phone_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Country","description":"Two-letter country for national-format phones."},"verify_mailbox":{"type":"boolean","title":"Verify Mailbox","description":"Also verify the mailbox over SMTP (+5 credits).","default":false}},"type":"object","title":"SignupCheckRequest"},"Usage":{"properties":{"days":{"items":{"$ref":"#/components/schemas/UsageDay"},"type":"array","title":"Days"},"total_credits":{"type":"integer","title":"Total Credits"},"total_calls":{"type":"integer","title":"Total Calls"}},"type":"object","required":["days","total_credits","total_calls"],"title":"Usage"},"UsageDay":{"properties":{"date":{"type":"string","title":"Date"},"credits":{"type":"integer","title":"Credits"},"calls":{"type":"integer","title":"Calls"},"by_check":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Check"}},"type":"object","required":["date","credits","calls","by_check"],"title":"UsageDay"}}}}