{"openapi":"3.1.0","info":{"title":"nobounce","version":"0.1.0","description":"Email validation that suggests corrections. Agent-first: self-serve sandbox key with no signup, no email and no captcha. Never stores plaintext addresses; never probes SMTP.","contact":{"email":"support@nobounce.dev"}},"servers":[{"url":"https://nobounce.dev"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"Verdict":{"type":"object","required":["verdict","reason","suggestion","confidence","checked","cached"],"properties":{"verdict":{"type":"string","enum":["deliverable","undeliverable","risky","unknown"]},"reason":{"type":"string","enum":["ok","syntax_invalid","domain_not_found","null_mx","no_mx_no_a","typosquat_mx","likely_typo","disposable","role_account","dns_error","reserved_domain"]},"suggestion":{"type":"string","nullable":true,"description":"Corrected address, when we can infer one."},"confidence":{"type":"number"},"checked":{"type":"object","properties":{"syntax":{"type":"boolean"},"mx":{"type":"boolean"},"typo":{"type":"boolean"},"disposable":{"type":"boolean"}}},"cached":{"type":"boolean"}}},"Problem":{"type":"object","required":["error","fix"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"error":{"type":"string","description":"Stable machine-readable code."},"fix":{"type":"string","description":"Plain-language instruction for what to do next."}}}}},"paths":{"/health":{"get":{"summary":"Liveness","security":[],"responses":{"200":{"description":"Healthy."}}}},"/v1/config":{"get":{"summary":"Verdict taxonomy, tiers, and the sandbox fixture list","security":[],"responses":{"200":{"description":"Configuration."}}}},"/v1/keys":{"post":{"summary":"Create a free sandbox key (no signup, no email, no captcha)","security":[],"responses":{"201":{"description":"Key created; shown once."},"402":{"description":"Paid tiers are not self-serve in Phase 0.","content":{"application/problem+json":{"schema":{"type":"object","required":["error","fix"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"error":{"type":"string","description":"Stable machine-readable code."},"fix":{"type":"string","description":"Plain-language instruction for what to do next."}}}}}}}}},"/v1/check":{"post":{"summary":"Validate one address","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string"}}}}}},"responses":{"200":{"description":"Verdict.","content":{"application/json":{"schema":{"type":"object","required":["verdict","reason","suggestion","confidence","checked","cached"],"properties":{"verdict":{"type":"string","enum":["deliverable","undeliverable","risky","unknown"]},"reason":{"type":"string","enum":["ok","syntax_invalid","domain_not_found","null_mx","no_mx_no_a","typosquat_mx","likely_typo","disposable","role_account","dns_error","reserved_domain"]},"suggestion":{"type":"string","nullable":true,"description":"Corrected address, when we can infer one."},"confidence":{"type":"number"},"checked":{"type":"object","properties":{"syntax":{"type":"boolean"},"mx":{"type":"boolean"},"typo":{"type":"boolean"},"disposable":{"type":"boolean"}}},"cached":{"type":"boolean"}}}}}},"400":{"description":"Missing or malformed body.","content":{"application/problem+json":{"schema":{"type":"object","required":["error","fix"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"error":{"type":"string","description":"Stable machine-readable code."},"fix":{"type":"string","description":"Plain-language instruction for what to do next."}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/problem+json":{"schema":{"type":"object","required":["error","fix"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"error":{"type":"string","description":"Stable machine-readable code."},"fix":{"type":"string","description":"Plain-language instruction for what to do next."}}}}}},"422":{"description":"Sandbox key, address not in the fixture corpus.","content":{"application/problem+json":{"schema":{"type":"object","required":["error","fix"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"error":{"type":"string","description":"Stable machine-readable code."},"fix":{"type":"string","description":"Plain-language instruction for what to do next."}}}}}},"429":{"description":"Quota exceeded.","content":{"application/problem+json":{"schema":{"type":"object","required":["error","fix"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"error":{"type":"string","description":"Stable machine-readable code."},"fix":{"type":"string","description":"Plain-language instruction for what to do next."}}}}}}}}},"/v1/check/batch":{"post":{"summary":"Validate up to 1000 addresses","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"One verdict per address, keyed by email_sha256."},"413":{"description":"Batch larger than the limit.","content":{"application/problem+json":{"schema":{"type":"object","required":["error","fix"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"error":{"type":"string","description":"Stable machine-readable code."},"fix":{"type":"string","description":"Plain-language instruction for what to do next."}}}}}},"429":{"description":"Quota exceeded.","content":{"application/problem+json":{"schema":{"type":"object","required":["error","fix"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"error":{"type":"string","description":"Stable machine-readable code."},"fix":{"type":"string","description":"Plain-language instruction for what to do next."}}}}}}}}},"/v1/feedback":{"post":{"summary":"Report a delivery outcome (hash only, never a plaintext address)","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Recorded."},"400":{"description":"Invalid hash or event.","content":{"application/problem+json":{"schema":{"type":"object","required":["error","fix"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"error":{"type":"string","description":"Stable machine-readable code."},"fix":{"type":"string","description":"Plain-language instruction for what to do next."}}}}}},"409":{"description":"Idempotency key reused with a different body.","content":{"application/problem+json":{"schema":{"type":"object","required":["error","fix"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"error":{"type":"string","description":"Stable machine-readable code."},"fix":{"type":"string","description":"Plain-language instruction for what to do next."}}}}}}}}},"/v1/hash":{"post":{"summary":"SHA-256 an address for /v1/feedback","security":[],"responses":{"200":{"description":"Hash."}}}},"/v1/me":{"get":{"summary":"Tier and usage this period","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Usage."}}}},"/mcp":{"post":{"summary":"MCP JSON-RPC 2.0 endpoint","security":[],"responses":{"200":{"description":"JSON-RPC result."}}}}}}