{"components":{"schemas":{"AppliedAutoTag":{"additionalProperties":true,"properties":{"auto_tag_id":{"title":"Auto Tag Id","type":"string"},"confidence_score":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"0 to 1.","title":"Confidence Score"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Created At"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"extracted_value":{"title":"Extracted Value","type":"string"},"extraction":{"description":"Same as extracted_value.","title":"Extraction","type":"string"},"id":{"title":"Id","type":"string"},"name":{"title":"Name","type":"string"}},"required":["id","auto_tag_id","name","extracted_value","extraction"],"title":"AppliedAutoTag","type":"object"},"AudienceGroup":{"additionalProperties":true,"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"examples":["Investors"],"title":"Display Name"},"id":{"title":"Id","type":"string"},"name":{"examples":["investors"],"title":"Name","type":"string"},"sort_order":{"default":0,"title":"Sort Order","type":"integer"}},"required":["id","name"],"title":"AudienceGroup","type":"object"},"AudienceGroupsResponse":{"additionalProperties":true,"properties":{"groups":{"items":{"$ref":"#/components/schemas/AudienceGroup"},"title":"Groups","type":"array"}},"required":["groups"],"title":"AudienceGroupsResponse","type":"object"},"AudienceSummaryRecord":{"additionalProperties":true,"properties":{"category":{"description":"The audience category, or persona:<id> for a single persona.","title":"Category","type":"string"},"filters":{"additionalProperties":true,"title":"Filters","type":"object"},"generated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Generated At"},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"examples":["B"],"title":"Grade"},"grade_trend":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"up, down or flat.","title":"Grade Trend"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Present on cached records.","title":"Id"},"is_stale":{"default":false,"title":"Is Stale","type":"boolean"},"reaction_count":{"default":0,"title":"Reaction Count","type":"integer"},"status_counts":{"$ref":"#/components/schemas/StatusCounts"},"summary_json":{"additionalProperties":true,"description":"headline, overall_sentiment, top_themes, pillar_reception, top_actions, top_risks, context, data_window.","title":"Summary Json","type":"object"},"workspace_id":{"title":"Workspace Id","type":"string"}},"required":["workspace_id","category","summary_json"],"title":"AudienceSummaryRecord","type":"object"},"AutoDetectIngestRequest":{"additionalProperties":true,"properties":{"url":{"description":"A web page, PDF, YouTube video or audio URL; the type is detected.","examples":["https://investors.example.com/q3-call"],"title":"Url","type":"string"}},"required":["url"],"title":"AutoDetectIngestRequest","type":"object"},"AutoDetectIngestResponse":{"additionalProperties":true,"properties":{"content_type":{"description":"The detected type.","examples":["web"],"title":"Content Type","type":"string"},"document":{"$ref":"#/components/schemas/IngestedDocument"},"media_provenance":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Media Provenance"},"message":{"title":"Message","type":"string"}},"required":["message","content_type","document"],"title":"AutoDetectIngestResponse","type":"object"},"CommsFilterBackfillRequest":{"additionalProperties":true,"properties":{"limit":{"default":500,"description":"Documents to queue in this call (at most 2000); call again for the rest.","title":"Limit","type":"integer"}},"title":"CommsFilterBackfillRequest","type":"object"},"CommsFilterBackfillResponse":{"additionalProperties":true,"properties":{"candidates":{"title":"Candidates","type":"integer"},"limit":{"title":"Limit","type":"integer"},"queued":{"title":"Queued","type":"integer"},"remaining":{"title":"Remaining","type":"integer"}},"required":["queued","candidates","remaining","limit"],"title":"CommsFilterBackfillResponse","type":"object"},"CommsFilterEntry":{"additionalProperties":true,"properties":{"enabled":{"title":"Enabled","type":"boolean"},"values":{"description":"Empty hides every value of the tag; otherwise only documents whose extracted value is listed.","items":{"type":"string"},"title":"Values","type":"array"}},"required":["enabled"],"title":"CommsFilterEntry","type":"object"},"CommsFilterExample":{"additionalProperties":true,"properties":{"added_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Added At"},"added_by":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Added By"},"document_id":{"title":"Document Id","type":"string"},"snippet":{"title":"Snippet","type":"string"},"title":{"title":"Title","type":"string"}},"required":["document_id","title","snippet"],"title":"CommsFilterExample","type":"object"},"CommsFilterExclusionRequest":{"additionalProperties":true,"properties":{"document_id":{"title":"Document Id","type":"string"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Example text to keep with the filter; defaults to the start of the document.","title":"Snippet"}},"required":["document_id"],"title":"CommsFilterExclusionRequest","type":"object"},"CommsFilterExclusionResponse":{"additionalProperties":true,"properties":{"already_hidden":{"title":"Already Hidden","type":"boolean"},"applied_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Applied Id"},"example":{"$ref":"#/components/schemas/CommsFilterExample"}},"required":["example","already_hidden"],"title":"CommsFilterExclusionResponse","type":"object"},"CommsFilterTag":{"additionalProperties":true,"properties":{"description":{"default":"","title":"Description","type":"string"},"enabled":{"title":"Enabled","type":"boolean"},"filter_examples":{"items":{"$ref":"#/components/schemas/CommsFilterExample"},"title":"Filter Examples","type":"array"},"hidden_count":{"description":"Documents the filter currently hides.","title":"Hidden Count","type":"integer"},"id":{"title":"Id","type":"string"},"name":{"examples":["Spam"],"title":"Name","type":"string"},"tag_type":{"description":"content_filter for a manual filter; any other auto-tag type when a semantic tag is linked as a filter.","examples":["content_filter"],"title":"Tag Type","type":"string"},"values":{"items":{"type":"string"},"title":"Values","type":"array"}},"required":["id","name","tag_type","enabled","hidden_count"],"title":"CommsFilterTag","type":"object"},"CommsFilterTagCreateRequest":{"additionalProperties":true,"properties":{"description":{"default":"","description":"What the filter hides; grounds the model's evaluation of new documents.","title":"Description","type":"string"},"enabled":{"default":true,"title":"Enabled","type":"boolean"},"name":{"examples":["Boilerplate"],"title":"Name","type":"string"}},"required":["name"],"title":"CommsFilterTagCreateRequest","type":"object"},"CommsFilterTagCreateResponse":{"additionalProperties":true,"properties":{"tag":{"$ref":"#/components/schemas/CommsFilterTag"}},"required":["tag"],"title":"CommsFilterTagCreateResponse","type":"object"},"CommsFilterUnhideResponse":{"additionalProperties":true,"properties":{"message":{"title":"Message","type":"string"},"removed":{"description":"The applied rows removed.","title":"Removed"}},"required":["message","removed"],"title":"CommsFilterUnhideResponse","type":"object"},"CommsFiltersReplaceRequest":{"additionalProperties":true,"properties":{"filters":{"additionalProperties":true,"description":"The whole map: auto-tag id to true/false, or to {enabled, values}. A tag left out is disabled.","examples":[{"tag_abc":true,"tag_def":{"enabled":true,"values":["Acme"]}}],"title":"Filters","type":"object"}},"required":["filters"],"title":"CommsFiltersReplaceRequest","type":"object"},"CommsFiltersReplaceResponse":{"additionalProperties":true,"properties":{"filters":{"additionalProperties":{"$ref":"#/components/schemas/CommsFilterEntry"},"title":"Filters","type":"object"},"message":{"title":"Message","type":"string"}},"required":["message","filters"],"title":"CommsFiltersReplaceResponse","type":"object"},"CommsFiltersResponse":{"additionalProperties":true,"properties":{"filters":{"additionalProperties":{"$ref":"#/components/schemas/CommsFilterEntry"},"description":"The enabled registry, keyed by auto-tag id.","title":"Filters","type":"object"},"tags":{"items":{"$ref":"#/components/schemas/CommsFilterTag"},"title":"Tags","type":"array"}},"required":["tags","filters"],"title":"CommsFiltersResponse","type":"object"},"CommunicationsResponse":{"additionalProperties":true,"properties":{"documents":{"description":"Without content; tags are a JSON-encoded string on this endpoint.","items":{"$ref":"#/components/schemas/DocumentObject"},"title":"Documents","type":"array"},"hidden_count":{"description":"Documents hidden by auto-tag filters.","title":"Hidden Count","type":"integer"},"pagination":{"$ref":"#/components/schemas/Pagination"},"show_filtered":{"title":"Show Filtered","type":"boolean"}},"required":["documents","hidden_count","show_filtered","pagination"],"title":"CommunicationsResponse","type":"object"},"ContentCreationCoverageRequest":{"properties":{"content":{"title":"Content","type":"string"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"gemini/gemini-2.5-flash","title":"Model"},"pull_through_priorities":{"default":[],"items":{"$ref":"#/components/schemas/ContentCreationPullThroughPriority"},"title":"Pull Through Priorities","type":"array"}},"required":["content"],"title":"ContentCreationCoverageRequest","type":"object"},"ContentCreationDraftRequest":{"properties":{"audience_persona_ids":{"default":[],"items":{"type":"string"},"title":"Audience Persona Ids","type":"array"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"text","title":"Content Type"},"content_type_value":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content Type Value"},"draft_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Draft Id"},"knowledgebase_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Knowledgebase Id"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Project Id"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Prompt"},"pull_through_priorities":{"default":[],"items":{"$ref":"#/components/schemas/ContentCreationPullThroughPriority"},"title":"Pull Through Priorities","type":"array"},"source_document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Document Id"},"source_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"freeform","title":"Source Mode"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Url"},"test_history":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"Test History"},"themes":{"default":[],"items":{"type":"string"},"title":"Themes","type":"array"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"tone_persona_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona Id"},"voice_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Voice Profile Id"}},"title":"ContentCreationDraftRequest","type":"object"},"ContentCreationEnhanceRequest":{"properties":{"audiences":{"default":[],"items":{"type":"string"},"title":"Audiences","type":"array"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"auto","title":"Content Type"},"content_type_label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content Type Label"},"current_draft":{"title":"Current Draft","type":"string"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"gemini/gemini-2.5-flash","title":"Model"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Prompt"},"themes":{"default":[],"items":{"type":"string"},"title":"Themes","type":"array"},"tone_persona_helper":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona Helper"},"tone_persona_label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona Label"},"unmet_priorities":{"default":[],"items":{"$ref":"#/components/schemas/ContentCreationPullThroughPriority"},"title":"Unmet Priorities","type":"array"}},"required":["current_draft"],"title":"ContentCreationEnhanceRequest","type":"object"},"ContentCreationExportRequest":{"properties":{"content_html":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"","title":"Content Html"},"content_text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"","title":"Content Text"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content Type"},"format":{"default":"pdf","title":"Format","type":"string"},"themes":{"default":[],"items":{"type":"string"},"title":"Themes","type":"array"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"Untitled","title":"Title"},"tone_persona":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona"}},"title":"ContentCreationExportRequest","type":"object"},"ContentCreationGenerateRequest":{"properties":{"audiences":{"default":[],"items":{"type":"string"},"title":"Audiences","type":"array"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"auto","title":"Content Type"},"content_type_label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content Type Label"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"gemini/gemini-2.5-flash","title":"Model"},"preferred_title_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Preferred Title Length"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Prompt"},"pull_through_priorities":{"default":[],"items":{"$ref":"#/components/schemas/ContentCreationPullThroughPriority"},"title":"Pull Through Priorities","type":"array"},"source_document_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Document Excerpt"},"source_document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Document Id"},"source_document_title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Document Title"},"source_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"freeform","title":"Source Mode"},"template_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Template Instructions"},"template_reference_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Template Reference Excerpt"},"themes":{"default":[],"items":{"type":"string"},"title":"Themes","type":"array"},"tone_persona_helper":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona Helper"},"tone_persona_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona Id"},"tone_persona_label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona Label"},"voice_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Voice Profile Id"}},"title":"ContentCreationGenerateRequest","type":"object"},"ContentCreationPullThroughPriority":{"properties":{"from_kb":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"From Kb"},"level":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"must","title":"Level"},"text":{"title":"Text","type":"string"}},"required":["text"],"title":"ContentCreationPullThroughPriority","type":"object"},"ContentCreationRewritePhrasesRequest":{"properties":{"content_type_label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content Type Label"},"full_draft":{"title":"Full Draft","type":"string"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"gemini/gemini-2.5-flash","title":"Model"},"segments":{"default":[],"items":{"$ref":"#/components/schemas/ContentCreationSegmentRewriteItem"},"title":"Segments","type":"array"},"tone_persona_helper":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona Helper"},"tone_persona_label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona Label"}},"required":["full_draft"],"title":"ContentCreationRewritePhrasesRequest","type":"object"},"ContentCreationRewriteSegmentsRequest":{"properties":{"content_type_label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content Type Label"},"full_draft":{"title":"Full Draft","type":"string"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"gemini/gemini-2.5-flash","title":"Model"},"segments":{"default":[],"items":{"$ref":"#/components/schemas/ContentCreationSegmentRewriteItem"},"title":"Segments","type":"array"},"tone_persona_helper":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona Helper"},"tone_persona_label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona Label"}},"required":["full_draft"],"title":"ContentCreationRewriteSegmentsRequest","type":"object"},"ContentCreationSegmentRewriteItem":{"properties":{"actions":{"default":[],"items":{"type":"string"},"title":"Actions","type":"array"},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Grade"},"persona_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Persona Name"},"risks":{"default":[],"items":{"type":"string"},"title":"Risks","type":"array"},"segment_text":{"title":"Segment Text","type":"string"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Summary"}},"required":["segment_text"],"title":"ContentCreationSegmentRewriteItem","type":"object"},"CoverageResponse":{"additionalProperties":true,"properties":{"coverage":{"description":"One entry per priority: text, level, covered, evidence.","items":{"additionalProperties":true,"type":"object"},"title":"Coverage","type":"array"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"parse_error":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Parse Error"}},"required":["coverage"],"title":"CoverageResponse","type":"object"},"CreateDocumentRequest":{"properties":{"content":{"title":"Content","type":"string"},"content_type":{"default":"text","title":"Content Type","type":"string"},"media_provenance":{"default":null,"title":"Media Provenance","type":"string"},"source_url":{"default":null,"title":"Source Url","type":"string"},"tags":{"default":[],"items":{"type":"string"},"title":"Tags","type":"array"},"title":{"title":"Title","type":"string"}},"required":["title","content"],"title":"CreateDocumentRequest","type":"object"},"CreatedDocumentRef":{"additionalProperties":true,"properties":{"character_count":{"title":"Character Count","type":"integer"},"content_type":{"title":"Content Type","type":"string"},"created_at":{"title":"Created At","type":"string"},"id":{"title":"Id","type":"string"},"title":{"title":"Title","type":"string"},"word_count":{"title":"Word Count","type":"integer"}},"required":["id","title","content_type","word_count","character_count","created_at"],"title":"CreatedDocumentRef","type":"object"},"DeAIifyRequest":{"properties":{"content_type_label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content Type Label"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"gemini/gemini-2.5-flash","title":"Model"},"selection_only":{"default":false,"title":"Selection Only","type":"boolean"},"text":{"title":"Text","type":"string"},"tone_persona_helper":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona Helper"},"tone_persona_label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona Label"}},"required":["text"],"title":"DeAIifyRequest","type":"object"},"DocumentAutoTag":{"additionalProperties":true,"properties":{"applied_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Applied At"},"confidence_score":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Confidence Score"},"extracted_value":{"examples":["Jane Doe"],"title":"Extracted Value","type":"string"},"name":{"examples":["Executives"],"title":"Name","type":"string"},"tag_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tag Type"}},"required":["name","extracted_value"],"title":"DocumentAutoTag","type":"object"},"DocumentAutoTagsResponse":{"additionalProperties":true,"properties":{"auto_tags":{"items":{"$ref":"#/components/schemas/AppliedAutoTag"},"title":"Auto Tags","type":"array"}},"required":["auto_tags"],"title":"DocumentAutoTagsResponse","type":"object"},"DocumentCountResponse":{"additionalProperties":true,"properties":{"count":{"examples":[128],"title":"Count","type":"integer"}},"required":["count"],"title":"DocumentCountResponse","type":"object"},"DocumentCreatedResponse":{"additionalProperties":true,"properties":{"document":{"$ref":"#/components/schemas/CreatedDocumentRef"},"message":{"default":"Document created successfully","title":"Message","type":"string"}},"required":["document"],"title":"DocumentCreatedResponse","type":"object"},"DocumentListResponse":{"additionalProperties":true,"properties":{"documents":{"items":{"$ref":"#/components/schemas/DocumentObject"},"title":"Documents","type":"array"},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["documents","pagination"],"title":"DocumentListResponse","type":"object"},"DocumentObject":{"additionalProperties":true,"properties":{"auto_tags":{"items":{"$ref":"#/components/schemas/DocumentAutoTag"},"title":"Auto Tags","type":"array"},"character_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Character Count"},"communication_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Communication Type"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Company"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Full text; omitted by list endpoints in light mode.","title":"Content"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"examples":["transcript"],"title":"Content Type"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Created At"},"executive":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Executive the document is attributed to.","title":"Executive"},"extracted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Extracted At"},"extracted_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"When the content was published, as extracted.","title":"Extracted Date"},"id":{"examples":["c0a8e2f4-1b7d-4e2a-8c9f-5d6e7a8b9c01"],"title":"Id","type":"string"},"is_narrative_testing_upload":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Is Narrative Testing Upload"},"media_provenance":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"owned, earned or paid.","title":"Media Provenance"},"processing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"fetching or enhancing while ingestion runs, failed on error, null when done.","title":"Processing Status"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"examples":["https://investors.example.com/q3-call"],"title":"Source Url"},"tags":{"items":{"type":"string"},"title":"Tags","type":"array"},"title":{"examples":["Acme Q3 earnings call transcript"],"title":"Title","type":"string"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Updated At"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"},"word_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"examples":[4210],"title":"Word Count"},"workspace_id":{"title":"Workspace Id","type":"string"}},"required":["id","workspace_id","title"],"title":"DocumentObject","type":"object"},"DocumentResponse":{"additionalProperties":true,"properties":{"document":{"$ref":"#/components/schemas/DocumentObject"}},"required":["document"],"title":"DocumentResponse","type":"object"},"DocumentUpdateRequest":{"additionalProperties":true,"properties":{"extracted_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO-8601 publication date to set.","examples":["2026-09-30"],"title":"Extracted Date"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"}},"title":"DocumentUpdateRequest","type":"object"},"DraftMetadata":{"additionalProperties":true,"properties":{"audience_persona_ids":{"items":{"type":"string"},"title":"Audience Persona Ids","type":"array"},"content_type_value":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content Type Value"},"prompt":{"default":"","title":"Prompt","type":"string"},"pull_through_priorities":{"items":{"$ref":"#/components/schemas/PullThroughPriority"},"title":"Pull Through Priorities","type":"array"},"source_document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Document Id"},"source_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Mode"},"test_history":{"items":{"additionalProperties":true,"type":"object"},"title":"Test History","type":"array"},"themes":{"items":{"type":"string"},"title":"Themes","type":"array"},"tone_persona_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone Persona Id"},"voice_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Voice Profile Id"}},"title":"DraftMetadata","type":"object"},"DraftObject":{"additionalProperties":true,"properties":{"character_count":{"default":0,"title":"Character Count","type":"integer"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Present when include_content is set, and on single-draft reads.","title":"Content"},"content_type":{"default":"text","title":"Content Type","type":"string"},"created_at":{"title":"Created At","type":"string"},"excerpt":{"default":"","title":"Excerpt","type":"string"},"id":{"title":"Id","type":"string"},"knowledgebase":{"default":"content-drafts","title":"Knowledgebase","type":"string"},"metadata":{"$ref":"#/components/schemas/DraftMetadata"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Url"},"title":{"examples":["Q3 margin story \u2014 LinkedIn post"],"title":"Title","type":"string"},"updated_at":{"title":"Updated At","type":"string"},"word_count":{"default":0,"title":"Word Count","type":"integer"}},"required":["id","title","created_at","updated_at"],"title":"DraftObject","type":"object"},"DraftResponse":{"additionalProperties":true,"properties":{"draft":{"$ref":"#/components/schemas/DraftObject"}},"required":["draft"],"title":"DraftResponse","type":"object"},"DraftSavedResponse":{"additionalProperties":true,"properties":{"draft":{"$ref":"#/components/schemas/DraftObject"},"knowledgebase_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Knowledgebase Name"},"message":{"title":"Message","type":"string"},"project_attached":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Project Attached"}},"required":["message","draft"],"title":"DraftSavedResponse","type":"object"},"DraftsListResponse":{"additionalProperties":true,"properties":{"count":{"title":"Count","type":"integer"},"drafts":{"items":{"$ref":"#/components/schemas/DraftObject"},"title":"Drafts","type":"array"},"knowledgebase":{"default":"content-drafts","title":"Knowledgebase","type":"string"}},"required":["drafts","count"],"title":"DraftsListResponse","type":"object"},"ExecuteWorkspaceSignalsRequest":{"properties":{"document_id":{"title":"Document Id","type":"string"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"User Id"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Workspace Id"}},"required":["document_id"],"title":"ExecuteWorkspaceSignalsRequest","type":"object"},"ExecutiveDetailsResponse":{"additionalProperties":true,"properties":{"cached_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Cached At"},"communication_types":{"additionalProperties":{"type":"integer"},"title":"Communication Types","type":"object"},"companies":{"items":{"type":"string"},"title":"Companies","type":"array"},"companies_mentioned":{"items":{"type":"string"},"title":"Companies Mentioned","type":"array"},"date_range":{"additionalProperties":true,"description":"earliest and latest document dates.","title":"Date Range","type":"object"},"documents":{"description":"Documents attributed to the executive (same shape as GET /api/v1/documents/{doc_id}).","items":{"additionalProperties":true,"type":"object"},"title":"Documents","type":"array"},"last_communication":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Last Communication"},"name":{"examples":["Jane Doe"],"title":"Name","type":"string"},"signals":{"description":"Up to ten recent signals extracted from those documents.","items":{"additionalProperties":true,"type":"object"},"title":"Signals","type":"array"},"themes_mentioned":{"items":{"type":"string"},"title":"Themes Mentioned","type":"array"},"total_documents":{"default":0,"title":"Total Documents","type":"integer"},"total_signals":{"default":0,"title":"Total Signals","type":"integer"},"unique_companies":{"default":0,"title":"Unique Companies","type":"integer"},"unique_themes":{"default":0,"title":"Unique Themes","type":"integer"}},"required":["name"],"title":"ExecutiveDetailsResponse","type":"object"},"ExecutiveVoice":{"additionalProperties":true,"properties":{"enabled":{"title":"Enabled","type":"boolean"},"executive":{"examples":["Jane Doe"],"title":"Executive","type":"string"},"persona_id":{"title":"Persona Id","type":"string"},"tuned":{"title":"Tuned","type":"boolean"}},"required":["executive","persona_id","enabled","tuned"],"title":"ExecutiveVoice","type":"object"},"ExecutiveVoiceEnabledRequest":{"additionalProperties":true,"properties":{"enabled":{"description":"True includes the voice in content creation, creating and tuning it when missing; false leaves it out but keeps the tuned persona.","title":"Enabled","type":"boolean"}},"required":["enabled"],"title":"ExecutiveVoiceEnabledRequest","type":"object"},"ExecutiveVoiceToggleRequest":{"additionalProperties":true,"properties":{"enabled":{"description":"True includes the voice in content creation, creating and tuning it when missing; false leaves it out but keeps the tuned persona.","title":"Enabled","type":"boolean"},"executive":{"description":"The executive's name as it appears on documents.","examples":["Jane Doe"],"title":"Executive","type":"string"}},"required":["enabled","executive"],"title":"ExecutiveVoiceToggleRequest","type":"object"},"ExecutiveVoiceToggleResponse":{"additionalProperties":true,"properties":{"created":{"description":"True when this call created the voice persona.","title":"Created","type":"boolean"},"enabled":{"description":"Read back from the persona after the write.","title":"Enabled","type":"boolean"},"executive":{"examples":["Jane Doe"],"title":"Executive","type":"string"},"persona_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Null when disabling a voice that never existed.","title":"Persona Id"},"tuned":{"title":"Tuned","type":"boolean"}},"required":["executive","enabled","tuned","created"],"title":"ExecutiveVoiceToggleResponse","type":"object"},"ExecutiveVoicesResponse":{"additionalProperties":true,"properties":{"auto_ceo":{"additionalProperties":true,"description":"State of the automatic CEO voice: status, executive, persona_id, attempted_at.","title":"Auto Ceo","type":"object"},"voices":{"items":{"$ref":"#/components/schemas/ExecutiveVoice"},"title":"Voices","type":"array"}},"required":["voices"],"title":"ExecutiveVoicesResponse","type":"object"},"ExtractedTextResponse":{"additionalProperties":true,"properties":{"character_count":{"title":"Character Count","type":"integer"},"content":{"description":"The extracted text.","title":"Content","type":"string"},"filename":{"title":"Filename","type":"string"},"word_count":{"title":"Word Count","type":"integer"}},"required":["content","filename","word_count","character_count"],"title":"ExtractedTextResponse","type":"object"},"FilterTagValue":{"additionalProperties":true,"properties":{"document_count":{"title":"Document Count","type":"integer"},"value":{"title":"Value","type":"string"}},"required":["value","document_count"],"title":"FilterTagValue","type":"object"},"FilterTagValuesResponse":{"additionalProperties":true,"properties":{"tag":{"additionalProperties":true,"description":"id, name and tag_type of the tag.","title":"Tag","type":"object"},"total":{"title":"Total","type":"integer"},"truncated":{"description":"True when more values exist than were returned; narrow with q.","title":"Truncated","type":"boolean"},"values":{"items":{"$ref":"#/components/schemas/FilterTagValue"},"title":"Values","type":"array"}},"required":["tag","values","total","truncated"],"title":"FilterTagValuesResponse","type":"object"},"GeneratedTextResponse":{"additionalProperties":true,"properties":{"content":{"description":"The generated or rewritten draft.","title":"Content","type":"string"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"truncated":{"default":false,"description":"True when the model hit its output limit; ask for a shorter piece.","title":"Truncated","type":"boolean"}},"required":["content"],"title":"GeneratedTextResponse","type":"object"},"IngestRequest":{"properties":{"audio_url":{"default":null,"title":"Audio Url","type":"string"},"content_type":{"default":"auto","description":"webpage, pdf, image, audio, youtube, or auto to detect from the URL.","title":"Content Type","type":"string"},"media_provenance":{"default":null,"title":"Media Provenance","type":"string"},"source_url":{"description":"The page, PDF, image, audio file or YouTube video to ingest.","title":"Source Url","type":"string"}},"required":["source_url"],"title":"IngestRequest","type":"object"},"IngestResponse":{"additionalProperties":true,"properties":{"character_count":{"default":0,"title":"Character Count","type":"integer"},"document_id":{"title":"Document Id","type":"string"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Set when the fetch could not be started; the status is still 200.","title":"Error"},"message":{"default":"Document ingested successfully","title":"Message","type":"string"},"processing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"fetching","description":"Poll GET /api/v1/documents/{doc_id} until this is null.","title":"Processing Status"},"scrape_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Scrape Job Id"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Url"},"success":{"default":true,"title":"Success","type":"boolean"},"title":{"description":"A placeholder until the fetch completes.","title":"Title","type":"string"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"},"word_count":{"default":0,"title":"Word Count","type":"integer"}},"required":["document_id","title"],"title":"IngestResponse","type":"object"},"IngestedDocument":{"additionalProperties":true,"properties":{"character_count":{"default":0,"title":"Character Count","type":"integer"},"document_id":{"title":"Document Id","type":"string"},"processing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"fetching","description":"Poll GET /api/v1/documents/{doc_id} until this is null.","title":"Processing Status"},"scrape_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Scrape Job Id"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Url"},"success":{"default":true,"title":"Success","type":"boolean"},"title":{"description":"A placeholder until the fetch completes.","title":"Title","type":"string"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"},"word_count":{"default":0,"title":"Word Count","type":"integer"}},"required":["document_id","title"],"title":"IngestedDocument","type":"object"},"InsightsRequest":{"additionalProperties":true,"properties":{"companies":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Companies to compare, for comparison_type=company.","title":"Companies"},"comparison_type":{"default":"executive","description":"executive or company.","title":"Comparison Type","type":"string"},"executives":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Executives to compare, by name.","examples":[["Jane Doe","John Roe"]],"title":"Executives"},"focus_question":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"examples":["Who is most credible on margin durability?"],"title":"Focus Question"},"fresh":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Bypass the cache.","title":"Fresh"},"own_company":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Your company, for the audience layer's 'on you' quotes.","title":"Own Company"},"personas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Persona ids whose audience read of the comparison to include.","title":"Personas"},"strategic_map":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Also produce the attack / defend / whitespace map.","title":"Strategic Map"},"theme":{"description":"The theme (signal template) to compare on.","examples":["Pricing power"],"title":"Theme","type":"string"},"themes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Compare across several themes at once.","title":"Themes"}},"required":["theme"],"title":"InsightsRequest","type":"object"},"InsightsResponse":{"additionalProperties":true,"properties":{"ai_analysis":{"additionalProperties":true,"description":"at_a_glance, similarities, differences, comparison_matrix, unique_perspectives.","title":"Ai Analysis","type":"object"},"audience_resonance":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"Per persona: scores, verdicts, take and quotes; present when personas were given.","title":"Audience Resonance"},"companies":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Companies"},"company_summaries":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Company Summaries"},"executive_summaries":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"Per executive: summary, statements, statement_count.","title":"Executive Summaries"},"executives":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Executives"},"focus_question":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Focus Question"},"strategic_map":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Strategic Map"},"theme":{"title":"Theme","type":"string"},"themes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Themes"},"total_signals":{"default":0,"title":"Total Signals","type":"integer"}},"required":["theme","ai_analysis"],"title":"InsightsResponse","type":"object"},"JobStatusResponse":{"additionalProperties":true,"properties":{"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Completed At"},"created_at":{"title":"Created At","type":"string"},"document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Document Id"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Error Message"},"id":{"examples":["job_7f3a9c2e"],"title":"Id","type":"string"},"job_type":{"examples":["audience_reactions"],"title":"Job Type","type":"string"},"max_retries":{"default":0,"title":"Max Retries","type":"integer"},"parameters":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The job's input, JSON-encoded as a string.","title":"Parameters"},"priority":{"default":0,"title":"Priority","type":"integer"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The job's output once completed, JSON-encoded as a string.","title":"Result"},"retry_count":{"default":0,"title":"Retry Count","type":"integer"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Started At"},"status":{"description":"queued, running, completed, failed, cancelled or retrying.","examples":["completed"],"title":"Status","type":"string"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"User Id"},"workspace_id":{"title":"Workspace Id","type":"string"}},"required":["id","job_type","status","workspace_id","created_at"],"title":"JobStatusResponse","type":"object"},"LinkableTag":{"additionalProperties":true,"properties":{"applied_count":{"description":"Documents the tag is applied to.","title":"Applied Count","type":"integer"},"id":{"title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"tag_type":{"title":"Tag Type","type":"string"}},"required":["id","name","tag_type","applied_count"],"title":"LinkableTag","type":"object"},"LinkableTagsResponse":{"additionalProperties":true,"properties":{"tags":{"items":{"$ref":"#/components/schemas/LinkableTag"},"title":"Tags","type":"array"}},"required":["tags"],"title":"LinkableTagsResponse","type":"object"},"MessageResponse":{"additionalProperties":true,"properties":{"message":{"title":"Message","type":"string"}},"required":["message"],"title":"MessageResponse","type":"object"},"Pagination":{"additionalProperties":true,"properties":{"page":{"description":"Page number, 1-based.","title":"Page","type":"integer"},"per_page":{"description":"Items per page.","title":"Per Page","type":"integer"},"total_count":{"description":"Items across all pages.","title":"Total Count","type":"integer"},"total_pages":{"title":"Total Pages","type":"integer"}},"required":["page","per_page","total_count","total_pages"],"title":"Pagination","type":"object"},"PersonaCategoriesResponse":{"additionalProperties":true,"properties":{"categories":{"examples":[["investors","customers","employees","media"]],"items":{"type":"string"},"title":"Categories","type":"array"}},"required":["categories"],"title":"PersonaCategoriesResponse","type":"object"},"PersonaCreateRequest":{"additionalProperties":true,"properties":{"avatar_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Avatar Prompt"},"avatar_source":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Avatar Source"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"http(s) image URL or a data:image base64 URL.","title":"Avatar Url"},"category":{"default":"general","description":"Audience category; see GET /api/v1/personas/categories.","examples":["investors"],"title":"Category","type":"string"},"communication_style":{"default":"","title":"Communication Style","type":"string"},"concerns":{"default":"","title":"Concerns","type":"string"},"description":{"default":"","description":"Who this persona is, in a sentence or two.","examples":["Runs finance at a mid-cap industrial; distrusts growth narratives without unit economics."],"title":"Description","type":"string"},"entity_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"person, organization or segment.","title":"Entity Kind"},"external_sources":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"External Sources"},"include_in_audience":{"default":true,"title":"Include In Audience","type":"boolean"},"include_in_voice_list":{"default":false,"title":"Include In Voice List","type":"boolean"},"instructions":{"default":"","description":"Behavioural instructions used when the persona reacts.","title":"Instructions","type":"string"},"interests":{"default":"","title":"Interests","type":"string"},"is_active":{"default":true,"title":"Is Active","type":"boolean"},"name":{"description":"Display name.","examples":["Skeptical CFO"],"title":"Name","type":"string"},"response_language":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP-47 language tag the persona answers in; omit to inherit the workspace market language.","examples":["en"],"title":"Response Language"},"social_links":{"anyOf":[{"items":{"$ref":"#/components/schemas/SocialLink"},"type":"array"},{"type":"null"}],"default":null,"title":"Social Links"},"source_persona_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Marketplace persona to link this one to.","title":"Source Persona Id"},"template":{"default":"","description":"A full system prompt; leave empty to let Kumkuat build one from the fields below.","title":"Template","type":"string"},"tone":{"default":"","title":"Tone","type":"string"},"voice_visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"workspace (default) or private.","title":"Voice Visibility"},"writing_sample_document_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Workspace document ids whose text defines the persona's writing voice.","title":"Writing Sample Document Ids"}},"required":["name"],"title":"PersonaCreateRequest","type":"object"},"PersonaCreatedResponse":{"additionalProperties":true,"properties":{"message":{"default":"Persona created successfully","title":"Message","type":"string"},"persona_id":{"examples":["d4e9b2a1-6c3f-4b8e-9f21-0a7c5e3d1b60"],"title":"Persona Id","type":"string"}},"required":["persona_id"],"title":"PersonaCreatedResponse","type":"object"},"PersonaDraftRequest":{"additionalProperties":true,"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Category"},"communication_style":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Communication Style"},"concerns":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Concerns"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"interests":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Interests"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"name":{"description":"The persona's name; the other fields are generated around it.","examples":["Skeptical CFO"],"title":"Name","type":"string"},"overwrite_existing":{"default":false,"description":"Regenerate fields you already filled in.","title":"Overwrite Existing","type":"boolean"},"template":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Template"},"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone"},"writing_sample_document_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Writing Sample Document Ids"}},"required":["name"],"title":"PersonaDraftRequest","type":"object"},"PersonaDraftResponse":{"additionalProperties":true,"properties":{"generated_fields":{"items":{"type":"string"},"title":"Generated Fields","type":"array"},"invalid_writing_sample_document_ids":{"items":{"type":"string"},"title":"Invalid Writing Sample Document Ids","type":"array"},"persona":{"additionalProperties":true,"description":"The generated fields, ready to POST to /api/v1/personas.","title":"Persona","type":"object"},"success":{"default":true,"title":"Success","type":"boolean"},"used_model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Used Model"},"writing_sample_document_ids":{"items":{"type":"string"},"title":"Writing Sample Document Ids","type":"array"},"writing_samples_considered":{"default":0,"title":"Writing Samples Considered","type":"integer"}},"required":["persona","generated_fields"],"title":"PersonaDraftResponse","type":"object"},"PersonaFeedbackRequest":{"additionalProperties":true,"properties":{"description":{"description":"What was right or wrong about the reply, up to 4000 characters. A negative note becomes a refinement the persona applies from then on.","examples":["Too eager to accept the pricing change; a CFO would ask about churn first."],"title":"Description","type":"string"},"feedback_type":{"description":"positive or negative.","examples":["negative"],"title":"Feedback Type","type":"string"},"interaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Interaction Id"},"message_content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The reply being rated, when there is no interaction id.","title":"Message Content"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Metadata"},"persona_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Persona Mode"},"persona_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Persona Name"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Chat session the reply belongs to.","title":"Session Id"}},"required":["feedback_type","description"],"title":"PersonaFeedbackRequest","type":"object"},"PersonaFeedbackResponse":{"additionalProperties":true,"properties":{"feedback_id":{"title":"Feedback Id","type":"string"},"message":{"default":"Persona feedback recorded successfully","title":"Message","type":"string"},"refinement":{"anyOf":[{"$ref":"#/components/schemas/PersonaRefinement"},{"type":"null"}],"default":null,"description":"The refinement created from negative feedback; null otherwise."}},"required":["feedback_id"],"title":"PersonaFeedbackResponse","type":"object"},"PersonaGenerateContentRequest":{"additionalProperties":true,"properties":{"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"e.g. linkedin_post, email, press_release, blog.","examples":["linkedin_post"],"title":"Content Type"},"length":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"short, medium or long.","title":"Length"},"reference_document_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Workspace documents to draw facts from.","title":"Reference Document Ids"},"topic":{"description":"What to write about.","examples":["Why our Q3 margin expansion is durable"],"title":"Topic","type":"string"},"voice_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Write in one of the persona's named voice profiles.","title":"Voice Profile Id"}},"required":["topic"],"title":"PersonaGenerateContentRequest","type":"object"},"PersonaGenerateContentResponse":{"additionalProperties":true,"properties":{"content":{"title":"Content","type":"string"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content Type"},"document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The draft was saved as this workspace document; null when saving failed.","title":"Document Id"},"model_used":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model Used"},"truncated":{"default":false,"title":"Truncated","type":"boolean"},"voice_profile_used":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Voice Profile Used"},"warning":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Warning"}},"required":["content"],"title":"PersonaGenerateContentResponse","type":"object"},"PersonaInteractRequest":{"additionalProperties":true,"properties":{"context_document_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Workspace documents to ground the reply on, as in a chat session with attachments.","title":"Context Document Ids"},"document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A workspace document to react to; its content is added to the prompt and the type defaults to analysis.","title":"Document Id"},"enable_follow_up_questions":{"default":false,"description":"Append suggested follow-up questions to the reply.","title":"Enable Follow Up Questions","type":"boolean"},"ground_with_google_search":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Let the model search the web before answering.","title":"Ground With Google Search"},"input_content":{"description":"What to put in front of the persona: a question, a draft, or pasted text.","examples":["We are moving to usage-based pricing next quarter. How does that land with you?"],"title":"Input Content","type":"string"},"interaction_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A label for this interaction, kept with the record.","title":"Interaction Name"},"interaction_type":{"default":"communication","description":"communication (react to content), conversation (chat), analysis (reason over a document) or simulation.","examples":["conversation"],"title":"Interaction Type","type":"string"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Legacy alias for input_content.","title":"Message"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Override the workspace's default model for this call.","title":"Model"},"persona_id":{"description":"The persona to ask. Also accepts the persona's exact name.","examples":["d4e9b2a1-6c3f-4b8e-9f21-0a7c5e3d1b60"],"title":"Persona Id","type":"string"},"persona_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"An inline persona (name, description, tone, interests, concerns, communication_style) used instead of a stored one.","title":"Persona Override"},"response_language":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP-47 tag for the reply language; defaults to the persona's, then the workspace market language.","title":"Response Language"},"voice_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Answer in one of the persona's named voice profiles instead of the default.","title":"Voice Profile Id"}},"required":["persona_id","input_content"],"title":"PersonaInteractRequest","type":"object"},"PersonaInteractResponse":{"additionalProperties":true,"properties":{"grounded_context_selection":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"Which grounded-context items the reply carried and which were dropped for budget.","title":"Grounded Context Selection"},"grounded_context_suggestion":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"Present when the question sits off the persona's corpus and grounding would help.","title":"Grounded Context Suggestion"},"interaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Id of the stored interaction; null when nothing was persisted.","title":"Interaction Id"},"message":{"default":"Persona interaction completed","title":"Message","type":"string"},"output_content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The persona's reply, verbatim.","examples":["Usage-based pricing tells me you expect customers to grow into the product. Show me the cohort data before I believe the revenue line."],"title":"Output Content"},"persona_id":{"title":"Persona Id","type":"string"},"persona_id_resolved_from":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"id when persona_id matched directly, name when it was resolved from the persona's name.","title":"Persona Id Resolved From"},"persona_response":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Same as output_content.","title":"Persona Response"},"response":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Legacy alias for persona_response.","title":"Response"},"response_language":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"examples":["en"],"title":"Response Language"},"translation_target_language":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Translation Target Language"},"translation_target_language_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Translation Target Language Name"}},"required":["persona_id"],"title":"PersonaInteractResponse","type":"object"},"PersonaListResponse":{"additionalProperties":true,"properties":{"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Absent in summary mode.","title":"Limit"},"offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Offset"},"personas":{"items":{"$ref":"#/components/schemas/PersonaObject"},"title":"Personas","type":"array"},"total":{"description":"Personas matching the filters, before limit/offset.","title":"Total","type":"integer"}},"required":["personas","total"],"title":"PersonaListResponse","type":"object"},"PersonaObject":{"additionalProperties":true,"properties":{"avatar_source":{"default":"","title":"Avatar Source","type":"string"},"avatar_url":{"default":"","title":"Avatar Url","type":"string"},"category":{"description":"Audience category the persona belongs to.","examples":["investors"],"title":"Category","type":"string"},"communication_style":{"default":"","title":"Communication Style","type":"string"},"concerns":{"default":"","title":"Concerns","type":"string"},"created_at":{"examples":["2026-09-29T16:40:12+00:00"],"title":"Created At","type":"string"},"created_by":{"default":"system","title":"Created By","type":"string"},"default_voice_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Default Voice Profile Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"examples":["Runs finance at a mid-cap industrial; distrusts growth narratives without unit economics."],"title":"Description"},"entity_kind":{"default":"","description":"person, organization, segment or empty when not set.","title":"Entity Kind","type":"string"},"entity_kind_resolved":{"default":"","title":"Entity Kind Resolved","type":"string"},"external_sources":{"items":{"additionalProperties":true,"type":"object"},"title":"External Sources","type":"array"},"grounded_statements":{"description":"Statements the persona is grounded on, with their sources.","items":{"additionalProperties":true,"type":"object"},"title":"Grounded Statements","type":"array"},"health_state":{"additionalProperties":true,"title":"Health State","type":"object"},"id":{"examples":["d4e9b2a1-6c3f-4b8e-9f21-0a7c5e3d1b60"],"title":"Id","type":"string"},"include_in_audience":{"default":true,"description":"Whether the persona takes part in audience-wide reactions.","title":"Include In Audience","type":"boolean"},"include_in_voice_list":{"default":false,"description":"Whether the persona is offered as a writing voice.","title":"Include In Voice List","type":"boolean"},"instructions":{"default":"","description":"How the persona should behave when it reacts.","title":"Instructions","type":"string"},"interests":{"default":"","title":"Interests","type":"string"},"is_active":{"default":true,"title":"Is Active","type":"boolean"},"is_linked_to_source":{"default":false,"title":"Is Linked To Source","type":"boolean"},"is_marketplace_managed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Is Marketplace Managed"},"labels":{"items":{"type":"string"},"title":"Labels","type":"array"},"linked_knowledgebase_ids":{"items":{"type":"string"},"title":"Linked Knowledgebase Ids","type":"array"},"name":{"examples":["Skeptical CFO"],"title":"Name","type":"string"},"refresh_policy":{"additionalProperties":true,"title":"Refresh Policy","type":"object"},"response_language":{"default":"","description":"BCP-47 language the persona answers in; empty inherits the workspace market language.","title":"Response Language","type":"string"},"social_links":{"items":{"$ref":"#/components/schemas/SocialLink"},"title":"Social Links","type":"array"},"source_persona_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Marketplace persona this one is linked to, if any.","title":"Source Persona Id"},"template":{"default":"","description":"The persona's system prompt.","title":"Template","type":"string"},"tone":{"default":"","title":"Tone","type":"string"},"updated_at":{"examples":["2026-10-05T09:12:44+00:00"],"title":"Updated At","type":"string"},"version":{"default":1,"title":"Version","type":"integer"},"voice_profiles":{"items":{"additionalProperties":true,"type":"object"},"title":"Voice Profiles","type":"array"},"voice_visibility":{"default":"workspace","description":"workspace or private.","title":"Voice Visibility","type":"string"},"workspace_id":{"title":"Workspace Id","type":"string"},"writing_sample_document_ids":{"items":{"type":"string"},"title":"Writing Sample Document Ids","type":"array"}},"required":["id","workspace_id","name","category","created_at","updated_at"],"title":"PersonaObject","type":"object"},"PersonaRefinement":{"additionalProperties":true,"properties":{"content":{"title":"Content","type":"string"},"created_at":{"title":"Created At","type":"string"},"feedback_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Feedback Type"},"id":{"title":"Id","type":"string"},"is_active":{"default":true,"title":"Is Active","type":"boolean"},"persona_id":{"title":"Persona Id","type":"string"},"source":{"default":"feedback","title":"Source","type":"string"},"source_feedback_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Feedback Id"},"updated_at":{"title":"Updated At","type":"string"},"workspace_id":{"title":"Workspace Id","type":"string"}},"required":["id","persona_id","workspace_id","content","created_at","updated_at"],"title":"PersonaRefinement","type":"object"},"PersonaResponse":{"additionalProperties":true,"properties":{"persona":{"$ref":"#/components/schemas/PersonaObject"}},"required":["persona"],"title":"PersonaResponse","type":"object"},"PersonaUpdateRequest":{"additionalProperties":true,"properties":{"avatar_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Avatar Prompt"},"avatar_source":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Avatar Source"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Avatar Url"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Category"},"communication_style":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Communication Style"},"concerns":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Concerns"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"entity_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Entity Kind"},"external_sources":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"External Sources"},"include_in_audience":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Include In Audience"},"include_in_voice_list":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Include In Voice List"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Instructions"},"interests":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Interests"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Is Active"},"labels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Labels"},"linked_knowledgebase_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Linked Knowledgebase Ids"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Name"},"response_language":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Response Language"},"social_links":{"anyOf":[{"items":{"$ref":"#/components/schemas/SocialLink"},"type":"array"},{"type":"null"}],"default":null,"title":"Social Links"},"template":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Template"},"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone"},"voice_perspective":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Voice Perspective"},"voice_profile":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"Replace the default voice profile.","title":"Voice Profile"},"voice_visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"workspace or private.","title":"Voice Visibility"},"writing_sample_document_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Writing Sample Document Ids"}},"title":"PersonaUpdateRequest","type":"object"},"PullThroughPrioritiesRequest":{"additionalProperties":true,"properties":{"priorities":{"description":"Replaces the whole list.","items":{"$ref":"#/components/schemas/PullThroughPriority"},"title":"Priorities","type":"array"}},"required":["priorities"],"title":"PullThroughPrioritiesRequest","type":"object"},"PullThroughPrioritiesResponse":{"additionalProperties":true,"properties":{"priorities":{"items":{"$ref":"#/components/schemas/PullThroughPriority"},"title":"Priorities","type":"array"}},"required":["priorities"],"title":"PullThroughPrioritiesResponse","type":"object"},"PullThroughPriority":{"additionalProperties":true,"properties":{"from_kb":{"default":false,"title":"From Kb","type":"boolean"},"level":{"default":"must","description":"must, should or nice.","title":"Level","type":"string"},"text":{"examples":["Margin expansion is structural, not one-off"],"title":"Text","type":"string"}},"required":["text"],"title":"PullThroughPriority","type":"object"},"QualityCheckResponse":{"additionalProperties":true,"properties":{"ai_detection":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Ai Detection"},"grammar":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Grammar"},"provider":{"title":"Provider","type":"string"},"spelling":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Spelling"}},"required":["provider"],"title":"QualityCheckResponse","type":"object"},"QueryRequest":{"properties":{"doc_id":{"title":"Doc Id","type":"string"},"model":{"default":"gpt-3.5-turbo","title":"Model","type":"string"},"query_template":{"title":"Query Template","type":"string"}},"required":["query_template","doc_id"],"title":"QueryRequest","type":"object"},"QueryResponse":{"additionalProperties":true,"properties":{"response":{"description":"The answer, as text.","title":"Response","type":"string"}},"required":["response"],"title":"QueryResponse","type":"object"},"ReactionDocument":{"additionalProperties":true,"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The text to react to when no id is given.","title":"Content"},"document_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"examples":["press_release"],"title":"Document Type"},"executive":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Executive"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A workspace document id. Give either id, or title plus content.","title":"Id"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"examples":["Q3 pricing announcement"],"title":"Title"}},"title":"ReactionDocument","type":"object"},"ReactionDocumentRef":{"additionalProperties":true,"properties":{"document_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Document Hash"},"document_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Document Type"},"executive":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Executive"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Id"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"}},"title":"ReactionDocumentRef","type":"object"},"ReactionHistoryEntry":{"additionalProperties":true,"properties":{"cache_key":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Cache Key"},"document_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Document Hash"},"document_id":{"title":"Document Id","type":"string"},"generated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Generated At"},"generation_source":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Generation Source"},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Grade"},"id":{"title":"Id","type":"string"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"output_content":{"default":"","title":"Output Content","type":"string"},"persona_id":{"title":"Persona Id","type":"string"},"persona_name":{"title":"Persona Name","type":"string"},"status_counts":{"$ref":"#/components/schemas/StatusCounts"}},"required":["id","persona_id","persona_name","document_id"],"title":"ReactionHistoryEntry","type":"object"},"ReactionHistoryResponse":{"additionalProperties":true,"properties":{"count":{"title":"Count","type":"integer"},"document_id":{"title":"Document Id","type":"string"},"entries":{"items":{"$ref":"#/components/schemas/ReactionHistoryEntry"},"title":"Entries","type":"array"},"persona_id":{"title":"Persona Id","type":"string"}},"required":["entries","count","persona_id","document_id"],"title":"ReactionHistoryResponse","type":"object"},"ReactionInsight":{"additionalProperties":true,"properties":{"cache_hit":{"default":false,"title":"Cache Hit","type":"boolean"},"document":{"$ref":"#/components/schemas/ReactionDocumentRef"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Error Message"},"generated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Generated At"},"generation_source":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Generation Source"},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Letter grade the persona gave, A to F.","examples":["B"],"title":"Grade"},"insight_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Insight Id"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"output_content":{"description":"The reaction as prose.","title":"Output Content","type":"string"},"output_json":{"additionalProperties":true,"description":"The structured reaction: key_judgments, evidence_and_signals, implications_and_actions, counterpoints_and_risks.","title":"Output Json","type":"object"},"persona":{"$ref":"#/components/schemas/ReactionPersonaRef"},"prompt_version":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Prompt Version"},"response_language":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Response Language"},"status":{"default":"completed","description":"completed, failed or timed_out.","title":"Status","type":"string"},"status_counts":{"$ref":"#/components/schemas/StatusCounts"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Updated At"},"why_it_matters":{"anyOf":[{"$ref":"#/components/schemas/WhyItMattersResponse"},{"type":"null"}],"default":null,"description":"Only when the request listed `why_it_matters` in `include`; null when it could not be generated."}},"required":["persona","document","output_content"],"title":"ReactionInsight","type":"object"},"ReactionInsightsRequest":{"additionalProperties":true,"properties":{"document":{"$ref":"#/components/schemas/ReactionDocument","description":"What they react to."},"force_refresh":{"default":false,"description":"Regenerate even when a cached reaction exists.","title":"Force Refresh","type":"boolean"},"generation_source":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"examples":["api"],"title":"Generation Source"},"include":{"description":"Extra sections to return on each reaction. `why_it_matters`: a grounded note on why this document matters to that persona, one web-grounded model call per persona, cached for 7 days. Needs the Why-this-matters feature on the workspace; when it is off the field comes back null.","examples":[["why_it_matters"]],"items":{"type":"string"},"title":"Include","type":"array"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"personas":{"description":"Who reacts. One entry per persona; batches are capped.","examples":[[{"id":"d4e9b2a1-6c3f-4b8e-9f21-0a7c5e3d1b60"}]],"items":{"$ref":"#/components/schemas/ReactionPersonaEntry"},"title":"Personas","type":"array"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Attach the run to a project.","title":"Project Id"},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Group these reactions under a run.","title":"Run Id"},"skip_save":{"default":false,"description":"Do not persist the generated reactions.","title":"Skip Save","type":"boolean"}},"required":["personas","document"],"title":"ReactionInsightsRequest","type":"object"},"ReactionInsightsResponse":{"additionalProperties":true,"properties":{"cache_hits":{"title":"Cache Hits","type":"integer"},"document":{"$ref":"#/components/schemas/ReactionDocumentRef"},"failed":{"title":"Failed","type":"integer"},"generated":{"title":"Generated","type":"integer"},"insights":{"items":{"$ref":"#/components/schemas/ReactionInsight"},"title":"Insights","type":"array"},"message":{"default":"Persona reaction insights ready","title":"Message","type":"string"},"project_attached":{"default":false,"title":"Project Attached","type":"boolean"},"prompt_version":{"title":"Prompt Version","type":"string"},"timed_out":{"title":"Timed Out","type":"integer"},"translation_target_language":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Translation Target Language"},"translation_target_language_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Translation Target Language Name"},"why_it_matters":{"anyOf":[{"$ref":"#/components/schemas/WhyItMattersSummary"},{"type":"null"}],"default":null,"description":"Only when the request listed `why_it_matters` in `include`."},"workspace_id":{"title":"Workspace Id","type":"string"}},"required":["workspace_id","prompt_version","cache_hits","generated","failed","timed_out","document","insights"],"title":"ReactionInsightsResponse","type":"object"},"ReactionPersonaEntry":{"additionalProperties":true,"properties":{"communication_style":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Communication Style"},"concerns":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Concerns"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A stored persona id. Omit it and pass name/description/tone to react as an inline persona.","title":"Id"},"interests":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Interests"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Name"},"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tone"}},"title":"ReactionPersonaEntry","type":"object"},"ReactionPersonaRef":{"additionalProperties":true,"properties":{"description":{"default":"","title":"Description","type":"string"},"id":{"title":"Id","type":"string"},"name":{"title":"Name","type":"string"}},"required":["id","name"],"title":"ReactionPersonaRef","type":"object"},"ReportCreateRequest":{"additionalProperties":true,"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Used to propose the report's sections.","title":"Description"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"title":{"examples":["Weekly narrative scorecard"],"title":"Title","type":"string"}},"required":["title"],"title":"ReportCreateRequest","type":"object"},"ReportCreatedResponse":{"additionalProperties":true,"properties":{"auto_generated":{"description":"True when sections were proposed from the description.","title":"Auto Generated","type":"boolean"},"report":{"$ref":"#/components/schemas/ReportObject"}},"required":["report","auto_generated"],"title":"ReportCreatedResponse","type":"object"},"ReportGenerateResponse":{"additionalProperties":true,"properties":{"errors":{"items":{"additionalProperties":true,"type":"object"},"title":"Errors","type":"array"},"generated_count":{"title":"Generated Count","type":"integer"},"report":{"$ref":"#/components/schemas/ReportObject"},"stale_count":{"title":"Stale Count","type":"integer"}},"required":["report","generated_count","stale_count"],"title":"ReportGenerateResponse","type":"object"},"ReportObject":{"additionalProperties":true,"properties":{"created_at":{"title":"Created At","type":"string"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Created By"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"id":{"title":"Id","type":"string"},"is_template":{"default":false,"title":"Is Template","type":"boolean"},"layout_config":{"additionalProperties":true,"title":"Layout Config","type":"object"},"sections":{"anyOf":[{"items":{"$ref":"#/components/schemas/ReportSection"},"type":"array"},{"type":"null"}],"default":null,"description":"Present on single-report reads.","title":"Sections"},"title":{"examples":["Weekly narrative scorecard"],"title":"Title","type":"string"},"updated_at":{"title":"Updated At","type":"string"},"workspace_id":{"title":"Workspace Id","type":"string"}},"required":["id","workspace_id","title","created_at","updated_at"],"title":"ReportObject","type":"object"},"ReportResponse":{"additionalProperties":true,"properties":{"report":{"$ref":"#/components/schemas/ReportObject"}},"required":["report"],"title":"ReportResponse","type":"object"},"ReportSection":{"additionalProperties":true,"properties":{"cached_output":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"The last generated output.","title":"Cached Output"},"created_at":{"title":"Created At","type":"string"},"data_scope":{"additionalProperties":true,"title":"Data Scope","type":"object"},"display_type":{"default":"narrative","description":"cards, table, narrative or grade_bar.","title":"Display Type","type":"string"},"generated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Generated At"},"id":{"title":"Id","type":"string"},"is_stale":{"default":true,"title":"Is Stale","type":"boolean"},"prompt_template":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Prompt Template"},"report_id":{"title":"Report Id","type":"string"},"section_type":{"description":"prompt_analysis, aggregate_summary or data_table.","title":"Section Type","type":"string"},"sort_order":{"default":0,"title":"Sort Order","type":"integer"},"title":{"title":"Title","type":"string"},"updated_at":{"title":"Updated At","type":"string"}},"required":["id","report_id","title","section_type","created_at","updated_at"],"title":"ReportSection","type":"object"},"ReportsListResponse":{"additionalProperties":true,"properties":{"reports":{"items":{"$ref":"#/components/schemas/ReportObject"},"title":"Reports","type":"array"}},"required":["reports"],"title":"ReportsListResponse","type":"object"},"RewritesResponse":{"additionalProperties":true,"properties":{"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"rewrites":{"description":"One rewrite per submitted segment.","items":{"additionalProperties":true,"type":"object"},"title":"Rewrites","type":"array"}},"required":["rewrites"],"title":"RewritesResponse","type":"object"},"SocialLink":{"additionalProperties":true,"properties":{"platform":{"examples":["linkedin"],"title":"Platform","type":"string"},"url":{"examples":["https://www.linkedin.com/in/example"],"title":"Url","type":"string"}},"required":["platform","url"],"title":"SocialLink","type":"object"},"StatusCounts":{"additionalProperties":true,"properties":{"bad":{"default":0,"title":"Bad","type":"integer"},"good":{"default":0,"title":"Good","type":"integer"},"warn":{"default":0,"title":"Warn","type":"integer"}},"title":"StatusCounts","type":"object"},"SuggestionsResponse":{"additionalProperties":true,"properties":{"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Set when the text was too short to analyse.","title":"Message"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"suggestions":{"description":"Edits as original/replacement pairs with a reason.","items":{"additionalProperties":true,"type":"object"},"title":"Suggestions","type":"array"}},"required":["suggestions"],"title":"SuggestionsResponse","type":"object"},"SummaryResponse":{"additionalProperties":true,"properties":{"cache_hit":{"title":"Cache Hit","type":"boolean"},"refreshing_due_to_pillars":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Refreshing Due To Pillars"},"stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True when a stale cached record was served while a refresh runs.","title":"Stale"},"summary":{"anyOf":[{"$ref":"#/components/schemas/AudienceSummaryRecord"},{"type":"null"}],"default":null,"description":"Null when there are no reactions in the window."}},"required":["cache_hit"],"title":"SummaryResponse","type":"object"},"TextQualityCheckRequest":{"properties":{"include_ai_detection":{"default":true,"title":"Include Ai Detection","type":"boolean"},"include_grammar":{"default":true,"title":"Include Grammar","type":"boolean"},"include_spelling":{"default":true,"title":"Include Spelling","type":"boolean"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Session Id"},"text":{"title":"Text","type":"string"}},"required":["text"],"title":"TextQualityCheckRequest","type":"object"},"TextQualityFeedbackRequest":{"properties":{"edit_id":{"title":"Edit Id","type":"string"}},"required":["edit_id"],"title":"TextQualityFeedbackRequest","type":"object"},"ThemeExtraction":{"additionalProperties":true,"properties":{"auto_tags":{"items":{"$ref":"#/components/schemas/DocumentAutoTag"},"title":"Auto Tags","type":"array"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content Type"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Created At"},"document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Document Id"},"extracted_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Extracted Date"},"json_data":{"additionalProperties":true,"description":"extractions: the statements found, each with extraction, justification and executive.","title":"Json Data","type":"object"},"signal_id":{"title":"Signal Id","type":"string"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Url"},"template_category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Template Category"},"template_id":{"title":"Template Id","type":"string"},"template_name":{"examples":["Pricing power"],"title":"Template Name","type":"string"}},"required":["signal_id","template_id","template_name"],"title":"ThemeExtraction","type":"object"},"ThemeFilterExecutive":{"additionalProperties":true,"properties":{"companies":{"items":{"type":"string"},"title":"Companies","type":"array"},"display":{"title":"Display","type":"string"},"executive":{"title":"Executive","type":"string"}},"required":["executive","display"],"title":"ThemeFilterExecutive","type":"object"},"ThemeFiltersResponse":{"additionalProperties":true,"properties":{"companies":{"items":{"type":"string"},"title":"Companies","type":"array"},"content_types":{"items":{"type":"string"},"title":"Content Types","type":"array"},"executives":{"items":{"$ref":"#/components/schemas/ThemeFilterExecutive"},"title":"Executives","type":"array"},"pillars":{"items":{"type":"string"},"title":"Pillars","type":"array"},"theme_metadata":{"description":"theme and pillar pairs.","items":{"additionalProperties":true,"type":"object"},"title":"Theme Metadata","type":"array"},"theme_to_pillar":{"additionalProperties":{"type":"string"},"title":"Theme To Pillar","type":"object"},"themes":{"items":{"type":"string"},"title":"Themes","type":"array"}},"required":["executives","themes"],"title":"ThemeFiltersResponse","type":"object"},"ThemesPagination":{"additionalProperties":true,"properties":{"page":{"description":"Page number, 1-based.","title":"Page","type":"integer"},"per_page":{"description":"Items per page.","title":"Per Page","type":"integer"},"total_count":{"description":"Items across all pages.","title":"Total Count","type":"integer"},"total_extractions":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Total Extractions"},"total_pages":{"title":"Total Pages","type":"integer"}},"required":["page","per_page","total_count","total_pages"],"title":"ThemesPagination","type":"object"},"ThemesResponse":{"additionalProperties":true,"properties":{"pagination":{"$ref":"#/components/schemas/ThemesPagination"},"themes":{"items":{"$ref":"#/components/schemas/ThemeExtraction"},"title":"Themes","type":"array"}},"required":["themes","pagination"],"title":"ThemesResponse","type":"object"},"ValidationErrorModel":{"properties":{"ctx":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"An optional object which contains values required to render the error message.","title":"Error context"},"input":{"description":"The input provided for validation.","title":"Input"},"loc":{"description":"The error's location as a list.","items":{},"title":"Location","type":"array"},"msg":{"description":"A human readable explanation of the error.","title":"Message","type":"string"},"type":{"description":"A computer-readable identifier of the error type.","title":"Error Type","type":"string"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The URL to further information about the error.","title":"URL"}},"required":["type","loc","msg","input"],"title":"ValidationErrorModel","type":"object"},"VoiceCreateRequest":{"additionalProperties":true,"properties":{"executive":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Materialise this executive, as named on the workspace's documents, as a tuned voice. Idempotent: an existing voice is re-enabled.","examples":["Jane Doe"],"title":"Executive"},"persona_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Offer an existing persona as a voice instead. Send exactly one of executive or persona_id.","title":"Persona Id"}},"title":"VoiceCreateRequest","type":"object"},"VoiceCreatedResponse":{"additionalProperties":true,"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Category"},"created":{"description":"True when a new persona was created for the executive.","title":"Created","type":"boolean"},"enabled":{"description":"Whether the voice is offered in content creation.","title":"Enabled","type":"boolean"},"executive":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The executive's name as it appears on documents; null for an ordinary persona.","title":"Executive"},"kind":{"description":"`executive` for a voice materialised from an executive's own statements, else `persona`.","examples":["executive"],"title":"Kind","type":"string"},"name":{"examples":["Jane Doe"],"title":"Name","type":"string"},"persona_id":{"examples":["d4e9b2a1-6c3f-4b8e-9f21-0a7c5e3d1b60"],"title":"Persona Id","type":"string"},"tuned":{"description":"Whether a voice profile has been analysed from writing samples or statements.","title":"Tuned","type":"boolean"}},"required":["persona_id","name","kind","enabled","tuned","created"],"title":"VoiceCreatedResponse","type":"object"},"VoiceEnabledRequest":{"additionalProperties":true,"properties":{"enabled":{"description":"True offers the voice in content creation; false withdraws it but keeps the persona and its tuning.","title":"Enabled","type":"boolean"}},"required":["enabled"],"title":"VoiceEnabledRequest","type":"object"},"VoiceObject":{"additionalProperties":true,"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Category"},"enabled":{"description":"Whether the voice is offered in content creation.","title":"Enabled","type":"boolean"},"executive":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The executive's name as it appears on documents; null for an ordinary persona.","title":"Executive"},"kind":{"description":"`executive` for a voice materialised from an executive's own statements, else `persona`.","examples":["executive"],"title":"Kind","type":"string"},"name":{"examples":["Jane Doe"],"title":"Name","type":"string"},"persona_id":{"examples":["d4e9b2a1-6c3f-4b8e-9f21-0a7c5e3d1b60"],"title":"Persona Id","type":"string"},"tuned":{"description":"Whether a voice profile has been analysed from writing samples or statements.","title":"Tuned","type":"boolean"}},"required":["persona_id","name","kind","enabled","tuned"],"title":"VoiceObject","type":"object"},"VoicesResponse":{"additionalProperties":true,"properties":{"total":{"title":"Total","type":"integer"},"voices":{"items":{"$ref":"#/components/schemas/VoiceObject"},"title":"Voices","type":"array"}},"required":["voices","total"],"title":"VoicesResponse","type":"object"},"WhyItMattersRequest":{"additionalProperties":true,"properties":{"document":{"$ref":"#/components/schemas/ReactionDocument"},"force_refresh":{"default":false,"title":"Force Refresh","type":"boolean"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"persona":{"anyOf":[{"$ref":"#/components/schemas/ReactionPersonaEntry"},{"type":"null"}],"default":null},"persona_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A stored persona. Alternatively pass an inline persona object.","title":"Persona Id"}},"required":["document"],"title":"WhyItMattersRequest","type":"object"},"WhyItMattersResponse":{"additionalProperties":true,"properties":{"answer":{"description":"Why the document matters to this persona, grounded on current web sources and their statements.","title":"Answer","type":"string"},"cache_hit":{"default":false,"title":"Cache Hit","type":"boolean"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Expires At"},"generated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Generated At"},"grounded":{"title":"Grounded","type":"boolean"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"sources":{"description":"The statements and documents the answer cites.","items":{"additionalProperties":true,"type":"object"},"title":"Sources","type":"array"}},"required":["answer","grounded"],"title":"WhyItMattersResponse","type":"object"},"WhyItMattersSummary":{"additionalProperties":true,"properties":{"cache_hits":{"default":0,"title":"Cache Hits","type":"integer"},"enabled":{"description":"False when the Why-this-matters feature is off for the workspace; every insight then carries null.","title":"Enabled","type":"boolean"},"failed":{"default":0,"title":"Failed","type":"integer"},"generated":{"default":0,"title":"Generated","type":"integer"},"requested":{"default":0,"title":"Requested","type":"integer"}},"required":["enabled"],"title":"WhyItMattersSummary","type":"object"},"WorkspaceResponse":{"additionalProperties":true,"properties":{"company":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Company name the workspace monitors.","title":"Company"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Created At"},"description":{"default":"","title":"Description","type":"string"},"is_active":{"default":true,"title":"Is Active","type":"boolean"},"is_owner":{"title":"Is Owner","type":"boolean"},"name":{"examples":["Acme Corp"],"title":"Name","type":"string"},"role":{"description":"The key owner's role in the workspace: owner, admin or member.","examples":["owner"],"title":"Role","type":"string"},"settings":{"additionalProperties":true,"description":"Workspace settings (market language, pillars, feature flags).","title":"Settings","type":"object"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Updated At"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Website"},"workspace_id":{"examples":["ws_0512272171984c7fb4b7"],"title":"Workspace Id","type":"string"}},"required":["workspace_id","name","role","is_owner"],"title":"WorkspaceResponse","type":"object"}},"securitySchemes":{"ApiKeyAuth":{"description":"API key for authentication","in":"header","name":"X-API-Key","type":"apiKey"}}},"info":{"description":"Kumkuat turns the documents, signals and synthetic audiences in a workspace into an API: ingest content, build personas, put a document or a question in front of them, and generate audience-tested copy.\n\nEvery request carries a workspace API key in the `X-API-Key` header and is scoped to that key's workspace. Start with `GET /api/v1/workspace`, list personas with `GET /api/v1/personas`, then `POST /api/v1/personas/interact` to ask one of them about a document or a draft. Long-running work (ingestion, reactions for a whole audience, report generation) returns a job id to poll at `GET /api/v1/jobs/{job_id}`.\n\nIds are opaque strings. Timestamps are ISO-8601 with a UTC offset. Responses marked with an object schema may carry additional fields beyond the ones documented; the documented ones are stable.\n\nPaths follow one shape: `/api/v1/<resource>` for a collection, `/api/v1/<resource>/{id}` for one item, `/api/v1/<resource>/{id}/<sub-resource>` for what belongs to it, and an action as a POST verb on the resource it acts on (`POST /api/v1/reports/{report_id}/generate`). Segments are kebab-case. The key names the workspace, so no path carries a workspace id. Paths marked deprecated keep working; each one names the path that replaced it.","title":"Kumkuat API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/chat/sessions/{session_id}/attachments":{"post":{"description":"Upload a file into an audience chat session (KUM-499).<br/><br/>The file becomes a workspace document that is private to the uploader<br/>(KUM-433 `private_to_user` tag) and is linked to the session via<br/>`chat_sessions.context.attachments`, so the persona can ground replies<br/>on it without the file surfacing in shared workspace views.","operationId":"upload_chat_session_attachment_api_chat_sessions__session_id__attachments_post","parameters":[{"description":"Chat session id.","in":"path","name":"session_id","required":true,"schema":{"description":"Chat session id.","title":"Session Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Attach a file to a chat session","tags":["Documents & content"]}},"/api/chat/sessions/{session_id}/attachments/{document_id}":{"delete":{"description":"Drop a file from a chat session's attachments (KUM-499).<br/><br/>With `?delete_document=true`, the underlying private document is also<br/>deleted when the requesting user owns it.","operationId":"remove_chat_session_attachment_api_chat_sessions__session_id__attachments__document_id__delete","parameters":[{"description":"Chat session id.","in":"path","name":"session_id","required":true,"schema":{"description":"Chat session id.","title":"Session Id","type":"string"}},{"description":"Document id.","in":"path","name":"document_id","required":true,"schema":{"description":"Document id.","title":"Document Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Remove a file from a chat session","tags":["Documents & content"]}},"/api/public/ensure-user-workspace":{"post":{"operationId":"ensure_user_workspace_api_public_ensure_user_workspace_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Optimized endpoint that creates user, workspace, and API key in a single transaction","tags":["default"]}},"/api/public/ensure-workspace-key":{"post":{"operationId":"ensure_workspace_key_api_public_ensure_workspace_key_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Ensure a workspace exists and return an API key","tags":["default"]}},"/api/public/get-user-api-key":{"post":{"operationId":"get_user_api_key_api_public_get_user_api_key_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get a user's API key by Firebase UID or email (alias for /api/public/user/api-key)","tags":["default"]}},"/api/public/get-user-workspaces":{"post":{"operationId":"get_user_workspaces_api_public_get_user_workspaces_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get all workspaces for a user by Firebase UID or email","tags":["default"]}},"/api/public/get-workspace-api-key":{"post":{"operationId":"get_workspace_api_key_api_public_get_workspace_api_key_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get API key for a specific workspace and user","tags":["default"]}},"/api/public/sso/discover":{"get":{"description":"<br/>Unauthenticated by design \u2014 it runs before anyone is signed in. It reveals<br/>only what every SSO login page reveals (that a domain has SSO and which<br/>provider id to start), never the workspace. See api/src/sso.py.","operationId":"sso_discover_api_public_sso_discover_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Login-page lookup: does this email's domain (or this slug) use single sign-on?","tags":["default"]}},"/api/public/user/api-key":{"post":{"operationId":"get_user_api_key_impl_api_public_user_api_key_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get a user's API key by Firebase UID or email","tags":["default"]}},"/api/v1/alerts/autocomplete":{"get":{"description":"Return audiences, companies, and commands for the alert composer autocomplete.<br/><br/>Query params:<br/>- q: optional search filter (case-insensitive substring match)<br/>- type: optional filter \u2014 'audience', 'company', or 'command'","operationId":"alerts_autocomplete_api_v1_alerts_autocomplete_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Workspace-scoped autocomplete for alert composer","tags":["Alerts"]}},"/api/v1/audience-groups":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/audiences` instead. This path keeps working until a sunset date is announced in the release notes.\n\nReturn the workspace's audience groups with custom sort order.","operationId":"get_audience_groups_api_v1_audience_groups_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudienceGroupsResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get audience group ordering","tags":["Personas"]},"post":{"deprecated":true,"description":"**Deprecated.** Use `POST /api/v1/audiences` instead. This path keeps working until a sunset date is announced in the release notes.\n\nAppend a single audience category without touching the rest of the list.<br/><br/>Body: ``{ \"name\": \"...\", \"display_name\": \"...\"? }`` \u2192 201 ``{\"group\": {...}}``.<br/><br/>The bulk PUT above replaces the whole list (rows absent from its payload are<br/>deleted), which is the wrong tool for \"add one\" from a member-facing surface<br/>such as the Audience Library rail \u2014 a stale client would erase categories it<br/>never saw. This route only ever inserts; a name that already exists<br/>(case-insensitive) is a 409 carrying the existing row.","operationId":"add_audience_group_api_v1_audience_groups_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Add one audience category","tags":["Personas"]},"put":{"deprecated":true,"description":"**Deprecated.** Use `PUT /api/v1/audiences` instead. This path keeps working until a sunset date is announced in the release notes.\n\nBulk update audience groups (sort order + optional rename).<br/><br/>Body: ``{ \"groups\": [ { \"name\": \"...\", \"sort_order\": 0, \"display_name\": \"...\" }, ... ] }``","operationId":"update_audience_groups_api_v1_audience_groups_put","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update audience group ordering","tags":["Personas"]}},"/api/v1/audience-summaries":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/audiences/{category}/summary` instead. This path keeps working until a sunset date is announced in the release notes.\n\nReturn a synthesized audience-level summary for a persona category.<br/>Aggregates persona reaction insights across recent documents and uses an LLM<br/>to produce an overall grade, themes, actions, and risks.<br/>Set force_refresh=true to bypass the cache and regenerate.","operationId":"get_or_generate_audience_category_summary_api_v1_audience_summaries_get","parameters":[{"description":"Audience category to summarise.","example":"investors","in":"query","name":"category","required":true,"schema":{"type":"string"}},{"description":"Reactions from the last N days.","in":"query","name":"days","required":false,"schema":{"default":30,"type":"integer"}},{"description":"Only reactions to documents from this company.","in":"query","name":"company_tag","required":false,"schema":{"type":"string"}},{"description":"Only reactions on this narrative pillar.","in":"query","name":"pillar","required":false,"schema":{"type":"string"}},{"description":"Regenerate the summary.","in":"query","name":"force_refresh","required":false,"schema":{"type":"boolean"}},{"description":"Model override.","in":"query","name":"model","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get or generate audience category summary","tags":["Personas"]}},"/api/v1/audience-summaries/grades":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/audiences/grades` instead. This path keeps working until a sunset date is announced in the release notes.\n\nReturn cached grade + trend for all (or specified) audience categories in one call.<br/>Reads from cache only \u2014 does NOT trigger LLM generation.<br/>Response: { grades: { \"Regulators\": { grade, trend, is_stale } | null, ... } }","operationId":"get_audience_category_grades_api_v1_audience_summaries_grades_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get cached grades for multiple audience categories","tags":["Personas"]}},"/api/v1/audience-summaries/refresh":{"post":{"deprecated":true,"description":"**Deprecated.** Use `POST /api/v1/audiences/refresh` instead. This path keeps working until a sunset date is announced in the release notes.\n\nQueue a background job to proactively regenerate all audience category<br/>summaries for the workspace.  This keeps the audience overview page fast<br/>by ensuring summaries are pre-computed rather than generated on demand.<br/><br/>Parameters (JSON body):<br/>- force_refresh: bool (default false) \u2013 regenerate even fresh summaries<br/>- days: int (default 30) \u2013 reaction lookback window<br/>- model: str (optional) \u2013 LLM model override<br/>- company_tag: str (optional) \u2013 scope to a specific company<br/>- pillar: str (optional) \u2013 scope to a specific narrative pillar","operationId":"queue_audience_cache_refresh_api_v1_audience_summaries_refresh_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Queue audience cache refresh job","tags":["Personas"]}},"/api/v1/audiences":{"get":{"description":"The workspace's audiences (persona categories) in display order.","operationId":"audiences_list_api_v1_audiences_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudienceGroupsResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List audiences","tags":["Audiences"]},"post":{"description":"Add one audience category.","operationId":"audiences_add_api_v1_audiences_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Add an audience","tags":["Audiences"]},"put":{"description":"Replace the display order of the audiences.","operationId":"audiences_reorder_api_v1_audiences_put","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Reorder audiences","tags":["Audiences"]}},"/api/v1/audiences/categories":{"get":{"description":"The category names in use, as plain strings.","operationId":"audiences_categories_api_v1_audiences_categories_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaCategoriesResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List audience category names","tags":["Audiences"]}},"/api/v1/audiences/grades":{"get":{"description":"Cached grades for several audiences at once.","operationId":"audiences_grades_api_v1_audiences_grades_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get cached audience grades","tags":["Audiences"]}},"/api/v1/audiences/reactions":{"get":{"description":"Reactions already generated in this workspace.","operationId":"audiences_list_reactions_api_v1_audiences_reactions_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List cached audience reactions","tags":["Audiences"]},"post":{"description":"Each persona reacts to the document with a letter grade, judgments, evidence and actions. Reactions are cached per persona and document; pass `force_refresh` to regenerate. `include: [\"why_it_matters\"]` adds a grounded note on why the document matters to each persona.","operationId":"audiences_create_reactions_api_v1_audiences_reactions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactionInsightsRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactionInsightsResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get or generate audience reactions","tags":["Audiences"]}},"/api/v1/audiences/reactions/async":{"post":{"description":"The same reactions, generated in the background; poll the returned job.","operationId":"audiences_queue_reactions_api_v1_audiences_reactions_async_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Queue audience reactions as a job","tags":["Audiences"]}},"/api/v1/audiences/reactions/history":{"get":{"description":"Every reaction one persona has given to one document.","operationId":"audiences_reaction_history_api_v1_audiences_reactions_history_get","parameters":[{"description":"The persona.","in":"query","name":"persona_id","required":true,"schema":{"type":"string"}},{"description":"The document.","in":"query","name":"document_id","required":true,"schema":{"type":"string"}},{"description":"Most recent N entries.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactionHistoryResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get reaction history for a persona and document","tags":["Audiences"]}},"/api/v1/audiences/refresh":{"post":{"description":"Queue a background refresh of the audience summaries.","operationId":"audiences_refresh_api_v1_audiences_refresh_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Queue an audience summary refresh","tags":["Audiences"]}},"/api/v1/audiences/{category}/summary":{"get":{"description":"What this audience thinks, summarised from its recent reactions.","operationId":"audiences_summary_api_v1_audiences__category__summary_get","parameters":[{"description":"Audience category, as listed by GET /api/v1/audiences.","in":"path","name":"category","required":true,"schema":{"description":"Audience category, as listed by GET /api/v1/audiences.","title":"Category","type":"string"}},{"description":"Reactions from the last N days.","in":"query","name":"days","required":false,"schema":{"default":30,"type":"integer"}},{"description":"Only reactions to documents from this company.","in":"query","name":"company_tag","required":false,"schema":{"type":"string"}},{"description":"Only reactions on this narrative pillar.","in":"query","name":"pillar","required":false,"schema":{"type":"string"}},{"description":"Regenerate the summary.","in":"query","name":"force_refresh","required":false,"schema":{"type":"boolean"}},{"description":"Model override.","in":"query","name":"model","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get or generate an audience summary","tags":["Audiences"]}},"/api/v1/auth/keys":{"get":{"operationId":"list_api_keys_api_v1_auth_keys_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List API keys","tags":["default"]},"post":{"operationId":"create_api_key_api_v1_auth_keys_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Create API key","tags":["default"]}},"/api/v1/auth/keys/{key_id}":{"delete":{"operationId":"revoke_api_key_api_v1_auth_keys__key_id__delete","parameters":[{"description":"API key id.","in":"path","name":"key_id","required":true,"schema":{"description":"API key id.","title":"Key Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Revoke API key","tags":["default"]}},"/api/v1/auth/keys/{key_id}/rotate":{"post":{"description":"Revoke an existing key and mint a replacement with the same name and workspace binding.<br/><br/>Returns the new key value (shown exactly once) and the new key metadata.<br/>The old key is deactivated atomically before the new one is returned.","operationId":"rotate_api_key_api_v1_auth_keys__key_id__rotate_post","parameters":[{"description":"API key id.","in":"path","name":"key_id","required":true,"schema":{"description":"API key id.","title":"Key Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Rotate API key","tags":["default"]}},"/api/v1/auto-tag-aliases":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/auto-tags/aliases` instead. This path keeps working until a sunset date is announced in the release notes.\n\nGet alias normalization rules visible in the current workspace.","operationId":"get_auto_tag_aliases_api_v1_auto_tag_aliases_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get auto tag alias rules","tags":["Auto tags"]},"post":{"deprecated":true,"description":"**Deprecated.** Use `POST /api/v1/auto-tags/aliases` instead. This path keeps working until a sunset date is announced in the release notes.\n\nCreate an alias normalization rule for an auto tag.","operationId":"create_auto_tag_alias_api_v1_auto_tag_aliases_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Create auto tag alias rule","tags":["Auto tags"]}},"/api/v1/auto-tag-aliases/apply-normalization":{"post":{"deprecated":true,"description":"**Deprecated.** Use `POST /api/v1/auto-tags/aliases/apply-normalization` instead. This path keeps working until a sunset date is announced in the release notes.\n\nNormalize existing applied auto tag values using current alias rules.","operationId":"apply_auto_tag_alias_normalization_api_v1_auto_tag_aliases_apply_normalization_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Apply alias normalization to existing applied tags","tags":["Auto tags"]}},"/api/v1/auto-tag-aliases/suggestions":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/auto-tags/aliases/suggestions` instead. This path keeps working until a sunset date is announced in the release notes.\n\nGet extracted value suggestions to speed up alias rule creation.","operationId":"get_auto_tag_alias_suggestions_api_v1_auto_tag_aliases_suggestions_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get alias suggestions from extracted values","tags":["Auto tags"]}},"/api/v1/auto-tag-aliases/{id}":{"delete":{"deprecated":true,"description":"**Deprecated.** Use `DELETE /api/v1/auto-tags/aliases/{id}` instead. This path keeps working until a sunset date is announced in the release notes.\n\nDelete an auto tag alias rule.","operationId":"delete_auto_tag_alias_api_v1_auto_tag_aliases__id__delete","parameters":[{"description":"Record id.","in":"path","name":"id","required":true,"schema":{"description":"Record id.","title":"Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete auto tag alias rule","tags":["Auto tags"]},"put":{"deprecated":true,"description":"**Deprecated.** Use `PUT /api/v1/auto-tags/aliases/{id}` instead. This path keeps working until a sunset date is announced in the release notes.\n\nUpdate an existing auto tag alias rule.","operationId":"update_auto_tag_alias_api_v1_auto_tag_aliases__id__put","parameters":[{"description":"Record id.","in":"path","name":"id","required":true,"schema":{"description":"Record id.","title":"Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update auto tag alias rule","tags":["Auto tags"]}},"/api/v1/auto-tags":{"get":{"description":"Get all auto tags visible in the current workspace","operationId":"get_auto_tags_api_v1_auto_tags_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get all auto tags","tags":["Auto tags"]},"post":{"description":"Create a new auto tag","operationId":"create_auto_tag_api_v1_auto_tags_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Create auto tag","tags":["Auto tags"]}},"/api/v1/auto-tags/aliases":{"get":{"description":"Alias rules that normalise extracted tag values.","operationId":"auto_tags_list_aliases_api_v1_auto_tags_aliases_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List auto-tag alias rules","tags":["Auto tags"]},"post":{"description":"Create an alias rule.","operationId":"auto_tags_create_alias_api_v1_auto_tags_aliases_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Create an auto-tag alias rule","tags":["Auto tags"]}},"/api/v1/auto-tags/aliases/apply-normalization":{"post":{"description":"Apply the alias rules to tags already applied.","operationId":"auto_tags_apply_alias_normalization_api_v1_auto_tags_aliases_apply_normalization_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Apply alias normalization","tags":["Auto tags"]}},"/api/v1/auto-tags/aliases/suggestions":{"get":{"description":"Alias rules suggested from the values extracted so far.","operationId":"auto_tags_alias_suggestions_api_v1_auto_tags_aliases_suggestions_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Suggest auto-tag aliases","tags":["Auto tags"]}},"/api/v1/auto-tags/aliases/{id}":{"delete":{"description":"Delete an alias rule.","operationId":"auto_tags_delete_alias_api_v1_auto_tags_aliases__id__delete","parameters":[{"description":"Record id.","in":"path","name":"id","required":true,"schema":{"description":"Record id.","title":"Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete an auto-tag alias rule","tags":["Auto tags"]},"put":{"description":"Update an alias rule.","operationId":"auto_tags_update_alias_api_v1_auto_tags_aliases__id__put","parameters":[{"description":"Record id.","in":"path","name":"id","required":true,"schema":{"description":"Record id.","title":"Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update an auto-tag alias rule","tags":["Auto tags"]}},"/api/v1/auto-tags/ensure":{"post":{"description":"Ensure all documents in the workspace have auto tags generated","operationId":"ensure_auto_tags_api_v1_auto_tags_ensure_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Ensure auto tags for all documents","tags":["default"]}},"/api/v1/auto-tags/generate-draft":{"post":{"description":"Generate auto tag fields from partial inputs.<br/>Name is required. By default, only missing fields are generated.","operationId":"generate_auto_tag_draft_api_v1_auto_tags_generate_draft_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Generate auto tag draft fields","tags":["Auto tags"]}},"/api/v1/auto-tags/status":{"get":{"description":"Get the current auto tag status for the workspace","operationId":"get_auto_tag_status_api_v1_auto_tags_status_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get auto tag status for workspace","tags":["default"]}},"/api/v1/auto-tags/test":{"post":{"description":"Test an auto tag against text input or an onboarded document without saving results","operationId":"test_auto_tag_api_v1_auto_tags_test_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Test auto tag extraction","tags":["Auto tags"]}},"/api/v1/auto-tags/{id}":{"delete":{"description":"Delete an auto tag","operationId":"delete_auto_tag_api_v1_auto_tags__id__delete","parameters":[{"description":"Record id.","in":"path","name":"id","required":true,"schema":{"description":"Record id.","title":"Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete auto tag","tags":["Auto tags"]},"get":{"description":"Get a specific auto tag visible in the current workspace","operationId":"get_auto_tag_by_id_api_v1_auto_tags__id__get","parameters":[{"description":"Record id.","in":"path","name":"id","required":true,"schema":{"description":"Record id.","title":"Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get auto tag by ID","tags":["Auto tags"]},"put":{"description":"Update an existing auto tag","operationId":"update_auto_tag_api_v1_auto_tags__id__put","parameters":[{"description":"Record id.","in":"path","name":"id","required":true,"schema":{"description":"Record id.","title":"Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update auto tag","tags":["Auto tags"]}},"/api/v1/communications":{"get":{"description":"Get documents for communications page with auto tags","operationId":"get_communications_api_v1_communications_get","parameters":[{"description":"Page number, 1-based.","in":"query","name":"page","required":false,"schema":{"default":1,"type":"integer"}},{"description":"Items per page.","in":"query","name":"per_page","required":false,"schema":{"default":100,"type":"integer"}},{"description":"Field to sort on.","in":"query","name":"sort_by","required":false,"schema":{"default":"extracted_date","type":"string"}},{"description":"asc or desc.","in":"query","name":"sort_order","required":false,"schema":{"default":"desc","enum":["asc","desc"],"type":"string"}},{"description":"Full-text filter.","in":"query","name":"search","required":false,"schema":{"type":"string"}},{"description":"Comma-separated auto-tag values to match.","in":"query","name":"tag_filters","required":false,"schema":{"type":"string"}},{"description":"or or and.","in":"query","name":"tag_filter_mode","required":false,"schema":{"default":"or","enum":["or","and"],"type":"string"}},{"description":"Restrict tag_filters to one auto tag.","in":"query","name":"auto_tag_id","required":false,"schema":{"type":"string"}},{"description":"Set to true to include documents hidden by filters, with `hidden_by`.","in":"query","name":"show_filtered","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunicationsResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get communications with auto tags","tags":["Documents & content"]}},"/api/v1/communications/filters":{"get":{"description":"Every filter tag with its enabled state, scoped values, hidden-document count and examples, plus the enabled registry.","operationId":"communications_list_filters_api_v1_communications_filters_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommsFiltersResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List communications filters","tags":["Documents & content"]},"put":{"description":"The whole map: a tag left out is disabled.","operationId":"communications_replace_filters_api_v1_communications_filters_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommsFiltersReplaceRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommsFiltersReplaceResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Replace the enabled communications filters","tags":["Documents & content"]}},"/api/v1/communications/filters/linkable-tags":{"get":{"description":"Active auto tags not yet linked as filters, with how many documents each one tags.","operationId":"communications_linkable_filter_tags_api_v1_communications_filters_linkable_tags_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkableTagsResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List auto tags that can become filters","tags":["Documents & content"]}},"/api/v1/communications/filters/tags":{"post":{"description":"Create a content-filter tag and enable it as a filter.","operationId":"communications_create_filter_tag_api_v1_communications_filters_tags_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommsFilterTagCreateRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommsFilterTagCreateResponse"}}},"description":"Created"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Create a filter tag","tags":["Documents & content"]}},"/api/v1/communications/filters/{tag_id}/backfill":{"post":{"description":"Queue a retag of the documents never evaluated against this filter; answers 202 with the counts.","operationId":"communications_backfill_filter_api_v1_communications_filters__tag_id__backfill_post","parameters":[{"description":"Auto-tag id of the filter, as listed by GET /api/v1/communications/filters.","in":"path","name":"tag_id","required":true,"schema":{"description":"Auto-tag id of the filter, as listed by GET /api/v1/communications/filters.","title":"Tag Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommsFilterBackfillRequest"}}},"required":false},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommsFilterBackfillResponse"}}},"description":"Accepted"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Sweep existing documents with a filter","tags":["Documents & content"]}},"/api/v1/communications/filters/{tag_id}/exclusions":{"post":{"description":"Apply the filter tag to one document and keep it as an example of what the filter hides.","operationId":"communications_add_filter_exclusion_api_v1_communications_filters__tag_id__exclusions_post","parameters":[{"description":"Auto-tag id of the filter, as listed by GET /api/v1/communications/filters.","in":"path","name":"tag_id","required":true,"schema":{"description":"Auto-tag id of the filter, as listed by GET /api/v1/communications/filters.","title":"Tag Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommsFilterExclusionRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommsFilterExclusionResponse"}}},"description":"Created"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Hide a document with a filter tag","tags":["Documents & content"]}},"/api/v1/communications/filters/{tag_id}/exclusions/{document_id}":{"delete":{"description":"Remove the filter tag from the document and drop its example.","operationId":"communications_remove_filter_exclusion_api_v1_communications_filters__tag_id__exclusions__document_id__delete","parameters":[{"description":"Auto-tag id of the filter.","in":"path","name":"tag_id","required":true,"schema":{"description":"Auto-tag id of the filter.","title":"Tag Id","type":"string"}},{"description":"Document id.","in":"path","name":"document_id","required":true,"schema":{"description":"Document id.","title":"Document Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommsFilterUnhideResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Un-hide a document","tags":["Documents & content"]}},"/api/v1/communications/filters/{tag_id}/values":{"get":{"description":"Distinct extracted values of the tag with document counts, for scoping a filter to some of them.","operationId":"communications_filter_values_api_v1_communications_filters__tag_id__values_get","parameters":[{"description":"Auto-tag id of the filter, as listed by GET /api/v1/communications/filters.","in":"path","name":"tag_id","required":true,"schema":{"description":"Auto-tag id of the filter, as listed by GET /api/v1/communications/filters.","title":"Tag Id","type":"string"}},{"description":"Case-insensitive substring the values must contain.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Values to return, at most 500.","in":"query","name":"limit","required":false,"schema":{"default":100,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilterTagValuesResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List a filter tag's values","tags":["Documents & content"]}},"/api/v1/communications/tag-filters":{"get":{"description":"Get available tag-value filter options for the Communications page.","operationId":"get_communications_tag_filters_api_v1_communications_tag_filters_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get Communications tag-value filters","tags":["Documents & content"]}},"/api/v1/content-creation/analyze-pull-through-coverage":{"post":{"description":"Grade each pull-through priority as covered / partial / missing in the given draft.","operationId":"analyze_pull_through_coverage_api_v1_content_creation_analyze_pull_through_coverage_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentCreationCoverageRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoverageResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Score each pull-through priority against a draft","tags":["Documents & content"]}},"/api/v1/content-creation/check-quality":{"post":{"description":"Run grammar, spelling, and AI-detection checks via the configured text-quality provider.","operationId":"check_content_quality_api_v1_content_creation_check_quality_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextQualityCheckRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityCheckResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Check text quality (grammar, spelling, AI detection)","tags":["Documents & content"]}},"/api/v1/content-creation/check-quality/accept":{"post":{"description":"Forward an accept signal to the text-quality provider for learning.","operationId":"accept_quality_edit_api_v1_content_creation_check_quality_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextQualityFeedbackRequest"}}},"required":true},"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Accept a text-quality edit suggestion","tags":["Documents & content"]}},"/api/v1/content-creation/check-quality/reject":{"post":{"description":"Forward a reject signal to the text-quality provider for learning.","operationId":"reject_quality_edit_api_v1_content_creation_check_quality_reject_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextQualityFeedbackRequest"}}},"required":true},"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Reject a text-quality edit suggestion","tags":["Documents & content"]}},"/api/v1/content-creation/deaiify":{"post":{"description":"LLM-powered analysis of AI-detection signals with span-anchored edit suggestions.","operationId":"deaiify_content_api_v1_content_creation_deaiify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeAIifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestionsResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Suggest edits to reduce AI-detection signals in content","tags":["Documents & content"]}},"/api/v1/content-creation/documents":{"get":{"description":"List content-creation drafts from one or more knowledgebases.<br/><br/>Query params:<br/>    kb_ids  \u2013 comma-separated knowledgebase IDs to fetch from (required)<br/>    limit   \u2013 max documents to return (default 50, max 200)","operationId":"list_content_creation_documents_api_v1_content_creation_documents_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List content documents across multiple knowledgebases","tags":["Documents & content"]}},"/api/v1/content-creation/drafts":{"get":{"description":"List recent content drafts stored in the content-drafts knowledgebase.","operationId":"list_content_creation_drafts_api_v1_content_creation_drafts_get","parameters":[{"description":"Most recent N, up to 100.","in":"query","name":"limit","required":false,"schema":{"default":20,"type":"integer"}},{"description":"Set to 1 to include each draft's text.","in":"query","name":"include_content","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftsListResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List content creation drafts","tags":["Documents & content"]},"post":{"description":"Creates a draft (201), or updates it when `draft_id` is given (200).","operationId":"save_content_creation_draft_api_v1_content_creation_drafts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentCreationDraftRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftSavedResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Create or update content creation draft","tags":["Documents & content"]}},"/api/v1/content-creation/drafts/bulk-delete":{"post":{"description":"Soft-delete multiple content creation drafts by ID.","operationId":"bulk_delete_content_creation_drafts_api_v1_content_creation_drafts_bulk_delete_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Bulk delete content creation drafts","tags":["Documents & content"]}},"/api/v1/content-creation/drafts/{draft_id}":{"delete":{"description":"Soft-delete a content creation draft by ID.","operationId":"delete_content_creation_draft_api_v1_content_creation_drafts__draft_id__delete","parameters":[{"description":"Content draft id.","in":"path","name":"draft_id","required":true,"schema":{"description":"Content draft id.","title":"Draft Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete a content creation draft","tags":["Documents & content"]},"get":{"description":"Fetch a single content draft by document ID.","operationId":"get_content_creation_draft_api_v1_content_creation_drafts__draft_id__get","parameters":[{"description":"Content draft id.","in":"path","name":"draft_id","required":true,"schema":{"description":"Content draft id.","title":"Draft Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get content creation draft","tags":["Documents & content"]}},"/api/v1/content-creation/enhance-pull-through":{"post":{"description":"Re-prompt the generator with unmet priorities elevated to rewrite the current draft.","operationId":"enhance_pull_through_draft_api_v1_content_creation_enhance_pull_through_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentCreationEnhanceRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneratedTextResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Rewrite a draft so unmet pull-through priorities are delivered","tags":["Documents & content"]}},"/api/v1/content-creation/export":{"post":{"description":"Export content creation draft to the requested format (pdf, docx, txt).","operationId":"export_content_creation_draft_api_v1_content_creation_export_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentCreationExportRequest"}}},"required":true},"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Export content as PDF, DOCX, or TXT","tags":["Documents & content"]}},"/api/v1/content-creation/generate":{"post":{"description":"Set `Accept: text/event-stream` to stream the draft as it is written.","operationId":"generate_content_creation_draft_api_v1_content_creation_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentCreationGenerateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneratedTextResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Generate content draft text","tags":["Documents & content"]}},"/api/v1/content-creation/knowledgebases":{"get":{"description":"Return all KBs visible to the user plus ensure the two default ones exist.","operationId":"list_content_creation_knowledgebases_api_v1_content_creation_knowledgebases_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List knowledgebases available for content drafts","tags":["Documents & content"]}},"/api/v1/content-creation/rewrite-phrases":{"post":{"description":"LLM-powered phrase-level edit suggestions based on audience test feedback.","operationId":"rewrite_content_phrases_api_v1_content_creation_rewrite_phrases_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentCreationRewritePhrasesRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestionsResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Phrase-level edit suggestions driven by audience feedback","tags":["Documents & content"]}},"/api/v1/content-creation/rewrite-segments":{"post":{"description":"LLM-powered rewrite of individual segments based on audience test feedback.","operationId":"rewrite_content_segments_api_v1_content_creation_rewrite_segments_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentCreationRewriteSegmentsRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RewritesResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Rewrite specific draft segments to address audience feedback","tags":["Documents & content"]}},"/api/v1/content-creation/source-documents":{"get":{"description":"List workspace documents tagged for /content source generation.","operationId":"list_content_creation_source_documents_api_v1_content_creation_source_documents_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List content source documents","tags":["Documents & content"]}},"/api/v1/content-creation/source-documents/upload":{"post":{"description":"Upload a source document for /content generation using the standard ingestion pipeline.","operationId":"upload_content_creation_source_document_api_v1_content_creation_source_documents_upload_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Upload content source document","tags":["Documents & content"]}},"/api/v1/content-creation/source-documents/{document_id}/attach":{"post":{"description":"Tag an existing workspace document for /content source generation.","operationId":"attach_content_creation_source_document_api_v1_content_creation_source_documents__document_id__attach_post","parameters":[{"description":"Document id.","in":"path","name":"document_id","required":true,"schema":{"description":"Document id.","title":"Document Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Attach existing document as content source","tags":["Documents & content"]}},"/api/v1/documents":{"get":{"description":"Get all documents with pagination, filtering, and sorting","operationId":"get_all_documents_api_api_v1_documents_get","parameters":[{"description":"Page number, 1-based.","in":"query","name":"page","required":false,"schema":{"default":1,"type":"integer"}},{"description":"Items per page.","in":"query","name":"per_page","required":false,"schema":{"default":20,"type":"integer"}},{"description":"Field to sort on.","in":"query","name":"sort_by","required":false,"schema":{"default":"extracted_at","type":"string"}},{"description":"asc or desc.","in":"query","name":"sort_order","required":false,"schema":{"default":"desc","enum":["asc","desc"],"type":"string"}},{"description":"Full-text filter on title and content.","in":"query","name":"search","required":false,"schema":{"type":"string"}},{"description":"Set to 1 to omit content and tags.","in":"query","name":"light","required":false,"schema":{"type":"string"}},{"description":"Set to 1 to add executive, company and communication_type.","in":"query","name":"facets","required":false,"schema":{"type":"string"}},{"description":"Set to 1 to leave out persona knowledge-base documents.","in":"query","name":"exclude_persona_kbs","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentListResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get all documents","tags":["Documents & content"]},"post":{"description":"Create a new document (admin/owner only)","operationId":"create_document_api_v1_documents_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDocumentRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreatedResponse"}}},"description":"Created"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Create a new document","tags":["Documents & content"]}},"/api/v1/documents/count":{"get":{"description":"Get total document count","operationId":"get_documents_count_api_api_v1_documents_count_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCountResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get document count","tags":["Documents & content"]}},"/api/v1/documents/extract-text":{"post":{"description":"Send the file as multipart/form-data in a `file` field: PDF, DOCX, PPTX, TXT, MD, CSV, HTML, RTF, JSON or XML. Nothing is stored.","operationId":"documents_extract_text_api_v1_documents_extract_text_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractedTextResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Extract text from an uploaded file without saving","tags":["Documents & content"]}},"/api/v1/documents/ingest":{"post":{"description":"Fetch a URL into the workspace. Returns at once with `processing_status: fetching`; poll `GET /api/v1/documents/{doc_id}` until it clears.","operationId":"ingest_document_api_v1_documents_ingest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Ingest a document","tags":["Documents & content"]}},"/api/v1/documents/query":{"post":{"description":"Query a document using a template","operationId":"query_document_api_v1_documents_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Query a document","tags":["Documents & content"]}},"/api/v1/documents/upload":{"post":{"description":"Upload and ingest a file with document enrichment and auto tags","operationId":"upload_document_api_v1_documents_upload_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Upload and ingest a file","tags":["Documents & content"]}},"/api/v1/documents/{doc_id}":{"delete":{"description":"Delete a document by ID","operationId":"delete_document_api_v1_documents__doc_id__delete","parameters":[{"description":"Document id.","in":"path","name":"doc_id","required":true,"schema":{"description":"Document id.","title":"Doc Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete a document","tags":["Documents & content"]},"get":{"description":"Get a document by ID","operationId":"get_document_api_v1_documents__doc_id__get","parameters":[{"description":"Document id.","in":"path","name":"doc_id","required":true,"schema":{"description":"Document id.","title":"Doc Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get a specific document","tags":["Documents & content"]},"patch":{"description":"Only `title` and `extracted_date` can be changed.","operationId":"update_document_api_v1_documents__doc_id__patch","parameters":[{"description":"Document id.","in":"path","name":"doc_id","required":true,"schema":{"description":"Document id.","title":"Doc Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update a document","tags":["Documents & content"]}},"/api/v1/documents/{doc_id}/auto-tags":{"get":{"description":"Get all auto tags applied to a specific document","operationId":"get_document_auto_tags_api_v1_documents__doc_id__auto_tags_get","parameters":[{"description":"Document id.","in":"path","name":"doc_id","required":true,"schema":{"description":"Document id.","title":"Doc Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentAutoTagsResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get auto tags for a document","tags":["Documents & content"]}},"/api/v1/documents/{doc_id}/auto-tags/{applied_tag_id}":{"put":{"description":"Update the extracted value of an applied auto tag for a specific document","operationId":"update_document_auto_tag_api_v1_documents__doc_id__auto_tags__applied_tag_id__put","parameters":[{"description":"Document id.","in":"path","name":"doc_id","required":true,"schema":{"description":"Document id.","title":"Doc Id","type":"string"}},{"description":"Id of the auto tag as applied to this document.","in":"path","name":"applied_tag_id","required":true,"schema":{"description":"Id of the auto tag as applied to this document.","title":"Applied Tag Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update an applied auto tag value","tags":["Documents & content"]}},"/api/v1/documents/{doc_id}/content":{"get":{"description":"Stream the stored file for a document, authorized per request.<br/><br/>This is the authenticated replacement for handing out public bucket URLs<br/>(KUM-1315): the objects become private, and callers read them through here<br/>so that access is re-checked every time rather than living forever in a URL.","operationId":"get_document_content_api_v1_documents__doc_id__content_get","parameters":[{"description":"Document id.","in":"path","name":"doc_id","required":true,"schema":{"description":"Document id.","title":"Doc Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Download a document's stored file","tags":["Documents & content"]}},"/api/v1/documents/{doc_id}/retag":{"post":{"description":"Retag a document by rerunning all auto tags","operationId":"retag_document_api_v1_documents__doc_id__retag_post","parameters":[{"description":"Document id.","in":"path","name":"doc_id","required":true,"schema":{"description":"Document id.","title":"Doc Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Retag a document","tags":["Documents & content"]}},"/api/v1/executives-for-theme":{"post":{"description":"Get available executives for selected theme","operationId":"get_executives_for_theme_api_v1_executives_for_theme_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get available executives for selected theme","tags":["Signals & themes"]}},"/api/v1/executives/voice":{"put":{"deprecated":true,"description":"**Deprecated.** Use `POST /api/v1/voices` instead. This path keeps working until a sunset date is announced in the release notes.\n\nThe per-executive voice toggle (KUM-1506). Body:<br/>``{\"executive\": \"<name>\", \"enabled\": true|false}``.<br/><br/>Enabling creates the voice persona when missing and auto-tunes it from the<br/>executive's tracked statements (one LLM call \u2014 the response can take a few<br/>seconds on first enable). Disabling only clears ``include_in_voice_list``;<br/>the tuned persona is kept so re-enabling is instant. The response reports<br/>values **read back** from the persona, not the request echo, because<br/>``update_persona_template`` silently drops unregistered keys.","operationId":"set_executive_voice_endpoint_api_v1_executives_voice_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecutiveVoiceToggleRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecutiveVoiceToggleResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Include or exclude an executive's voice in content creation","tags":["Voices"]}},"/api/v1/executives/voices":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/voices` instead. This path keeps working until a sunset date is announced in the release notes.\n\nState of every executive voice persona in the workspace (KUM-1506).<br/><br/>Also arms the lazy CEO auto-add: loading the executives page is a natural<br/>moment to make sure the CEO's voice exists, and the kick is throttled and<br/>runs off-request, so this read stays cheap.","operationId":"list_executive_voices_endpoint_api_v1_executives_voices_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecutiveVoicesResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Executive content-creation voices for this workspace","tags":["Voices"]}},"/api/v1/executives/{executive_name}":{"get":{"description":"Get detailed information about a specific executive","operationId":"get_executive_details_api_v1_executives__executive_name__get","parameters":[{"description":"The executive's name as it appears on documents.","in":"path","name":"executive_name","required":true,"schema":{"description":"The executive's name as it appears on documents.","title":"Executive Name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecutiveDetailsResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get detailed information about a specific executive","tags":["Signals & themes"]}},"/api/v1/executives/{executive_name}/voice":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/voices/{persona_id}` instead. This path keeps working until a sunset date is announced in the release notes.\n\nWhether this executive's voice exists, is enabled for content creation<br/>and has been tuned from their statements. 404 until a voice exists; PUT<br/>``{\"enabled\": true}`` to the same path creates it.","operationId":"executives_get_voice_api_v1_executives__executive_name__voice_get","parameters":[{"description":"The executive's name as it appears on documents.","in":"path","name":"executive_name","required":true,"schema":{"description":"The executive's name as it appears on documents.","title":"Executive Name","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecutiveVoice"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get an executive's content-creation voice","tags":["Voices"]},"put":{"deprecated":true,"description":"**Deprecated.** Use `PUT /api/v1/voices/{persona_id}` instead. This path keeps working until a sunset date is announced in the release notes.\n\nBody ``{\"enabled\": true|false}``. Enabling creates and tunes the voice<br/>when missing; disabling keeps the tuned persona so re-enabling is instant.","operationId":"executives_set_voice_api_v1_executives__executive_name__voice_put","parameters":[{"description":"The executive's name as it appears on documents.","in":"path","name":"executive_name","required":true,"schema":{"description":"The executive's name as it appears on documents.","title":"Executive Name","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecutiveVoiceEnabledRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecutiveVoiceToggleResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Include or exclude an executive's voice in content creation","tags":["Voices"]}},"/api/v1/extract-text":{"post":{"deprecated":true,"description":"**Deprecated.** Use `POST /api/v1/documents/extract-text` instead. This path keeps working until a sunset date is announced in the release notes.\n\nSend the file as multipart/form-data in a `file` field: PDF, DOCX, PPTX, TXT, MD, CSV, HTML, RTF, JSON or XML. Nothing is stored.","operationId":"extract_text_from_upload_api_v1_extract_text_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractedTextResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Extract text from an uploaded file without saving","tags":["Documents & content"]}},"/api/v1/ingest/auto-detect":{"post":{"deprecated":true,"description":"**Deprecated.** Use `POST /api/v1/documents/ingest` instead. This path keeps working until a sunset date is announced in the release notes.\n\nAuto-detect content type and ingest document","operationId":"auto_detect_and_ingest_api_v1_ingest_auto_detect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoDetectIngestRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoDetectIngestResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Auto-detect content type and ingest","tags":["Documents & content"]}},"/api/v1/ingest/youtube":{"post":{"deprecated":true,"description":"**Deprecated.** Use `POST /api/v1/documents/ingest` instead. This path keeps working until a sunset date is announced in the release notes.\n\nIngest YouTube video and extract transcript","operationId":"ingest_youtube_video_api_v1_ingest_youtube_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Ingest YouTube video","tags":["Documents & content"]}},"/api/v1/insights":{"get":{"description":"Get AI comparative analysis for selected executives or companies on a specific theme","operationId":"get_insights_api_v1_insights_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get AI comparative analysis for executives or companies on a theme","tags":["Documents & content"]},"post":{"description":"Compare what executives or companies say on a theme, with an optional audience read from your personas.","operationId":"post_insights_api_v1_insights_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightsRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightsResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get AI comparative analysis for executives or companies on a theme","tags":["Documents & content"]}},"/api/v1/insights/refresh-summaries":{"post":{"description":"Refresh executive/company summary caches for the current workspace.","operationId":"refresh_insights_summaries_api_v1_insights_refresh_summaries_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Refresh summary cache tables for insights","tags":["Documents & content"]}},"/api/v1/jobs/{job_id}":{"get":{"description":"Poll the job id returned by a long-running call (ingestion, audience reactions, report generation) until `status` is `completed`, `failed` or `cancelled`. `result` and `parameters` are JSON-encoded strings. Jobs from other workspaces answer 404.","operationId":"get_background_job_status_api_v1_jobs__job_id__get","parameters":[{"description":"The job id returned by the call that queued the work.","in":"path","name":"job_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"}}},"description":"OK"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get a background job","tags":["Workspace"]}},"/api/v1/persona-summaries":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/personas/{persona_id}/summary` instead. This path keeps working until a sunset date is announced in the release notes.\n\nSynthesized summary for ONE persona \u2014 the favorites-card analogue of the<br/>audience category summary (KUM-444). Reuses the category summary generator<br/>scoped to a single persona and caches under a ``persona:<id>`` key. Reads<br/>cache by default; ``force_refresh=true`` regenerates.","operationId":"get_or_generate_persona_summary_api_v1_persona_summaries_get","parameters":[{"description":"The persona.","in":"query","name":"persona_id","required":true,"schema":{"type":"string"}},{"description":"Reactions from the last N days.","in":"query","name":"days","required":false,"schema":{"default":30,"type":"integer"}},{"description":"Regenerate the summary.","in":"query","name":"force_refresh","required":false,"schema":{"type":"boolean"}},{"description":"Model override.","in":"query","name":"model","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get or generate a single-persona reaction summary","tags":["Personas"]}},"/api/v1/personas":{"get":{"description":"Get persona templates for the current workspace, optionally filtered by category.<br/><br/>Supports pagination via ``limit`` (default 200, max 500) and ``offset`` (default 0).<br/>Response includes ``total`` count before pagination so callers can detect truncation.<br/>Use ``?summary=1`` for the lightweight listing (no pagination cap applies there since<br/>summary objects are ~200B each).","operationId":"get_personas_api_v1_personas_get","parameters":[{"description":"Only personas in this audience category.","in":"query","name":"category","required":false,"schema":{"type":"string"}},{"description":"Page size, up to 500.","in":"query","name":"limit","required":false,"schema":{"default":200,"type":"integer"}},{"description":"Skip this many personas.","in":"query","name":"offset","required":false,"schema":{"default":0,"type":"integer"}},{"description":"Set to 1 for a lighter listing: identity, category, avatar, flags and health, with no prompts. Summary mode is not paginated.","in":"query","name":"summary","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaListResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get all personas","tags":["Personas"]},"post":{"description":"Create a new persona template","operationId":"create_persona_api_v1_personas_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaCreateRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaCreatedResponse"}}},"description":"Created"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Create persona","tags":["Personas"]}},"/api/v1/personas/avatar/generate":{"post":{"description":"Disabled (KUM-1321). Avatar generation was the last un-US-pinnable LLM path.<br/><br/>Retired rather than repointed, on three findings that all pointed the same way:<br/><br/>  * ``litellm.image_generation`` is the one litellm entry point the Vertex<br/>    failover wrapper cannot route, so with ``LLM_VERTEX_FAILOVER=1`` every<br/>    other call in the fleet moves to us-central1 and this one silently keeps<br/>    egressing to Google's global endpoint. It was the only remaining hole in<br/>    the US-region inference claim on KUM-1305.<br/>  * Imagen is not reachable on Vertex for this project at all --<br/>    ``imagen-4.0-generate-001``, ``imagegeneration@006`` and<br/>    ``imagen-3.0-generate-002`` all 404 in us-central1 -- so \"route it to<br/>    Vertex instead\" is a Model Garden enablement project, not a one-liner.<br/>  * Lifetime usage is six requests from one workspace in a single 109-second<br/>    burst on 2026-08-12, four of which failed. Nothing has called it since.<br/><br/>Two working avatar paths remain and are untouched: upload<br/>(``/api/v1/personas/avatar/upload``) and paste-an-image-URL. The \"Generate<br/>With AI\" card is removed from the editor so this returns for no one who did<br/>not call the API directly.<br/><br/>Re-enabling is deliberately a code change and not a flag, because a flag here<br/>silently reopens a customer-facing residency answer. It needs two things, and<br/>the second is not optional:<br/><br/>  1. a US-pinned image model enabled in Vertex Model Garden;<br/>  2. a prompt builder that does not paste an image into a text prompt. The<br/>     removed one interpolated ``reference_avatar_url`` verbatim, and<br/>     ``_normalize_avatar_url`` accepts ``data:image/...;base64,`` up to twice<br/>     ``_MAX_AVATAR_UPLOAD_BYTES`` -- so a reference avatar stored as an inline<br/>     data URL (which the upload path falls back to whenever GCS is<br/>     unavailable) went into the request as *text*. That is the measured<br/>     1,254,571-token prompt behind four 400s against a 32,768-token ceiling:<br/>     our bug, not a vendor fault, and it would recur on day one.","operationId":"generate_persona_avatar_api_v1_personas_avatar_generate_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Generate persona avatar image","tags":["Personas"]}},"/api/v1/personas/avatar/upload":{"post":{"description":"Upload an avatar image for personas and return a usable avatar URL.","operationId":"upload_persona_avatar_api_v1_personas_avatar_upload_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Upload persona avatar image","tags":["Personas"]}},"/api/v1/personas/build":{"post":{"description":"Queue one PERSONA_BUILD job per requested audience and kick each at once.<br/><br/>Body: ``{\"personas\": [{\"name\": \"...\", \"organisation\": \"...\", \"context\": \"...\"}, ...]}``<br/>(1\u2013100 rows) \u2192 202 ``{\"jobs\": [{\"job_id\", \"name\"}], \"requested\": n}``.<br/><br/>This is the asynchronous half of the Audience Library's \"Add audiences\":<br/>the foreground path ran two blocking LLM calls per row, chunked at five per<br/>request so a pasted list did not die at the proxy. Here each row is its own<br/>job \u2014 the job manager dedupes PERSONA_BUILD on the requested name, so the<br/>same name twice in one list (or one still queued) shares a job \u2014 and the<br/>requester gets a bell row per persona as it lands. Poll ``GET /api/v1/jobs/<id>``.","operationId":"build_personas_api_v1_personas_build_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Build personas in the background","tags":["Personas"]}},"/api/v1/personas/bulk":{"post":{"description":"Bulk create persona templates for the current workspace.<br/>Skips duplicate names by default.","operationId":"bulk_create_personas_api_v1_personas_bulk_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Bulk create personas","tags":["Personas"]}},"/api/v1/personas/bulk-update":{"post":{"description":"Apply per-persona field updates in one batch, with a per-persona report.<br/><br/>Deliberately NOT \"here is a proposal, here are 40 ids, fan it out\": the<br/>caller sends one explicit entry per persona, so what gets written is what<br/>was reviewed. ``dry_run`` returns the identical before/after computation<br/>without writing, which is what the UI renders as its preview \u2014 a preview<br/>built by the same code path as the write cannot drift from it.","operationId":"bulk_update_personas_api_v1_personas_bulk_update_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Apply a reviewed tuning proposal to many personas","tags":["Personas"]}},"/api/v1/personas/categories":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/audiences/categories` instead. This path keeps working until a sunset date is announced in the release notes.\n\nGet all persona categories for the current workspace, sorted by custom order when available.","operationId":"get_persona_categories_api_v1_personas_categories_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaCategoriesResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get persona categories","tags":["Personas"]}},"/api/v1/personas/chat-onboarding":{"post":{"description":"Stateless chat endpoint for persona onboarding and prompt coaching.<br/>The client sends full conversation history and receives the next assistant turn plus structured suggestions.","operationId":"persona_chat_onboarding_api_v1_personas_chat_onboarding_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Persona chat onboarding and prompt coaching","tags":["Personas"]}},"/api/v1/personas/event-checks":{"get":{"description":"Workspace-wide ledger of real-event persona auto-tests (KUM-1387).<br/><br/>Event checks are ``persona_drift_checks`` rows with NULL<br/>``golden_response_id`` \u2014 a persona reacting to an actually-ingested document,<br/>graded for in-character consistency. Golden-baseline drift checks are a<br/>different population and are excluded here.<br/><br/>Ungated at the API (mirrors ``GET .../health``); the Validation Center UI<br/>gates on ``persona_health_enabled``. The summary reports **counts**, not<br/>percentages \u2014 the KUM-1345 evidence ruling applies to this surface too.","operationId":"get_workspace_event_checks_api_v1_personas_event_checks_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Real-world event auto-test results across the workspace","tags":["Personas"]}},"/api/v1/personas/generate-draft":{"post":{"description":"Generate persona fields from partial inputs.<br/>Name is required. By default, only missing fields are generated.","operationId":"generate_persona_draft_api_v1_personas_generate_draft_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaDraftRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaDraftResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Generate persona draft fields","tags":["Personas"]}},"/api/v1/personas/grade-timeline":{"get":{"description":"Return grade per persona per time period for the breakdown chart.<br/>Groups reaction insights by persona and time period (monthly or quarterly).<br/>Response: { timeline: { personaId: { \"2025-Q1\": { grade, count, reactions } } }, granularity }","operationId":"get_persona_grade_timeline_api_v1_personas_grade_timeline_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get grade timeline for personas by period","tags":["Personas"]}},"/api/v1/personas/interact":{"post":{"description":"Put a question, a draft or a workspace document in front of one persona and get its reply. Replies take 10 to 30 seconds. For a whole audience at once use `POST /api/v1/personas/reaction-insights`.","operationId":"interact_with_persona_api_v1_personas_interact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaInteractRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaInteractResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Interact with persona","tags":["Personas"]}},"/api/v1/personas/preview-compiled-prompt":{"post":{"description":"Return the exact system/user prompt payload that would be sent to the LLM.","operationId":"preview_compiled_persona_prompt_api_v1_personas_preview_compiled_prompt_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Preview compiled persona prompt payload","tags":["Personas"]}},"/api/v1/personas/reaction-insights":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/audiences/reactions` instead. This path keeps working until a sunset date is announced in the release notes.\n\nList cached persona reaction insights for the current workspace.<br/><br/>Set latest_only=true to collapse each (persona, document) pair to its<br/>newest row. It is NOT one row per persona \u2014 a persona that reacted to ten<br/>documents still returns ten rows. That wording used to say \"per persona\",<br/>which read as \"one row, total\" and sent the persona profile page to<br/>latest_only=false, where superseded scorecards skewed its relationship<br/>grade (KUM-989). Leave it off only when you want run history.","operationId":"list_persona_reaction_insights_api_v1_personas_reaction_insights_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List cached persona reaction insights","tags":["Personas"]},"post":{"deprecated":true,"description":"**Deprecated.** Use `POST /api/v1/audiences/reactions` instead. This path keeps working until a sunset date is announced in the release notes.\n\nEach persona reacts to the document with a letter grade, judgments, evidence and actions. Reactions are cached per persona and document; pass `force_refresh` to regenerate. `include: [\"why_it_matters\"]` adds a grounded note on why the document matters to each persona.","operationId":"get_or_generate_persona_reaction_insights_api_v1_personas_reaction_insights_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactionInsightsRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactionInsightsResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get or generate cached persona reaction insights","tags":["Personas"]}},"/api/v1/personas/reaction-insights/async":{"post":{"deprecated":true,"description":"**Deprecated.** Use `POST /api/v1/audiences/reactions/async` instead. This path keeps working until a sunset date is announced in the release notes.\n\nQueue a background job for generating persona reaction insights and return<br/>a job_id the client can poll. This unlocks batches of \u226510 audiences without<br/>tying them to a single-request gateway timeout and lets the UI append rows<br/>as they complete via polling the jobs + reaction-insights list endpoints.<br/><br/>The synchronous POST endpoint remains the right choice for small batches<br/>(see PERSONA_REACTION_SYNC_THRESHOLD); this route is for larger fan-outs.","operationId":"queue_persona_reaction_insights_job_api_v1_personas_reaction_insights_async_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Queue a background job to generate persona reaction insights","tags":["Personas"]}},"/api/v1/personas/reaction-insights/history":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/audiences/reactions/history` instead. This path keeps working until a sunset date is announced in the release notes.\n\nReturn chronological reaction entries for a single persona + document,<br/>ordered newest-first. Used by the reaction-history timeline in the UI.","operationId":"get_persona_reaction_history_api_v1_personas_reaction_insights_history_get","parameters":[{"description":"The persona.","in":"query","name":"persona_id","required":true,"schema":{"type":"string"}},{"description":"The document.","in":"query","name":"document_id","required":true,"schema":{"type":"string"}},{"description":"Most recent N entries.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactionHistoryResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get reaction history for a persona+document pair","tags":["Personas"]}},"/api/v1/personas/why-it-matters":{"post":{"description":"Why this document matters to one persona: a web-grounded note with sources, cached for 7 days. `POST /api/v1/audiences/reactions` returns the same note on every reaction when its `include` lists `why_it_matters`; call this route to fetch one on its own or to regenerate it with `force_refresh`.","operationId":"generate_persona_why_it_matters_api_v1_personas_why_it_matters_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhyItMattersRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhyItMattersResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Generate/fetch grounded 'why this matters' for a persona+document","tags":["Personas"]}},"/api/v1/personas/why-it-matters/config":{"get":{"description":"Return whether the grounded 'Why this matters to them' section is available<br/>for this workspace (feature toggle, super-admin bypassed) and whether it is<br/>configured to generate automatically (workspace setting).","operationId":"get_why_it_matters_config_api_v1_personas_why_it_matters_config_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Why-this-matters availability + auto setting","tags":["Personas"]}},"/api/v1/personas/{persona_id}":{"delete":{"description":"Delete a persona template","operationId":"delete_persona_endpoint_api_v1_personas__persona_id__delete","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete persona","tags":["Personas"]},"get":{"description":"Get a specific persona template","operationId":"get_persona_api_v1_personas__persona_id__get","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get persona by ID","tags":["Personas"]},"put":{"description":"Send only the fields to change.","operationId":"update_persona_endpoint_api_v1_personas__persona_id__put","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update persona","tags":["Personas"]}},"/api/v1/personas/{persona_id}/analyze-voice":{"post":{"description":"Analyze writing samples to extract a structured voice profile for a persona.<br/><br/>Accepts either raw text samples or knowledgebase document IDs.<br/>Uses the workspace system default model (audience_model) for analysis.<br/>Stores the resulting voice profile in the persona's persona_config.","operationId":"analyze_voice_endpoint_api_v1_personas__persona_id__analyze_voice_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Analyze voice from writing samples","tags":["Personas"]}},"/api/v1/personas/{persona_id}/auto-test":{"put":{"description":"Set the per-persona real-event auto-test opt-in (KUM-1296). Body:<br/>``{\"enabled\": true|false}``. Defaults to off; turning it on means every<br/>document ingested into the workspace costs this persona one generation plus<br/>one judge call, capped at ``EVENT_AUTO_TEST_PERSONA_CAP`` personas per event.<br/><br/>The response reports the value **read back** from the persona rather than the<br/>value that was posted: ``update_persona_template`` silently drops config keys<br/>that are missing from its allow-list while still returning success, so<br/>echoing the request would report a write that never landed.","operationId":"set_persona_auto_test_api_v1_personas__persona_id__auto_test_put","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Enable/disable auto-testing this persona against real events","tags":["Personas"]}},"/api/v1/personas/{persona_id}/discover-linkedin":{"post":{"description":"Find LinkedIn profile candidates for a persona from real search results.<br/><br/>Search-engine backed, not LLM backed (KUM-1226). Grounded search cannot do<br/>this job on any transport: the query runs, but Google returns zero citable<br/>chunks for LinkedIn, so the model answers from memory with a name-shaped slug<br/>that nothing then verified. See ``cloud_providers/linkedin_resolver`` for the<br/>measurement, including a wrong first diagnosis worth not repeating.<br/><br/>Every URL returned is one a search engine produced. When retrieval finds<br/>nothing the response is an empty list plus a ``reason`` -- a guessed URL is<br/>worse than none, because applying a candidate writes a persona social link<br/>and points Bright Data at a profile that may not exist.","operationId":"discover_linkedin_for_persona_api_v1_personas__persona_id__discover_linkedin_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Discover LinkedIn profile for persona","tags":["Personas"]}},"/api/v1/personas/{persona_id}/drift-check":{"post":{"description":"Enqueue a PERSONA_DRIFT_CHECK job for a single persona (re-run golden<br/>prompts, LLM-judge similarity, roll health state).","operationId":"trigger_persona_drift_check_api_v1_personas__persona_id__drift_check_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Trigger a persona drift check now","tags":["Personas"]}},"/api/v1/personas/{persona_id}/drift-checks/{check_id}/confirm":{"post":{"description":"Confirm-or-tune \u2192 CONFIRM: the current response is fine, so promote it to<br/>the golden baseline (text + verified_by/at) and mark the check resolved.<br/>Feeds the human-in-the-loop revalidation back into the set, which is what<br/>keeps the baseline current instead of ossifying around an older answer.","operationId":"confirm_persona_drift_check_api_v1_personas__persona_id__drift_checks__check_id__confirm_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}},{"description":"Drift check id.","in":"path","name":"check_id","required":true,"schema":{"description":"Drift check id.","title":"Check Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Confirm a drift check (response fine)","tags":["Personas"]}},"/api/v1/personas/{persona_id}/drift-checks/{check_id}/tune":{"post":{"description":"Confirm-or-tune \u2192 TUNE: the response has drifted; mark the check resolved<br/>as 'tuned' (the UI routes the user to the refinements/feedback flow).","operationId":"tune_persona_drift_check_api_v1_personas__persona_id__drift_checks__check_id__tune_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}},{"description":"Drift check id.","in":"path","name":"check_id","required":true,"schema":{"description":"Drift check id.","title":"Check Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Mark a drift check as being tuned","tags":["Personas"]}},"/api/v1/personas/{persona_id}/drift-policy":{"get":{"description":"Return the effective drift-check cadence (override or workspace default).","operationId":"get_persona_drift_policy_api_v1_personas__persona_id__drift_policy_get","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get persona drift-check cadence","tags":["Personas"]},"put":{"description":"Set (or clear) the per-persona drift-check cadence override. Body:<br/>``{\"frequency\": \"weekly|monthly|quarterly|manual\"}`` (empty/\"default\" clears).","operationId":"set_persona_drift_policy_api_v1_personas__persona_id__drift_policy_put","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Set persona drift-check cadence override","tags":["Personas"]}},"/api/v1/personas/{persona_id}/feedback":{"post":{"description":"Submit feedback for a persona response (thumbs up/down + description).","operationId":"submit_persona_feedback_api_v1_personas__persona_id__feedback_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaFeedbackRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaFeedbackResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Submit persona response feedback","tags":["Personas"]}},"/api/v1/personas/{persona_id}/generate":{"post":{"description":"Write a piece in the persona's voice. The draft is saved as a workspace document.","operationId":"generate_persona_content_api_v1_personas__persona_id__generate_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaGenerateContentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaGenerateContentResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Generate content in persona voice","tags":["Personas"]}},"/api/v1/personas/{persona_id}/golden-responses":{"get":{"description":"List golden-set entries (trusted prompt/response baselines) for a persona.","operationId":"list_persona_golden_responses_api_v1_personas__persona_id__golden_responses_get","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List persona golden responses","tags":["Personas"]},"post":{"description":"Add a golden-set entry.<br/><br/>Two modes:<br/>- Manual/real-world: provide `prompt` + `golden_response` (+ optional `source`).<br/>- Seed-from-feedback: provide `feedback_id`; the server hydrates prompt/response<br/>  from the positive feedback row and stamps source='user_feedback'.","operationId":"create_persona_golden_response_api_v1_personas__persona_id__golden_responses_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Add a golden response","tags":["Personas"]}},"/api/v1/personas/{persona_id}/golden-responses/candidates":{"get":{"description":"List positive feedback items eligible to seed the golden set.<br/><br/>Each candidate carries `already_added` so the picker can disable items that<br/>have already been promoted (deduped by source_feedback_id).","operationId":"list_persona_golden_candidates_api_v1_personas__persona_id__golden_responses_candidates_get","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List seed-from-feedback candidates","tags":["Personas"]}},"/api/v1/personas/{persona_id}/golden-responses/{golden_id}":{"delete":{"description":"Delete a golden-set entry.","operationId":"delete_persona_golden_response_api_v1_personas__persona_id__golden_responses__golden_id__delete","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}},{"description":"Golden response id.","in":"path","name":"golden_id","required":true,"schema":{"description":"Golden response id.","title":"Golden Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete a golden response","tags":["Personas"]},"patch":{"description":"Edit prompt/response or activate/deactivate a golden-set entry.","operationId":"update_persona_golden_response_api_v1_personas__persona_id__golden_responses__golden_id__patch","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}},{"description":"Golden response id.","in":"path","name":"golden_id","required":true,"schema":{"description":"Golden response id.","title":"Golden Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update a golden response","tags":["Personas"]}},"/api/v1/personas/{persona_id}/health":{"get":{"description":"Return a persona's rolling health state, drift cadence, and the latest<br/>drift run's checks (failing ones first) for the confirm-or-tune panel.<br/><br/>Ungated at the API (mirrors golden-responses / refinements); the UI gates on<br/>``persona_health_enabled``.","operationId":"get_persona_health_api_v1_personas__persona_id__health_get","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get persona health + latest drift checks","tags":["Personas"]}},"/api/v1/personas/{persona_id}/intelligence":{"get":{"description":"Return a persona's synthesized snapshots plus its measured corpus facts.<br/><br/>Read-only: this never triggers synthesis. The ``sections`` snapshots are<br/>produced by the PERSONA_INTELLIGENCE job on the persona's refresh cadence or<br/>via the manual refresh endpoint below, so a page view costs no inference<br/>(KUM-681).<br/><br/>``measured`` (KUM-684) is different in kind and is computed here, per<br/>request: follower counts and a recent-activity feed are indexed reads over<br/>the persona's linked knowledgebases, not model output. Snapshotting them<br/>would gain nothing \u2014 there is no inference to amortize \u2014 and would cost<br/>accuracy, because the default refresh cadence is quarterly and a feed<br/>labelled \"live activity\" that is a quarter stale is the kind of thing<br/>KUM-680 removed from this page.<br/><br/>Both are workspace-scoped: stance is measured toward *this* workspace's<br/>company and so are mentions, which is why a marketplace install recomputes<br/>against the buyer's workspace rather than inheriting the seller's reading.","operationId":"get_persona_intelligence_api_v1_personas__persona_id__intelligence_get","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get a persona's intelligence snapshots","tags":["Personas"]}},"/api/v1/personas/{persona_id}/link-external-source":{"post":{"description":"Link an external source (e.g. a journalist's column, a blog, or a publication URL)<br/>to a persona by creating a knowledgebase with a web/RSS watcher source.<br/>If the persona already has an external-source KB, the existing one is returned.","operationId":"link_external_source_to_persona_api_v1_personas__persona_id__link_external_source_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Link external source to persona","tags":["Personas"]}},"/api/v1/personas/{persona_id}/link-file":{"post":{"description":"Upload a file (deck, doc, notes) and link it to a persona as a grounding<br/>source. The file is ingested into a per-persona \"Linked Files\"<br/>knowledgebase that is attached via linked_knowledgebase_ids, so its<br/>content grounds the persona and feeds persona refresh like watched<br/>web/social sources do.","operationId":"link_file_to_persona_api_v1_personas__persona_id__link_file_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Link an uploaded file to persona","tags":["Personas"]}},"/api/v1/personas/{persona_id}/link-linkedin":{"post":{"description":"Link a LinkedIn profile to a persona by creating a knowledgebase with a<br/>LinkedIn watcher source.  If the persona already has a LinkedIn KB, the<br/>existing one is returned instead of creating a duplicate.","operationId":"link_linkedin_to_persona_api_v1_personas__persona_id__link_linkedin_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Link LinkedIn profile to persona","tags":["Personas"]}},"/api/v1/personas/{persona_id}/quick-link":{"post":{"description":"Append one pasted profile or website URL to a persona's links (KUM-779).<br/><br/>The personas listing's \"+\" control posts here rather than PUT /personas/<id>,<br/>because `social_links` on that route is a *replace*: a caller holding only the<br/>one link it just collected would wipe every other link on the persona. Doing<br/>the read-modify-write server-side makes the append atomic and reuses the bulk<br/>importer's de-dupe and cap rules.<br/><br/>A recognized social host lands in `social_links`; anything else lands in<br/>`external_sources`. That split is deliberate and load-bearing, not tidiness:<br/>a non-empty `social_links` is a signal several readers act on. It trips<br/>`classify_persona_kind`'s \"has-public-source\" tiebreak, which would flip an<br/>archetype persona to organization (and switch its profile to the intelligence<br/>shell) just because someone pasted a magazine URL; and it satisfies the<br/>profile's \"Live activity & reach\" readiness row, which is measured only from<br/>x/bluesky/linkedin sources and so would sit permanently ready-but-empty.<br/>`external_sources` is inert for both.","operationId":"quick_link_persona_api_v1_personas__persona_id__quick_link_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Quick-add a persona link","tags":["Personas"]}},"/api/v1/personas/{persona_id}/refinements":{"get":{"description":"List all active refinements (tuning notes) for a persona.","operationId":"list_persona_refinements_api_v1_personas__persona_id__refinements_get","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List persona refinements","tags":["Personas"]},"post":{"description":"Manually add a refinement note to a persona profile.","operationId":"create_persona_refinement_api_v1_personas__persona_id__refinements_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Add manual persona refinement","tags":["Personas"]}},"/api/v1/personas/{persona_id}/refinements/{refinement_id}":{"delete":{"description":"Delete a refinement note from a persona profile.","operationId":"delete_persona_refinement_api_v1_personas__persona_id__refinements__refinement_id__delete","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}},{"description":"Refinement id.","in":"path","name":"refinement_id","required":true,"schema":{"description":"Refinement id.","title":"Refinement Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete persona refinement","tags":["Personas"]},"patch":{"description":"Update content or active state of a refinement note.","operationId":"update_persona_refinement_api_v1_personas__persona_id__refinements__refinement_id__patch","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}},{"description":"Refinement id.","in":"path","name":"refinement_id","required":true,"schema":{"description":"Refinement id.","title":"Refinement Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update persona refinement","tags":["Personas"]}},"/api/v1/personas/{persona_id}/refresh":{"post":{"description":"Enqueue a PERSONA_REFRESH job for a single persona (re-crawl linked KBs,<br/>regenerate the voice/position summary, stamp the cadence).","operationId":"trigger_persona_refresh_api_v1_personas__persona_id__refresh_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Trigger a persona refresh now","tags":["Personas"]}},"/api/v1/personas/{persona_id}/refresh-intelligence":{"post":{"description":"Enqueue a PERSONA_INTELLIGENCE job for a single persona.<br/><br/>The same job the refresh cadence chains, so the manual button and the<br/>schedule share exactly one synthesis path.","operationId":"trigger_persona_intelligence_api_v1_personas__persona_id__refresh_intelligence_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Trigger persona intelligence synthesis now","tags":["Personas"]}},"/api/v1/personas/{persona_id}/refresh-policy":{"get":{"description":"Return the effective refresh cadence for a persona (override or workspace default).","operationId":"get_persona_refresh_policy_api_v1_personas__persona_id__refresh_policy_get","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get persona refresh cadence policy","tags":["Personas"]},"put":{"description":"Set (or clear) the per-persona refresh cadence override.<br/><br/>Body: ``{\"frequency\": \"weekly|monthly|quarterly|manual\"}``. Pass ``null`` /<br/>empty / ``\"default\"`` to clear the override and inherit the workspace default.<br/>Recomputes ``next_refresh_at`` from the last refresh (or now) at the new cadence.","operationId":"set_persona_refresh_policy_api_v1_personas__persona_id__refresh_policy_put","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Set persona refresh cadence override","tags":["Personas"]}},"/api/v1/personas/{persona_id}/relink-marketplace":{"post":{"description":"Point an existing workspace persona at a marketplace catalog row (KUM-1303).<br/><br/>Body: ``{\"source_persona_id\": \"<catalog persona id>\"}``.<br/><br/>This backs the grid's **Replace** action. A workspace can hold a persona that<br/>shares a catalog persona's name but was hand-authored, or was installed before<br/>KUM-1231 taught the install route to record linkage \u2014 either way it carries no<br/>``source_persona_id``, so it is not managed and never receives catalog updates.<br/><br/>Relink happens **in place**. The obvious implementation \u2014 delete the local row<br/>and re-install from the catalog \u2014 mints a new persona id, and everything that<br/>references a persona by id (document auto-tags, signals, audiences, report<br/>inclusion) would silently point at a row that no longer exists. So this only<br/>ever UPDATEs, and the id is part of the contract asserted by the tests.<br/><br/>Two deliberate choices:<br/><br/>* The source id is validated through ``_resolve_marketplace_source_persona`` \u2014<br/>  the same guard the install route applies \u2014 so a caller cannot name an<br/>  arbitrary uuid and pull a persona out of a workspace they cannot read.<br/>* The managed fields (links, grounded prompts, voice details) are<br/>  **overwritten** from the source, not gap-filled the way install does.<br/>  Install is gap-filling because the caller is posting a persona and may<br/>  have edited it in the modal first; here the caller is asking<br/>  to *become* the catalog version. Being precious about ``social_links`` while<br/>  the link sync goes on to clobber instructions/tone/avatar (see<br/>  ``_persona_config_inheritance_keys``) would be incoherent. A **blank** source<br/>  value still never overwrites \u2014 \"the catalog has no links yet\" is not a reason<br/>  to erase the ones the workspace already has, matching the same conservative<br/>  rule in ``_annotate_marketplace_managed``.<br/><br/>Workspace-local settings are not written here: the active flag, category and<br/>report inclusion live in ``persona_config`` and are carried over from the<br/>current row. Note this is **not** the same as promising they survive \u2014 this<br/>call sets ``is_linked_to_source``, and from the next full-mode<br/>``GET /personas`` the link sync overwrites everything in<br/>``_persona_config_inheritance_keys`` from the catalog, which includes<br/>``category``, ``is_active`` and ``include_in_audience``. Callers must say so;<br/>the grid's confirm dialog does.","operationId":"relink_persona_to_marketplace_api_v1_personas__persona_id__relink_marketplace_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Adopt a marketplace source into an existing persona","tags":["Personas"]}},"/api/v1/personas/{persona_id}/self-heal-policy":{"get":{"description":"Return the per-persona self-healing auto-tune policy (KUM-1297).","operationId":"get_persona_self_heal_policy_api_v1_personas__persona_id__self_heal_policy_get","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get persona self-healing auto-tune policy","tags":["Personas"]},"put":{"description":"Turn self-healing auto-tune on or off for one persona (KUM-1297).<br/><br/>Body: ``{\"enabled\": true|false}``. Off by default and off for every existing<br/>persona \u2014 auto-tune rewrites the customer's own persona instructions, so it<br/>only ever runs where someone opted in.<br/><br/>Returns the **read-back** policy rather than the requested one. New<br/>``persona_config`` keys are dropped unless allow-listed in<br/>``update_persona_template``, and that drop returns success, so echoing the<br/>request would report a write that did not happen.","operationId":"set_persona_self_heal_policy_api_v1_personas__persona_id__self_heal_policy_put","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Set persona self-healing auto-tune policy","tags":["Personas"]}},"/api/v1/personas/{persona_id}/summary":{"get":{"description":"What one persona thinks, summarised from its recent reactions.","operationId":"personas_summary_api_v1_personas__persona_id__summary_get","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}},{"description":"Reactions from the last N days.","in":"query","name":"days","required":false,"schema":{"default":30,"type":"integer"}},{"description":"Regenerate the summary.","in":"query","name":"force_refresh","required":false,"schema":{"type":"boolean"}},{"description":"Model override.","in":"query","name":"model","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get or generate a persona summary","tags":["Personas"]}},"/api/v1/personas/{persona_id}/unlink-file":{"post":{"description":"Remove a linked file from a persona: detach the document from the<br/>persona's linked-files KB and soft-delete it (linked-file uploads exist<br/>only to ground this persona).","operationId":"unlink_file_from_persona_api_v1_personas__persona_id__unlink_file_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Unlink an uploaded file from persona","tags":["Personas"]}},"/api/v1/personas/{persona_id}/voice-profiles":{"get":{"description":"Return all voice profiles for a persona.","operationId":"list_voice_profiles_api_v1_personas__persona_id__voice_profiles_get","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List voice profiles for a persona","tags":["Personas"]}},"/api/v1/personas/{persona_id}/voice-profiles/{profile_id}":{"delete":{"description":"Delete a voice profile. Cannot delete the last remaining profile.","operationId":"delete_voice_profile_api_v1_personas__persona_id__voice_profiles__profile_id__delete","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}},{"description":"Voice profile id, as listed by GET /api/v1/personas/{persona_id}/voice-profiles.","in":"path","name":"profile_id","required":true,"schema":{"description":"Voice profile id, as listed by GET /api/v1/personas/{persona_id}/voice-profiles.","title":"Profile Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete a voice profile","tags":["Personas"]},"get":{"description":"Return a single voice profile by ID.","operationId":"get_voice_profile_api_v1_personas__persona_id__voice_profiles__profile_id__get","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}},{"description":"Voice profile id, as listed by GET /api/v1/personas/{persona_id}/voice-profiles.","in":"path","name":"profile_id","required":true,"schema":{"description":"Voice profile id, as listed by GET /api/v1/personas/{persona_id}/voice-profiles.","title":"Profile Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get a single voice profile","tags":["Personas"]},"put":{"description":"Update an existing voice profile (name, adjective_tags, tone_pillars, etc.).","operationId":"update_voice_profile_api_v1_personas__persona_id__voice_profiles__profile_id__put","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}},{"description":"Voice profile id, as listed by GET /api/v1/personas/{persona_id}/voice-profiles.","in":"path","name":"profile_id","required":true,"schema":{"description":"Voice profile id, as listed by GET /api/v1/personas/{persona_id}/voice-profiles.","title":"Profile Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update a voice profile","tags":["Personas"]}},"/api/v1/personas/{persona_id}/voice-profiles/{profile_id}/set-default":{"post":{"description":"Set a voice profile as the default for content generation.","operationId":"set_default_voice_profile_api_v1_personas__persona_id__voice_profiles__profile_id__set_default_post","parameters":[{"description":"Persona id, as returned by GET /api/v1/personas.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id, as returned by GET /api/v1/personas.","title":"Persona Id","type":"string"}},{"description":"Voice profile id, as listed by GET /api/v1/personas/{persona_id}/voice-profiles.","in":"path","name":"profile_id","required":true,"schema":{"description":"Voice profile id, as listed by GET /api/v1/personas/{persona_id}/voice-profiles.","title":"Profile Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Set default voice profile","tags":["Personas"]}},"/api/v1/reports":{"get":{"operationId":"list_custom_reports_api_v1_reports_get","parameters":[{"description":"Set to false to leave out report templates.","in":"query","name":"include_templates","required":false,"schema":{"default":"true","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportsListResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List custom reports for workspace","tags":["Reports"]},"post":{"operationId":"create_custom_report_api_v1_reports_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportCreateRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportCreatedResponse"}}},"description":"Created"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Create a custom report","tags":["Reports"]}},"/api/v1/reports/{report_id}":{"delete":{"operationId":"delete_custom_report_api_v1_reports__report_id__delete","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete a custom report","tags":["Reports"]},"get":{"operationId":"get_custom_report_api_v1_reports__report_id__get","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get custom report with sections","tags":["Reports"]},"patch":{"operationId":"update_custom_report_api_v1_reports__report_id__patch","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update a custom report","tags":["Reports"]}},"/api/v1/reports/{report_id}/customize-style":{"post":{"description":"Use LLM to translate a natural language style description into a layout_config JSON.","operationId":"customize_report_style_api_v1_reports__report_id__customize_style_post","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Generate layout_config from natural language style description","tags":["Reports"]}},"/api/v1/reports/{report_id}/generate":{"post":{"description":"Regenerate all stale sections of a report. Returns cached output for fresh sections.","operationId":"generate_report_all_api_v1_reports__report_id__generate_post","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}},{"description":"Model override.","in":"query","name":"model","required":false,"schema":{"type":"string"}},{"description":"Set to 1 to regenerate sections that are not stale.","in":"query","name":"force","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerateResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Generate all stale sections","tags":["Reports"]}},"/api/v1/reports/{report_id}/pdf":{"get":{"description":"Generate and return a PDF of the report.","operationId":"download_report_pdf_api_v1_reports__report_id__pdf_get","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Download report as PDF","tags":["Reports"]}},"/api/v1/reports/{report_id}/schedule":{"delete":{"description":"Remove the refresh schedule for a report.","operationId":"delete_report_schedule_api_v1_reports__report_id__schedule_delete","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete report schedule","tags":["Reports"]},"get":{"description":"Get the current refresh schedule for a report (if any).","operationId":"get_report_schedule_api_v1_reports__report_id__schedule_get","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get report schedule","tags":["Reports"]},"patch":{"description":"Update the refresh schedule for a report.","operationId":"update_report_schedule_api_v1_reports__report_id__schedule_patch","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update report schedule","tags":["Reports"]},"post":{"description":"Create a recurring refresh schedule for a report.","operationId":"create_report_schedule_api_v1_reports__report_id__schedule_post","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Create report refresh schedule","tags":["Reports"]}},"/api/v1/reports/{report_id}/sections":{"post":{"operationId":"create_report_section_api_v1_reports__report_id__sections_post","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Add section to a report","tags":["Reports"]}},"/api/v1/reports/{report_id}/sections/{section_id}":{"delete":{"operationId":"delete_report_section_api_v1_reports__report_id__sections__section_id__delete","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}},{"description":"Report section id.","in":"path","name":"section_id","required":true,"schema":{"description":"Report section id.","title":"Section Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete a report section","tags":["Reports"]},"patch":{"operationId":"update_report_section_api_v1_reports__report_id__sections__section_id__patch","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}},{"description":"Report section id.","in":"path","name":"section_id","required":true,"schema":{"description":"Report section id.","title":"Section Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update a report section","tags":["Reports"]}},"/api/v1/reports/{report_id}/sections/{section_id}/generate":{"post":{"description":"Force-generate (or regenerate) the LLM output for a single report section.","operationId":"generate_report_section_api_v1_reports__report_id__sections__section_id__generate_post","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}},{"description":"Report section id.","in":"path","name":"section_id","required":true,"schema":{"description":"Report section id.","title":"Section Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Generate output for a single section","tags":["Reports"]}},"/api/v1/reports/{report_id}/send-email":{"post":{"description":"Send the report as an HTML email with optional PDF attachment.","operationId":"send_report_email_api_v1_reports__report_id__send_email_post","parameters":[{"description":"Custom report id.","in":"path","name":"report_id","required":true,"schema":{"description":"Custom report id.","title":"Report Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Send report via email","tags":["Reports"]}},"/api/v1/signal-templates":{"post":{"deprecated":true,"description":"**Deprecated.** Use `POST /api/v1/signals/templates` instead. This path keeps working until a sunset date is announced in the release notes.\n\nCreate a new signal template","operationId":"create_signal_template_api_v1_signal_templates_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Create signal template","tags":["Signals & themes"]}},"/api/v1/signal-templates/bulk":{"post":{"deprecated":true,"description":"**Deprecated.** Use `POST /api/v1/signals/templates/bulk` instead. This path keeps working until a sunset date is announced in the release notes.\n\nBulk create signal templates for the current workspace.<br/>Supports optional row-level prompt/context guidance and optional draft autogeneration.","operationId":"bulk_create_signal_templates_api_v1_signal_templates_bulk_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Bulk create signal templates","tags":["Signals & themes"]}},"/api/v1/signal-templates/generate-draft":{"post":{"deprecated":true,"description":"**Deprecated.** Use `POST /api/v1/signals/templates/generate-draft` instead. This path keeps working until a sunset date is announced in the release notes.\n\nGenerate signal template fields from partial inputs.<br/>Name is required. By default, only missing fields are generated.","operationId":"generate_signal_template_draft_api_v1_signal_templates_generate_draft_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Generate signal template draft fields","tags":["Signals & themes"]}},"/api/v1/signal-templates/{template_id}":{"delete":{"deprecated":true,"description":"**Deprecated.** Use `DELETE /api/v1/signals/templates/{template_id}` instead. This path keeps working until a sunset date is announced in the release notes.\n\nDelete a signal template","operationId":"delete_signal_template_endpoint_api_v1_signal_templates__template_id__delete","parameters":[{"description":"Signal template id.","in":"path","name":"template_id","required":true,"schema":{"description":"Signal template id.","title":"Template Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete signal template","tags":["Signals & themes"]},"put":{"deprecated":true,"description":"**Deprecated.** Use `PUT /api/v1/signals/templates/{template_id}` instead. This path keeps working until a sunset date is announced in the release notes.\n\nUpdate an existing signal template","operationId":"update_signal_template_endpoint_api_v1_signal_templates__template_id__put","parameters":[{"description":"Signal template id.","in":"path","name":"template_id","required":true,"schema":{"description":"Signal template id.","title":"Template Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update signal template","tags":["Signals & themes"]}},"/api/v1/signals":{"get":{"description":"Get all signals with pagination","operationId":"get_all_signals_api_api_v1_signals_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get all signals","tags":["Signals & themes"]}},"/api/v1/signals/document/{document_id}":{"delete":{"description":"Soft-delete all non-deleted signals for a specific document in the current workspace.","operationId":"delete_document_signals_api_api_v1_signals_document__document_id__delete","parameters":[{"description":"Document id.","in":"path","name":"document_id","required":true,"schema":{"description":"Document id.","title":"Document Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete signals for a specific document","tags":["Signals & themes"]},"get":{"description":"Get all signals for a specific document with filtering","operationId":"get_document_signals_api_api_v1_signals_document__document_id__get","parameters":[{"description":"Document id.","in":"path","name":"document_id","required":true,"schema":{"description":"Document id.","title":"Document Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get signals for a specific document","tags":["Signals & themes"]}},"/api/v1/signals/execute-workspace-signals":{"post":{"description":"Execute all signal templates in the workspace against a specific document.<br/><br/>This endpoint is non-blocking - it immediately returns after queuing the signal<br/>execution to run in the background. Use this after document upload to automatically<br/>run all configured signals against the new document.","operationId":"execute_workspace_signals_api_v1_signals_execute_workspace_signals_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteWorkspaceSignalsRequest"}}},"required":true},"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"security":[{"ApiKeyAuth":[]}],"summary":"Execute all workspace signals on a document (async)","tags":["Signals & themes"]}},"/api/v1/signals/filters":{"get":{"description":"The themes, executives, pillars, content types and companies available for filtering.","operationId":"signals_theme_filters_api_v1_signals_filters_get","parameters":[{"description":"Recompute instead of serving the cached copy.","in":"query","name":"refresh","required":false,"schema":{"type":"boolean"}},{"description":"Same as refresh.","in":"query","name":"force_refresh","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThemeFiltersResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get the theme and executive filters","tags":["Signals & themes"]}},"/api/v1/signals/generate":{"post":{"description":"Generate signals from input","operationId":"generate_signals_api_v1_signals_generate_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"security":[{"ApiKeyAuth":[]}],"summary":"Generate signals","tags":["Signals & themes"]}},"/api/v1/signals/runs":{"get":{"description":"Get all signal runs","operationId":"get_signal_runs_api_v1_signals_runs_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get all signal runs","tags":["Signals & themes"]}},"/api/v1/signals/runs/{run_id}":{"get":{"description":"Get signal run status and results","operationId":"get_signal_run_api_v1_signals_runs__run_id__get","parameters":[{"description":"Signal run id.","in":"path","name":"run_id","required":true,"schema":{"description":"Signal run id.","title":"Run Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get signal run","tags":["Signals & themes"]}},"/api/v1/signals/templates":{"get":{"description":"Get all signal templates","operationId":"get_signal_templates_api_v1_signals_templates_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get all signal templates","tags":["Signals & themes"]},"post":{"description":"Create a signal template (a theme to extract).","operationId":"signals_create_template_api_v1_signals_templates_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Create a signal template","tags":["Signals & themes"]}},"/api/v1/signals/templates/bulk":{"post":{"description":"Create several signal templates in one call.","operationId":"signals_create_templates_bulk_api_v1_signals_templates_bulk_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Create signal templates in bulk","tags":["Signals & themes"]}},"/api/v1/signals/templates/generate-draft":{"post":{"description":"Generate the fields of a signal template from a short description.","operationId":"signals_draft_template_api_v1_signals_templates_generate_draft_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Draft a signal template","tags":["Signals & themes"]}},"/api/v1/signals/templates/{template_id}":{"delete":{"description":"Delete a signal template.","operationId":"signals_delete_template_api_v1_signals_templates__template_id__delete","parameters":[{"description":"Signal template id.","in":"path","name":"template_id","required":true,"schema":{"description":"Signal template id.","title":"Template Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Delete a signal template","tags":["Signals & themes"]},"get":{"description":"Get a specific signal template","operationId":"get_signal_template_api_v1_signals_templates__template_id__get","parameters":[{"description":"Signal template id.","in":"path","name":"template_id","required":true,"schema":{"description":"Signal template id.","title":"Template Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get signal template by ID","tags":["Signals & themes"]},"put":{"description":"Update a signal template.","operationId":"signals_update_template_api_v1_signals_templates__template_id__put","parameters":[{"description":"Signal template id.","in":"path","name":"template_id","required":true,"schema":{"description":"Signal template id.","title":"Template Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Update a signal template","tags":["Signals & themes"]}},"/api/v1/signals/templates/{template_id}/signals":{"get":{"description":"Get all signals from a specific template","operationId":"get_signals_by_template_api_v1_signals_templates__template_id__signals_get","parameters":[{"description":"Signal template id.","in":"path","name":"template_id","required":true,"schema":{"description":"Signal template id.","title":"Template Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get signals by template","tags":["Signals & themes"]}},"/api/v1/signals/themes":{"get":{"description":"Theme extractions across the workspace's documents, paginated.","operationId":"signals_themes_api_v1_signals_themes_get","parameters":[{"description":"Page number, 1-based.","in":"query","name":"page","required":false,"schema":{"default":1,"type":"integer"}},{"description":"Items per page.","in":"query","name":"per_page","required":false,"schema":{"default":20,"type":"integer"}},{"description":"Only this theme (signal template name).","in":"query","name":"theme","required":false,"schema":{"type":"string"}},{"description":"Only this executive.","in":"query","name":"executive","required":false,"schema":{"type":"string"}},{"description":"Only this company.","in":"query","name":"company","required":false,"schema":{"type":"string"}},{"description":"Only this communication type.","in":"query","name":"communication_type","required":false,"schema":{"type":"string"}},{"description":"One signal.","in":"query","name":"signal_id","required":false,"schema":{"type":"string"}},{"description":"Recompute instead of serving the cached copy.","in":"query","name":"refresh","required":false,"schema":{"type":"boolean"}},{"description":"Same as refresh.","in":"query","name":"force_refresh","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThemesResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get themes and extracted signals","tags":["Signals & themes"]}},"/api/v1/signals/{signal_id}/feedback":{"post":{"description":"Submit feedback for a signal (thumbs up/down)","operationId":"submit_signal_feedback_api_v1_signals__signal_id__feedback_post","parameters":[{"description":"Signal id.","in":"path","name":"signal_id","required":true,"schema":{"description":"Signal id.","title":"Signal Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Submit signal feedback","tags":["Signals & themes"]}},"/api/v1/test":{"get":{"description":"Simple test endpoint that doesn't require authentication","operationId":"test_endpoint_api_v1_test_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Test endpoint","tags":["test"]}},"/api/v1/test-theme-filters":{"get":{"description":"Test theme filters endpoint without authentication","operationId":"test_theme_filters_api_v1_test_theme_filters_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Test theme filters without auth","tags":["test"]}},"/api/v1/theme-filters":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/signals/filters` instead. This path keeps working until a sunset date is announced in the release notes.\n\nGet available themes and executives for insights analysis","operationId":"get_theme_filters_api_v1_theme_filters_get","parameters":[{"description":"Recompute instead of serving the cached copy.","in":"query","name":"refresh","required":false,"schema":{"type":"boolean"}},{"description":"Same as refresh.","in":"query","name":"force_refresh","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThemeFiltersResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get available themes and executives for insights","tags":["Documents & content"]}},"/api/v1/themes":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/signals/themes` instead. This path keeps working until a sunset date is announced in the release notes.\n\nGet themes and extracted signals with document links and metadata","operationId":"get_themes_api_v1_themes_get","parameters":[{"description":"Page number, 1-based.","in":"query","name":"page","required":false,"schema":{"default":1,"type":"integer"}},{"description":"Items per page.","in":"query","name":"per_page","required":false,"schema":{"default":20,"type":"integer"}},{"description":"Only this theme (signal template name).","in":"query","name":"theme","required":false,"schema":{"type":"string"}},{"description":"Only this executive.","in":"query","name":"executive","required":false,"schema":{"type":"string"}},{"description":"Only this company.","in":"query","name":"company","required":false,"schema":{"type":"string"}},{"description":"Only this communication type.","in":"query","name":"communication_type","required":false,"schema":{"type":"string"}},{"description":"One signal.","in":"query","name":"signal_id","required":false,"schema":{"type":"string"}},{"description":"Recompute instead of serving the cached copy.","in":"query","name":"refresh","required":false,"schema":{"type":"boolean"}},{"description":"Same as refresh.","in":"query","name":"force_refresh","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThemesResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get themes and extracted signals","tags":["Documents & content"]}},"/api/v1/themes-for-executives":{"post":{"description":"Get available themes for selected executives","operationId":"get_themes_for_executives_api_v1_themes_for_executives_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get available themes for selected executives","tags":["Signals & themes"]}},"/api/v1/themes/debug":{"get":{"description":"Debug endpoint to check what signals exist","operationId":"debug_themes_api_v1_themes_debug_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Debug themes data","tags":["Documents & content"]}},"/api/v1/themes/test":{"get":{"description":"Test endpoint to verify signal_generator is working","operationId":"test_themes_api_v1_themes_test_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Test themes endpoint","tags":["Documents & content"]}},"/api/v1/translate":{"post":{"description":"Translate a persona reaction row, or a single string, for the operator.<br/><br/>Two modes, because the two surfaces have different storage:<br/><br/>- ``{\"reaction_insight_id\": ...}`` \u2014 object-scoped. The translation is<br/>  cached on the row at ``response_payload.translations.<tag>``, so every<br/>  repeat view is free. Audience Snapshot cards and narrative Stage A<br/>  responses are both ``persona_reaction_insights`` rows, so both are served<br/>  here.<br/>- ``{\"text\": ...}`` \u2014 stateless. Persona chat in the browser posts to<br/>  ``/api/v1/personas/interact``, which persists nothing, so there is no<br/>  parent object to cache on. The caller caches for the session instead.<br/><br/>``target_language`` resolves **explicit payload value -> the caller's own<br/>preference (``user_settings.ui_preferences.language``, global row) -><br/>the workspace operator language (``workspace.settings.language``) -><br/>English** (KUM-1447). An explicit value still wins, which is what lets a<br/>reader translate one message into something other than their default.","operationId":"translate_persona_output_api_v1_translate_post","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Translate persona output into the operator language","tags":["Personas"]}},"/api/v1/user/workspaces":{"get":{"operationId":"get_user_workspaces_v1_api_v1_user_workspaces_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get all workspaces for the authenticated user","tags":["default"]}},"/api/v1/validation/runs":{"get":{"description":"Summaries (no payload) of every run of ``kind`` \u2014 the trend strip.","operationId":"list_validation_runs_api_v1_validation_runs_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Validation study runs, summaries only, newest first","tags":["Personas"]}},"/api/v1/validation/runs/latest":{"get":{"description":"The Validation Center's study data (KUM-1387).<br/><br/>``kind`` is ``prediction_ledger`` (the retrospective Prediction Ledger:<br/>persona arms vs same-model baselines on real events, design/kum-1387-<br/>prediction-ledger) or ``voice_backtest`` (the V1 pairwise voice-fidelity<br/>study). Rows are written only by the study harness's exporter, so what this<br/>serves is exactly what RESULTS.md was generated from. Fleet-level evidence<br/>about the marketplace catalog, not workspace data \u2014 any authenticated key<br/>with persona.read may read it; the polarys page keeps its own gate.<br/>Missing run => 404 with a body the page can tell apart from an empty ledger.","operationId":"get_latest_validation_run_api_v1_validation_runs_latest_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Latest run of a pre-registered persona validation study","tags":["Personas"]}},"/api/v1/voices":{"get":{"description":"Every persona offered as a content-creation voice, plus executives that have<br/>been materialised as voices whether or not they are currently enabled.","operationId":"voices_list_api_v1_voices_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoicesResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List voices","tags":["Voices"]},"post":{"description":"``{\"executive\": \"<name>\"}`` materialises an executive named on the workspace's<br/>documents as a tuned voice persona (one model call on first creation; an existing<br/>voice is re-enabled). ``{\"persona_id\": \"<id>\"}`` offers an existing persona as a<br/>voice. Answers 201 with the voice.","operationId":"voices_create_api_v1_voices_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceCreateRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceCreatedResponse"}}},"description":"Created"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Add a voice","tags":["Voices"]}},"/api/v1/voices/{persona_id}":{"get":{"description":"One voice by its persona id. 404 when the persona is not a voice in this workspace.","operationId":"voices_get_api_v1_voices__persona_id__get","parameters":[{"description":"Persona id of the voice, as listed by GET /api/v1/voices.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id of the voice, as listed by GET /api/v1/voices.","title":"Persona Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceObject"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get a voice","tags":["Voices"]},"put":{"description":"Body ``{\"enabled\": true|false}``. For an executive's voice this is the same<br/>toggle as the executives page: enabling tunes the persona from the executive's<br/>statements when it has not been tuned yet, disabling keeps the tuned persona.<br/>For any other persona it sets ``include_in_voice_list``.","operationId":"voices_set_api_v1_voices__persona_id__put","parameters":[{"description":"Persona id of the voice, as listed by GET /api/v1/voices.","in":"path","name":"persona_id","required":true,"schema":{"description":"Persona id of the voice, as listed by GET /api/v1/voices.","title":"Persona Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceEnabledRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceObject"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Enable or disable a voice","tags":["Voices"]}},"/api/v1/workspace":{"get":{"description":"The workspace the API key belongs to, with the caller's role and the workspace settings.","operationId":"get_current_workspace_api_v1_workspace_get","parameters":[{"description":"Read another workspace by id. Only honoured for admin keys; every other key gets its own workspace.","in":"query","name":"workspace_id","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get the current workspace","tags":["Workspace"]}},"/api/v1/workspace/company-tags":{"get":{"description":"Return distinct company names extracted by company auto tags for this workspace.<br/><br/>Admin key may pass ?workspace_id= to query another workspace.","operationId":"get_workspace_company_tags_api_v1_workspace_company_tags_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List company names extracted by company auto tags","tags":["Workspace"]}},"/api/v1/workspace/content-type-tags":{"get":{"description":"Return distinct content/communication type values extracted by content-type auto tags.","operationId":"get_workspace_content_type_tags_api_v1_workspace_content_type_tags_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List the workspace's content-type tags","tags":["Workspace"]}},"/api/v1/workspace/health-check-families":{"get":{"description":"Return every check family, its declared cost, and this workspace's opt-in.<br/><br/>Ungated at the API for the same reason ``GET /personas/<id>/health`` is: the<br/>settings UI needs to know whether the feature is on in order to decide what<br/>to render, and a 403 is indistinguishable from \"no families exist\" at the<br/>fetch site. ``master_enabled`` in the payload is the honest answer; the write<br/>below is what is gated.","operationId":"get_workspace_health_check_families_api_v1_workspace_health_check_families_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get per-family health-check toggles + cost","tags":["Personas"]},"put":{"description":"Enable or disable individual check families for this workspace.<br/><br/>Body: ``{\"families\": {\"drift\": true}}`` \u2014 a partial map. Families the body<br/>does not name keep their stored state, so a UI that persists one switch<br/>cannot silently reset the others.<br/><br/>Returns the **read-back** resolved policy rather than the requested state<br/>(the KUM-1297 convention): a settings write that lands nowhere still returns<br/>200, so the client must render what persisted, not what it asked for.","operationId":"set_workspace_health_check_families_api_v1_workspace_health_check_families_put","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Set per-family health-check toggles","tags":["Personas"]}},"/api/v1/workspace/persona-refresh-default":{"get":{"description":"Return the workspace-level default refresh cadence (falls back to quarterly).","operationId":"get_workspace_persona_refresh_default_api_v1_workspace_persona_refresh_default_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get workspace default persona refresh cadence","tags":["Personas"]},"put":{"description":"Set the workspace-level default refresh cadence (marquee/default personas<br/>inherit this when they have no per-persona override).","operationId":"set_workspace_persona_refresh_default_api_v1_workspace_persona_refresh_default_put","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Set workspace default persona refresh cadence","tags":["Personas"]}},"/api/v1/workspace/pull-through-priorities":{"get":{"description":"The pull-through priorities content writing checks drafts against.","operationId":"workspace_get_pull_through_priorities_api_v1_workspace_pull_through_priorities_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PullThroughPrioritiesResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get the workspace pull-through priorities","tags":["Workspace"]},"put":{"description":"Replace the whole list.","operationId":"workspace_update_pull_through_priorities_api_v1_workspace_pull_through_priorities_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PullThroughPrioritiesRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PullThroughPrioritiesResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Replace the workspace pull-through priorities","tags":["Workspace"]}},"/api/workspaces/{workspace_id}/members":{"get":{"description":"Return workspace members for sharing UI.","operationId":"list_workspace_members_api_workspaces__workspace_id__members_get","parameters":[{"description":"Workspace id (ws_\u2026). Must be the key's own workspace.","in":"path","name":"workspace_id","required":true,"schema":{"description":"Workspace id (ws_\u2026). Must be the key's own workspace.","title":"Workspace Id","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"List workspace members","tags":["Documents & content"]}},"/api/workspaces/{workspace_id}/pull_through_priorities":{"get":{"deprecated":true,"description":"**Deprecated.** Use `GET /api/v1/workspace/pull-through-priorities` instead. This path keeps working until a sunset date is announced in the release notes.\n\nReturn the workspace-scoped pull-through priorities list.","operationId":"get_pull_through_priorities_api_workspaces__workspace_id__pull_through_priorities_get","parameters":[{"description":"Workspace id (ws_\u2026). Must be the key's own workspace.","in":"path","name":"workspace_id","required":true,"schema":{"description":"Workspace id (ws_\u2026). Must be the key's own workspace.","title":"Workspace Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PullThroughPrioritiesResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Get workspace pull-through priorities","tags":["Documents & content"]},"put":{"deprecated":true,"description":"**Deprecated.** Use `PUT /api/v1/workspace/pull-through-priorities` instead. This path keeps working until a sunset date is announced in the release notes.\n\nAtomically replace the workspace-scoped pull-through priorities list.","operationId":"update_pull_through_priorities_api_workspaces__workspace_id__pull_through_priorities_put","parameters":[{"description":"Workspace id (ws_\u2026). Must be the key's own workspace.","in":"path","name":"workspace_id","required":true,"schema":{"description":"Workspace id (ws_\u2026). Must be the key's own workspace.","title":"Workspace Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PullThroughPrioritiesRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PullThroughPrioritiesResponse"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Replace workspace pull-through priorities","tags":["Documents & content"]}},"/docs":{"get":{"operationId":"docs_alias_docs_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Backward-compatible docs URLs.","tags":["default"]}},"/openapi.json":{"get":{"operationId":"openapi_json_alias_openapi_json_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Backward-compatible OpenAPI JSON URL.","tags":["default"]}},"/redoc":{"get":{"operationId":"redoc_alias_redoc_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Backward-compatible ReDoc URL.","tags":["default"]}},"/swagger":{"get":{"operationId":"docs_alias_swagger_get","responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Entity"}},"summary":"Backward-compatible docs URLs.","tags":["default"]}}},"tags":[{"description":"The current workspace and the tag vocabularies it has extracted.","name":"Workspace"},{"description":"Upload, ingest, query and tag documents; run the content-writing endpoints.","name":"Documents & content"},{"description":"Create, ground and query the synthetic personas in a workspace: interact, summarise, write in their voice.","name":"Personas"},{"description":"The personas you can write as in content creation, including executives materialised from their own statements.","name":"Voices"},{"description":"Persona categories: list and order them, summarise an audience, and generate reactions for many personas at once.","name":"Audiences"},{"description":"Signal templates (themes), theme filters, signal runs, and the executives extracted from documents.","name":"Signals & themes"},{"description":"Auto-tag definitions, aliases and normalization.","name":"Auto tags"},{"description":"Custom report definitions, sections, generation, PDF export and scheduling. Requires the Custom reports feature on the workspace.","name":"Reports"},{"description":"Alert composer helpers.","name":"Alerts"},{"description":"Test endpoints","name":"test"}]}
