{"openapi":"3.0.3","info":{"title":"Parlay API","description":"Partner-facing API for Parlay pitch scoring, rep intelligence, and coaching. See API.md for the full spec.","version":"0.1.0"},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key (pk_sandbox_* or pk_live_*)"}},"schemas":{}},"paths":{"/v1/health":{"get":{"summary":"Health check","tags":["Health"],"description":"Service health. Returns ok / degraded / down with per-dependency detail.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok","degraded","down"]},"uptime_seconds":{"type":"number"},"checks":{"type":"object","properties":{"database":{"type":"string","enum":["ok","not_configured","down"]},"pubsub":{"type":"string","enum":["ok","not_configured","down"]},"deepgram":{"type":"string","enum":["ok","not_configured","down"]},"gemini":{"type":"string","enum":["ok","not_configured","down"]}},"required":["database","pubsub","deepgram","gemini"],"additionalProperties":false}},"required":["status","uptime_seconds","checks"],"additionalProperties":false}}}}}}},"/v1/version":{"get":{"summary":"API version + build info","tags":["Health"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"api_version":{"type":"string"},"release":{"type":"string"},"node_env":{"type":"string"},"commit":{"type":"string","nullable":true},"built_at":{"type":"string","nullable":true}},"required":["api_version","release","node_env","commit","built_at"],"additionalProperties":false}}}}}}},"/v1/status":{"get":{"summary":"Public service status","tags":["Health"],"description":"Per-provider health and queue depth. Safe for public status pages.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["operational","degraded","maintenance","outage"]},"uptime_seconds":{"type":"number"},"providers":{"type":"object","properties":{"deepgram":{"type":"string","enum":["operational","degraded","outage","not_configured"]},"gemini":{"type":"string","enum":["operational","degraded","outage","not_configured"]},"supabase":{"type":"string","enum":["operational","degraded","outage","not_configured"]},"pubsub":{"type":"string","enum":["operational","degraded","outage","not_configured"]}},"required":["deepgram","gemini","supabase","pubsub"],"additionalProperties":false},"queue_depth":{"type":"object","properties":{"analyses":{"type":"number"},"webhooks":{"type":"number"},"exports":{"type":"number"}},"required":["analyses","webhooks","exports"],"additionalProperties":false}},"required":["status","uptime_seconds","providers","queue_depth"],"additionalProperties":false}}}}}}},"/v1/keys/me":{"get":{"summary":"Introspect the current API key","tags":["Keys"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"api_key_id":{"type":"string","format":"uuid"},"partner_id":{"type":"string","format":"uuid"},"key_id":{"type":"string"},"key_prefix":{"type":"string"},"environment":{"type":"string","enum":["sandbox","production"]},"scopes":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"last_used_at":{"type":"string","nullable":true},"revoke_after":{"type":"string","nullable":true}},"required":["api_key_id","partner_id","key_id","key_prefix","environment","scopes","created_at","last_used_at","revoke_after"],"additionalProperties":false}}}}}}},"/v1/keys/rotate":{"post":{"summary":"Rotate the current key","tags":["Keys"],"description":"Mints a new key with identical scopes + environment. Current key stays valid for 24h, then auto-revokes.","responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"new_key_id":{"type":"string"},"key":{"type":"string"},"key_prefix":{"type":"string"},"environment":{"type":"string","enum":["sandbox","production"]},"old_key_revokes_at":{"type":"string"},"warning":{"type":"string"}},"required":["new_key_id","key","key_prefix","environment","old_key_revokes_at","warning"],"additionalProperties":false}}}}}}},"/v1/keys/revoke":{"post":{"summary":"Revoke the current key immediately","tags":["Keys"],"responses":{"200":{"description":"Default Response"}}}},"/v1/analyses":{"post":{"summary":"Submit a recording for analysis","tags":["Analyses"],"description":"Returns 202 with a job handle. Completion is delivered via webhook (see /v1/webhooks) or via polling GET /v1/analyses/:id. In sandbox, use `mock://perfect-pitch` etc. for deterministic results.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"org_id":{"type":"string","minLength":1,"maxLength":256},"rep_id":{"type":"string","minLength":1,"maxLength":256},"recording_url":{"type":"string","format":"uri"},"transcript_url":{"type":"string","format":"uri"},"callback_url":{"type":"string","format":"uri"},"options":{"type":"object","properties":{"persona_id":{"type":"integer"},"methodology_id":{"type":"integer"},"playbook_id":{"type":"string","format":"uuid"},"scoring_profile_id":{"type":"string","format":"uuid"},"prompt_overrides":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"],"additionalProperties":false}},"language":{"type":"string"},"skip_diarization":{"type":"boolean"},"recording_type":{"type":"string"},"environment":{"type":"string"},"sales_motion":{"type":"string"}},"additionalProperties":true},"metadata":{"type":"object","additionalProperties":{}}},"required":["org_id","rep_id"],"additionalProperties":false}}}},"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","processing","completed","failed","cancelled"]},"created_at":{"type":"string"}},"required":["id","status","created_at"],"additionalProperties":false}}}}}},"get":{"summary":"List analyses","tags":["Analyses"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"org_id","required":false},{"schema":{"type":"string"},"in":"query","name":"rep_id","required":false},{"schema":{"type":"string","enum":["queued","processing","completed","failed","cancelled"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"from","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"to","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100},"in":"query","name":"min_score","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/v1/analyses/{id}":{"get":{"summary":"Fetch an analysis","tags":["Analyses"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Soft-delete an analysis","tags":["Analyses"],"parameters":[{"schema":{"type":"string","enum":["archive","purge"],"default":"archive"},"in":"query","name":"mode","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/analyses/{id}/rescore":{"post":{"summary":"Rescore an analysis (Phase 1.B)","tags":["Analyses"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/webhooks":{"post":{"summary":"Register a webhook","tags":["Webhooks"],"description":"signing_secret is returned exactly once — store it immediately.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","maxLength":2048},"enabled_events":{"type":"array","items":{"type":"string","enum":["analysis.queued","analysis.completed","analysis.failed","persona.assigned","methodology.assigned","profile.synthesized","playbook.draft.completed","playbook.published","insights.generated","batch.completed","batch.item.completed","batch.item.failed","export.ready","webhook.test"]},"minItems":1},"name":{"type":"string","maxLength":120},"description":{"type":"string","maxLength":2000}},"required":["url","enabled_events"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response"}}},"get":{"summary":"List webhooks","tags":["Webhooks"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/v1/webhooks/{id}":{"get":{"summary":"Fetch a webhook","tags":["Webhooks"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Update a webhook","tags":["Webhooks"],"description":"Pass rotate_secret=true to regenerate the signing secret — it is returned in the response exactly once.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","maxLength":2048},"enabled_events":{"type":"array","items":{"type":"string","enum":["analysis.queued","analysis.completed","analysis.failed","persona.assigned","methodology.assigned","profile.synthesized","playbook.draft.completed","playbook.published","insights.generated","batch.completed","batch.item.completed","batch.item.failed","export.ready","webhook.test"]},"minItems":1},"paused":{"type":"boolean"},"name":{"type":"string","maxLength":120,"nullable":true},"description":{"type":"string","maxLength":2000,"nullable":true},"rotate_secret":{"type":"boolean"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete a webhook (soft)","tags":["Webhooks"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/webhooks/{id}/test":{"post":{"summary":"Send a webhook.test event to the registered URL","tags":["Webhooks"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/webhooks/{id}/deliveries":{"get":{"summary":"List deliveries for a webhook","tags":["Webhooks"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/webhooks/{id}/deliveries/{delivery_id}":{"get":{"summary":"Fetch a single delivery with payload + response","tags":["Webhooks"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"delivery_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/webhooks/{id}/deliveries/{delivery_id}/replay":{"post":{"summary":"Replay a delivery (Phase 9)","tags":["Webhooks"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"delivery_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs":{"post":{"summary":"Create (or upsert) an org","tags":["Orgs"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"org_id":{"type":"string","minLength":1,"maxLength":256},"name":{"type":"string","maxLength":200},"timezone":{"type":"string","maxLength":64},"industry":{"type":"string"},"default_environment":{"type":"string"},"default_sales_motion":{"type":"string"},"default_recording_type":{"type":"string"},"pii_policy":{"type":"object","properties":{"redaction_level":{"type":"string","enum":["none","standard","aggressive"]},"retain_transcript_days":{"anyOf":[{"type":"integer","minimum":0},{"type":"string","enum":["forever"]}]},"retain_analysis_days":{"anyOf":[{"type":"integer","minimum":0},{"type":"string","enum":["forever"]}]},"redact_fields":{"type":"array","items":{"type":"string"}}},"additionalProperties":true},"settings":{"type":"object","additionalProperties":{}}},"required":["org_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response"}}},"get":{"summary":"List orgs","tags":["Orgs"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}":{"get":{"summary":"Fetch an org","tags":["Orgs"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Update an org","tags":["Orgs"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":200},"timezone":{"type":"string","maxLength":64},"industry":{"type":"string","nullable":true},"default_environment":{"type":"string","nullable":true},"default_sales_motion":{"type":"string","nullable":true},"default_recording_type":{"type":"string","nullable":true},"pii_policy":{"type":"object","properties":{"redaction_level":{"type":"string","enum":["none","standard","aggressive"]},"retain_transcript_days":{"anyOf":[{"type":"integer","minimum":0},{"type":"string","enum":["forever"]}]},"retain_analysis_days":{"anyOf":[{"type":"integer","minimum":0},{"type":"string","enum":["forever"]}]},"redact_fields":{"type":"array","items":{"type":"string"}}},"additionalProperties":true},"settings":{"type":"object","additionalProperties":{}}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Soft-delete an org","tags":["Orgs"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/reps":{"post":{"summary":"Create (or upsert) a rep","tags":["Reps"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rep_id":{"type":"string","minLength":1,"maxLength":256},"name":{"type":"string","maxLength":200},"email":{"type":"string","format":"email"},"metadata":{"type":"object","additionalProperties":{}}},"required":["rep_id"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"get":{"summary":"List reps in an org","tags":["Reps"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/reps/{rep_id}":{"get":{"summary":"Fetch a rep","tags":["Reps"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Update a rep","tags":["Reps"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":200,"nullable":true},"email":{"type":"string","format":"email","nullable":true},"metadata":{"type":"object","additionalProperties":{}}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Soft-delete a rep","tags":["Reps"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/industries":{"get":{"summary":"List industries","tags":["Reference"],"responses":{"200":{"description":"Default Response"}}}},"/v1/environments":{"get":{"summary":"List environments","tags":["Reference"],"responses":{"200":{"description":"Default Response"}}}},"/v1/sales-motions":{"get":{"summary":"List sales motions","tags":["Reference"],"responses":{"200":{"description":"Default Response"}}}},"/v1/recording-types":{"get":{"summary":"List recording types","tags":["Reference"],"responses":{"200":{"description":"Default Response"}}}},"/v1/personas":{"get":{"summary":"List sales personas","tags":["Personas"],"responses":{"200":{"description":"Default Response"}}}},"/v1/methodologies":{"get":{"summary":"List sales methodologies","tags":["Methodologies"],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/reps/{rep_id}/persona":{"get":{"summary":"Current persona assignment","tags":["Personas"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Manually set a rep persona","tags":["Personas"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"persona":{"type":"string","minLength":1},"justification":{"type":"string","maxLength":2000}},"required":["persona"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/reps/{rep_id}/persona/history":{"get":{"summary":"Persona assignment history","tags":["Personas"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/reps/{rep_id}/persona/assign":{"post":{"summary":"Async persona assignment from recordings","tags":["Personas"],"description":"Submit N recording_urls OR N analysis_ids. We run each through the pipeline (cached 30 days by URL), then meta-analyze to determine the rep's persona. 202 + job_id returned; final result delivered via persona.assigned webhook or polled via GET /v1/orgs/:org_id/reps/:rep_id/intel-jobs/:job_id.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"recording_urls":{"type":"array","items":{"type":"string","format":"uri"},"minItems":1,"maxItems":50},"analysis_ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":50},"callback_url":{"type":"string","format":"uri"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/reps/{rep_id}/methodology":{"get":{"summary":"Current methodology assignments (primary + secondary)","tags":["Methodologies"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Manually set rep methodologies","tags":["Methodologies"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"primary":{"type":"string","minLength":1},"secondary":{"type":"string","minLength":1},"justification":{"type":"string","maxLength":2000}},"required":["primary"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/reps/{rep_id}/methodology/history":{"get":{"summary":"Methodology assignment history","tags":["Methodologies"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/reps/{rep_id}/methodology/assign":{"post":{"summary":"Async primary + secondary methodology assignment from recordings","tags":["Methodologies"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"recording_urls":{"type":"array","items":{"type":"string","format":"uri"},"minItems":1,"maxItems":50},"analysis_ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":50},"callback_url":{"type":"string","format":"uri"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/reps/{rep_id}/synthesis":{"post":{"summary":"Generate a strategic coaching synthesis for this rep","tags":["Synthesis"],"description":"Rolls up the rep's most recent completed analyses (or explicit analysis_ids) into a coaching summary with strengths, gaps, action plan, and score trends. 202 + job_id. Result delivered via profile.synthesized webhook.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lookback_count":{"type":"integer","minimum":1,"maximum":50},"analysis_ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":50},"callback_url":{"type":"string","format":"uri"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"get":{"summary":"Synthesis history","tags":["Synthesis"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/reps/{rep_id}/synthesis/latest":{"get":{"summary":"Latest synthesis for a rep","tags":["Synthesis"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/reps/{rep_id}/intel-jobs/{job_id}":{"get":{"summary":"Poll a rep-intelligence batch job","tags":["Personas"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"job_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/reps/{rep_id}/stats":{"get":{"summary":"Rep score aggregates and trend","tags":["Reps"],"parameters":[{"schema":{"type":"string","format":"date-time"},"in":"query","name":"from","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"to","required":false},{"schema":{"type":"string","enum":["day","week","month"]},"in":"query","name":"granularity","required":false},{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string"},"in":"path","name":"rep_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/playbooks":{"post":{"summary":"Create a playbook","tags":["Playbooks"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"content":{"type":"string","minLength":1,"maxLength":500000},"is_active":{"type":"boolean"},"file_name":{"type":"string","maxLength":200},"metadata":{"type":"object","additionalProperties":{}}},"required":["content"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"get":{"summary":"List playbooks","tags":["Playbooks"],"parameters":[{"schema":{"type":"boolean"},"in":"query","name":"active_only","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/playbooks/{id}":{"get":{"summary":"Fetch a playbook","tags":["Playbooks"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Update a playbook (bumps version on content change)","tags":["Playbooks"],"description":"If `content` changes, the prior version is appended to playbook_versions and version increments.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":200,"nullable":true},"content":{"type":"string","minLength":1,"maxLength":500000},"is_active":{"type":"boolean"},"metadata":{"type":"object","additionalProperties":{}}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Soft-delete a playbook","tags":["Playbooks"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/playbooks/{id}/versions":{"get":{"summary":"Version history","tags":["Playbooks"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/playbook-sources":{"post":{"summary":"Upload a playbook source material","tags":["Playbooks"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"content":{"type":"string","minLength":1,"maxLength":500000},"source_type":{"type":"string","enum":["inline","url","transcript"]},"source_url":{"type":"string","format":"uri"}},"required":["title","content"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"get":{"summary":"List source materials","tags":["Playbooks"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/playbook-sources/{id}":{"get":{"summary":"Fetch a source material","tags":["Playbooks"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Soft-delete a source material","tags":["Playbooks"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/playbook-drafts":{"post":{"summary":"Generate a playbook draft from source materials (async)","tags":["Playbooks"],"description":"Queues a Gemini job that synthesizes the supplied source materials into a markdown playbook. 202 + draft_id returned; completion delivered via playbook.draft.completed webhook and polling GET /playbook-drafts/:id.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"source_material_ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":50},"callback_url":{"type":"string","format":"uri"}},"required":["source_material_ids"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"get":{"summary":"List playbook drafts","tags":["Playbooks"],"parameters":[{"schema":{"type":"string","enum":["queued","processing","completed","failed","published"]},"in":"query","name":"status","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/playbook-drafts/{id}":{"get":{"summary":"Fetch a draft (poll for completion)","tags":["Playbooks"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/playbook-drafts/{id}/publish":{"post":{"summary":"Publish a completed draft as the active playbook","tags":["Playbooks"],"description":"Inserts the draft's generated_content into playbooks (version 1, is_active=true) and marks the draft published_at.","parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/prompts":{"post":{"summary":"Create a custom prompt","tags":["Prompts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":2000},"prompt_content":{"type":"string","minLength":1,"maxLength":20000},"prompt_type":{"type":"string","enum":["scoring_criterion","evaluation_focus","disqualifier","other"]},"order_index":{"type":"integer","minimum":0},"is_active":{"type":"boolean"}},"required":["title","prompt_content"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"get":{"summary":"List custom prompts (ordered)","tags":["Prompts"],"parameters":[{"schema":{"type":"boolean"},"in":"query","name":"active_only","required":false},{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/prompts/{id}":{"get":{"summary":"Fetch a prompt","tags":["Prompts"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Update a custom prompt","tags":["Prompts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":2000,"nullable":true},"prompt_content":{"type":"string","minLength":1,"maxLength":20000},"prompt_type":{"type":"string","enum":["scoring_criterion","evaluation_focus","disqualifier","other"]},"order_index":{"type":"integer","minimum":0},"is_active":{"type":"boolean"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Soft-delete a prompt","tags":["Prompts"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/prompts/order":{"put":{"summary":"Bulk reorder custom prompts","tags":["Prompts"],"description":"Body: {ids: [...]} — new order_index is the position in the array. Atomic.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1}},"required":["ids"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/analyses/{id}/chat":{"post":{"summary":"Ask Scout a question about this analysis","tags":["Chat"],"description":"Returns the full response (non-streaming). SSE streaming variant lands in Phase 5.B. Chat history is persisted per-analysis; pass /chat repeatedly to maintain conversation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","minLength":1,"maxLength":4000}},"required":["message"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/analyses/{id}/chat/welcome-questions":{"get":{"summary":"4 AI-generated starter questions tailored to this call","tags":["Chat"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/analyses/{id}/chat/history":{"get":{"summary":"Full chat history for this analysis","tags":["Chat"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Clear chat history for this analysis","tags":["Chat"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/analyses/{id}/disposition":{"post":{"summary":"Tag a disposition on an analysis (upsert)","tags":["Dispositions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"disposition":{"type":"string","enum":["sold","lost","canceled","undispositioned"]},"notes":{"type":"string","maxLength":2000},"deal_amount":{"type":"number","minimum":0},"deal_closed_at":{"type":"string","format":"date-time"}},"required":["disposition"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"get":{"summary":"Fetch the disposition for an analysis","tags":["Dispositions"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Update a disposition","tags":["Dispositions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"disposition":{"type":"string","enum":["sold","lost","canceled","undispositioned"]},"notes":{"type":"string","maxLength":2000},"deal_amount":{"type":"number","minimum":0},"deal_closed_at":{"type":"string","format":"date-time"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Clear a disposition","tags":["Dispositions"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/dispositions":{"get":{"summary":"List dispositions for an org","tags":["Dispositions"],"parameters":[{"schema":{"type":"string","enum":["sold","lost","canceled","undispositioned"]},"in":"query","name":"disposition","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"from","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"to","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/insights/generate":{"post":{"summary":"Generate an org insights snapshot (async)","tags":["Insights"],"description":"Aggregates the org's completed analyses in the supplied window (default last 30 days), runs a Gemini meta-analysis, and persists an insights_snapshots row. 202 + job_id. Webhook: insights.generated.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"period_type":{"type":"string","enum":["daily","weekly","monthly","custom"]},"start_date":{"type":"string","format":"date-time"},"end_date":{"type":"string","format":"date-time"},"callback_url":{"type":"string","format":"uri"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/insights":{"get":{"summary":"Fetch the most recent insights snapshot","tags":["Insights"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/insights/history":{"get":{"summary":"List insight snapshots over time","tags":["Insights"],"parameters":[{"schema":{"type":"string","enum":["daily","weekly","monthly","custom"]},"in":"query","name":"period_type","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{org_id}/leaderboard":{"get":{"summary":"Rank reps in an org","tags":["Insights"],"description":"Pure SQL aggregate. sort_by: score (overall_avg desc), volume (analyses_count desc), improvement (first-half vs second-half delta). No AI, no cost.","parameters":[{"schema":{"type":"string","enum":["7d","30d","90d"]},"in":"query","name":"period","required":false},{"schema":{"type":"string","enum":["score","volume","improvement"]},"in":"query","name":"sort_by","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"path","name":"org_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/admin/partners":{"post":{"summary":"Create a partner","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"contact_email":{"type":"string","format":"email"},"plan_tier":{"type":"string","enum":["starter","growth","scale","premier","internal"],"default":"starter"},"healthcare":{"type":"boolean","default":false},"notes":{"type":"string","maxLength":2000},"settings":{"type":"object","additionalProperties":{},"default":{}}},"required":["name","contact_email"],"additionalProperties":false}}}},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"contact_email":{"type":"string"},"plan_tier":{"type":"string","enum":["starter","growth","scale","premier","internal"]},"healthcare":{"type":"boolean"},"suspended_at":{"type":"string","nullable":true},"settings":{"type":"object","additionalProperties":{}},"notes":{"type":"string","nullable":true},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","name","contact_email","plan_tier","healthcare","suspended_at","settings","notes","created_at","updated_at"],"additionalProperties":false}}}}}},"get":{"summary":"List partners","tags":["Admin"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/v1/admin/partners/{id}":{"get":{"summary":"Fetch a partner","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"contact_email":{"type":"string"},"plan_tier":{"type":"string","enum":["starter","growth","scale","premier","internal"]},"healthcare":{"type":"boolean"},"suspended_at":{"type":"string","nullable":true},"settings":{"type":"object","additionalProperties":{}},"notes":{"type":"string","nullable":true},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","name","contact_email","plan_tier","healthcare","suspended_at","settings","notes","created_at","updated_at"],"additionalProperties":false}}}}}},"patch":{"summary":"Update a partner","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"contact_email":{"type":"string","format":"email"},"plan_tier":{"type":"string","enum":["starter","growth","scale","premier","internal"]},"healthcare":{"type":"boolean"},"notes":{"type":"string","maxLength":2000,"nullable":true},"settings":{"type":"object","additionalProperties":{}}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"contact_email":{"type":"string"},"plan_tier":{"type":"string","enum":["starter","growth","scale","premier","internal"]},"healthcare":{"type":"boolean"},"suspended_at":{"type":"string","nullable":true},"settings":{"type":"object","additionalProperties":{}},"notes":{"type":"string","nullable":true},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","name","contact_email","plan_tier","healthcare","suspended_at","settings","notes","created_at","updated_at"],"additionalProperties":false}}}}}}},"/v1/admin/partners/{id}/suspend":{"post":{"summary":"Suspend a partner (all keys treated as revoked)","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/admin/partners/{id}/unsuspend":{"post":{"summary":"Unsuspend a partner","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/admin/api-keys":{"post":{"summary":"Mint an API key for a partner","tags":["Admin"],"description":"Returns the raw key exactly once. After this response we only store a HMAC hash. The `key` field is never retrievable again.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"partner_id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["sandbox","production"]},"scopes":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"minItems":1,"default":["partner:write"]},"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":"string","maxLength":2000}},"required":["partner_id","environment"],"additionalProperties":false}}}},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"key":{"type":"string"},"key_id":{"type":"string"},"key_prefix":{"type":"string"},"environment":{"type":"string","enum":["sandbox","production"]},"partner_id":{"type":"string","format":"uuid"},"scopes":{"type":"array","items":{"type":"string"}},"name":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"created_at":{"type":"string"},"warning":{"type":"string"}},"required":["id","key","key_id","key_prefix","environment","partner_id","scopes","name","description","created_at","warning"],"additionalProperties":false}}}}}},"get":{"summary":"List API keys across partners","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"partner_id","required":false},{"schema":{"type":"string","enum":["sandbox","production"]},"in":"query","name":"environment","required":false},{"schema":{"type":"boolean"},"in":"query","name":"include_revoked","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/v1/admin/api-keys/{id}":{"get":{"summary":"Fetch a key by id (metadata only — no secret)","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"partner_id":{"type":"string","format":"uuid"},"key_id":{"type":"string"},"key_prefix":{"type":"string"},"environment":{"type":"string","enum":["sandbox","production"]},"scopes":{"type":"array","items":{"type":"string"}},"name":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"created_at":{"type":"string"},"updated_at":{"type":"string"},"last_used_at":{"type":"string","nullable":true},"revoked_at":{"type":"string","nullable":true},"revoke_after":{"type":"string","nullable":true}},"required":["id","partner_id","key_id","key_prefix","environment","scopes","name","description","created_at","updated_at","last_used_at","revoked_at","revoke_after"],"additionalProperties":false}}}}}},"delete":{"summary":"Revoke a key immediately","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/internal/recover":{"post":{"summary":"Scan for + recover stuck jobs","tags":["Admin"],"description":"Marks analyses, rep_intel_jobs, and playbook_drafts stuck in status=processing for longer than `stuck_after_seconds` (default 600) as failed with code recovery_timeout. Fires the matching failure webhook so partners get notified.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"stuck_after_seconds":{"type":"integer","minimum":60,"maximum":86400}},"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response"}}}},"/":{"get":{"responses":{"200":{"description":"Default Response"}}}}},"servers":[{"url":"http://localhost:3000","description":"production"}],"security":[{"ApiKeyAuth":[]}],"tags":[{"name":"Health","description":"Service health and platform status"},{"name":"Analyses","description":"Submit and retrieve pitch scoring analyses"},{"name":"Orgs","description":"Partner org management"},{"name":"Reps","description":"Rep management"},{"name":"Keys","description":"API key lifecycle"},{"name":"Webhooks","description":"Webhook registration and delivery"},{"name":"Personas","description":"Rep persona intelligence"},{"name":"Methodologies","description":"Rep methodology intelligence"},{"name":"Synthesis","description":"Profile synthesis"},{"name":"Insights","description":"Org-level insights"},{"name":"Playbooks","description":"Playbook management + AI drafting"},{"name":"Prompts","description":"Custom AI prompts"},{"name":"Scoring","description":"Scoring profile config"},{"name":"Chat","description":"Scout AI chat"},{"name":"Dispositions","description":"Call dispositions"},{"name":"Practice","description":"Practice sessions"},{"name":"Bulk","description":"Batch and export"},{"name":"Usage","description":"Usage and billing"},{"name":"Audit","description":"Audit log"},{"name":"Admin","description":"Platform admin (internal)"}]}