{"openapi":"3.1.0","info":{"title":"Unfairly Proposal API","version":"2026-10-19-contract","description":"Send a request and we build a proposal for your team to review and publish. Signed events report proposal changes and engagement. All timestamps UTC RFC3339; IDs opaque. Unknown response fields are additive; role/status enums are closed. Business input schemas are workspace-specific; the companion input schema, dictionary and validation rules listed in x-input-contract are part of the handoff. See x-operating-goals for retention clocks and future compatibility targets."},"servers":[{"url":"https://app.unfairly.ai/api/decks/proposals"}],"security":[{"intakeKey":[]}],"externalDocs":{"description":"Reference","url":"https://app.unfairly.ai/api/decks/proposals/reference"},"paths":{"/requests":{"post":{"operationId":"sendRequest","summary":"Send a request","description":"Validate all input and initial roles before grants. A fresh key with an existing active request_id is a completed no-op, not an update. A failed first build with no successful version may restart with corrected inputs/current kit under a fresh key, preserving job_id. Same-key retries replay the original acknowledgment before changed-kit validation. ?dry_run=1 or ?dry_run=true validates with no side effects and needs no Idempotency-Key.","parameters":[{"name":"dry_run","description":"1 or true validates only: no operation, grant, email or build. A 200 is DryRun, never Ack. Without this parameter, 200 is Ack.","schema":{"type":"string","enum":["1","true"]},"in":"query","required":false},{"name":"Idempotency-Key","in":"header","required":false,"description":"Workspace-wide action identity, independent of key rotation. Repeating method/target/parsed body replays original HTTP status and Ack. Different payload: 409 idempotency_conflict. Object key order/whitespace ignored; arrays significant. Validation rejection does not consume a new key. Required for writes except requests?dry_run=1 or requests?dry_run=true; OpenAPI cannot express this cross-parameter condition.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[!-~]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposalRequest"},"example":{"request_id":"portal:deal-123:proposal","callback_url":"https://example.com/webhooks/proposals","source":"portal","recipient":{"name":"Acme Logistics"},"owner":{"name":"Dana Ruiz","email":"dana@example.com"},"initial_roles":[{"email":"dana@example.com","role":"editor"}],"proposal":{"inputs":{}}}}}},"responses":{"200":{"description":"Ack for completed creation/no-op; DryRun only when dry_run=1 or dry_run=true.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Ack"},{"$ref":"#/components/schemas/DryRun"}]},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"succeeded","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"202":{"description":"Durably accepted; work remains. Poll status_url.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"2 seconds polling advice, not a completion promise."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"queued","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"409":{"description":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"idempotency_conflict","error":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"413":{"description":"payload_too_large: maximum 262144 UTF-8 bytes.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"payload_too_large","error":"payload_too_large: maximum 262144 UTF-8 bytes."}}}},"415":{"description":"unsupported_media_type: send application/json.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unsupported_media_type","error":"unsupported_media_type: send application/json."}}}},"422":{"description":"invalid_input or prohibited_data: correct semantic inputs; no work accepted.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input or prohibited_data: correct semantic inputs; no work accepted."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/contract":{"get":{"operationId":"getContract","summary":"Get current contract manifest","description":"Fetch the current combined OpenAPI at the stable URL GET /api/decks/proposals/contract/openapi.json using Authorization: Bearer <intake_key>. GET /api/decks/proposals/contract returns contract_id and permanent artifact URLs; pin a version with GET /api/decks/proposals/contracts/{contract_id}/openapi.json. The current URL follows contract updates; the permanent URL retains the exact version. GET /api/decks/proposals/schema remains available separately. Fresh enabled execution-context authorization is required on every read, including historical artifacts. IDs bind API version, resolved kit commit, context and exact artifact bytes. Historical artifacts are retained immutable bytes; never regenerate them from current code.","parameters":[],"responses":{"200":{"description":"Get current contract manifest","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractManifest"}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/contract/{artifact}":{"get":{"operationId":"getContractArtifact","summary":"Download current contract artifact","description":"Fetch the current combined OpenAPI at the stable URL GET /api/decks/proposals/contract/openapi.json using Authorization: Bearer <intake_key>. GET /api/decks/proposals/contract returns contract_id and permanent artifact URLs; pin a version with GET /api/decks/proposals/contracts/{contract_id}/openapi.json. The current URL follows contract updates; the permanent URL retains the exact version. GET /api/decks/proposals/schema remains available separately. Fresh enabled execution-context authorization is required on every read, including historical artifacts. IDs bind API version, resolved kit commit, context and exact artifact bytes. Historical artifacts are retained immutable bytes; never regenerate them from current code.","parameters":[{"name":"artifact","description":"Exact contract artifact filename.","in":"path","required":true,"schema":{"type":"string","enum":["openapi.json","schema.json","reference.md","examples.json"]}}],"responses":{"200":{"description":"Download current contract artifact","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"type":["object","array"]}},"text/markdown":{"schema":{"type":"string"}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/contracts/{contractId}/{artifact}":{"get":{"operationId":"getHistoricalContractArtifact","summary":"Download immutable contract artifact","description":"Fetch the current combined OpenAPI at the stable URL GET /api/decks/proposals/contract/openapi.json using Authorization: Bearer <intake_key>. GET /api/decks/proposals/contract returns contract_id and permanent artifact URLs; pin a version with GET /api/decks/proposals/contracts/{contract_id}/openapi.json. The current URL follows contract updates; the permanent URL retains the exact version. GET /api/decks/proposals/schema remains available separately. Fresh enabled execution-context authorization is required on every read, including historical artifacts. IDs bind API version, resolved kit commit, context and exact artifact bytes. Historical artifacts are retained immutable bytes; never regenerate them from current code.","parameters":[{"name":"contractId","description":"Immutable contract content hash.","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"artifact","description":"Exact contract artifact filename.","in":"path","required":true,"schema":{"type":"string","enum":["openapi.json","schema.json","reference.md","examples.json"]}}],"responses":{"200":{"description":"Download immutable contract artifact","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"type":["object","array"]}},"text/markdown":{"schema":{"type":"string"}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/diagnostics":{"get":{"operationId":"getDiagnostics","summary":"Read safe request diagnostics","description":"One logical diagnostic per authenticated attempt identity, including malformed requests without a job. Replay preserves its ID; later acceptance upgrades a refusal, never the reverse. No payload, notes, raw errors, credentials or caller request IDs are retained in these public rows. Fresh context authorization, signed context-bound pagination and a 30-day read window apply. Unauthenticated correlation IDs are not customer receipts.","parameters":[{"name":"diagnostic_id","description":"Optional safe diagnostic ID; lookup remains scoped to this authenticated context and retention window.","schema":{"type":"string","format":"uuid"},"in":"query","required":false},{"name":"page_size","description":"Results per page, default 50.","schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","required":false},{"name":"page_token","description":"Opaque signed continuation; expires after 15 minutes and is bound to this context.","schema":{"type":"string"},"in":"query","required":false}],"responses":{"200":{"description":"Read safe request diagnostics","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntakeDiagnosticPage"}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/jobs/{job_id}/versions/{version}/pdf":{"get":{"operationId":"getApprovedPdf","summary":"Download the exact approved PDF","description":"Authenticate with the intake key in the Authorization header, without cookies. Only the current approved version is downloadable. A newer draft leaves these bytes unchanged; replacement revokes the previous version. Withdrawal retains retrieval; deletion acceptance immediately revokes it. Returns private stored bytes after hash/size verification and fresh authorization before and after storage access; no signed redirect or credential-bearing URL.","parameters":[{"name":"job_id","description":"The proposal job ID.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"version","description":"Explicit current approved version, a positive integer.","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Download the exact approved PDF","headers":{"ETag":{"schema":{"type":"string"},"description":"Quoted SHA-256 of the exact approved bytes."},"X-Proposal-Version":{"schema":{"type":"integer","minimum":1},"description":"The explicitly requested approved version."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"409":{"description":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"idempotency_conflict","error":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/jobs/{job_id}/versions/{version}/inputs":{"get":{"operationId":"getVersionInputs","summary":"Fetch exact successful draft inputs","description":"Read the explicitly requested successful version before publication or after newer drafts exist. Inputs and contract identity are immutable; approval is current at read time. Never substitutes latest working inputs or approved_inputs. Polling works without callback delivery. Missing, failed or unrecorded versions return 404. Withdrawal retains retrieval; deletion acceptance revokes it. Fresh intake-key/workspace/context authority applies; responses are private, no-store. Editors and Commenters request pricing changes through ordinary comments; an Editor approves publication of the resulting draft. No separate pricing authorization is required.","parameters":[{"name":"job_id","description":"The proposal job ID.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"version","description":"Explicit current approved version, a positive integer.","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Fetch exact successful draft inputs","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionInputs"}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/schema":{"get":{"operationId":"getSchema","summary":"Get your schema","description":"Exact schema.json bytes from the current authenticated contract bundle; use its manifest and immutable URL to pin a contract.","parameters":[],"responses":{"200":{"description":"Get your schema","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/jobs/{job_id}":{"get":{"operationId":"getJob","summary":"Get a job","description":"Without collection, return Job. With collection, return its Page. Analytics failure returns core fields and known PDF URLs with analytics_status=temporarily_unavailable. Published URL allocation is not publication. Review URL follows the latest successful draft.","parameters":[{"name":"job_id","description":"The proposal job ID.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"collection","description":"Omit for the full object. Otherwise return only the named Page. Invalid selector combinations are invalid_input.","schema":{"type":"string","enum":["rounds","publishes","versions","live_viewers","viewer_cta_clicks","anonymous_cta_clicks","engagement_versions","sections"]},"in":"query","required":false},{"name":"page_size","description":"Default 50, maximum 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"in":"query","required":false},{"name":"page_token","description":"Opaque continuation token from next_url. Follow next_url verbatim; tokens expire after 24 hours and are bound to workspace/resource/collection/selectors.","schema":{"type":"string"},"in":"query","required":false},{"name":"viewer_email","description":"Required only for viewer_cta_clicks; normalized email.","schema":{"type":"string","format":"email"},"in":"query","required":false},{"name":"rendered_version","description":"Required for sections; optional version scope for live_viewers, viewer_cta_clicks and anonymous_cta_clicks. Invalid for other collections.","schema":{"type":"integer","minimum":1},"in":"query","required":false}],"responses":{"200":{"description":"Get a job","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/Job"},{"$ref":"#/components/schemas/RoundPage"},{"$ref":"#/components/schemas/PublicationPage"},{"$ref":"#/components/schemas/VersionPage"},{"$ref":"#/components/schemas/LiveViewerPage"},{"$ref":"#/components/schemas/CtaClickPage"},{"$ref":"#/components/schemas/CtaClickPage"},{"$ref":"#/components/schemas/VersionEngagementPage"},{"$ref":"#/components/schemas/SectionPage"}]},"example":{"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","url":"https://proposals.example.com/acme","live_url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","version":2,"live_version":1,"promoted_at":"2026-10-19T14:00:00Z","shape":null,"open_items":[],"revisions":1,"requested_by":null,"promoted_by":null,"publishes":{"items":[{"version":1,"at":"2026-10-19T14:00:00Z","by":null}],"next_url":null},"withdrawn_at":null,"withdrawn_by":null,"rounds":{"items":[{"round":1,"kind":"update","at":"2026-10-19T14:00:00Z","by":null,"comments":1}],"next_url":null},"brief":null,"error":null,"updated_at":"2026-10-19T14:00:00Z","pdf_url":null,"review_pdf_url":null,"engagement":null,"needs_attention":null,"analytics_status":"not_available","versions":{"items":[{"version":1,"created_at":"2026-10-19T14:00:00Z","review_url":"https://review.pitchunfairly.com/acme?review&v=1","review_pdf_url":null},{"version":2,"created_at":"2026-10-19T14:00:00Z","review_url":"https://review.pitchunfairly.com/acme?review&v=2","review_pdf_url":null}],"next_url":null},"deletion":null}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"},"delete":{"operationId":"deleteJob","summary":"Delete proposal","description":"No body. DELETE is machine confirmation. A proposal whose site has an agreement with any signature (partly or fully signed) is refused with 409 signed_agreement: the signing record is kept for at least 7 years, so withdraw it instead; an agreement out for signature with no signature yet is voided and the delete proceeds. Disable hosted access/new work before acceptance; cancel pending work. Operation runs until active-system deletion completes. Poll the accepted operation for completion and its category receipt; deletion erases callback destinations and payloads, so no deletion-completion callback is sent. Keep only minimal redacted receipts for the retention window; return 410 for retained deleted identities, then 404. Cleanup durations are operational goals, not guarantees.","parameters":[{"name":"job_id","description":"The proposal job ID.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Workspace-wide action identity, independent of key rotation. Repeating method/target/parsed body replays original HTTP status and Ack. Different payload: 409 idempotency_conflict. Object key order/whitespace ignored; arrays significant. Validation rejection does not consume a new key. Required for writes except requests?dry_run=1 or requests?dry_run=true; OpenAPI cannot express this cross-parameter condition.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[!-~]+$"}}],"responses":{"200":{"description":"Action already completed, including no-ops. Read status_url for the result.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"succeeded","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"202":{"description":"Durably accepted; work remains. Poll status_url.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"2 seconds polling advice, not a completion promise."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"queued","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"409":{"description":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"idempotency_conflict","error":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"413":{"description":"payload_too_large: maximum 262144 UTF-8 bytes.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"payload_too_large","error":"payload_too_large: maximum 262144 UTF-8 bytes."}}}},"415":{"description":"unsupported_media_type: send application/json.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unsupported_media_type","error":"unsupported_media_type: send application/json."}}}},"422":{"description":"invalid_input or prohibited_data: correct semantic inputs; no work accepted.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input or prohibited_data: correct semantic inputs; no work accepted."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/jobs/{job_id}/update":{"post":{"operationId":"updateJob","summary":"Update a job","description":"Accept while busy and validate the merged accepted working state. Preserve custom partial merge: inputs deep-merge, arrays replace, omitted fields remain, notes append; not JSON Merge Patch. Latest accepted API/comment change wins. An unchanged update or {} is a no-op only if a successful draft represents that state; after a failed round it rebuilds retained context without repeating notes. Failed initial builds require creation restart.","parameters":[{"name":"job_id","description":"The proposal job ID.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Workspace-wide action identity, independent of key rotation. Repeating method/target/parsed body replays original HTTP status and Ack. Different payload: 409 idempotency_conflict. Object key order/whitespace ignored; arrays significant. Validation rejection does not consume a new key. Required for writes except requests?dry_run=1 or requests?dry_run=true; OpenAPI cannot express this cross-parameter condition.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[!-~]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRequest"},"example":{"notes":"Use the 2027 plan year."}}}},"responses":{"200":{"description":"Action already completed, including no-ops. Read status_url for the result.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"succeeded","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"202":{"description":"Durably accepted; work remains. Poll status_url.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"2 seconds polling advice, not a completion promise."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"queued","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"409":{"description":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"idempotency_conflict","error":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"413":{"description":"payload_too_large: maximum 262144 UTF-8 bytes.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"payload_too_large","error":"payload_too_large: maximum 262144 UTF-8 bytes."}}}},"415":{"description":"unsupported_media_type: send application/json.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unsupported_media_type","error":"unsupported_media_type: send application/json."}}}},"422":{"description":"invalid_input or prohibited_data: correct semantic inputs; no work accepted.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input or prohibited_data: correct semantic inputs; no work accepted."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/jobs/{job_id}/revise":{"post":{"operationId":"reviseJob","summary":"Revise a job","description":"Exactly one of comments or from_review. Accept while busy. Snapshot eligible unapplied comments at acceptance; no eligible comments is a successful no-op. Failure releases reservations but retains original acceptance order; a successful draft marks applied, not human-resolved. Direct comments append; failed direct-comment work can be recovered with an empty update.","parameters":[{"name":"job_id","description":"The proposal job ID.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Workspace-wide action identity, independent of key rotation. Repeating method/target/parsed body replays original HTTP status and Ack. Different payload: 409 idempotency_conflict. Object key order/whitespace ignored; arrays significant. Validation rejection does not consume a new key. Required for writes except requests?dry_run=1 or requests?dry_run=true; OpenAPI cannot express this cross-parameter condition.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[!-~]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviseRequest"},"example":{"comments":["Lead with savings."]}}}},"responses":{"200":{"description":"Action already completed, including no-ops. Read status_url for the result.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"succeeded","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"202":{"description":"Durably accepted; work remains. Poll status_url.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"2 seconds polling advice, not a completion promise."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"queued","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"409":{"description":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"idempotency_conflict","error":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"413":{"description":"payload_too_large: maximum 262144 UTF-8 bytes.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"payload_too_large","error":"payload_too_large: maximum 262144 UTF-8 bytes."}}}},"415":{"description":"unsupported_media_type: send application/json.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unsupported_media_type","error":"unsupported_media_type: send application/json."}}}},"422":{"description":"invalid_input or prohibited_data: correct semantic inputs; no work accepted.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input or prohibited_data: correct semantic inputs; no work accepted."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/jobs/{job_id}/promote":{"post":{"operationId":"promoteJob","summary":"Promote a version","description":"Version is required; missing or unavailable version returns 422. Publish any available successful version, including older ones with unresolved comments. Preserve newer working data, draft history and the live URL. Pending builds never auto-publish; no-op when already live. Withdrawn/deleted proposals cannot publish.","parameters":[{"name":"job_id","description":"The proposal job ID.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Workspace-wide action identity, independent of key rotation. Repeating method/target/parsed body replays original HTTP status and Ack. Different payload: 409 idempotency_conflict. Object key order/whitespace ignored; arrays significant. Validation rejection does not consume a new key. Required for writes except requests?dry_run=1 or requests?dry_run=true; OpenAPI cannot express this cross-parameter condition.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[!-~]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoteRequest"},"example":{"version":1}}}},"responses":{"200":{"description":"Action already completed, including no-ops. Read status_url for the result.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"succeeded","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"202":{"description":"Durably accepted; work remains. Poll status_url.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"2 seconds polling advice, not a completion promise."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"queued","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"409":{"description":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"idempotency_conflict","error":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"413":{"description":"payload_too_large: maximum 262144 UTF-8 bytes.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"payload_too_large","error":"payload_too_large: maximum 262144 UTF-8 bytes."}}}},"415":{"description":"unsupported_media_type: send application/json.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unsupported_media_type","error":"unsupported_media_type: send application/json."}}}},"422":{"description":"invalid_input or prohibited_data: correct semantic inputs; no work accepted.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input or prohibited_data: correct semantic inputs; no work accepted."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/jobs/{job_id}/withdraw":{"post":{"operationId":"withdrawJob","summary":"Withdraw a job","description":"Disable draft/live/PDF access before success acknowledgment. Cancel pending work and prevent late restoration. Retain records; repeated withdrawal is successful no-op. Body is an object; reason is optional.","parameters":[{"name":"job_id","description":"The proposal job ID.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Workspace-wide action identity, independent of key rotation. Repeating method/target/parsed body replays original HTTP status and Ack. Different payload: 409 idempotency_conflict. Object key order/whitespace ignored; arrays significant. Validation rejection does not consume a new key. Required for writes except requests?dry_run=1 or requests?dry_run=true; OpenAPI cannot express this cross-parameter condition.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[!-~]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawRequest"},"example":{}}}},"responses":{"200":{"description":"Action already completed, including no-ops. Read status_url for the result.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"succeeded","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"202":{"description":"Durably accepted; work remains. Poll status_url.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"2 seconds polling advice, not a completion promise."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"queued","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"409":{"description":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"idempotency_conflict","error":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"413":{"description":"payload_too_large: maximum 262144 UTF-8 bytes.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"payload_too_large","error":"payload_too_large: maximum 262144 UTF-8 bytes."}}}},"415":{"description":"unsupported_media_type: send application/json.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unsupported_media_type","error":"unsupported_media_type: send application/json."}}}},"422":{"description":"invalid_input or prohibited_data: correct semantic inputs; no work accepted.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input or prohibited_data: correct semantic inputs; no work accepted."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/jobs/{job_id}/viewers":{"get":{"operationId":"listViewers","summary":"List viewers","description":"Without collection return AccessView. Reviewer is named Commenter in this contract. Preserve pending requests plus decided requests from the last 30 days.","parameters":[{"name":"job_id","description":"The proposal job ID.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"collection","description":"Omit for the full object. Otherwise return only the named Page. Invalid selector combinations are invalid_input.","schema":{"type":"string","enum":["viewers","requests"]},"in":"query","required":false},{"name":"page_size","description":"Default 50, maximum 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"in":"query","required":false},{"name":"page_token","description":"Opaque continuation token from next_url. Follow next_url verbatim; tokens expire after 24 hours and are bound to workspace/resource/collection/selectors.","schema":{"type":"string"},"in":"query","required":false}],"responses":{"200":{"description":"List viewers","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AccessView"},{"$ref":"#/components/schemas/ViewerAccessPage"},{"$ref":"#/components/schemas/AccessRequestPage"}]}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"},"post":{"operationId":"changeViewers","summary":"Change viewers","description":"Direct add grants Viewer without emailing. Approving a request grants Viewer and reports its email attempt separately. Validate conflicts before side effects; runtime mixed results terminate failed with partial_failure and every item's result. Successful grants remain. No grants after withdrawal/deletion.","parameters":[{"name":"job_id","description":"The proposal job ID.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Workspace-wide action identity, independent of key rotation. Repeating method/target/parsed body replays original HTTP status and Ack. Different payload: 409 idempotency_conflict. Object key order/whitespace ignored; arrays significant. Validation rejection does not consume a new key. Required for writes except requests?dry_run=1 or requests?dry_run=true; OpenAPI cannot express this cross-parameter condition.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[!-~]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewersRequest"},"example":{"add":["viewer@example.com"]}}}},"responses":{"200":{"description":"Action already completed, including no-ops. Read status_url for the result.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"succeeded","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"202":{"description":"Durably accepted; work remains. Poll status_url.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"2 seconds polling advice, not a completion promise."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"queued","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"409":{"description":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"idempotency_conflict","error":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"413":{"description":"payload_too_large: maximum 262144 UTF-8 bytes.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"payload_too_large","error":"payload_too_large: maximum 262144 UTF-8 bytes."}}}},"415":{"description":"unsupported_media_type: send application/json.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unsupported_media_type","error":"unsupported_media_type: send application/json."}}}},"422":{"description":"invalid_input or prohibited_data: correct semantic inputs; no work accepted.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input or prohibited_data: correct semantic inputs; no work accepted."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/callbacks/capture/{workspace}":{"get":{"operationId":"readCaptures","summary":"Read captured events","description":"Ancillary testing surface; not required for integration. Read authenticated captured callbacks. Capture verifies raw sha256 signatures and known event schemas before redacting stored attribution.","parameters":[{"name":"workspace","description":"Your workspace's handle.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Read captured events","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"type":"object","properties":{"workspace":{"type":"string"},"captures":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"received_at":{"type":"string","format":"date-time"},"event_type":{"type":"string"},"body":{"type":"object"},"raw_body":{"type":["string","null"],"description":"Exact signed bytes, available only in the current trusted Mainstay test context."},"event_id_header":{"type":["string","null"],"description":"Received Unfairly-Event-Id, exposed only with current trusted test-context evidence; must match signed body event_id."},"signature":{"type":["string","null"],"description":"Original signature header for raw_body; verify against the capture receipt timestamp."}}}}},"required":["workspace","captures"]}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/requests/{request_id}":{"get":{"operationId":"getRequest","summary":"Look up proposal by request ID","description":"Read-only lookup without current-kit validation. URL-encode the request_id segment. 410 while a deletion receipt is retained; otherwise 404.","parameters":[{"name":"request_id","description":"Your proposal correlation ID.","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your id for this proposal. Within the workspace it identifies one job; use Idempotency-Key to retry an action."}}],"responses":{"200":{"description":"Look up proposal by request ID","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"},"example":{"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","url":"https://proposals.example.com/acme","live_url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","version":2,"live_version":1,"promoted_at":"2026-10-19T14:00:00Z","shape":null,"open_items":[],"revisions":1,"requested_by":null,"promoted_by":null,"publishes":{"items":[{"version":1,"at":"2026-10-19T14:00:00Z","by":null}],"next_url":null},"withdrawn_at":null,"withdrawn_by":null,"rounds":{"items":[{"round":1,"kind":"update","at":"2026-10-19T14:00:00Z","by":null,"comments":1}],"next_url":null},"brief":null,"error":null,"updated_at":"2026-10-19T14:00:00Z","pdf_url":null,"review_pdf_url":null,"engagement":null,"needs_attention":null,"analytics_status":"not_available","versions":{"items":[{"version":1,"created_at":"2026-10-19T14:00:00Z","review_url":"https://review.pitchunfairly.com/acme?review&v=1","review_pdf_url":null},{"version":2,"created_at":"2026-10-19T14:00:00Z","review_url":"https://review.pitchunfairly.com/acme?review&v=2","review_pdf_url":null}],"next_url":null},"deletion":null}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/operations/{operation_id}":{"get":{"operationId":"getOperation","summary":"Read operation outcome","description":"Durable result for one action; no list endpoint. Unknown/foreign/expired receipts return 404. Queued/running result is null; terminal result contains outcome or is null with result_redacted=true after deletion. Invitation resend has null job_id/request_id.","parameters":[{"name":"operation_id","description":"The accepted operation ID.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Read operation outcome","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Operation"}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}},"/invitations/{invitation_id}/resend":{"post":{"operationId":"resendInvitation","summary":"Resend workspace invitation","description":"Existing active workspace invitation only; no role change or rebuild. Unknown/foreign invitation: 404; consumed/revoked: 409. Return the current invitation ID in result.invitation, including a replacement ID when credentials rotate. Provider acceptance means sent, not delivered.","parameters":[{"name":"invitation_id","description":"The workspace invitation ID.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Workspace-wide action identity, independent of key rotation. Repeating method/target/parsed body replays original HTTP status and Ack. Different payload: 409 idempotency_conflict. Object key order/whitespace ignored; arrays significant. Validation rejection does not consume a new key. Required for writes except requests?dry_run=1 or requests?dry_run=true; OpenAPI cannot express this cross-parameter condition.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[!-~]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false},"example":{}}}},"responses":{"200":{"description":"Action already completed, including no-ops. Read status_url for the result.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"succeeded","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"202":{"description":"Durably accepted; work remains. Poll status_url.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"2 seconds polling advice, not a completion promise."},"Location":{"schema":{"type":"string","format":"uri"},"description":"Equals status_url for Ack; absent for dry run."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ack"},"example":{"operation_id":"7f3e9c2a-0000-4000-8000-000000000001","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"queued","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001"}}}},"400":{"description":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input, invalid_page_token or page_token_expired: correct the request. Validation before acceptance does not consume a new key."}}}},"401":{"description":"unauthorized: provision a valid workspace key.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unauthorized","error":"unauthorized: provision a valid workspace key."}}}},"403":{"description":"forbidden: unavailable to this credential/workspace.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"forbidden","error":"forbidden: unavailable to this credential/workspace."}}}},"404":{"description":"not_found: unknown, foreign-workspace or expired resource.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"not_found","error":"not_found: unknown, foreign-workspace or expired resource."}}}},"409":{"description":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"idempotency_conflict","error":"idempotency_conflict, idempotency_in_progress, invalid_state, or (DELETE only) signed_agreement. An in-progress reservation includes Retry-After: 1."}}}},"410":{"description":"proposal_deleted: stop proposal actions; retained operation receipts remain readable.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"proposal_deleted","error":"proposal_deleted: stop proposal actions; retained operation receipts remain readable."}}}},"413":{"description":"payload_too_large: maximum 262144 UTF-8 bytes.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"payload_too_large","error":"payload_too_large: maximum 262144 UTF-8 bytes."}}}},"415":{"description":"unsupported_media_type: send application/json.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"unsupported_media_type","error":"unsupported_media_type: send application/json."}}}},"422":{"description":"invalid_input or prohibited_data: correct semantic inputs; no work accepted.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"invalid_input","error":"invalid_input or prohibited_data: correct semantic inputs; no work accepted."}}}},"429":{"description":"rate_limited: retry unchanged after Retry-After.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"rate_limited","error":"rate_limited: retry unchanged after Retry-After."}}}},"500":{"description":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"internal_error","error":"internal_error: outcome may be uncertain; retry unchanged with the same key or look it up."}}}},"503":{"description":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds.","headers":{"Proposal-Correlation-Id":{"schema":{"type":"string","format":"uuid"},"description":"Safe internal correlation; does not assert a stored customer diagnostic."},"Proposal-Diagnostic-Id":{"schema":{"type":"string","format":"uuid"},"description":"Present only after an authenticated safe diagnostic receipt is durable. Also returned as diagnostic_id in accepted acknowledgments."},"Cache-Control":{"schema":{"type":"string","const":"no-store"},"description":"Never cache partner responses."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Integer seconds; 409 reservation uses 1, backlog rejection uses 60."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error_code":"temporarily_unavailable","error":"temporarily_unavailable: retry unchanged after Retry-After; backlog admission uses 60 seconds."}}}}},"x-implementation-status":"implemented; selected-environment qualification pending"}}},"x-operating-goals":{"active_deletion_days":7,"backup_cleanup_days":90,"operation_receipt_days":90,"retry_protection_days":90,"breaking_change_notice_days":90,"breaking_change_overlap_days":180,"description":"Durations are goals until operationally verified. Retain terminal operation outcomes for the proposal lifetime, including withdrawal; never expire pending operations or their retry protection. Retry protection is at least 90 days from acceptance. Active deletion (7 days) and backup cleanup (90 days) run from the deletion request. Redacted operation/deletion receipts remain for 90 days after deletion completes, with exact retry replay and protection against recreation during that window; receipt expiry ends that protection. Retain no proposal content, inputs, emails, analytics or raw errors in deletion receipts. For breaking API, kit-input or event changes, aim for at least 90 days' notice and 180 days' old-contract support after the replacement is available, unless the customer explicitly agrees to earlier migration. This covers meanings, units, metrics, permissions and reduced recovery windows as well as field changes; no silent kit upgrade may break the input contract. Urgent security fixes may shorten the window with prompt notice and a documented migration/recovery path. This future compatibility policy is separate from coordinated pre-launch adoption."},"x-input-contract":{"description":"Customer-specific fields live under proposal.template and proposal.inputs. GET /schema returns the authenticated workspace’s pinned contract. Customer guides publish a combined OpenAPI artifact in their own workspace URL. Validate the merged queued-update state before acceptance; violations return 422 and field details. JSON Schema alone does not express every cross-field check."},"x-limits":{"max_body_bytes":262144,"build_writes_per_minute_per_workspace":60,"other_writes_per_minute_per_workspace":60,"reads_per_minute_per_workspace":600,"unfinished_build_operations_per_workspace":1000},"x-pagination":"Page size 50/max100. Tokens expire after 24h, bind tenant/resource/collection/selectors and preserve a creation cutoff and deterministic key. Aggregates can change during traversal. Full reads expand first-level pages only; child pages defer with empty items and non-null next_url. Order rounds/version ascending, publications time+ID, viewers email, clicks time+ID, sections number+ID, requests creation+ID. No caller date ranges.","x-analytics":"Visible time preserves active_ms. Focus requires visible+focused, no new idle timer. Section reach is once per visit after 1500 cumulative visible ms. Version is actually rendered version. Include named/anonymous live activity; exclude review and identified-owner activity. Missing historical measurements are null with coverage, not zero. Visits use 13-month retention; CTA scope is lifetime. Coverage as_of/window_end is read time, not beacon completeness.","x-callback-policy":"Resolve explicit proposal destination else workspace default at event creation for every category. No configured destination permits polling. Persist immutable event identity/body; retries/resends retain occurred_at/event_id. Dedupe by event_id. At-least-once attempts may duplicate/reorder; reconcile operation reads. Cancel queued sensitive bodies on deletion; observe deletion completion through operation polling, without retaining a callback destination for a final send. Signing configuration failure prevents delivery, not API work. Public HTTPS only, DNS validation pinned to connection, no redirects. Manual signing-key rotation supports 72h overlap; no scheduled expiry otherwise, emergency invalidation supported.","webhooks":{"proposal.in_review":{"post":{"operationId":"onProposalInReview","summary":"proposal.in_review","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.in_review"},"example":{"type":"proposal.in_review","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":1,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z","revision_kind":"update","pricing_change":{"changed":true,"comparison_version":1,"before":{"current_price_pepm":20,"discount_note":"Supplied display note"},"after":{"current_price_pepm":21,"discount_note":"Supplied display note"}}}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.round_failed":{"post":{"operationId":"onProposalRoundFailed","summary":"proposal.round_failed","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.round_failed"},"example":{"type":"proposal.round_failed","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":1,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z"}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.failed":{"post":{"operationId":"onProposalFailed","summary":"proposal.failed","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.failed"},"example":{"type":"proposal.failed","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"failed","version":null,"live_version":null,"revisions":0,"url":null,"review_url":null,"pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z"}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.promoted":{"post":{"operationId":"onProposalPromoted","summary":"proposal.promoted","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.promoted"},"example":{"type":"proposal.promoted","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":1,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z"}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.withdrawn":{"post":{"operationId":"onProposalWithdrawn","summary":"proposal.withdrawn","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.withdrawn"},"example":{"type":"proposal.withdrawn","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"withdrawn","version":2,"live_version":1,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z"}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.viewed":{"post":{"operationId":"onProposalViewed","summary":"proposal.viewed","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.viewed"},"example":{"type":"proposal.viewed","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":1,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z","viewer_email":null,"email_verified":false,"cta":null}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.cta_clicked":{"post":{"operationId":"onProposalCtaClicked","summary":"proposal.cta_clicked","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.cta_clicked"},"example":{"type":"proposal.cta_clicked","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":1,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z","viewer_email":null,"email_verified":false,"cta":"book_meeting"}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.viewer_added":{"post":{"operationId":"onProposalViewerAdded","summary":"proposal.viewer_added","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.viewer_added"},"example":{"type":"proposal.viewer_added","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":1,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z","viewer_email":"viewer@example.com","added_by":null,"via":null,"access_request_id":null,"decision":null,"expires_at":null,"by":null}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.access_requested":{"post":{"operationId":"onProposalAccessRequested","summary":"proposal.access_requested","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.access_requested"},"example":{"type":"proposal.access_requested","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":1,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z","viewer_email":"viewer@example.com","added_by":null,"via":null,"access_request_id":null,"decision":null,"expires_at":null,"by":null}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.access_decided":{"post":{"operationId":"onProposalAccessDecided","summary":"proposal.access_decided","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.access_decided"},"example":{"type":"proposal.access_decided","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":1,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z","viewer_email":"viewer@example.com","added_by":null,"via":null,"access_request_id":null,"decision":null,"expires_at":null,"by":null}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.viewer_removed":{"post":{"operationId":"onProposalViewerRemoved","summary":"proposal.viewer_removed","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.viewer_removed"},"example":{"type":"proposal.viewer_removed","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":1,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z","viewer_email":"viewer@example.com","added_by":null,"via":null,"access_request_id":null,"decision":null,"expires_at":null,"by":null}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.sent_for_signature":{"post":{"operationId":"onProposalSentForSignature","summary":"proposal.sent_for_signature","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.sent_for_signature"},"example":{"type":"proposal.sent_for_signature","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":2,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z","agreement_id":"6d1c2f0e-0000-4000-8000-000000000001","signed_version":2,"signer_role":null,"signer_email":null,"signed_count":0,"signer_count":2,"signed_pdf_url":null}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.signed":{"post":{"operationId":"onProposalSigned","summary":"proposal.signed","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.signed"},"example":{"type":"proposal.signed","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":2,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z","agreement_id":"6d1c2f0e-0000-4000-8000-000000000001","signed_version":2,"signer_role":"customer","signer_email":"cfo@acmelogistics.com","signed_count":1,"signer_count":2,"signed_pdf_url":null}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.signature_completed":{"post":{"operationId":"onProposalSignatureCompleted","summary":"proposal.signature_completed","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.signature_completed"},"example":{"type":"proposal.signature_completed","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":2,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z","agreement_id":"6d1c2f0e-0000-4000-8000-000000000001","signed_version":2,"signer_role":null,"signer_email":null,"signed_count":2,"signer_count":2,"signed_pdf_url":"https://pitchunfairly.com/acme/acme-logistics-1a2b3c/signed.pdf"}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.signature_declined":{"post":{"operationId":"onProposalSignatureDeclined","summary":"proposal.signature_declined","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.signature_declined"},"example":{"type":"proposal.signature_declined","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":2,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z","agreement_id":"6d1c2f0e-0000-4000-8000-000000000001","signed_version":2,"signer_role":"customer","signer_email":"cfo@acmelogistics.com","signed_count":1,"signer_count":2,"signed_pdf_url":null}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.signature_expired":{"post":{"operationId":"onProposalSignatureExpired","summary":"proposal.signature_expired","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.signature_expired"},"example":{"type":"proposal.signature_expired","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status":"in_review","version":2,"live_version":2,"revisions":1,"url":"https://proposals.example.com/acme","review_url":"https://review.pitchunfairly.com/acme","pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z","agreement_id":"6d1c2f0e-0000-4000-8000-000000000001","signed_version":2,"signer_role":null,"signer_email":null,"signed_count":1,"signer_count":2,"signed_pdf_url":null}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.ping":{"post":{"operationId":"onProposalPing","summary":"proposal.ping","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.ping"},"example":{"type":"proposal.ping","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":null,"operation_status":null,"job_id":null,"request_id":null,"status":null,"version":null,"live_version":null,"revisions":0,"url":null,"review_url":null,"pdf_url":null,"review_pdf_url":null,"occurred_at":"2026-10-19T14:00:00Z"}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}},"proposal.operation_completed":{"post":{"operationId":"onProposalOperationCompleted","summary":"proposal.operation_completed","security":[],"description":"Verify signature and durably record receipt before answering 2xx within 10 seconds. Network/timeout/408/429/5xx retry with backoff; respect valid Retry-After within the 72-hour retry horizon. That horizon is an operational target, not a deployed guarantee. Other responses stop delivery. No delivery-order guarantee. event_id is stable across retries; operation linkage is null for events without an API action.","parameters":[{"name":"Unfairly-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"Equals signed raw body event_id. Stable across automatic retries and manual resends; deduplicate on this identity."},{"name":"Unfairly-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,sha256=<lowercase hex>. HMAC-SHA256 over <t>.<raw body>, independent secret, constant-time comparison, ±300s freshness. During rotation duplicate sha256 entries sign the same body/time under old/new secrets. No v1/v2 fallback."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/proposal.operation_completed"},"example":{"type":"proposal.operation_completed","event_id":"7f3e9c2a-0000-4000-8000-000000000002","operation_id":"7f3e9c2a-0000-4000-8000-000000000001","operation_status":"succeeded","job_id":"4db5a295-7c1e-4f8a-9d2b-3e6f0a1b2c3d","request_id":"portal:deal-123:proposal","status_url":"https://app.unfairly.ai/api/decks/proposals/operations/7f3e9c2a-0000-4000-8000-000000000001","occurred_at":"2026-10-19T14:00:00Z"}}}},"responses":{"200":{"description":"Any 2xx acknowledges; process durably after authentication."}}}}},"components":{"securitySchemes":{"intakeKey":{"type":"http","scheme":"bearer","description":"Workspace server-to-server key; never expose to browser viewers. Manually initiated rotation with 72h overlap; emergency revocation supported."}},"schemas":{"ContractIdentity":{"type":"object","required":["api_version","kit","execution_context"],"properties":{"api_version":{"type":"string"},"kit":{"type":"object","required":["repository","ref","commit"],"properties":{"repository":{"type":"string"},"ref":{"type":"string"},"commit":{"type":"string","pattern":"^[a-f0-9]{40}$"}}},"execution_context":{"type":"object","required":["id","customer","environment","mode"],"properties":{"id":{"type":"string","format":"uuid"},"customer":{"type":"string"},"environment":{"type":"string","enum":["dev","staging","production"]},"mode":{"type":"string","enum":["test","live"]}}}}},"ContractManifest":{"allOf":[{"$ref":"#/components/schemas/ContractIdentity"},{"type":"object","required":["contract_id","content_hash","artifacts"],"properties":{"contract_id":{"type":"string","pattern":"^[a-f0-9]{64}$"},"content_hash":{"type":"string","pattern":"^[a-f0-9]{64}$"},"artifacts":{"type":"object","additionalProperties":false,"required":["openapi.json","schema.json","reference.md","examples.json"],"properties":{"openapi.json":{"type":"object","required":["sha256","bytes","content_type","path","url"],"properties":{"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":"integer","minimum":0},"content_type":{"type":"string","enum":["application/json; charset=utf-8","text/markdown; charset=utf-8"]},"path":{"type":"string"},"url":{"type":"string","format":"uri"}}},"schema.json":{"type":"object","required":["sha256","bytes","content_type","path","url"],"properties":{"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":"integer","minimum":0},"content_type":{"type":"string","enum":["application/json; charset=utf-8","text/markdown; charset=utf-8"]},"path":{"type":"string"},"url":{"type":"string","format":"uri"}}},"reference.md":{"type":"object","required":["sha256","bytes","content_type","path","url"],"properties":{"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":"integer","minimum":0},"content_type":{"type":"string","enum":["application/json; charset=utf-8","text/markdown; charset=utf-8"]},"path":{"type":"string"},"url":{"type":"string","format":"uri"}}},"examples.json":{"type":"object","required":["sha256","bytes","content_type","path","url"],"properties":{"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":"integer","minimum":0},"content_type":{"type":"string","enum":["application/json; charset=utf-8","text/markdown; charset=utf-8"]},"path":{"type":"string"},"url":{"type":"string","format":"uri"}}}}}}}]},"ProposalRequest":{"type":"object","properties":{"request_id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your id for this proposal. Within the workspace it identifies one job; use Idempotency-Key to retry an action."},"source":{"type":"string","enum":["crm","portal","inbox","chat","api"],"description":"Where the request came from: crm, portal, inbox, chat, api."},"recipient":{"description":"Optional { name }: who the proposal is for. Omit when the employer is unknown.","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"Who the proposal is for, as it should read on the page."}},"required":["name"],"additionalProperties":false},"owner":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120,"description":"Your person on the deal."},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Your person's email. Does not assign an Editor or Commenter role."},"booking_url":{"description":"Fills the book_meeting button when ctas doesn't set one and this is a valid HTTPS link.","type":"string","format":"uri"}},"required":["name","email"],"additionalProperties":false,"description":"{ name, email, booking_url? }: your person on the deal. Role assignments are separate."},"viewers":{"description":"Omit or send []. Initial Sharer/Viewer grants are not accepted.","maxItems":0,"type":"array","items":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"allowed_viewers":{"description":"Verified viewers of the approved proposal. API updates add emails and exact domains; omitted entries and empty arrays never remove access. Manage explicit removals in Share. No invitations or staff roles are granted.","type":"object","properties":{"emails":{"default":[],"maxItems":1000,"type":"array","items":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"domains":{"default":[],"maxItems":1000,"type":"array","items":{"type":"string","maxLength":253,"pattern":"^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z](?:[a-z0-9-]{0,61}[a-z0-9])?$"}}},"additionalProperties":false},"ctas":{"description":"{ book_meeting?, accept? }, each { url, label? }, https only. Shown as buttons; clicks come back as proposal.cta_clicked.","type":"object","properties":{"book_meeting":{"description":"A button that books a meeting: { url, label? }, https only.","type":"object","properties":{"url":{"type":"string","maxLength":2000,"pattern":"^https:\\/\\/","format":"uri"},"label":{"type":"string","minLength":1,"maxLength":60}},"required":["url"],"additionalProperties":false},"accept":{"description":"A button that accepts the proposal: { url, label? }, https only.","type":"object","properties":{"url":{"type":"string","maxLength":2000,"pattern":"^https:\\/\\/","format":"uri"},"label":{"type":"string","minLength":1,"maxLength":60}},"required":["url"],"additionalProperties":false}},"additionalProperties":false},"notes":{"description":"Optional staff-written context or instructions, up to 8,000 characters. Notes are not content-screened; the sender controls what is included.","type":"string","maxLength":8000},"signers":{"description":"Up to 10 { role, name, email, title?, order? }. When a version is promoted it goes out for signature: each signer confirms their email with a code, fills their fields (the kit's \"x-signer\" fields for their role) and signs on the page.","maxItems":10,"type":"array","items":{"type":"object","properties":{"role":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,59}$"},"name":{"type":"string","minLength":1,"maxLength":200},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"title":{"type":"string","maxLength":200},"order":{"type":"integer","minimum":0,"maximum":100}},"required":["role","name","email"],"additionalProperties":false}},"signature":{"description":"{ expires_in_days?, cc? }: days until the signature request expires (30 by default), and up to 10 emails that get the signed copy and nothing else.","type":"object","properties":{"expires_in_days":{"type":"integer","minimum":1,"maximum":365},"cc":{"maxItems":10,"type":"array","items":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}}},"additionalProperties":false},"callback_url":{"type":"string","pattern":"^https:\\/\\/","format":"uri","description":"Required HTTPS event endpoint for this proposal. Stored at creation and reused for later events; no workspace default is needed."},"proposal":{"type":"object","properties":{"template":{"description":"One of the kit’s template ids, or null to let the kit choose.","anyOf":[{"type":"string","minLength":1,"maxLength":80},{"type":"null"}]},"inputs":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Customer-specific facts validated by the workspace kit. No employee records or identifying health data."}},"required":["inputs"],"additionalProperties":false},"initial_roles":{"description":"Workspace-wide add/upgrade assignments. Omission never revokes access. Normalize email; conflicting roles for one email are invalid. Require an inherited or assigned Editor. Invitations are sent for new/upgraded access.","maxItems":50,"type":"array","items":{"type":"object","properties":{"email":{"description":"Trim and lowercase before validation; maximum 254 characters after trimming.","type":"string","pattern":"^\\s*(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}\\s*$"},"role":{"type":"string","enum":["editor","commenter"]}},"required":["email","role"],"additionalProperties":false}}},"required":["request_id","source","owner","callback_url","proposal"],"additionalProperties":false,"description":"One JSON object per proposal. Unknown keys are refused. Validate all assignments before any side effects. Employer-specific inputs follow GET /schema. No raw employee, census, claims or PHI records.","title":"Proposal request"},"Job":{"type":"object","properties":{"environment":{"description":"The operator-bound customer execution environment. Absent for legacy workspaces without a context.","type":"string","enum":["dev","staging","production"]},"test":{"description":"True for dev and staging private test proposals; false for production.","type":"boolean"},"private_test_url":{"description":"Authenticated private test link pinned to the approved live_version. Null before approval and in production; public URLs remain null in test mode.","anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job."},"request_id":{"type":"string","description":"Your id for the proposal, from the request."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"queued, building, in_review (a successful draft is available), failed (the first build failed), or withdrawn."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link: what the customer opens. It shows live_version once one is promoted."},"live_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The same value as url."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link: always the newest successful version, for your team."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The newest version built."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link, or null before the first promote."},"promoted_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}],"description":"When a version was last promoted."},"approved_pdf":{"description":"Authenticated version-bound current approved PDF, with no credential in its URL. Withdrawal retains it until replacement or deletion.","anyOf":[{"type":"object","properties":{"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"url":{"type":"string","pattern":"^https:\\/\\/","format":"uri"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["version","url","sha256","bytes"]},{"type":"null"}]},"approved_inputs":{"description":"Immutable effective inputs of live_version; null before approval. A newer draft never changes this snapshot.","anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"approved_contract":{"anyOf":[{"type":"object","properties":{"api_version":{"type":"string"},"kit_repo":{"type":"string"},"kit_ref":{"type":"string"},"kit_commit":{"type":"string"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["api_version","kit_repo","kit_ref","kit_commit","version"]},{"type":"null"}]},"approved_pricing_authorization":{"description":"Historical pricing authorization, if recorded before the separate authorization step was retired. New approvals use the existing Editor publication flow.","anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"job_id":{"type":"string","format":"uuid"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"working_revision":{"type":"integer","minimum":0,"maximum":9007199254740991},"actor_user_id":{"type":"string","format":"uuid"},"actor_email":{"type":"string"},"actor_role":{"type":"string","enum":["editor","commenter"]},"authorized_at":{"type":"string","format":"date-time","pattern":"Z$"},"prior_pricing":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"submitted_pricing":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"authorized_pricing":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["id","job_id","version","working_revision","actor_user_id","actor_email","actor_role","authorized_at","prior_pricing","submitted_pricing","authorized_pricing"]},{"type":"null"}]},"shape":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The proposal's shape, as the kit's build chose it."},"open_items":{"type":"array","items":{"type":"string"},"description":"What your team should confirm before it goes live: a section dropped for missing data, a term assumed. Advisory; does not block publication."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run since the first build."},"requested_by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The member who asked for it, or null when your systems did."},"promoted_by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The member who last promoted it, or null when your systems did."},"publishes":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Publication"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"],"description":"Publication history, oldest first, returned as a page."},"withdrawn_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}],"description":"When it was withdrawn."},"withdrawn_by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The member who withdrew it, or null when your systems did."},"rounds":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Round"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"],"description":"Revision rounds, oldest first, returned as a page."},"brief":{"anyOf":[{"type":"object","properties":{"document_id":{"type":"string","format":"uuid"},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["document_id","url"]},{"type":"null"}],"description":"The deal brief your team reads and edits, once the first build writes it."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why the last build or round failed."},"updated_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the job last changed."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF, behind the live link's own gate."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"engagement":{"anyOf":[{"$ref":"#/components/schemas/Engagement"},{"type":"null"}],"description":"Null before measurable history exists or when analytics are temporarily unavailable; see analytics_status."},"needs_attention":{"anyOf":[{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},{"type":"null"}]},"analytics_status":{"type":"string","enum":["available","not_available","temporarily_unavailable"]},"versions":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AvailableVersion"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"deletion":{"anyOf":[{"type":"object","properties":{"operation_id":{"type":"string","format":"uuid"},"requested_at":{"type":"string","format":"date-time","pattern":"Z$"},"status":{"type":"string","enum":["running","failed"]}},"required":["operation_id","requested_at","status"]},{"type":"null"}]}},"required":["job_id","request_id","status","url","live_url","review_url","version","live_version","promoted_at","shape","open_items","revisions","requested_by","promoted_by","publishes","withdrawn_at","withdrawn_by","rounds","brief","error","updated_at","pdf_url","review_pdf_url","engagement","needs_attention","analytics_status","versions","deletion"]},"Error":{"type":"object","properties":{"error_code":{"type":"string"},"error":{"type":"string","description":"What went wrong, in a sentence."},"details":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","description":"JSON Pointer"},"code":{"type":"string"},"message":{"type":"string"}},"required":["path","code","message"]}},"diagnostic_id":{"type":"string"}},"required":["error_code","error"]},"Event":{"oneOf":[{"$ref":"#/components/schemas/proposal.in_review"},{"$ref":"#/components/schemas/proposal.round_failed"},{"$ref":"#/components/schemas/proposal.failed"},{"$ref":"#/components/schemas/proposal.promoted"},{"$ref":"#/components/schemas/proposal.withdrawn"},{"$ref":"#/components/schemas/proposal.viewed"},{"$ref":"#/components/schemas/proposal.cta_clicked"},{"$ref":"#/components/schemas/proposal.viewer_added"},{"$ref":"#/components/schemas/proposal.access_requested"},{"$ref":"#/components/schemas/proposal.access_decided"},{"$ref":"#/components/schemas/proposal.viewer_removed"},{"$ref":"#/components/schemas/proposal.sent_for_signature"},{"$ref":"#/components/schemas/proposal.signed"},{"$ref":"#/components/schemas/proposal.signature_completed"},{"$ref":"#/components/schemas/proposal.signature_declined"},{"$ref":"#/components/schemas/proposal.signature_expired"},{"$ref":"#/components/schemas/proposal.ping"},{"$ref":"#/components/schemas/proposal.operation_completed"}]},"NormalizedCreationRequest":{"type":"object","properties":{"request_id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your id for this proposal. Within the workspace it identifies one job; use Idempotency-Key to retry an action."},"source":{"type":"string","enum":["crm","portal","inbox","chat","api"],"description":"Where the request came from: crm, portal, inbox, chat, api."},"recipient":{"description":"Optional { name }: who the proposal is for. Omit when the employer is unknown.","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"Who the proposal is for, as it should read on the page."}},"required":["name"],"additionalProperties":false},"owner":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120,"description":"Your person on the deal."},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Your person's email. Does not assign an Editor or Commenter role."},"booking_url":{"description":"Fills the book_meeting button when ctas doesn't set one and this is a valid HTTPS link.","type":"string","format":"uri"}},"required":["name","email"],"additionalProperties":false,"description":"{ name, email, booking_url? }: your person on the deal. Role assignments are separate."},"viewers":{"maxItems":0,"type":"array","items":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"allowed_viewers":{"description":"Verified viewers of the approved proposal. API updates add emails and exact domains; omitted entries and empty arrays never remove access. Manage explicit removals in Share. No invitations or staff roles are granted.","type":"object","properties":{"emails":{"default":[],"maxItems":1000,"type":"array","items":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"domains":{"default":[],"maxItems":1000,"type":"array","items":{"type":"string","maxLength":253,"pattern":"^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z](?:[a-z0-9-]{0,61}[a-z0-9])?$"}}},"additionalProperties":false},"ctas":{"description":"{ book_meeting?, accept? }, each { url, label? }, https only. Shown as buttons; clicks come back as proposal.cta_clicked.","type":"object","properties":{"book_meeting":{"description":"A button that books a meeting: { url, label? }, https only.","type":"object","properties":{"url":{"type":"string","maxLength":2000,"pattern":"^https:\\/\\/","format":"uri"},"label":{"type":"string","minLength":1,"maxLength":60}},"required":["url"],"additionalProperties":false},"accept":{"description":"A button that accepts the proposal: { url, label? }, https only.","type":"object","properties":{"url":{"type":"string","maxLength":2000,"pattern":"^https:\\/\\/","format":"uri"},"label":{"type":"string","minLength":1,"maxLength":60}},"required":["url"],"additionalProperties":false}},"additionalProperties":false},"notes":{"description":"Optional staff-written context or instructions, up to 8,000 characters. Notes are not content-screened; the sender controls what is included.","type":"string","maxLength":8000},"signers":{"description":"Up to 10 { role, name, email, title?, order? }. When a version is promoted it goes out for signature: each signer confirms their email with a code, fills their fields (the kit's \"x-signer\" fields for their role) and signs on the page.","maxItems":10,"type":"array","items":{"type":"object","properties":{"role":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,59}$"},"name":{"type":"string","minLength":1,"maxLength":200},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"title":{"type":"string","maxLength":200},"order":{"type":"integer","minimum":0,"maximum":100}},"required":["role","name","email"],"additionalProperties":false}},"signature":{"description":"{ expires_in_days?, cc? }: days until the signature request expires (30 by default), and up to 10 emails that get the signed copy and nothing else.","type":"object","properties":{"expires_in_days":{"type":"integer","minimum":1,"maximum":365},"cc":{"maxItems":10,"type":"array","items":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}}},"additionalProperties":false},"callback_url":{"type":"string","pattern":"^https:\\/\\/","format":"uri","description":"Required HTTPS event endpoint for this proposal. Stored at creation and reused for later events; no workspace default is needed."},"proposal":{"type":"object","properties":{"template":{"description":"One of the kit’s template ids, or null to let the kit choose.","anyOf":[{"type":"string","minLength":1,"maxLength":80},{"type":"null"}]},"inputs":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Customer-specific facts validated by the workspace kit. No employee records or identifying health data."}},"required":["inputs"],"additionalProperties":false},"initial_roles":{"maxItems":50,"type":"array","items":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["editor","commenter"]}},"required":["email","role"],"additionalProperties":false}}},"required":["request_id","source","owner","viewers","callback_url","proposal"],"additionalProperties":false},"UpdateRequest":{"type":"object","properties":{"allowed_viewers":{"description":"Verified viewers of the approved proposal. API updates add emails and exact domains; omitted entries and empty arrays never remove access. Manage explicit removals in Share. No invitations or staff roles are granted.","type":"object","properties":{"emails":{"default":[],"maxItems":1000,"type":"array","items":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"domains":{"default":[],"maxItems":1000,"type":"array","items":{"type":"string","maxLength":253,"pattern":"^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z](?:[a-z0-9-]{0,61}[a-z0-9])?$"}}},"additionalProperties":false},"source":{"type":"string","enum":["crm","portal","inbox","chat","api"],"description":"Where the request came from: crm, portal, inbox, chat, api."},"recipient":{"description":"Optional { name }: who the proposal is for. Omit when the employer is unknown.","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"Who the proposal is for, as it should read on the page."}},"required":["name"],"additionalProperties":false},"owner":{"description":"Send only the owner fields that changed. Omitted fields remain unchanged.","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120,"description":"Your person on the deal."},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Your person's email. Does not assign an Editor or Commenter role."},"booking_url":{"description":"Fills the book_meeting button when ctas doesn't set one and this is a valid HTTPS link.","type":"string","format":"uri"}},"additionalProperties":false},"ctas":{"description":"{ book_meeting?, accept? }, each { url, label? }, https only. Shown as buttons; clicks come back as proposal.cta_clicked.","type":"object","properties":{"book_meeting":{"description":"A button that books a meeting: { url, label? }, https only.","type":"object","properties":{"url":{"type":"string","maxLength":2000,"pattern":"^https:\\/\\/","format":"uri"},"label":{"type":"string","minLength":1,"maxLength":60}},"required":["url"],"additionalProperties":false},"accept":{"description":"A button that accepts the proposal: { url, label? }, https only.","type":"object","properties":{"url":{"type":"string","maxLength":2000,"pattern":"^https:\\/\\/","format":"uri"},"label":{"type":"string","minLength":1,"maxLength":60}},"required":["url"],"additionalProperties":false}},"additionalProperties":false},"notes":{"description":"Append call notes, up to 8,000 characters. Omission keeps existing notes; this does not replace them.","type":"string","maxLength":8000},"remove":{"description":"Inputs to take out, by path in the kit's shape (\"dates.confirm_by\"), when a fact no longer applies. The kit must allow the field to be left out; a path the proposal doesn't have is ignored.","maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":200}},"comment":{"description":"Why the update was sent, in plain words. Logged with it and given to the round that rebuilds.","type":"string","minLength":1,"maxLength":2000},"proposal":{"description":"Omitted fields remain unchanged. Inputs merge recursively; arrays replace, null remains a value. A null template delegates selection to the kit.","type":"object","properties":{"template":{"description":"One of the kit’s template ids, or null to let the kit choose.","anyOf":[{"type":"string","minLength":1,"maxLength":80},{"type":"null"}]},"inputs":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Customer-specific facts validated by the workspace kit. No employee records or identifying health data."}},"additionalProperties":false}},"additionalProperties":false},"ReviseRequest":{"anyOf":[{"type":"object","properties":{"comments":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":2000},"description":"One to twenty comments, each up to 2,000 characters."}},"required":["comments"],"additionalProperties":false},{"type":"object","properties":{"from_review":{"type":"boolean","const":true,"description":"Apply eligible, unapplied review comments selected when this request is accepted."}},"required":["from_review"],"additionalProperties":false}]},"PromoteRequest":{"type":"object","properties":{"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The exact available version to publish, including an older version. No implicit newest-version selection."}},"required":["version"],"additionalProperties":false},"WithdrawRequest":{"type":"object","properties":{"reason":{"description":"Why the proposal is being withdrawn.","type":"string","minLength":1,"maxLength":500}},"additionalProperties":false},"ViewersRequest":{"type":"object","properties":{"add":{"description":"Emails to grant Viewer access to the live link; no invitation email.","maxItems":50,"type":"array","items":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"revoke":{"description":"Emails who may no longer open the live link.","maxItems":50,"type":"array","items":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"revoke_added":{"description":"With revoke: also remove everyone the revoked people added.","type":"boolean"},"decide":{"description":"Approve or decline requests for Viewer access; approve_domain also updates the domain policy.","maxItems":50,"type":"array","items":{"type":"object","properties":{"request_id":{"type":"string","format":"uuid"},"decision":{"type":"string","enum":["approve","approve_domain","decline"]}},"required":["request_id","decision"],"additionalProperties":false}},"audience_domains":{"description":"Company domains used by the sharing policy. Domains do not grant roles.","maxItems":20,"type":"array","items":{"type":"string","maxLength":253}},"invite_policy":{"description":"colleagues: authorized sharers can invite within audience domains. approval: additions require approval. off: sharing invitations are disabled. Viewers cannot invite.","type":"string","enum":["colleagues","approval","off"]}},"additionalProperties":false,"description":"Validate the whole batch before changes. Conflicting add/revoke is invalid. Direct add grants Viewer without sending email. Role grants do not follow from domains. Runtime partial failures report every item."},"IntakeDiagnostic":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time","pattern":"Z$"},"outcome":{"type":"string","enum":["accepted","duplicate","dry_run","refused"]},"status_code":{"type":"integer","minimum":100,"maximum":599},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}]},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"job_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"details":{"default":[],"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"code":{"type":"string"}},"required":["path","code"]}}},"required":["id","created_at","outcome","status_code","error_code","operation_id","job_id"]},"IntakeDiagnosticPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/IntakeDiagnostic"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]},"environment":{"anyOf":[{"type":"string","enum":["dev","staging","production"]},{"type":"null"}]},"test_mode":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["items","next_url","environment","test_mode"]},"Ack":{"type":"object","properties":{"diagnostic_id":{"description":"Durable context-bound admission diagnostic; also returned as Proposal-Diagnostic-Id.","type":"string","format":"uuid"},"access":{"description":"Committed audience outcome, independent of content build status. Only supplied audience updates include this receipt.","type":"object","properties":{"status":{"type":"string","enum":["applied","unchanged"]},"audience_revision":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["status","audience_revision"]},"operation_id":{"type":"string","format":"uuid"},"job_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"The job. Null for workspace invitation resend."},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Your id for the proposal, from the request. Null for workspace invitation resend."},"status":{"type":"string","enum":["queued","running","succeeded","failed","cancelled"],"description":"The operation status when this acknowledgment was issued. Read status_url for the current outcome."},"status_url":{"type":"string","pattern":"^https:\\/\\/","format":"uri"}},"required":["operation_id","job_id","request_id","status","status_url"]},"Operation":{"type":"object","properties":{"diagnostic_id":{"description":"Durable context-bound admission diagnostic; also returned as Proposal-Diagnostic-Id.","type":"string","format":"uuid"},"access":{"description":"Committed audience outcome, independent of content build status. Only supplied audience updates include this receipt.","type":"object","properties":{"status":{"type":"string","enum":["applied","unchanged"]},"audience_revision":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["status","audience_revision"]},"operation_id":{"type":"string","format":"uuid"},"job_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"The job. Null for workspace invitation resend."},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Your id for the proposal, from the request. Null for workspace invitation resend."},"status":{"type":"string","enum":["queued","running","succeeded","failed","cancelled"],"description":"The current operation status at the time of this read."},"status_url":{"type":"string","pattern":"^https:\\/\\/","format":"uri"},"action":{"type":"string","enum":["create","update","revise","promote","withdraw","delete","viewers","resend_invitation"]},"accepted_at":{"type":"string","format":"date-time","pattern":"Z$"},"started_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]},"completed_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]},"result_redacted":{"type":"boolean"},"result":{"anyOf":[{"$ref":"#/components/schemas/OperationResult"},{"type":"null"}]}},"required":["operation_id","job_id","request_id","status","status_url","action","accepted_at","started_at","completed_at","result_redacted","result"]},"DeletionReceipt":{"type":"object","properties":{"status":{"type":"string","enum":["running","failed","completed"]},"requested_at":{"type":"string","format":"date-time","pattern":"Z$"},"completed_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]},"receipt_expires_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]},"categories":{"type":"object","properties":{"sandboxes":{"type":"object","properties":{"status":{"type":"string","enum":["pending","verified","failed"]},"verified_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]}},"required":["status","verified_at"]},"brief":{"type":"object","properties":{"status":{"type":"string","enum":["pending","verified","failed"]},"verified_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]}},"required":["status","verified_at"]},"versions":{"type":"object","properties":{"status":{"type":"string","enum":["pending","verified","failed"]},"verified_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]}},"required":["status","verified_at"]},"pages":{"type":"object","properties":{"status":{"type":"string","enum":["pending","verified","failed"]},"verified_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]}},"required":["status","verified_at"]},"pdfs":{"type":"object","properties":{"status":{"type":"string","enum":["pending","verified","failed"]},"verified_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]}},"required":["status","verified_at"]},"stored_inputs":{"type":"object","properties":{"status":{"type":"string","enum":["pending","verified","failed"]},"verified_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]}},"required":["status","verified_at"]},"associated_records":{"type":"object","properties":{"status":{"type":"string","enum":["pending","verified","failed"]},"verified_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]}},"required":["status","verified_at"]}},"required":["sandboxes","brief","versions","pages","pdfs","stored_inputs","associated_records"]}},"required":["status","requested_at","completed_at","receipt_expires_at","categories"]},"OperationResult":{"type":"object","properties":{"deletion":{"$ref":"#/components/schemas/DeletionReceipt"},"access":{"type":"object","properties":{"status":{"type":"string","enum":["applied","unchanged"]},"audience_revision":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["status","audience_revision"]},"changed":{"type":"boolean"},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/Error"},{"type":"null"}]},"superseded_by":{"type":"array","items":{"type":"string","format":"uuid"}},"superseded_fields":{"type":"array","items":{"type":"string"}},"instructions_superseded":{"type":"boolean"},"assignments":{"type":"array","items":{"$ref":"#/components/schemas/AssignmentResult"}},"access_results":{"type":"array","items":{"$ref":"#/components/schemas/AccessResult"}},"invitation":{"anyOf":[{"$ref":"#/components/schemas/InvitationResult"},{"type":"null"}]}},"required":["changed","version","live_version","error","superseded_by","superseded_fields","instructions_superseded","assignments","access_results","invitation"]},"InvitationResult":{"type":"object","properties":{"invitation_id":{"type":"string","format":"uuid"},"email_status":{"type":"string","enum":["sent","failed","not_required"]},"error":{"anyOf":[{"$ref":"#/components/schemas/Error"},{"type":"null"}]}},"required":["invitation_id","email_status","error"]},"AssignmentResult":{"oneOf":[{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["editor","commenter"]},"status":{"type":"string","const":"granted"},"invitation":{"anyOf":[{"$ref":"#/components/schemas/InvitationResult"},{"type":"null"}]},"error":{"type":"null"}},"required":["email","role","status","invitation","error"]},{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["editor","commenter"]},"status":{"type":"string","const":"unchanged"},"invitation":{"anyOf":[{"$ref":"#/components/schemas/InvitationResult"},{"type":"null"}]},"error":{"type":"null"}},"required":["email","role","status","invitation","error"]},{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"anyOf":[{"type":"string","enum":["editor","commenter"]},{"type":"null"}]},"status":{"type":"string","const":"failed"},"invitation":{"anyOf":[{"$ref":"#/components/schemas/InvitationResult"},{"type":"null"}]},"error":{"$ref":"#/components/schemas/Error"}},"required":["email","role","status","invitation","error"]}],"description":"role is confirmed effective access. Failed assignments preserve known prior access, otherwise null; never report an unconfirmed requested role."},"AccessResult":{"type":"object","properties":{"action":{"type":"string","enum":["add","revoke","decide","revoke_added","audience_domains","invite_policy"]},"email":{"anyOf":[{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"access_request_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"status":{"type":"string","enum":["succeeded","unchanged","failed"]},"invitation":{"anyOf":[{"$ref":"#/components/schemas/InvitationResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/Error"},{"type":"null"}]}},"required":["action","email","access_request_id","status","invitation","error"]},"VersionInputs":{"type":"object","properties":{"job_id":{"type":"string","format":"uuid"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"working_revision":{"type":"integer","minimum":0,"maximum":9007199254740991},"effective_inputs":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Immutable structured inputs of exactly this successful version, including unapproved drafts. Never latest working or approved inputs."},"contract":{"type":"object","properties":{"api_version":{"type":"string"},"kit_repo":{"type":"string"},"kit_ref":{"type":"string"},"kit_commit":{"type":"string"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["api_version","kit_repo","kit_ref","kit_commit","version"]},"approval":{"type":"object","properties":{"approved":{"type":"boolean"},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]}},"required":["approved","live_version"],"description":"Current approval status at read time; does not modify the immutable inputs."},"pricing":{"anyOf":[{"type":"object","properties":{"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"working_revision":{"type":"integer","minimum":0,"maximum":9007199254740991},"submitted":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"effective":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"authorization":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"job_id":{"type":"string","format":"uuid"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"working_revision":{"type":"integer","minimum":0,"maximum":9007199254740991},"actor_user_id":{"type":"string","format":"uuid"},"actor_email":{"type":"string"},"actor_role":{"type":"string","enum":["editor","commenter"]},"authorized_at":{"type":"string","format":"date-time","pattern":"Z$"},"prior_pricing":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"submitted_pricing":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"authorized_pricing":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["id","job_id","version","working_revision","actor_user_id","actor_email","actor_role","authorized_at","prior_pricing","submitted_pricing","authorized_pricing"]},{"type":"null"}]},"requires_authorization":{"type":"boolean"}},"required":["version","working_revision","submitted","effective","authorization","requires_authorization"]},{"type":"null"}],"description":"Submitted and effective pricing for this version; null when unavailable for this kit. requires_authorization is always false. authorization retains historical records only; ordinary reviewer comments and Editor publication approval are the current flow."}},"required":["job_id","version","working_revision","effective_inputs","contract","approval","pricing"]},"AccessView":{"type":"object","properties":{"job_id":{"type":"string","format":"uuid"},"verify_email":{"type":"boolean"},"audience_domains":{"type":"array","items":{"type":"string"}},"invite_policy":{"type":"string","enum":["colleagues","approval","off"]},"viewers":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ViewerAccess"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"requests":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AccessRequest"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]}},"required":["job_id","verify_email","audience_domains","invite_policy","viewers","requests"]},"Engagement":{"type":"object","properties":{"live_viewers":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/LiveViewer"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"anonymous_live":{"$ref":"#/components/schemas/AnonymousLive"},"reviewers":{"$ref":"#/components/schemas/ReviewActivity"},"cta_totals":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","minimum":0,"maximum":9007199254740991},"description":"Live clicks per call to action, every viewer together."},"visible_ms":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"focused_ms":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"coverage":{"$ref":"#/components/schemas/Coverage"},"versions":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/VersionEngagement"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]}},"required":["live_viewers","anonymous_live","reviewers","cta_totals","visible_ms","focused_ms","coverage","versions"],"description":"Who read the live link and clicked its calls to action; reviewers counted apart."},"Coverage":{"type":"object","properties":{"visits":{"$ref":"#/components/schemas/MetricCoverage"},"visible_time":{"$ref":"#/components/schemas/MetricCoverage"},"focused_time":{"$ref":"#/components/schemas/MetricCoverage"},"section_reach":{"$ref":"#/components/schemas/MetricCoverage"},"cta_clicks":{"$ref":"#/components/schemas/MetricCoverage"}},"required":["visits","visible_time","focused_time","section_reach","cta_clicks"]},"DryRun":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"dry_run":{"type":"boolean","const":true},"request":{"$ref":"#/components/schemas/NormalizedCreationRequest"}},"required":["ok","dry_run","request"]},"RoundPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Round"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"PublicationPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Publication"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"VersionPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AvailableVersion"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"LiveViewerPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/LiveViewer"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"CtaClickPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CtaClick"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"VersionEngagementPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/VersionEngagement"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"SectionPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SectionEngagement"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"ViewerAccessPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ViewerAccess"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"AccessRequestPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AccessRequest"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"proposal.in_review":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}],"description":"What started the round that just built; null for the initial build."},"type":{"type":"string","const":"proposal.in_review","description":"The event type."},"pricing_change":{"anyOf":[{"type":"object","properties":{"changed":{"type":"boolean"},"comparison_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Preceding successfully built version, independent of approval; null for the initial baseline."},"before":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"after":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["changed","comparison_version","before","after"],"description":"Commercial terms frozen at draft-ready event creation. Initial baseline has changed=false and no prior version/prices. Null means comparison unavailable, never false unchanged. Draft terms remain unpublished until an Editor approves the version. Use the event's job/version to retrieve exact inputs after delayed, duplicated, out-of-order or missed callbacks."},{"type":"null"}]}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","revision_kind","type"],"description":"Fields carried by proposal.in_review. Required fields and nullability are specific to this event."},"proposal.round_failed":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.round_failed","description":"The event type."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type"],"description":"Fields carried by proposal.round_failed. Required fields and nullability are specific to this event."},"proposal.failed":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.failed","description":"The event type."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type"],"description":"Fields carried by proposal.failed. Required fields and nullability are specific to this event."},"proposal.promoted":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.promoted","description":"The event type."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type"],"description":"Fields carried by proposal.promoted. Required fields and nullability are specific to this event."},"proposal.withdrawn":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.withdrawn","description":"The event type."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type"],"description":"Fields carried by proposal.withdrawn. Required fields and nullability are specific to this event."},"proposal.viewed":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.viewed","description":"The event type."},"viewer_email":{"anyOf":[{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}],"description":"The viewer it's about."},"email_verified":{"type":"boolean","description":"The viewer proved their email with a one-time code."},"cta":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Which call to action was clicked: book_meeting or accept."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type","viewer_email","email_verified","cta"],"description":"Fields carried by proposal.viewed. Required fields and nullability are specific to this event."},"proposal.cta_clicked":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.cta_clicked","description":"The event type."},"viewer_email":{"anyOf":[{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}],"description":"The viewer it's about."},"email_verified":{"type":"boolean","description":"The viewer proved their email with a one-time code."},"cta":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Which call to action was clicked: book_meeting or accept."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type","viewer_email","email_verified","cta"],"description":"Fields carried by proposal.cta_clicked. Required fields and nullability are specific to this event."},"proposal.viewer_added":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.viewer_added","description":"The event type."},"viewer_email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"The viewer it's about."},"added_by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who added them, or asked to."},"via":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"How access originated, such as owner, request, invite or approval. Does not grant a role."},"access_request_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"The access-request UUID, not the proposal request_id."},"decision":{"anyOf":[{"type":"string","enum":["approved","declined","expired","cancelled"]},{"type":"null"}],"description":"What became of the access request; null for unrelated access events."},"expires_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}],"description":"When the request lapses if nobody decides."},"by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who decided or removed."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type","viewer_email","added_by","via","access_request_id","decision","expires_at","by"],"description":"Fields carried by proposal.viewer_added. Required fields and nullability are specific to this event."},"proposal.access_requested":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.access_requested","description":"The event type."},"viewer_email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"The viewer it's about."},"added_by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who added them, or asked to."},"via":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"How access originated, such as owner, request, invite or approval. Does not grant a role."},"access_request_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"The access-request UUID, not the proposal request_id."},"decision":{"anyOf":[{"type":"string","enum":["approved","declined","expired","cancelled"]},{"type":"null"}],"description":"What became of the access request; null for unrelated access events."},"expires_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}],"description":"When the request lapses if nobody decides."},"by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who decided or removed."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type","viewer_email","added_by","via","access_request_id","decision","expires_at","by"],"description":"Fields carried by proposal.access_requested. Required fields and nullability are specific to this event."},"proposal.access_decided":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.access_decided","description":"The event type."},"viewer_email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"The viewer it's about."},"added_by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who added them, or asked to."},"via":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"How access originated, such as owner, request, invite or approval. Does not grant a role."},"access_request_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"The access-request UUID, not the proposal request_id."},"decision":{"anyOf":[{"type":"string","enum":["approved","declined","expired","cancelled"]},{"type":"null"}],"description":"What became of the access request; null for unrelated access events."},"expires_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}],"description":"When the request lapses if nobody decides."},"by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who decided or removed."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type","viewer_email","added_by","via","access_request_id","decision","expires_at","by"],"description":"Fields carried by proposal.access_decided. Required fields and nullability are specific to this event."},"proposal.viewer_removed":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.viewer_removed","description":"The event type."},"viewer_email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"The viewer it's about."},"added_by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who added them, or asked to."},"via":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"How access originated, such as owner, request, invite or approval. Does not grant a role."},"access_request_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"The access-request UUID, not the proposal request_id."},"decision":{"anyOf":[{"type":"string","enum":["approved","declined","expired","cancelled"]},{"type":"null"}],"description":"What became of the access request; null for unrelated access events."},"expires_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}],"description":"When the request lapses if nobody decides."},"by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Who decided or removed."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type","viewer_email","added_by","via","access_request_id","decision","expires_at","by"],"description":"Fields carried by proposal.viewer_removed. Required fields and nullability are specific to this event."},"proposal.sent_for_signature":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.sent_for_signature","description":"The event type."},"agreement_id":{"type":"string","format":"uuid","description":"The signature request."},"signed_version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The version being signed."},"signer_role":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The signer's role, as the request named it (proposal.signed and proposal.signature_declined); otherwise null."},"signer_email":{"anyOf":[{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}],"description":"The signer (proposal.signed and proposal.signature_declined); otherwise null."},"signed_count":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many have signed so far."},"signer_count":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many sign in all."},"signed_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The signed PDF with its certificate, behind the live link's gate (proposal.signature_completed); otherwise null."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type","agreement_id","signed_version","signer_role","signer_email","signed_count","signer_count","signed_pdf_url"],"description":"Fields carried by proposal.sent_for_signature. Required fields and nullability are specific to this event."},"proposal.signed":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.signed","description":"The event type."},"agreement_id":{"type":"string","format":"uuid","description":"The signature request."},"signed_version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The version being signed."},"signer_role":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The signer's role, as the request named it (proposal.signed and proposal.signature_declined); otherwise null."},"signer_email":{"anyOf":[{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}],"description":"The signer (proposal.signed and proposal.signature_declined); otherwise null."},"signed_count":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many have signed so far."},"signer_count":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many sign in all."},"signed_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The signed PDF with its certificate, behind the live link's gate (proposal.signature_completed); otherwise null."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type","agreement_id","signed_version","signer_role","signer_email","signed_count","signer_count","signed_pdf_url"],"description":"Fields carried by proposal.signed. Required fields and nullability are specific to this event."},"proposal.signature_completed":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.signature_completed","description":"The event type."},"agreement_id":{"type":"string","format":"uuid","description":"The signature request."},"signed_version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The version being signed."},"signer_role":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The signer's role, as the request named it (proposal.signed and proposal.signature_declined); otherwise null."},"signer_email":{"anyOf":[{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}],"description":"The signer (proposal.signed and proposal.signature_declined); otherwise null."},"signed_count":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many have signed so far."},"signer_count":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many sign in all."},"signed_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The signed PDF with its certificate, behind the live link's gate (proposal.signature_completed); otherwise null."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type","agreement_id","signed_version","signer_role","signer_email","signed_count","signer_count","signed_pdf_url"],"description":"Fields carried by proposal.signature_completed. Required fields and nullability are specific to this event."},"proposal.signature_declined":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.signature_declined","description":"The event type."},"agreement_id":{"type":"string","format":"uuid","description":"The signature request."},"signed_version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The version being signed."},"signer_role":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The signer's role, as the request named it (proposal.signed and proposal.signature_declined); otherwise null."},"signer_email":{"anyOf":[{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}],"description":"The signer (proposal.signed and proposal.signature_declined); otherwise null."},"signed_count":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many have signed so far."},"signer_count":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many sign in all."},"signed_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The signed PDF with its certificate, behind the live link's gate (proposal.signature_completed); otherwise null."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type","agreement_id","signed_version","signer_role","signer_email","signed_count","signer_count","signed_pdf_url"],"description":"Fields carried by proposal.signature_declined. Required fields and nullability are specific to this event."},"proposal.signature_expired":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"operation_status":{"anyOf":[{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},{"type":"null"}]},"job_id":{"type":"string","format":"uuid","description":"The job. Null on proposal.ping."},"request_id":{"type":"string","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"string","enum":["queued","building","in_review","failed","withdrawn"],"description":"The job status at event creation. Null on proposal.ping."},"version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"The version on the public link."},"revisions":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many rounds have run."},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The public link."},"review_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The review link."},"pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The live version's PDF."},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.signature_expired","description":"The event type."},"agreement_id":{"type":"string","format":"uuid","description":"The signature request."},"signed_version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The version being signed."},"signer_role":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The signer's role, as the request named it (proposal.signed and proposal.signature_declined); otherwise null."},"signer_email":{"anyOf":[{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}],"description":"The signer (proposal.signed and proposal.signature_declined); otherwise null."},"signed_count":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many have signed so far."},"signer_count":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many sign in all."},"signed_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}],"description":"The signed PDF with its certificate, behind the live link's gate (proposal.signature_completed); otherwise null."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type","agreement_id","signed_version","signer_role","signer_email","signed_count","signer_count","signed_pdf_url"],"description":"Fields carried by proposal.signature_expired. Required fields and nullability are specific to this event."},"proposal.ping":{"type":"object","properties":{"event_id":{"type":"string","format":"uuid"},"operation_id":{"type":"null"},"operation_status":{"type":"null"},"job_id":{"type":"null","description":"The job. Null on proposal.ping."},"request_id":{"type":"null","description":"Your id for the proposal. Null on proposal.ping."},"status":{"type":"null","description":"The job status at event creation. Null on proposal.ping."},"version":{"type":"null","description":"For engagement, the version observed. Otherwise the newest successfully built version. Null on proposal.ping."},"live_version":{"type":"null","description":"The version on the public link."},"revisions":{"type":"number","const":0,"description":"How many rounds have run."},"url":{"type":"null","description":"The public link."},"review_url":{"type":"null","description":"The review link."},"pdf_url":{"type":"null","description":"The live version's PDF."},"review_pdf_url":{"type":"null","description":"The newest review version's PDF."},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."},"revision_kind":{"description":"What started the round that just built.","anyOf":[{"type":"string","enum":["comments","update"]},{"type":"null"}]},"type":{"type":"string","const":"proposal.ping","description":"The event type."}},"required":["event_id","operation_id","operation_status","job_id","request_id","status","version","live_version","revisions","url","review_url","pdf_url","review_pdf_url","occurred_at","type"],"description":"Fields carried by proposal.ping. Required fields and nullability are specific to this event."},"proposal.operation_completed":{"type":"object","properties":{"type":{"type":"string","const":"proposal.operation_completed","description":"The event type."},"event_id":{"type":"string","format":"uuid"},"operation_id":{"type":"string","format":"uuid"},"operation_status":{"type":"string","enum":["succeeded","failed","cancelled"]},"job_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"The job. Null on proposal.ping."},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Your id for the proposal. Null on proposal.ping."},"status_url":{"type":"string","pattern":"^https:\\/\\/","format":"uri"},"occurred_at":{"type":"string","format":"date-time","pattern":"Z$","description":"When the event happened. Retries and resends preserve this timestamp."}},"required":["type","event_id","operation_id","operation_status","job_id","request_id","status_url","occurred_at"],"description":"Fields carried by proposal.operation_completed. Required fields and nullability are specific to this event."},"CtaClick":{"type":"object","properties":{"id":{"type":"string","description":"Which call to action: book_meeting or accept."},"at":{"type":"string","format":"date-time","pattern":"Z$","description":"When."}},"required":["id","at"]},"LiveViewer":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"The viewer."},"email_verified":{"type":"boolean","description":"Proven with a one-time code; false for an email typed at a plain prompt."},"first_open":{"type":"string","format":"date-time","pattern":"Z$","description":"First open of the live link."},"last_open":{"type":"string","format":"date-time","pattern":"Z$","description":"Latest open."},"opens":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many times they opened it."},"active_ms":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Visible time on the page, in milliseconds."},"furthest_section":{"type":"object","properties":{"n":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["n","name"],"description":"The furthest section they reached, 1-based."},"cta_clicks":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CtaClick"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]}},"required":["email","email_verified","first_open","last_open","opens","active_ms","furthest_section","cta_clicks"]},"MetricCoverage":{"type":"object","properties":{"status":{"type":"string","enum":["complete","partial","unavailable"]},"window_start":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]},"window_end":{"type":"string","format":"date-time","pattern":"Z$"},"measured_from":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]},"as_of":{"type":"string","format":"date-time","pattern":"Z$"}},"required":["status","window_start","window_end","measured_from","as_of"]},"SectionEngagement":{"type":"object","properties":{"section_id":{"type":"string"},"section_number":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"section_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"visible_ms":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"focused_ms":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"reached_visits":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]}},"required":["section_id","section_number","section_name","visible_ms","focused_ms","reached_visits"]},"VersionEngagement":{"type":"object","properties":{"rendered_version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"measurement_version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"opens":{"type":"integer","minimum":0,"maximum":9007199254740991},"visible_ms":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"focused_ms":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"cta_totals":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","minimum":0,"maximum":9007199254740991},"description":"Live clicks per call to action, every viewer together."},"coverage":{"$ref":"#/components/schemas/Coverage"},"sections":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SectionEngagement"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"live_viewers":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/LiveViewer"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]},"anonymous_live":{"$ref":"#/components/schemas/AnonymousLive"},"reviewers":{"$ref":"#/components/schemas/ReviewActivity"}},"required":["rendered_version","measurement_version","opens","visible_ms","focused_ms","cta_totals","coverage","sections","live_viewers","anonymous_live","reviewers"]},"AnonymousLive":{"type":"object","properties":{"opens":{"type":"integer","minimum":0,"maximum":9007199254740991},"active_ms":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"cta_clicks":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CtaClick"}},"next_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["items","next_url"]}},"required":["opens","active_ms","cta_clicks"],"description":"Opens of the live link with no trusted email, and their clicks."},"ReviewActivity":{"type":"object","properties":{"opens":{"type":"integer","minimum":0,"maximum":9007199254740991},"last_open":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]},"cta_clicks":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["opens","last_open","cta_clicks"],"description":"Opens of the review link."},"Publication":{"type":"object","properties":{"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"at":{"type":"string","format":"date-time","pattern":"Z$"},"by":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["version","at","by"]},"Round":{"type":"object","properties":{"round":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"kind":{"type":"string","enum":["comments","update"]},"at":{"type":"string","format":"date-time","pattern":"Z$"},"by":{"anyOf":[{"type":"string"},{"type":"null"}]},"comments":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many comments it took."}},"required":["round","kind","at","by","comments"]},"AvailableVersion":{"type":"object","properties":{"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"created_at":{"type":"string","format":"date-time","pattern":"Z$"},"review_url":{"type":"string","pattern":"^https:\\/\\/","format":"uri"},"review_pdf_url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]}},"required":["version","created_at","review_url","review_pdf_url"]},"ViewerAccess":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"added_by":{"type":"string"},"via":{"anyOf":[{"type":"string"},{"type":"null"}]},"added_at":{"type":"string","format":"date-time","pattern":"Z$"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]},"status":{"type":"string","enum":["active","removed"]},"url":{"anyOf":[{"type":"string","pattern":"^https:\\/\\/","format":"uri"},{"type":"null"}]},"first_opened_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]},"last_opened_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]},"role":{"type":"string","enum":["commenter","sharer","viewer"]}},"required":["email","added_by","via","added_at","revoked_at","status","url","first_opened_at","last_opened_at","role"]},"AccessRequest":{"type":"object","properties":{"request_id":{"type":"string","format":"uuid"},"email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"requested_by":{"type":"string"},"status":{"type":"string","enum":["pending","approved","declined","expired","cancelled"]},"created_at":{"type":"string","format":"date-time","pattern":"Z$"},"expires_at":{"type":"string","format":"date-time","pattern":"Z$"},"decided_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"Z$"},{"type":"null"}]},"decided_by":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["request_id","email","requested_by","status","created_at","expires_at","decided_at","decided_by"]}}}}