{"components":{"headers":{"PaymentRequired":{"description":"Base64-encoded JSON copy of the 402 body (x402 v2).","schema":{"type":"string"}},"PaymentResponse":{"description":"Base64-encoded settlement receipt (x402 v2) for a paid result.","schema":{"type":"string"}},"QuotaLimit":{"description":"API key only: the plan's credits per period.","schema":{"type":"integer"}},"QuotaRemaining":{"description":"API key only: credits left in the period after this request.","schema":{"type":"integer"}},"QuotaReset":{"description":"API key only: end of the period, in Unix seconds.","schema":{"type":"integer"}},"RequestId":{"description":"Request id, also in the body.","schema":{"type":"string"}},"RetryAfter":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"parameters":{"PaymentSignature":{"description":"Base64-encoded x402 v2 payment payload (EIP-3009 'exact' on USDC). Without it the API answers 402 with the price; send the same request again with it to pay.","in":"header","name":"PAYMENT-SIGNATURE","required":false,"schema":{"type":"string"}}},"schemas":{"BimiData":{"additionalProperties":false,"description":"The BIMI assertion record; the logo and certificate are never downloaded.","properties":{"authority_url":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Authority Url"},"declined":{"default":false,"title":"Declined","type":"boolean"},"dmarc_enforced":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Dmarc Enforced"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"logo_url":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Logo Url"},"name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Name"},"record":{"anyOf":[{"maxLength":4096,"type":"string"},{"type":"null"}],"default":null,"title":"Record"},"record_domain":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Record Domain"},"selector":{"maxLength":200,"minLength":1,"title":"Selector","type":"string"}},"required":["domain","selector"],"title":"BimiData","type":"object"},"BimiParseData":{"additionalProperties":false,"description":"A pasted BIMI record; the logo, the certificate and DMARC are not looked up.","properties":{"authority_url":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Authority Url"},"declined":{"default":false,"title":"Declined","type":"boolean"},"is_bimi":{"title":"Is Bimi","type":"boolean"},"logo_url":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Logo Url"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"record":{"maxLength":4096,"title":"Record","type":"string"},"tags":{"default":[],"items":{"$ref":"#/components/schemas/Tag"},"maxItems":32,"title":"Tags","type":"array"},"valid":{"default":false,"title":"Valid","type":"boolean"}},"required":["record","is_bimi"],"title":"BimiParseData","type":"object"},"BulkItemResult_MailCheckData_":{"additionalProperties":false,"properties":{"error":{"anyOf":[{"$ref":"#/components/schemas/ItemError"},{"type":"null"}],"default":null},"index":{"minimum":0,"title":"Index","type":"integer"},"item":{"maxLength":1024,"minLength":1,"title":"Item","type":"string"},"result":{"anyOf":[{"$ref":"#/components/schemas/CheckResponse_MailCheckData_"},{"type":"null"}],"default":null}},"required":["index","item"],"title":"BulkItemResult[MailCheckData]","type":"object"},"BulkResponse_MailCheckData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"failed_count":{"minimum":0,"title":"Failed Count","type":"integer"},"item_count":{"minimum":1,"title":"Item Count","type":"integer"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"results":{"items":{"$ref":"#/components/schemas/BulkItemResult_MailCheckData_"},"maxItems":20,"title":"Results","type":"array"},"retry_token":{"anyOf":[{"maxLength":256,"minLength":16,"pattern":"^[A-Za-z0-9_-]+$","type":"string"},{"type":"null"}],"default":null,"title":"Retry Token"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"succeeded_count":{"minimum":0,"title":"Succeeded Count","type":"integer"}},"required":["request_id","endpoint","checked_at","results","item_count","succeeded_count","failed_count"],"title":"BulkResponse[MailCheckData]","type":"object"},"CaaData":{"additionalProperties":false,"description":"The relevant CAA set (RFC 8659 section 3) and where it was found.","properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"inherited":{"default":false,"title":"Inherited","type":"boolean"},"iodef":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":20,"title":"Iodef","type":"array"},"issuers":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":20,"title":"Issuers","type":"array"},"record_name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Record Name"},"records":{"default":[],"items":{"$ref":"#/components/schemas/CaaRecord"},"maxItems":50,"title":"Records","type":"array"},"wildcard_issuers":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":20,"title":"Wildcard Issuers","type":"array"}},"required":["domain"],"title":"CaaData","type":"object"},"CaaRecord":{"additionalProperties":false,"properties":{"critical":{"title":"Critical","type":"boolean"},"flags":{"maximum":255,"minimum":0,"title":"Flags","type":"integer"},"tag":{"maxLength":32,"minLength":1,"title":"Tag","type":"string"},"value":{"maxLength":4096,"title":"Value","type":"string"}},"required":["flags","tag","value","critical"],"title":"CaaRecord","type":"object"},"ChainCertificate":{"additionalProperties":false,"description":"One certificate of the chain: who it is for and who issued it (RFC 4514 strings).","properties":{"issuer":{"maxLength":512,"title":"Issuer","type":"string"},"subject":{"maxLength":512,"title":"Subject","type":"string"}},"required":["subject","issuer"],"title":"ChainCertificate","type":"object"},"CheckResponse_BimiData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/BimiData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[BimiData]","type":"object"},"CheckResponse_BimiParseData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/BimiParseData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[BimiParseData]","type":"object"},"CheckResponse_CaaData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/CaaData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[CaaData]","type":"object"},"CheckResponse_CookieParseData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/CookieParseData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[CookieParseData]","type":"object"},"CheckResponse_CspParseData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/CspParseData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[CspParseData]","type":"object"},"CheckResponse_DkimData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/DkimData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[DkimData]","type":"object"},"CheckResponse_DkimDiscoverData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/DkimDiscoverData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[DkimDiscoverData]","type":"object"},"CheckResponse_DmarcData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/DmarcData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[DmarcData]","type":"object"},"CheckResponse_DmarcParseData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/DmarcParseData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[DmarcParseData]","type":"object"},"CheckResponse_DnsCompareData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/DnsCompareData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[DnsCompareData]","type":"object"},"CheckResponse_DnsLookupData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/DnsLookupData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[DnsLookupData]","type":"object"},"CheckResponse_DnssecData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/DnssecData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[DnssecData]","type":"object"},"CheckResponse_DomainHealthData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/DomainHealthData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[DomainHealthData]","type":"object"},"CheckResponse_HstsParseData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/HstsParseData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[HstsParseData]","type":"object"},"CheckResponse_HttpsRrData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/HttpsRrData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[HttpsRrData]","type":"object"},"CheckResponse_IdnData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/IdnData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[IdnData]","type":"object"},"CheckResponse_IpCidrData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/IpCidrData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[IpCidrData]","type":"object"},"CheckResponse_IpContainsData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/IpContainsData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[IpContainsData]","type":"object"},"CheckResponse_IpInfoData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/IpInfoData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[IpInfoData]","type":"object"},"CheckResponse_IpRangeData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/IpRangeData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[IpRangeData]","type":"object"},"CheckResponse_MailCheckData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/MailCheckData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[MailCheckData]","type":"object"},"CheckResponse_MailProviderData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/MailProviderData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[MailProviderData]","type":"object"},"CheckResponse_MtaStsData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/MtaStsData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[MtaStsData]","type":"object"},"CheckResponse_MtaStsPolicyParseData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/MtaStsPolicyParseData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[MtaStsPolicyParseData]","type":"object"},"CheckResponse_MxData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/MxData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[MxData]","type":"object"},"CheckResponse_NsData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/NsData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[NsData]","type":"object"},"CheckResponse_NsProviderData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/NsProviderData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[NsProviderData]","type":"object"},"CheckResponse_PemCertificateData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/PemCertificateData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[PemCertificateData]","type":"object"},"CheckResponse_PemCsrData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/PemCsrData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[PemCsrData]","type":"object"},"CheckResponse_PtrData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/PtrData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[PtrData]","type":"object"},"CheckResponse_RdapData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/RdapData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[RdapData]","type":"object"},"CheckResponse_SecurityHeadersData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/SecurityHeadersData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[SecurityHeadersData]","type":"object"},"CheckResponse_SiteHealthData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/SiteHealthData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[SiteHealthData]","type":"object"},"CheckResponse_SoaData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/SoaData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[SoaData]","type":"object"},"CheckResponse_SpfData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/SpfData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[SpfData]","type":"object"},"CheckResponse_SpfFlattenData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/SpfFlattenData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[SpfFlattenData]","type":"object"},"CheckResponse_SpfParseData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/SpfParseData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[SpfParseData]","type":"object"},"CheckResponse_SpoofableData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/SpoofableData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[SpoofableData]","type":"object"},"CheckResponse_SubnetsData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/SubnetsData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[SubnetsData]","type":"object"},"CheckResponse_TlsCertificateData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/TlsCertificateData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[TlsCertificateData]","type":"object"},"CheckResponse_TlsRptData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/TlsRptData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[TlsRptData]","type":"object"},"CheckResponse_TlsRptParseData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/TlsRptParseData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[TlsRptParseData]","type":"object"},"CheckResponse_TtlData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/TtlData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[TtlData]","type":"object"},"CheckResponse_TxtVerificationData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/TxtVerificationData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[TxtVerificationData]","type":"object"},"CheckResponse_WildcardData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/WildcardData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[WildcardData]","type":"object"},"CheckResponse_ZoneLintData_":{"additionalProperties":false,"properties":{"checked_at":{"format":"date-time","title":"Checked At","type":"string"},"data":{"$ref":"#/components/schemas/ZoneLintData"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"findings":{"default":[],"items":{"$ref":"#/components/schemas/Finding"},"maxItems":100,"title":"Findings","type":"array"},"meta":{"$ref":"#/components/schemas/Meta"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"status":{"$ref":"#/components/schemas/Status"}},"required":["request_id","endpoint","checked_at","status","data","meta"],"title":"CheckResponse[ZoneLintData]","type":"object"},"CidrMatch":{"additionalProperties":false,"properties":{"cidr":{"maxLength":64,"minLength":2,"title":"Cidr","type":"string"},"contains":{"title":"Contains","type":"boolean"}},"required":["cidr","contains"],"title":"CidrMatch","type":"object"},"CookieFlags":{"additionalProperties":false,"description":"A Set-Cookie header as name and attributes; the value is never kept.","properties":{"http_only":{"title":"Http Only","type":"boolean"},"name":{"maxLength":128,"title":"Name","type":"string"},"same_site":{"anyOf":[{"enum":["strict","lax","none","other"],"type":"string"},{"type":"null"}],"default":null,"title":"Same Site"},"secure":{"title":"Secure","type":"boolean"}},"required":["name","secure","http_only"],"title":"CookieFlags","type":"object"},"CookieParseData":{"additionalProperties":false,"description":"A pasted Set-Cookie value. The cookie value is never returned: only its length.","properties":{"attributes":{"default":[],"items":{"maxLength":64,"minLength":1,"type":"string"},"maxItems":32,"title":"Attributes","type":"array"},"domain":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Domain"},"expires":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Expires"},"header_name":{"anyOf":[{"maxLength":64,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Header Name"},"http_only":{"default":false,"title":"Http Only","type":"boolean"},"lifetime_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Lifetime Days"},"max_age":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Max Age"},"name":{"maxLength":128,"title":"Name","type":"string"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"partitioned":{"default":false,"title":"Partitioned","type":"boolean"},"path":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Path"},"persistent":{"default":false,"title":"Persistent","type":"boolean"},"prefix":{"anyOf":[{"enum":["__Host-","__Secure-"],"type":"string"},{"type":"null"}],"default":null,"title":"Prefix"},"same_site":{"anyOf":[{"enum":["strict","lax","none","other"],"type":"string"},{"type":"null"}],"default":null,"title":"Same Site"},"secure":{"default":false,"title":"Secure","type":"boolean"},"value_length":{"minimum":0,"title":"Value Length","type":"integer"}},"required":["name","value_length"],"title":"CookieParseData","type":"object"},"CspDirective":{"additionalProperties":false,"description":"One directive of a policy; ``sources`` are lower-cased as browsers compare them.","properties":{"name":{"maxLength":64,"minLength":1,"title":"Name","type":"string"},"sources":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":64,"title":"Sources","type":"array"}},"required":["name"],"title":"CspDirective","type":"object"},"CspParseData":{"additionalProperties":false,"description":"A pasted Content-Security-Policy value; a comma separates several policies (CSP3).","properties":{"header_name":{"anyOf":[{"maxLength":64,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Header Name"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"policies":{"default":[],"items":{"$ref":"#/components/schemas/CspPolicy"},"maxItems":8,"title":"Policies","type":"array"},"report_only":{"default":false,"title":"Report Only","type":"boolean"}},"title":"CspParseData","type":"object"},"CspPolicy":{"additionalProperties":false,"properties":{"directives":{"default":[],"items":{"$ref":"#/components/schemas/CspDirective"},"maxItems":64,"title":"Directives","type":"array"}},"title":"CspPolicy","type":"object"},"DkimData":{"additionalProperties":false,"properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"key_bits":{"anyOf":[{"maximum":65536,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Key Bits"},"key_bytes":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Key Bytes"},"key_type":{"anyOf":[{"maxLength":32,"type":"string"},{"type":"null"}],"default":null,"title":"Key Type"},"name":{"maxLength":255,"minLength":1,"title":"Name","type":"string"},"record":{"anyOf":[{"maxLength":4096,"type":"string"},{"type":"null"}],"default":null,"title":"Record"},"revoked":{"default":false,"title":"Revoked","type":"boolean"},"selector":{"maxLength":200,"minLength":1,"title":"Selector","type":"string"},"tags":{"default":[],"items":{"$ref":"#/components/schemas/Tag"},"maxItems":32,"title":"Tags","type":"array"},"testing":{"default":false,"title":"Testing","type":"boolean"}},"required":["domain","selector","name"],"title":"DkimData","type":"object"},"DkimDiscoverData":{"additionalProperties":false,"description":"``tried`` is the fixed selector list; ``found`` has one entry per selector with a key.","properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"found":{"default":[],"items":{"$ref":"#/components/schemas/DkimData"},"maxItems":50,"title":"Found","type":"array"},"tried":{"default":[],"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":50,"title":"Tried","type":"array"}},"required":["domain"],"title":"DkimDiscoverData","type":"object"},"DmarcData":{"additionalProperties":false,"properties":{"adkim":{"anyOf":[{"enum":["r","s"],"type":"string"},{"type":"null"}],"default":null,"title":"Adkim"},"applied_policy":{"anyOf":[{"enum":["none","quarantine","reject"],"type":"string"},{"type":"null"}],"default":null,"title":"Applied Policy"},"aspf":{"anyOf":[{"enum":["r","s"],"type":"string"},{"type":"null"}],"default":null,"title":"Aspf"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"effective_policy":{"anyOf":[{"enum":["none","quarantine","reject"],"type":"string"},{"type":"null"}],"default":null,"title":"Effective Policy"},"nonexistent_policy":{"anyOf":[{"enum":["none","quarantine","reject"],"type":"string"},{"type":"null"}],"default":null,"title":"Nonexistent Policy"},"org_domain":{"maxLength":255,"minLength":1,"title":"Org Domain","type":"string"},"pct":{"anyOf":[{"maximum":100,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Pct"},"policy":{"anyOf":[{"enum":["none","quarantine","reject"],"type":"string"},{"type":"null"}],"default":null,"title":"Policy"},"record":{"anyOf":[{"maxLength":4096,"type":"string"},{"type":"null"}],"default":null,"title":"Record"},"record_domain":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Record Domain"},"rua":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":20,"title":"Rua","type":"array"},"ruf":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":20,"title":"Ruf","type":"array"},"subdomain_policy":{"anyOf":[{"enum":["none","quarantine","reject"],"type":"string"},{"type":"null"}],"default":null,"title":"Subdomain Policy"},"tags":{"default":[],"items":{"$ref":"#/components/schemas/Tag"},"maxItems":32,"title":"Tags","type":"array"},"test_mode":{"default":false,"title":"Test Mode","type":"boolean"}},"required":["domain","org_domain"],"title":"DmarcData","type":"object"},"DmarcParseData":{"additionalProperties":false,"description":"The record's own policy; ``notes`` say what an offline parse cannot decide.","properties":{"adkim":{"anyOf":[{"enum":["r","s"],"type":"string"},{"type":"null"}],"default":null,"title":"Adkim"},"aspf":{"anyOf":[{"enum":["r","s"],"type":"string"},{"type":"null"}],"default":null,"title":"Aspf"},"is_dmarc":{"title":"Is Dmarc","type":"boolean"},"nonexistent_policy":{"anyOf":[{"enum":["none","quarantine","reject"],"type":"string"},{"type":"null"}],"default":null,"title":"Nonexistent Policy"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"pct":{"anyOf":[{"maximum":100,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Pct"},"policy":{"anyOf":[{"enum":["none","quarantine","reject"],"type":"string"},{"type":"null"}],"default":null,"title":"Policy"},"psd":{"anyOf":[{"enum":["y","n","u"],"type":"string"},{"type":"null"}],"default":null,"title":"Psd"},"record":{"maxLength":4096,"title":"Record","type":"string"},"rua":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":20,"title":"Rua","type":"array"},"ruf":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":20,"title":"Ruf","type":"array"},"subdomain_policy":{"anyOf":[{"enum":["none","quarantine","reject"],"type":"string"},{"type":"null"}],"default":null,"title":"Subdomain Policy"},"tags":{"default":[],"items":{"$ref":"#/components/schemas/Tag"},"maxItems":32,"title":"Tags","type":"array"},"test_mode":{"default":false,"title":"Test Mode","type":"boolean"},"unknown_tags":{"default":[],"items":{"maxLength":32,"minLength":1,"type":"string"},"maxItems":32,"title":"Unknown Tags","type":"array"}},"required":["record","is_dmarc"],"title":"DmarcParseData","type":"object"},"DnsCompareData":{"additionalProperties":false,"description":"``match`` is None when fewer than two resolvers answered.","properties":{"answers":{"default":[],"items":{"$ref":"#/components/schemas/ResolverAnswer"},"maxItems":4,"title":"Answers","type":"array"},"match":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Match"},"name":{"maxLength":255,"minLength":1,"title":"Name","type":"string"},"type":{"enum":["A","AAAA","CNAME","MX","NS","TXT","SOA","CAA","SRV"],"title":"Type","type":"string"}},"required":["name","type"],"title":"DnsCompareData","type":"object"},"DnsLookupData":{"additionalProperties":false,"properties":{"answers":{"items":{"$ref":"#/components/schemas/DnsRecordSet"},"maxItems":9,"title":"Answers","type":"array"},"name":{"maxLength":255,"minLength":1,"title":"Name","type":"string"}},"required":["name","answers"],"title":"DnsLookupData","type":"object"},"DnsRecordSet":{"additionalProperties":false,"properties":{"rcode":{"enum":["NOERROR","NXDOMAIN","SERVFAIL","REFUSED","OTHER"],"title":"Rcode","type":"string"},"records":{"default":[],"items":{"maxLength":4096,"type":"string"},"maxItems":50,"title":"Records","type":"array"},"ttl":{"anyOf":[{"maximum":2147483647,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Ttl"},"type":{"enum":["A","AAAA","CNAME","MX","NS","TXT","SOA","CAA","SRV"],"title":"Type","type":"string"}},"required":["type","rcode"],"title":"DnsRecordSet","type":"object"},"DnskeyRecord":{"additionalProperties":false,"properties":{"algorithm":{"maximum":255,"minimum":0,"title":"Algorithm","type":"integer"},"flags":{"maximum":65535,"minimum":0,"title":"Flags","type":"integer"},"protocol":{"maximum":255,"minimum":0,"title":"Protocol","type":"integer"},"role":{"enum":["ksk","zsk","other"],"title":"Role","type":"string"}},"required":["flags","protocol","algorithm","role"],"title":"DnskeyRecord","type":"object"},"DnssecData":{"additionalProperties":false,"description":"``validated`` is the resolver's AD flag on SOA or DNSKEY; there is no local validation.","properties":{"dnskeys":{"default":[],"items":{"$ref":"#/components/schemas/DnskeyRecord"},"maxItems":20,"title":"Dnskeys","type":"array"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"ds":{"default":[],"items":{"$ref":"#/components/schemas/DsRecord"},"maxItems":20,"title":"Ds","type":"array"},"state":{"enum":["secure","insecure","bogus","unknown"],"title":"State","type":"string"},"validated":{"default":false,"title":"Validated","type":"boolean"}},"required":["domain","state"],"title":"DnssecData","type":"object"},"DomainHealthData":{"additionalProperties":false,"description":"One optional section per check. A section that failed is None; its code is a finding.","properties":{"bimi":{"anyOf":[{"$ref":"#/components/schemas/BimiData"},{"type":"null"}],"default":null},"caa":{"anyOf":[{"$ref":"#/components/schemas/CaaData"},{"type":"null"}],"default":null},"dkim":{"anyOf":[{"$ref":"#/components/schemas/DkimDiscoverData"},{"type":"null"}],"default":null},"dmarc":{"anyOf":[{"$ref":"#/components/schemas/DmarcData"},{"type":"null"}],"default":null},"dnssec":{"anyOf":[{"$ref":"#/components/schemas/DnssecData"},{"type":"null"}],"default":null},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"mta_sts":{"anyOf":[{"$ref":"#/components/schemas/MtaStsData"},{"type":"null"}],"default":null},"mx":{"anyOf":[{"$ref":"#/components/schemas/MxData"},{"type":"null"}],"default":null},"provider":{"anyOf":[{"$ref":"#/components/schemas/MailProviderData"},{"type":"null"}],"default":null},"ptr":{"anyOf":[{"$ref":"#/components/schemas/PtrData"},{"type":"null"}],"default":null},"spf":{"anyOf":[{"$ref":"#/components/schemas/SpfData"},{"type":"null"}],"default":null}},"required":["domain"],"title":"DomainHealthData","type":"object"},"DsRecord":{"additionalProperties":false,"properties":{"algorithm":{"maximum":255,"minimum":0,"title":"Algorithm","type":"integer"},"digest_type":{"maximum":255,"minimum":0,"title":"Digest Type","type":"integer"},"key_tag":{"maximum":65535,"minimum":0,"title":"Key Tag","type":"integer"}},"required":["key_tag","algorithm","digest_type"],"title":"DsRecord","type":"object"},"EndpointUsage":{"additionalProperties":false,"properties":{"credits":{"minimum":0,"title":"Credits","type":"integer"},"endpoint":{"maxLength":64,"pattern":"^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$","title":"Endpoint","type":"string"},"requests":{"minimum":0,"title":"Requests","type":"integer"}},"required":["endpoint","requests","credits"],"title":"EndpointUsage","type":"object"},"ErrorBody":{"additionalProperties":false,"properties":{"details":{"default":[],"items":{"$ref":"#/components/schemas/ErrorDetail"},"maxItems":50,"title":"Details","type":"array"},"error":{"pattern":"^[a-z][a-z0-9_]{1,63}$","title":"Error","type":"string"},"message":{"maxLength":500,"minLength":1,"title":"Message","type":"string"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"},"upgrade_url":{"anyOf":[{"maxLength":200,"minLength":1,"pattern":"^https://","type":"string"},{"type":"null"}],"default":null,"title":"Upgrade Url"}},"required":["error","message","request_id"],"title":"ErrorBody","type":"object"},"ErrorDetail":{"additionalProperties":false,"properties":{"loc":{"default":[],"items":{"anyOf":[{"maxLength":128,"type":"string"},{"minimum":0,"type":"integer"}]},"maxItems":10,"title":"Loc","type":"array"},"message":{"maxLength":300,"minLength":1,"title":"Message","type":"string"}},"required":["message"],"title":"ErrorDetail","type":"object"},"Finding":{"additionalProperties":false,"properties":{"code":{"maxLength":64,"pattern":"^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)+$","title":"Code","type":"string"},"evidence":{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"maxProperties":32,"title":"Evidence","type":"object"},"explanation":{"maxLength":2000,"minLength":1,"title":"Explanation","type":"string"},"message":{"maxLength":300,"minLength":1,"title":"Message","type":"string"},"recommendation":{"anyOf":[{"maxLength":2000,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Recommendation"},"severity":{"$ref":"#/components/schemas/Severity"}},"required":["code","severity","message","explanation"],"title":"Finding","type":"object"},"HstsParseData":{"additionalProperties":false,"description":"A pasted Strict-Transport-Security value read as RFC 6797 section 6.1 says.","properties":{"directives":{"default":[],"items":{"maxLength":64,"minLength":1,"type":"string"},"maxItems":32,"title":"Directives","type":"array"},"header_name":{"anyOf":[{"maxLength":64,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Header Name"},"include_subdomains":{"default":false,"title":"Include Subdomains","type":"boolean"},"max_age":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Max Age"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"preload":{"default":false,"title":"Preload","type":"boolean"},"preload_eligible":{"default":false,"title":"Preload Eligible","type":"boolean"},"preload_missing":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":5,"title":"Preload Missing","type":"array"},"valid":{"title":"Valid","type":"boolean"}},"required":["valid"],"title":"HstsParseData","type":"object"},"HstsPolicy":{"additionalProperties":false,"description":"Strict-Transport-Security (RFC 6797). ``valid`` is False when a browser ignores it.","properties":{"include_subdomains":{"default":false,"title":"Include Subdomains","type":"boolean"},"max_age":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Max Age"},"preload":{"default":false,"title":"Preload","type":"boolean"},"raw":{"maxLength":1024,"title":"Raw","type":"string"},"valid":{"title":"Valid","type":"boolean"}},"required":["raw","valid"],"title":"HstsPolicy","type":"object"},"HttpsRrData":{"additionalProperties":false,"properties":{"alias_target":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Alias Target"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"records":{"default":[],"items":{"$ref":"#/components/schemas/SvcbRecord"},"maxItems":50,"title":"Records","type":"array"}},"required":["domain"],"title":"HttpsRrData","type":"object"},"IdnData":{"additionalProperties":false,"description":"``labels`` is filled only when every label converts; ``problems`` says why not.","properties":{"ascii":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"default":null,"title":"Ascii"},"is_idn":{"default":false,"title":"Is Idn","type":"boolean"},"labels":{"default":[],"items":{"$ref":"#/components/schemas/IdnLabel"},"maxItems":127,"title":"Labels","type":"array"},"name":{"maxLength":255,"title":"Name","type":"string"},"problems":{"default":[],"items":{"$ref":"#/components/schemas/IdnProblem"},"maxItems":127,"title":"Problems","type":"array"},"unicode":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"default":null,"title":"Unicode"},"valid":{"title":"Valid","type":"boolean"}},"required":["name","valid"],"title":"IdnData","type":"object"},"IdnLabel":{"additionalProperties":false,"properties":{"ascii":{"maxLength":255,"title":"Ascii","type":"string"},"is_idn":{"title":"Is Idn","type":"boolean"},"scripts":{"default":[],"items":{"maxLength":32,"minLength":1,"type":"string"},"maxItems":8,"title":"Scripts","type":"array"},"unicode":{"maxLength":255,"title":"Unicode","type":"string"}},"required":["ascii","unicode","is_idn"],"title":"IdnLabel","type":"object"},"IdnProblem":{"additionalProperties":false,"properties":{"label":{"maxLength":255,"title":"Label","type":"string"},"reason":{"enum":["empty_label","too_long","label_too_long","disallowed_char","bidi","context","hyphen","invalid_punycode","invalid"],"title":"Reason","type":"string"}},"required":["label","reason"],"title":"IdnProblem","type":"object"},"IpCidrData":{"additionalProperties":false,"description":"``netmask`` and ``hostmask`` are IPv4 only; ``size`` is text because IPv6 exceeds 2**63.","properties":{"first":{"maxLength":64,"minLength":2,"title":"First","type":"string"},"host_bits_set":{"title":"Host Bits Set","type":"boolean"},"hostmask":{"anyOf":[{"maxLength":64,"minLength":2,"type":"string"},{"type":"null"}],"default":null,"title":"Hostmask"},"input":{"maxLength":64,"minLength":2,"title":"Input","type":"string"},"last":{"maxLength":64,"minLength":2,"title":"Last","type":"string"},"netmask":{"anyOf":[{"maxLength":64,"minLength":2,"type":"string"},{"type":"null"}],"default":null,"title":"Netmask"},"network":{"maxLength":64,"minLength":2,"title":"Network","type":"string"},"prefix":{"maximum":128,"minimum":0,"title":"Prefix","type":"integer"},"size":{"maxLength":40,"minLength":1,"pattern":"^[0-9]+$","title":"Size","type":"string"},"version":{"enum":[4,6],"title":"Version","type":"integer"}},"required":["input","network","version","prefix","first","last","size","host_bits_set"],"title":"IpCidrData","type":"object"},"IpContainsData":{"additionalProperties":false,"properties":{"contained":{"title":"Contained","type":"boolean"},"ip":{"maxLength":64,"minLength":2,"title":"Ip","type":"string"},"matches":{"default":[],"items":{"maxLength":64,"minLength":2,"type":"string"},"maxItems":100,"title":"Matches","type":"array"},"results":{"items":{"$ref":"#/components/schemas/CidrMatch"},"maxItems":100,"title":"Results","type":"array"}},"required":["ip","contained","results"],"title":"IpContainsData","type":"object"},"IpInfoData":{"additionalProperties":false,"properties":{"compressed":{"maxLength":64,"minLength":2,"title":"Compressed","type":"string"},"exploded":{"maxLength":64,"minLength":2,"title":"Exploded","type":"string"},"ip":{"maxLength":64,"minLength":2,"title":"Ip","type":"string"},"ipv4_mapped":{"anyOf":[{"maxLength":64,"minLength":2,"type":"string"},{"type":"null"}],"default":null,"title":"Ipv4 Mapped"},"is_global":{"title":"Is Global","type":"boolean"},"reverse_pointer":{"maxLength":80,"minLength":1,"title":"Reverse Pointer","type":"string"},"scope":{"enum":["global","private","loopback","link_local","multicast","reserved","unspecified","shared","documentation","benchmarking","6to4","teredo","nat64"],"title":"Scope","type":"string"},"scope_source":{"$ref":"#/components/schemas/ScopeSource"},"version":{"enum":[4,6],"title":"Version","type":"integer"}},"required":["ip","version","compressed","exploded","scope","scope_source","is_global","reverse_pointer"],"title":"IpInfoData","type":"object"},"IpRangeData":{"additionalProperties":false,"properties":{"cidrs":{"items":{"maxLength":64,"minLength":2,"type":"string"},"maxItems":254,"minItems":1,"title":"Cidrs","type":"array"},"end":{"maxLength":64,"minLength":2,"title":"End","type":"string"},"size":{"maxLength":40,"minLength":1,"pattern":"^[0-9]+$","title":"Size","type":"string"},"start":{"maxLength":64,"minLength":2,"title":"Start","type":"string"},"version":{"enum":[4,6],"title":"Version","type":"integer"}},"required":["start","end","version","size","cidrs"],"title":"IpRangeData","type":"object"},"ItemError":{"additionalProperties":false,"properties":{"code":{"maxLength":64,"pattern":"^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)+$","title":"Code","type":"string"},"message":{"maxLength":300,"minLength":1,"title":"Message","type":"string"}},"required":["code","message"],"title":"ItemError","type":"object"},"JsonValue":{},"MailCheckData":{"additionalProperties":false,"properties":{"classification":{"anyOf":[{"$ref":"#/components/schemas/MailClassification"},{"type":"null"}],"default":null},"dkim":{"default":[],"items":{"$ref":"#/components/schemas/DkimData"},"maxItems":5,"title":"Dkim","type":"array"},"dmarc":{"anyOf":[{"$ref":"#/components/schemas/DmarcData"},{"type":"null"}],"default":null},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"incomplete":{"default":[],"items":{"enum":["mx","spf","dmarc","dkim"],"type":"string"},"maxItems":4,"title":"Incomplete","type":"array"},"mx":{"anyOf":[{"$ref":"#/components/schemas/MxData"},{"type":"null"}],"default":null},"spf":{"anyOf":[{"$ref":"#/components/schemas/SpfData"},{"type":"null"}],"default":null}},"required":["domain"],"title":"MailCheckData","type":"object"},"MailClassification":{"additionalProperties":false,"description":"The study's category for the domain (``probekit_contracts.spoofcategory``).","properties":{"category":{"enum":["protected","partial","monitoring","unprotected","broken","unresolved","nxdomain","lame_delegation"],"title":"Category","type":"string"},"reasons":{"default":[],"items":{"enum":["check_incomplete","dns_failure","domain_not_found","domain_unresolvable","dmarc_multiple_records","dmarc_syntax_error","dmarc_invalid_policy","dmarc_no_applied_policy","dmarc_missing","policy_reject","policy_quarantine","policy_none","test_mode_lowered","policy_inherited","subdomains_open","reporting_broken"],"type":"string"},"maxItems":8,"title":"Reasons","type":"array"},"reporting_broken":{"title":"Reporting Broken","type":"boolean"},"subdomains_open":{"title":"Subdomains Open","type":"boolean"}},"required":["category","subdomains_open","reporting_broken"],"title":"MailClassification","type":"object"},"MailProviderData":{"additionalProperties":false,"description":"``primary`` is the provider behind the MX host with the lowest preference, if known.","properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"list_version":{"maxLength":32,"minLength":1,"title":"List Version","type":"string"},"primary":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Primary"},"providers":{"default":[],"items":{"$ref":"#/components/schemas/ProviderMatch"},"maxItems":20,"title":"Providers","type":"array"}},"required":["domain","list_version"],"title":"MailProviderData","type":"object"},"Meta":{"additionalProperties":false,"properties":{"cache_hit":{"title":"Cache Hit","type":"boolean"},"duration_ms":{"minimum":0,"title":"Duration Ms","type":"integer"},"fresh_until":{"format":"date-time","title":"Fresh Until","type":"string"},"observed_at":{"format":"date-time","title":"Observed At","type":"string"},"resolver":{"anyOf":[{"maxLength":128,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Resolver"},"source":{"maxLength":64,"minLength":1,"title":"Source","type":"string"}},"required":["duration_ms","cache_hit","source","observed_at","fresh_until"],"title":"Meta","type":"object"},"MtaStsData":{"additionalProperties":false,"properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"mx_hosts":{"default":[],"items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":50,"title":"Mx Hosts","type":"array"},"policy":{"anyOf":[{"$ref":"#/components/schemas/MtaStsPolicy"},{"type":"null"}],"default":null},"policy_fetched":{"default":false,"title":"Policy Fetched","type":"boolean"},"policy_id":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Policy Id"},"record":{"anyOf":[{"maxLength":4096,"type":"string"},{"type":"null"}],"default":null,"title":"Record"},"tlsrpt_record":{"anyOf":[{"maxLength":4096,"type":"string"},{"type":"null"}],"default":null,"title":"Tlsrpt Record"},"tlsrpt_rua":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":20,"title":"Tlsrpt Rua","type":"array"},"uncovered_mx":{"default":[],"items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":50,"title":"Uncovered Mx","type":"array"}},"required":["domain"],"title":"MtaStsData","type":"object"},"MtaStsPolicy":{"additionalProperties":false,"description":"The parsed policy file (RFC 8461 section 3.2); fields that did not parse are None.","properties":{"max_age":{"anyOf":[{"maximum":31557600,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Max Age"},"mode":{"anyOf":[{"enum":["enforce","testing","none"],"type":"string"},{"type":"null"}],"default":null,"title":"Mode"},"mx":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":20,"title":"Mx","type":"array"},"version":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Version"}},"title":"MtaStsPolicy","type":"object"},"MtaStsPolicyParseData":{"additionalProperties":false,"description":"A pasted MTA-STS policy file, read as mail.mta_sts reads a fetched one.","properties":{"mx_count":{"default":0,"minimum":0,"title":"Mx Count","type":"integer"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"policy":{"$ref":"#/components/schemas/MtaStsPolicy"},"problems":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":5,"title":"Problems","type":"array"},"valid":{"title":"Valid","type":"boolean"}},"required":["valid","policy"],"title":"MtaStsPolicyParseData","type":"object"},"MxData":{"additionalProperties":false,"properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"hosts":{"default":[],"items":{"$ref":"#/components/schemas/MxHost"},"maxItems":50,"title":"Hosts","type":"array"},"implicit_mx":{"default":false,"title":"Implicit Mx","type":"boolean"},"null_mx":{"default":false,"title":"Null Mx","type":"boolean"}},"required":["domain"],"title":"MxData","type":"object"},"MxHost":{"additionalProperties":false,"properties":{"addresses":{"default":[],"items":{"maxLength":45,"type":"string"},"maxItems":32,"title":"Addresses","type":"array"},"exchange":{"maxLength":255,"minLength":1,"title":"Exchange","type":"string"},"preference":{"maximum":65535,"minimum":0,"title":"Preference","type":"integer"},"resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Resolved"}},"required":["preference","exchange"],"title":"MxHost","type":"object"},"NsData":{"additionalProperties":false,"description":"The NS set; ``hosts`` covers the first eight names in alphabetical order.","properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"hosts":{"default":[],"items":{"$ref":"#/components/schemas/NsHost"},"maxItems":13,"title":"Hosts","type":"array"},"ipv4_networks":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":13,"title":"Ipv4 Networks","type":"array"},"ipv6_networks":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":13,"title":"Ipv6 Networks","type":"array"},"ns_count":{"default":0,"minimum":0,"title":"Ns Count","type":"integer"}},"required":["domain"],"title":"NsData","type":"object"},"NsHost":{"additionalProperties":false,"description":"One name server: ``resolved`` is None when an address lookup failed.","properties":{"addresses":{"default":[],"items":{"maxLength":45,"type":"string"},"maxItems":16,"title":"Addresses","type":"array"},"in_bailiwick":{"default":false,"title":"In Bailiwick","type":"boolean"},"name":{"maxLength":255,"minLength":1,"title":"Name","type":"string"},"resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Resolved"}},"required":["name"],"title":"NsHost","type":"object"},"NsProviderData":{"additionalProperties":false,"description":"``providers`` and ``unknown`` cover the first 13 name servers in alphabetical order.","properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"list_version":{"maxLength":32,"minLength":1,"title":"List Version","type":"string"},"ns_count":{"default":0,"minimum":0,"title":"Ns Count","type":"integer"},"providers":{"default":[],"items":{"$ref":"#/components/schemas/NsProviderMatch"},"maxItems":13,"title":"Providers","type":"array"},"unknown":{"default":[],"items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":13,"title":"Unknown","type":"array"}},"required":["domain","list_version"],"title":"NsProviderData","type":"object"},"NsProviderMatch":{"additionalProperties":false,"description":"One DNS provider and the name servers whose names matched it.","properties":{"name":{"maxLength":64,"minLength":1,"title":"Name","type":"string"},"nameservers":{"items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":13,"minItems":1,"title":"Nameservers","type":"array"}},"required":["name","nameservers"],"title":"NsProviderMatch","type":"object"},"PemCertificateData":{"additionalProperties":false,"description":"A decoded X.509 certificate. Email addresses and other personal SAN types are left out\n(``omitted`` says which kinds were present); everything else is as written in the PEM.","properties":{"days_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Days Remaining"},"decoded":{"title":"Decoded","type":"boolean"},"extended_key_usage":{"default":[],"items":{"maxLength":64,"minLength":1,"type":"string"},"maxItems":16,"title":"Extended Key Usage","type":"array"},"is_ca":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Is Ca"},"issuer":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Issuer"},"key_bits":{"anyOf":[{"maximum":65536,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Key Bits"},"key_type":{"anyOf":[{"enum":["rsa","ec","ed25519","ed448","dsa","other"],"type":"string"},{"type":"null"}],"default":null,"title":"Key Type"},"key_usage":{"default":[],"items":{"maxLength":64,"minLength":1,"type":"string"},"maxItems":16,"title":"Key Usage","type":"array"},"not_after":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Not After"},"not_before":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Not Before"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"omitted":{"default":[],"items":{"enum":["subject_email","issuer_email","san_email","san_other"],"type":"string"},"maxItems":4,"title":"Omitted","type":"array"},"path_length":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Path Length"},"san_count":{"default":0,"minimum":0,"title":"San Count","type":"integer"},"san_dns":{"default":[],"items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":50,"title":"San Dns","type":"array"},"san_ip":{"default":[],"items":{"maxLength":45,"minLength":2,"type":"string"},"maxItems":50,"title":"San Ip","type":"array"},"self_issued":{"default":false,"title":"Self Issued","type":"boolean"},"self_signed":{"default":false,"title":"Self Signed","type":"boolean"},"serial_number":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"default":null,"title":"Serial Number"},"sha1_fingerprint":{"anyOf":[{"pattern":"^[0-9a-f]{40,64}$","type":"string"},{"type":"null"}],"default":null,"title":"Sha1 Fingerprint"},"sha256_fingerprint":{"anyOf":[{"pattern":"^[0-9a-f]{40,64}$","type":"string"},{"type":"null"}],"default":null,"title":"Sha256 Fingerprint"},"signature_algorithm":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"default":null,"title":"Signature Algorithm"},"subject":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Subject"},"subject_cn":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Subject Cn"},"validity_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Validity Days"},"version":{"anyOf":[{"enum":["v1","v3"],"type":"string"},{"type":"null"}],"default":null,"title":"Version"}},"required":["decoded"],"title":"PemCertificateData","type":"object"},"PemCsrData":{"additionalProperties":false,"description":"A decoded PKCS#10 request (RFC 2986), with the same personal-data omissions.","properties":{"decoded":{"title":"Decoded","type":"boolean"},"key_bits":{"anyOf":[{"maximum":65536,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Key Bits"},"key_type":{"anyOf":[{"enum":["rsa","ec","ed25519","ed448","dsa","other"],"type":"string"},{"type":"null"}],"default":null,"title":"Key Type"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"omitted":{"default":[],"items":{"enum":["subject_email","issuer_email","san_email","san_other"],"type":"string"},"maxItems":4,"title":"Omitted","type":"array"},"san_count":{"default":0,"minimum":0,"title":"San Count","type":"integer"},"san_dns":{"default":[],"items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":50,"title":"San Dns","type":"array"},"san_ip":{"default":[],"items":{"maxLength":45,"minLength":2,"type":"string"},"maxItems":50,"title":"San Ip","type":"array"},"signature_algorithm":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"default":null,"title":"Signature Algorithm"},"signature_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Signature Valid"},"subject":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Subject"},"subject_cn":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Subject Cn"}},"required":["decoded"],"title":"PemCsrData","type":"object"},"ProviderMatch":{"additionalProperties":false,"description":"A provider from the fixed list and the MX hosts or SPF include domains that matched.","properties":{"evidence":{"items":{"enum":["mx","spf"],"type":"string"},"maxItems":2,"minItems":1,"title":"Evidence","type":"array"},"kind":{"enum":["mailbox","gateway","sending"],"title":"Kind","type":"string"},"matched":{"default":[],"items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":10,"title":"Matched","type":"array"},"name":{"maxLength":512,"title":"Name","type":"string"}},"required":["name","kind","evidence"],"title":"ProviderMatch","type":"object"},"PtrAddress":{"additionalProperties":false,"description":"``forward_confirmed`` is None when a lookup failed and no conclusion is possible.","properties":{"address":{"maxLength":45,"title":"Address","type":"string"},"forward_confirmed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Forward Confirmed"},"host":{"maxLength":255,"minLength":1,"title":"Host","type":"string"},"ptr_names":{"default":[],"items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":5,"title":"Ptr Names","type":"array"}},"required":["host","address"],"title":"PtrAddress","type":"object"},"PtrData":{"additionalProperties":false,"properties":{"addresses":{"default":[],"items":{"$ref":"#/components/schemas/PtrAddress"},"maxItems":10,"title":"Addresses","type":"array"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"}},"required":["domain"],"title":"PtrData","type":"object"},"RdapData":{"additionalProperties":false,"description":"The registry's RDAP record for the registrable domain (RFC 9083).\n\nOnly the registrar entity is read; every other entity and vCard (registrant, contacts) is\ndiscarded, so no personal data is kept or returned. ``registered`` is False on a 404 and\nNone when the registry could not be asked.","properties":{"created":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Created"},"days_to_expiry":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Days To Expiry"},"delegation_signed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Delegation Signed"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"expires":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Expires"},"last_changed":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Last Changed"},"ldh_name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Ldh Name"},"nameservers":{"default":[],"items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":13,"title":"Nameservers","type":"array"},"rdap_server":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Rdap Server"},"registered":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Registered"},"registrar":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Registrar"},"registrar_iana_id":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Registrar Iana Id"},"statuses":{"default":[],"items":{"maxLength":32,"minLength":1,"type":"string"},"maxItems":20,"title":"Statuses","type":"array"}},"required":["domain"],"title":"RdapData","type":"object"},"RedirectChain":{"additionalProperties":false,"description":"Requests from ``start_url`` until a response that is not a redirect, or a failure.","properties":{"error":{"anyOf":[{"enum":["dns","no_address","blocked_address","connect","tls","timeout","malformed","too_large","status","redirect_limit","blocked_redirect"],"type":"string"},{"type":"null"}],"default":null,"title":"Error"},"final_status":{"anyOf":[{"maximum":599,"minimum":100,"type":"integer"},{"type":"null"}],"default":null,"title":"Final Status"},"final_url":{"anyOf":[{"maxLength":1024,"type":"string"},{"type":"null"}],"default":null,"title":"Final Url"},"hops":{"default":[],"items":{"$ref":"#/components/schemas/RedirectHop"},"maxItems":6,"title":"Hops","type":"array"},"start_url":{"maxLength":1024,"title":"Start Url","type":"string"}},"required":["start_url"],"title":"RedirectChain","type":"object"},"RedirectHop":{"additionalProperties":false,"description":"One response in a chain: the URL asked for, its status and Location (if any).","properties":{"location":{"anyOf":[{"maxLength":1024,"type":"string"},{"type":"null"}],"default":null,"title":"Location"},"status":{"maximum":599,"minimum":100,"title":"Status","type":"integer"},"url":{"maxLength":1024,"title":"Url","type":"string"}},"required":["url","status"],"title":"RedirectHop","type":"object"},"ResolverAnswer":{"additionalProperties":false,"description":"One resolver's answer; ``error`` says why there is none.","properties":{"error":{"anyOf":[{"enum":["timeout","network","budget"],"type":"string"},{"type":"null"}],"default":null,"title":"Error"},"rcode":{"anyOf":[{"enum":["NOERROR","NXDOMAIN","SERVFAIL","REFUSED","OTHER"],"type":"string"},{"type":"null"}],"default":null,"title":"Rcode"},"records":{"default":[],"items":{"maxLength":4096,"type":"string"},"maxItems":50,"title":"Records","type":"array"},"resolver":{"maxLength":32,"minLength":1,"title":"Resolver","type":"string"},"ttl":{"anyOf":[{"maximum":2147483647,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Ttl"}},"required":["resolver"],"title":"ResolverAnswer","type":"object"},"ScopeSource":{"additionalProperties":false,"description":"Where ``scope`` comes from: the special-purpose block and its RFC, or ``ipaddress``.","properties":{"network":{"anyOf":[{"maxLength":64,"minLength":2,"type":"string"},{"type":"null"}],"default":null,"title":"Network"},"registry":{"maxLength":120,"minLength":1,"title":"Registry","type":"string"},"rfc":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"title":"Rfc"}},"required":["registry"],"title":"ScopeSource","type":"object"},"SecurityHeaders":{"additionalProperties":false,"description":"Security headers of the final HTTPS response, raw values clipped to 1 KB.","properties":{"content_security_policy":{"anyOf":[{"maxLength":1024,"type":"string"},{"type":"null"}],"default":null,"title":"Content Security Policy"},"content_security_policy_report_only":{"anyOf":[{"maxLength":1024,"type":"string"},{"type":"null"}],"default":null,"title":"Content Security Policy Report Only"},"cookies":{"default":[],"items":{"$ref":"#/components/schemas/CookieFlags"},"maxItems":20,"title":"Cookies","type":"array"},"cross_origin_opener_policy":{"anyOf":[{"maxLength":1024,"type":"string"},{"type":"null"}],"default":null,"title":"Cross Origin Opener Policy"},"permissions_policy":{"anyOf":[{"maxLength":1024,"type":"string"},{"type":"null"}],"default":null,"title":"Permissions Policy"},"referrer_policy":{"anyOf":[{"maxLength":1024,"type":"string"},{"type":"null"}],"default":null,"title":"Referrer Policy"},"strict_transport_security":{"anyOf":[{"$ref":"#/components/schemas/HstsPolicy"},{"type":"null"}],"default":null},"x_content_type_options":{"anyOf":[{"maxLength":1024,"type":"string"},{"type":"null"}],"default":null,"title":"X Content Type Options"},"x_frame_options":{"anyOf":[{"maxLength":1024,"type":"string"},{"type":"null"}],"default":null,"title":"X Frame Options"}},"title":"SecurityHeaders","type":"object"},"SecurityHeadersData":{"additionalProperties":false,"properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"from_http":{"$ref":"#/components/schemas/RedirectChain"},"from_https":{"$ref":"#/components/schemas/RedirectChain"},"headers":{"anyOf":[{"$ref":"#/components/schemas/SecurityHeaders"},{"type":"null"}],"default":null}},"required":["domain","from_http","from_https"],"title":"SecurityHeadersData","type":"object"},"Severity":{"enum":["info","warning","error"],"title":"Severity","type":"string"},"SiteHealthData":{"additionalProperties":false,"description":"One optional section per check. A section that failed is None; its code is a finding.","properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"http":{"anyOf":[{"$ref":"#/components/schemas/SecurityHeadersData"},{"type":"null"}],"default":null},"rdap":{"anyOf":[{"$ref":"#/components/schemas/RdapData"},{"type":"null"}],"default":null},"tls":{"anyOf":[{"$ref":"#/components/schemas/TlsCertificateData"},{"type":"null"}],"default":null}},"required":["domain"],"title":"SiteHealthData","type":"object"},"SoaData":{"additionalProperties":false,"description":"The SOA of a zone apex as the resolver returned it; None when the name has none.","properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"soa":{"anyOf":[{"$ref":"#/components/schemas/SoaValues"},{"type":"null"}],"default":null},"ttl":{"anyOf":[{"maximum":2147483647,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Ttl"}},"required":["domain"],"title":"SoaData","type":"object"},"SoaValues":{"additionalProperties":false,"description":"An SOA record's fields (RFC 1035 3.3.13); the times are in seconds.","properties":{"expire":{"maximum":4294967295,"minimum":0,"title":"Expire","type":"integer"},"minimum":{"maximum":4294967295,"minimum":0,"title":"Minimum","type":"integer"},"mname":{"maxLength":255,"minLength":1,"title":"Mname","type":"string"},"refresh":{"maximum":4294967295,"minimum":0,"title":"Refresh","type":"integer"},"retry":{"maximum":4294967295,"minimum":0,"title":"Retry","type":"integer"},"rname":{"maxLength":255,"minLength":1,"title":"Rname","type":"string"},"serial":{"maximum":4294967295,"minimum":0,"title":"Serial","type":"integer"},"serial_format":{"enum":["date","counter"],"title":"Serial Format","type":"string"}},"required":["mname","rname","serial","serial_format","refresh","retry","expire","minimum"],"title":"SoaValues","type":"object"},"SpfData":{"additionalProperties":false,"properties":{"all_qualifier":{"anyOf":[{"enum":["+","-","~","?"],"type":"string"},{"type":"null"}],"default":null,"title":"All Qualifier"},"dns_lookup_count":{"default":0,"minimum":0,"title":"Dns Lookup Count","type":"integer"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"lookup_count_complete":{"default":true,"title":"Lookup Count Complete","type":"boolean"},"record":{"anyOf":[{"maxLength":4096,"type":"string"},{"type":"null"}],"default":null,"title":"Record"},"tree":{"anyOf":[{"$ref":"#/components/schemas/SpfNode"},{"type":"null"}],"default":null},"void_lookup_count":{"default":0,"minimum":0,"title":"Void Lookup Count","type":"integer"}},"required":["domain"],"title":"SpfData","type":"object"},"SpfFlatNetwork":{"additionalProperties":false,"properties":{"network":{"maxLength":49,"minLength":1,"title":"Network","type":"string"},"sources":{"items":{"$ref":"#/components/schemas/SpfFlatSource"},"maxItems":5,"minItems":1,"title":"Sources","type":"array"}},"required":["network","sources"],"title":"SpfFlatNetwork","type":"object"},"SpfFlatSource":{"additionalProperties":false,"description":"Where a block came from: the SPF record's domain and the mechanism as written.","properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"mechanism":{"maxLength":512,"title":"Mechanism","type":"string"}},"required":["domain","mechanism"],"title":"SpfFlatSource","type":"object"},"SpfFlattenData":{"additionalProperties":false,"description":"The addresses an SPF policy lets pass, merged into blocks; never a record to publish.\n\n``networks`` holds the merged IPv4 blocks, then the IPv6 blocks, at most 500. The counts\ncover every block, also those beyond the cap. ``complete`` is False when ``incomplete``\nnames a reason: a limit a receiver enforces (PermError), a failed lookup, the query budget,\nthe block cap, or mechanisms in ``unflattenable``.","properties":{"complete":{"default":true,"title":"Complete","type":"boolean"},"dns_lookup_count":{"default":0,"minimum":0,"title":"Dns Lookup Count","type":"integer"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"incomplete":{"default":[],"items":{"enum":["lookup_limit","void_limit","mx_limit","record_error","tree_limit","lookup_failed","budget","network_cap","unflattenable"],"type":"string"},"maxItems":9,"title":"Incomplete","type":"array"},"ipv4_address_count":{"default":0,"minimum":0,"title":"Ipv4 Address Count","type":"integer"},"ipv6_network_count":{"default":0,"minimum":0,"title":"Ipv6 Network Count","type":"integer"},"networks":{"default":[],"items":{"$ref":"#/components/schemas/SpfFlatNetwork"},"maxItems":500,"title":"Networks","type":"array"},"record":{"anyOf":[{"maxLength":4096,"type":"string"},{"type":"null"}],"default":null,"title":"Record"},"unflattenable":{"default":[],"items":{"$ref":"#/components/schemas/SpfUnflattenable"},"maxItems":50,"title":"Unflattenable","type":"array"}},"required":["domain"],"title":"SpfFlattenData","type":"object"},"SpfNode":{"additionalProperties":false,"properties":{"children":{"default":[],"items":{"$ref":"#/components/schemas/SpfNodeLevel2"},"maxItems":20,"title":"Children","type":"array"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"error":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Error"},"record":{"anyOf":[{"maxLength":4096,"type":"string"},{"type":"null"}],"default":null,"title":"Record"},"terms":{"default":[],"items":{"$ref":"#/components/schemas/SpfTerm"},"maxItems":100,"title":"Terms","type":"array"},"via":{"enum":["root","include","redirect"],"title":"Via","type":"string"}},"required":["domain","via"],"title":"SpfNode","type":"object"},"SpfNodeLevel2":{"additionalProperties":false,"properties":{"children":{"default":[],"items":{"$ref":"#/components/schemas/SpfNodeLevel3"},"maxItems":20,"title":"Children","type":"array"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"error":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Error"},"record":{"anyOf":[{"maxLength":4096,"type":"string"},{"type":"null"}],"default":null,"title":"Record"},"terms":{"default":[],"items":{"$ref":"#/components/schemas/SpfTerm"},"maxItems":100,"title":"Terms","type":"array"},"via":{"enum":["root","include","redirect"],"title":"Via","type":"string"}},"required":["domain","via"],"title":"SpfNodeLevel2","type":"object"},"SpfNodeLevel3":{"additionalProperties":false,"properties":{"children":{"default":[],"items":{"$ref":"#/components/schemas/SpfNodeLevel4"},"maxItems":20,"title":"Children","type":"array"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"error":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Error"},"record":{"anyOf":[{"maxLength":4096,"type":"string"},{"type":"null"}],"default":null,"title":"Record"},"terms":{"default":[],"items":{"$ref":"#/components/schemas/SpfTerm"},"maxItems":100,"title":"Terms","type":"array"},"via":{"enum":["root","include","redirect"],"title":"Via","type":"string"}},"required":["domain","via"],"title":"SpfNodeLevel3","type":"object"},"SpfNodeLevel4":{"additionalProperties":false,"properties":{"children":{"default":[],"items":{"type":"object"},"maxItems":20,"title":"Children","type":"array"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"error":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Error"},"record":{"anyOf":[{"maxLength":4096,"type":"string"},{"type":"null"}],"default":null,"title":"Record"},"terms":{"default":[],"items":{"$ref":"#/components/schemas/SpfTerm"},"maxItems":100,"title":"Terms","type":"array"},"via":{"enum":["root","include","redirect"],"title":"Via","type":"string"}},"required":["domain","via"],"title":"SpfNodeLevel4","type":"object"},"SpfParseData":{"additionalProperties":false,"description":"``dns_lookup_terms`` counts this record's own terms; includes can add more (``notes``).","properties":{"all_qualifier":{"anyOf":[{"enum":["+","-","~","?"],"type":"string"},{"type":"null"}],"default":null,"title":"All Qualifier"},"dns_lookup_terms":{"default":0,"minimum":0,"title":"Dns Lookup Terms","type":"integer"},"is_spf":{"title":"Is Spf","type":"boolean"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"record":{"maxLength":4096,"title":"Record","type":"string"},"redirect":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Redirect"},"syntax_errors":{"default":[],"items":{"$ref":"#/components/schemas/SpfSyntaxIssue"},"maxItems":100,"title":"Syntax Errors","type":"array"},"terms":{"default":[],"items":{"$ref":"#/components/schemas/SpfTerm"},"maxItems":100,"title":"Terms","type":"array"}},"required":["record","is_spf"],"title":"SpfParseData","type":"object"},"SpfSyntaxIssue":{"additionalProperties":false,"properties":{"reason":{"maxLength":512,"title":"Reason","type":"string"},"term":{"maxLength":512,"title":"Term","type":"string"}},"required":["term","reason"],"title":"SpfSyntaxIssue","type":"object"},"SpfTerm":{"additionalProperties":false,"properties":{"kind":{"enum":["mechanism","modifier"],"title":"Kind","type":"string"},"name":{"maxLength":64,"minLength":1,"title":"Name","type":"string"},"qualifier":{"anyOf":[{"enum":["+","-","~","?"],"type":"string"},{"type":"null"}],"default":null,"title":"Qualifier"},"raw":{"maxLength":512,"title":"Raw","type":"string"},"value":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Value"}},"required":["raw","kind","name"],"title":"SpfTerm","type":"object"},"SpfUnflattenable":{"additionalProperties":false,"description":"A mechanism that has no fixed address list: exists, ptr or one with a macro.","properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"term":{"maxLength":512,"title":"Term","type":"string"}},"required":["domain","term"],"title":"SpfUnflattenable","type":"object"},"SpoofableData":{"additionalProperties":false,"description":"How far the domain's DMARC policy asks receivers to act on mail that fails it.\n\n``enforcement`` follows DMARC alone: none, partial (enforced with gaps) or full. The\neffective policies already include test mode (t=y lowers one step). ``gaps`` holds fixed\ntexts that say why the level is not full. ``strength`` is the policy itself in the words of\nthe email security check: protected (reject), partial (quarantine), monitoring (none),\nunprotected (no DMARC record) or broken (a record that is not valid).","properties":{"dmarc_record_domain":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Dmarc Record Domain"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"effective_policy":{"anyOf":[{"enum":["none","quarantine","reject"],"type":"string"},{"type":"null"}],"default":null,"title":"Effective Policy"},"effective_subdomain_policy":{"anyOf":[{"enum":["none","quarantine","reject"],"type":"string"},{"type":"null"}],"default":null,"title":"Effective Subdomain Policy"},"enforcement":{"enum":["none","partial","full"],"title":"Enforcement","type":"string"},"gaps":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":4,"title":"Gaps","type":"array"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"pct":{"anyOf":[{"maximum":100,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Pct"},"spf_all_qualifier":{"anyOf":[{"enum":["+","-","~","?"],"type":"string"},{"type":"null"}],"default":null,"title":"Spf All Qualifier"},"strength":{"enum":["protected","partial","monitoring","unprotected","broken"],"title":"Strength","type":"string"},"test_mode":{"default":false,"title":"Test Mode","type":"boolean"}},"required":["domain","enforcement","strength"],"title":"SpoofableData","type":"object"},"Status":{"enum":["ok","info","warning","error","unknown"],"title":"Status","type":"string"},"SubnetsData":{"additionalProperties":false,"properties":{"count":{"maximum":256,"minimum":1,"title":"Count","type":"integer"},"network":{"maxLength":64,"minLength":2,"title":"Network","type":"string"},"new_prefix":{"maximum":128,"minimum":0,"title":"New Prefix","type":"integer"},"subnets":{"items":{"maxLength":64,"minLength":2,"type":"string"},"maxItems":256,"minItems":1,"title":"Subnets","type":"array"}},"required":["network","new_prefix","count","subnets"],"title":"SubnetsData","type":"object"},"SvcbRecord":{"additionalProperties":false,"description":"One HTTPS record (RFC 9460); the ECH configuration is only reported as present.","properties":{"alpn":{"default":[],"items":{"maxLength":64,"minLength":1,"type":"string"},"maxItems":16,"title":"Alpn","type":"array"},"ech":{"default":false,"title":"Ech","type":"boolean"},"ipv4hint":{"default":[],"items":{"maxLength":45,"type":"string"},"maxItems":16,"title":"Ipv4Hint","type":"array"},"ipv6hint":{"default":[],"items":{"maxLength":45,"type":"string"},"maxItems":16,"title":"Ipv6Hint","type":"array"},"mandatory":{"default":[],"items":{"maxLength":64,"minLength":1,"type":"string"},"maxItems":16,"title":"Mandatory","type":"array"},"mode":{"enum":["alias","service"],"title":"Mode","type":"string"},"no_default_alpn":{"default":false,"title":"No Default Alpn","type":"boolean"},"other_keys":{"default":[],"items":{"maxLength":64,"minLength":1,"type":"string"},"maxItems":16,"title":"Other Keys","type":"array"},"port":{"anyOf":[{"maximum":65535,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Port"},"priority":{"maximum":65535,"minimum":0,"title":"Priority","type":"integer"},"record":{"maxLength":4096,"title":"Record","type":"string"},"target":{"maxLength":255,"minLength":1,"title":"Target","type":"string"}},"required":["record","priority","target","mode"],"title":"SvcbRecord","type":"object"},"Tag":{"additionalProperties":false,"properties":{"name":{"maxLength":32,"minLength":1,"title":"Name","type":"string"},"value":{"maxLength":4096,"title":"Value","type":"string"}},"required":["name","value"],"title":"Tag","type":"object"},"TlsCertificateData":{"additionalProperties":false,"description":"The certificate a domain serves on port 443. Fields are None when no handshake worked.\n\n``trusted`` means the chain leads to a CA in the system bundle (host name and dates aside);\n``hostname_match`` and the dates are computed from the leaf certificate itself.","properties":{"address_family":{"anyOf":[{"enum":["ipv4","ipv6"],"type":"string"},{"type":"null"}],"default":null,"title":"Address Family"},"chain":{"default":[],"items":{"$ref":"#/components/schemas/ChainCertificate"},"maxItems":5,"title":"Chain","type":"array"},"cipher":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"default":null,"title":"Cipher"},"days_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Days Remaining"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"hostname_match":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Hostname Match"},"issuer":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Issuer"},"key_bits":{"anyOf":[{"maximum":65536,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Key Bits"},"key_type":{"anyOf":[{"enum":["rsa","ec","ed25519","ed448","dsa","other"],"type":"string"},{"type":"null"}],"default":null,"title":"Key Type"},"not_after":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Not After"},"not_before":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Not Before"},"san":{"default":[],"items":{"maxLength":255,"minLength":1,"type":"string"},"maxItems":50,"title":"San","type":"array"},"serial_number":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"default":null,"title":"Serial Number"},"signature_algorithm":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"default":null,"title":"Signature Algorithm"},"subject_cn":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Subject Cn"},"tls_version":{"anyOf":[{"maxLength":32,"type":"string"},{"type":"null"}],"default":null,"title":"Tls Version"},"trusted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Trusted"},"untrusted_reason":{"anyOf":[{"enum":["self_signed","unknown_issuer","incomplete_chain","other"],"type":"string"},{"type":"null"}],"default":null,"title":"Untrusted Reason"}},"required":["domain"],"title":"TlsCertificateData","type":"object"},"TlsRptData":{"additionalProperties":false,"properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"name":{"maxLength":255,"minLength":1,"title":"Name","type":"string"},"record":{"anyOf":[{"maxLength":4096,"type":"string"},{"type":"null"}],"default":null,"title":"Record"},"rua":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":20,"title":"Rua","type":"array"}},"required":["domain","name"],"title":"TlsRptData","type":"object"},"TlsRptParseData":{"additionalProperties":false,"description":"A pasted TLS-RPT record (RFC 8460); report addresses are not contacted.","properties":{"is_tlsrpt":{"title":"Is Tlsrpt","type":"boolean"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"record":{"maxLength":4096,"title":"Record","type":"string"},"rua":{"default":[],"items":{"maxLength":512,"type":"string"},"maxItems":20,"title":"Rua","type":"array"},"valid":{"default":false,"title":"Valid","type":"boolean"}},"required":["record","is_tlsrpt"],"title":"TlsRptParseData","type":"object"},"TtlData":{"additionalProperties":false,"description":"``validated`` is True when every answer carried the resolver's AD flag.","properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"rows":{"default":[],"items":{"$ref":"#/components/schemas/TtlRow"},"maxItems":7,"title":"Rows","type":"array"},"soa_minimum":{"anyOf":[{"maximum":4294967295,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Soa Minimum"},"validated":{"default":false,"title":"Validated","type":"boolean"}},"required":["domain"],"title":"TtlData","type":"object"},"TtlRow":{"additionalProperties":false,"description":"One record type: ``present`` is None when its lookup failed.\n\n``source`` is \"rrsig\" when the TTL is the Original TTL of a validated signature (exact) and\n\"cache\" when it is what the resolver may still cache (normally at most the configured TTL;\nresolver TTL floors and serve-stale, RFC 8767, can break that).","properties":{"present":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Present"},"source":{"anyOf":[{"enum":["rrsig","cache"],"type":"string"},{"type":"null"}],"default":null,"title":"Source"},"ttl":{"anyOf":[{"maximum":2147483647,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Ttl"},"type":{"enum":["A","AAAA","CNAME","MX","NS","TXT","SOA","CAA","SRV"],"title":"Type","type":"string"}},"required":["type"],"title":"TtlRow","type":"object"},"TxtVerificationData":{"additionalProperties":false,"properties":{"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"list_version":{"maxLength":32,"minLength":1,"title":"List Version","type":"string"},"tokens":{"default":[],"items":{"$ref":"#/components/schemas/VerificationToken"},"maxItems":50,"title":"Tokens","type":"array"},"txt_count":{"default":0,"minimum":0,"title":"Txt Count","type":"integer"}},"required":["domain","list_version"],"title":"TxtVerificationData","type":"object"},"UsageReport":{"additionalProperties":false,"description":"Credits are counted as for ``X-Quota-Remaining``: successful requests and reservations\nstill running; requests refused by validation are not listed.","properties":{"by_endpoint":{"default":[],"items":{"$ref":"#/components/schemas/EndpointUsage"},"maxItems":200,"title":"By Endpoint","type":"array"},"credits_limit":{"minimum":0,"title":"Credits Limit","type":"integer"},"credits_remaining":{"minimum":0,"title":"Credits Remaining","type":"integer"},"credits_used":{"minimum":0,"title":"Credits Used","type":"integer"},"period_end":{"format":"date-time","title":"Period End","type":"string"},"period_start":{"format":"date-time","title":"Period Start","type":"string"},"plan":{"maxLength":32,"minLength":1,"title":"Plan","type":"string"},"request_id":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string"}},"required":["request_id","plan","period_start","period_end","credits_limit","credits_used","credits_remaining"],"title":"UsageReport","type":"object"},"VerificationToken":{"additionalProperties":false,"description":"A TXT record that matched a verification format; ``value`` is the whole public record.","properties":{"prefix":{"maxLength":512,"title":"Prefix","type":"string"},"service":{"maxLength":64,"minLength":1,"title":"Service","type":"string"},"value":{"maxLength":4096,"title":"Value","type":"string"}},"required":["service","prefix","value"],"title":"VerificationToken","type":"object"},"WildcardData":{"additionalProperties":false,"description":"What a made-up name under the domain answers; ``wildcard`` is None when unknown.","properties":{"answers":{"default":[],"items":{"$ref":"#/components/schemas/DnsRecordSet"},"maxItems":9,"title":"Answers","type":"array"},"domain":{"maxLength":255,"minLength":1,"title":"Domain","type":"string"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"probe_name":{"anyOf":[{"maxLength":255,"minLength":1,"type":"string"},{"type":"null"}],"default":null,"title":"Probe Name"},"wildcard":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Wildcard"}},"required":["domain"],"title":"WildcardData","type":"object"},"X402PaymentRequired":{"properties":{"accepts":{"items":{"$ref":"#/components/schemas/X402PaymentRequirements"},"type":"array"},"error":{"description":"Why an attached payment was refused.","type":"string"},"extensions":{"additionalProperties":true,"type":"object"},"resource":{"$ref":"#/components/schemas/X402ResourceInfo"},"x402Version":{"const":2,"type":"integer"}},"required":["x402Version","accepts"],"type":"object"},"X402PaymentRequirements":{"properties":{"amount":{"description":"Price in USDC atomic units.","type":"string"},"asset":{"description":"USDC contract address.","type":"string"},"extra":{"additionalProperties":true,"type":"object"},"maxTimeoutSeconds":{"type":"integer"},"network":{"description":"CAIP-2 network id.","type":"string"},"payTo":{"description":"Recipient address.","type":"string"},"scheme":{"description":"Payment scheme, always 'exact'.","type":"string"}},"required":["scheme","network","asset","amount","payTo","maxTimeoutSeconds"],"type":"object"},"X402ResourceInfo":{"properties":{"description":{"type":"string"},"iconUrl":{"type":"string"},"mimeType":{"type":"string"},"serviceName":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"url":{"type":"string"}},"required":["url"],"type":"object"},"ZoneLintData":{"additionalProperties":false,"properties":{"default_ttl":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"title":"Default Ttl"},"name_count":{"default":0,"minimum":0,"title":"Name Count","type":"integer"},"notes":{"default":[],"items":{"maxLength":300,"minLength":1,"type":"string"},"maxItems":5,"title":"Notes","type":"array"},"origin":{"maxLength":255,"minLength":1,"title":"Origin","type":"string"},"problems":{"default":[],"items":{"$ref":"#/components/schemas/ZoneProblem"},"maxItems":100,"title":"Problems","type":"array"},"record_count":{"default":0,"minimum":0,"title":"Record Count","type":"integer"},"soa":{"anyOf":[{"$ref":"#/components/schemas/SoaValues"},{"type":"null"}],"default":null},"types":{"default":[],"items":{"$ref":"#/components/schemas/ZoneTypeCount"},"maxItems":64,"title":"Types","type":"array"}},"required":["origin"],"title":"ZoneLintData","type":"object"},"ZoneProblem":{"additionalProperties":false,"description":"A line the zone loader cannot read; the reason is fixed text, never zone content.","properties":{"line":{"minimum":1,"title":"Line","type":"integer"},"reason":{"maxLength":512,"title":"Reason","type":"string"}},"required":["line","reason"],"title":"ZoneProblem","type":"object"},"ZoneTypeCount":{"additionalProperties":false,"properties":{"count":{"minimum":1,"title":"Count","type":"integer"},"type":{"maxLength":16,"minLength":1,"title":"Type","type":"string"}},"required":["type","count"],"title":"ZoneTypeCount","type":"object"}},"securitySchemes":{"lookproofKey":{"description":"With an API key (Authorization: Bearer lp_live_...), a request uses the operation's x-credits for each item that succeeds, from the plan's credits for the period. Requests refused by validation (400, 422) and checks that fail on our side (500, 503) use 0 credits. In a bulk request only the domains that succeed count, and a bulk request that does not fit in the remaining credits is refused whole. Every response for a known account carries X-Quota-Limit, X-Quota-Remaining and X-Quota-Reset. Send either the key or PAYMENT-SIGNATURE, never both; an invalid lp_ key is answered 401 and never falls back to payment, while an Authorization value that is not an lp_ key is ignored. With x402, a bulk request is charged in full and failed items get a free retry token instead.","scheme":"bearer","type":"http"}}},"externalDocs":{"description":"API reference","url":"https://lookproof.dev/docs/api"},"info":{"description":"Mail, DNS and web checks for developers and AI agents: email authentication, DNS, TLS certificates, HTTP security headers and domain registration, paid per request with x402 (USDC). A request without payment is answered with 402 and the exact price. With an API key instead, GET /v1/usage (free, key only) shows the credits left in the period.","title":"Lookproof API","version":"1.0","x-guidance":"Each operation is one check of a public domain, paid per request with x402 v2 in USDC. Call it without payment to get 402 with the exact price in the PAYMENT-REQUIRED header, then repeat the request with a PAYMENT-SIGNATURE header. Requests that fail are not charged. Use GET /v1/domain/health for a full email and DNS security report, /v1/site/health for the TLS certificate, HTTPS redirects, security headers and domain expiry, /v1/mail/check for SPF, DMARC, DKIM and MX together, or a single check when you need one record.","x-pricing-version":"pv1-58ce2f64bc0e0ac6"},"openapi":"3.1.0","paths":{"/v1/dns/caa":{"get":{"description":"Looks up CAA on the name and, if it has none, on its parents up to the registrable domain (RFC 8659). Reports the allowed issuers for normal and wildcard certificates, iodef targets, unknown critical tags and values that cannot be parsed.","operationId":"dns.caa","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","inherited":false,"iodef":["mailto:security@example.com"],"issuers":["letsencrypt.org"],"record_name":"example.com","records":[{"critical":false,"flags":0,"tag":"iodef","value":"mailto:security@example.com"},{"critical":false,"flags":0,"tag":"issue","value":"letsencrypt.org"}],"wildcard_issuers":["letsencrypt.org"]},"endpoint":"dns.caa","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_CaaData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"CAA record check","tags":["dns"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","CAA_INVALID_IODEF","CAA_INVALID_VALUE","CAA_NOT_FOUND","CAA_NO_ISSUANCE","CAA_UNKNOWN_CRITICAL_TAG"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/dns/compare":{"get":{"description":"Sends one query for the name and record type to each public resolver Lookproof uses (Cloudflare and Google), each on its own and without cache, and compares response codes and records. Different codes are a warning; different records are information, since CDNs answer differently by design. TTLs are shown, not compared.","operationId":"dns.compare","parameters":[{"example":"example.com","in":"query","name":"name","required":true,"schema":{"examples":["_dmarc.example.com"],"maxLength":1024,"minLength":1,"title":"Name","type":"string"}},{"example":"A","in":"query","name":"type","required":false,"schema":{"default":"A","enum":["A","AAAA","CNAME","MX","NS","TXT","SOA","CAA","SRV"],"title":"RecordType","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"answers":[{"error":null,"rcode":"NOERROR","records":["192.0.2.10"],"resolver":"cloudflare","ttl":300},{"error":null,"rcode":"NOERROR","records":["192.0.2.10"],"resolver":"google","ttl":300}],"match":true,"name":"example.com","type":"A"},"endpoint":"dns.compare","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"cloudflare,google","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_DnsCompareData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"DNS resolver comparison","tags":["dns"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","DNS_ANSWERS_DIFFER","DNS_RCODES_DIFFER"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/dns/dnssec":{"get":{"description":"Queries SOA, DNSKEY and DS through validating public resolvers and reports secure, insecure, bogus or unknown from the AD flag; bogus is detected by repeating the query with checking disabled. There is no local cryptographic validation.","operationId":"dns.dnssec","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"dnskeys":[{"algorithm":13,"flags":256,"protocol":3,"role":"zsk"},{"algorithm":13,"flags":257,"protocol":3,"role":"ksk"}],"domain":"example.com","ds":[{"algorithm":13,"digest_type":2,"key_tag":2371}],"state":"secure","validated":true},"endpoint":"dns.dnssec","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_DnssecData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"DNSSEC check","tags":["dns"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","DNSSEC_BOGUS","DNSSEC_DEPRECATED_ALGORITHM","DNSSEC_DS_WITHOUT_DNSKEY","DNSSEC_INDETERMINATE","DNSSEC_NOT_SIGNED","DNSSEC_SHA1_DIGEST"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/dns/https-rr":{"get":{"description":"Looks up the HTTPS record set and shows each record's priority, target, mode, alpn protocols, port, IPv4 and IPv6 hints and whether ECH is published, and reports records that cannot be read, AliasMode conflicts, missing mandatory keys and no-default-alpn without alpn.","operationId":"dns.https_rr","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com","_8443._https.example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"alias_target":null,"domain":"example.com","records":[{"alpn":["h3","h2"],"ech":false,"ipv4hint":["192.0.2.10"],"ipv6hint":["2001:db8::10"],"mandatory":[],"mode":"service","no_default_alpn":false,"other_keys":[],"port":null,"priority":1,"record":"1 . alpn=\"h3,h2\" ipv4hint=\"192.0.2.10\" ipv6hint=\"2001:db8::10\"","target":"."}]},"endpoint":"dns.https_rr","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_HttpsRrData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"HTTPS record check","tags":["dns"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","SVCB_ALIAS_CONFLICT","SVCB_ALIAS_WITH_PARAMS","SVCB_ALPN_MISSING","SVCB_ECH","SVCB_INVALID","SVCB_MANDATORY_MISSING","SVCB_NOT_FOUND"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/dns/idn":{"get":{"description":"Maps the name with UTS 46 and checks every label with IDNA2008 (RFC 5891-5893): disallowed characters, hyphen, context and bidi rules, lengths, and letters from mixed scripts in one label, a homograph risk. Returns both forms per label. Nothing is looked up.","operationId":"dns.idn","parameters":[{"example":"bücher.example.com","in":"query","name":"name","required":true,"schema":{"maxLength":1024,"minLength":1,"title":"Name","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"ascii":"xn--bcher-kva.example.com","is_idn":true,"labels":[{"ascii":"xn--bcher-kva","is_idn":true,"scripts":["Latin"],"unicode":"bücher"},{"ascii":"example","is_idn":false,"scripts":["Latin"],"unicode":"example"},{"ascii":"com","is_idn":false,"scripts":["Latin"],"unicode":"com"}],"name":"bücher.example.com","problems":[],"unicode":"bücher.example.com","valid":true},"endpoint":"dns.idn","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_IdnData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"IDN converter","tags":["dns"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["IDN_INVALID","IDN_MIXED_SCRIPT","IDN_NOT_IDN"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/dns/lookup":{"get":{"description":"Queries the chosen record types for a name and returns the answers with TTL, observation time and which public resolver answered.","operationId":"dns.lookup","parameters":[{"example":"example.com","in":"query","name":"name","required":true,"schema":{"examples":["_dmarc.example.com"],"maxLength":1024,"minLength":1,"title":"Name","type":"string"}},{"example":["A","MX"],"explode":true,"in":"query","name":"types","required":false,"schema":{"default":["A"],"items":{"enum":["A","AAAA","CNAME","MX","NS","TXT","SOA","CAA","SRV"],"title":"RecordType","type":"string"},"maxItems":9,"minItems":1,"title":"Types","type":"array"},"style":"form"},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"answers":[{"rcode":"NOERROR","records":["192.0.2.10"],"ttl":300,"type":"A"},{"rcode":"NOERROR","records":["10 mx1.example.com.","20 mx2.example.com."],"ttl":300,"type":"MX"}],"name":"example.com"},"endpoint":"dns.lookup","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_DnsLookupData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"DNS lookup","tags":["dns"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.005","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.005"},"rule":{"amount":5000,"kind":"fixed"}}}},"/v1/dns/ns":{"get":{"description":"Looks up the NS set and the IPv4 and IPv6 addresses of up to eight name servers, and reports a single server, servers that do not resolve, all addresses in one /24 or /48, one top-level domain for all names, and servers inside the zone that need glue. The servers themselves are not contacted.","operationId":"dns.ns","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","hosts":[{"addresses":["192.0.2.53","2001:db8::53"],"in_bailiwick":true,"name":"ns1.example.com","resolved":true},{"addresses":["198.51.100.53"],"in_bailiwick":false,"name":"ns2.example.net","resolved":true}],"ipv4_networks":["192.0.2.0/24","198.51.100.0/24"],"ipv6_networks":["2001:db8::/48"],"ns_count":2},"endpoint":"dns.ns","findings":[{"code":"NS_IN_BAILIWICK","evidence":{"count":1,"items":[{"name":"example.com","ns":"ns1.example.com"}]},"explanation":"A name server such as ns1.example.com for example.com can only be found through glue: address records the parent zone publishes with the delegation. Keep the glue at the registrar in step when the server's address changes.","message":"A name server lies inside the zone it serves and needs glue records.","recommendation":null,"severity":"info"}],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"info"},"schema":{"$ref":"#/components/schemas/CheckResponse_NsData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Name server check","tags":["dns"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","NS_IN_BAILIWICK","NS_NOT_FOUND","NS_SAME_NETWORK","NS_SINGLE","NS_SINGLE_TLD","NS_UNRESOLVABLE"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/dns/ns-provider":{"get":{"description":"Looks up the NS set through the public resolvers and matches each name server name against a fixed, versioned list of DNS providers, such as Cloudflare, Route 53, Azure DNS and Google Cloud DNS. Name servers of several providers are reported as information. The name servers themselves are not contacted.","operationId":"dns.ns_provider","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","list_version":"2026-10-28","ns_count":2,"providers":[],"unknown":["ns1.example.com","ns2.example.net"]},"endpoint":"dns.ns_provider","findings":[{"code":"NS_PROVIDER_UNKNOWN","evidence":{"count":2,"items":[{"name":"example.com","ns":"ns1.example.com"},{"name":"example.com","ns":"ns2.example.net"}]},"explanation":"The name server's name matches no provider on Lookproof's fixed, versioned list. It can be the domain's own server, a registrar's or a smaller provider's, so this is information, not a problem. The evidence names the server.","message":"A name server matches none of the DNS providers on the list.","recommendation":null,"severity":"info"}],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"info"},"schema":{"$ref":"#/components/schemas/CheckResponse_NsProviderData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"DNS provider lookup","tags":["dns"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","NS_NOT_FOUND","NS_PROVIDER_MULTIPLE","NS_PROVIDER_UNKNOWN"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/dns/soa":{"get":{"description":"Asks the public resolvers for the SOA of the zone apex and checks the serial against the YYYYMMDDnn form and refresh, retry, expire and the negative caching TTL against RFC 1912 and RFC 2308. The zone's own name servers are not contacted.","operationId":"dns.soa","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","soa":{"expire":1209600,"minimum":300,"mname":"ns1.example.com","refresh":7200,"retry":3600,"rname":"hostmaster.example.com","serial":2026102401,"serial_format":"date"},"ttl":300},"endpoint":"dns.soa","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_SoaData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"SOA record check","tags":["dns"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","SOA_EXPIRE_BELOW_REFRESH","SOA_EXPIRE_SHORT","SOA_NEGATIVE_TTL_LONG","SOA_REFRESH_OUT_OF_RANGE","SOA_RETRY_NOT_BELOW_REFRESH","SOA_SERIAL_NOT_DATE","SOA_NOT_FOUND"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/dns/ttl":{"get":{"description":"Asks the public resolvers for seven record types and shows each TTL with its source: the Original TTL of a validated DNSSEC signature (the value set in the zone) or the time the resolver may still cache the record (normally a lower bound). Reports TTLs over a week, and short TTLs only when they are exact. The zone's name servers are not asked.","operationId":"dns.ttl","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","notes":["Rows marked cache show how long the public resolver may still keep the record, not the TTL set in the zone: the configured TTL is normally at least that long. Exact TTLs come only from a DNSSEC-signed zone whose answers the resolver validated."],"rows":[{"present":true,"source":"cache","ttl":300,"type":"A"},{"present":false,"source":null,"ttl":null,"type":"AAAA"},{"present":true,"source":"cache","ttl":300,"type":"MX"},{"present":true,"source":"cache","ttl":300,"type":"NS"},{"present":true,"source":"cache","ttl":300,"type":"TXT"},{"present":true,"source":"cache","ttl":300,"type":"CAA"},{"present":true,"source":"rrsig","ttl":3600,"type":"SOA"}],"soa_minimum":300,"validated":false},"endpoint":"dns.ttl","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_TtlData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"DNS TTL check","tags":["dns"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","SOA_NEGATIVE_TTL_LONG","TTL_LONG","TTL_NS_SHORT","TTL_SHORT"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/dns/txt-verification":{"get":{"description":"Looks up the TXT records at the domain's apex through the public resolvers and matches each one against a fixed, versioned list of verification formats (Google, Microsoft 365, Atlassian, Facebook, Apple and more), with the service and the full token. More than one token for a service is reported. Records under subdomains are not looked up.","operationId":"dns.txt_verification","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","list_version":"2026-10-28","tokens":[{"prefix":"MS=","service":"Microsoft 365","value":"MS=ms48213705"},{"prefix":"google-site-verification=","service":"Google","value":"google-site-verification=Xq3yZ2kLmN0pQrS7tUvWxY8zA1bC4dE5fG6hIjK9oP"}],"txt_count":3},"endpoint":"dns.txt_verification","findings":[{"code":"TXT_VERIFICATION_FOUND","evidence":{"count":2,"items":[{"name":"example.com","service":"Google"},{"name":"example.com","service":"Microsoft 365"}]},"explanation":"Services ask for a TXT record with a fixed prefix and a token to prove that someone controlled the domain. A token shows that the service was set up once; it does not prove that the service is in use today. The evidence names the services.","message":"The domain publishes verification records for one or more services.","recommendation":null,"severity":"info"}],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"info"},"schema":{"$ref":"#/components/schemas/CheckResponse_TxtVerificationData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Domain verification records","tags":["dns"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","TXT_VERIFICATION_DUPLICATE","TXT_VERIFICATION_FOUND","TXT_VERIFICATION_NONE"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/dns/wildcard":{"get":{"description":"Asks the public resolvers for A, AAAA, TXT and MX of a random name under the domain and reports a wildcard (RFC 4592) when it answers, with a warning for a wildcard MX. The test name is new for every request, so no cached answer is reused.","operationId":"dns.wildcard","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"answers":[{"rcode":"NXDOMAIN","records":[],"ttl":null,"type":"A"},{"rcode":"NXDOMAIN","records":[],"ttl":null,"type":"AAAA"},{"rcode":"NXDOMAIN","records":[],"ttl":null,"type":"TXT"},{"rcode":"NXDOMAIN","records":[],"ttl":null,"type":"MX"}],"domain":"example.com","notes":[],"probe_name":"lp-9fe3dd4ce833.example.com","wildcard":false},"endpoint":"dns.wildcard","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_WildcardData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Wildcard DNS check","tags":["dns"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","WILDCARD_FOUND","WILDCARD_MX"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/dns/zone-lint":{"post":{"description":"Reads a zone file of up to 64 KiB in master file format (RFC 1035) with $ORIGIN and $TTL, and reports lines that cannot be read, a missing or misplaced SOA, missing NS, CNAME at the apex or beside other data, duplicates, mixed TTLs in a set, odd TTLs, out-of-zone names, targets without addresses and SOA values. Nothing is looked up.","operationId":"dns.zone_lint","parameters":[{"$ref":"#/components/parameters/PaymentSignature"}],"requestBody":{"content":{"application/json":{"example":{"origin":"example.com","zone":"$TTL 3600\n@       IN SOA  ns1.example.com. hostmaster.example.com. (\n                2026102701 ; serial\n                7200       ; refresh\n                3600       ; retry\n                1209600    ; expire\n                3600 )     ; minimum\n        IN NS   ns1\n        IN NS   ns2.example.net.\n        IN MX   10 mail\n        IN A    192.0.2.10\nns1     IN A    192.0.2.53\nmail    IN A    192.0.2.25\nwww     IN CNAME @\nwww     IN TXT  \"site-verification=abc123\"\n"},"schema":{"additionalProperties":false,"description":"A pasted zone file in master file format (RFC 1035 section 5) and the zone's name.","properties":{"origin":{"examples":["example.com","2.0.192.in-addr.arpa"],"maxLength":1024,"minLength":1,"title":"Origin","type":"string"},"zone":{"maxLength":65536,"minLength":1,"title":"Zone","type":"string"}},"required":["zone","origin"],"title":"ZoneInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"default_ttl":3600,"name_count":4,"notes":["The zone is read as text only: nothing is looked up, and DNSSEC signatures are not verified."],"origin":"example.com","problems":[],"record_count":9,"soa":{"expire":1209600,"minimum":3600,"mname":"ns1.example.com","refresh":7200,"retry":3600,"rname":"hostmaster.example.com","serial":2026102701,"serial_format":"date"},"types":[{"count":3,"type":"A"},{"count":2,"type":"NS"},{"count":1,"type":"CNAME"},{"count":1,"type":"MX"},{"count":1,"type":"SOA"},{"count":1,"type":"TXT"}]},"endpoint":"dns.zone_lint","findings":[{"code":"ZONE_CNAME_WITH_OTHER_DATA","evidence":{"count":1,"items":[{"owner":"www.example.com","types":"TXT"}]},"explanation":"A name with a CNAME may hold no other data except DNSSEC records (RFC 1034 section 3.6.2, RFC 2181 section 10.1). Resolvers then answer inconsistently and many loaders refuse the zone. The evidence names the other types.","message":"A name has a CNAME and other records at the same time.","recommendation":"Keep either the CNAME or the other records for that name.","severity":"error"}],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"error"},"schema":{"$ref":"#/components/schemas/CheckResponse_ZoneLintData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Zone file checker","tags":["dns"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["NS_SINGLE","SOA_EXPIRE_BELOW_REFRESH","SOA_EXPIRE_SHORT","SOA_NEGATIVE_TTL_LONG","SOA_REFRESH_OUT_OF_RANGE","SOA_RETRY_NOT_BELOW_REFRESH","SOA_SERIAL_NOT_DATE","ZONE_CNAME_AT_APEX","ZONE_CNAME_WITH_OTHER_DATA","ZONE_DIRECTIVE_IGNORED","ZONE_DUPLICATE_RECORD","ZONE_MULTIPLE_CNAME","ZONE_MULTIPLE_SOA","ZONE_NO_DEFAULT_TTL","ZONE_NO_NS","ZONE_NO_SOA","ZONE_OUT_OF_ZONE","ZONE_SOA_NOT_AT_APEX","ZONE_SYNTAX_ERROR","ZONE_TARGET_IS_CNAME","ZONE_TARGET_NO_ADDRESS","ZONE_TTL_MISMATCH","ZONE_TTL_OUT_OF_RANGE","ZONE_TTL_UNUSUAL"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/domain/health":{"get":{"description":"Runs MX, SPF, DMARC, DKIM selector discovery, MTA-STS with TLS-RPT, DNSSEC, reverse DNS of the mail servers, BIMI and CAA in parallel and returns one section per check. A section that fails is marked and the status becomes unknown. There is no score.","operationId":"domain.health","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"bimi":{"authority_url":"https://example.com/brand/vmc.pem","declined":false,"dmarc_enforced":true,"domain":"example.com","logo_url":"https://example.com/brand/logo.svg","name":"default._bimi.example.com","record":"v=BIMI1; l=https://example.com/brand/logo.svg; a=https://example.com/brand/vmc.pem","record_domain":"example.com","selector":"default"},"caa":{"domain":"example.com","inherited":false,"iodef":["mailto:security@example.com"],"issuers":["letsencrypt.org"],"record_name":"example.com","records":[{"critical":false,"flags":0,"tag":"iodef","value":"mailto:security@example.com"},{"critical":false,"flags":0,"tag":"issue","value":"letsencrypt.org"}],"wildcard_issuers":["letsencrypt.org"]},"dkim":{"domain":"example.com","found":[{"domain":"example.com","key_bits":2048,"key_bytes":294,"key_type":"rsa","name":"selector1._domainkey.example.com","record":"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs6ZX/GhLgrfk4EWkcLHLsAA/sQpuwePEUAD14pyq8i99ADfMijZm/6TcqsTnpjDtgAgZ8UR5WAOeY8V5E07QFzvrYrm+Yxv++MVwRgxn5pG4IASlD+gvXY56Pqx553B4GD7ktrskcBZJbPBgshVmzJyP+wrCy8UHfa4wF/AOjWFAUvVkI1iuxTcz3w/P2n0GKqiMh/KfURMc1RPVTqbFuSsoLzZjTAY5K8gLxPIffaXdwN9BQpzr+YSQSjf0gFTCo2CoBByxCR/7Me4yAyIyy7OKORBsvLsCwCFJxlU73QAwzuPW19NKdTHuv20wP+MsW4OXkgy9xmmDU6wvzBcmmwIDAQAB","revoked":false,"selector":"selector1","tags":[{"name":"v","value":"DKIM1"},{"name":"k","value":"rsa"},{"name":"p","value":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs6ZX/GhLgrfk4EWkcLHLsAA/sQpuwePEUAD14pyq8i99ADfMijZm/6TcqsTnpjDtgAgZ8UR5WAOeY8V5E07QFzvrYrm+Yxv++MVwRgxn5pG4IASlD+gvXY56Pqx553B4GD7ktrskcBZJbPBgshVmzJyP+wrCy8UHfa4wF/AOjWFAUvVkI1iuxTcz3w/P2n0GKqiMh/KfURMc1RPVTqbFuSsoLzZjTAY5K8gLxPIffaXdwN9BQpzr+YSQSjf0gFTCo2CoBByxCR/7Me4yAyIyy7OKORBsvLsCwCFJxlU73QAwzuPW19NKdTHuv20wP+MsW4OXkgy9xmmDU6wvzBcmmwIDAQAB"}],"testing":false}],"tried":["default","dkim","mail","smtp","sig1","s1","s2","k1","k2","k3","google","selector1","selector2","mandrill","smtpapi","mailo","mg","zoho","zmail","protonmail","protonmail2","protonmail3","fm1","fm2","fm3","mbo0001","mbo0002","mbo0003","mbo0004","mailjet","amazonses"]},"dmarc":{"adkim":"r","applied_policy":"reject","aspf":"r","domain":"example.com","effective_policy":"reject","nonexistent_policy":"reject","org_domain":"example.com","pct":100,"policy":"reject","record":"v=DMARC1; p=reject; rua=mailto:dmarc@example.com","record_domain":"example.com","rua":["mailto:dmarc@example.com"],"ruf":[],"subdomain_policy":"reject","tags":[{"name":"v","value":"DMARC1"},{"name":"p","value":"reject"},{"name":"rua","value":"mailto:dmarc@example.com"}],"test_mode":false},"dnssec":{"dnskeys":[{"algorithm":13,"flags":256,"protocol":3,"role":"zsk"},{"algorithm":13,"flags":257,"protocol":3,"role":"ksk"}],"domain":"example.com","ds":[{"algorithm":13,"digest_type":2,"key_tag":2371}],"state":"secure","validated":true},"domain":"example.com","mta_sts":{"domain":"example.com","mx_hosts":["mx1.example.com","mx2.example.com"],"policy":{"max_age":604800,"mode":"enforce","mx":["*.example.com"],"version":"STSv1"},"policy_fetched":true,"policy_id":"20261024T120000","record":"v=STSv1; id=20261024T120000","tlsrpt_record":"v=TLSRPTv1; rua=mailto:tlsrpt@example.com","tlsrpt_rua":["mailto:tlsrpt@example.com"],"uncovered_mx":[]},"mx":{"domain":"example.com","hosts":[{"addresses":["192.0.2.25"],"exchange":"mx1.example.com","preference":10,"resolved":true},{"addresses":["192.0.2.26"],"exchange":"mx2.example.com","preference":20,"resolved":true}],"implicit_mx":false,"null_mx":false},"provider":{"domain":"example.com","list_version":"2026-10-31","primary":null,"providers":[]},"ptr":{"addresses":[{"address":"192.0.2.25","forward_confirmed":true,"host":"mx1.example.com","ptr_names":["mx1.example.com"]},{"address":"192.0.2.26","forward_confirmed":true,"host":"mx2.example.com","ptr_names":["mx2.example.com"]}],"domain":"example.com"},"spf":{"all_qualifier":"-","dns_lookup_count":1,"domain":"example.com","lookup_count_complete":true,"record":"v=spf1 ip4:192.0.2.0/24 include:_spf.example.net -all","tree":{"children":[{"children":[],"domain":"_spf.example.net","error":null,"record":"v=spf1 ip4:198.51.100.0/24 -all","terms":[{"kind":"mechanism","name":"ip4","qualifier":null,"raw":"ip4:198.51.100.0/24","value":"198.51.100.0/24"},{"kind":"mechanism","name":"all","qualifier":"-","raw":"-all","value":null}],"via":"include"}],"domain":"example.com","error":null,"record":"v=spf1 ip4:192.0.2.0/24 include:_spf.example.net -all","terms":[{"kind":"mechanism","name":"ip4","qualifier":null,"raw":"ip4:192.0.2.0/24","value":"192.0.2.0/24"},{"kind":"mechanism","name":"include","qualifier":null,"raw":"include:_spf.example.net","value":"_spf.example.net"},{"kind":"mechanism","name":"all","qualifier":"-","raw":"-all","value":null}],"via":"root"},"void_lookup_count":0}},"endpoint":"domain.health","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_DomainHealthData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Domain health check","tags":["domain"],"x-credits":5,"x-data-class":"public","x-deadline-ms":15000,"x-finding-codes":["BIMI_DMARC_NOT_ENFORCED","BIMI_INSECURE_URL","BIMI_INVALID_RECORD","BIMI_LOGO_NOT_SVG","BIMI_NOT_FOUND","BIMI_NO_VMC","CAA_INVALID_IODEF","CAA_INVALID_VALUE","CAA_NOT_FOUND","CAA_NO_ISSUANCE","CAA_UNKNOWN_CRITICAL_TAG","CHECK_QUERY_BUDGET_EXCEEDED","DKIM_INVALID_KEY","DKIM_KEY_REVOKED","DKIM_MULTIPLE_RECORDS","DKIM_NO_COMMON_SELECTORS","DKIM_SYNTAX_ERROR","DKIM_TESTING_MODE","DKIM_WEAK_KEY","DMARC_HISTORIC_TAG","DMARC_INHERITED","DMARC_INVALID_POLICY","DMARC_INVALID_REPORT_URI","DMARC_MULTIPLE_RECORDS","DMARC_NOT_FOUND","DMARC_NO_RUA","DMARC_PARTIAL_PCT","DMARC_POLICY_NONE","DMARC_SYNTAX_ERROR","DMARC_TESTING_MODE","DMARC_UNKNOWN_TAG","DMARC_UNSUPPORTED_REPORT_URI","DNSSEC_BOGUS","DNSSEC_DEPRECATED_ALGORITHM","DNSSEC_DS_WITHOUT_DNSKEY","DNSSEC_INDETERMINATE","DNSSEC_NOT_SIGNED","DNSSEC_SHA1_DIGEST","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","MTASTS_INVALID_POLICY","MTASTS_INVALID_RECORD","MTASTS_LOW_MAX_AGE","MTASTS_MODE_NONE","MTASTS_MODE_TESTING","MTASTS_MULTIPLE_RECORDS","MTASTS_MX_NOT_COVERED","MTASTS_MX_NOT_COVERED_TESTING","MTASTS_NOT_FOUND","MTASTS_POLICY_UNAVAILABLE","MX_NOT_FOUND","MX_NULL","MX_NULL_WITH_OTHERS","MX_TARGET_IS_IP","MX_TARGET_UNRESOLVABLE","PTR_MISSING","PTR_MULTIPLE_RECORDS","PTR_NOT_FORWARD_CONFIRMED","PTR_NO_MAIL_HOSTS","SPF_INCLUDE_LOOP","SPF_INCLUDE_NOT_FOUND","SPF_MACRO_NOT_EVALUATED","SPF_MULTIPLE_RECORDS","SPF_NEUTRAL_ALL","SPF_NOT_FOUND","SPF_NO_ALL","SPF_PASS_ALL","SPF_PTR_MECHANISM","SPF_SOFTFAIL_ALL","SPF_SYNTAX_ERROR","SPF_TOO_MANY_LOOKUPS","SPF_TOO_MANY_VOID_LOOKUPS","TLSRPT_INVALID","TLSRPT_NOT_FOUND"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.08","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.08"},"rule":{"amount":80000,"kind":"fixed"}}}},"/v1/domain/rdap":{"get":{"description":"Asks the registry's RDAP server from the IANA bootstrap file (RFC 9224) for the registrable domain and reports registrar, creation, change and expiry dates, EPP statuses, nameservers and DNSSEC delegation. Contact data is never kept or returned.","operationId":"domain.rdap","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"created":"1995-08-14T04:00:00Z","days_to_expiry":292,"delegation_signed":true,"domain":"example.com","expires":"2027-08-13T04:00:00Z","last_changed":"2026-08-14T07:01:39Z","ldh_name":"example.com","nameservers":["a.iana-servers.net","b.iana-servers.net"],"rdap_server":"rdap.verisign.com","registered":true,"registrar":"RESERVED-Internet Assigned Numbers Authority","registrar_iana_id":376,"statuses":["client delete prohibited","client transfer prohibited","client update prohibited"]},"endpoint":"domain.rdap","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_RdapData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"RDAP domain lookup","tags":["domain"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["DOMAIN_EXPIRED","DOMAIN_EXPIRING_SOON","DOMAIN_NOT_REGISTERED","DOMAIN_ON_HOLD","DOMAIN_PENDING_DELETE","DOMAIN_TRANSFER_UNLOCKED","RDAP_UNAVAILABLE"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/http/cookie-parse":{"post":{"description":"Reads a Set-Cookie value as RFC 6265bis does: name, attributes, Secure, HttpOnly, SameSite, Partitioned, the __Host- and __Secure- prefix rules, Domain, Path, Expires and Max-Age with the 400-day cap. The cookie's value is never returned or stored, only its length. Nothing is fetched.","operationId":"http.cookie_parse","parameters":[{"$ref":"#/components/parameters/PaymentSignature"}],"requestBody":{"content":{"application/json":{"example":{"header":"Set-Cookie: __Secure-session=3f9a1c7e5b2d; Domain=example.com; Path=/; Secure; HttpOnly; SameSite=Lax; Max-Age=86400"},"schema":{"additionalProperties":false,"description":"One pasted HTTP header value; the header name in front of it is optional.","properties":{"header":{"maxLength":8192,"minLength":1,"title":"Header","type":"string"}},"required":["header"],"title":"HeaderInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"attributes":["domain","path","secure","httponly","samesite","max-age"],"domain":"example.com","expires":null,"header_name":"set-cookie","http_only":true,"lifetime_days":1,"max_age":86400,"name":"__Secure-session","notes":["Only the pasted text is read; whether a site sends this header is not checked."],"partitioned":false,"path":"/","persistent":true,"prefix":"__Secure-","same_site":"lax","secure":true,"value_length":12},"endpoint":"http.cookie_parse","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_CookieParseData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Set-Cookie parser","tags":["http"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["COOKIE_INVALID","COOKIE_LONG_LIFETIME","COOKIE_MULTIPLE","COOKIE_NO_HTTPONLY","COOKIE_NO_SAMESITE","COOKIE_NO_SECURE","COOKIE_PREFIX_INVALID","COOKIE_SAMESITE_INVALID","COOKIE_SAMESITE_NONE_INSECURE"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/http/csp-parse":{"post":{"description":"Reads a Content-Security-Policy value as CSP Level 3 does: every policy and directive, 'unsafe-inline' and 'unsafe-eval', wildcard and scheme-only sources for scripts and plugins, missing default-src, object-src and base-uri, repeated, unknown and removed directives, and report-only mode. Nothing is fetched.","operationId":"http.csp_parse","parameters":[{"$ref":"#/components/parameters/PaymentSignature"}],"requestBody":{"content":{"application/json":{"example":{"header":"Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.example.com; object-src 'none'; base-uri 'self'"},"schema":{"additionalProperties":false,"description":"One pasted HTTP header value; the header name in front of it is optional.","properties":{"header":{"maxLength":8192,"minLength":1,"title":"Header","type":"string"}},"required":["header"],"title":"HeaderInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"header_name":"content-security-policy","notes":["Only the pasted text is read; whether a site sends this header is not checked."],"policies":[{"directives":[{"name":"default-src","sources":["'self'"]},{"name":"script-src","sources":["'self'","'unsafe-inline'","https://cdn.example.com"]},{"name":"object-src","sources":["'none'"]},{"name":"base-uri","sources":["'self'"]}]}],"report_only":false},"endpoint":"http.csp_parse","findings":[{"code":"CSP_UNSAFE_INLINE","evidence":{"count":1,"items":[{"directive":"script-src","policy":"1","source":"'unsafe-inline'"}]},"explanation":"The script-src directive (or default-src, when there is no script-src) allows 'unsafe-inline' without a nonce or hash, or allows 'unsafe-eval'. Injected inline scripts can then run, which removes most of the protection the policy gives against cross-site scripting.","message":"The Content Security Policy allows inline or eval'd scripts.","recommendation":"Move inline scripts to files or allow them with nonces or hashes, and drop 'unsafe-eval' once no code needs eval().","severity":"info"}],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"info"},"schema":{"$ref":"#/components/schemas/CheckResponse_CspParseData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"CSP header parser","tags":["http"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["CSP_DEPRECATED_DIRECTIVE","CSP_DUPLICATE_DIRECTIVE","CSP_EMPTY_POLICY","CSP_NO_BASE_URI","CSP_NO_DEFAULT_SRC","CSP_NO_OBJECT_SRC","CSP_REPORT_ONLY","CSP_UNKNOWN_DIRECTIVE","CSP_UNSAFE_INLINE","CSP_WILDCARD_SOURCE"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/http/hsts-parse":{"post":{"description":"Reads a Strict-Transport-Security value as RFC 6797 does: whether browsers accept it, max-age, includeSubDomains and preload, and which of the hstspreload.org header rules it meets. The same reader as the security headers check. Nothing is fetched.","operationId":"http.hsts_parse","parameters":[{"$ref":"#/components/parameters/PaymentSignature"}],"requestBody":{"content":{"application/json":{"example":{"header":"max-age=63072000; includeSubDomains; preload"},"schema":{"additionalProperties":false,"description":"One pasted HTTP header value; the header name in front of it is optional.","properties":{"header":{"maxLength":8192,"minLength":1,"title":"Header","type":"string"}},"required":["header"],"title":"HeaderInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"directives":["max-age","includesubdomains","preload"],"header_name":null,"include_subdomains":true,"max_age":63072000,"notes":["Only the pasted text is read; whether a site sends this header is not checked.","hstspreload.org also needs the site to redirect http to https on the same host and to send the header on the registrable domain over HTTPS; that needs a live check."],"preload":true,"preload_eligible":true,"preload_missing":[],"valid":true},"endpoint":"http.hsts_parse","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_HstsParseData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"HSTS header parser","tags":["http"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["HSTS_INVALID","HSTS_MAX_AGE_ZERO","HSTS_NO_INCLUDE_SUBDOMAINS","HSTS_PRELOAD_NOT_ELIGIBLE","HSTS_SHORT_MAX_AGE"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/http/security-headers":{"get":{"description":"Follows the redirect chains from http:// and https:// (at most five hops each, public hosts on ports 80 and 443 only) and reads HSTS, Content-Security-Policy, X-Content-Type-Options, frame protection, Referrer-Policy and cookie flags of the final HTTPS response. Page bodies are not read.","operationId":"http.security_headers","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","from_http":{"error":null,"final_status":200,"final_url":"https://example.com/","hops":[{"location":"https://example.com/","status":301,"url":"http://example.com/"},{"location":null,"status":200,"url":"https://example.com/"}],"start_url":"http://example.com/"},"from_https":{"error":null,"final_status":200,"final_url":"https://example.com/","hops":[{"location":null,"status":200,"url":"https://example.com/"}],"start_url":"https://example.com/"},"headers":{"content_security_policy":"default-src 'self'; frame-ancestors 'none'","content_security_policy_report_only":null,"cookies":[{"http_only":true,"name":"session","same_site":"lax","secure":true}],"cross_origin_opener_policy":"same-origin","permissions_policy":"camera=(), microphone=()","referrer_policy":"strict-origin-when-cross-origin","strict_transport_security":{"include_subdomains":true,"max_age":63072000,"preload":true,"raw":"max-age=63072000; includeSubDomains; preload","valid":true},"x_content_type_options":"nosniff","x_frame_options":null}},"endpoint":"http.security_headers","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_SecurityHeadersData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Security headers check","tags":["http"],"x-credits":1,"x-data-class":"public","x-deadline-ms":15000,"x-finding-codes":["COOKIE_NOT_SECURE","DNS_DOMAIN_UNRESOLVABLE","CSP_MISSING","CSP_UNSAFE_INLINE","FRAME_PROTECTION_MISSING","HSTS_MISSING","HSTS_NOT_PRELOAD_READY","HSTS_SHORT_MAX_AGE","HTTPS_UNAVAILABLE","HTTP_NO_HTTPS_REDIRECT","HTTP_UNAVAILABLE","REDIRECT_LIMIT","REDIRECT_OFFSITE","REFERRER_POLICY_MISSING","XCTO_MISSING"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/ip/cidr":{"get":{"description":"Computes the network of an IPv4 or IPv6 CIDR block, its first and last address, the number of addresses, the netmask and host mask (IPv4) and whether the input had host bits set, as in 192.0.2.5/24.","operationId":"ip.cidr","parameters":[{"example":"192.0.2.5/24","in":"query","name":"cidr","required":true,"schema":{"maxLength":64,"minLength":2,"title":"Cidr","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"first":"192.0.2.0","host_bits_set":true,"hostmask":"0.0.0.255","input":"192.0.2.5/24","last":"192.0.2.255","netmask":"255.255.255.0","network":"192.0.2.0/24","prefix":24,"size":"256","version":4},"endpoint":"ip.cidr","findings":[{"code":"IP_HOST_BITS_SET","evidence":{"count":1,"items":[{"input":"192.0.2.5/24","network":"192.0.2.0/24"}]},"explanation":"The address before the slash is not the first address of the network, as in 192.0.2.5/24. The network is 192.0.2.0/24; many configuration files reject the other form or read it as a single host.","message":"The network was given with host bits set.","recommendation":"Write the network with its first address, as shown in the result.","severity":"info"}],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"info"},"schema":{"$ref":"#/components/schemas/CheckResponse_IpCidrData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"CIDR calculator","tags":["ip"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["IP_HOST_BITS_SET"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/ip/contains":{"post":{"description":"Checks one IPv4 or IPv6 address against up to 100 CIDR blocks and returns, for each, whether it contains the address, plus the list of blocks that do. Blocks of the other IP version never match.","operationId":"ip.contains","parameters":[{"$ref":"#/components/parameters/PaymentSignature"}],"requestBody":{"content":{"application/json":{"example":{"cidrs":["192.0.2.0/24","198.51.100.0/24","2001:db8::/32"],"ip":"192.0.2.10"},"schema":{"additionalProperties":false,"properties":{"cidrs":{"items":{"maxLength":64,"minLength":2,"type":"string"},"maxItems":100,"minItems":1,"title":"Cidrs","type":"array"},"ip":{"maxLength":64,"minLength":2,"title":"Ip","type":"string"}},"required":["ip","cidrs"],"title":"IpContainsInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"contained":true,"ip":"192.0.2.10","matches":["192.0.2.0/24"],"results":[{"cidr":"192.0.2.0/24","contains":true},{"cidr":"198.51.100.0/24","contains":false},{"cidr":"2001:db8::/32","contains":false}]},"endpoint":"ip.contains","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_IpContainsData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"IP in CIDR check","tags":["ip"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":[],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/ip/info":{"get":{"description":"Classifies an IPv4 or IPv6 address by IANA's special-purpose registries (private, loopback, link-local, shared, documentation, benchmarking, 6to4, Teredo, NAT64 and more) with the RFC, and gives the compressed and expanded form, the reverse DNS name and the IPv4 form of an IPv4-mapped address. Nothing is looked up.","operationId":"ip.info","parameters":[{"example":"192.0.2.1","in":"query","name":"ip","required":true,"schema":{"maxLength":64,"minLength":2,"title":"Ip","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"compressed":"192.0.2.1","exploded":"192.0.2.1","ip":"192.0.2.1","ipv4_mapped":null,"is_global":false,"reverse_pointer":"1.2.0.192.in-addr.arpa","scope":"documentation","scope_source":{"network":"192.0.2.0/24","registry":"IANA IPv4 Special-Purpose Address Registry","rfc":"RFC 5737"},"version":4},"endpoint":"ip.info","findings":[{"code":"IP_NOT_GLOBAL","evidence":{"count":1,"items":[{"ip":"192.0.2.1","scope":"documentation"}]},"explanation":"The address is in a special-purpose block (IANA's IPv4 and IPv6 Special-Purpose Address Registries), for example private, loopback, link-local, shared address space or documentation. The scope and its RFC are in the result. Such an address cannot be reached from the public internet.","message":"The address is not globally routable.","recommendation":null,"severity":"info"}],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"info"},"schema":{"$ref":"#/components/schemas/CheckResponse_IpInfoData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"IP address info","tags":["ip"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["IP_NOT_GLOBAL"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/ip/range-to-cidr":{"get":{"description":"Summarises an IPv4 or IPv6 range into the fewest CIDR blocks that cover exactly the addresses from start to end; that is at most 62 blocks for IPv4 and 254 for IPv6. Both ends must have the same version and start must not be after end.","operationId":"ip.range_to_cidr","parameters":[{"example":"192.0.2.10","in":"query","name":"start","required":true,"schema":{"maxLength":64,"minLength":2,"title":"Start","type":"string"}},{"example":"192.0.2.20","in":"query","name":"end","required":true,"schema":{"maxLength":64,"minLength":2,"title":"End","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"cidrs":["192.0.2.10/31","192.0.2.12/30","192.0.2.16/30","192.0.2.20/32"],"end":"192.0.2.20","size":"11","start":"192.0.2.10","version":4},"endpoint":"ip.range_to_cidr","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_IpRangeData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"IP range to CIDR","tags":["ip"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":[],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/ip/subnets":{"get":{"description":"Lists the subnets of an IPv4 or IPv6 block with the new prefix length, in order. The new prefix must not be shorter than the block's and at most 256 subnets are returned; a larger split is refused before anything is computed.","operationId":"ip.subnets","parameters":[{"example":"192.0.2.0/24","in":"query","name":"cidr","required":true,"schema":{"maxLength":64,"minLength":2,"title":"Cidr","type":"string"}},{"example":26,"in":"query","name":"prefix","required":true,"schema":{"maximum":128,"minimum":0,"title":"Prefix","type":"integer"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"count":4,"network":"192.0.2.0/24","new_prefix":26,"subnets":["192.0.2.0/26","192.0.2.64/26","192.0.2.128/26","192.0.2.192/26"]},"endpoint":"ip.subnets","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_SubnetsData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Subnet calculator","tags":["ip"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":[],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/mail/bimi":{"get":{"description":"Looks up <selector>._bimi for the domain and its organisational domain, parses v=BIMI1, l= and a=, checks HTTPS and the .svg logo path, and whether DMARC is enforced as BIMI requires. The logo and the mark certificate are not downloaded.","operationId":"mail.bimi","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"in":"query","name":"selector","required":false,"schema":{"default":"default","examples":["default"],"maxLength":80,"minLength":1,"title":"Selector","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"authority_url":"https://example.com/brand/vmc.pem","declined":false,"dmarc_enforced":true,"domain":"example.com","logo_url":"https://example.com/brand/logo.svg","name":"default._bimi.example.com","record":"v=BIMI1; l=https://example.com/brand/logo.svg; a=https://example.com/brand/vmc.pem","record_domain":"example.com","selector":"default"},"endpoint":"mail.bimi","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_BimiData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"BIMI record check","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","BIMI_DMARC_NOT_ENFORCED","BIMI_INSECURE_URL","BIMI_INVALID_RECORD","BIMI_LOGO_NOT_SVG","BIMI_NOT_FOUND","BIMI_NO_VMC"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/mail/bimi-parse":{"post":{"description":"Reads one BIMI assertion record as the BIMI check does: v=BIMI1, l= and a= tags, repeated and missing tags, HTTPS and the .svg logo path, and a missing mark certificate. Nothing is fetched: the logo, the certificate and DMARC are not checked.","operationId":"mail.bimi_parse","parameters":[{"$ref":"#/components/parameters/PaymentSignature"}],"requestBody":{"content":{"application/json":{"example":{"record":"v=BIMI1; l=https://example.com/brand/logo.svg; a=https://example.com/brand/vmc.pem"},"schema":{"additionalProperties":false,"description":"One raw SPF or DMARC record as text; nothing is looked up.","properties":{"record":{"maxLength":4096,"minLength":1,"title":"Record","type":"string"}},"required":["record"],"title":"RecordInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"authority_url":"https://example.com/brand/vmc.pem","declined":false,"is_bimi":true,"logo_url":"https://example.com/brand/logo.svg","notes":["The logo and the mark certificate are not downloaded, and DMARC enforcement, which BIMI requires, needs the BIMI check on a domain."],"record":"v=BIMI1; l=https://example.com/brand/logo.svg; a=https://example.com/brand/vmc.pem","tags":[{"name":"v","value":"BIMI1"},{"name":"l","value":"https://example.com/brand/logo.svg"},{"name":"a","value":"https://example.com/brand/vmc.pem"}],"valid":true},"endpoint":"mail.bimi_parse","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_BimiParseData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"BIMI record parser","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["BIMI_INSECURE_URL","BIMI_INVALID_RECORD","BIMI_LOGO_NOT_SVG","BIMI_NO_VMC"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/mail/check":{"get":{"description":"Runs the MX, SPF and DMARC checks together and checks DKIM for any selectors you supply. data.classification gives the domain's category (protected, partial, monitoring, unprotected or broken), whether subdomains are left open, whether DMARC reporting is broken, and the reasons. DKIM is only checked for given selectors; a missing selector is not proof of missing DKIM.","operationId":"mail.check","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"example":["selector1"],"explode":true,"in":"query","name":"dkim_selectors","required":false,"schema":{"default":[],"items":{"examples":["selector1"],"maxLength":200,"minLength":1,"type":"string"},"maxItems":5,"title":"Dkim Selectors","type":"array"},"style":"form"},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"classification":{"category":"protected","reasons":["policy_reject"],"reporting_broken":false,"subdomains_open":false},"dkim":[{"domain":"example.com","key_bits":2048,"key_bytes":294,"key_type":"rsa","name":"selector1._domainkey.example.com","record":"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs6ZX/GhLgrfk4EWkcLHLsAA/sQpuwePEUAD14pyq8i99ADfMijZm/6TcqsTnpjDtgAgZ8UR5WAOeY8V5E07QFzvrYrm+Yxv++MVwRgxn5pG4IASlD+gvXY56Pqx553B4GD7ktrskcBZJbPBgshVmzJyP+wrCy8UHfa4wF/AOjWFAUvVkI1iuxTcz3w/P2n0GKqiMh/KfURMc1RPVTqbFuSsoLzZjTAY5K8gLxPIffaXdwN9BQpzr+YSQSjf0gFTCo2CoBByxCR/7Me4yAyIyy7OKORBsvLsCwCFJxlU73QAwzuPW19NKdTHuv20wP+MsW4OXkgy9xmmDU6wvzBcmmwIDAQAB","revoked":false,"selector":"selector1","tags":[{"name":"v","value":"DKIM1"},{"name":"k","value":"rsa"},{"name":"p","value":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs6ZX/GhLgrfk4EWkcLHLsAA/sQpuwePEUAD14pyq8i99ADfMijZm/6TcqsTnpjDtgAgZ8UR5WAOeY8V5E07QFzvrYrm+Yxv++MVwRgxn5pG4IASlD+gvXY56Pqx553B4GD7ktrskcBZJbPBgshVmzJyP+wrCy8UHfa4wF/AOjWFAUvVkI1iuxTcz3w/P2n0GKqiMh/KfURMc1RPVTqbFuSsoLzZjTAY5K8gLxPIffaXdwN9BQpzr+YSQSjf0gFTCo2CoBByxCR/7Me4yAyIyy7OKORBsvLsCwCFJxlU73QAwzuPW19NKdTHuv20wP+MsW4OXkgy9xmmDU6wvzBcmmwIDAQAB"}],"testing":false}],"dmarc":{"adkim":"r","applied_policy":"reject","aspf":"r","domain":"example.com","effective_policy":"reject","nonexistent_policy":"reject","org_domain":"example.com","pct":100,"policy":"reject","record":"v=DMARC1; p=reject; rua=mailto:dmarc@example.com","record_domain":"example.com","rua":["mailto:dmarc@example.com"],"ruf":[],"subdomain_policy":"reject","tags":[{"name":"v","value":"DMARC1"},{"name":"p","value":"reject"},{"name":"rua","value":"mailto:dmarc@example.com"}],"test_mode":false},"domain":"example.com","incomplete":[],"mx":{"domain":"example.com","hosts":[{"addresses":["192.0.2.25"],"exchange":"mx1.example.com","preference":10,"resolved":true},{"addresses":["192.0.2.26"],"exchange":"mx2.example.com","preference":20,"resolved":true}],"implicit_mx":false,"null_mx":false},"spf":{"all_qualifier":"-","dns_lookup_count":1,"domain":"example.com","lookup_count_complete":true,"record":"v=spf1 ip4:192.0.2.0/24 include:_spf.example.net -all","tree":{"children":[{"children":[],"domain":"_spf.example.net","error":null,"record":"v=spf1 ip4:198.51.100.0/24 -all","terms":[{"kind":"mechanism","name":"ip4","qualifier":null,"raw":"ip4:198.51.100.0/24","value":"198.51.100.0/24"},{"kind":"mechanism","name":"all","qualifier":"-","raw":"-all","value":null}],"via":"include"}],"domain":"example.com","error":null,"record":"v=spf1 ip4:192.0.2.0/24 include:_spf.example.net -all","terms":[{"kind":"mechanism","name":"ip4","qualifier":null,"raw":"ip4:192.0.2.0/24","value":"192.0.2.0/24"},{"kind":"mechanism","name":"include","qualifier":null,"raw":"include:_spf.example.net","value":"_spf.example.net"},{"kind":"mechanism","name":"all","qualifier":"-","raw":"-all","value":null}],"via":"root"},"void_lookup_count":0}},"endpoint":"mail.check","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_MailCheckData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Mail configuration check","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DKIM_INVALID_KEY","DKIM_KEY_REVOKED","DKIM_MULTIPLE_RECORDS","DKIM_NOT_FOUND","DKIM_SYNTAX_ERROR","DKIM_TESTING_MODE","DKIM_WEAK_KEY","DMARC_HISTORIC_TAG","DMARC_INHERITED","DMARC_INVALID_POLICY","DMARC_INVALID_REPORT_URI","DMARC_MULTIPLE_RECORDS","DMARC_NOT_FOUND","DMARC_NO_RUA","DMARC_PARTIAL_PCT","DMARC_POLICY_NONE","DMARC_SYNTAX_ERROR","DMARC_TESTING_MODE","DMARC_UNKNOWN_TAG","DMARC_UNSUPPORTED_REPORT_URI","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","MX_NOT_FOUND","MX_NULL","MX_NULL_WITH_OTHERS","MX_TARGET_IS_IP","MX_TARGET_UNRESOLVABLE","SPF_INCLUDE_LOOP","SPF_INCLUDE_NOT_FOUND","SPF_MACRO_NOT_EVALUATED","SPF_MULTIPLE_RECORDS","SPF_NEUTRAL_ALL","SPF_NOT_FOUND","SPF_NO_ALL","SPF_PASS_ALL","SPF_PTR_MECHANISM","SPF_SOFTFAIL_ALL","SPF_SYNTAX_ERROR","SPF_TOO_MANY_LOOKUPS","SPF_TOO_MANY_VOID_LOOKUPS"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.03","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.03"},"rule":{"amount":30000,"kind":"fixed"}}}},"/v1/mail/check/bulk":{"post":{"description":"Same engine as the single mail check. Results keep input order; duplicates count as items. Items that fail for technical reasons can be retried free for 15 minutes.","operationId":"mail.check.bulk","parameters":[{"$ref":"#/components/parameters/PaymentSignature"}],"requestBody":{"content":{"application/json":{"example":{"domains":["example.com","example.org"]},"schema":{"additionalProperties":false,"properties":{"domains":{"items":{"examples":["example.com"],"maxLength":1024,"minLength":1,"type":"string"},"maxItems":20,"minItems":1,"title":"Domains","type":"array"}},"required":["domains"],"title":"BulkDomainsInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","endpoint":"mail.check.bulk","failed_count":0,"item_count":2,"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","results":[{"error":null,"index":0,"item":"example.com","result":{"checked_at":"2026-10-24T12:00:00Z","data":{"classification":{"category":"protected","reasons":["policy_reject"],"reporting_broken":false,"subdomains_open":false},"dkim":[],"dmarc":{"adkim":"r","applied_policy":"reject","aspf":"r","domain":"example.com","effective_policy":"reject","nonexistent_policy":"reject","org_domain":"example.com","pct":100,"policy":"reject","record":"v=DMARC1; p=reject; rua=mailto:dmarc@example.com","record_domain":"example.com","rua":["mailto:dmarc@example.com"],"ruf":[],"subdomain_policy":"reject","tags":[{"name":"v","value":"DMARC1"},{"name":"p","value":"reject"},{"name":"rua","value":"mailto:dmarc@example.com"}],"test_mode":false},"domain":"example.com","incomplete":[],"mx":{"domain":"example.com","hosts":[{"addresses":["192.0.2.25"],"exchange":"mx1.example.com","preference":10,"resolved":true},{"addresses":["192.0.2.26"],"exchange":"mx2.example.com","preference":20,"resolved":true}],"implicit_mx":false,"null_mx":false},"spf":{"all_qualifier":"-","dns_lookup_count":1,"domain":"example.com","lookup_count_complete":true,"record":"v=spf1 ip4:192.0.2.0/24 include:_spf.example.net -all","tree":{"children":[{"children":[],"domain":"_spf.example.net","error":null,"record":"v=spf1 ip4:198.51.100.0/24 -all","terms":[{"kind":"mechanism","name":"ip4","qualifier":null,"raw":"ip4:198.51.100.0/24","value":"198.51.100.0/24"},{"kind":"mechanism","name":"all","qualifier":"-","raw":"-all","value":null}],"via":"include"}],"domain":"example.com","error":null,"record":"v=spf1 ip4:192.0.2.0/24 include:_spf.example.net -all","terms":[{"kind":"mechanism","name":"ip4","qualifier":null,"raw":"ip4:192.0.2.0/24","value":"192.0.2.0/24"},{"kind":"mechanism","name":"include","qualifier":null,"raw":"include:_spf.example.net","value":"_spf.example.net"},{"kind":"mechanism","name":"all","qualifier":"-","raw":"-all","value":null}],"via":"root"},"void_lookup_count":0}},"endpoint":"mail.check","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"}},{"error":null,"index":1,"item":"example.org","result":{"checked_at":"2026-10-24T12:00:00Z","data":{"classification":{"category":"nxdomain","reasons":["domain_not_found"],"reporting_broken":false,"subdomains_open":false},"dkim":[],"dmarc":{"adkim":null,"applied_policy":null,"aspf":null,"domain":"example.org","effective_policy":null,"nonexistent_policy":null,"org_domain":"example.org","pct":null,"policy":null,"record":null,"record_domain":null,"rua":[],"ruf":[],"subdomain_policy":null,"tags":[],"test_mode":false},"domain":"example.org","incomplete":[],"mx":{"domain":"example.org","hosts":[],"implicit_mx":false,"null_mx":false},"spf":{"all_qualifier":null,"dns_lookup_count":0,"domain":"example.org","lookup_count_complete":true,"record":null,"tree":null,"void_lookup_count":0}},"endpoint":"mail.check","findings":[{"code":"DMARC_NOT_FOUND","evidence":{"count":1,"items":[{"domain":"example.org","org_domain":"example.org"}]},"explanation":"Without DMARC, receivers apply their own handling to mail that fails SPF and DKIM alignment, and the domain owner receives no reports.","message":"No DMARC record was found for the domain or any of its parent domains.","recommendation":"Publish a DMARC record, for example with p=none and a rua address, and use the reports to plan further steps.","severity":"warning"},{"code":"DNS_DOMAIN_NOT_FOUND","evidence":{"count":2,"items":[{"name":"example.org"},{"name":"example.org"}]},"explanation":"The resolver answered NXDOMAIN: it found no records for this name. Another resolver or a recent registration or delegation change could give a different answer.","message":"The DNS resolver reported that the domain does not exist.","recommendation":"Check the spelling and that the domain is registered and delegated.","severity":"error"}],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"error"}}],"retry_token":null,"schema_version":"1.0","succeeded_count":2},"schema":{"$ref":"#/components/schemas/BulkResponse_MailCheckData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Bulk mail configuration check","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":30000,"x-finding-codes":["CHECK_DEADLINE_EXCEEDED","CHECK_INTERNAL_ERROR","CHECK_QUERY_BUDGET_EXCEEDED","DKIM_INVALID_KEY","DKIM_KEY_REVOKED","DKIM_MULTIPLE_RECORDS","DKIM_NOT_FOUND","DKIM_SYNTAX_ERROR","DKIM_TESTING_MODE","DKIM_WEAK_KEY","DMARC_HISTORIC_TAG","DMARC_INHERITED","DMARC_INVALID_POLICY","DMARC_INVALID_REPORT_URI","DMARC_MULTIPLE_RECORDS","DMARC_NOT_FOUND","DMARC_NO_RUA","DMARC_PARTIAL_PCT","DMARC_POLICY_NONE","DMARC_SYNTAX_ERROR","DMARC_TESTING_MODE","DMARC_UNKNOWN_TAG","DMARC_UNSUPPORTED_REPORT_URI","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","MX_NOT_FOUND","MX_NULL","MX_NULL_WITH_OTHERS","MX_TARGET_IS_IP","MX_TARGET_UNRESOLVABLE","SPF_INCLUDE_LOOP","SPF_INCLUDE_NOT_FOUND","SPF_MACRO_NOT_EVALUATED","SPF_MULTIPLE_RECORDS","SPF_NEUTRAL_ALL","SPF_NOT_FOUND","SPF_NO_ALL","SPF_PASS_ALL","SPF_PTR_MECHANISM","SPF_SOFTFAIL_ALL","SPF_SYNTAX_ERROR","SPF_TOO_MANY_LOOKUPS","SPF_TOO_MANY_VOID_LOOKUPS"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"currency":"USD","max":"0.48","min":"0.03","mode":"dynamic"},"protocols":[{"x402":{}}]},"x-price":{"display":{"max_items":20,"minimum":"0.03","per_item":"0.024"},"rule":{"kind":"per_item","max_items":20,"minimum":30000,"per_item":24000}}}},"/v1/mail/check/bulk/retry":{"post":{"description":"Send the retry_token from a paid bulk response. Only the items that failed for a technical reason are run again, with the domains from the paid request; the input cannot be changed and nothing is charged. A token is valid for 15 minutes and 3 attempts in total. Each attempt that still has failed items returns a new token that replaces the old one.","operationId":"mail.check.bulk.retry","requestBody":{"content":{"application/json":{"example":{"retry_token":"Ex4mpleRetryToken_doNotUse-0123456789abcdef"},"schema":{"additionalProperties":false,"description":"Body of a free bulk retry: only the token from the paid response, never new input.","properties":{"retry_token":{"maxLength":256,"minLength":16,"pattern":"^[A-Za-z0-9_-]+$","title":"Retry Token","type":"string"}},"required":["retry_token"],"title":"BulkRetryInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkResponse_MailCheckData_"}}},"description":"The bulk result with the retried items merged in. While items still fail and attempts are left, it holds a new retry_token that replaces the old one.","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"retry_token_invalid: The retry token is unknown, or a newer token from a later attempt has replaced it. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"retry_in_progress: An attempt with this retry token is already running. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"retry_token_expired: The retry token has expired (15 minutes after it was issued), all 3 attempts are used, or no failed items are left. Nothing is charged."},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The body is invalid: it must hold only retry_token. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable: The service is busy or temporarily unavailable. The attempt does not count. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[],"summary":"Free retry of failed bulk items","tags":["mail"],"x-data-class":"public","x-deadline-ms":30000,"x-free":true,"x-retry-of":"mail.check.bulk","x-retry-token":{"max-attempts":3,"ttl-seconds":900}}},"/v1/mail/dkim":{"get":{"description":"Looks up selector._domainkey for the domain and validates the key record. This checks the published record only; verifying a message signature needs the message itself.","operationId":"mail.dkim","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"example":"selector1","in":"query","name":"selector","required":true,"schema":{"examples":["selector1"],"maxLength":200,"minLength":1,"title":"Selector","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","key_bits":2048,"key_bytes":294,"key_type":"rsa","name":"selector1._domainkey.example.com","record":"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs6ZX/GhLgrfk4EWkcLHLsAA/sQpuwePEUAD14pyq8i99ADfMijZm/6TcqsTnpjDtgAgZ8UR5WAOeY8V5E07QFzvrYrm+Yxv++MVwRgxn5pG4IASlD+gvXY56Pqx553B4GD7ktrskcBZJbPBgshVmzJyP+wrCy8UHfa4wF/AOjWFAUvVkI1iuxTcz3w/P2n0GKqiMh/KfURMc1RPVTqbFuSsoLzZjTAY5K8gLxPIffaXdwN9BQpzr+YSQSjf0gFTCo2CoBByxCR/7Me4yAyIyy7OKORBsvLsCwCFJxlU73QAwzuPW19NKdTHuv20wP+MsW4OXkgy9xmmDU6wvzBcmmwIDAQAB","revoked":false,"selector":"selector1","tags":[{"name":"v","value":"DKIM1"},{"name":"k","value":"rsa"},{"name":"p","value":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs6ZX/GhLgrfk4EWkcLHLsAA/sQpuwePEUAD14pyq8i99ADfMijZm/6TcqsTnpjDtgAgZ8UR5WAOeY8V5E07QFzvrYrm+Yxv++MVwRgxn5pG4IASlD+gvXY56Pqx553B4GD7ktrskcBZJbPBgshVmzJyP+wrCy8UHfa4wF/AOjWFAUvVkI1iuxTcz3w/P2n0GKqiMh/KfURMc1RPVTqbFuSsoLzZjTAY5K8gLxPIffaXdwN9BQpzr+YSQSjf0gFTCo2CoBByxCR/7Me4yAyIyy7OKORBsvLsCwCFJxlU73QAwzuPW19NKdTHuv20wP+MsW4OXkgy9xmmDU6wvzBcmmwIDAQAB"}],"testing":false},"endpoint":"mail.dkim","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_DkimData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"DKIM record check","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["DKIM_INVALID_KEY","DKIM_KEY_REVOKED","DKIM_MULTIPLE_RECORDS","DKIM_NOT_FOUND","DKIM_SYNTAX_ERROR","DKIM_TESTING_MODE","DKIM_WEAK_KEY"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/mail/dkim-discover":{"get":{"description":"Looks up selector._domainkey for a fixed list of selectors used by common mail providers and generic setups, and checks each key record found like the DKIM record check. Finding none is a hint, not proof that DKIM is missing.","operationId":"mail.dkim_discover","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","found":[{"domain":"example.com","key_bits":2048,"key_bytes":294,"key_type":"rsa","name":"selector1._domainkey.example.com","record":"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs6ZX/GhLgrfk4EWkcLHLsAA/sQpuwePEUAD14pyq8i99ADfMijZm/6TcqsTnpjDtgAgZ8UR5WAOeY8V5E07QFzvrYrm+Yxv++MVwRgxn5pG4IASlD+gvXY56Pqx553B4GD7ktrskcBZJbPBgshVmzJyP+wrCy8UHfa4wF/AOjWFAUvVkI1iuxTcz3w/P2n0GKqiMh/KfURMc1RPVTqbFuSsoLzZjTAY5K8gLxPIffaXdwN9BQpzr+YSQSjf0gFTCo2CoBByxCR/7Me4yAyIyy7OKORBsvLsCwCFJxlU73QAwzuPW19NKdTHuv20wP+MsW4OXkgy9xmmDU6wvzBcmmwIDAQAB","revoked":false,"selector":"selector1","tags":[{"name":"v","value":"DKIM1"},{"name":"k","value":"rsa"},{"name":"p","value":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs6ZX/GhLgrfk4EWkcLHLsAA/sQpuwePEUAD14pyq8i99ADfMijZm/6TcqsTnpjDtgAgZ8UR5WAOeY8V5E07QFzvrYrm+Yxv++MVwRgxn5pG4IASlD+gvXY56Pqx553B4GD7ktrskcBZJbPBgshVmzJyP+wrCy8UHfa4wF/AOjWFAUvVkI1iuxTcz3w/P2n0GKqiMh/KfURMc1RPVTqbFuSsoLzZjTAY5K8gLxPIffaXdwN9BQpzr+YSQSjf0gFTCo2CoBByxCR/7Me4yAyIyy7OKORBsvLsCwCFJxlU73QAwzuPW19NKdTHuv20wP+MsW4OXkgy9xmmDU6wvzBcmmwIDAQAB"}],"testing":false}],"tried":["default","dkim","mail","smtp","sig1","s1","s2","k1","k2","k3","google","selector1","selector2","mandrill","smtpapi","mailo","mg","zoho","zmail","protonmail","protonmail2","protonmail3","fm1","fm2","fm3","mbo0001","mbo0002","mbo0003","mbo0004","mailjet","amazonses"]},"endpoint":"mail.dkim_discover","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_DkimDiscoverData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"DKIM selector finder","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","DKIM_INVALID_KEY","DKIM_KEY_REVOKED","DKIM_MULTIPLE_RECORDS","DKIM_NO_COMMON_SELECTORS","DKIM_SYNTAX_ERROR","DKIM_TESTING_MODE","DKIM_WEAK_KEY"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.02","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.02"},"rule":{"amount":20000,"kind":"fixed"}}}},"/v1/mail/dmarc":{"get":{"description":"Finds the DMARC record for the domain or its organisational domain, validates the tags and explains policy, subdomain policy, alignment and reporting addresses.","operationId":"mail.dmarc","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"adkim":"r","applied_policy":"reject","aspf":"r","domain":"example.com","effective_policy":"reject","nonexistent_policy":"reject","org_domain":"example.com","pct":100,"policy":"reject","record":"v=DMARC1; p=reject; rua=mailto:dmarc@example.com","record_domain":"example.com","rua":["mailto:dmarc@example.com"],"ruf":[],"subdomain_policy":"reject","tags":[{"name":"v","value":"DMARC1"},{"name":"p","value":"reject"},{"name":"rua","value":"mailto:dmarc@example.com"}],"test_mode":false},"endpoint":"mail.dmarc","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_DmarcData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"DMARC check","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","DMARC_HISTORIC_TAG","DMARC_INHERITED","DMARC_INVALID_POLICY","DMARC_INVALID_REPORT_URI","DMARC_MULTIPLE_RECORDS","DMARC_NOT_FOUND","DMARC_NO_RUA","DMARC_PARTIAL_PCT","DMARC_POLICY_NONE","DMARC_SYNTAX_ERROR","DMARC_TESTING_MODE","DMARC_UNKNOWN_TAG","DMARC_UNSUPPORTED_REPORT_URI"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/mail/dmarc-parse":{"post":{"description":"Reads one DMARC record as text with the DMARC check's rules (RFC 9989): p, sp, np, psd, t, adkim, aspf, rua and ruf, historic and unknown tags. Nothing is looked up, so which record applies to a domain and external report destinations are not checked.","operationId":"mail.dmarc_parse","parameters":[{"$ref":"#/components/parameters/PaymentSignature"}],"requestBody":{"content":{"application/json":{"example":{"record":"v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com; adkim=s"},"schema":{"additionalProperties":false,"description":"One raw SPF or DMARC record as text; nothing is looked up.","properties":{"record":{"maxLength":4096,"minLength":1,"title":"Record","type":"string"}},"required":["record"],"title":"RecordInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"adkim":"s","aspf":"r","is_dmarc":true,"nonexistent_policy":"quarantine","notes":["The policy shown is the record's own p=; for a subdomain the sp= or np= value can apply instead. The DMARC check on a domain decides which record and policy apply.","Whether a report address in another domain accepts reports (RFC 9989 external destination verification) needs DNS and is not checked."],"pct":100,"policy":"quarantine","psd":null,"record":"v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com; adkim=s","rua":["mailto:dmarc@example.com"],"ruf":[],"subdomain_policy":"quarantine","tags":[{"name":"v","value":"DMARC1"},{"name":"p","value":"quarantine"},{"name":"rua","value":"mailto:dmarc@example.com"},{"name":"adkim","value":"s"}],"test_mode":false,"unknown_tags":[]},"endpoint":"mail.dmarc_parse","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_DmarcParseData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"DMARC record parser","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["DMARC_HISTORIC_TAG","DMARC_INVALID_POLICY","DMARC_INVALID_REPORT_URI","DMARC_NO_RUA","DMARC_PARTIAL_PCT","DMARC_POLICY_NONE","DMARC_SYNTAX_ERROR","DMARC_TESTING_MODE","DMARC_UNKNOWN_TAG","DMARC_UNSUPPORTED_REPORT_URI"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/mail/mta-sts":{"get":{"description":"Looks up _mta-sts, fetches the policy from https://mta-sts.<domain>/.well-known/mta-sts.txt with certificate verification and no redirects, parses mode, mx and max_age, compares the domain's MX hosts with the policy and validates the TLS-RPT record.","operationId":"mail.mta_sts","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","mx_hosts":["mx1.example.com","mx2.example.com"],"policy":{"max_age":604800,"mode":"enforce","mx":["*.example.com"],"version":"STSv1"},"policy_fetched":true,"policy_id":"20261024T120000","record":"v=STSv1; id=20261024T120000","tlsrpt_record":"v=TLSRPTv1; rua=mailto:tlsrpt@example.com","tlsrpt_rua":["mailto:tlsrpt@example.com"],"uncovered_mx":[]},"endpoint":"mail.mta_sts","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_MtaStsData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"MTA-STS and TLS-RPT check","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","MTASTS_INVALID_POLICY","MTASTS_INVALID_RECORD","MTASTS_LOW_MAX_AGE","MTASTS_MODE_NONE","MTASTS_MODE_TESTING","MTASTS_MULTIPLE_RECORDS","MTASTS_MX_NOT_COVERED","MTASTS_MX_NOT_COVERED_TESTING","MTASTS_NOT_FOUND","MTASTS_POLICY_UNAVAILABLE","TLSRPT_INVALID","TLSRPT_NOT_FOUND"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.02","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.02"},"rule":{"amount":20000,"kind":"fixed"}}}},"/v1/mail/mta-sts-parse":{"post":{"description":"Reads an MTA-STS policy file as the MTA-STS check reads a fetched one (RFC 8461 section 3.2): version, mode, mx patterns and max_age, lines that do not parse, and testing, none and short max_age. Nothing is fetched, so the _mta-sts record and MX coverage are not checked.","operationId":"mail.mta_sts_parse","parameters":[{"$ref":"#/components/parameters/PaymentSignature"}],"requestBody":{"content":{"application/json":{"example":{"policy":"version: STSv1\nmode: testing\nmx: mx1.example.com\nmx: *.mail.example.com\nmax_age: 604800\n"},"schema":{"additionalProperties":false,"description":"A pasted MTA-STS policy file (RFC 8461 section 3.2).","properties":{"policy":{"maxLength":8192,"minLength":1,"title":"Policy","type":"string"}},"required":["policy"],"title":"PolicyInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"mx_count":2,"notes":["Only the policy text is read. Whether the domain publishes an _mta-sts record, serves this file at https://mta-sts.<domain>/.well-known/mta-sts.txt and lists matching MX hosts needs the MTA-STS check."],"policy":{"max_age":604800,"mode":"testing","mx":["mx1.example.com","*.mail.example.com"],"version":"STSv1"},"problems":[],"valid":true},"endpoint":"mail.mta_sts_parse","findings":[{"code":"MTASTS_MODE_TESTING","evidence":{"count":1,"items":[{}]},"explanation":"In testing mode senders report TLS failures through TLS-RPT but still deliver the mail, so the policy does not yet protect against downgrade attacks.","message":"The MTA-STS policy is in testing mode.","recommendation":"Move to mode enforce once TLS-RPT reports show that all MX hosts pass.","severity":"warning"}],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"warning"},"schema":{"$ref":"#/components/schemas/CheckResponse_MtaStsPolicyParseData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"MTA-STS policy parser","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["MTASTS_INVALID_POLICY","MTASTS_LOW_MAX_AGE","MTASTS_MODE_NONE","MTASTS_MODE_TESTING"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/mail/mx":{"get":{"description":"Resolves MX records, orders them by preference, and detects null MX (RFC 7505) and MX targets that do not resolve.","operationId":"mail.mx","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","hosts":[{"addresses":["192.0.2.25"],"exchange":"mx1.example.com","preference":10,"resolved":true},{"addresses":["192.0.2.26"],"exchange":"mx2.example.com","preference":20,"resolved":true}],"implicit_mx":false,"null_mx":false},"endpoint":"mail.mx","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_MxData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"MX lookup","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","MX_NOT_FOUND","MX_NULL","MX_NULL_WITH_OTHERS","MX_TARGET_IS_IP","MX_TARGET_UNRESOLVABLE"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/mail/provider":{"get":{"description":"Matches the MX hosts and the domains in the SPF include tree against a fixed, versioned list of about 30 providers. Each match says whether it came from MX, SPF or both; the provider behind the MX host with the lowest preference is the primary one.","operationId":"mail.provider","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","list_version":"2026-10-31","primary":null,"providers":[]},"endpoint":"mail.provider","findings":[{"code":"MAIL_PROVIDER_UNKNOWN","evidence":{"count":1,"items":[{"domain":"example.com"}]},"explanation":"The domain receives mail, but none of its MX host names matches a provider on Lookproof's fixed list. The domain may run its own mail servers or use a provider that is not on the list.","message":"The MX hosts match no provider on the list.","recommendation":null,"severity":"info"}],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"info"},"schema":{"$ref":"#/components/schemas/CheckResponse_MailProviderData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Mail provider detection","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","MAIL_NO_MX","MAIL_PROVIDER_MIXED","MAIL_PROVIDER_UNKNOWN"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.005","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.005"},"rule":{"amount":5000,"kind":"fixed"}}}},"/v1/mail/ptr":{"get":{"description":"Looks up up to five MX hosts, their IPv4 and IPv6 addresses (at most ten), the PTR record of each address and whether a PTR name resolves back to the same address.","operationId":"mail.ptr","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"addresses":[{"address":"192.0.2.25","forward_confirmed":true,"host":"mx1.example.com","ptr_names":["mx1.example.com"]},{"address":"192.0.2.26","forward_confirmed":true,"host":"mx2.example.com","ptr_names":["mx2.example.com"]}],"domain":"example.com"},"endpoint":"mail.ptr","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_PtrData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Reverse DNS check for mail servers","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","PTR_MISSING","PTR_MULTIPLE_RECORDS","PTR_NOT_FORWARD_CONFIRMED","PTR_NO_MAIL_HOSTS"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/mail/spf":{"get":{"description":"Fetches the SPF record, follows include and redirect chains, detects loops and multiple records, and counts DNS-querying mechanisms against the RFC 7208 limit of ten.","operationId":"mail.spf","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"all_qualifier":"-","dns_lookup_count":1,"domain":"example.com","lookup_count_complete":true,"record":"v=spf1 ip4:192.0.2.0/24 include:_spf.example.net -all","tree":{"children":[{"children":[],"domain":"_spf.example.net","error":null,"record":"v=spf1 ip4:198.51.100.0/24 -all","terms":[{"kind":"mechanism","name":"ip4","qualifier":null,"raw":"ip4:198.51.100.0/24","value":"198.51.100.0/24"},{"kind":"mechanism","name":"all","qualifier":"-","raw":"-all","value":null}],"via":"include"}],"domain":"example.com","error":null,"record":"v=spf1 ip4:192.0.2.0/24 include:_spf.example.net -all","terms":[{"kind":"mechanism","name":"ip4","qualifier":null,"raw":"ip4:192.0.2.0/24","value":"192.0.2.0/24"},{"kind":"mechanism","name":"include","qualifier":null,"raw":"include:_spf.example.net","value":"_spf.example.net"},{"kind":"mechanism","name":"all","qualifier":"-","raw":"-all","value":null}],"via":"root"},"void_lookup_count":0},"endpoint":"mail.spf","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_SpfData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"SPF check","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","SPF_INCLUDE_LOOP","SPF_INCLUDE_NOT_FOUND","SPF_MACRO_NOT_EVALUATED","SPF_MULTIPLE_RECORDS","SPF_NEUTRAL_ALL","SPF_NOT_FOUND","SPF_NO_ALL","SPF_PASS_ALL","SPF_PTR_MECHANISM","SPF_SOFTFAIL_ALL","SPF_SYNTAX_ERROR","SPF_TOO_MANY_LOOKUPS","SPF_TOO_MANY_VOID_LOOKUPS"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/mail/spf-flatten":{"get":{"description":"Follows the SPF include and redirect tree as a receiver counts it (10 DNS lookups, 2 void lookups, PermError stops the walk), resolves a and mx to addresses with any /cidr, and merges every block that gives pass, with its sources. exists, ptr and macros are listed apart. Analysis only: no flat record is suggested.","operationId":"mail.spf_flatten","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"complete":true,"dns_lookup_count":1,"domain":"example.com","incomplete":[],"ipv4_address_count":512,"ipv6_network_count":0,"networks":[{"network":"192.0.2.0/24","sources":[{"domain":"example.com","mechanism":"ip4:192.0.2.0/24"}]},{"network":"198.51.100.0/24","sources":[{"domain":"_spf.example.net","mechanism":"ip4:198.51.100.0/24"}]}],"record":"v=spf1 ip4:192.0.2.0/24 include:_spf.example.net -all","unflattenable":[]},"endpoint":"mail.spf_flatten","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_SpfFlattenData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"SPF flattening check","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","SPF_FLATTEN_BROAD","SPF_FLATTEN_INCOMPLETE","SPF_INCLUDE_LOOP","SPF_INCLUDE_NOT_FOUND","SPF_MACRO_NOT_EVALUATED","SPF_MULTIPLE_RECORDS","SPF_NEUTRAL_ALL","SPF_NOT_FOUND","SPF_NO_ALL","SPF_PASS_ALL","SPF_PTR_MECHANISM","SPF_SOFTFAIL_ALL","SPF_SYNTAX_ERROR","SPF_TOO_MANY_LOOKUPS","SPF_TOO_MANY_VOID_LOOKUPS"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/mail/spf-parse":{"post":{"description":"Reads one SPF record as text with the SPF check's parser (RFC 7208): version, mechanisms with qualifiers and values, modifiers, syntax errors and the all policy, and counts the terms that need DNS lookups. Includes are not followed; the SPF check on a domain does that.","operationId":"mail.spf_parse","parameters":[{"$ref":"#/components/parameters/PaymentSignature"}],"requestBody":{"content":{"application/json":{"example":{"record":"v=spf1 mx include:_spf.example.com ~all"},"schema":{"additionalProperties":false,"description":"One raw SPF or DMARC record as text; nothing is looked up.","properties":{"record":{"maxLength":4096,"minLength":1,"title":"Record","type":"string"}},"required":["record"],"title":"RecordInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"all_qualifier":"~","dns_lookup_terms":2,"is_spf":true,"notes":["Each include and redirect is counted once here; the records they point to can need more DNS lookups. The SPF check on a domain counts the whole tree."],"record":"v=spf1 mx include:_spf.example.com ~all","redirect":null,"syntax_errors":[],"terms":[{"kind":"mechanism","name":"mx","qualifier":null,"raw":"mx","value":null},{"kind":"mechanism","name":"include","qualifier":null,"raw":"include:_spf.example.com","value":"_spf.example.com"},{"kind":"mechanism","name":"all","qualifier":"~","raw":"~all","value":null}]},"endpoint":"mail.spf_parse","findings":[{"code":"SPF_SOFTFAIL_ALL","evidence":{"count":1,"items":[{"term":"~all"}]},"explanation":"~all asks receivers to accept mail from servers that are not listed but treat it as suspicious. With an enforcing DMARC policy (p=quarantine or p=reject in effect; t=y counts one step lower) that is enough, because DMARC decides what happens to forged mail. Without one, receivers may still deliver it, and -all (fail) is the stronger ending.","message":"The SPF policy ends with softfail (~all).","recommendation":"If DMARC is not enforcing yet, confirm that every legitimate sender is listed and then end the record with a hard fail instead of softfail. With an enforcing DMARC policy, softfail is acceptable.","severity":"info"}],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"info"},"schema":{"$ref":"#/components/schemas/CheckResponse_SpfParseData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"SPF record parser","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["SPF_MACRO_NOT_EVALUATED","SPF_NEUTRAL_ALL","SPF_NOT_SPF_RECORD","SPF_NO_ALL","SPF_PASS_ALL","SPF_PTR_MECHANISM","SPF_SOFTFAIL_ALL","SPF_SYNTAX_ERROR","SPF_TOO_MANY_LOOKUPS"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/mail/spoofable":{"get":{"description":"Runs the SPF and DMARC checks and reads the DMARC policy that applies. strength: protected (reject), partial (quarantine), monitoring (none), unprotected (no record) or broken; enforcement says whether the policy has gaps such as pct below 100 or a subdomain policy that works out as none (none, partial or full). It describes the published policy, not whether forged mail gets through: the receiving server decides, and DKIM is not assessed.","operationId":"mail.spoofable","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"dmarc_record_domain":"example.com","domain":"example.com","effective_policy":"reject","effective_subdomain_policy":"reject","enforcement":"full","gaps":[],"notes":["This describes the domain's published policy, not whether forged mail gets through: the receiving server makes the final decision, and DKIM is not assessed."],"pct":100,"spf_all_qualifier":"-","strength":"protected","test_mode":false},"endpoint":"mail.spoofable","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_SpoofableData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Email spoofing check","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DMARC_HISTORIC_TAG","DMARC_INHERITED","DMARC_INVALID_POLICY","DMARC_INVALID_REPORT_URI","DMARC_MULTIPLE_RECORDS","DMARC_NOT_FOUND","DMARC_NO_RUA","DMARC_PARTIAL_PCT","DMARC_POLICY_NONE","DMARC_SYNTAX_ERROR","DMARC_TESTING_MODE","DMARC_UNKNOWN_TAG","DMARC_UNSUPPORTED_REPORT_URI","DNS_DOMAIN_NOT_FOUND","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","SPF_INCLUDE_LOOP","SPF_INCLUDE_NOT_FOUND","SPF_MACRO_NOT_EVALUATED","SPF_MULTIPLE_RECORDS","SPF_NEUTRAL_ALL","SPF_NOT_FOUND","SPF_NO_ALL","SPF_PASS_ALL","SPF_PTR_MECHANISM","SPF_SOFTFAIL_ALL","SPF_SYNTAX_ERROR","SPF_TOO_MANY_LOOKUPS","SPF_TOO_MANY_VOID_LOOKUPS","SPOOF_SUBDOMAINS_UNPROTECTED"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/mail/tlsrpt":{"get":{"description":"Looks up the TXT record at _smtp._tls for the domain and checks it as RFC 8460 describes: one record starting with v=TLSRPTv1 and exactly one rua tag with mailto: or https: addresses. The report addresses are not contacted.","operationId":"mail.tlsrpt","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","name":"_smtp._tls.example.com","record":"v=TLSRPTv1; rua=mailto:tlsrpt@example.com","rua":["mailto:tlsrpt@example.com"]},"endpoint":"mail.tlsrpt","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":"example","source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_TlsRptData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"TLS-RPT check","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["CHECK_QUERY_BUDGET_EXCEEDED","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","TLSRPT_INVALID","TLSRPT_NOT_FOUND"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/mail/tlsrpt-parse":{"post":{"description":"Reads one TLS-RPT record as the MTA-STS check does (RFC 8460 section 3): v=TLSRPTv1, exactly one rua tag, and whether each report address is a mailto: or https: URI. Nothing is looked up or contacted.","operationId":"mail.tlsrpt_parse","parameters":[{"$ref":"#/components/parameters/PaymentSignature"}],"requestBody":{"content":{"application/json":{"example":{"record":"v=TLSRPTv1; rua=mailto:tlsrpt@example.com,https://tlsrpt.example.com/v1"},"schema":{"additionalProperties":false,"description":"One raw SPF or DMARC record as text; nothing is looked up.","properties":{"record":{"maxLength":4096,"minLength":1,"title":"Record","type":"string"}},"required":["record"],"title":"RecordInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"is_tlsrpt":true,"notes":["Report addresses are not contacted; whether an https: endpoint accepts reports is not checked."],"record":"v=TLSRPTv1; rua=mailto:tlsrpt@example.com,https://tlsrpt.example.com/v1","rua":["mailto:tlsrpt@example.com","https://tlsrpt.example.com/v1"],"valid":true},"endpoint":"mail.tlsrpt_parse","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_TlsRptParseData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"TLS-RPT record parser","tags":["mail"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["TLSRPT_INVALID"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/site/health":{"get":{"description":"Runs the TLS certificate check, the security headers check and the RDAP lookup in parallel and returns one section per check. A section that fails is marked and the status becomes unknown. There is no score.","operationId":"site.health","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"domain":"example.com","http":{"domain":"example.com","from_http":{"error":null,"final_status":200,"final_url":"https://example.com/","hops":[{"location":"https://example.com/","status":301,"url":"http://example.com/"},{"location":null,"status":200,"url":"https://example.com/"}],"start_url":"http://example.com/"},"from_https":{"error":null,"final_status":200,"final_url":"https://example.com/","hops":[{"location":null,"status":200,"url":"https://example.com/"}],"start_url":"https://example.com/"},"headers":{"content_security_policy":"default-src 'self'; frame-ancestors 'none'","content_security_policy_report_only":null,"cookies":[{"http_only":true,"name":"session","same_site":"lax","secure":true}],"cross_origin_opener_policy":"same-origin","permissions_policy":"camera=(), microphone=()","referrer_policy":"strict-origin-when-cross-origin","strict_transport_security":{"include_subdomains":true,"max_age":63072000,"preload":true,"raw":"max-age=63072000; includeSubDomains; preload","valid":true},"x_content_type_options":"nosniff","x_frame_options":null}},"rdap":{"created":"1995-08-14T04:00:00Z","days_to_expiry":292,"delegation_signed":true,"domain":"example.com","expires":"2027-08-13T04:00:00Z","last_changed":"2026-08-14T07:01:39Z","ldh_name":"example.com","nameservers":["a.iana-servers.net","b.iana-servers.net"],"rdap_server":"rdap.verisign.com","registered":true,"registrar":"RESERVED-Internet Assigned Numbers Authority","registrar_iana_id":376,"statuses":["client delete prohibited","client transfer prohibited","client update prohibited"]},"tls":{"address_family":"ipv4","chain":[{"issuer":"CN=Example Issuing CA","subject":"CN=example.com"},{"issuer":"CN=Example Issuing CA","subject":"CN=Example Issuing CA"}],"cipher":"TLS_AES_256_GCM_SHA384","days_remaining":36,"domain":"example.com","hostname_match":true,"issuer":"CN=Example Issuing CA","key_bits":256,"key_type":"ec","not_after":"2026-11-30T00:00:00Z","not_before":"2026-09-01T00:00:00Z","san":["example.com","www.example.com"],"serial_number":"5ec0de","signature_algorithm":"ecdsa-with-SHA256","subject_cn":"example.com","tls_version":"TLSv1.3","trusted":true,"untrusted_reason":null}},"endpoint":"site.health","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_SiteHealthData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"Site health check","tags":["site"],"x-credits":5,"x-data-class":"public","x-deadline-ms":15000,"x-finding-codes":["COOKIE_NOT_SECURE","CSP_MISSING","CSP_UNSAFE_INLINE","DNS_DOMAIN_UNRESOLVABLE","DNS_RESOLVER_FAILURE","DNS_RESOLVER_TIMEOUT","DOMAIN_EXPIRED","DOMAIN_EXPIRING_SOON","DOMAIN_NOT_REGISTERED","DOMAIN_ON_HOLD","DOMAIN_PENDING_DELETE","DOMAIN_TRANSFER_UNLOCKED","FRAME_PROTECTION_MISSING","HSTS_MISSING","HSTS_NOT_PRELOAD_READY","HSTS_SHORT_MAX_AGE","HTTPS_UNAVAILABLE","HTTP_NO_HTTPS_REDIRECT","HTTP_UNAVAILABLE","RDAP_UNAVAILABLE","REDIRECT_LIMIT","REDIRECT_OFFSITE","REFERRER_POLICY_MISSING","TLS_CERT_EXPIRED","TLS_CERT_EXPIRING","TLS_CERT_EXPIRING_SOON","TLS_HOSTNAME_MISMATCH","TLS_UNAVAILABLE","TLS_UNTRUSTED","TLS_WEAK_KEY","TLS_WEAK_SIGNATURE","XCTO_MISSING"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.025","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.025"},"rule":{"amount":25000,"kind":"fixed"}}}},"/v1/tls/certificate":{"get":{"description":"Connects to the domain on port 443 with SNI, verifies the certificate against the system's trusted roots and the host name (RFC 9525), and reports dates, names, issuer, chain, key and signature algorithm and the negotiated TLS version. No HTTP is sent.","operationId":"tls.certificate","parameters":[{"example":"example.com","in":"query","name":"domain","required":true,"schema":{"examples":["example.com"],"maxLength":1024,"minLength":1,"title":"Domain","type":"string"}},{"$ref":"#/components/parameters/PaymentSignature"}],"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"address_family":"ipv4","chain":[{"issuer":"CN=Example Issuing CA","subject":"CN=example.com"},{"issuer":"CN=Example Issuing CA","subject":"CN=Example Issuing CA"}],"cipher":"TLS_AES_256_GCM_SHA384","days_remaining":36,"domain":"example.com","hostname_match":true,"issuer":"CN=Example Issuing CA","key_bits":256,"key_type":"ec","not_after":"2026-11-30T00:00:00Z","not_before":"2026-09-01T00:00:00Z","san":["example.com","www.example.com"],"serial_number":"5ec0de","signature_algorithm":"ecdsa-with-SHA256","subject_cn":"example.com","tls_version":"TLSv1.3","trusted":true,"untrusted_reason":null},"endpoint":"tls.certificate","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"dns"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_TlsCertificateData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"TLS certificate check","tags":["tls"],"x-credits":1,"x-data-class":"public","x-deadline-ms":10000,"x-finding-codes":["DNS_DOMAIN_UNRESOLVABLE","TLS_CERT_EXPIRED","TLS_CERT_EXPIRING","TLS_CERT_EXPIRING_SOON","TLS_HOSTNAME_MISMATCH","TLS_UNAVAILABLE","TLS_UNTRUSTED","TLS_WEAK_KEY","TLS_WEAK_SIGNATURE"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.01","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.01"},"rule":{"amount":10000,"kind":"fixed"}}}},"/v1/tls/csr-decode":{"post":{"description":"Decodes one PEM PKCS#10 request (RFC 2986): subject, DNS and IP names, key type and size, signature algorithm and whether the signature matches the key. Email addresses are never returned. Nothing is sent to a certificate authority.","operationId":"tls.csr_decode","parameters":[{"$ref":"#/components/parameters/PaymentSignature"}],"requestBody":{"content":{"application/json":{"example":{"pem":"-----BEGIN CERTIFICATE REQUEST-----\nMIIBDzCBtgIBADAaMRgwFgYDVQQDDA93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASYaBFVYf3ODOTflUCxvFDsM5JYUQi+lX/NiQHXhj8i\neWCINKAp3k2MFrjAsCXIYzDZt9kRgg8v6m4v7tBVmhQsoDowOAYJKoZIhvcNAQkO\nMSswKTAnBgNVHREEIDAegg93d3cuZXhhbXBsZS5jb22CC2V4YW1wbGUuY29tMAoG\nCCqGSM49BAMCA0gAMEUCID4KBezMJNy36Sj8p9NoYQDTus6ysKWT7yLaOxm5Vfa2\nAiEApYG7bF7p3rBwf7RghWBn+709OKTRM6jQhTmKnd96XXA=\n-----END CERTIFICATE REQUEST-----\n"},"schema":{"additionalProperties":false,"description":"One PKCS#10 certificate signing request in PEM form.","properties":{"pem":{"maxLength":16384,"minLength":1,"title":"Pem","type":"string"}},"required":["pem"],"title":"CsrInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"decoded":true,"key_bits":256,"key_type":"ec","notes":["A request is only what its owner asks for: the CA decides which names and key usages the certificate gets."],"omitted":[],"san_count":2,"san_dns":["www.example.com","example.com"],"san_ip":[],"signature_algorithm":"ecdsa-with-SHA256","signature_valid":true,"subject":"CN=www.example.com","subject_cn":"www.example.com"},"endpoint":"tls.csr_decode","findings":[],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"ok"},"schema":{"$ref":"#/components/schemas/CheckResponse_PemCsrData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"CSR decoder","tags":["tls"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["CSR_NO_SAN","CSR_SIGNATURE_INVALID","PEM_INVALID","PEM_PERSONAL_DATA_OMITTED","PEM_WEAK_KEY","PEM_WEAK_SIGNATURE"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/tls/pem-decode":{"post":{"description":"Decodes one PEM certificate: subject, issuer, validity and days left, DNS and IP names, key type and size, signature algorithm, CA flag, key usages, self-signed and SHA-256 and SHA-1 fingerprints. Email addresses are never returned. Nothing is fetched, so trust and revocation are not checked.","operationId":"tls.pem_decode","parameters":[{"$ref":"#/components/parameters/PaymentSignature"}],"requestBody":{"content":{"application/json":{"example":{"pem":"-----BEGIN CERTIFICATE-----\nMIIBqjCCAVCgAwIBAgIDDoo/MAoGCCqGSM49BAMCMB0xGzAZBgNVBAMMEkV4YW1w\nbGUgSXNzdWluZyBDQTAeFw0yNjA5MDEwMDAwMDBaFw0yNjExMzAwMDAwMDBaMDAx\nGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTEUMBIGA1UECgwLRXhhbXBsZSBMdGQw\nWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATyMmt7KcF7ouU025TiogjNkCQ2iiS/\n4t5guVuIjznTSD3p0AA45RGsaR10XOStJvi9BN4ruU9SHi9OkKpyP7Y7o2wwajAM\nBgNVHRMBAf8EAjAAMEUGA1UdEQQ+MDyCD3d3dy5leGFtcGxlLmNvbYILZXhhbXBs\nZS5jb22HBMAAAgqBFmhvc3RtYXN0ZXJAZXhhbXBsZS5jb20wEwYDVR0lBAwwCgYI\nKwYBBQUHAwEwCgYIKoZIzj0EAwIDSAAwRQIhAN6TOxiBdfALdsoU3cuapoJrFFm1\neOCqJSG8/3SW9/LOAiAaGfFCWjWof5LnsIGPntTa6TGwqFHv/wxuOpq37L+PNw==\n-----END CERTIFICATE-----\n"},"schema":{"additionalProperties":false,"description":"One X.509 certificate in PEM form; whether it parses is the check's answer.","properties":{"pem":{"maxLength":16384,"minLength":1,"title":"Pem","type":"string"}},"required":["pem"],"title":"CertificateInput","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"checked_at":"2026-10-24T12:00:00Z","data":{"days_remaining":36,"decoded":true,"extended_key_usage":["serverAuth"],"is_ca":false,"issuer":"CN=Example Issuing CA","key_bits":256,"key_type":"ec","key_usage":[],"not_after":"2026-11-30T00:00:00Z","not_before":"2026-09-01T00:00:00Z","notes":["Nothing is fetched: the chain, revocation and trust in the issuer are not checked."],"omitted":["san_email"],"path_length":null,"san_count":4,"san_dns":["www.example.com","example.com"],"san_ip":["192.0.2.10"],"self_issued":false,"self_signed":false,"serial_number":"e8a3f","sha1_fingerprint":"75712bf2227c215c28a2e214ed2f79c007d70769","sha256_fingerprint":"4d0289557971058d3eeee0dea9449d2da6709778c69c92849f2996e4f3120227","signature_algorithm":"ecdsa-with-SHA256","subject":"O=Example Ltd,CN=www.example.com","subject_cn":"www.example.com","validity_days":90,"version":"v3"},"endpoint":"tls.pem_decode","findings":[{"code":"PEM_PERSONAL_DATA_OMITTED","evidence":{"count":1,"items":[{"fields":"san_email"}]},"explanation":"The block holds an email address (emailAddress in a name, or an rfc822Name in the subject alternative names) or a name type that can identify a person, such as a user principal name. Lookproof never returns or stores those. The evidence lists which kinds were present; all other fields are shown.","message":"Email addresses and personal name types were left out of the result.","recommendation":null,"severity":"info"}],"meta":{"cache_hit":false,"duration_ms":42,"fresh_until":"2026-10-24T12:05:00Z","observed_at":"2026-10-24T12:00:00Z","resolver":null,"source":"offline"},"request_id":"req_aaaaaaaaaaaaaaaaaaaaaaaaaa","schema_version":"1.0","status":"info"},"schema":{"$ref":"#/components/schemas/CheckResponse_PemCertificateData_"}}},"description":"The check result. A result with negative findings is still delivered.","headers":{"PAYMENT-RESPONSE":{"$ref":"#/components/headers/PaymentResponse"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request is malformed. Nothing is charged. With an API key, bad_request: The request carries both an API key and a payment; send one of them."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, invalid_api_key: The API key is invalid, revoked or unknown. It is never passed on to payment. Nothing is charged."},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"description":"Payment required: the exact price and how to pay (x402 v2).","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"With an API key, account_inactive: The account of the API key is suspended or closed. Nothing is charged."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payment_in_progress, payment_bound_to_other_request: This payment is already being processed, or it is bound to a different request. No new payment is taken. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"payload_too_large: The body is larger than 64 KB. Nothing is charged."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_input: The input failed validation, with or without a payment; no payment terms are given and nothing is charged. A request with no input at all (the bare URL) gets a 402 whose error field names the missing input. Nothing is charged."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests from this IP address or payer. Nothing is charged. With an API key, quota_exceeded, rate_limited: The plan's credits for the period are used up (the body carries upgrade_url and Retry-After runs to the end of the period), or the account sent too many requests per minute.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"busy, unavailable, payments_unavailable, check_failed, deadline_exceeded: The service is busy or temporarily unavailable, or the check could not be completed (check_failed) or ran out of time (deadline_exceeded) on our side. Nothing is charged; retry after Retry-After. Nothing is charged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{},{"lookproofKey":[]}],"summary":"PEM certificate decoder","tags":["tls"],"x-credits":1,"x-data-class":"public","x-deadline-ms":2000,"x-finding-codes":["CERT_EXPIRED","CERT_EXPIRING_SOON","CERT_LONG_VALIDITY","CERT_NOT_YET_VALID","CERT_NO_SAN","CERT_SELF_SIGNED","PEM_INVALID","PEM_PERSONAL_DATA_OMITTED","PEM_WEAK_KEY","PEM_WEAK_SIGNATURE"],"x-payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","scheme":"exact"},"x-payment-info":{"price":{"amount":"0.002","currency":"USD","mode":"fixed"},"protocols":[{"x402":{}}]},"x-price":{"display":{"single":"0.002"},"rule":{"amount":2000,"kind":"fixed"}}}},"/v1/usage":{"get":{"description":"The plan, the period and the credits used and left for the account of the API key, counted like X-Quota-Remaining, with the requests and credits per endpoint. Free: it uses 0 credits but counts toward the plan's requests per minute. It needs an API key; there is no x402 payment for it.","operationId":"account.usage","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageReport"}}},"description":"The account's usage in the current period.","headers":{"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"},"X-Quota-Reset":{"$ref":"#/components/headers/QuotaReset"},"X-Request-ID":{"$ref":"#/components/headers/RequestId"}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"bad_request: The request carries a payment; send only the API key."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"invalid_api_key: No API key, or it is invalid, revoked or unknown."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"account_inactive: The account of the API key is suspended or closed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"rate_limited: Too many requests per minute for the plan, or too many invalid keys from this IP address.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"unavailable: The usage could not be read; retry shortly.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[{"lookproofKey":[]}],"summary":"Credits used in this period","tags":["account"],"x-credits":0,"x-free":true}}},"servers":[{"url":"https://api.lookproof.dev"}],"tags":[{"name":"account"},{"name":"dns"},{"name":"domain"},{"name":"http"},{"name":"ip"},{"name":"mail"},{"name":"site"},{"name":"tls"}]}