{"openapi":"3.1.0","info":{"title":"PeopleProof prelaunch intentions","version":"0.1.0","description":"Provisional name. Interest registration only; no studies or payments. HTTP only; MCP not implemented. No server URL is assumed before publication. All examples are tests."},"paths":{"/service.json":{"get":{"summary":"Read actual service availability","responses":{"200":{"description":"Prelaunch status, real capture gate and MCP unavailable"}}}},"/v1/intentions":{"post":{"summary":"Register an authorized future-use intention","description":"Client generates and retains a 32-byte random base64url bearer capability. One intention per capability. Same capability/key/normalized payload replays; other data conflicts. Real data accepted only when privacy gate is enabled. Body limit 4096 bytes; no compressed bodies. Same-origin browsers only; agents may omit Origin. 60/IP/hour and 120/capability/hour.","security":[{"capability":[]}],"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Intention"}}}},"responses":{"201":{"description":"Created; capability is never echoed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Receipt"}}}},"200":{"description":"Idempotent replay","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Receipt"}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"413":{"$ref":"#/components/responses/Error"},"415":{"$ref":"#/components/responses/Error"},"422":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/RateLimit"},"503":{"$ref":"#/components/responses/Error"}}}},"/v1/receipt":{"get":{"summary":"Read only the capability holder’s intention","security":[{"capability":[]}],"responses":{"200":{"description":"Private receipt","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Receipt"}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/RateLimit"},"503":{"$ref":"#/components/responses/Error"}}},"delete":{"summary":"Delete the active intention immediately","security":[{"capability":[]}],"responses":{"204":{"description":"Deleted; later reads return 404. No permanent tombstone."},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/RateLimit"},"503":{"$ref":"#/components/responses/Error"}}}}},"components":{"securitySchemes":{"capability":{"type":"http","scheme":"bearer","bearerFormat":"32 cryptographically random bytes, base64url unpadded (43 characters)"}},"responses":{"Error":{"description":"Error; JSON error string, no payload or capability echoed","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"RateLimit":{"description":"Hourly limit reached","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until next hour"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}},"schemas":{"Intention":{"type":"object","additionalProperties":false,"required":["need_summary","audience","use_case","horizon","recurrence","integration","source","authorized","prelaunch_ack","is_test"],"properties":{"notification_email":{"type":"string","format":"email","maxLength":254,"description":"Optional ASCII email for one availability notice only, local part at most 64 characters. Nonempty email requires notification_consent=true. Empty with absent/false consent normalizes to omission. Same privacy gate, private access and 30-day expiry as the intention. No marketing or email sent now."},"notification_consent":{"type":"boolean","description":"Explicit email owner consent to one availability notice; an agent must have that permission. True requires a nonempty valid notification_email. Omit both fields to opt out. Delete the private record to withdraw."},"need_summary":{"type":"string","minLength":20,"maxLength":500,"description":"Trimmed non-confidential plain text. No links, names, contact details, secrets or sensitive data. Angle brackets, control characters, @, www. and http(s): are rejected."},"audience":{"type":"string","minLength":3,"maxLength":160,"description":"Broad, non-sensitive plain text; same prohibited text patterns as need_summary."},"use_case":{"enum":["idea","design","product","agent_build","content","other"]},"horizon":{"enum":["this_month","this_quarter","later","unknown"]},"recurrence":{"enum":["once","monthly","weekly","unknown"]},"budget":{"enum":["unknown","under_100","100_500","500_2000","over_2000"],"default":"unknown","description":"Optional considered budget band, not a quote or spending authority. Known budget requires known currency."},"currency":{"enum":["EUR","USD","GBP","unknown"],"default":"unknown"},"integration":{"enum":["HTTP","MCP","either"],"description":"Preference only; MCP not implemented."},"source":{"enum":["search","catalog","recommendation","direct","directed_test","other","unknown"],"description":"Self-declared, not verified attribution."},"authorized":{"type":"boolean","const":true},"prelaunch_ack":{"type":"boolean","const":true},"is_test":{"type":"boolean","description":"Required explicit flag. Tests must be excluded from demand analysis."}}},"Receipt":{"type":"object","required":["id","status","launch_stage","study_created","payments_enabled","created_at","expires_at","intention"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"const":"intent_recorded"},"launch_stage":{"const":"prelaunch"},"study_created":{"const":false},"payments_enabled":{"const":false},"created_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time"},"intention":{"$ref":"#/components/schemas/Intention"}}}}}}
