{"openapi":"3.1.0","info":{"title":"Domain Name Proof API","version":"1.0.0","summary":"Prove control of a domain. Receive a machine-verifiable proof.","description":"Domain control verification for autonomous agents and applications. Request a challenge, publish it as a DNS TXT record or at an HTTPS /.well-known URL, and receive an Ed25519-signed, machine-verifiable proof that control of the domain was demonstrated at a specific time. Registrar-independent: the public Internet is the verification surface.\n\nControl of the specified domain was demonstrated using the specified verification method at verified_at. This is not evidence of legal ownership, registrant identity, authorization beyond the verification surface, or trustworthiness, and control may have changed since.\n\nWhere \"domain ownership\" verification is requested, this service provides technical CONTROL verification (DNS or web server control), not legal ownership.\n\nPrice: 0.019 USDC per issued proof via x402 v2 on Base mainnet (eip155:8453). Failed checks are free.","contact":{"name":"Active Life Hub LLC","url":"https://domainnameproof.online"},"termsOfService":"https://domainnameproof.online/terms","x-operator":"Active Life Hub LLC","x-price":{"amount":"0.019","currency":"USDC","network":"eip155:8453","unit":"issued proof"}},"servers":[{"url":"https://domainnameproof.online"}],"externalDocs":{"url":"https://domainnameproof.online/docs"},"components":{"securitySchemes":{"accessKey":{"type":"http","scheme":"bearer","description":"access_key returned by POST /api/v1/verifications"}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Stable machine code"},"message":{"type":"string"}},"additionalProperties":true}}},"CreateVerification":{"type":"object","required":["domain","method"],"additionalProperties":false,"properties":{"domain":{"type":"string","maxLength":512,"description":"Domain name (Unicode or punycode). Not a URL.","examples":["example.com","пример.рф"]},"method":{"type":"string","enum":["dns_txt","http_well_known"]},"audience":{"type":"string","maxLength":253,"description":"Relying-party identifier copied into the signed proof"},"nonce":{"type":"string","maxLength":128,"description":"Relying-party nonce copied into the signed proof (replay binding)"},"proof_validity_seconds":{"type":"integer","minimum":3600,"maximum":2592000,"default":604800},"preferred_output_language":{"type":"string","description":"BCP 47 tag for instruction text; supported: en, es, pt, fr, de, ru, zh, ja"}}},"Verification":{"type":"object","properties":{"verification_id":{"type":"string"},"access_key":{"type":"string","description":"Returned only on creation. Secret."},"challenge_id":{"type":"string"},"status":{"type":"string","enum":["challenge_issued","expired"]},"domain":{"type":"object"},"method":{"type":"string"},"challenge":{"type":"object","properties":{"value":{"type":"string"}}},"instructions":{"type":"object"},"issued_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time"},"verify_url":{"type":"string","format":"uri"},"price":{"type":"object"}}},"CheckResult":{"type":"object","properties":{"status":{"type":"string","enum":["verification_pending","verification_failed"]},"verified":{"const":false},"charged":{"const":false},"check":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"retryable":{"type":"boolean"},"details":{"type":"object"}}}}},"Proof":{"type":"object","additionalProperties":false,"required":["proof_version","proof_type","proof_id","issuer","issuer_url","operator","domain","domain_unicode","original_domain","scope","verification_method","challenge_id","audience","nonce","verified_at","valid_until","statement","evidence","key_id","signature_algorithm","canonicalization","signature"],"properties":{"proof_version":{"const":"1"},"proof_type":{"const":"domain_control"},"proof_id":{"type":"string"},"issuer":{"const":"domainnameproof.online"},"issuer_url":{"type":"string"},"operator":{"type":"string"},"domain":{"type":"string","description":"Canonical lowercase ASCII (punycode)"},"domain_unicode":{"type":"string"},"original_domain":{"type":"string"},"scope":{"const":"exact_domain"},"verification_method":{"type":"string","enum":["dns_txt","http_well_known"]},"challenge_id":{"type":"string"},"audience":{"type":["string","null"]},"nonce":{"type":["string","null"]},"verified_at":{"type":"string","format":"date-time"},"valid_until":{"type":"string","format":"date-time"},"statement":{"type":"string"},"evidence":{"type":"object"},"key_id":{"type":"string"},"signature_algorithm":{"const":"Ed25519"},"canonicalization":{"const":"JCS-RFC8785"},"signature":{"type":"string","description":"base64url Ed25519 signature"}}},"Verified":{"type":"object","properties":{"status":{"const":"verified"},"verified":{"const":true},"proof_id":{"type":"string"},"proof":{"$ref":"#/components/schemas/Proof"},"proof_url":{"type":"string"},"verification_keys_url":{"type":"string"},"payment":{"type":"object"}}},"PaymentRequired":{"type":"object","description":"x402 v2 PaymentRequired (also base64-encoded in the PAYMENT-REQUIRED header)","properties":{"x402Version":{"const":2},"accepts":{"type":"array","items":{"type":"object"}},"resource":{"type":"object"},"check":{"type":"object"},"error":{"type":"object"}}},"ValidationRequest":{"type":"object","required":["proof"],"additionalProperties":false,"properties":{"proof":{"$ref":"#/components/schemas/Proof"},"expected_domain":{"type":"string"},"expected_method":{"type":"string","enum":["dns_txt","http_well_known"]},"expected_audience":{"type":"string"},"expected_nonce":{"type":"string"},"max_age_seconds":{"type":"integer","minimum":0},"require_https":{"type":"boolean"}}},"ValidationResult":{"type":"object","properties":{"valid":{"type":"boolean"},"cryptographically_valid":{"type":"boolean"},"within_validity_period":{"type":"boolean"},"requirements_met":{"type":"boolean"},"errors":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}},"proof":{"type":"object"},"notice":{"type":"string"}}}}},"paths":{"/api/v1/verifications":{"post":{"operationId":"createVerification","summary":"Create a domain-control challenge (free, stateless)","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVerification"}}}},"responses":{"201":{"description":"Challenge issued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Verification"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Use application/json","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Domain not acceptable (URL, IP, private/special-use, public suffix, NXDOMAIN)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Not configured; fails closed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/verifications/{verification_id}":{"get":{"operationId":"getVerification","summary":"Challenge status and instructions (free; derived from the sealed ID, no database)","security":[{"accessKey":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Verification"}}}},"401":{"description":"Missing or wrong access key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown verification","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/verifications/{verification_id}/verify":{"post":{"operationId":"verifyDomainControl","summary":"Check the challenge; pay (x402) only when found; receive the signed proof","security":[{"accessKey":[]}],"parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"PAYMENT-SIGNATURE","in":"header","required":false,"schema":{"type":"string"},"description":"x402 v2 payment payload (base64)"}],"responses":{"200":{"description":"Verified (proof) or pending/failed (free)","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Verified"},{"$ref":"#/components/schemas/CheckResult"}]}}}},"401":{"description":"Missing or wrong access key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"x402 payment required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"404":{"description":"Unknown verification","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"In progress, payment reused, or settlement under reconciliation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"Challenge expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Not configured or settlement outcome unknown","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/proofs/{proof_id}":{"get":{"operationId":"getProof","summary":"Retrieve an issued proof (the proof ID is a bearer capability)","parameters":[{"name":"proof_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Proof","content":{"application/json":{"schema":{"type":"object","properties":{"proof":{"$ref":"#/components/schemas/Proof"}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"Past retention","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/proofs/validate":{"post":{"operationId":"validateProof","summary":"Validate a proof server-side (free, stateless). Offline validation needs only the public keys.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationRequest"}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationResult"}}}}}}},"/api/v1/pricing":{"get":{"operationId":"getPricing","summary":"Price, rule and cost components (static)","responses":{"200":{"description":"Pricing"}}}},"/api/v1/health":{"get":{"operationId":"getHealth","summary":"Configuration health (no database). ?ready=1 adds a cached database probe.","parameters":[{"name":"ready","in":"query","required":false,"schema":{"type":"string","enum":["1"]}}],"responses":{"200":{"description":"OK"},"503":{"description":"Not configured"}}}},"/.well-known/domain-name-proof-key.json":{"get":{"operationId":"getVerificationKeys","summary":"Ed25519 verification keys (JWK Set)","responses":{"200":{"description":"JWK Set"}}}},"/.well-known/domain-name-proof.json":{"get":{"operationId":"getServiceDescriptor","summary":"Machine-readable service descriptor","responses":{"200":{"description":"Descriptor"}}}}}}