{"openapi":"3.1.0","info":{"title":"Email authentication","version":"0.1.0","description":"Parse and validate the email-authentication DNS records SPF, DMARC and DKIM, and evaluate an SPF record against an IPv4/IPv6 address, with honest handling of DNS-dependent SPF mechanisms.","x-guidance":"Parse and validate the email-authentication DNS records SPF, DMARC and DKIM, and evaluate an SPF record against an IPv4/IPv6 address, with honest handling of DNS-dependent SPF mechanisms. Each operation is an HTTP POST to its /v1/<operation> path with a JSON request body (see each operation's requestBody schema) and returns a JSON response. Endpoints are paid per successful call via x402 or MPP (USDC on Base); an unpaid request returns 402 with payment metadata in the WWW-Authenticate header.","contact":{"email":"hello@openverbs.com"}},"x-discovery":{"ownershipProofs":["0xb1401a71756f51464a9962db12f1eb3e9522490cd20010b06d00cf7b7770acfd5f79721f9dfdf2643f8cecd29af3bde9ec133941a386042b32d9886053a70de61b","0xc1c1f11793e18a00fcb7072421f26e89fb75b6aa517fa84370564991f4b10efa024f6f57e4e67eefd20cf46cc01fc5a62d793fa8fbcda04f26c946a3433d73f91b","0x676b474af0ef9ed4809b5d12d2e789b36e52d56215b21f601d71f76620e36ec630347116a7b2b349a3c3681e5db0fbfa76c4169a676b6d6f27864d0e5017284a1c","0xc2ab96522515ed9e9bc4f1a241b774bd48df42e951ddbf7f6aa8fc76f5a96a20421703e1ec402ce7eb1e4eabea3b6e4e4129cf39d56ea91cf4fcf38561fc94fc1c"]},"servers":[{"url":"https://emailauth.openverbs.com"}],"paths":{"/health":{"get":{"summary":"Health check","security":[],"responses":{"200":{"description":"Healthy","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"service":{"type":"string"},"version":{"type":"string"}}}}}}}}},"/v1/spf-parse":{"post":{"summary":"Parse an SPF record","description":"Parse an SPF TXT record (\"v=spf1 …\") into its qualified mechanisms and modifiers. Records that do not start with v=spf1 or use unknown mechanisms are clean 400s. Paid endpoint (x402 + MPP). Price: $0.004000 USDC per successful payment.","tags":["parse spf record","spf record parser","spf dns lookup","validate spf syntax","email spf mechanisms"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"record":{"type":"string","description":"SPF TXT record, e.g. \"v=spf1 ip4:192.0.2.0/24 include:_spf.example.com ~all\"."}},"required":["record"],"additionalProperties":false},"example":{"record":"v=spf1 include:_spf.google.com ~all"}}}},"responses":{"200":{"description":"`{ version, mechanisms: [{ qualifier, type, value }], modifiers, all }`.","content":{"application/json":{"schema":{"type":"object","description":"`{ version, mechanisms: [{ qualifier, type, value }], modifiers, all }`."}}}},"400":{"description":"Invalid request; no payment is attempted"},"402":{"description":"Payment required; x402/MPP metadata returned in headers"},"502":{"description":"Upstream provider error after payment verification"}},"x-payment-info":{"amount":"4000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Parse an SPF TXT record (\"v=spf1 …\") into its qualified mechanisms and modifiers. Records that do not start with v=spf1 or use unknown mechanisms are clean 400s.","method":"tempo","preferredOffer":"mpp-tempo","price":{"mode":"fixed","currency":"USD","amount":"0.004000"},"protocols":[{"x402":{"scheme":"exact","network":"eip155:8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"evm","intent":"charge","network":"8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"tempo","intent":"charge","network":"4217","currency":"0x20c000000000000000000000b9537d11c60e8b50","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}}],"network":"4217","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A","offers":[{"amount":"4000","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","description":"Parse an SPF TXT record (\"v=spf1 …\") into its qualified mechanisms and modifiers. Records that do not start with v=spf1 or use unknown mechanisms are clean 400s.","intent":"charge","method":"evm","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"},{"amount":"4000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Parse an SPF TXT record (\"v=spf1 …\") into its qualified mechanisms and modifiers. Records that do not start with v=spf1 or use unknown mechanisms are clean 400s.","intent":"charge","method":"tempo","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}]}}},"/v1/spf-check":{"post":{"summary":"Evaluate an SPF record against an IP","description":"Evaluate an SPF record against an IPv4/IPv6 address using only its literal ip4/ip6/all mechanisms. DNS-dependent mechanisms (include, a, mx, exists, redirect) reached before a match yield an honest `indeterminate` result rather than a guess. Paid endpoint (x402 + MPP). Price: $0.004000 USDC per successful payment.","tags":["check spf ip","evaluate spf record","spf ip validation","spf sender check","email authentication check"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"record":{"type":"string","description":"SPF TXT record to evaluate."},"ip":{"type":"string","minLength":1,"description":"IPv4 or IPv6 address of the sending host."}},"required":["record","ip"],"additionalProperties":false},"example":{"record":"v=spf1 ip4:192.0.2.0/24 -all","ip":"192.0.2.10"}}}},"responses":{"200":{"description":"`{ result, matched, reason }` — result is pass/fail/softfail/neutral/none/indeterminate.","content":{"application/json":{"schema":{"type":"object","description":"`{ result, matched, reason }` — result is pass/fail/softfail/neutral/none/indeterminate."}}}},"400":{"description":"Invalid request; no payment is attempted"},"402":{"description":"Payment required; x402/MPP metadata returned in headers"},"502":{"description":"Upstream provider error after payment verification"}},"x-payment-info":{"amount":"4000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Evaluate an SPF record against an IPv4/IPv6 address using only its literal ip4/ip6/all mechanisms. DNS-dependent mechanisms (include, a, mx, exists, redirect) reached before a match yield an honest `indeterminate` result rather than a guess.","method":"tempo","preferredOffer":"mpp-tempo","price":{"mode":"fixed","currency":"USD","amount":"0.004000"},"protocols":[{"x402":{"scheme":"exact","network":"eip155:8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"evm","intent":"charge","network":"8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"tempo","intent":"charge","network":"4217","currency":"0x20c000000000000000000000b9537d11c60e8b50","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}}],"network":"4217","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A","offers":[{"amount":"4000","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","description":"Evaluate an SPF record against an IPv4/IPv6 address using only its literal ip4/ip6/all mechanisms. DNS-dependent mechanisms (include, a, mx, exists, redirect) reached before a match yield an honest `indeterminate` result rather than a guess.","intent":"charge","method":"evm","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"},{"amount":"4000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Evaluate an SPF record against an IPv4/IPv6 address using only its literal ip4/ip6/all mechanisms. DNS-dependent mechanisms (include, a, mx, exists, redirect) reached before a match yield an honest `indeterminate` result rather than a guess.","intent":"charge","method":"tempo","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}]}}},"/v1/dmarc-parse":{"post":{"summary":"Parse a DMARC record","description":"Parse a DMARC TXT record (\"v=DMARC1; p=…\") into its policy, alignment, sampling and reporting tags. Missing or invalid policy/alignment/pct values are clean 400s. Paid endpoint (x402 + MPP). Price: $0.004000 USDC per successful payment.","tags":["parse dmarc record","dmarc record parser","validate dmarc policy","dmarc dns lookup","email dmarc tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"record":{"type":"string","description":"DMARC TXT record, e.g. \"v=DMARC1; p=reject; rua=mailto:dmarc@example.com; pct=100\"."}},"required":["record"],"additionalProperties":false},"example":{"record":"v=DMARC1; p=reject; rua=mailto:dmarc@example.com; pct=100"}}}},"responses":{"200":{"description":"`{ version, policy, subdomainPolicy, pct, rua, ruf, adkim, aspf, tags }`.","content":{"application/json":{"schema":{"type":"object","description":"`{ version, policy, subdomainPolicy, pct, rua, ruf, adkim, aspf, tags }`."}}}},"400":{"description":"Invalid request; no payment is attempted"},"402":{"description":"Payment required; x402/MPP metadata returned in headers"},"502":{"description":"Upstream provider error after payment verification"}},"x-payment-info":{"amount":"4000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Parse a DMARC TXT record (\"v=DMARC1; p=…\") into its policy, alignment, sampling and reporting tags. Missing or invalid policy/alignment/pct values are clean 400s.","method":"tempo","preferredOffer":"mpp-tempo","price":{"mode":"fixed","currency":"USD","amount":"0.004000"},"protocols":[{"x402":{"scheme":"exact","network":"eip155:8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"evm","intent":"charge","network":"8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"tempo","intent":"charge","network":"4217","currency":"0x20c000000000000000000000b9537d11c60e8b50","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}}],"network":"4217","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A","offers":[{"amount":"4000","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","description":"Parse a DMARC TXT record (\"v=DMARC1; p=…\") into its policy, alignment, sampling and reporting tags. Missing or invalid policy/alignment/pct values are clean 400s.","intent":"charge","method":"evm","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"},{"amount":"4000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Parse a DMARC TXT record (\"v=DMARC1; p=…\") into its policy, alignment, sampling and reporting tags. Missing or invalid policy/alignment/pct values are clean 400s.","intent":"charge","method":"tempo","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}]}}},"/v1/dkim-parse":{"post":{"summary":"Parse a DKIM key record","description":"Parse a DKIM public-key DNS TXT record (\"v=DKIM1; k=rsa; p=…\") into its key type, public key, hash algorithms, service types and flags. An empty `p` is reported as a revoked key. A missing `p` tag is a clean 400. Paid endpoint (x402 + MPP). Price: $0.004000 USDC per successful payment.","tags":["parse dkim record","dkim key parser","validate dkim dns","dkim public key lookup","email dkim tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"record":{"type":"string","description":"DKIM key TXT record, e.g. \"v=DKIM1; k=rsa; p=MIGfMA0GCSq...\"."}},"required":["record"],"additionalProperties":false},"example":{"record":"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A"}}}},"responses":{"200":{"description":"`{ version, keyType, publicKey, revoked, hashAlgorithms, serviceTypes, flags, notes, tags }`.","content":{"application/json":{"schema":{"type":"object","description":"`{ version, keyType, publicKey, revoked, hashAlgorithms, serviceTypes, flags, notes, tags }`."}}}},"400":{"description":"Invalid request; no payment is attempted"},"402":{"description":"Payment required; x402/MPP metadata returned in headers"},"502":{"description":"Upstream provider error after payment verification"}},"x-payment-info":{"amount":"4000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Parse a DKIM public-key DNS TXT record (\"v=DKIM1; k=rsa; p=…\") into its key type, public key, hash algorithms, service types and flags. An empty `p` is reported as a revoked key. A missing `p` tag is a clean 400.","method":"tempo","preferredOffer":"mpp-tempo","price":{"mode":"fixed","currency":"USD","amount":"0.004000"},"protocols":[{"x402":{"scheme":"exact","network":"eip155:8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"evm","intent":"charge","network":"8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"tempo","intent":"charge","network":"4217","currency":"0x20c000000000000000000000b9537d11c60e8b50","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}}],"network":"4217","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A","offers":[{"amount":"4000","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","description":"Parse a DKIM public-key DNS TXT record (\"v=DKIM1; k=rsa; p=…\") into its key type, public key, hash algorithms, service types and flags. An empty `p` is reported as a revoked key. A missing `p` tag is a clean 400.","intent":"charge","method":"evm","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"},{"amount":"4000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Parse a DKIM public-key DNS TXT record (\"v=DKIM1; k=rsa; p=…\") into its key type, public key, hash algorithms, service types and flags. An empty `p` is reported as a revoked key. A missing `p` tag is a clean 400.","intent":"charge","method":"tempo","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}]}}}},"x-service-info":{"categories":["email"],"docs":{"homepage":"https://emailauth.openverbs.com","apiReference":"https://emailauth.openverbs.com/openapi.json"}}}