{"components":{"schemas":{"AcceptHandoverRequest":{"properties":{"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Target tenant whose handover request to accept. Honored only for a platform service account (the Teams relay); any other caller passing it gets 403. Omit to accept in the caller's own tenant.","title":"Client Id"},"technician_aad_id":{"description":"AAD object id of the technician who tapped Accept","title":"Technician Aad Id","type":"string"},"technician_name":{"description":"Display name of the accepting technician","title":"Technician Name","type":"string"},"technician_tenant_id":{"description":"The technician's MSP M365 tenant id","title":"Technician Tenant Id","type":"string"}},"required":["technician_aad_id","technician_tenant_id","technician_name"],"title":"AcceptHandoverRequest","type":"object"},"AccessLevel":{"description":"Universal access level for all integration permission groups.","enum":["Disabled","Read Only","Read/Write"],"title":"AccessLevel","type":"string"},"AdIntegration":{"description":"Active Directory integration configuration.","properties":{"permissions":{"items":{"$ref":"#/components/schemas/AdPermissionGroup"},"title":"Permissions","type":"array"}},"title":"AdIntegration","type":"object"},"AdPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"group_type":{"$ref":"#/components/schemas/AdPermissionGroupType","enum":["USER_MANAGEMENT","GROUPS","COMPUTERS","ORGANIZATIONAL_STRUCTURE","INFRASTRUCTURE","ENTRA_CONNECT_SYNC"],"enumNames":["User Management","Groups","Computers","Organizational Structure","Infrastructure","Entra Connect Sync"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"AdPermissionGroup","type":"object"},"AdPermissionGroupType":{"enum":["User Management","Groups","Computers","Organizational Structure","Infrastructure","Entra Connect Sync"],"title":"AdPermissionGroupType","type":"string"},"AdditionalCustomInstructions":{"properties":{"additional_custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Custom Instructions"}},"required":["additional_custom_instructions"],"title":"AdditionalCustomInstructions","type":"object"},"Agent":{"description":"Lean summary of a workflow row \u2014 the per-item shape `GET /public-api/agents`\n(list) returns. The single-resource `GET /public-api/agents/<id>` returns the\nricher `AgentDetail`; historical snapshots come back as `AgentVersion`.","properties":{"access":{"$ref":"#/components/schemas/AgentAccess"},"audience":{"$ref":"#/components/schemas/ToolAudience"},"autonomy_type":{"$ref":"#/components/schemas/AutonomyType"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"entity_type":{"$ref":"#/components/schemas/EntityType"},"id":{"title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"state":{"$ref":"#/components/schemas/WorkflowState"},"trigger_type":{"$ref":"#/components/schemas/WorkflowTriggerType"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","name","state","autonomy_type","entity_type","trigger_type","audience","access","created_at","updated_at"],"title":"Agent","type":"object"},"AgentAccess":{"description":"Who, within the MSP's own staff, may message an INTERNAL chat agent.\n\nALL_USERS \u2014 any active member of the MSP tenant may message the agent. The default, so a\n  newly created agent is usable by the whole team out of the box.\nADMINS_ONLY \u2014 only tenant admins (and Neo super-admins). A natural choice for privileged\n  agents such as the Neo Support Agent (its toolbox can retry/cancel runs and approve TILs),\n  which an MSP admin can opt into \u2014 it is never forced; even managed agents default to ALL_USERS.\nSPECIFIC_USERS \u2014 admins, the agent's creator, and users it has been explicitly shared with\n  (reuses the existing per-user `shared_workflows` grant).","enum":["ALL_USERS","ADMINS_ONLY","SPECIFIC_USERS"],"title":"AgentAccess","type":"string"},"AgentDetail":{"properties":{"access":{"$ref":"#/components/schemas/AgentAccess"},"actions":{"items":{"additionalProperties":true,"type":"object"},"title":"Actions","type":"array"},"agent_settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Agent Settings"},"audience":{"$ref":"#/components/schemas/ToolAudience"},"autonomy_type":{"$ref":"#/components/schemas/AutonomyType"},"callback_settings":{"anyOf":[{"$ref":"#/components/schemas/EventMatchSettings"},{"type":"null"}]},"created_at":{"format":"date-time","title":"Created At","type":"string"},"entity_type":{"$ref":"#/components/schemas/EntityType"},"id":{"title":"Id","type":"string"},"integrations":{"anyOf":[{"$ref":"#/components/schemas/Integrations"},{"type":"null"}]},"name":{"title":"Name","type":"string"},"schedule":{"anyOf":[{"$ref":"#/components/schemas/WorkflowSchedule"},{"type":"null"}]},"state":{"$ref":"#/components/schemas/WorkflowState"},"toolbox":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Toolbox"},"trigger_type":{"$ref":"#/components/schemas/WorkflowTriggerType"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","name","state","autonomy_type","entity_type","trigger_type","audience","access","created_at","updated_at","agent_settings","toolbox","integrations","actions","callback_settings","schedule"],"title":"AgentDetail","type":"object"},"AgentSettings":{"description":"Settings that control the behavior of the agent.","properties":{"custom_instructions":{"title":"Custom Instructions","type":"string"},"model":{"anyOf":[{"$ref":"#/components/schemas/OpenAiModel"},{"type":"null"}],"default":null,"description":"LLM model to use for this agent. None = runtime default (MasterAgent: GPT5_1; ChatAgent: GPT5_1)."},"reasoning_effort":{"anyOf":[{"$ref":"#/components/schemas/ReasoningEffort"},{"type":"null"}],"default":null,"description":"Reasoning effort to use for this agent. None = framework default (MEDIUM)."},"report_test_via":{"$ref":"#/components/schemas/ReportTestVia","default":"INTERNAL_TICKET_NOTE","description":"The agent will report the test results via the specified method."},"subagent_fanout_enabled":{"default":false,"description":"Deprecated no-op. Subagent fan-out (dispatch_subagents) is available on every agent automatically; this flag is ignored and retained only for backward compatibility.","title":"Subagent Fanout Enabled","type":"boolean"},"test_mode":{"default":false,"description":"If true, the agent will not call tools with side effects, like updating tickets, creating time entries, etc. It would add a Ticket Note instead.","title":"Test Mode","type":"boolean"},"til_channel":{"$ref":"#/components/schemas/TilChannel","default":"TEAMS","description":"Where Technician-in-the-Loop approval requests are delivered. Teams: adaptive card to the configured technicians. Chat: inline approval card in the chat session."},"trigger_mode":{"$ref":"#/components/schemas/TriggerMode","default":"MENTION_ONLY","description":"When the Teams bot forwards a message to this agent in group-chat/channel scopes: MENTION_ONLY (only messages that @mention the bot) or READ_ALL (every message). Personal 1:1 chats always forward regardless."}},"required":["custom_instructions"],"title":"AgentSettings","type":"object"},"AgentStats":{"properties":{"average_execution_time":{"title":"Average Execution Time","type":"number"},"failed_executions":{"title":"Failed Executions","type":"integer"},"last_execution_time":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Execution Time"},"successful_executions":{"title":"Successful Executions","type":"integer"},"total_executions":{"title":"Total Executions","type":"integer"}},"required":["total_executions","successful_executions","failed_executions","average_execution_time","last_execution_time"],"title":"AgentStats","type":"object"},"AgentUsage":{"properties":{"agent_id":{"title":"Agent Id","type":"integer"},"agent_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Name"},"credits_consumed":{"title":"Credits Consumed","type":"integer"},"unique_tickets":{"title":"Unique Tickets","type":"integer"}},"required":["agent_id","agent_name","credits_consumed","unique_tickets"],"title":"AgentUsage","type":"object"},"AgentUsageBreakdown":{"properties":{"agents":{"items":{"$ref":"#/components/schemas/AgentUsage"},"title":"Agents","type":"array"},"month":{"title":"Month","type":"string"}},"required":["month","agents"],"title":"AgentUsageBreakdown","type":"object"},"AgentVersion":{"properties":{"access":{"$ref":"#/components/schemas/AgentAccess"},"actions":{"items":{"additionalProperties":true,"type":"object"},"title":"Actions","type":"array"},"agent_settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Agent Settings"},"audience":{"$ref":"#/components/schemas/ToolAudience"},"autonomy_type":{"$ref":"#/components/schemas/AutonomyType"},"callback_settings":{"anyOf":[{"$ref":"#/components/schemas/EventMatchSettings"},{"type":"null"}]},"created_at":{"format":"date-time","title":"Created At","type":"string"},"entity_type":{"$ref":"#/components/schemas/EntityType"},"id":{"title":"Id","type":"string"},"integrations":{"anyOf":[{"$ref":"#/components/schemas/Integrations"},{"type":"null"}]},"name":{"title":"Name","type":"string"},"schedule":{"anyOf":[{"$ref":"#/components/schemas/WorkflowSchedule"},{"type":"null"}]},"state":{"$ref":"#/components/schemas/WorkflowState"},"toolbox":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Toolbox"},"trigger_type":{"$ref":"#/components/schemas/WorkflowTriggerType"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"version_timestamp":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Version Timestamp"}},"required":["id","name","state","autonomy_type","entity_type","trigger_type","audience","access","created_at","updated_at","agent_settings","toolbox","integrations","actions","callback_settings","schedule","version_timestamp"],"title":"AgentVersion","type":"object"},"AgentVersionSummary":{"properties":{"access":{"$ref":"#/components/schemas/AgentAccess"},"audience":{"$ref":"#/components/schemas/ToolAudience"},"autonomy_type":{"$ref":"#/components/schemas/AutonomyType"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"entity_type":{"$ref":"#/components/schemas/EntityType"},"id":{"title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"state":{"$ref":"#/components/schemas/WorkflowState"},"trigger_type":{"$ref":"#/components/schemas/WorkflowTriggerType"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"version_timestamp":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Version Timestamp"}},"required":["id","name","state","autonomy_type","entity_type","trigger_type","audience","access","created_at","updated_at","version_timestamp"],"title":"AgentVersionSummary","type":"object"},"Announcement":{"properties":{"channels":{"items":{"$ref":"#/components/schemas/AnnouncementChannel"},"title":"Channels","type":"array"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"title":"Id","type":"integer"},"is_active":{"title":"Is Active","type":"boolean"},"is_global":{"title":"Is Global","type":"boolean"},"message":{"title":"Message","type":"string"},"type":{"$ref":"#/components/schemas/AnnouncementType"}},"required":["id","created_at","message","type","channels","is_active","is_global"],"title":"Announcement","type":"object"},"AnnouncementChannel":{"description":"Channels where announcements can be delivered","enum":["DASHBOARD","EMAIL","TEAMS","SLACK"],"title":"AnnouncementChannel","type":"string"},"AnnouncementType":{"description":"Types of announcements that can be sent","enum":["GENERAL_OUTAGE","PARTIAL_OUTAGE","NEW_FEATURE","NEWSLETTER","CREDIT_USAGE_90_PERCENT","CREDIT_FORECAST_100_PERCENT","CREDIT_LIMIT_REACHED","CREDIT_PACK_ADDED","CREDIT_PLAN_AUTO_UPGRADED"],"title":"AnnouncementType","type":"string"},"ApiKeyCreateResponse":{"properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"expires_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Expires At"},"id":{"title":"Id","type":"string"},"key":{"title":"Key","type":"string"},"name":{"title":"Name","type":"string"}},"required":["id","name","key","expires_at","created_at"],"title":"ApiKeyCreateResponse","type":"object"},"ApiKeyListItem":{"properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"expires_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Expires At"},"id":{"title":"Id","type":"string"},"last_used_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Used At"},"managed":{"title":"Managed","type":"boolean"},"name":{"title":"Name","type":"string"}},"required":["id","name","last_used_at","expires_at","created_at","managed"],"title":"ApiKeyListItem","type":"object"},"ArtifactDownloadUrl":{"description":"Short-lived SAS URL for a `SANDBOX_FILE` artifact. Markdown artifacts\ndon't have downloads \u2014 their content is inline on the list response.","properties":{"download_url":{"title":"Download Url","type":"string"}},"required":["download_url"],"title":"ArtifactDownloadUrl","type":"object"},"ArtifactType":{"enum":["MARKDOWN","SANDBOX_FILE"],"title":"ArtifactType","type":"string"},"AtClientFacingNoteSettings":{"description":"AT-specific client-facing note settings.","properties":{"allow_notify_additional_contacts":{"default":false,"title":"Allow Notify Additional Contacts","type":"boolean"},"include_random_delay":{"default":false,"title":"Include Random Delay","type":"boolean"},"max_delay_minutes":{"default":20,"title":"Max Delay Minutes","type":"integer"},"min_delay_minutes":{"default":10,"title":"Min Delay Minutes","type":"integer"},"note_publish_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Note Publish Id"},"note_type_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Note Type Id"},"notification_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"TICKET_NOTE","title":"Notification Mode"},"skip_notifications_for_closed_tickets":{"default":true,"title":"Skip Notifications For Closed Tickets","type":"boolean"},"udf_field_name":{"default":"Notify Contact by Email","title":"Udf Field Name","type":"string"},"use_custom_note_type":{"default":false,"title":"Use Custom Note Type","type":"boolean"},"use_udf_field":{"default":false,"title":"Use Udf Field","type":"boolean"}},"title":"AtClientFacingNoteSettings","type":"object"},"AtInternalNoteSettings":{"description":"AT-specific internal note settings on the TICKET_NOTES (Internal) group.\n\nLets an MSP pin a dedicated Autotask Note Type / Publish on Neo's internal notes so their\nAutotask workflow rules can tell Neo's notes apart from real technician/contact activity.\nApplied by enforcing the configured ids onto internal note writes on the generic\nAT_PSA_REQUEST path \u2014 see autotask_request_tool._enforce_internal_note_type. Publish is scoped\nto internal values only (Internal Project Team / Internal & Co-Managed); see INTERNAL_PUBLISH_IDS.","properties":{"note_publish_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Note Publish Id"},"note_type_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Note Type Id"},"use_custom_note_type":{"default":false,"title":"Use Custom Note Type","type":"boolean"}},"title":"AtInternalNoteSettings","type":"object"},"AtPsaIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/AtPsaPermissionGroup"},"title":"Permissions","type":"array"}},"title":"AtPsaIntegration","type":"object"},"AtPsaPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"allow_delete":{"default":false,"description":"Allow deleting records (DELETE requests)","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Allow Delete","type":"boolean"},"allow_merge":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Allow merging tickets (manual multi-step procedure)","show_if_another_field_is":{"field_name":"group_type","field_value":"TICKETS"},"title":"Allow Merge"},"client_facing_settings":{"anyOf":[{"$ref":"#/components/schemas/AtClientFacingNoteSettings"},{"type":"null"}],"default":null},"group_type":{"$ref":"#/components/schemas/AtPsaPermissionGroupType","enum":["TICKETS","TICKET_NOTES","CLIENT_FACING_TICKET_NOTES","CONTACTS","COMPANIES","CONFIGURATIONS","TIME_ENTRIES","SERVICE_CALLS","PROJECTS","PRODUCTS","CONTRACTS","OPPORTUNITIES","COMPANY_TODOS","TAGS","RESOURCES","BILLING_CODES","ATTACHMENTS","KNOWLEDGE_BASE","DOCUMENTS","INVOICES","EXPENSES","PURCHASE_ORDERS","QUOTES","SALES_ORDERS","INVENTORY","SURVEYS","ADMIN"],"enumNames":["Tickets","Ticket Notes (Internal)","Ticket Notes (Client-Facing)","Contacts","Companies","Configurations","Time Entries","Service Calls","Projects","Products","Contracts","Opportunities","Company To-Dos","Tags","Resources","Billing Codes","Attachments","Knowledge Base","Documents","Invoices","Expenses","Purchase Orders","Quotes","Sales Orders","Inventory","Surveys","Admin"],"title":"Permission Group"},"internal_note_settings":{"anyOf":[{"$ref":"#/components/schemas/AtInternalNoteSettings"},{"type":"null"}],"default":null},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"},"time_entry_udf_settings":{"anyOf":[{"$ref":"#/components/schemas/AtTimeEntryUdfSettings"},{"type":"null"}],"default":null},"update_allowed_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Fields the agent may update (None = all fields allowed)","title":"Allowed Update Fields"}},"required":["access_level","group_type"],"title":"AtPsaPermissionGroup","type":"object"},"AtPsaPermissionGroupType":{"enum":["Tickets","Ticket Notes (Internal)","Ticket Notes (Client-Facing)","Contacts","Companies","Configurations","Time Entries","Service Calls","Projects","Products","Contracts","Opportunities","Company To-Dos","Tags","Resources","Billing Codes","Attachments","Knowledge Base","Documents","Invoices","Expenses","Purchase Orders","Quotes","Sales Orders","Inventory","Surveys","Admin"],"title":"AtPsaPermissionGroupType","type":"string"},"AtTimeEntryUdfSettings":{"description":"AT-specific UDF settings for time entry email notifications.","properties":{"include_dynamic_delay":{"default":false,"title":"Include Dynamic Delay","type":"boolean"},"max_delay_minutes":{"default":20,"title":"Max Delay Minutes","type":"integer"},"min_delay_minutes":{"default":10,"title":"Min Delay Minutes","type":"integer"},"udf_field_name":{"default":"Notify Contact by Email","title":"Udf Field Name","type":"string"},"use_udf_field":{"default":false,"title":"Use Udf Field","type":"boolean"}},"title":"AtTimeEntryUdfSettings","type":"object"},"AttachmentUploadUrlRequest":{"properties":{"content_type":{"description":"Attachment MIME type \u2014 an image (image/png, image/jpeg, image/gif, image/webp) or a document (e.g. application/pdf, text/plain, text/csv, Word/Excel).","title":"Content Type","type":"string"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Original filename, used only for blob readability.","title":"Filename"}},"required":["content_type"],"title":"AttachmentUploadUrlRequest","type":"object"},"AttachmentUploadUrlResponse":{"description":"A short-lived, single-blob upload grant. PUT the file bytes to `upload_url` with headers\n`x-ms-blob-type: BlockBlob` and `x-ms-blob-content-type: <mime>`, then reference `blob_path`\nin the `attachments` of `POST /chat/sessions/<id>/messages`.","properties":{"blob_path":{"title":"Blob Path","type":"string"},"max_image_bytes":{"title":"Max Image Bytes","type":"integer"},"mime":{"title":"Mime","type":"string"},"upload_url":{"title":"Upload Url","type":"string"}},"required":["upload_url","blob_path","mime","max_image_bytes"],"title":"AttachmentUploadUrlResponse","type":"object"},"AutonomyType":{"enum":["CHAINED_ACTIONS","AGENTIC","CONVERSATIONAL"],"title":"AutonomyType","type":"string"},"BackfillCostEstimate":{"description":"The customer-facing cost ceiling shown alongside a created backfill.\nCredit-denominated, never $/token \u2014 provider cost details never leave\nthe public API surface (spec \u00a76).","properties":{"credits_per_entity":{"title":"Credits Per Entity","type":"integer"},"total_credits_estimated":{"title":"Total Credits Estimated","type":"integer"},"total_entities":{"title":"Total Entities","type":"integer"}},"required":["total_entities","credits_per_entity","total_credits_estimated"],"title":"BackfillCostEstimate","type":"object"},"BackfillRunState":{"enum":["DRAFT","RUNNING","PAUSED","COMPLETED","CANCELLED","FAILED"],"title":"BackfillRunState","type":"string"},"BackfillSafetyLevel":{"enum":["OK","WARNING","ERROR"],"title":"BackfillSafetyLevel","type":"string"},"BulkUpdateRequest":{"properties":{"ids":{"items":{"type":"string"},"title":"Ids","type":"array"},"patch":{"additionalProperties":true,"title":"Patch","type":"object"}},"required":["ids","patch"],"title":"BulkUpdateRequest","type":"object"},"BulkUpdateResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/BulkUpdateResult"},"title":"Results","type":"array"}},"required":["results"],"title":"BulkUpdateResponse","type":"object"},"BulkUpdateResult":{"properties":{"error":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Error"},"id":{"title":"Id","type":"string"},"status":{"enum":["ok","error"],"title":"Status","type":"string"}},"required":["id","status"],"title":"BulkUpdateResult","type":"object"},"Callback":{"properties":{"callback_id":{"title":"Callback Id","type":"string"},"change_type":{"$ref":"#/components/schemas/EventType"},"created_in_psa_at":{"format":"date-time","title":"Created In Psa At","type":"string"},"entity_id":{"title":"Entity Id","type":"string"},"entity_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Number"},"entity_type":{"$ref":"#/components/schemas/EntityType"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"failed_to_match_workflow_ids":{"items":{"type":"integer"},"title":"Failed To Match Workflow Ids","type":"array"},"finished_processing_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Finished Processing At"},"matcher_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matcher Run Id"},"started_workflow_ids":{"items":{"type":"integer"},"title":"Started Workflow Ids","type":"array"},"state":{"$ref":"#/components/schemas/EventState"},"workflow_matches":{"anyOf":[{"items":{"$ref":"#/components/schemas/CallbackWorkflowMatch"},"type":"array"},{"type":"null"}],"title":"Workflow Matches"}},"required":["callback_id","state","entity_type","change_type","entity_id","entity_number","created_in_psa_at","finished_processing_at","matcher_run_id","started_workflow_ids","failed_to_match_workflow_ids","error_message","workflow_matches"],"title":"Callback","type":"object"},"CallbackDetail":{"properties":{"callback_id":{"title":"Callback Id","type":"string"},"change_type":{"$ref":"#/components/schemas/EventType"},"created_in_psa_at":{"format":"date-time","title":"Created In Psa At","type":"string"},"entity_id":{"title":"Entity Id","type":"string"},"entity_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Number"},"entity_type":{"$ref":"#/components/schemas/EntityType"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"failed_to_match_workflow_ids":{"items":{"type":"integer"},"title":"Failed To Match Workflow Ids","type":"array"},"finished_processing_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Finished Processing At"},"matcher_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matcher Run Id"},"processed_audit_trail":{"anyOf":[{},{"type":"null"}],"title":"Processed Audit Trail"},"started_workflow_ids":{"items":{"type":"integer"},"title":"Started Workflow Ids","type":"array"},"state":{"$ref":"#/components/schemas/EventState"},"workflow_matches":{"anyOf":[{"items":{"$ref":"#/components/schemas/CallbackWorkflowMatch"},"type":"array"},{"type":"null"}],"title":"Workflow Matches"}},"required":["callback_id","state","entity_type","change_type","entity_id","entity_number","created_in_psa_at","finished_processing_at","matcher_run_id","started_workflow_ids","failed_to_match_workflow_ids","error_message","workflow_matches","processed_audit_trail"],"title":"CallbackDetail","type":"object"},"CallbackFieldComparison":{"description":"One rule-vs-entity comparison the matcher made when evaluating a workflow's filter.","properties":{"field_name":{"title":"Field Name","type":"string"},"field_value":{"title":"Field Value"},"is_match":{"title":"Is Match","type":"boolean"},"operator":{"title":"Operator","type":"string"},"rule_value":{"title":"Rule Value"}},"required":["field_name","field_value","rule_value","operator","is_match"],"title":"CallbackFieldComparison","type":"object"},"CallbackFunnel":{"properties":{"callbacks":{"$ref":"#/components/schemas/CallbacksBlock"},"concurrency_cap":{"$ref":"#/components/schemas/ConcurrencyCapBlock"},"events_processed":{"$ref":"#/components/schemas/EventsProcessedBlock"},"psa_api":{"$ref":"#/components/schemas/PsaApiBlock"},"window":{"$ref":"#/components/schemas/TenantLocalWindow"},"workflows_triggered":{"$ref":"#/components/schemas/WorkflowsTriggeredBlock"}},"required":["window","callbacks","concurrency_cap","events_processed","workflows_triggered","psa_api"],"title":"CallbackFunnel","type":"object"},"CallbackMatchDetails":{"description":"Structured breakdown of why a workflow match did/didn't match \u2014 answers\n'which value satisfied (or didn't satisfy) which rule' without parsing `match_reason`.\nPresent when the matcher recorded structured data; `None` for older callbacks or for\nmatches that short-circuit before per-field comparison (e.g. wrong trigger type).","properties":{"category":{"$ref":"#/components/schemas/MatchResultCategory"},"event_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"},"field_comparisons":{"items":{"$ref":"#/components/schemas/CallbackFieldComparison"},"title":"Field Comparisons","type":"array"}},"required":["category","event_type","field_comparisons"],"title":"CallbackMatchDetails","type":"object"},"CallbackWorkflowMatch":{"properties":{"error":{"title":"Error","type":"boolean"},"match_details":{"anyOf":[{"$ref":"#/components/schemas/CallbackMatchDetails"},{"type":"null"}]},"match_reason":{"title":"Match Reason","type":"string"},"matched":{"title":"Matched","type":"boolean"},"workflow_id":{"title":"Workflow Id","type":"integer"},"workflow_name":{"title":"Workflow Name","type":"string"}},"required":["workflow_id","workflow_name","matched","error","match_reason","match_details"],"title":"CallbackWorkflowMatch","type":"object"},"CallbacksBlock":{"properties":{"by_change_type":{"additionalProperties":{"type":"integer"},"title":"By Change Type","type":"object"},"filtered_out":{"title":"Filtered Out","type":"integer"},"received":{"title":"Received","type":"integer"},"unique_entities":{"title":"Unique Entities","type":"integer"},"webhook_delivery_p95_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Webhook Delivery P95 Seconds"}},"required":["received","by_change_type","unique_entities","webhook_delivery_p95_seconds","filtered_out"],"title":"CallbacksBlock","type":"object"},"CancelExecutionRequestBody":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Reason"}},"title":"CancelExecutionRequestBody","type":"object"},"CategoryPerformance":{"description":"One row of `/categories`.","properties":{"category":{"title":"Category","type":"string"},"failed_executions":{"title":"Failed Executions","type":"integer"},"fully_resolved_executions":{"title":"Fully Resolved Executions","type":"integer"},"successful_executions":{"title":"Successful Executions","type":"integer"},"total_executions":{"title":"Total Executions","type":"integer"},"total_hours_saved":{"title":"Total Hours Saved","type":"number"},"unique_tickets":{"title":"Unique Tickets","type":"integer"}},"required":["category","total_executions","successful_executions","failed_executions","fully_resolved_executions","unique_tickets","total_hours_saved"],"title":"CategoryPerformance","type":"object"},"ChangedField":{"enum":[["status",["CONNECTWISE","AUTOTASK","HALO","SERVICENOW","SYNCRO"],1,["ticket"]],["priority",["CONNECTWISE","AUTOTASK","HALO","SERVICENOW","SYNCRO"],1,["ticket"]],["board",["CONNECTWISE"],1,["ticket"]],["queue",["AUTOTASK"],1,["ticket"]],["type",["CONNECTWISE"],1,["ticket"]],["ticketType",["AUTOTASK"],1,["ticket"]],["Ticket Type",["HALO"],1,["ticket"]],["auditTrailContains",["CONNECTWISE","AUTOTASK","SERVICENOW"],1,["audit_trail"]]],"title":"ChangedField","type":"array"},"ChannelStatus":{"enum":["ACTIVE","DISCONNECTED"],"title":"ChannelStatus","type":"string"},"ChannelType":{"description":"Transport a channel binds an agent to. TEAMS is the only M2 transport; the rest are reserved.","enum":["TEAMS","SLACK","PORTAL","EMAIL"],"title":"ChannelType","type":"string"},"ChatAgentPerformance":{"description":"Per-agent chat cost + usage for the date window.","properties":{"credits_consumed":{"title":"Credits Consumed","type":"integer"},"total_sessions":{"title":"Total Sessions","type":"integer"},"total_turns":{"title":"Total Turns","type":"integer"},"workflow_id":{"title":"Workflow Id","type":"integer"},"workflow_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Name"}},"required":["workflow_id","workflow_name","credits_consumed","total_turns","total_sessions"],"title":"ChatAgentPerformance","type":"object"},"ChatMessageResource":{"properties":{"content":{"additionalProperties":true,"title":"Content","type":"object"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"title":"Id","type":"string"},"role":{"title":"Role","type":"string"},"sequence_number":{"title":"Sequence Number","type":"integer"},"session_id":{"title":"Session Id","type":"string"},"token_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Token Count"}},"required":["id","session_id","role","content","token_count","sequence_number","created_at"],"title":"ChatMessageResource","type":"object"},"ChatModelTier":{"description":"User-selectable speed/quality tier for a single chat turn (ENG-5851).\n\nThe Neo Support chat surfaces a Fast/Smart toggle that the user can flip at any point\nin a conversation. The toggle rides each turn (not the session), so switching mid-chat\njust changes the next turn \u2014 `previous_response_id` continuity is preserved across the\nswap because it is bound to provider+region, not to the model.\n\nThe frontend sends only this enum, never a model id: the FAST\u2192model / SMART\u2192model\nmapping is owned by the backend (`resolve_chat_model_override` in `chat_agent.py`).\nFAST keeps the agent's configured model (the Neo Support floor: GPT5_4_MINI + HIGH);\nSMART escalates the turn to a stronger model. FAST is the default so every pre-toggle\ncaller (and the entire historical signal/activity corpus) deserializes unchanged.","enum":["FAST","SMART"],"title":"ChatModelTier","type":"string"},"ChatPerformanceSummary":{"description":"Aggregate chat cost + usage for the date window.","properties":{"active_agents":{"title":"Active Agents","type":"integer"},"credits_consumed":{"title":"Credits Consumed","type":"integer"},"total_sessions":{"title":"Total Sessions","type":"integer"},"total_turns":{"title":"Total Turns","type":"integer"}},"required":["credits_consumed","total_turns","total_sessions","active_agents"],"title":"ChatPerformanceSummary","type":"object"},"ChatSessionResource":{"description":"Public surface of a chat session row. Renamed `agent_id` for partner clarity.","properties":{"agent_id":{"title":"Agent Id","type":"integer"},"archived_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Archived At"},"channel":{"title":"Channel","type":"string"},"client_id":{"title":"Client Id","type":"string"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"title":"Id","type":"string"},"show_agent_progress_steps":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Show Agent Progress Steps"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","agent_id","client_id","title","channel","created_at","updated_at","archived_at"],"title":"ChatSessionResource","type":"object"},"ChatTimeBucket":{"description":"One time-bucket row for `/timeline` (bucket = `YYYY-MM-DD`, the bucket's start).","properties":{"bucket":{"title":"Bucket","type":"string"},"credits_consumed":{"title":"Credits Consumed","type":"integer"},"total_turns":{"title":"Total Turns","type":"integer"}},"required":["bucket","credits_consumed","total_turns"],"title":"ChatTimeBucket","type":"object"},"ChatToolUsage":{"description":"Per-tool chat activity + cost. `calls` is how many times the tool ran; `credits` is what those\ncalls billed (static tier x calls); `is_free` marks FREE-tier plumbing tools.","properties":{"calls":{"title":"Calls","type":"integer"},"credits":{"title":"Credits","type":"integer"},"is_free":{"title":"Is Free","type":"boolean"},"tool":{"title":"Tool","type":"string"}},"required":["tool","calls","credits","is_free"],"title":"ChatToolUsage","type":"object"},"ChatUserPerformance":{"description":"Per-user chat cost + usage for the date window (attribution is per session).","properties":{"credits_consumed":{"title":"Credits Consumed","type":"integer"},"display_name":{"title":"Display Name","type":"string"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"total_sessions":{"title":"Total Sessions","type":"integer"},"total_turns":{"title":"Total Turns","type":"integer"},"user_key":{"title":"User Key","type":"string"}},"required":["user_key","display_name","email","credits_consumed","total_turns","total_sessions"],"title":"ChatUserPerformance","type":"object"},"ClientInfo":{"properties":{"client_id":{"title":"Client Id","type":"string"},"data_residency":{"$ref":"#/components/schemas/DataResidency"},"enabled":{"title":"Enabled","type":"boolean"},"itsm_type":{"anyOf":[{"$ref":"#/components/schemas/Itsm"},{"type":"null"}]},"paid_plan":{"anyOf":[{"$ref":"#/components/schemas/PaidPlan"},{"type":"null"}]},"sleep_before_callback_processing_seconds":{"title":"Sleep Before Callback Processing Seconds","type":"integer"},"trial_state":{"$ref":"#/components/schemas/TrialState"}},"required":["client_id","itsm_type","trial_state","paid_plan","data_residency","enabled","sleep_before_callback_processing_seconds"],"title":"ClientInfo","type":"object"},"Combinator":{"enum":["and","or"],"title":"Combinator","type":"string"},"ConcurrencyCapBlock":{"properties":{"exhausted_count":{"title":"Exhausted Count","type":"integer"},"max_wait_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Wait Seconds"},"p95_wait_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Wait Seconds"}},"required":["p95_wait_seconds","max_wait_seconds","exhausted_count"],"title":"ConcurrencyCapBlock","type":"object"},"ConfluenceIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/ConfluencePermissionGroup"},"title":"Permissions","type":"array"}},"title":"ConfluenceIntegration","type":"object"},"ConfluencePermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"group_type":{"$ref":"#/components/schemas/ConfluencePermissionGroupType","enum":["PAGES","SPACES","SEARCH","ATTACHMENTS","USERS"],"enumNames":["Pages","Spaces","Search","Attachments","Users"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"ConfluencePermissionGroup","type":"object"},"ConfluencePermissionGroupType":{"enum":["Pages","Spaces","Search","Attachments","Users"],"title":"ConfluencePermissionGroupType","type":"string"},"ConnectUrlResponse":{"properties":{"auth_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Url"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"}},"required":["auth_url","instructions"],"title":"ConnectUrlResponse","type":"object"},"ConsentStatus":{"enum":["PENDING","APPROVED","COMMENTED_AND_APPROVED","REJECTED","COMMENTED"],"title":"ConsentStatus","type":"string"},"CountryCode":{"enum":[["US","+1",null,null],["CA","+1",null,null],["GB","+44","BUd29cd8d0f57893ad3311964d784dc9a1","AD231ece3809334da636dd351b9f2fdf60"],["NL","+31",null,"AD3e3f88b6d5277d90f9a5b3946c8f6b4c"],["AU","+61",null,"AD2959da1db1ac1fc0bd2019c9baa658dc"]],"title":"CountryCode","type":"array"},"CreateAgentRequest":{"description":"`POST /public-api/agents` body \u2014 pick the variant via `autonomy_type`.","discriminator":{"mapping":{"AGENTIC":"#/components/schemas/CreateAgenticAgent","CHAINED_ACTIONS":"#/components/schemas/CreateChainedActionsAgent","CONVERSATIONAL":"#/components/schemas/CreateConversationalAgent"},"propertyName":"autonomy_type"},"oneOf":[{"$ref":"#/components/schemas/CreateChainedActionsAgent"},{"$ref":"#/components/schemas/CreateAgenticAgent"},{"$ref":"#/components/schemas/CreateConversationalAgent"}],"title":"CreateAgentRequest"},"CreateAgenticAgent":{"description":"An agentic workflow \u2014 a MasterAgent picks tools at runtime against the entity the\nserver's auto-prepended `FIND_ENTITIES` resolves. Always entity-triggered.","properties":{"agent_settings":{"$ref":"#/components/schemas/AgentSettings"},"autonomy_type":{"const":"AGENTIC","default":"AGENTIC","title":"Autonomy Type","type":"string"},"callback_settings":{"anyOf":[{"$ref":"#/components/schemas/EventMatchSettings"},{"type":"null"}],"default":null},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"entity_type":{"$ref":"#/components/schemas/EntityType","default":"TICKET"},"group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Group Name"},"group_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Group Order"},"integrations":{"anyOf":[{"$ref":"#/components/schemas/Integrations"},{"type":"null"}],"default":null},"name":{"title":"Name","type":"string"},"show_in_psa_pod":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Show In Psa Pod"},"state":{"$ref":"#/components/schemas/WorkflowState","default":"ENABLED"},"ticket_conditions":{"anyOf":[{"$ref":"#/components/schemas/PsaTicketConditions"},{"type":"null"}],"default":null,"description":"Trigger/entity filter for TICKET agents \u2014 which tickets this agent fires on. Send it at the top level to set or change the filter; the server (re)builds the FIND_ENTITIES action from it (do not put the filter in `actions`). Use `time_entry_conditions` instead for TIME_ENTRY agents. Shape: `conditions` holds a `combinator` (`and`/`or`) and a `rules` list of leaves (`field`/`operator`/`value`) and/or nested groups (`rules` + `combinator`). A rule's position in the tree changes the logic \u2014 a company exclusion belongs as a top-level rule under the root `and`, not nested inside an `or`, or it only excludes when the other branches also miss."},"time_entry_conditions":{"anyOf":[{"$ref":"#/components/schemas/PsaConditions"},{"type":"null"}],"default":null,"description":"Trigger/entity filter for TIME_ENTRY agents \u2014 the analogue of `ticket_conditions`. Ignored for TICKET agents."},"toolbox":{"additionalProperties":true,"title":"Toolbox","type":"object"},"trigger_type":{"const":"TRIGGERED","default":"TRIGGERED","title":"Trigger Type","type":"string"}},"required":["name","agent_settings","toolbox"],"title":"CreateAgenticAgent","type":"object"},"CreateApiKeyRequest":{"properties":{"expires_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Expires At"},"name":{"maxLength":200,"minLength":1,"title":"Name","type":"string"}},"required":["name"],"title":"CreateApiKeyRequest","type":"object"},"CreateBackfillRequest":{"properties":{"daily_execution_windows":{"$ref":"#/components/schemas/WorkflowDailyExecutionWindows"},"entity_type":{"$ref":"#/components/schemas/EntityType"},"filter_spec":{"additionalProperties":true,"title":"Filter Spec","type":"object"},"max_in_flight":{"maximum":10,"minimum":1,"title":"Max In Flight","type":"integer"},"target_workflow_id":{"title":"Target Workflow Id","type":"integer"},"timezone":{"default":"UTC","title":"Timezone","type":"string"},"total_estimated":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Total Estimated"}},"required":["target_workflow_id","entity_type","filter_spec","daily_execution_windows","max_in_flight"],"title":"CreateBackfillRequest","type":"object"},"CreateBackfillResponse":{"properties":{"backfill":{"$ref":"#/components/schemas/PublicBackfill"},"cost_estimate":{"$ref":"#/components/schemas/BackfillCostEstimate"}},"required":["backfill","cost_estimate"],"title":"CreateBackfillResponse","type":"object"},"CreateChainedActionsAgent":{"description":"A fixed-pipeline workflow \u2014 the server runs `FIND_ENTITIES` (built from `entity_type`\nand the conditions below) followed by `actions` in order. Triggered by a PSA event\n(`trigger_type=TRIGGERED` + `callback_settings`) or on a schedule (`trigger_type=SCHEDULED`\n+ `schedule`).","properties":{"actions":{"items":{"additionalProperties":true,"type":"object"},"title":"Actions","type":"array"},"autonomy_type":{"const":"CHAINED_ACTIONS","default":"CHAINED_ACTIONS","title":"Autonomy Type","type":"string"},"callback_settings":{"anyOf":[{"$ref":"#/components/schemas/EventMatchSettings"},{"type":"null"}],"default":null},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"entity_type":{"$ref":"#/components/schemas/EntityType","default":"TICKET"},"execution_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Execution Order"},"group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Group Name"},"group_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Group Order"},"name":{"title":"Name","type":"string"},"process_entities_sequentially":{"default":false,"title":"Process Entities Sequentially","type":"boolean"},"process_sub_entities_only_once":{"default":false,"title":"Process Sub Entities Only Once","type":"boolean"},"schedule":{"anyOf":[{"$ref":"#/components/schemas/WorkflowSchedule"},{"type":"null"}],"default":null},"show_in_psa_pod":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Show In Psa Pod"},"state":{"$ref":"#/components/schemas/WorkflowState","default":"ENABLED"},"ticket_conditions":{"anyOf":[{"$ref":"#/components/schemas/PsaTicketConditions"},{"type":"null"}],"default":null,"description":"Trigger/entity filter for TICKET agents \u2014 which tickets this agent fires on. Send it at the top level to set or change the filter; the server (re)builds the FIND_ENTITIES action from it (do not put the filter in `actions`). Use `time_entry_conditions` instead for TIME_ENTRY agents. Shape: `conditions` holds a `combinator` (`and`/`or`) and a `rules` list of leaves (`field`/`operator`/`value`) and/or nested groups (`rules` + `combinator`). A rule's position in the tree changes the logic \u2014 a company exclusion belongs as a top-level rule under the root `and`, not nested inside an `or`, or it only excludes when the other branches also miss."},"time_entry_conditions":{"anyOf":[{"$ref":"#/components/schemas/PsaConditions"},{"type":"null"}],"default":null,"description":"Trigger/entity filter for TIME_ENTRY agents \u2014 the analogue of `ticket_conditions`. Ignored for TICKET agents."},"trigger_type":{"$ref":"#/components/schemas/WorkflowTriggerType"}},"required":["name","trigger_type","actions"],"title":"CreateChainedActionsAgent","type":"object"},"CreateChannelRequest":{"properties":{"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Agent Id"},"audience":{"$ref":"#/components/schemas/ToolAudience"},"color_icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Color Icon Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Display Name"},"internal_name":{"title":"Internal Name","type":"string"},"outline_icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Outline Icon Url"},"relay_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Relay Prefix"},"show_agent_progress_steps":{"default":true,"title":"Show Agent Progress Steps","type":"boolean"},"status":{"$ref":"#/components/schemas/ChannelStatus","default":"ACTIVE"},"type":{"$ref":"#/components/schemas/ChannelType"},"welcome_message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Welcome Message"}},"required":["internal_name","type","audience"],"title":"CreateChannelRequest","type":"object"},"CreateChatSessionRequest":{"properties":{"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Numeric id of the CONVERSATIONAL agent to run the session against. Provide exactly one of `agent_id` or `managed_agent_key`.","title":"Agent Id"},"bot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Inbound Teams bot app id, forwarded by the platform relay so the backend routes the session to the ACTIVE channel registered for that bot \u2014 else the tenant's Neo Support agent. Honored only for a platform service account; ignored for other callers.","title":"Bot Id"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Target tenant to create the session for. Honored only for a platform service account; the agent is resolved from `bot_id` (a matching channel, else that tenant's Neo Support agent). Any other caller passing it gets 403. Omit to use the caller's own tenant.","title":"Client Id"},"end_user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The speaker's verified email, forwarded by the platform relay at session create. Used only for white-label END_USER dispatch: when the inbound Microsoft 365 tenant is linked to several companies (branch offices), the session is scoped to the company whose PSA contacts hold this email. Honored only for a platform service account.","title":"End User Email"},"inbound_tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The inbound message's M365 tenant id, forwarded by the platform relay. With `bot_id`, lets the backend route a white-label turn via the channel installed for that tenant \u2014 the acting tenant is then resolved server-side from the channel's owning MSP, overriding `client_id`. Honored only for a platform service account.","title":"Inbound Tenant Id"},"managed_agent_key":{"anyOf":[{"$ref":"#/components/schemas/ManagedAgentKey"},{"type":"null"}],"default":null,"description":"Target a Neo-managed agent by its stable key instead of a numeric id \u2014 the backend resolves the target tenant's row. Lets the converged Neo Support relay stay agent-id-agnostic across tenants. Provide exactly one of `agent_id` or `managed_agent_key`."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"}},"title":"CreateChatSessionRequest","type":"object"},"CreateConversationalAgent":{"description":"A chat agent \u2014 user-initiated via `POST /chat/sessions`, no trigger or action pipeline.\n`toolbox`/`agent_settings`/`integrations` configure it.","properties":{"access":{"$ref":"#/components/schemas/AgentAccess","default":"ALL_USERS"},"agent_settings":{"$ref":"#/components/schemas/AgentSettings"},"audience":{"$ref":"#/components/schemas/ToolAudience","default":"MSP"},"autonomy_type":{"const":"CONVERSATIONAL","default":"CONVERSATIONAL","title":"Autonomy Type","type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"integrations":{"anyOf":[{"$ref":"#/components/schemas/Integrations"},{"type":"null"}],"default":null},"name":{"title":"Name","type":"string"},"state":{"$ref":"#/components/schemas/WorkflowState","default":"ENABLED"},"toolbox":{"additionalProperties":true,"title":"Toolbox","type":"object"}},"required":["name","agent_settings","toolbox"],"title":"CreateConversationalAgent","type":"object"},"CreateEndCompanyRequest":{"properties":{"auto_assign_exchange_admin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Auto Assign Exchange Admin"},"auto_assign_priv_auth_admin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Auto Assign Priv Auth Admin"},"custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Custom Instructions"},"custom_instructions_for_user_facing_chat":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Custom Instructions For User Facing Chat"},"employee_identity_provider":{"anyOf":[{"$ref":"#/components/schemas/IdentityProvider"},{"type":"null"}],"default":null},"mailbox_provider":{"anyOf":[{"$ref":"#/components/schemas/MailboxProvider"},{"type":"null"}],"default":null},"marketplace_company_ids":{"anyOf":[{"items":{"$ref":"#/components/schemas/MarketplaceCompanyId"},"type":"array"},{"type":"null"}],"default":null,"title":"Marketplace Company Ids"},"psa_company_id":{"title":"Psa Company Id","type":"string"},"psa_company_name":{"title":"Psa Company Name","type":"string"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tenant Id"}},"required":["psa_company_id","psa_company_name"],"title":"CreateEndCompanyRequest","type":"object"},"CreateIterationSessionRequest":{"properties":{"hold_policy":{"$ref":"#/components/schemas/IterationHoldPolicy","default":"AUTO_CONTINUE"},"target_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Target Entity Id"}},"title":"CreateIterationSessionRequest","type":"object"},"CreateMemoryRequest":{"properties":{"audiences":{"anyOf":[{"items":{"$ref":"#/components/schemas/MemoryAudience"},"type":"array"},{"type":"null"}],"default":null,"title":"Audiences"},"category":{"$ref":"#/components/schemas/MemoryCategory"},"confidence":{"default":1.0,"maximum":1.0,"minimum":0.0,"title":"Confidence","type":"number"},"content":{"title":"Content","type":"string"},"evidence":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Evidence"},"pinned":{"default":false,"title":"Pinned","type":"boolean"},"scope_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Scope Id"},"scope_type":{"$ref":"#/components/schemas/ScopeType"}},"required":["scope_type","category","content"],"title":"CreateMemoryRequest","type":"object"},"CreateScheduledWorkRequest":{"properties":{"additional_custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Additional Custom Instructions"},"scheduled_for":{"format":"date-time","title":"Scheduled For","type":"string"},"ticket_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Ticket Id"},"workflow_id":{"title":"Workflow Id","type":"integer"}},"required":["workflow_id","scheduled_for"],"title":"CreateScheduledWorkRequest","type":"object"},"CreateSkillRequest":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"files":{"items":{"$ref":"#/components/schemas/SkillFileInput"},"title":"Files","type":"array"},"name":{"description":"Editable display name.","title":"Name","type":"string"},"slug":{"description":"Permanent agent lookup and sandbox-path identifier; immutable after creation.","title":"Slug","type":"string"},"source_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Run Id"}},"required":["slug","name","files"],"title":"CreateSkillRequest","type":"object"},"CreateTechnicianRequest":{"properties":{"name":{"title":"Name","type":"string"},"psa_id":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Psa Id"}},"required":["name","psa_id"],"title":"CreateTechnicianRequest","type":"object"},"CustomFieldCondition":{"properties":{"field":{"title":"Field","type":"string"},"operator":{"$ref":"#/components/schemas/Operator","default":"=","enum":["=","!=","<",">","<=",">=","contains","null","notNull"]},"value":{"title":"Value","type":"string"}},"required":["field","value"],"title":"CustomFieldCondition","type":"object"},"CustomFieldConditionGroup":{"properties":{"combinator":{"$ref":"#/components/schemas/Combinator"},"conditions":{"items":{"$ref":"#/components/schemas/CustomFieldCondition"},"title":"Conditions","type":"array"}},"required":["conditions","combinator"],"title":"CustomFieldConditionGroup","type":"object"},"CwAsioIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/CwAsioPermissionGroup"},"title":"Permissions","type":"array"}},"title":"CwAsioIntegration","type":"object"},"CwAsioPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"group_type":{"$ref":"#/components/schemas/CwAsioPermissionGroupType","enum":["ENDPOINTS","AUTOMATION","TICKETING","COMPANIES","CONTACTS","CUSTOM_FIELDS","POLICY","PATCHING","ALERTING","INCIDENTS","BACKUP","NETWORK_DEVICES","MAPPINGS","BILLING","PLATFORM"],"enumNames":["Endpoints","Automation","Ticketing","Companies & Sites","Contacts","Custom Fields","Policy","OS Patching","Alerts & Suspensions","Incidents","Backup Dashboard","Network Devices","Endpoint & Site Mapping","Billing","Platform Info"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"CwAsioPermissionGroup","type":"object"},"CwAsioPermissionGroupType":{"enum":["Endpoints","Automation","Ticketing","Companies & Sites","Contacts","Custom Fields","Policy","OS Patching","Alerts & Suspensions","Incidents","Backup Dashboard","Network Devices","Endpoint & Site Mapping","Billing","Platform Info"],"title":"CwAsioPermissionGroupType","type":"string"},"CwAutomateIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/CwAutomatePermissionGroup"},"title":"Permissions","type":"array"}},"title":"CwAutomateIntegration","type":"object"},"CwAutomatePermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"allow_delete":{"default":false,"description":"Allow deleting records (DELETE requests)","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Allow Delete","type":"boolean"},"group_type":{"$ref":"#/components/schemas/CwAutomatePermissionGroupType","enum":["COMPUTERS","CLIENTS_AND_LOCATIONS","SCRIPTS","SCRIPT_EXECUTION","SOFTWARE_AND_PATCHES","MONITORING"],"enumNames":["Computers","Clients & Locations","Scripts","Script Execution","Software & Patches","Monitoring"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"CwAutomatePermissionGroup","type":"object"},"CwAutomatePermissionGroupType":{"enum":["Computers","Clients & Locations","Scripts","Script Execution","Software & Patches","Monitoring"],"title":"CwAutomatePermissionGroupType","type":"string"},"CwClientFacingNoteSettings":{"description":"CW-specific: no extra fields beyond base.","properties":{"allow_notify_additional_contacts":{"default":false,"title":"Allow Notify Additional Contacts","type":"boolean"},"include_random_delay":{"default":false,"title":"Include Random Delay","type":"boolean"},"max_delay_minutes":{"default":20,"title":"Max Delay Minutes","type":"integer"},"min_delay_minutes":{"default":10,"title":"Min Delay Minutes","type":"integer"},"skip_notifications_for_closed_tickets":{"default":true,"title":"Skip Notifications For Closed Tickets","type":"boolean"}},"title":"CwClientFacingNoteSettings","type":"object"},"CwPsaIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/CwPsaPermissionGroup"},"title":"Permissions","type":"array"}},"title":"CwPsaIntegration","type":"object"},"CwPsaPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"allow_bundle":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Allow bundling child tickets under a parent","show_if_another_field_is":{"field_name":"group_type","field_value":"TICKETS"},"title":"Allow Bundle"},"allow_delete":{"default":false,"description":"Allow deleting records (DELETE requests)","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Allow Delete","type":"boolean"},"allow_merge":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Allow merging tickets into one","show_if_another_field_is":{"field_name":"group_type","field_value":"TICKETS"},"title":"Allow Merge"},"client_facing_settings":{"anyOf":[{"$ref":"#/components/schemas/CwClientFacingNoteSettings"},{"type":"null"}],"default":null},"group_type":{"$ref":"#/components/schemas/CwPsaPermissionGroupType","enum":["TICKETS","TICKET_NOTES","CLIENT_FACING_TICKET_NOTES","CONTACTS","COMPANIES","CONFIGURATIONS","TIME_ENTRIES","SCHEDULE_ENTRIES","PROJECTS","PRODUCTS","AGREEMENTS","OPPORTUNITIES","INVOICES","PURCHASE_ORDERS","EXPENSES","SALES_ACTIVITIES","SALES_ORDERS","MARKETING","DOCUMENTS","AUDIT_TRAIL","PROJECT_TICKETS","TIMESHEETS","SLAS","KNOWLEDGE_BASE","INVENTORY","MANAGED_SERVICES","SALES_PIPELINE","ACCOUNTING","SYSTEM"],"enumNames":["Tickets","Ticket Notes (Internal)","Ticket Notes (Client-Facing)","Contacts","Companies","Configurations","Time Entries","Schedule Entries","Projects","Products","Agreements","Opportunities","Invoices","Purchase Orders","Expenses","Sales Activities","Sales Orders","Marketing","Documents","Audit Trail","Project Tickets","Timesheets","SLAs","Knowledge Base","Inventory","Managed Services","Sales Pipeline","Accounting","System"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"},"update_allowed_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Fields the agent may update (None = all fields allowed)","title":"Allowed Update Fields"}},"required":["access_level","group_type"],"title":"CwPsaPermissionGroup","type":"object"},"CwPsaPermissionGroupType":{"enum":["Tickets","Ticket Notes (Internal)","Ticket Notes (Client-Facing)","Contacts","Companies","Configurations","Time Entries","Schedule Entries","Projects","Products","Agreements","Opportunities","Invoices","Purchase Orders","Expenses","Sales Activities","Sales Orders","Marketing","Documents","Audit Trail","Project Tickets","Timesheets","SLAs","Knowledge Base","Inventory","Managed Services","Sales Pipeline","Accounting","System"],"title":"CwPsaPermissionGroupType","type":"string"},"DataResidency":{"enum":["US","UK","EU","AU"],"title":"DataResidency","type":"string"},"DattoRmmIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/DattoRmmPermissionGroup"},"title":"Permissions","type":"array"}},"title":"DattoRmmIntegration","type":"object"},"DattoRmmPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"allow_delete":{"default":false,"description":"Allow deleting records (DELETE requests)","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Allow Delete","type":"boolean"},"group_type":{"$ref":"#/components/schemas/DattoRmmPermissionGroupType","enum":["DEVICES","SITES","COMPONENTS","JOBS","AUDIT","ALERTS"],"enumNames":["Devices","Sites","Components","Jobs","Audit","Alerts"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"DattoRmmPermissionGroup","type":"object"},"DattoRmmPermissionGroupType":{"enum":["Devices","Sites","Components","Jobs","Audit","Alerts"],"title":"DattoRmmPermissionGroupType","type":"string"},"DerivationMethod":{"description":"How the memory's claim was obtained: `STRUCTURAL` (read from a structured field), `LLM_EXTRACTED` (inferred from text), or `MANUAL` (authored by a human).","enum":["STRUCTURAL","LLM_EXTRACTED","MANUAL"],"title":"DerivationMethod","type":"string"},"EndUserTeamsActiveUser":{"description":"One active end-user (>=2 messages that month) \u2014 the expand under its company.","properties":{"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"end_company_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Company Id"},"end_user":{"title":"End User","type":"string"},"end_user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End User Email"},"tickets":{"items":{"$ref":"#/components/schemas/EndUserTeamsTicket"},"title":"Tickets","type":"array"},"tickets_raised":{"title":"Tickets Raised","type":"integer"},"turns":{"title":"Turns","type":"integer"}},"required":["end_company_id","company_name","end_user","end_user_email","turns","tickets_raised","tickets"],"title":"EndUserTeamsActiveUser","type":"object"},"EndUserTeamsCompanyBreakdown":{"description":"Active users + bot-raised tickets for one end-company in the selected month. `company_name` is\nNone when the end_company_id has no named row (unmatched); `tickets` lists the tickets behind\n`tickets_raised` (most recent first).","properties":{"active_users":{"title":"Active Users","type":"integer"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"end_company_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Company Id"},"tickets":{"items":{"$ref":"#/components/schemas/EndUserTeamsTicket"},"title":"Tickets","type":"array"},"tickets_raised":{"title":"Tickets Raised","type":"integer"}},"required":["end_company_id","company_name","active_users","tickets_raised","tickets"],"title":"EndUserTeamsCompanyBreakdown","type":"object"},"EndUserTeamsDetail":{"description":"Detailed end-user Teams bot MAU breakdown for the selected month: per-company (named) +\nper-user + bot-raised ticket count, plus a monthly active-user trend ending at that month.\nDollar billing (projected charge / trial state) stays on `/billing/end-user-teams-usage`.","properties":{"monthly_active_users":{"items":{"$ref":"#/components/schemas/EndUserTeamsMonthlyPoint"},"title":"Monthly Active Users","type":"array"},"per_company":{"items":{"$ref":"#/components/schemas/EndUserTeamsCompanyBreakdown"},"title":"Per Company","type":"array"},"per_user":{"items":{"$ref":"#/components/schemas/EndUserTeamsActiveUser"},"title":"Per User","type":"array"},"tickets_raised":{"title":"Tickets Raised","type":"integer"}},"required":["per_company","per_user","monthly_active_users","tickets_raised"],"title":"EndUserTeamsDetail","type":"object"},"EndUserTeamsMonthlyPoint":{"description":"One point on the monthly active-user trend.","properties":{"active_users":{"title":"Active Users","type":"integer"},"month":{"title":"Month","type":"string"}},"required":["month","active_users"],"title":"EndUserTeamsMonthlyPoint","type":"object"},"EndUserTeamsTicket":{"description":"A bot-raised PSA ticket: `ticket_id` is the PSA ticket number; `url` is a PSA deep-link (None\nwhen it can't be built, e.g. the PSA isn't configured).","properties":{"ticket_id":{"title":"Ticket Id","type":"string"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"required":["ticket_id","url"],"title":"EndUserTeamsTicket","type":"object"},"EndUserTeamsTrialState":{"description":"Lifecycle of the end-user (white-label) Teams bot MAU billing add-on, per MSP.\n\nA separate, no-credit-card 14-day trial that starts when the MSP first installs the white-label\nbot. Independent of the main-product TrialState. EXPIRED gates only the end-user bot, never\nClient.enabled (the MSP may be a paying credits customer).","enum":["NOT_STARTED","ACTIVE","EXPIRED","CONVERTED_TO_PAID","CANCELLED"],"title":"EndUserTeamsTrialState","type":"string"},"EndUserTeamsUsage":{"description":"End-user (white-label) Teams bot MAU usage + charge for a month.\n\n`active_users` = distinct end-users with >=2 messages that month. `charge` is the MSP's own\nadd-on bill for that count (marginal tiers + 100 floor) in `currency` \u2014 for the current month it\nis a projection that finalizes when the month closes; for a past month it is what was billed.\nThis is the customer's own bill, not provider/LLM cost (see module docstring).","properties":{"active_users":{"title":"Active Users","type":"integer"},"charge":{"title":"Charge","type":"integer"},"currency":{"title":"Currency","type":"string"},"month":{"title":"Month","type":"string"},"trial_end_date":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Trial End Date"},"trial_state":{"$ref":"#/components/schemas/EndUserTeamsTrialState"}},"required":["month","active_users","charge","currency","trial_state","trial_end_date"],"title":"EndUserTeamsUsage","type":"object"},"EntityType":{"enum":["ticket","project_ticket","task","scheduled_entry","time_entry","project","company","contact","resource","contract","opportunity","none","configuration","note","team","role","audit_trail","appointment","servicecall","contract_service","company_location","product"],"title":"EntityType","type":"string"},"ErrorEnvelope":{"properties":{"error":{"properties":{"code":{"description":"Stable machine-readable error code.","type":"string"},"details":{"additionalProperties":true,"type":"object"},"message":{"type":"string"}},"required":["code","message"],"type":"object"},"meta":{"properties":{"request_id":{"format":"uuid","type":["string","null"]}},"type":"object"}},"required":["error","meta"],"type":"object"},"EscalateToNeoTeamRequest":{"properties":{"chat_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Chat Session Id"},"details":{"maxLength":20000,"minLength":1,"title":"Details","type":"string"},"execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Execution Id"},"requester_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Requester User Id"},"summary":{"maxLength":300,"minLength":1,"title":"Summary","type":"string"}},"required":["summary","details"],"title":"EscalateToNeoTeamRequest","type":"object"},"EscalateToNeoTeamResponse":{"properties":{"ticket_id":{"title":"Ticket Id","type":"string"},"ticket_url":{"title":"Ticket Url","type":"string"}},"required":["ticket_id","ticket_url"],"title":"EscalateToNeoTeamResponse","type":"object"},"EventMatchSettings":{"properties":{"entity_type":{"$ref":"#/components/schemas/EntityType","default":"TICKET"},"run_only_once_per_entity":{"default":false,"title":"Run Only Once Per Entity","type":"boolean"},"target_changes":{"items":{"$ref":"#/components/schemas/TargetEvent"},"title":"Target Changes","type":"array"}},"required":["target_changes"],"title":"EventMatchSettings","type":"object"},"EventState":{"enum":["PENDING_PROCESSING","PROCESSING","PROCESSED","SKIPPED","FAILED"],"title":"EventState","type":"string"},"EventType":{"description":"Something that happened in the PSA or NeoAgent.\n\nEach member also carries `agent_trigger_description`: a one-line sentence rendered\ninto the agent's EXECUTION_CONTEXT prompt under \"Triggered by:\" so the agent can\nbranch its behaviour on the specific signal. Keep these phrased from the AGENT's\nperspective (\"the customer replied\", not \"CUSTOMER_REPLIED fired\"). None means we\ndon't render a line for this event type (the executed_by fallback handles it).","enum":[["CREATE","PSA","PSA callback \u2014 the entity was created"],["UPDATE","PSA","PSA callback \u2014 a ticket field was updated (inspect the audit trail for the specific field and values)"],["DELETE","PSA","PSA callback \u2014 the entity was deleted"],["ANY","PSA",null],["CUSTOMER_REPLIED","PSA","PSA callback \u2014 the customer replied on the ticket"],["TECHNICIAN_REPLIED_TO_CUSTOMER","PSA","PSA callback \u2014 a technician replied to the customer"],["TIME_ENTRY_CREATED","PSA","PSA callback \u2014 a time entry was created on the ticket"],["LAST_ACTIVITY_DATE_CHANGED","PSA","PSA callback \u2014 the ticket's last-activity date changed"],["NOTE_ADDED","PSA","PSA callback \u2014 a note was added to the ticket (non-Neo author)"],["TECHNICIAN_NOTE_ADDED","PSA","PSA callback \u2014 a technician added a note to the ticket"],["MANUAL_ONLY","NEO_AGENT","A human manually triggered this workflow"],["WORKFLOW_FINISHED","NEO_AGENT","Another workflow finished and this workflow was configured to react to it"],["WORKFLOW_TRIGGERED","NEO_AGENT","Another workflow triggered this run via the TRIGGER_WORKFLOW action"]],"title":"EventType","type":"array"},"EventsProcessedBlock":{"properties":{"count":{"title":"Count","type":"integer"},"p95_actual_work_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Actual Work Seconds"},"p95_configured_sleep_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Configured Sleep Seconds"},"p95_total_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Total Duration Seconds"}},"required":["count","p95_total_duration_seconds","p95_configured_sleep_seconds","p95_actual_work_seconds"],"title":"EventsProcessedBlock","type":"object"},"ExchangeIntegration":{"description":"Exchange integration configuration.","properties":{"permissions":{"items":{"$ref":"#/components/schemas/ExchangePermissionGroup"},"title":"Permissions","type":"array"}},"title":"ExchangeIntegration","type":"object"},"ExchangePermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"group_type":{"$ref":"#/components/schemas/ExchangePermissionGroupType","enum":["MAILBOXES","MAILBOX_PERMISSIONS","RECIPIENTS_AND_CONTACTS","DISTRIBUTION_GROUPS","MAIL_FLOW_AND_TRANSPORT","ADDRESS_LISTS_AND_POLICIES","COMPLIANCE_AND_AUDITING"],"enumNames":["Mailboxes","Mailbox Permissions","Recipients & Contacts","Distribution Groups","Mail Flow & Transport","Address Lists & Policies","Compliance & Auditing"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"ExchangePermissionGroup","type":"object"},"ExchangePermissionGroupType":{"enum":["Mailboxes","Mailbox Permissions","Recipients & Contacts","Distribution Groups","Mail Flow & Transport","Address Lists & Policies","Compliance & Auditing"],"title":"ExchangePermissionGroupType","type":"string"},"Execution":{"properties":{"additional_custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Custom Instructions"},"agent_id":{"title":"Agent Id","type":"integer"},"agent_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Name"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"},"entity_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Number"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"execution_id":{"title":"Execution Id","type":"string"},"message_for_dashboard":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message For Dashboard"},"seconds_spent":{"title":"Seconds Spent","type":"number"},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["execution_id","agent_id","agent_name","entity_id","entity_number","status","message_for_dashboard","seconds_spent","error","additional_custom_instructions","created_at","updated_at"],"title":"Execution","type":"object"},"ExecutionArtifact":{"description":"Public projection of a `workflow_artifacts` row.\n\nTwo artifact kinds exist today: `MARKDOWN` (inline content the agent\nproduced) and `SANDBOX_FILE` (a file uploaded to blob storage by the\nsandbox tool). For the latter, `blob_size_bytes` and `content_type` are\npopulated and the file itself is fetched via the sibling `/download-url`\nendpoint; this list endpoint never returns the file binary.","properties":{"artifact_type":{"$ref":"#/components/schemas/ArtifactType"},"blob_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Blob Size Bytes"},"content":{"title":"Content","type":"string"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"title":"Id","type":"string"},"title":{"title":"Title","type":"string"}},"required":["id","title","artifact_type","content","blob_size_bytes","content_type","created_at"],"title":"ExecutionArtifact","type":"object"},"ExecutionArtifactContent":{"description":"An artifact's real body, returned inline by `/content`.\n\nUnlike `ExecutionArtifact.content` (a byte-count placeholder for\n`SANDBOX_FILE` rows), `content` here is the actual decoded body: for a\n`SANDBOX_FILE` the backend reads the blob server-side, so a caller that\ncan't reach the Azure blob host still gets the bytes. Text (UTF-8) only;\nbinary or oversized artifacts are rejected and must use `/download-url`.","properties":{"artifact_type":{"$ref":"#/components/schemas/ArtifactType"},"blob_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Blob Size Bytes"},"content":{"title":"Content","type":"string"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"},"id":{"title":"Id","type":"string"},"title":{"title":"Title","type":"string"}},"required":["id","title","artifact_type","content","content_type","blob_size_bytes"],"title":"ExecutionArtifactContent","type":"object"},"ExecutionStep":{"properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"data":{"anyOf":[{},{"type":"null"}],"title":"Data"},"is_error":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Error"},"message":{"title":"Message","type":"string"},"step_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Id"},"tool_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Call Id"},"tool_type_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Type Name"},"type":{"$ref":"#/components/schemas/StepType"}},"required":["step_id","type","message","data","tool_call_id","tool_type_name","is_error","created_at"],"title":"ExecutionStep","type":"object"},"FeedbackCreatedResponse":{"properties":{"feedback_id":{"title":"Feedback Id","type":"integer"}},"required":["feedback_id"],"title":"FeedbackCreatedResponse","type":"object"},"FeedbackRequest":{"properties":{"client_id":{"title":"Client Id","type":"string"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Comment"},"feedback_type":{"$ref":"#/components/schemas/FeedbackType"},"psa_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Psa Entity Id"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"User Name"},"workflow_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Workflow Id"}},"required":["client_id","feedback_type"],"title":"FeedbackRequest","type":"object"},"FeedbackType":{"enum":["POSITIVE","NEGATIVE"],"title":"FeedbackType","type":"string"},"FieldDecisionOption":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"title":"Id","type":"string"},"name":{"title":"Name","type":"string"}},"required":["id","name","description"],"title":"FieldDecisionOption","type":"object"},"FieldNameType":{"description":"Enum for the field names that can be used in the PSA systems.\nIt's used to map the Enum -> PsaFieldName -> Supported PSAs -> Patch order\n\nPatch order is used to determine the order of the patches.\nFields with the same patch order can be updated at the same time.\nWe use the patch order to group fields by the order and then process (update) the groups in a sequential API requests.\nOne example is CW_AGREEMENT that CANNOT be updated at same time of COMPANY.\nTherefore CW_AGREEMENT has patch_order=2 and COMPANY has patch_order=1","enum":[["status",["CONNECTWISE","AUTOTASK","HALO","SERVICENOW","SYNCRO"],1,["ticket"]],["priority",["CONNECTWISE","AUTOTASK","HALO","SERVICENOW","SYNCRO"],1,["ticket"]],["company",["CONNECTWISE","AUTOTASK","HALO","SERVICENOW","SYNCRO"],1,["ticket"]],["contact",["CONNECTWISE","AUTOTASK","HALO","SERVICENOW","SYNCRO"],2,["ticket"]],["resource",["CONNECTWISE","AUTOTASK","HALO","SERVICENOW","SYNCRO"],1,["ticket"]],["source",["CONNECTWISE","AUTOTASK","HALO"],1,["ticket"]],["auditTrailContains",["CONNECTWISE","AUTOTASK","SERVICENOW"],1,["audit_trail"]],["summary",["CONNECTWISE"],1,["ticket"],true],["board",["CONNECTWISE"],1,["ticket"]],["agreement",["CONNECTWISE"],2,["ticket"]],["type",["CONNECTWISE"],1,["ticket"]],["types",["CONNECTWISE"],1,["contact"]],["subtype",["CONNECTWISE"],1,["ticket"]],["item",["CONNECTWISE"],1,["ticket"]],["budgetHours",["CONNECTWISE"],1,["ticket"]],["contactEmailAddress",["CONNECTWISE"],2,["ticket"]],["site",["CONNECTWISE"],1,["ticket","contact"]],["configuration",["CONNECTWISE"],1,["ticket"]],["company_territory",["CONNECTWISE"],1,["ticket"]],["location",["CONNECTWISE"],1,["ticket"]],["department",["CONNECTWISE"],1,["ticket"]],["team",["CONNECTWISE"],1,["ticket"]],["resources",["CONNECTWISE"],1,["ticket"]],["requiredDate",["CONNECTWISE"],1,["ticket"]],["automaticEmailCc",["CONNECTWISE"],1,["ticket"]],["customerUpdatedFlag",["CONNECTWISE"],1,["ticket"],true],["billableOption",["CONNECTWISE"],1,["time_entry"]],["scheduledEntryType",["CONNECTWISE"],1,["scheduled_entry"]],["scheduledEntryStatus",["CONNECTWISE"],1,["scheduled_entry"]],["serviceLocation",["CONNECTWISE"],1,["scheduled_entry"]],["title",["AUTOTASK"],1,["ticket"],true],["description",["AUTOTASK"],1,["ticket"]],["queue",["AUTOTASK"],1,["ticket"]],["ticketType",["AUTOTASK"],1,["ticket"]],["ticketCategory",["AUTOTASK"],1,["ticket"]],["company_territory",["AUTOTASK"],1,["ticket"]],["issueType",["AUTOTASK"],1,["ticket"]],["subIssueType",["AUTOTASK"],1,["ticket"]],["estimatedHours",["AUTOTASK"],1,["ticket"]],["lineOfBusiness",["AUTOTASK"],1,["ticket"]],["completedByResourceID",["AUTOTASK"],1,["ticket"]],["createdByContactID",["AUTOTASK"],1,["ticket"]],["creatorResourceID",["AUTOTASK"],1,["ticket"]],["configurationItemID",["AUTOTASK"],1,["ticket"]],["resolution",["AUTOTASK"],1,["ticket"],true],["assignedResourceRoleID",["AUTOTASK"],1,["ticket"]],["contract",["AUTOTASK"],1,["ticket"]],["TicketAdditionalContacts",["AUTOTASK"],1,["ticket"]],["dueDateTime",["AUTOTASK"],1,["ticket"],true],["tag",["AUTOTASK"],1,["ticket"]],["companyLocationID",["AUTOTASK"],1,["contact"]],["secondaryResources",["AUTOTASK"],1,["ticket"]],["opportunityID",["AUTOTASK"],1,["ticket"]],["billingCode",["AUTOTASK"],1,["ticket","time_entry"]],["workType",["CONNECTWISE"],1,["ticket","time_entry"]],["isNonBillable",["AUTOTASK"],1,["time_entry"]],["resourceID",["AUTOTASK"],1,["time_entry"]],["hoursToBill",["AUTOTASK"],1,["time_entry"]],["summaryNotes",["AUTOTASK"],1,["time_entry"]],["offsetHours",["AUTOTASK"],1,["time_entry"]],["publish",["AUTOTASK"],1,["note"]],["noteType",["AUTOTASK"],1,["note"]],["Ticket Type",["HALO"],1,["ticket"]],["Halo Team",["HALO"],1,["ticket"]],["Halo Workflow",["HALO"],1,["ticket"]],["Category 1",["HALO"],1,["ticket"]],["Category 2",["HALO"],1,["ticket"]],["Category 3",["HALO"],1,["ticket"]],["Category 4",["HALO"],1,["ticket"]],["Impact",["HALO"],1,["ticket"]],["Urgency",["HALO"],1,["ticket"]],["Subject",["HALO"],1,["ticket"],true],["asset_id",["HALO"],1,["ticket"]],["sla_id",["HALO"],1,["ticket"]],["outcome_id",["HALO"],1,["note"]],["Email CC List",["HALO"],1,["ticket"],true],["Estimated Time",["HALO"],1,["ticket"],true],["billable",["HALO"],1,["time_entry"]],["short_description",["SERVICENOW"],1,["ticket"],true],["description",["SERVICENOW"],1,["ticket"],true],["urgency",["SERVICENOW"],1,["ticket"]],["impact",["SERVICENOW"],1,["ticket"]],["assignment_group",["SERVICENOW"],1,["ticket"]],["category",["SERVICENOW"],1,["ticket"]],["subcategory",["SERVICENOW"],1,["ticket"]],["cmdb_ci",["SERVICENOW"],1,["ticket"]],["close_code",["SERVICENOW"],1,["ticket"]],["close_notes",["SERVICENOW"],1,["ticket"],true],["ticket_type",["SERVICENOW"],1,["ticket"],true],["comments",["SERVICENOW"],1,["time_entry"],true],["time_in_seconds",["SERVICENOW"],1,["time_entry"],true],["u_is_billable",["SERVICENOW"],1,["time_entry"]],["category",["SERVICENOW"],1,["time_entry"]],["subject",["SYNCRO"],1,["ticket"],true],["problem_type",["SYNCRO"],1,["ticket"]],["customFields",["CONNECTWISE","AUTOTASK","HALO"],1,["ticket"]],["company_account_type",["CONNECTWISE","AUTOTASK","HALO","SERVICENOW"],1,["company"]],["company_active",["CONNECTWISE","AUTOTASK","HALO","SERVICENOW"],1,["company"]],["company_status",["CONNECTWISE"],1,["company"]]],"title":"FieldNameType","type":"array"},"FieldUpdateAuditEntry":{"properties":{"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Agent Id"},"agent_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Name"},"ai_justification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Justification"},"created_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Created At"},"current_value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}],"title":"Current Value"},"custom_field_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Field Name"},"entity_id":{"title":"Entity Id","type":"string"},"entity_type":{"$ref":"#/components/schemas/EntityType"},"field_name":{"$ref":"#/components/schemas/FieldNameType"},"gpt_response":{"title":"Gpt Response","type":"string"},"is_custom_field":{"title":"Is Custom Field","type":"boolean"},"options_to_choose_from":{"anyOf":[{"items":{"$ref":"#/components/schemas/FieldDecisionOption"},"type":"array"},{"type":"null"}],"title":"Options To Choose From"},"predicted_value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}],"title":"Predicted Value"},"predicted_value_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predicted Value Id"},"should_update_field":{"title":"Should Update Field","type":"boolean"},"system_prompt":{"title":"System Prompt","type":"string"},"user_prompt":{"title":"User Prompt","type":"string"}},"required":["entity_type","entity_id","field_name","is_custom_field","custom_field_name","current_value","predicted_value","predicted_value_id","ai_justification","should_update_field","agent_id","agent_name","created_at","system_prompt","user_prompt","gpt_response","options_to_choose_from"],"title":"FieldUpdateAuditEntry","type":"object"},"HaloClientFacingNoteSettings":{"description":"Halo-specific: allowed_outcome_ids determines which email outcomes the agent can use.","properties":{"allow_notify_additional_contacts":{"default":false,"title":"Allow Notify Additional Contacts","type":"boolean"},"allowed_outcome_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Allowed Outcome Ids"},"include_random_delay":{"default":false,"title":"Include Random Delay","type":"boolean"},"max_delay_minutes":{"default":20,"title":"Max Delay Minutes","type":"integer"},"min_delay_minutes":{"default":10,"title":"Min Delay Minutes","type":"integer"},"skip_notifications_for_closed_tickets":{"default":true,"title":"Skip Notifications For Closed Tickets","type":"boolean"}},"title":"HaloClientFacingNoteSettings","type":"object"},"HaloPsaIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/HaloPsaPermissionGroup"},"title":"Permissions","type":"array"}},"title":"HaloPsaIntegration","type":"object"},"HaloPsaPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"allow_delete":{"default":false,"description":"Allow deleting records (DELETE requests)","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Allow Delete","type":"boolean"},"allow_merge":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Allow merging tickets (POST with merged_into_id)","show_if_another_field_is":{"field_name":"group_type","field_value":"TICKETS"},"title":"Allow Merge"},"allowed_outcome_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Allowed Outcome Ids"},"client_facing_settings":{"anyOf":[{"$ref":"#/components/schemas/HaloClientFacingNoteSettings"},{"type":"null"}],"default":null},"group_type":{"$ref":"#/components/schemas/HaloPsaPermissionGroupType","enum":["TICKETS","ACTIONS","CLIENT_FACING_ACTIONS","TIME_ENTRIES","CONTACTS","COMPANIES","ASSETS","PRODUCTS","APPOINTMENTS","SLAS","KNOWLEDGE_BASE","CONTRACTS","INVOICES","QUOTATIONS","SUPPLIERS","OPPORTUNITIES","REPORTS","EMAIL_RULES","CONFIGURATION"],"enumNames":["Tickets","Actions","Client-Facing Actions","Time Entries","Contacts","Companies","Assets","Products","Appointments","SLAs","Knowledge Base","Contracts","Invoices","Quotations","Suppliers","Opportunities","Reports","Email Rules","Configuration"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"},"update_allowed_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Fields the agent may update (None = all fields allowed)","title":"Allowed Update Fields"}},"required":["access_level","group_type"],"title":"HaloPsaPermissionGroup","type":"object"},"HaloPsaPermissionGroupType":{"enum":["Tickets","Actions","Client-Facing Actions","Time Entries","Contacts","Companies","Assets","Products","Appointments","SLAs","Knowledge Base","Contracts","Invoices","Quotations","Suppliers","Opportunities","Reports","Email Rules","Configuration"],"title":"HaloPsaPermissionGroupType","type":"string"},"HandoverAcceptResponse":{"properties":{"accepted_by":{"title":"Accepted By","type":"string"},"message":{"title":"Message","type":"string"},"status":{"title":"Status","type":"string"}},"required":["status","message","accepted_by"],"title":"HandoverAcceptResponse","type":"object"},"HuduIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/HuduPermissionGroup"},"title":"Permissions","type":"array"}},"title":"HuduIntegration","type":"object"},"HuduPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"allow_delete":{"default":false,"description":"Allow deleting records (DELETE requests)","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Allow Delete","type":"boolean"},"group_type":{"$ref":"#/components/schemas/HuduPermissionGroupType","enum":["COMPANIES","ARTICLES","ASSETS","ASSET_LAYOUTS","PASSWORDS","FOLDERS","INFRASTRUCTURE","WEBSITES"],"enumNames":["Companies","Articles","Assets","Asset Layouts","Passwords","Folders","Infrastructure","Websites"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"HuduPermissionGroup","type":"object"},"HuduPermissionGroupType":{"enum":["Companies","Articles","Assets","Asset Layouts","Passwords","Folders","Infrastructure","Websites"],"title":"HuduPermissionGroupType","type":"string"},"IdentityProvider":{"properties":{"identity_provider_type":{"$ref":"#/components/schemas/IdentityProviderType"},"onprem_ad_adconnect_server_hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Onprem Ad Adconnect Server Hostname"},"onprem_ad_runner_hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Onprem Ad Runner Hostname"},"onprem_service_account_username":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Onprem Service Account Username"}},"required":["identity_provider_type"],"title":"IdentityProvider","type":"object"},"IdentityProviderType":{"enum":["Entra ID (Cloud)","On-prem AD","Hybrid","Hybrid (no AD Connect sync)"],"title":"IdentityProviderType","type":"string"},"InboxMessage":{"properties":{"affected_entity_numbers":{"items":{"type":"string"},"title":"Affected Entity Numbers","type":"array"},"affected_workflow_ids":{"items":{"type":"integer"},"title":"Affected Workflow Ids","type":"array"},"client_id":{"title":"Client Id","type":"string"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"deduplication_message_id":{"title":"Deduplication Message Id","type":"string"},"last_email_sent_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Email Sent At"},"message":{"title":"Message","type":"string"},"number_of_occurrences":{"title":"Number Of Occurrences","type":"integer"},"read":{"title":"Read","type":"boolean"},"type":{"$ref":"#/components/schemas/InboxMessageType"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["deduplication_message_id","client_id","message","read","type","created_at","updated_at","number_of_occurrences","affected_workflow_ids","affected_entity_numbers","last_email_sent_at"],"title":"InboxMessage","type":"object"},"InboxMessageType":{"description":"Types of inbox messages that can be sent","enum":["error","info","warning","action_required"],"title":"InboxMessageType","type":"string"},"InsightsAnalysisStatus":{"enum":["PENDING","RUNNING","COMPLETED","FAILED"],"title":"InsightsAnalysisStatus","type":"string"},"InsightsDefaults":{"description":"Presets the dashboard or Support Agent uses to size an analysis run.","properties":{"available_period_days":{"items":{"type":"integer"},"title":"Available Period Days","type":"array"},"is_trial":{"title":"Is Trial","type":"boolean"},"psa_sync_status":{"enum":["NOT_STARTED","RUNNING","SUCCESS","FAILED","SKIPPED"],"title":"Psa Sync Status","type":"string"},"regions":{"items":{"$ref":"#/components/schemas/RegionDefault"},"title":"Regions","type":"array"},"suggested_period_days":{"title":"Suggested Period Days","type":"integer"},"suggested_region":{"title":"Suggested Region","type":"string"},"trial_analysis_used":{"title":"Trial Analysis Used","type":"boolean"}},"required":["regions","suggested_region","available_period_days","suggested_period_days","is_trial","trial_analysis_used","psa_sync_status"],"title":"InsightsDefaults","type":"object"},"InsightsResult":{"description":"Latest completed analysis. `result` is an opaque ROI blob \u2014 render\nverbatim. Schema lives on the BE `ROIAnalysis` model and may evolve;\ntreat as additive.","properties":{"analysis_id":{"title":"Analysis Id","type":"integer"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"hourly_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hourly Rate"},"period_days":{"title":"Period Days","type":"integer"},"result":{"additionalProperties":true,"title":"Result","type":"object"},"status":{"$ref":"#/components/schemas/InsightsAnalysisStatus"}},"required":["analysis_id","status","period_days","hourly_rate","completed_at","result"],"title":"InsightsResult","type":"object"},"InsightsStatus":{"description":"Status of the latest analysis. `status` is `null` when nothing has run.","properties":{"analysis_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Analysis Id"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"hourly_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hourly Rate"},"period_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Period Days"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"status":{"anyOf":[{"$ref":"#/components/schemas/InsightsAnalysisStatus"},{"type":"null"}]}},"required":["analysis_id","status","period_days","hourly_rate","created_at","started_at","completed_at","error_message"],"title":"InsightsStatus","type":"object"},"InstallBrandingRequest":{"description":"A Teams `installationUpdate add` reported by the relay, asking for the channel's greeting\nbranding. Platform callers only.","properties":{"bot_id":{"title":"Bot Id","type":"string"},"end_client_tenant_id":{"title":"End Client Tenant Id","type":"string"}},"required":["bot_id","end_client_tenant_id"],"title":"InstallBrandingRequest","type":"object"},"InstallBrandingResponse":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"matched":{"title":"Matched","type":"boolean"},"welcome_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Message"}},"required":["matched","welcome_message","display_name"],"title":"InstallBrandingResponse","type":"object"},"IntegrationCategory":{"description":"Display categories shown in the FE.","enum":["PSA","RMM","Documentation","Identity & Workspace","Communication","Scheduling","Cloud Marketplace","Customer Success","Other"],"title":"IntegrationCategory","type":"string"},"Integrations":{"description":"Per-agent integration permissions: which permission-aware integrations (PSA, M365, RMM, etc.) the agent may call, and at what access level.","properties":{"ad":{"$ref":"#/components/schemas/AdIntegration"},"autotask":{"$ref":"#/components/schemas/AtPsaIntegration"},"confluence":{"$ref":"#/components/schemas/ConfluenceIntegration"},"cw_asio":{"$ref":"#/components/schemas/CwAsioIntegration"},"cw_automate":{"$ref":"#/components/schemas/CwAutomateIntegration"},"cw_psa":{"$ref":"#/components/schemas/CwPsaIntegration"},"datto_rmm":{"$ref":"#/components/schemas/DattoRmmIntegration"},"exchange":{"$ref":"#/components/schemas/ExchangeIntegration"},"halo_psa":{"$ref":"#/components/schemas/HaloPsaIntegration"},"hudu":{"$ref":"#/components/schemas/HuduIntegration"},"itglue":{"$ref":"#/components/schemas/ItglueIntegration"},"ms_graph":{"$ref":"#/components/schemas/MsGraphIntegration"},"ncentral_rmm":{"$ref":"#/components/schemas/NCentralRmmIntegration"},"neo_api":{"$ref":"#/components/schemas/NeoApiIntegration"},"ninja_rmm":{"$ref":"#/components/schemas/NinjaRmmIntegration"},"nsight_rmm":{"$ref":"#/components/schemas/NSightRmmIntegration"},"scalepad":{"$ref":"#/components/schemas/ScalepadIntegration"},"screenconnect_rmm":{"$ref":"#/components/schemas/ScreenConnectRmmIntegration"},"servicenow":{"$ref":"#/components/schemas/ServicenowIntegration"},"vsax_rmm":{"$ref":"#/components/schemas/VsaxRmmIntegration"}},"title":"Integrations","type":"object"},"IntentRequest":{"description":"Create/replace payload. A PUT replaces every editable field, so `name` is required and the\nrest default. `agent_ids`/`end_company_ids` empty = applies to all agents of the matching\nsurface / all companies. `surfaces` declares which agent kinds the intent applies to (at least\none; validated in the service). An enabled intent is capped at 15 per applicable agent.","properties":{"agent_ids":{"default":[],"items":{"type":"integer"},"title":"Agent Ids","type":"array"},"ask_for":{"default":"","title":"Ask For","type":"string"},"description":{"default":"","title":"Description","type":"string"},"enabled":{"default":true,"title":"Enabled","type":"boolean"},"end_company_ids":{"default":[],"items":{"type":"string"},"title":"End Company Ids","type":"array"},"name":{"title":"Name","type":"string"},"surfaces":{"default":[],"items":{"$ref":"#/components/schemas/IntentSurface"},"title":"Surfaces","type":"array"}},"required":["name"],"title":"IntentRequest","type":"object"},"IntentSurface":{"description":"Which kind of agent an intent applies to: `END_USER_CHAT` (a branded end-user chat bot) or `TRIGGERED` (a ticket-triggered agent).","enum":["END_USER_CHAT","TRIGGERED"],"title":"IntentSurface","type":"string"},"IterationDirectiveRequest":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Note"},"type":{"$ref":"#/components/schemas/IterationDirectiveType"}},"required":["type"],"title":"IterationDirectiveRequest","type":"object"},"IterationDirectiveType":{"enum":["CONTINUE","RESTART_RUN","FINISH_RUN","CANCEL"],"title":"IterationDirectiveType","type":"string"},"IterationHoldPolicy":{"description":"Monitor verdict policy per \u00a75.5 of the design: every step pauses either way; this only\ndecides whether the seeded monitor turn may submit CONTINUE itself (AUTO_CONTINUE) or must\nwait for the human on every step (HOLD_EACH_STEP).","enum":["AUTO_CONTINUE","HOLD_EACH_STEP"],"title":"IterationHoldPolicy","type":"string"},"IterationPauseStatus":{"enum":["AWAITING_DIRECTIVE","DIRECTIVE_RECEIVED","RESUMED","ABANDONED"],"title":"IterationPauseStatus","type":"string"},"IterationPauseTrigger":{"enum":["EVERY_STEP","RUN_COMPLETE"],"title":"IterationPauseTrigger","type":"string"},"IterationSessionStatus":{"enum":["ACTIVE","COMPLETED","EXPIRED","ABANDONED"],"title":"IterationSessionStatus","type":"string"},"ItglueIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/ItgluePermissionGroup"},"title":"Permissions","type":"array"}},"title":"ItglueIntegration","type":"object"},"ItgluePermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"allow_delete":{"default":false,"description":"Allow deleting records (DELETE requests)","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Allow Delete","type":"boolean"},"group_type":{"$ref":"#/components/schemas/ItgluePermissionGroupType","enum":["ORGANIZATIONS","CONTACTS","DOCUMENTS","FLEXIBLE_ASSETS","FLEXIBLE_ASSET_TYPES","CONFIGURATIONS","PASSWORDS"],"enumNames":["Organizations","Contacts","Documents","Flexible Assets","Flexible Asset Types","Configurations","Passwords"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"ItgluePermissionGroup","type":"object"},"ItgluePermissionGroupType":{"enum":["Organizations","Contacts","Documents","Flexible Assets","Flexible Asset Types","Configurations","Passwords"],"title":"ItgluePermissionGroupType","type":"string"},"Itsm":{"enum":["CONNECTWISE","AUTOTASK","HALO","SERVICENOW","SYNCRO"],"title":"Itsm","type":"string"},"LlmCallsByPurpose":{"properties":{"count":{"title":"Count","type":"integer"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"p95_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Duration Seconds"},"purpose":{"title":"Purpose","type":"string"}},"required":["purpose","count","p95_duration_seconds","model"],"title":"LlmCallsByPurpose","type":"object"},"MailboxProvider":{"properties":{"mailbox_provider_type":{"$ref":"#/components/schemas/MailboxProviderType"},"onprem_exchange_runner_hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Onprem Exchange Runner Hostname"},"onprem_exchange_server_hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Onprem Exchange Server Hostname"},"onprem_service_account_username":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Onprem Service Account Username"}},"required":["mailbox_provider_type"],"title":"MailboxProvider","type":"object"},"MailboxProviderType":{"enum":["Exchange Server","Exchange Online","Exchange Hybrid"],"title":"MailboxProviderType","type":"string"},"ManagedAgentKey":{"description":"Stable key identifying a Neo-managed agent. `NEO_SUPPORT` is the per-tenant Neo Support agent.","enum":["NEO_SUPPORT"],"title":"ManagedAgentKey","type":"string"},"MarketplaceCompanyId":{"properties":{"company_id":{"title":"Company Id","type":"string"},"marketplace":{"$ref":"#/components/schemas/MarketplaceType"}},"required":["marketplace","company_id"],"title":"MarketplaceCompanyId","type":"object"},"MarketplaceType":{"enum":["Pax8","D&H","Microsoft Partner Center","Sherweb","Ingram Micro"],"title":"MarketplaceType","type":"string"},"MatchResultCategory":{"description":"Categories for workflow match results to provide user-friendly explanations.","enum":["matched","wrong_trigger_type","already_ran_recently","run_once_limit","manual_only","entity_type_mismatch","empty_audit_trail","audit_trail_mismatch","ticket_filter_mismatch","missing_event_settings","error"],"title":"MatchResultCategory","type":"string"},"MemoryAudience":{"description":"Which agent surface a memory targets: `ALL` (every surface), `TRIGGERED_SCHEDULED_AGENTS` (automation agents working tickets), `CHAT_AGENTS_INTERNAL` (technician-facing chat), or `CHAT_AGENTS_EXTERNAL` (end-user-facing chat).","enum":["ALL","TRIGGERED_SCHEDULED_AGENTS","CHAT_AGENTS_INTERNAL","CHAT_AGENTS_EXTERNAL"],"title":"MemoryAudience","type":"string"},"MemoryCategory":{"description":"The kind of memory: `SEMANTIC` (facts), `PROCEDURAL` (playbooks / how-to), or `EPISODIC` (summaries of past runs).","enum":["SEMANTIC","PROCEDURAL","EPISODIC"],"title":"MemoryCategory","type":"string"},"MemoryCreatedBy":{"description":"Which producer wrote the memory \u2014 e.g. `ADMIN` (authored via dashboard/API), `SYNC_PSA_DISCOVERY` / `SYNC_RMM_DISCOVERY` (sync producers), or `REVIEWER`.","enum":["SYNC_PSA_DISCOVERY","SYNC_RMM_DISCOVERY","REVIEWER","ADMIN"],"title":"MemoryCreatedBy","type":"string"},"MintSessionTokenRequest":{"properties":{"allowed_agent_ids":{"default":[],"items":{"type":"integer"},"title":"Allowed Agent Ids","type":"array"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Target tenant to mint the token for. Honored only for a platform service account, and only when `session_id` is that tenant's Neo Support session (otherwise 403); any other caller passing it gets 403. Omit to mint for the caller's own tenant.","title":"Client Id"},"end_company_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"End Company Id"},"end_user":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"End User"},"end_user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"End User Email"},"session_id":{"title":"Session Id","type":"string"},"ttl_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Ttl Seconds"}},"required":["session_id"],"title":"MintSessionTokenRequest","type":"object"},"MintSessionTokenResponse":{"properties":{"expires_at":{"format":"date-time","title":"Expires At","type":"string"},"jti":{"title":"Jti","type":"string"},"session_id":{"title":"Session Id","type":"string"},"token":{"title":"Token","type":"string"}},"required":["token","jti","session_id","expires_at"],"title":"MintSessionTokenResponse","type":"object"},"MonthlyUsage":{"properties":{"credits_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Limit"},"credits_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Remaining"},"credits_used":{"title":"Credits Used","type":"integer"},"forecasted_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Forecasted Credits"},"month":{"title":"Month","type":"string"},"reserve_balance":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reserve Balance"}},"required":["month","credits_used","credits_limit","credits_remaining","forecasted_credits","reserve_balance"],"title":"MonthlyUsage","type":"object"},"MsGraphIntegration":{"description":"MS Graph integration configuration.","properties":{"permissions":{"items":{"$ref":"#/components/schemas/MsGraphPermissionGroup"},"title":"Permissions","type":"array"}},"title":"MsGraphIntegration","type":"object"},"MsGraphPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"group_type":{"$ref":"#/components/schemas/MsGraphPermissionGroupType","enum":["USER_MANAGEMENT","GROUPS","SECURITY","LICENSING","DIRECTORY_ROLES","DEVICES","CONDITIONAL_ACCESS","DOMAINS","AUDIT_AND_REPORTS","APPLICATIONS","SERVICE_HEALTH","MAIL","SECURITY_OPERATIONS","SHAREPOINT_AND_ONEDRIVE","TEAMS_AND_CHATS"],"enumNames":["User Management","Groups","Security","Licensing","Directory Roles","Devices","Conditional Access","Domains","Audit & Reports","Applications","Service Health","Mail","Security Operations","SharePoint & OneDrive","Teams & Chats"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"MsGraphPermissionGroup","type":"object"},"MsGraphPermissionGroupType":{"enum":["User Management","Groups","Security","Licensing","Directory Roles","Devices","Conditional Access","Domains","Audit & Reports","Applications","Service Health","Mail","Security Operations","SharePoint & OneDrive","Teams & Chats"],"title":"MsGraphPermissionGroupType","type":"string"},"NCentralRmmIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/NCentralRmmPermissionGroup"},"title":"Permissions","type":"array"}},"title":"NCentralRmmIntegration","type":"object"},"NCentralRmmPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"allow_delete":{"default":false,"description":"Allow deleting records (DELETE requests)","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Allow Delete","type":"boolean"},"group_type":{"$ref":"#/components/schemas/NCentralRmmPermissionGroupType","enum":["CUSTOMERS","DEVICES","SCHEDULED_TASKS","ASSETS","ACTIVE_ISSUES"],"enumNames":["Customers","Devices","Scheduled Tasks","Assets","Active Issues"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"NCentralRmmPermissionGroup","type":"object"},"NCentralRmmPermissionGroupType":{"enum":["Customers","Devices","Scheduled Tasks","Assets","Active Issues"],"title":"NCentralRmmPermissionGroupType","type":"string"},"NSightRmmIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/NSightRmmPermissionGroup"},"title":"Permissions","type":"array"}},"title":"NSightRmmIntegration","type":"object"},"NSightRmmPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"group_type":{"$ref":"#/components/schemas/NSightRmmPermissionGroupType","enum":["CLIENTS","DEVICES","CHECKS","SOFTWARE","TASKS"],"enumNames":["Clients","Devices","Checks","Software","Tasks"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"NSightRmmPermissionGroup","type":"object"},"NSightRmmPermissionGroupType":{"enum":["Clients","Devices","Checks","Software","Tasks"],"title":"NSightRmmPermissionGroupType","type":"string"},"NeoApiIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/NeoApiPermissionGroup"},"title":"Permissions","type":"array"}},"title":"NeoApiIntegration","type":"object"},"NeoApiPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"group_type":{"$ref":"#/components/schemas/NeoApiPermissionGroupType","enum":["EXECUTIONS","AGENTS","TENANT_CONFIG","END_COMPANIES","INTEGRATIONS","BILLING","TECHNICIANS","SCHEDULED_WORK","BACKFILLS","INBOX_AND_COMMS","TEMPLATES","OBSERVABILITY","CHAT","PHONE","CHANNELS","SKILLS","MEMORIES"],"enumNames":["Executions & Debugging","Agents & Schemas","Tenant Settings","End Companies","Integrations","Billing & Plan","Technicians","Scheduled Work","Backfills","Inbox & Comms","Templates","Observability","Chat Sessions","Phone Agent","Channels","Skills","Agent Memories"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"NeoApiPermissionGroup","type":"object"},"NeoApiPermissionGroupType":{"enum":["Executions & Debugging","Agents & Schemas","Tenant Settings","End Companies","Integrations","Billing & Plan","Technicians","Scheduled Work","Backfills","Inbox & Comms","Templates","Observability","Chat Sessions","Phone Agent","Channels","Skills","Agent Memories"],"title":"NeoApiPermissionGroupType","type":"string"},"NinjaRmmIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/NinjaRmmPermissionGroup"},"title":"Permissions","type":"array"}},"title":"NinjaRmmIntegration","type":"object"},"NinjaRmmPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"allow_delete":{"default":false,"description":"Allow deleting records (DELETE requests)","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Allow Delete","type":"boolean"},"group_type":{"$ref":"#/components/schemas/NinjaRmmPermissionGroupType","enum":["DEVICES","ORGANIZATIONS","BACKUP","ALERTS","SOFTWARE","AUTOMATION","USERS","TICKETING"],"enumNames":["Devices","Organizations","Backup","Alerts","Software","Automation","Users","Ticketing"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"NinjaRmmPermissionGroup","type":"object"},"NinjaRmmPermissionGroupType":{"enum":["Devices","Organizations","Backup","Alerts","Software","Automation","Users","Ticketing"],"title":"NinjaRmmPermissionGroupType","type":"string"},"OpenAiModel":{"enum":[["gpt-5.6-terra","REASONING","o200k_base",2.5,15,80000,0.25,"gpt-5.6-terra"],["gpt-5.6-luna","REASONING","o200k_base",1,6,80000,0.1,"gpt-5.6-luna"],["gpt-5.5","REASONING","o200k_base",5,30,80000,0.5,"gpt-5.5"],["gpt-5.4","REASONING","o200k_base",2.5,15,80000,0.25,"gpt-5.4"],["gpt-5.4-mini","REASONING","o200k_base",0.75,4.5,80000,0.075,"gpt-5.4-mini"],["gpt-5.1","REASONING","o200k_base",1.25,10,80000,0.125,"gpt-5.1"],["gpt-5","REASONING","o200k_base",1.25,10,80000,0.125,"gpt-5"],["gpt-5-mini","REASONING","o200k_base",0.25,2,80000,0.025,"gpt-5-mini"],["gpt-5-nano","REASONING","o200k_base",0.05,0.4,80000,0.005,"gpt-5-nano"],["gpt-4o-mini-2024-07-18","REGULAR","o200k_base",0.15,0.6,50000,0.075,"gpt-4o-mini-2024-07-18"],["gpt-4.1","REGULAR","o200k_base",2,8,50000,0.5,"gpt-4.1"],["gpt-4.1-mini","REGULAR","o200k_base",0.4,1.6,100000,0.1,"gpt-4.1-mini"],["gpt-5-nano-for-sync","REASONING","o200k_base",0.05,0.4,80000,0.005,"gpt-5-nano"],["text-embedding-ada-002","EMBEDDING","cl100k_base",0.1,0,16000,null,"text-embedding-ada-002"],["text-embedding-3-small","EMBEDDING","cl100k_base",0.02,0,64000,null,"text-embedding-3-small"]],"title":"OpenAiModel","type":"array"},"Operator":{"enum":["=","!=","<",">","<=",">=","beginsWith","endsWith","contains","doesNotContain","doesNotBeginWith","doesNotEndWith","null","notNull","in","notIn"],"title":"Operator","type":"string"},"Pagination":{"properties":{"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}},"required":["next_cursor","has_more"],"type":"object"},"PaidPlan":{"enum":["PILOT","STARTER","GROWTH","PROFESSIONAL","CUSTOM"],"title":"PaidPlan","type":"string"},"PatchEdit":{"properties":{"file_id":{"title":"File Id","type":"string"},"new_string":{"title":"New String","type":"string"},"old_string":{"title":"Old String","type":"string"},"replace_all":{"default":false,"title":"Replace All","type":"boolean"}},"required":["file_id","old_string","new_string"],"title":"PatchEdit","type":"object"},"PatchSkillRequest":{"description":"PATCH \u2014 surgical search/replace edits to part of a file (the default for a tweak).","properties":{"base_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Base Hash"},"edits":{"items":{"$ref":"#/components/schemas/PatchEdit"},"title":"Edits","type":"array"}},"required":["edits"],"title":"PatchSkillRequest","type":"object"},"PerformanceSummary":{"description":"Aggregate execution stats for the date window.","properties":{"credits_consumed":{"title":"Credits Consumed","type":"integer"},"earliest_execution_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Earliest Execution At"},"earliest_time_entry_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Earliest Time Entry At"},"failed_executions":{"title":"Failed Executions","type":"integer"},"fully_resolved_executions":{"title":"Fully Resolved Executions","type":"integer"},"partially_resolved_executions":{"title":"Partially Resolved Executions","type":"integer"},"successful_executions":{"title":"Successful Executions","type":"integer"},"total_executions":{"title":"Total Executions","type":"integer"},"total_hours_saved":{"title":"Total Hours Saved","type":"number"},"total_seconds_spent":{"title":"Total Seconds Spent","type":"number"},"total_tickets_received":{"title":"Total Tickets Received","type":"integer"},"unique_tickets":{"title":"Unique Tickets","type":"integer"}},"required":["total_executions","successful_executions","failed_executions","fully_resolved_executions","partially_resolved_executions","unique_tickets","total_tickets_received","total_hours_saved","total_seconds_spent","credits_consumed","earliest_execution_at","earliest_time_entry_at"],"title":"PerformanceSummary","type":"object"},"PhoneNumberStatus":{"enum":["ACTIVE","INACTIVE"],"title":"PhoneNumberStatus","type":"string"},"PostMessageRequest":{"properties":{"attachments":{"description":"Images or documents to include with this turn. Each must first be uploaded via `POST /chat/sessions/<id>/attachments/upload-url`. At most 6 per turn.","items":{"$ref":"#/components/schemas/PublicChatAttachment"},"title":"Attachments","type":"array"},"client_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Client Message Id"},"message":{"default":"","title":"Message","type":"string"},"model_tier":{"$ref":"#/components/schemas/ChatModelTier","default":"FAST","description":"Speed/quality tier for this turn (ENG-5851): FAST keeps the agent's configured model; SMART escalates a single turn to a stronger model. May be flipped per turn to switch mid-conversation. Defaults to FAST."}},"title":"PostMessageRequest","type":"object"},"PostMessageResponse":{"description":"202 Accepted body \u2014 the turn is enqueued, the agent's response streams via SSE.\n\n`since_cursor` is the Redis-stream event id snapshotted right before this turn\nwas enqueued. Callers tailing `/chat/sessions/<id>/events` should pass it as\n`?since=<since_cursor>` (or `Last-Event-Id: <since_cursor>`) so the SSE tail\nstarts strictly after the previous turn's terminal envelopes. Skipping this on a\n2nd+ turn against the same session causes the tail to return the previous turn's\nfinal state. May be `None` on the first turn of a fresh session or under Redis\nfailure; consumers treat `None` as \"tail from beginning.\"","properties":{"chat_turn_id":{"title":"Chat Turn Id","type":"string"},"show_agent_progress_steps":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Show Agent Progress Steps"},"since_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since Cursor"},"user_message_id":{"title":"User Message Id","type":"string"}},"required":["user_message_id","chat_turn_id","since_cursor"],"title":"PostMessageResponse","type":"object"},"PsaApiBlock":{"properties":{"calls":{"title":"Calls","type":"integer"},"failures":{"title":"Failures","type":"integer"},"p95_wait_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Wait Seconds"}},"required":["calls","p95_wait_seconds","failures"],"title":"PsaApiBlock","type":"object"},"PsaConditions":{"properties":{"conditions":{"$ref":"#/components/schemas/RulesGroup"}},"required":["conditions"],"title":"PsaConditions","type":"object"},"PsaTicketConditions":{"properties":{"conditions":{"$ref":"#/components/schemas/RulesGroup"},"custom_field_conditions":{"$ref":"#/components/schemas/CustomFieldConditionGroup","default":null,"title":"Use Custom Field Conditions","type":["null","object"]},"workload_conditions":{"$ref":"#/components/schemas/WorkloadConditions","default":null,"description":"Define a time period to filter tickets that were actively worked on by a technician. Only tickets with service activity logged within the specified date range will be included.","title":"Workload Conditions","type":["null","object"]}},"required":["conditions"],"title":"PsaTicketConditions","type":"object"},"PublicBackfill":{"description":"One backfill row, as exposed on the public API.\n\nNaming: stays `backfill` everywhere \u2014 unlike the agent/workflow rename for\n`workflows_v2`, backfills are user-facing under their internal name.\nSurfacing-only fields (`target_workflow_name`, `autonomy_type`) appear so\ncallers can render a meaningful label without a second fetch.","properties":{"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"created_at":{"title":"Created At","type":"string"},"created_by":{"title":"Created By","type":"string"},"daily_execution_windows":{"$ref":"#/components/schemas/WorkflowDailyExecutionWindows"},"entity_type":{"$ref":"#/components/schemas/EntityType"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"failed_count":{"title":"Failed Count","type":"integer"},"filter_spec":{"additionalProperties":true,"title":"Filter Spec","type":"object"},"id":{"title":"Id","type":"string"},"max_in_flight":{"title":"Max In Flight","type":"integer"},"parent_backfill_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Parent Backfill Run Id"},"processed_count":{"title":"Processed Count","type":"integer"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"state":{"$ref":"#/components/schemas/BackfillRunState"},"succeeded_count":{"title":"Succeeded Count","type":"integer"},"target_workflow_autonomy_type":{"anyOf":[{"$ref":"#/components/schemas/AutonomyType"},{"type":"null"}]},"target_workflow_id":{"title":"Target Workflow Id","type":"integer"},"target_workflow_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Workflow Name"},"timezone":{"title":"Timezone","type":"string"},"total_estimated":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Estimated"}},"required":["id","state","target_workflow_id","target_workflow_name","target_workflow_autonomy_type","entity_type","filter_spec","daily_execution_windows","timezone","max_in_flight","total_estimated","processed_count","succeeded_count","failed_count","started_at","completed_at","created_by","created_at","error"],"title":"PublicBackfill","type":"object"},"PublicBackfillFailure":{"description":"One failed child execution surfaced for a backfill.\n\nSlim by design \u2014 only the fields a partner or dashboard needs to render\na \"failed tickets\" row and link into the full execution. The BE-side\n`FailedExecutionForBackfill` is the source; this is its explicit\npublic-API shape so adding a field on the BE model never silently leaks.","properties":{"entity_id":{"title":"Entity Id","type":"string"},"entity_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Number"},"failed_at":{"format":"date-time","title":"Failed At","type":"string"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"temporal_run_id":{"title":"Temporal Run Id","type":"string"}},"required":["entity_id","entity_number","message","temporal_run_id","failed_at"],"title":"PublicBackfillFailure","type":"object"},"PublicChannel":{"description":"A channel: a CONVERSATIONAL agent bound to a transport, plus its branding.","properties":{"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Agent Id"},"audience":{"$ref":"#/components/schemas/ToolAudience"},"color_icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color Icon Url"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"id":{"title":"Id","type":"string"},"internal_name":{"title":"Internal Name","type":"string"},"outline_icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outline Icon Url"},"relay_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relay Prefix"},"show_agent_progress_steps":{"title":"Show Agent Progress Steps","type":"boolean"},"status":{"$ref":"#/components/schemas/ChannelStatus"},"type":{"$ref":"#/components/schemas/ChannelType"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"welcome_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Message"}},"required":["id","internal_name","type","audience","agent_id","status","display_name","description","welcome_message","color_icon_url","outline_icon_url","show_agent_progress_steps","relay_prefix","created_at","updated_at"],"title":"PublicChannel","type":"object"},"PublicChatAttachment":{"description":"An image or document attached to a chat turn. `blob_path` is the value returned by the\n`attachments/upload-url` endpoint for THIS session \u2014 the backend re-validates it sits under\nthe session's prefix, so a client can't reference another session's or tenant's blob.","properties":{"alt":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional alt text / description for the attachment.","title":"Alt"},"blob_path":{"description":"The `blob_path` returned by `attachments/upload-url`.","title":"Blob Path","type":"string"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional original filename, for display.","title":"Filename"},"mime":{"description":"Attachment MIME type. Images (image/png, image/jpeg, image/gif, image/webp) are shown to the agent; documents (e.g. application/pdf, text/plain, text/csv, Word/Excel) are attachable to a ticket.","title":"Mime","type":"string"}},"required":["blob_path","mime"],"title":"PublicChatAttachment","type":"object"},"PublicCompanyFilterOptions":{"properties":{"fields":{"items":{"$ref":"#/components/schemas/PublicFilterField"},"title":"Fields","type":"array"},"operators":{"items":{"type":"string"},"title":"Operators","type":"array"}},"required":["operators","fields"],"title":"PublicCompanyFilterOptions","type":"object"},"PublicCompanyFilterSaveResult":{"properties":{"psa_type":{"title":"Psa Type","type":"string"},"removable":{"$ref":"#/components/schemas/PublicRemovalPreview"}},"required":["psa_type","removable"],"title":"PublicCompanyFilterSaveResult","type":"object"},"PublicCompanyFilters":{"properties":{"filters":{"items":{"$ref":"#/components/schemas/PublicSyncFilter"},"title":"Filters","type":"array"},"psa_type":{"title":"Psa Type","type":"string"}},"required":["psa_type","filters"],"title":"PublicCompanyFilters","type":"object"},"PublicCompanyFiltersUpdate":{"properties":{"filters":{"items":{"$ref":"#/components/schemas/PublicSyncFilter"},"title":"Filters","type":"array"}},"required":["filters"],"title":"PublicCompanyFiltersUpdate","type":"object"},"PublicEndCompany":{"properties":{"auto_assign_exchange_admin":{"title":"Auto Assign Exchange Admin","type":"boolean"},"auto_assign_priv_auth_admin":{"title":"Auto Assign Priv Auth Admin","type":"boolean"},"azure_application_access_granted":{"title":"Azure Application Access Granted","type":"boolean"},"azure_delegated_access_granted":{"title":"Azure Delegated Access Granted","type":"boolean"},"custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Instructions"},"custom_instructions_for_user_facing_chat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Instructions For User Facing Chat"},"employee_identity_provider":{"anyOf":[{"$ref":"#/components/schemas/IdentityProvider"},{"type":"null"}]},"mailbox_provider":{"anyOf":[{"$ref":"#/components/schemas/MailboxProvider"},{"type":"null"}]},"marketplace_company_ids":{"items":{"$ref":"#/components/schemas/MarketplaceCompanyId"},"title":"Marketplace Company Ids","type":"array"},"psa_company_id":{"title":"Psa Company Id","type":"string"},"psa_company_name":{"title":"Psa Company Name","type":"string"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},"required":["psa_company_id","psa_company_name","tenant_id","marketplace_company_ids","employee_identity_provider","mailbox_provider","custom_instructions","custom_instructions_for_user_facing_chat","azure_delegated_access_granted","azure_application_access_granted","auto_assign_exchange_admin","auto_assign_priv_auth_admin"],"title":"PublicEndCompany","type":"object"},"PublicFilterField":{"properties":{"field_name":{"title":"Field Name","type":"string"},"options":{"items":{"$ref":"#/components/schemas/PublicFilterOption"},"title":"Options","type":"array"}},"required":["field_name","options"],"title":"PublicFilterField","type":"object"},"PublicFilterOption":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Id"},"name":{"title":"Name","type":"string"}},"required":["id","name"],"title":"PublicFilterOption","type":"object"},"PublicIntegration":{"properties":{"category":{"$ref":"#/components/schemas/IntegrationCategory"},"connected":{"title":"Connected","type":"boolean"},"glyph":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Glyph"},"id":{"title":"Id","type":"string"},"label":{"title":"Label","type":"string"},"last_sync_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Sync At"},"last_sync_status":{"anyOf":[{"$ref":"#/components/schemas/SimpleStatus"},{"type":"null"}]},"logo_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Path"}},"required":["id","label","category","logo_path","glyph","connected","last_sync_at","last_sync_status"],"title":"PublicIntegration","type":"object"},"PublicIntent":{"description":"A curated request type: a menu name/description, an intake question script (`ask_for`), the\nsurfaces it runs on, and the agents/companies it applies to (empty = all).","properties":{"agent_ids":{"items":{"type":"integer"},"title":"Agent Ids","type":"array"},"ask_for":{"title":"Ask For","type":"string"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"description":{"title":"Description","type":"string"},"enabled":{"title":"Enabled","type":"boolean"},"end_company_ids":{"items":{"type":"string"},"title":"End Company Ids","type":"array"},"id":{"title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"surfaces":{"items":{"$ref":"#/components/schemas/IntentSurface"},"title":"Surfaces","type":"array"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","name","description","ask_for","surfaces","agent_ids","end_company_ids","enabled","created_at","updated_at"],"title":"PublicIntent","type":"object"},"PublicIterationPause":{"properties":{"attempt":{"title":"Attempt","type":"integer"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"directive":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Directive"},"directive_by_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Directive By User Id"},"execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Id"},"pause_id":{"title":"Pause Id","type":"string"},"pending_calls":{"items":{"$ref":"#/components/schemas/PublicIterationPendingCall"},"title":"Pending Calls","type":"array"},"seq":{"title":"Seq","type":"integer"},"session_id":{"title":"Session Id","type":"string"},"status":{"$ref":"#/components/schemas/IterationPauseStatus"},"trigger":{"$ref":"#/components/schemas/IterationPauseTrigger"},"withheld_outputs":{"additionalProperties":{"type":"string"},"title":"Withheld Outputs","type":"object"}},"required":["pause_id","session_id","attempt","seq","execution_id","trigger","status","pending_calls","withheld_outputs","directive","directive_by_user_id","created_at"],"title":"PublicIterationPause","type":"object"},"PublicIterationPauseSummary":{"properties":{"attempt":{"title":"Attempt","type":"integer"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"pause_id":{"title":"Pause Id","type":"string"},"seq":{"title":"Seq","type":"integer"},"status":{"$ref":"#/components/schemas/IterationPauseStatus"},"trigger":{"$ref":"#/components/schemas/IterationPauseTrigger"}},"required":["pause_id","attempt","seq","trigger","status","created_at"],"title":"PublicIterationPauseSummary","type":"object"},"PublicIterationPendingCall":{"properties":{"call_id":{"title":"Call Id","type":"string"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"}},"required":["call_id","tool_name"],"title":"PublicIterationPendingCall","type":"object"},"PublicIterationSession":{"properties":{"agent_id":{"title":"Agent Id","type":"integer"},"chat_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Session Id"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"current_attempt":{"title":"Current Attempt","type":"integer"},"expires_at":{"format":"date-time","title":"Expires At","type":"string"},"hold_policy":{"$ref":"#/components/schemas/IterationHoldPolicy"},"live_pause_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Live Pause Id"},"pauses":{"default":[],"items":{"$ref":"#/components/schemas/PublicIterationPauseSummary"},"title":"Pauses","type":"array"},"session_id":{"title":"Session Id","type":"string"},"status":{"$ref":"#/components/schemas/IterationSessionStatus"},"target_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Entity Id"}},"required":["session_id","agent_id","status","hold_policy","target_entity_id","current_attempt","live_pause_id","chat_session_id","expires_at","created_at"],"title":"PublicIterationSession","type":"object"},"PublicMappedTechnician":{"properties":{"entra_object_id":{"title":"Entra Object Id","type":"string"},"name":{"title":"Name","type":"string"},"psa_id":{"title":"Psa Id","type":"string"},"upn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upn"}},"required":["psa_id","name","entra_object_id","upn"],"title":"PublicMappedTechnician","type":"object"},"PublicMemory":{"properties":{"audiences":{"items":{"$ref":"#/components/schemas/MemoryAudience"},"title":"Audiences","type":"array"},"category":{"$ref":"#/components/schemas/MemoryCategory"},"confidence":{"title":"Confidence","type":"number"},"content":{"title":"Content","type":"string"},"created_at":{"title":"Created At","type":"string"},"created_by":{"$ref":"#/components/schemas/MemoryCreatedBy"},"created_by_user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By User Name"},"deleted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deleted At"},"derivation":{"$ref":"#/components/schemas/DerivationMethod"},"evidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evidence"},"id":{"title":"Id","type":"string"},"last_confirmed_at":{"title":"Last Confirmed At","type":"string"},"pinned":{"title":"Pinned","type":"boolean"},"pinned_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pinned At"},"scope_id":{"title":"Scope Id","type":"string"},"scope_type":{"$ref":"#/components/schemas/ScopeType"},"superseded_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Superseded By"},"supersedes_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supersedes Id"},"test_mode":{"title":"Test Mode","type":"boolean"}},"required":["id","scope_type","scope_id","category","audiences","content","confidence","derivation","created_by","created_by_user_name","evidence","created_at","last_confirmed_at","supersedes_id","superseded_by","deleted_at","pinned","pinned_at","test_mode"],"title":"PublicMemory","type":"object"},"PublicMemoryFacets":{"properties":{"by_category":{"additionalProperties":{"type":"integer"},"title":"By Category","type":"object"},"by_created_by":{"additionalProperties":{"type":"integer"},"title":"By Created By","type":"object"},"by_scope_type":{"additionalProperties":{"type":"integer"},"title":"By Scope Type","type":"object"}},"required":["by_scope_type","by_category","by_created_by"],"title":"PublicMemoryFacets","type":"object"},"PublicMemoryListPage":{"properties":{"facets":{"$ref":"#/components/schemas/PublicMemoryFacets"},"memories":{"items":{"$ref":"#/components/schemas/PublicMemory"},"title":"Memories","type":"array"},"total":{"title":"Total","type":"integer"}},"required":["memories","total","facets"],"title":"PublicMemoryListPage","type":"object"},"PublicPhoneCall":{"description":"Public projection of a `phone_calls` row.\n\nNo recording URL or binary content here \u2014 those are kept in the dashboard\nsurface so retention/PII rules can be enforced uniformly.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"finished_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Finished At"},"from_number":{"title":"From Number","type":"string"},"id":{"title":"Id","type":"integer"},"sentiment":{"anyOf":[{"$ref":"#/components/schemas/Sentiment"},{"type":"null"}]},"to_number":{"title":"To Number","type":"string"},"transcription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcription"}},"required":["id","from_number","to_number","duration_seconds","transcription","sentiment","created_at","finished_at"],"title":"PublicPhoneCall","type":"object"},"PublicPhoneNumber":{"description":"Public projection of a `phone_numbers` row.\n\n`psa_settings` and `agent_settings` are returned as opaque JSON \u2014 their\ninner shapes (which PSA action to take on missing customer, which voice\nprofile, which custom prompt) are tenant-curated and not part of the public\ncontract. Anyone wanting to edit them goes through the dashboard.","properties":{"agent_settings":{"additionalProperties":true,"title":"Agent Settings","type":"object"},"country":{"$ref":"#/components/schemas/CountryCode"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"id":{"title":"Id","type":"integer"},"minutes_used_this_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Minutes Used This Month"},"number":{"title":"Number","type":"string"},"psa_settings":{"additionalProperties":true,"title":"Psa Settings","type":"object"},"status":{"$ref":"#/components/schemas/PhoneNumberStatus"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","number","country","status","minutes_used_this_month","psa_settings","agent_settings","created_at","updated_at"],"title":"PublicPhoneNumber","type":"object"},"PublicRemovableCompany":{"properties":{"name":{"title":"Name","type":"string"},"psa_company_id":{"title":"Psa Company Id","type":"string"}},"required":["psa_company_id","name"],"title":"PublicRemovableCompany","type":"object"},"PublicRemovalPreview":{"properties":{"companies":{"items":{"$ref":"#/components/schemas/PublicRemovableCompany"},"title":"Companies","type":"array"},"count":{"title":"Count","type":"integer"}},"required":["count","companies"],"title":"PublicRemovalPreview","type":"object"},"PublicRemovalResult":{"properties":{"removed":{"title":"Removed","type":"integer"}},"required":["removed"],"title":"PublicRemovalResult","type":"object"},"PublicScheduledWork":{"properties":{"additional_custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Custom Instructions"},"client_id":{"title":"Client Id","type":"string"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"executed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Executed At"},"execution_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Message"},"execution_temporal_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Temporal Run Id"},"id":{"title":"Id","type":"integer"},"scheduled_for":{"format":"date-time","title":"Scheduled For","type":"string"},"status":{"$ref":"#/components/schemas/ScheduledWorkStatus"},"ticket_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticket Id"},"ticket_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticket Number"},"updated_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Updated At"},"workflow_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workflow Id"},"workflow_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Name"}},"required":["id","created_at","client_id","workflow_id","workflow_name","ticket_id","ticket_number","scheduled_for","additional_custom_instructions","status","created_by","executed_at","execution_temporal_run_id","execution_message","updated_at"],"title":"PublicScheduledWork","type":"object"},"PublicSettings":{"properties":{"data_residency":{"$ref":"#/components/schemas/DataResidency"},"end_business_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"End Business Hours"},"human_friendly_client_name":{"title":"Human Friendly Client Name","type":"string"},"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Code"},"sleep_before_callback_processing_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sleep Before Callback Processing Seconds"},"start_business_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Start Business Hours"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"}},"required":["timezone","sleep_before_callback_processing_seconds","start_business_hours","end_business_hours","human_friendly_client_name","data_residency","referral_code"],"title":"PublicSettings","type":"object"},"PublicSettingsUpdate":{"properties":{"end_business_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"End Business Hours"},"human_friendly_client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Human Friendly Client Name"},"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Referral Code"},"sleep_before_callback_processing_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Sleep Before Callback Processing Seconds"},"start_business_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Start Business Hours"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Timezone"}},"title":"PublicSettingsUpdate","type":"object"},"PublicSkill":{"description":"A tenant skill read whole \u2014 the row plus the latest version of each file.","properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"files":{"items":{"$ref":"#/components/schemas/PublicSkillFile"},"title":"Files","type":"array"},"id":{"title":"Id","type":"string"},"name":{"description":"Editable display name.","title":"Name","type":"string"},"slug":{"description":"Immutable identifier chosen when the skill was created.","title":"Slug","type":"string"},"source_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Run Id"},"updated_at":{"title":"Updated At","type":"string"}},"required":["id","slug","name","description","source_run_id","updated_at","files"],"title":"PublicSkill","type":"object"},"PublicSkillFile":{"properties":{"content":{"title":"Content","type":"string"},"id":{"title":"Id","type":"string"},"path":{"title":"Path","type":"string"},"version":{"title":"Version","type":"integer"}},"required":["id","path","version","content"],"title":"PublicSkillFile","type":"object"},"PublicSkillSummary":{"description":"A tenant skill without file contents \u2014 the list view and the prompt-menu shape.","properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"file_paths":{"items":{"type":"string"},"title":"File Paths","type":"array"},"id":{"title":"Id","type":"string"},"name":{"description":"Editable display name.","title":"Name","type":"string"},"slug":{"description":"Immutable identifier chosen when the skill was created.","title":"Slug","type":"string"},"source_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Run Id"},"updated_at":{"title":"Updated At","type":"string"}},"required":["id","slug","name","description","source_run_id","updated_at","file_paths"],"title":"PublicSkillSummary","type":"object"},"PublicSyncFilter":{"properties":{"field_name":{"title":"Field Name","type":"string"},"operator":{"$ref":"#/components/schemas/SyncFilterOperator"},"selected_options":{"items":{"$ref":"#/components/schemas/PublicFilterOption"},"title":"Selected Options","type":"array"}},"required":["operator","field_name","selected_options"],"title":"PublicSyncFilter","type":"object"},"PublicTeam":{"properties":{"display_name":{"title":"Display Name","type":"string"},"id":{"title":"Id","type":"string"}},"required":["id","display_name"],"title":"PublicTeam","type":"object"},"PublicTemplate":{"description":"Public projection of a `workflows_v2_templates` row.\n\nThe rich config blobs (`actions`, `toolbox`, `agent_settings`,\n`integrations`, `schedule`, `callback_settings`) are returned as opaque\nJSON: their inner shapes are documented via `/public-api/schemas/*` and\naccepted verbatim by `POST /public-api/agents`. Internal-only fields\n(`is_active`, `created_by_user`, `category_rank`) are dropped.","properties":{"actions":{"items":{"additionalProperties":true,"type":"object"},"title":"Actions","type":"array"},"agent_settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Agent Settings"},"audience":{"$ref":"#/components/schemas/ToolAudience"},"autonomy_type":{"$ref":"#/components/schemas/AutonomyType"},"callback_settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Callback Settings"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"description":{"title":"Description","type":"string"},"entity_type":{"$ref":"#/components/schemas/EntityType"},"id":{"title":"Id","type":"integer"},"integrations":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Integrations"},"name":{"title":"Name","type":"string"},"popular":{"title":"Popular","type":"boolean"},"process_entities_sequentially":{"title":"Process Entities Sequentially","type":"boolean"},"required_integrations":{"items":{"type":"string"},"title":"Required Integrations","type":"array"},"schedule":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Schedule"},"scope":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scope"},"supported_psas":{"items":{"$ref":"#/components/schemas/Itsm"},"title":"Supported Psas","type":"array"},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagline"},"toolbox":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Toolbox"},"trigger_type":{"$ref":"#/components/schemas/WorkflowTriggerType"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"}},"required":["id","name","description","tagline","scope","popular","category","autonomy_type","audience","entity_type","trigger_type","supported_psas","required_integrations","process_entities_sequentially","created_at","updated_at","actions","schedule","callback_settings","toolbox","agent_settings","integrations"],"title":"PublicTemplate","type":"object"},"PublicUnmatchedTechnician":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"name":{"title":"Name","type":"string"},"psa_id":{"title":"Psa Id","type":"string"}},"required":["psa_id","name","email"],"title":"PublicUnmatchedTechnician","type":"object"},"RMMScriptExecutionStatus":{"description":"Status of an RMM script execution tracked in Neo's database.","enum":["pending","queued","sent_to_rmm","completed","failed"],"title":"RMMScriptExecutionStatus","type":"string"},"ReasoningEffort":{"enum":["minimal","low","medium","high"],"title":"ReasoningEffort","type":"string"},"RegionDefault":{"properties":{"currency_symbol":{"enum":["$","\u00a3","\u20ac"],"title":"Currency Symbol","type":"string"},"rate":{"title":"Rate","type":"integer"},"region":{"title":"Region","type":"string"}},"required":["region","rate","currency_symbol"],"title":"RegionDefault","type":"object"},"ReportTestVia":{"enum":["Internal Ticket Note","Email to Internal Team","Teams Message to Internal Team","Dashboard Message"],"title":"ReportTestVia","type":"string"},"RetryExecutionRequest":{"properties":{"additional_custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Additional Custom Instructions"}},"title":"RetryExecutionRequest","type":"object"},"RmmScriptExecution":{"properties":{"completed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Completed At"},"created_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Created At"},"dynamic_script_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dynamic Script Id"},"entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"id":{"title":"Id","type":"string"},"initiating_agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Initiating Agent Id"},"initiating_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initiating Run Id"},"psa_company_id":{"title":"Psa Company Id","type":"string"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"},"rmm_device_id":{"title":"Rmm Device Id","type":"string"},"rmm_device_uid":{"title":"Rmm Device Uid","type":"string"},"rmm_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rmm Job Id"},"rmm_script_id":{"title":"Rmm Script Id","type":"string"},"rmm_script_name":{"title":"Rmm Script Name","type":"string"},"rmm_vendor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rmm Vendor"},"script_variables":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Script Variables"},"sent_to_rmm_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Sent To Rmm At"},"status":{"$ref":"#/components/schemas/RMMScriptExecutionStatus"},"waiting_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Waiting Run Id"}},"required":["id","status","rmm_script_id","rmm_script_name","script_variables","rmm_device_id","rmm_device_uid","rmm_vendor","rmm_job_id","psa_company_id","entity_id","initiating_agent_id","initiating_run_id","waiting_run_id","result","error_message","created_at","sent_to_rmm_at","completed_at","dynamic_script_id"],"title":"RmmScriptExecution","type":"object"},"RmmScriptExecutionDetail":{"properties":{"completed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Completed At"},"created_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Created At"},"dynamic_script_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dynamic Script Id"},"entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"id":{"title":"Id","type":"string"},"initiating_agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Initiating Agent Id"},"initiating_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initiating Run Id"},"psa_company_id":{"title":"Psa Company Id","type":"string"},"rendered_script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rendered Script"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"},"rmm_device_id":{"title":"Rmm Device Id","type":"string"},"rmm_device_uid":{"title":"Rmm Device Uid","type":"string"},"rmm_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rmm Job Id"},"rmm_script_id":{"title":"Rmm Script Id","type":"string"},"rmm_script_name":{"title":"Rmm Script Name","type":"string"},"rmm_vendor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rmm Vendor"},"script_variables":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Script Variables"},"sent_to_rmm_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Sent To Rmm At"},"status":{"$ref":"#/components/schemas/RMMScriptExecutionStatus"},"waiting_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Waiting Run Id"}},"required":["id","status","rmm_script_id","rmm_script_name","script_variables","rmm_device_id","rmm_device_uid","rmm_vendor","rmm_job_id","psa_company_id","entity_id","initiating_agent_id","initiating_run_id","waiting_run_id","result","error_message","created_at","sent_to_rmm_at","completed_at","dynamic_script_id","rendered_script"],"title":"RmmScriptExecutionDetail","type":"object"},"Rule":{"properties":{"field":{"title":"Field","type":"string"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Id"},"operator":{"$ref":"#/components/schemas/Operator"},"value":{"title":"Value"},"valueProviderInput":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Valueproviderinput"}},"required":["field","operator","value"],"title":"Rule","type":"object"},"RulesGroup":{"properties":{"combinator":{"$ref":"#/components/schemas/Combinator"},"rules":{"items":{"anyOf":[{"$ref":"#/components/schemas/Rule"},{"$ref":"#/components/schemas/RulesGroup"}]},"title":"Rules","type":"array"}},"required":["rules","combinator"],"title":"RulesGroup","type":"object"},"RunNowRequest":{"description":"`POST /public-api/agents/<id>/run-now` body.","properties":{"additional_custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Additional Custom Instructions"},"target_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Target Entity Id"}},"title":"RunNowRequest","type":"object"},"ScalepadIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/ScalepadPermissionGroup"},"title":"Permissions","type":"array"}},"title":"ScalepadIntegration","type":"object"},"ScalepadPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"allow_delete":{"default":false,"description":"Allow deleting records (DELETE requests)","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Allow Delete","type":"boolean"},"group_type":{"$ref":"#/components/schemas/ScalepadPermissionGroupType","enum":["CORE","LIFECYCLE_MANAGER","CONTROLMAP","QUOTER"],"enumNames":["Core","Lifecycle Manager","ControlMap","Quoter"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"ScalepadPermissionGroup","type":"object"},"ScalepadPermissionGroupType":{"enum":["Core","Lifecycle Manager","ControlMap","Quoter"],"title":"ScalepadPermissionGroupType","type":"string"},"ScheduledWorkStatus":{"enum":["PENDING","PROCESSING","COMPLETED","FAILED","CANCELLED"],"title":"ScheduledWorkStatus","type":"string"},"ScopeType":{"description":"What a memory is scoped to: `CLIENT` (facts about the MSP itself) or `END_CLIENT` (facts about one end-client company, keyed by its PSA company id).","enum":["CLIENT","END_CLIENT"],"title":"ScopeType","type":"string"},"ScreenConnectRmmIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/ScreenConnectRmmPermissionGroup"},"title":"Permissions","type":"array"}},"title":"ScreenConnectRmmIntegration","type":"object"},"ScreenConnectRmmPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"group_type":{"$ref":"#/components/schemas/ScreenConnectRmmPermissionGroupType","enum":["SESSIONS","COMMANDS","TOOLBOX_MESSAGING"],"enumNames":["Sessions","Commands","Toolbox & Messaging"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"ScreenConnectRmmPermissionGroup","type":"object"},"ScreenConnectRmmPermissionGroupType":{"enum":["Sessions","Commands","Toolbox & Messaging"],"title":"ScreenConnectRmmPermissionGroupType","type":"string"},"Sentiment":{"enum":["POSITIVE","NEGATIVE","NEUTRAL"],"title":"Sentiment","type":"string"},"ServicenowIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/ServicenowPermissionGroup"},"title":"Permissions","type":"array"}},"title":"ServicenowIntegration","type":"object"},"ServicenowPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"allow_delete":{"default":false,"description":"Allow deleting records (DELETE requests)","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Allow Delete","type":"boolean"},"group_type":{"$ref":"#/components/schemas/ServicenowPermissionGroupType","enum":["TICKETS","WORK_NOTES","CLIENT_FACING_NOTES","TIME_ENTRIES","USERS_AND_GROUPS","COMPANIES","CMDB","CONFIGURATION"],"enumNames":["Tickets","Work Notes","Client-Facing Notes","Time Entries","Users and Groups","Companies","CMDB","Configuration"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"ServicenowPermissionGroup","type":"object"},"ServicenowPermissionGroupType":{"enum":["Tickets","Work Notes","Client-Facing Notes","Time Entries","Users and Groups","Companies","CMDB","Configuration"],"title":"ServicenowPermissionGroupType","type":"string"},"SharedAgentCapabilities":{"properties":{"sandbox_enabled":{"title":"Sandbox Enabled","type":"boolean"},"subagents_enabled":{"title":"Subagents Enabled","type":"boolean"}},"required":["sandbox_enabled","subagents_enabled"],"title":"SharedAgentCapabilities","type":"object"},"SharedAgentSnapshot":{"description":"Self-contained bundle the public page renders from \u2014 no separate schema endpoints, no\nstored state, built fresh at view time. `view` drives the header + the Overview/Triggers\npanels; `agent` + the (generic) schema catalogs + the connected map feed the REAL builder\ncomponents (Custom Instructions + AvailableToolsPanel) on the Tools & Settings tab.","properties":{"action_schemas":{"items":{"additionalProperties":true,"type":"object"},"title":"Action Schemas","type":"array"},"agent":{"additionalProperties":true,"title":"Agent","type":"object"},"callback_change_options":{"items":{"type":"string"},"title":"Callback Change Options","type":"array"},"integration_schemas":{"additionalProperties":true,"title":"Integration Schemas","type":"object"},"integration_statuses":{"additionalProperties":true,"title":"Integration Statuses","type":"object"},"ticket_schema":{"additionalProperties":true,"title":"Ticket Schema","type":"object"},"time_entry_schema":{"additionalProperties":true,"title":"Time Entry Schema","type":"object"},"tool_schemas":{"items":{"additionalProperties":true,"type":"object"},"title":"Tool Schemas","type":"array"},"view":{"$ref":"#/components/schemas/SharedAgentView"}},"required":["view","agent","tool_schemas","integration_schemas","integration_statuses","ticket_schema","time_entry_schema","action_schemas","callback_change_options"],"title":"SharedAgentSnapshot","type":"object"},"SharedAgentView":{"description":"The complete public projection of a shared agent/workflow \u2014 everything the no-login\nread-only viewer is allowed to see. Built only by `build_shared_agent_view`.","properties":{"attribution":{"anyOf":[{"$ref":"#/components/schemas/SharedAttribution"},{"type":"null"}]},"autonomy_type":{"$ref":"#/components/schemas/AutonomyType"},"capabilities":{"$ref":"#/components/schemas/SharedAgentCapabilities"},"created_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Created At"},"entity_type":{"$ref":"#/components/schemas/EntityType"},"filter_values_masked":{"title":"Filter Values Masked","type":"boolean"},"filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters"},"integrations":{"items":{"$ref":"#/components/schemas/SharedIntegrationDisplay"},"title":"Integrations","type":"array"},"name":{"title":"Name","type":"string"},"pipeline":{"items":{"$ref":"#/components/schemas/SharedPipelineStep"},"title":"Pipeline","type":"array"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"schedule":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Schedule"},"tools":{"items":{"$ref":"#/components/schemas/SharedToolDisplay"},"title":"Tools","type":"array"},"trigger_type":{"$ref":"#/components/schemas/WorkflowTriggerType"},"triggers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Triggers"}},"required":["name","autonomy_type","entity_type","trigger_type","prompt","schedule","triggers","filters","pipeline","tools","integrations","capabilities","attribution","filter_values_masked","created_at"],"title":"SharedAgentView","type":"object"},"SharedAttribution":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"}},"required":["label","logo_url"],"title":"SharedAttribution","type":"object"},"SharedIntegrationDisplay":{"description":"A connected integration with its read-only permission matrix \u2014 the same shape the real\nbuilder's Tools & Settings tab renders. Only enabled (non-DISABLED) groups are included.","properties":{"groups":{"items":{"$ref":"#/components/schemas/SharedPermissionGroup"},"title":"Groups","type":"array"},"key":{"title":"Key","type":"string"},"name":{"title":"Name","type":"string"}},"required":["key","name","groups"],"title":"SharedIntegrationDisplay","type":"object"},"SharedPermissionGroup":{"description":"One row of an integration's read-only permission matrix.","properties":{"access":{"title":"Access","type":"string"},"name":{"title":"Name","type":"string"},"requires_approval":{"title":"Requires Approval","type":"boolean"}},"required":["name","access","requires_approval"],"title":"SharedPermissionGroup","type":"object"},"SharedPipelineStep":{"description":"One step in a CHAINED_ACTIONS workflow's action pipeline (post-FIND_ENTITIES). `settings` is\nthe action's config (notification message, fields updated, PSA options) \u2014 None unless the owner\nopted into `reveal_tool_details`, mirroring `SharedToolDisplay.settings`.","properties":{"action_type":{"title":"Action Type","type":"string"},"label":{"title":"Label","type":"string"},"settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings"}},"required":["action_type","label","settings"],"title":"SharedPipelineStep","type":"object"},"SharedToolDisplay":{"description":"One enabled tool. `settings` is None unless the owner opted into `reveal_tool_details`\n\u2014 per-tool config can carry staff emails / technician names / PSA option ids.","properties":{"group":{"title":"Group","type":"string"},"settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings"},"title":{"title":"Title","type":"string"},"type":{"title":"Type","type":"string"}},"required":["type","title","group","settings"],"title":"SharedToolDisplay","type":"object"},"SignalResponse":{"description":"Returned by pause/resume/cancel. The signal is enqueued \u2014 the row's\n`state` may take up to one orchestrator tick (~30s) to reflect the\nchange. Poll `GET /backfills/{id}` to observe it.","properties":{"backfill_id":{"title":"Backfill Id","type":"string"},"message":{"title":"Message","type":"string"},"signal":{"title":"Signal","type":"string"}},"required":["backfill_id","signal","message"],"title":"SignalResponse","type":"object"},"SimpleStatus":{"enum":["RUNNING","SUCCESS","FAILURE","SKIPPED"],"title":"SimpleStatus","type":"string"},"SkillFileInput":{"properties":{"content":{"title":"Content","type":"string"},"path":{"title":"Path","type":"string"}},"required":["path","content"],"title":"SkillFileInput","type":"object"},"StartAnalysisRequest":{"properties":{"currency_symbol":{"anyOf":[{"enum":["$","\u00a3","\u20ac"],"type":"string"},{"type":"null"}],"default":null,"title":"Currency Symbol"},"hourly_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Hourly Rate"},"period_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Period Days"},"sample_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Sample Size"}},"title":"StartAnalysisRequest","type":"object"},"StartAnalysisResponse":{"properties":{"analysis_id":{"title":"Analysis Id","type":"integer"},"status":{"$ref":"#/components/schemas/InsightsAnalysisStatus"}},"required":["analysis_id","status"],"title":"StartAnalysisResponse","type":"object"},"StepType":{"enum":["THOUGHT","ACTION","TOOL_CALL","TOOL_RESULT","FINAL_MESSAGE","SYSTEM_PROMPT","USER_MESSAGE","TOOL_SCHEMAS","LLM_CONFIG"],"title":"StepType","type":"string"},"Subscription":{"properties":{"effective_credits_limit":{"title":"Effective Credits Limit","type":"integer"},"enabled":{"title":"Enabled","type":"boolean"},"monthly_credits_limit":{"title":"Monthly Credits Limit","type":"integer"},"paid_plan":{"anyOf":[{"$ref":"#/components/schemas/PaidPlan"},{"type":"null"}]},"trial_state":{"$ref":"#/components/schemas/TrialState"}},"required":["paid_plan","trial_state","monthly_credits_limit","effective_credits_limit","enabled"],"title":"Subscription","type":"object"},"SuccessMeta":{"properties":{"pagination":{"$ref":"#/components/schemas/Pagination"},"request_id":{"format":"uuid","type":"string"},"timings_ms":{"additionalProperties":{"type":"number"},"type":"object"},"warnings":{"description":"Non-fatal warnings about the created/updated resource (e.g. an unhealthy PSA callback).","items":{"type":"string"},"type":"array"}},"required":["request_id","timings_ms"],"type":"object"},"SupersedeMemoryRequest":{"properties":{"audiences":{"anyOf":[{"items":{"$ref":"#/components/schemas/MemoryAudience"},"type":"array"},{"type":"null"}],"default":null,"title":"Audiences"},"confidence":{"default":1.0,"maximum":1.0,"minimum":0.0,"title":"Confidence","type":"number"},"content":{"title":"Content","type":"string"},"evidence":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Evidence"}},"required":["content"],"title":"SupersedeMemoryRequest","type":"object"},"SupportChatContactRequest":{"properties":{"client_id":{"title":"Client Id","type":"string"},"email":{"description":"Email of the person to invite to the Teams support chat","title":"Email","type":"string"}},"required":["client_id","email"],"title":"SupportChatContactRequest","type":"object"},"SupportChatContactResponse":{"properties":{"attached":{"title":"Attached","type":"boolean"},"status":{"title":"Status","type":"string"}},"required":["attached","status"],"title":"SupportChatContactResponse","type":"object"},"SyncActivity":{"description":"One activity inside a sync run (e.g. \"PSA Metadata\", \"PSA Contacts\").\n`synced_count` is how many records the activity actually upserted out of\n`total_count` candidates; `failures[]` is the per-resource problem list.","properties":{"activity_label":{"title":"Activity Label","type":"string"},"failures":{"items":{"$ref":"#/components/schemas/SyncEntityFailure"},"title":"Failures","type":"array"},"synced_count":{"title":"Synced Count","type":"integer"},"total_count":{"title":"Total Count","type":"integer"}},"required":["activity_label","synced_count","total_count","failures"],"title":"SyncActivity","type":"object"},"SyncEntityFailure":{"description":"One per-entity-type failure inside an activity (e.g. \"Ticket Types\"\npermission-denied on board 444). Sourced verbatim from `sync_details`.","properties":{"error_message":{"title":"Error Message","type":"string"},"parent_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Label"},"reason":{"title":"Reason","type":"string"},"resource_label":{"title":"Resource Label","type":"string"}},"required":["resource_label","parent_label","reason","error_message"],"title":"SyncEntityFailure","type":"object"},"SyncFilterOperator":{"enum":["include","exclude"],"title":"SyncFilterOperator","type":"string"},"SyncRun":{"description":"One row from `pipeline_runs`. Honest shape: we surface what's stored,\nnot a speculative per-entity-type cursor view (we don't persist that).","properties":{"activities":{"items":{"$ref":"#/components/schemas/SyncActivity"},"title":"Activities","type":"array"},"dashboard_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dashboard Message"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"finished_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Finished At"},"run_id":{"title":"Run Id","type":"string"},"started_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Started At"},"status":{"$ref":"#/components/schemas/SimpleStatus"},"temporal_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Temporal Run Id"},"temporal_workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Temporal Workflow Id"}},"required":["run_id","temporal_run_id","temporal_workflow_id","status","started_at","finished_at","error","dashboard_message","activities"],"title":"SyncRun","type":"object"},"TargetEvent":{"description":"A target event is something that will trigger the workflow.","properties":{"change_type":{"$ref":"#/components/schemas/EventType"},"source_value":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Source Value"},"target_field":{"anyOf":[{"$ref":"#/components/schemas/ChangedField"},{"type":"null"}],"default":null},"target_value":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Target Value"},"target_workflow_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Target Workflow Id"}},"required":["change_type"],"title":"TargetEvent","type":"object"},"TeamsAvailabilityAutoMapResponse":{"properties":{"matched":{"items":{"$ref":"#/components/schemas/PublicMappedTechnician"},"title":"Matched","type":"array"},"unmatched":{"items":{"$ref":"#/components/schemas/PublicUnmatchedTechnician"},"title":"Unmatched","type":"array"}},"required":["matched","unmatched"],"title":"TeamsAvailabilityAutoMapResponse","type":"object"},"TeamsAvailabilityConsentUrlResponse":{"properties":{"auth_url":{"title":"Auth Url","type":"string"}},"required":["auth_url"],"title":"TeamsAvailabilityConsentUrlResponse","type":"object"},"Technician":{"properties":{"custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Instructions"},"id":{"title":"Id","type":"integer"},"is_ready":{"title":"Is Ready","type":"boolean"},"name":{"title":"Name","type":"string"},"profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile"},"profile_status":{"anyOf":[{"$ref":"#/components/schemas/TechnicianProfileStatus"},{"type":"null"}]},"psa_id":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Psa Id"},"update_automatically":{"title":"Update Automatically","type":"boolean"},"updated_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Updated At"}},"required":["id","name","psa_id","profile","custom_instructions","update_automatically","is_ready","profile_status","updated_at"],"title":"Technician","type":"object"},"TechnicianProfileStatus":{"description":"Why a technician's expertise profile is or isn't generated \u2014 surfaced on the Profiles tab so\nthe MSP knows what happened instead of seeing a silent placeholder. Set by the profile sync.\n\nSerializes to the uppercase member name (ConfiguredEnum) so the dashboard reads the names below.","enum":["PENDING","READY","NO_CLOSED_TICKETS","INACTIVE_IN_PSA"],"title":"TechnicianProfileStatus","type":"string"},"TenantLocalWindow":{"properties":{"since":{"format":"date-time","title":"Since","type":"string"},"timezone":{"title":"Timezone","type":"string"},"until":{"format":"date-time","title":"Until","type":"string"}},"required":["since","until","timezone"],"title":"TenantLocalWindow","type":"object"},"TicketCoverageBucket":{"description":"One time-bucket row for `/ticket-coverage`.","properties":{"bucket":{"title":"Bucket","type":"string"},"neo_handled_tickets":{"title":"Neo Handled Tickets","type":"integer"},"total_tickets":{"title":"Total Tickets","type":"integer"}},"required":["bucket","total_tickets","neo_handled_tickets"],"title":"TicketCoverageBucket","type":"object"},"TilApprover":{"description":"A technician the approval request was sent to \u2014 i.e. who is eligible to approve it.","properties":{"user_id":{"title":"User Id","type":"string"},"user_name":{"title":"User Name","type":"string"}},"required":["user_id","user_name"],"title":"TilApprover","type":"object"},"TilBulkDecisionItem":{"properties":{"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"request_id":{"title":"Request Id","type":"integer"},"status":{"anyOf":[{"$ref":"#/components/schemas/ConsentStatus"},{"type":"null"}]}},"required":["request_id","status","message"],"title":"TilBulkDecisionItem","type":"object"},"TilBulkDecisionRequest":{"properties":{"action":{"enum":["approve","reject"],"title":"Action","type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Note"},"request_ids":{"description":"The TIL request ids to resolve, in the caller's own tenant. Must be unique and between 1 and 50 ids.","items":{"type":"integer"},"maxItems":50,"minItems":1,"title":"Request Ids","type":"array"}},"required":["request_ids","action"],"title":"TilBulkDecisionRequest","type":"object"},"TilBulkDecisionResponse":{"properties":{"action":{"enum":["approve","reject"],"title":"Action","type":"string"},"already_resolved":{"items":{"$ref":"#/components/schemas/TilBulkDecisionItem"},"title":"Already Resolved","type":"array"},"failed":{"items":{"$ref":"#/components/schemas/TilBulkDecisionItem"},"title":"Failed","type":"array"},"succeeded":{"items":{"$ref":"#/components/schemas/TilBulkDecisionItem"},"title":"Succeeded","type":"array"}},"required":["action","succeeded","already_resolved","failed"],"title":"TilBulkDecisionResponse","type":"object"},"TilChannel":{"description":"Where Technician-in-the-Loop approval requests are delivered to the approver.","enum":["Teams","Chat"],"title":"TilChannel","type":"string"},"TilDecisionRequest":{"properties":{"acting_end_user":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The technician resolving the request, as their stable user id (M365 AAD object id). Honored only for a platform service account: it authorizes resolving a proactive (Teams) TIL when this technician is one of its recipients, or a conversational (chat) MSP agent's TIL, and records them as the approver. Ignored for other callers.","title":"Acting End User"},"acting_end_user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display name of the resolving technician (acting_end_user), for the audit record. Honored only for a platform service account; falls back to the user id when absent.","title":"Acting End User Name"},"action":{"enum":["approve","reject"],"title":"Action","type":"string"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Target tenant whose TIL request to resolve. Honored only for a platform service account; any other caller passing it gets 403. A platform caller may resolve a tenant's TIL when the acting technician (see acting_end_user) is one of its recipients, or when it belongs to that tenant's Neo Support agent. Omit to resolve in the caller's own tenant.","title":"Client Id"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Note"}},"required":["action"],"title":"TilDecisionRequest","type":"object"},"TilRequest":{"properties":{"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Agent Id"},"agent_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Name"},"approvers":{"items":{"$ref":"#/components/schemas/TilApprover"},"title":"Approvers","type":"array"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"consent_status":{"$ref":"#/components/schemas/ConsentStatus"},"created_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Created At"},"decided_by":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"id":{"title":"Id","type":"integer"},"requested_by":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"requested_for":{"additionalProperties":true,"title":"Requested For","type":"object"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"ticket_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticket Id"},"ticket_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticket Number"},"topic":{"$ref":"#/components/schemas/Topic"},"updated_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Updated At"}},"required":["id","agent_id","agent_name","ticket_id","ticket_number","topic","consent_status","requested_for","approvers","decided_by","requested_by","comment","session_id","created_at","updated_at"],"title":"TilRequest","type":"object"},"TimeBucketStats":{"description":"One time-bucket row for `/timeline`.","properties":{"bucket":{"title":"Bucket","type":"string"},"fully_resolved_executions":{"title":"Fully Resolved Executions","type":"integer"},"hours_saved":{"title":"Hours Saved","type":"number"},"partially_resolved_executions":{"title":"Partially Resolved Executions","type":"integer"},"successful_executions":{"title":"Successful Executions","type":"integer"},"total_executions":{"title":"Total Executions","type":"integer"}},"required":["bucket","total_executions","successful_executions","fully_resolved_executions","partially_resolved_executions","hours_saved"],"title":"TimeBucketStats","type":"object"},"TimePeriod":{"properties":{"interval":{"title":"Interval","type":"integer"},"unit":{"$ref":"#/components/schemas/TimeUnit"}},"required":["interval","unit"],"title":"TimePeriod","type":"object"},"TimeUnit":{"enum":["MINUTE","HOUR","DAY","WEEK","MONTH"],"title":"TimeUnit","type":"string"},"ToolAudience":{"description":"Trust domain a tool / agent / channel may be exposed to.\n\nMSP \u2014 technician/dashboard surfaces; tools may take MSP-wide scope and accept company/\ncontact identifiers as LLM-supplied parameters. An agent/channel with this audience is the\nMSP's own INTERNAL surface (the dashboard labels MSP as \"Internal\").\nEND_USER \u2014 the MSP's end-client users (white-label Teams bots, embedded end-company chat).\nEND_USER tools must derive ALL identity (end-company, contact) from the session context,\nnever from tool parameters, so a prompt-injected or curious end user cannot widen scope.\nThe two surfaces are disjoint by construction: `resolve_end_user_toolbox` resolves only\nEND_USER tools (deny-by-default, no auto-injection), and `resolve_full_toolbox` is for\nMSP surfaces only.","enum":["MSP","END_USER"],"title":"ToolAudience","type":"string"},"Topic":{"enum":["TICKET","CONFIGURATION","PROJECT","PROJECT_TICKET","TEAM_MEMBER","CONTACT","CLIENT","TIME_ENTRY","SCHEDULED_ENTRY","ONBOARD_USER","OFFBOARD_USER","DISPATCH","GENERAL_QA","EXECUTE_RMM_COMPONENT","SEND_END_USER_MESSAGE","AGENTIC_WORKFLOW"],"title":"Topic","type":"string"},"TrialState":{"enum":["NOT_STARTED","SIGNED_UP","ACTIVE","EXPIRED_NEVER_ACTIVATED","EXPIRED_AFTER_ACTIVATION","CONVERTED_TO_PAID"],"title":"TrialState","type":"string"},"TriggerMode":{"description":"When the Teams bot relay forwards a message to the agent in shared scopes\n(group chat / channel). A personal 1:1 chat always forwards every message \u2014 there are\nno @mention semantics in a DM \u2014 so this only governs group chats and channels.","enum":["Mention only","Read all"],"title":"TriggerMode","type":"string"},"UpdateAgentRequest":{"description":"`PUT /public-api/agents/<id>` body \u2014 a partial patch. Only the fields you send are\nchanged; everything else keeps its current value. `autonomy_type` and `entity_type` are\nimmutable. Editing `actions`, `agent_settings`, `toolbox`, `integrations`, or the\nconditions is a destructive change and triggers a TIL approval when an agent makes the\ncall via `NEO_API_REQUEST`.\n\nThe intent-shape applies on update too: send updated `ticket_conditions` /\n`time_entry_conditions` to change the entity filter; the server rebuilds the\n`FIND_ENTITIES` action. `actions` is the pipeline AFTER `FIND_ENTITIES` (CHAINED_ACTIONS\nonly) \u2014 do not include `FIND_ENTITIES` yourself.\n\n`actions` MERGES (ENG-5712): each entry targets one existing action by `id` (preferred \u2014\nread it from `GET /agents/<id>`) or, when `id` is omitted, by `action_type` if exactly one\nexisting action has that type. The targeted action keeps its other config \u2014 its\n`input_as_dict` is merged key-by-key with what you send (nested objects merged, an explicit\n`null` deletes a key, scalars/lists replace), so changing one dispatch setting no longer\nwipes the technician pool, instructions, or calendar settings you didn't resend. Entries\nthat match nothing are appended as new actions; existing actions you don't mention are left\nuntouched. There is deliberately no wholesale-replace mode: a PUT can never drop or reorder\nan action \u2014 do structural pipeline edits (remove/reorder) in the dashboard.\n\n`toolbox`, `agent_settings`, `integrations`, `schedule`, and `callback_settings` all MERGE the\nsame way (RFC 7396) \u2014 send only what you're changing, and everything you omit keeps its current\nvalue:\n- `toolbox` merges per tool under `tool_settings_by_type` (nested objects merge; scalars and\n  lists \u2014 e.g. `allowed_users` \u2014 replace wholesale; a `null` tool key disables that tool).\n- `agent_settings` merges per field, so `{\"agent_settings\": {\"custom_instructions\": \"\u2026\"}}`\n  changes only the instructions and leaves `test_mode`, `model`, `reasoning_effort`,\n  `til_channel`, etc. untouched (a partial send used to silently reset them to defaults, e.g.\n  flipping an agent out of test mode).\n- `integrations` merges per integration, so sending one integration's permissions leaves every\n  other connected integration untouched (a partial send used to disable them all).\n- `schedule` merges per field, so `{\"schedule\": {\"timezone\": \"\u2026\"}}` changes only the timezone\n  and leaves the run cadence / business-hours windows / weekend-skip intact.\n- `callback_settings` merges per field (`target_changes` is still required).\nNested objects merge key-by-key, scalars/lists replace wholesale, and an explicit `null`\ndeletes that key. An explicit top-level `\"toolbox\": null` still clears the whole toolbox.","properties":{"actions":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"Actions"},"agent_settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Agent Settings"},"callback_settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Callback Settings"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Group Name"},"group_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Group Order"},"integrations":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Integrations"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Name"},"process_entities_sequentially":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Process Entities Sequentially"},"process_sub_entities_only_once":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Process Sub Entities Only Once"},"schedule":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Schedule"},"show_in_psa_pod":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Show In Psa Pod"},"state":{"anyOf":[{"$ref":"#/components/schemas/WorkflowState"},{"type":"null"}],"default":null},"ticket_conditions":{"anyOf":[{"$ref":"#/components/schemas/PsaTicketConditions"},{"type":"null"}],"default":null,"description":"Trigger/entity filter for TICKET agents \u2014 which tickets this agent fires on. Send it at the top level to set or change the filter; the server (re)builds the FIND_ENTITIES action from it (do not put the filter in `actions`). Use `time_entry_conditions` instead for TIME_ENTRY agents. Shape: `conditions` holds a `combinator` (`and`/`or`) and a `rules` list of leaves (`field`/`operator`/`value`) and/or nested groups (`rules` + `combinator`). A rule's position in the tree changes the logic \u2014 a company exclusion belongs as a top-level rule under the root `and`, not nested inside an `or`, or it only excludes when the other branches also miss."},"time_entry_conditions":{"anyOf":[{"$ref":"#/components/schemas/PsaConditions"},{"type":"null"}],"default":null,"description":"Trigger/entity filter for TIME_ENTRY agents \u2014 the analogue of `ticket_conditions`. Ignored for TICKET agents."},"toolbox":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Toolbox"},"trigger_type":{"anyOf":[{"$ref":"#/components/schemas/WorkflowTriggerType"},{"type":"null"}],"default":null}},"title":"UpdateAgentRequest","type":"object"},"UpdateChannelRequest":{"properties":{"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Agent Id"},"audience":{"anyOf":[{"$ref":"#/components/schemas/ToolAudience"},{"type":"null"}],"default":null},"color_icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Color Icon Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Display Name"},"internal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Internal Name"},"outline_icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Outline Icon Url"},"relay_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Relay Prefix"},"show_agent_progress_steps":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Show Agent Progress Steps"},"status":{"anyOf":[{"$ref":"#/components/schemas/ChannelStatus"},{"type":"null"}],"default":null},"type":{"anyOf":[{"$ref":"#/components/schemas/ChannelType"},{"type":"null"}],"default":null},"welcome_message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Welcome Message"}},"title":"UpdateChannelRequest","type":"object"},"UpdateEndCompanyRequest":{"properties":{"auto_assign_exchange_admin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Auto Assign Exchange Admin"},"auto_assign_priv_auth_admin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Auto Assign Priv Auth Admin"},"custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Custom Instructions"},"custom_instructions_for_user_facing_chat":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Custom Instructions For User Facing Chat"},"employee_identity_provider":{"anyOf":[{"$ref":"#/components/schemas/IdentityProvider"},{"type":"null"}],"default":null},"mailbox_provider":{"anyOf":[{"$ref":"#/components/schemas/MailboxProvider"},{"type":"null"}],"default":null},"marketplace_company_ids":{"anyOf":[{"items":{"$ref":"#/components/schemas/MarketplaceCompanyId"},"type":"array"},{"type":"null"}],"default":null,"title":"Marketplace Company Ids"},"psa_company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Psa Company Name"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tenant Id"}},"title":"UpdateEndCompanyRequest","type":"object"},"UpdateScheduledWorkRequest":{"properties":{"additional_custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Additional Custom Instructions"},"scheduled_for":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Scheduled For"}},"title":"UpdateScheduledWorkRequest","type":"object"},"UpdateSkillRequest":{"description":"PUT \u2014 replace whole files and/or update metadata. Supply `files` to add a new version\nof each given path; supply any of `name`/`description`/`source_run_id` to update metadata\n(omitted fields keep their current value). The slug is intentionally absent: it is the\nskill's immutable load and sandbox-path identifier. At least one field is required.","properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"files":{"anyOf":[{"items":{"$ref":"#/components/schemas/SkillFileInput"},"type":"array"},{"type":"null"}],"default":null,"title":"Files"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New display name; does not change the slug.","title":"Name"},"source_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Run Id"}},"title":"UpdateSkillRequest","type":"object"},"UpdateTechnicianRequest":{"properties":{"custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Custom Instructions"},"is_ready":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Is Ready"},"profile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Profile"},"update_automatically":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Update Automatically"}},"title":"UpdateTechnicianRequest","type":"object"},"User":{"properties":{"id":{"title":"Id","type":"string"},"name":{"title":"Name","type":"string"}},"required":["id","name"],"title":"User","type":"object"},"VerifyBackfillRequest":{"properties":{"entity_type":{"$ref":"#/components/schemas/EntityType"},"filter_spec":{"additionalProperties":true,"title":"Filter Spec","type":"object"}},"required":["entity_type","filter_spec"],"title":"VerifyBackfillRequest","type":"object"},"VerifyBackfillResponse":{"properties":{"matching_entities":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Matching Entities"},"message":{"title":"Message","type":"string"},"safety_level":{"$ref":"#/components/schemas/BackfillSafetyLevel"},"success":{"title":"Success","type":"boolean"}},"required":["success","safety_level","matching_entities","message"],"title":"VerifyBackfillResponse","type":"object"},"VsaxRmmIntegration":{"properties":{"permissions":{"items":{"$ref":"#/components/schemas/VsaxRmmPermissionGroup"},"title":"Permissions","type":"array"}},"title":"VsaxRmmIntegration","type":"object"},"VsaxRmmPermissionGroup":{"properties":{"access_level":{"$ref":"#/components/schemas/AccessLevel","enum":["DISABLED","READ_ONLY","READ_WRITE"],"enumNames":["Disabled","Read Only","Read/Write"],"title":"Access Level"},"allow_delete":{"default":false,"description":"Allow deleting records (DELETE requests)","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Allow Delete","type":"boolean"},"group_type":{"$ref":"#/components/schemas/VsaxRmmPermissionGroupType","enum":["DEVICES","ASSETS","ORGANIZATIONS","AUTOMATION","PATCH_MANAGEMENT","ENDPOINT_PROTECTION","NOTIFICATIONS","SYSTEM"],"enumNames":["Devices","Assets","Organizations","Automation","Patch Management","Endpoint Protection","Notifications","System"],"title":"Permission Group"},"require_til":{"default":false,"description":"Require technician approval before write operations in this area","show_if_another_field_is":{"field_name":"access_level","field_value":"READ_WRITE"},"title":"Require Technician Approval","type":"boolean"}},"required":["access_level","group_type"],"title":"VsaxRmmPermissionGroup","type":"object"},"VsaxRmmPermissionGroupType":{"enum":["Devices","Assets","Organizations","Automation","Patch Management","Endpoint Protection","Notifications","System"],"title":"VsaxRmmPermissionGroupType","type":"string"},"WorkflowDailyExecutionWindows":{"properties":{"friday":{"items":{"$ref":"#/components/schemas/WorkflowTimeWindow"},"title":"Friday","type":"array"},"monday":{"items":{"$ref":"#/components/schemas/WorkflowTimeWindow"},"title":"Monday","type":"array"},"saturday":{"items":{"$ref":"#/components/schemas/WorkflowTimeWindow"},"title":"Saturday","type":"array"},"sunday":{"items":{"$ref":"#/components/schemas/WorkflowTimeWindow"},"title":"Sunday","type":"array"},"thursday":{"items":{"$ref":"#/components/schemas/WorkflowTimeWindow"},"title":"Thursday","type":"array"},"tuesday":{"items":{"$ref":"#/components/schemas/WorkflowTimeWindow"},"title":"Tuesday","type":"array"},"wednesday":{"items":{"$ref":"#/components/schemas/WorkflowTimeWindow"},"title":"Wednesday","type":"array"}},"title":"WorkflowDailyExecutionWindows","type":"object"},"WorkflowExecutionHours":{"properties":{"run_end_time":{"default":"23:59:59","format":"time","title":"Run End Time","type":"string"},"run_start_time":{"default":"00:00:00","format":"time","title":"Run Start Time","type":"string"}},"title":"WorkflowExecutionHours","type":"object"},"WorkflowExecutionStatus":{"enum":["NEW","SUCCESS","RUNNING","PAUSED","FAILURE","SKIPPED","TICKET_FILTER_MISMATCH","CANCELLED","WAITING_FOR_USER_INPUT","WAITING_FOR_ESCALATION_TIMER","WAITING_FOR_ITERATION"],"title":"WorkflowExecutionStatus","type":"string"},"WorkflowPerformance":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/WorkflowPerformanceRow"},"title":"Rows","type":"array"},"window":{"$ref":"#/components/schemas/TenantLocalWindow"}},"required":["window","rows"],"title":"WorkflowPerformance","type":"object"},"WorkflowPerformanceRow":{"properties":{"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Agent Id"},"agent_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Name"},"executions":{"title":"Executions","type":"integer"},"failures":{"title":"Failures","type":"integer"},"llm_calls_by_purpose":{"items":{"$ref":"#/components/schemas/LlmCallsByPurpose"},"title":"Llm Calls By Purpose","type":"array"},"p95_actual_work_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Actual Work Seconds"},"p95_overhead_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Overhead Seconds"},"p95_total_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Total Duration Seconds"},"psa_calls":{"title":"Psa Calls","type":"integer"}},"required":["agent_id","agent_name","executions","p95_total_duration_seconds","p95_actual_work_seconds","p95_overhead_seconds","llm_calls_by_purpose","psa_calls","failures"],"title":"WorkflowPerformanceRow","type":"object"},"WorkflowSchedule":{"properties":{"allowed_execution_hours":{"anyOf":[{"$ref":"#/components/schemas/WorkflowExecutionHours"},{"type":"null"}],"default":null},"daily_execution_windows":{"anyOf":[{"$ref":"#/components/schemas/WorkflowDailyExecutionWindows"},{"type":"null"}],"default":null},"should_skip_weekends":{"default":false,"title":"Should Skip Weekends","type":"boolean"},"start_datetimes":{"items":{"format":"date-time","type":"string"},"title":"Start Datetimes","type":"array"},"time_period":{"anyOf":[{"$ref":"#/components/schemas/TimePeriod"},{"type":"null"}],"default":null},"timezone":{"default":"UTC","title":"Timezone","type":"string"}},"title":"WorkflowSchedule","type":"object"},"WorkflowState":{"enum":["ENABLED","DISABLED","DELETED"],"title":"WorkflowState","type":"string"},"WorkflowTimeWindow":{"properties":{"run_end_time":{"format":"time","title":"Run End Time","type":"string"},"run_start_time":{"format":"time","title":"Run Start Time","type":"string"}},"required":["run_start_time","run_end_time"],"title":"WorkflowTimeWindow","type":"object"},"WorkflowTriggerType":{"enum":["SCHEDULED","TRIGGERED","NONE"],"title":"WorkflowTriggerType","type":"string"},"WorkflowsTriggeredBlock":{"properties":{"finished":{"title":"Finished","type":"integer"},"useful_vs_evaluated_ratio_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Useful Vs Evaluated Ratio Pct"}},"required":["finished","useful_vs_evaluated_ratio_pct"],"title":"WorkflowsTriggeredBlock","type":"object"},"WorkloadConditions":{"properties":{"companies":{"description":"The names of the companies to filter tickets by. Empty list means no filtering by company","items":{"type":"string"},"title":"Companies","type":"array"},"end_date_excluding":{"format":"date","title":"End Date Excluding","type":"string"},"start_date_including":{"format":"date","title":"Start Date Including","type":"string"}},"required":["start_date_including","end_date_excluding"],"title":"WorkloadConditions","type":"object"}},"securitySchemes":{"bearerAuth":{"description":"`Authorization: Bearer <token>` where `<token>` is either a `neo_sk_<env>_<secret>` API key (service account) or a Microsoft Entra ID access token (dashboard user).","scheme":"bearer","type":"http"}}},"info":{"description":"Neo's public contract for the dashboard ChatAgent, partner integrations, and MSP automation. Every response is wrapped in a `{data, meta}` envelope; errors use `{error: {code, message, details?}, meta: {request_id}}`. Authenticate with a `Bearer neo_sk_<env>_<secret>` API key (service account) or a Microsoft Entra ID JWT (dashboard user). Signed-URL endpoints (end-user feedback links) take a `signature` query parameter instead.","title":"Neo Public API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/public-api/agents":{"get":{"description":"Agents and workflows for the caller's tenant (the `workflows_v2` table). Cursor-paginated, ordered by id.","operationId":"public_api.agents_list_get","parameters":[{"description":"Filter by autonomy type: CHAINED_ACTIONS, AGENTIC, or CONVERSATIONAL.","in":"query","name":"autonomy_type","required":false,"schema":{"type":"string"}},{"description":"Items per page (1-200, default 50).","in":"query","name":"page_size","required":false,"schema":{"type":"integer"}},{"description":"Opaque pagination cursor from a previous response's `meta.pagination.next_cursor`.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Agent"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List agents","tags":["Agents"]},"post":{"description":"Creates an agent/workflow for the caller's tenant. The body is a discriminated union on `autonomy_type` (CHAINED_ACTIONS / AGENTIC / CONVERSATIONAL). The contract is intent-shaped: callers describe `entity_type` + `ticket_conditions` / `time_entry_conditions`, and the server constructs the canonical `actions` array (prepending `FIND_ENTITIES` for CHAINED_ACTIONS / AGENTIC; the trailing `AGENTIC` action for AGENTIC; an empty list for CONVERSATIONAL). For CHAINED_ACTIONS, `actions` is the pipeline AFTER the auto-prepended `FIND_ENTITIES` \u2014 including `FIND_ENTITIES` yourself returns 400. CONVERSATIONAL agents accept `audience` (MSP | END_USER, default MSP) \u2014 set END_USER to provision a user-facing chat agent that can bind an END_USER channel; it must then hold only END_USER tools. Audience is set at create and is immutable. They also accept `access` (ALL_USERS | ADMINS_ONLY | SPECIFIC_USERS, default ALL_USERS), controlling which of the MSP's own users may message the agent (set in the dashboard thereafter). `created_by_user` is derived from the authenticated identity \u2014 not accepted in the body. Toolboxes that supply external-API credentials are rejected (400 `validation_error`); configure those in the dashboard. Discover the shapes via the `/schemas/*` endpoints.","operationId":"public_api.agents_create_post","parameters":[],"requestBody":{"content":{"application/json":{"examples":{"agentic_triggered":{"summary":"AGENTIC \u2014 entity-triggered AI triage on new tickets","value":{"agent_settings":{"custom_instructions":"Triage incoming tickets \u2014 categorise, set priority, post a summary note."},"autonomy_type":"AGENTIC","callback_settings":{"target_changes":[{"change_type":"CREATE"}]},"entity_type":"ticket","name":"Triage agent","ticket_conditions":{"conditions":{"combinator":"and","rules":[]},"custom_field_conditions":null,"workload_conditions":null},"toolbox":{"tool_settings_by_type":{}},"trigger_type":"TRIGGERED"}},"chained_actions_scheduled":{"summary":"CHAINED_ACTIONS \u2014 nightly sweep of stale tickets","value":{"actions":[{"action_type":"ADD_TICKET_NOTE","input_as_dict":{"message":"Stale ticket \u2014 please review."}}],"autonomy_type":"CHAINED_ACTIONS","entity_type":"ticket","name":"Nightly stale-ticket sweep","schedule":{"start_datetimes":["2026-05-14T02:00:00+00:00"],"time_period":{"interval":1,"unit":"DAY"},"timezone":"UTC"},"ticket_conditions":{"conditions":{"combinator":"and","rules":[]},"custom_field_conditions":null,"workload_conditions":null},"trigger_type":"SCHEDULED"}},"conversational":{"summary":"CONVERSATIONAL \u2014 chat agent for Neo configuration help","value":{"agent_settings":{"custom_instructions":"Help the user debug their Neo setup."},"autonomy_type":"CONVERSATIONAL","name":"Neo Support Agent","toolbox":{"tool_settings_by_type":{}}}},"conversational_end_user":{"summary":"CONVERSATIONAL \u2014 user-facing chat agent (binds an END_USER channel)","value":{"agent_settings":{"custom_instructions":"Help end users raise and track support tickets."},"audience":"END_USER","autonomy_type":"CONVERSATIONAL","name":"Client Help Desk","toolbox":{"tool_settings_by_type":{}}}}},"schema":{"$ref":"#/components/schemas/CreateAgentRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Agent"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Create an agent","tags":["Agents"]}},"/public-api/agents/{agent_id}":{"delete":{"description":"Soft-deletes the agent (credential cleanup + Temporal schedule teardown + Neo-team notify). Refuses Neo-managed agents with 403 `agent_managed_by_neo`. Refused with 409 `agent_has_dependents` (with `details.dependents`) when other workflows are configured to run when this agent finishes \u2014 delete those first.","operationId":"public_api.agents_delete_delete","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Delete an agent","tags":["Agents"]},"get":{"description":"Returns the full current config of one agent: the summary fields plus the three config layers \u2014 `agent_settings`, `toolbox` + `integrations`, and the `actions` pipeline. Some are `None` depending on `autonomy_type` (CHAINED_ACTIONS has no `agent_settings`/`toolbox`/`integrations`; AGENTIC/CONVERSATIONAL configure behaviour through them). For a historical snapshot use `GET /agents/<id>/version-at`.","operationId":"public_api.agents_get_get","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/AgentDetail"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get an agent","tags":["Agents"]},"patch":{"description":"Accepts **PUT** or **PATCH** (identical partial-merge semantics). Partial-patches an agent \u2014 only the fields you send change. `autonomy_type` and `entity_type` are immutable. Send updated `ticket_conditions` / `time_entry_conditions` to change the entity filter; the server rebuilds the `FIND_ENTITIES` action. `actions` is the pipeline AFTER `FIND_ENTITIES` (CHAINED_ACTIONS only) \u2014 patching `actions` on an AGENTIC agent or conditions on a CONVERSATIONAL agent returns 400. An `actions` patch MERGES per-action: each entry targets one existing action by `id` (or unique `action_type`) and its `input_as_dict` is merged key-by-key, so changing one setting preserves the rest; unreferenced actions are kept and unmatched entries are appended. There is no wholesale-replace mode \u2014 a PUT can never drop or reorder an action (do structural pipeline edits in the dashboard). A `toolbox` patch also MERGES per tool: each entry under `tool_settings_by_type` is merged key-by-key onto that tool's current settings (lists like `allowed_users` replace; `null` for a tool key disables it), so changing one tool's setting no longer requires resending the whole toolbox. `agent_settings`, `integrations`, `schedule`, and `callback_settings` MERGE the same way: send only the fields you're changing \u2014 e.g. `{\"agent_settings\": {\"custom_instructions\": \"\u2026\"}}` edits only the instructions and leaves `test_mode`/`model`/`til_channel` intact, sending one integration's permissions leaves the others connected, and `{\"schedule\": {\"timezone\": \"\u2026\"}}` leaves the run cadence and business-hours windows intact. Refuses Neo-managed agents (403 `agent_managed_by_neo`). Editing `actions`, `agent_settings`, `toolbox`, `integrations`, or the conditions is a destructive change (triggers a TIL approval when an agent makes the call via `NEO_API_REQUEST`). 409 `agent_update_conflict` on a concurrent edit.","operationId":"public_api.agents_update_patch","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"examples":{"cosmetic_patch":{"summary":"Rename \u2014 cosmetic patch, no destructive change, no TIL approval","value":{"name":"Triage agent (v2)"}},"disable_agent":{"summary":"Disable an agent \u2014 flip state to DISABLED","value":{"state":"DISABLED"}},"merge_one_action_setting":{"summary":"CHAINED_ACTIONS \u2014 merge one setting onto an existing action (preserves the rest)","value":{"actions":[{"id":"0f8d6e2a-1c4b-4a9e-9b7a-2e5f1d3c6b80","input_as_dict":{"dispatch_calendar_settings":{"scheduled_entry_settings":{"allow_update_existing_tentative_scheduled_entries":false}}}}]}},"merge_one_toolbox_tool":{"summary":"AGENTIC \u2014 merge one tool's settings (other tools preserved, TIL-approved)","value":{"toolbox":{"tool_settings_by_type":{"SEND_TEAMS_MESSAGE_TO_INTERNAL_TEAM":{"allowed_users":[{"id":"11111111-1111-1111-1111-111111111111","name":"Alex Doe"}],"limit_to_allowed_users":true}}}}},"patch_ticket_conditions":{"summary":"Patch the entity filter \u2014 server rebuilds FIND_ENTITIES (TIL-approved)","value":{"ticket_conditions":{"conditions":{"combinator":"and","rules":[{"field":"priority","operator":"in","value":["high","urgent"]}]},"custom_field_conditions":null,"workload_conditions":null}}}},"schema":{"$ref":"#/components/schemas/UpdateAgentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Agent"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Update an agent","tags":["Agents"]},"put":{"description":"Accepts **PUT** or **PATCH** (identical partial-merge semantics). Partial-patches an agent \u2014 only the fields you send change. `autonomy_type` and `entity_type` are immutable. Send updated `ticket_conditions` / `time_entry_conditions` to change the entity filter; the server rebuilds the `FIND_ENTITIES` action. `actions` is the pipeline AFTER `FIND_ENTITIES` (CHAINED_ACTIONS only) \u2014 patching `actions` on an AGENTIC agent or conditions on a CONVERSATIONAL agent returns 400. An `actions` patch MERGES per-action: each entry targets one existing action by `id` (or unique `action_type`) and its `input_as_dict` is merged key-by-key, so changing one setting preserves the rest; unreferenced actions are kept and unmatched entries are appended. There is no wholesale-replace mode \u2014 a PUT can never drop or reorder an action (do structural pipeline edits in the dashboard). A `toolbox` patch also MERGES per tool: each entry under `tool_settings_by_type` is merged key-by-key onto that tool's current settings (lists like `allowed_users` replace; `null` for a tool key disables it), so changing one tool's setting no longer requires resending the whole toolbox. `agent_settings`, `integrations`, `schedule`, and `callback_settings` MERGE the same way: send only the fields you're changing \u2014 e.g. `{\"agent_settings\": {\"custom_instructions\": \"\u2026\"}}` edits only the instructions and leaves `test_mode`/`model`/`til_channel` intact, sending one integration's permissions leaves the others connected, and `{\"schedule\": {\"timezone\": \"\u2026\"}}` leaves the run cadence and business-hours windows intact. Refuses Neo-managed agents (403 `agent_managed_by_neo`). Editing `actions`, `agent_settings`, `toolbox`, `integrations`, or the conditions is a destructive change (triggers a TIL approval when an agent makes the call via `NEO_API_REQUEST`). 409 `agent_update_conflict` on a concurrent edit.","operationId":"public_api.agents_update_put","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"examples":{"cosmetic_patch":{"summary":"Rename \u2014 cosmetic patch, no destructive change, no TIL approval","value":{"name":"Triage agent (v2)"}},"disable_agent":{"summary":"Disable an agent \u2014 flip state to DISABLED","value":{"state":"DISABLED"}},"merge_one_action_setting":{"summary":"CHAINED_ACTIONS \u2014 merge one setting onto an existing action (preserves the rest)","value":{"actions":[{"id":"0f8d6e2a-1c4b-4a9e-9b7a-2e5f1d3c6b80","input_as_dict":{"dispatch_calendar_settings":{"scheduled_entry_settings":{"allow_update_existing_tentative_scheduled_entries":false}}}}]}},"merge_one_toolbox_tool":{"summary":"AGENTIC \u2014 merge one tool's settings (other tools preserved, TIL-approved)","value":{"toolbox":{"tool_settings_by_type":{"SEND_TEAMS_MESSAGE_TO_INTERNAL_TEAM":{"allowed_users":[{"id":"11111111-1111-1111-1111-111111111111","name":"Alex Doe"}],"limit_to_allowed_users":true}}}}},"patch_ticket_conditions":{"summary":"Patch the entity filter \u2014 server rebuilds FIND_ENTITIES (TIL-approved)","value":{"ticket_conditions":{"conditions":{"combinator":"and","rules":[{"field":"priority","operator":"in","value":["high","urgent"]}]},"custom_field_conditions":null,"workload_conditions":null}}}},"schema":{"$ref":"#/components/schemas/UpdateAgentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Agent"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Update an agent","tags":["Agents"]}},"/public-api/agents/{agent_id}/iteration-sessions":{"post":{"description":"Runs an AGENTIC agent in iteration mode: its schedule is frozen, attempt 1 starts, and the run pauses after EVERY successful tool output \u2014 the output is captured on a pause row (withheld from the agent's model) and a Neo Support monitor turn is seeded per pause. Triggered agents need `target_entity_id`. One ACTIVE session per agent (409). Conversational/chained agents and Neo-managed agents are rejected (400). Sessions expire after 72h (the schedule is unfrozen automatically).","operationId":"public_api.iteration_sessions_create_post","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIterationSessionRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicIterationSession"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Start an iteration session","tags":["Iteration Sessions"]}},"/public-api/agents/{agent_id}/run-now":{"post":{"description":"Triggers a run immediately. Async \u2014 returns `{\"execution_id\": \"<temporal_run_id>\", \"status\": \"queued\"}`; poll `GET /executions/<execution_id>` for completion. Triggered agents need `target_entity_id` in the body; scheduled agents need nothing. Conversational agents are rejected (400 `invalid_for_conversational`) \u2014 reach them via `POST /chat/sessions`. At-least-once: a retried 5xx can produce a duplicate run.","operationId":"public_api.agents_run_now_post","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunNowRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Run an agent now","tags":["Agents"]}},"/public-api/agents/{agent_id}/stats":{"get":{"description":"Aggregate counts and timings for this agent's executions.","operationId":"public_api.agents_stats_get","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/AgentStats"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get agent execution stats","tags":["Agents"]}},"/public-api/agents/{agent_id}/version-at":{"get":{"description":"The agent's configuration as it was at `timestamp=<iso8601>` or at the time the given `execution_id` ran (provide exactly one). Useful for 'what did the agent look like when it processed this ticket'. If no recorded version exists at or before that moment (some workflows are provisioned outside the normal create path and have no `workflows_updates_log` rows), falls back to the live workflow row.","operationId":"public_api.agents_version_at_get","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"type":"string"}},{"description":"Resolve the version to the time this execution ran.","in":"query","name":"execution_id","required":false,"schema":{"type":"string"}},{"description":"ISO-8601 timestamp to resolve the version at.","in":"query","name":"timestamp","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/AgentVersion"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get the agent version at a point in time","tags":["Agents"]}},"/public-api/agents/{agent_id}/versions":{"get":{"description":"Change history of this agent, reconstructed from `workflows_updates_log`, newest first. Each item is a **lean summary** \u2014 identity + lifecycle metadata (name/state/trigger) + `version_timestamp`, without the config layers. For the full config at a point in time, call `GET /agents/<id>/version-at?timestamp=<iso>` (or `?execution_id=<run_id>`).","operationId":"public_api.agents_versions_get","parameters":[{"in":"path","name":"agent_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AgentVersionSummary"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List agent versions","tags":["Agents"]}},"/public-api/announcements":{"get":{"description":"Announcements active for the tenant.","operationId":"public_api.announcements_list_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Announcement"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List active announcements","tags":["Inbox & Comms"]}},"/public-api/api-keys":{"get":{"description":"Active API keys for the caller's tenant. Admin dashboard JWT only \u2014 never returns the secret.","operationId":"public_api.api_keys_list_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ApiKeyListItem"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List API keys","tags":["API keys"]},"post":{"description":"Mints a new key. The plaintext secret is returned once, in `data.key`, and never again. Admin dashboard JWT only.","operationId":"public_api.api_keys_create_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/ApiKeyCreateResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Create an API key","tags":["API keys"]}},"/public-api/api-keys/{key_id}":{"delete":{"description":"Immediately revokes the key. Admin dashboard JWT only.","operationId":"public_api.api_keys_revoke_delete","parameters":[{"in":"path","name":"key_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Revoke an API key","tags":["API keys"]}},"/public-api/api-keys/{key_id}/rotate":{"post":{"description":"Mints a replacement key and sunsets the old one after a 24h overlap so callers can roll over without downtime. Takes no request body. The new plaintext secret is returned once, in `data.key`. Admin dashboard JWT only.","operationId":"public_api.api_keys_rotate_post","parameters":[{"in":"path","name":"key_id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/ApiKeyCreateResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Rotate an API key","tags":["API keys"]}},"/public-api/backfills":{"get":{"description":"Backfills for the caller's tenant, newest first. A backfill applies an existing workflow to historical tickets the workflow's normal trigger would never re-fire for.","operationId":"public_api.backfills_list_get","parameters":[{"description":"Filter by state: DRAFT, RUNNING, PAUSED, COMPLETED, CANCELLED, FAILED.","in":"query","name":"state","required":false,"schema":{"type":"string"}},{"description":"1-indexed page number (default 1).","in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"description":"Items per page (1-200, default 50).","in":"query","name":"page_size","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicBackfill"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List backfills","tags":["Backfills"]},"post":{"description":"Create a backfill against a target workflow. Returns the row plus an upper-bound credit cost estimate. At most one Running or Paused backfill per target workflow per tenant \u2014 a second attempt while one is active returns 409 `backfill_already_active`.","operationId":"public_api.backfills_create_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBackfillRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/CreateBackfillResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Create a backfill","tags":["Backfills"]}},"/public-api/backfills/verify":{"post":{"description":"Counts the entities the filter would match and classifies the result (OK / WARNING / ERROR). Use this to validate a filter before committing to create. No backfill row is created.","operationId":"public_api.backfills_verify_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyBackfillRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/VerifyBackfillResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Preflight a backfill filter","tags":["Backfills"]}},"/public-api/backfills/{backfill_id}":{"get":{"operationId":"public_api.backfills_get_get","parameters":[{"in":"path","name":"backfill_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicBackfill"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get a backfill","tags":["Backfills"]}},"/public-api/backfills/{backfill_id}/cancel":{"post":{"description":"Terminal. Stops new dispatches; tickets already mid-run finish on their own. Returns 202 \u2014 the state updates within ~30s.","operationId":"public_api.backfills_cancel_post","parameters":[{"in":"path","name":"backfill_id","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/SignalResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Cancel a backfill","tags":["Backfills"]}},"/public-api/backfills/{backfill_id}/failures":{"get":{"description":"Returns the failed child executions of one backfill, newest first. Each entry carries the entity reference, the user-facing failure message, and a `temporal_run_id` for deep-linking into the full execution detail. Returns an empty list for backfills that haven't started yet.","operationId":"public_api.backfills_failures_get","parameters":[{"in":"path","name":"backfill_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicBackfillFailure"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List a backfill's failed tickets","tags":["Backfills"]}},"/public-api/backfills/{backfill_id}/pause":{"post":{"description":"Signals the orchestrator to stop dispatching new tickets. In-flight tickets still finish. Idempotent. Returns 202 \u2014 the state updates within ~30s; poll `GET /backfills/{id}` to observe it.","operationId":"public_api.backfills_pause_post","parameters":[{"in":"path","name":"backfill_id","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/SignalResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Pause a backfill","tags":["Backfills"]}},"/public-api/backfills/{backfill_id}/rerun-failed":{"post":{"description":"Spawn a new backfill scoped to the source's failed entities. The new backfill inherits the source's target workflow, execution windows, timezone, and concurrency cap; only the tickets that failed in the source are dispatched (no PSA filter re-evaluation). Eligibility: source state is terminal (Completed / Cancelled / Failed), `failed_count > 0`, and no active backfill exists for the same target workflow \u2014 otherwise `409 backfill_not_rerunnable` (or `409 backfill_already_active` for the conflict case). Returns 201 with the new backfill + cost estimate (credits).","operationId":"public_api.backfills_rerun_failed_post","parameters":[{"in":"path","name":"backfill_id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/CreateBackfillResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Rerun a backfill against its failed tickets","tags":["Backfills"]}},"/public-api/backfills/{backfill_id}/resume":{"post":{"description":"Signals the orchestrator to resume dispatching. Idempotent. Returns 202 \u2014 the state updates within ~30s.","operationId":"public_api.backfills_resume_post","parameters":[{"in":"path","name":"backfill_id","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/SignalResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Resume a backfill","tags":["Backfills"]}},"/public-api/billing/end-user-teams-usage":{"get":{"description":"End-user (white-label) Teams bot usage for the given month (defaults to current): the number of active end-users (>=2 messages that month) and the resulting add-on charge in USD. The charge is the MSP's own bill (marginal tiers + $100 floor); for the current month it is a projection that finalizes at month close. Exposes the customer's own add-on charge, never provider/LLM cost or Stripe internals.","operationId":"public_api.billing_end_user_teams_usage_get","parameters":[{"description":"Month in `YYYY-MM` format. Defaults to current month.","in":"query","name":"month","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/EndUserTeamsUsage"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get end-user Teams bot (MAU) usage and charge for a month","tags":["Billing"]}},"/public-api/billing/end-user-teams/detail":{"get":{"description":"Per-company and per-user active-end-user breakdown (>=2 messages that month) for the white-label end-user Teams bot, each with the bot-raised PSA tickets behind it (deep-links when the PSA is configured), plus a monthly active-user trend ending at the selected month. Companion to /billing/end-user-teams-usage (headline MAU + dollar charge); this is the drill-down. Exposes the customer's own usage, never provider/LLM cost.","operationId":"public_api.billing_end_user_teams_detail_get","parameters":[{"description":"Month in `YYYY-MM` format. Defaults to current month.","in":"query","name":"month","required":false,"schema":{"type":"string"}},{"description":"Trend length in months (1-24, default 6), ending at the selected month.","in":"query","name":"months","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/EndUserTeamsDetail"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Detailed end-user Teams bot (MAU) breakdown for a month","tags":["Billing"]}},"/public-api/billing/subscription":{"get":{"description":"Customer-facing plan + credits state. Deliberately excludes Stripe IDs, internal pricing, dollar amounts, and any provider cost attribute \u2014 this surface exposes credits, not cost.","operationId":"public_api.billing_subscription_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Subscription"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get the tenant's subscription / plan state","tags":["Billing"]}},"/public-api/billing/usage":{"get":{"description":"Credit usage for the given month. Defaults to the current calendar month. For past months, `credits_limit`, `credits_remaining`, and `reserve_balance` are null because historical plan data is not stored.","operationId":"public_api.billing_usage_get","parameters":[{"description":"Month in `YYYY-MM` format. Defaults to current month.","in":"query","name":"month","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/MonthlyUsage"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get credit usage for a month","tags":["Billing"]}},"/public-api/billing/usage-by-agent":{"get":{"description":"Credit usage broken down by agent for the given month. Defaults to the current calendar month.","operationId":"public_api.billing_usage_by_agent_get","parameters":[{"description":"Month in `YYYY-MM` format. Defaults to current month.","in":"query","name":"month","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/AgentUsageBreakdown"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get per-agent credit usage for a month","tags":["Billing"]}},"/public-api/callbacks":{"get":{"description":"PSA callbacks (webhook events) received for the caller's tenant. Requires an indexed filter \u2014 `entity_type`+`entity_id`, `entity_number`, or `since` (\u2264 7 days). **Default `page_size` is 20 here** (lower than the public-API global of 50): each row carries the per-workflow `workflow_matches` audit, so 50-row responses can exceed the chat-agent context budget.","operationId":"public_api.callbacks_list_get","parameters":[{"description":"PSA entity type (e.g. TICKET).","in":"query","name":"entity_type","required":false,"schema":{"type":"string"}},{"description":"PSA entity id.","in":"query","name":"entity_id","required":false,"schema":{"type":"string"}},{"description":"PSA entity number (e.g. ticket number).","in":"query","name":"entity_number","required":false,"schema":{"type":"string"}},{"description":"ISO-8601 lower bound on receipt time (\u2264 7 days ago).","in":"query","name":"since","required":false,"schema":{"type":"string"}},{"description":"ISO-8601 upper bound on receipt time.","in":"query","name":"until","required":false,"schema":{"type":"string"}},{"description":"Comma-separated change types to include.","in":"query","name":"change_type","required":false,"schema":{"type":"string"}},{"description":"Only callbacks that matched (or failed to match) this agent.","in":"query","name":"agent_id","required":false,"schema":{"type":"integer"}},{"description":"If true, only callbacks that were filtered out.","in":"query","name":"filtered_only","required":false,"schema":{"type":"boolean"}},{"description":"Items per page (1-200, default 50).","in":"query","name":"page_size","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Callback"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List callbacks","tags":["Callbacks"]}},"/public-api/callbacks/{callback_id}":{"get":{"operationId":"public_api.callbacks_get_get","parameters":[{"in":"path","name":"callback_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/CallbackDetail"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get a callback","tags":["Callbacks"]}},"/public-api/channels":{"get":{"description":"Channels for the tenant \u2014 each binds a CONVERSATIONAL agent to a transport.","operationId":"public_api.channels_list_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicChannel"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List channels","tags":["Channels"]},"post":{"description":"Bind a CONVERSATIONAL agent to a transport. An ACTIVE channel must have an agent. `audience` (MSP | END_USER) declares the surface's trust domain and must match the bound agent's audience \u2014 an END_USER channel may only bind a user-facing agent, and an MSP (internal) channel only an internal agent.","operationId":"public_api.channels_create_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateChannelRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicChannel"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Create a channel","tags":["Channels"]}},"/public-api/channels/install-events":{"post":{"description":"Platform callers only \u2014 the Teams relay reports an `installationUpdate add` and gets back the channel's greeting branding. A registered white-label install on an ACTIVE channel already routes (the inbound message proves the install \u2014 there is no status to flip), so this is a pure read. `matched=false` means no routable white-label channel claims the `(bot_id, tenant)` \u2014 e.g. the shared marketplace bot \u2014 and the relay greets with its default.","operationId":"public_api.channels_install_event_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallBrandingRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/InstallBrandingResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Resolve install greeting branding","tags":["Channels"]}},"/public-api/channels/{channel_id}":{"delete":{"description":"Deletes the channel.","operationId":"public_api.channels_delete_delete","parameters":[{"in":"path","name":"channel_id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Delete a channel","tags":["Channels"]},"get":{"operationId":"public_api.channels_get_get","parameters":[{"in":"path","name":"channel_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicChannel"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get a channel","tags":["Channels"]},"patch":{"description":"Partial patch. Only the supplied fields are changed.","operationId":"public_api.channels_update_patch","parameters":[{"in":"path","name":"channel_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChannelRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicChannel"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Update a channel","tags":["Channels"]}},"/public-api/chat/sessions":{"post":{"description":"Create a session against a CONVERSATIONAL agent. Returns the session resource; messages are appended via `POST /chat/sessions/<id>/messages`.\n\nSelect the agent with **exactly one** of `agent_id` (numeric) or `managed_agent_key` (a stable key for a Neo-managed agent, e.g. `NEO_SUPPORT`); the latter lets a caller target the agent without knowing its per-tenant id.\n\nA **platform** service account may pass `client_id` to create the session for another tenant \u2014 used by the converged Neo Support relay to run each MSP technician's turn as their own tenant. For a platform caller the agent is resolved from `bot_id` (the inbound Teams bot app id) + `inbound_tenant_id` (the message's M365 tenant): a white-label bot with a channel installed for that tenant routes to the channel's agent acting as the owning MSP (the acting tenant is then resolved server-side, overriding `client_id`, and returned on the resource); else the ACTIVE channel registered for that bot; else that tenant's Neo Support agent. The caller is confined to those outcomes (never an arbitrary agent). Any non-platform caller passing `client_id` is rejected with 403.\n\nA white-label session is always scoped to one end-company, resolved server-side from `inbound_tenant_id`. A tenant linked to several companies (branch offices) is narrowed to the company whose PSA contacts hold the caller-supplied `end_user_email`, then by deterministic tiebreaks. If the tenant isn't linked to any company in the owning MSP's dashboard, the create is refused with 409 `end_company_not_mapped`; the error message is end-user-relayable and tells the MSP admin what to link.","operationId":"public_api.chat_session_create_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateChatSessionRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/ChatSessionResource"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Create a chat session","tags":["Chat"]}},"/public-api/chat/sessions/{session_id}":{"get":{"operationId":"public_api.chat_session_get_get","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/ChatSessionResource"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get a chat session","tags":["Chat"]}},"/public-api/chat/sessions/{session_id}/attachments/upload-url":{"post":{"description":"Issues a short-lived SAS URL to upload one attachment directly to storage, so multi-MB screenshots and documents never transit this API. PUT the bytes to `upload_url` with headers `x-ms-blob-type: BlockBlob` and `x-ms-blob-content-type: <mime>`, then reference the returned `blob_path` in the `attachments` of `POST /chat/sessions/<id>/messages`. Allowed types: images (image/png, image/jpeg, image/gif, image/webp) and documents (application/pdf, text/plain, text/csv, application/msword, the Word/Excel OpenXML types). Honour `max_image_bytes` \u2014 the API can't see the bytes on this path. The blob path is server-chosen and scoped to this session.","operationId":"public_api.chat_session_attachment_upload_url_post","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachmentUploadUrlRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/AttachmentUploadUrlResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get a signed URL to upload a chat image or document","tags":["Chat"]}},"/public-api/chat/sessions/{session_id}/events":{"get":{"description":"Server-Sent Events stream of Vercel AI SDK v6 envelopes for the session. Response is `text/event-stream` \u2014 stream it, don't buffer.\n\nUse `?since=` (or the `Last-Event-Id` header) in two cases:\n1. First connection for a turn just enqueued via `POST .../messages` \u2014 pass the `since_cursor` from that POST response so the tail starts strictly after the previous turn's terminal envelopes.\n2. Reconnect of an already-tailing stream \u2014 pass the last event id you received so playback resumes at the right spot.","operationId":"public_api.chat_session_events_get","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"type":"string"}},{"description":"Stream-event id to resume from.","in":"query","name":"since","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Tail chat-session events (SSE)","tags":["Chat"]}},"/public-api/chat/sessions/{session_id}/messages":{"get":{"description":"Cursor-style history. Pass `?since=<message_id>` to fetch messages strictly after that id \u2014 used for reconnect catch-up before re-subscribing to `/chat/sessions/<id>/events`.","operationId":"public_api.chat_session_list_messages_get","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"type":"string"}},{"description":"Message id to read from (exclusive).","in":"query","name":"since","required":false,"schema":{"type":"string"}},{"description":"Max messages (1\u2013500, default 100).","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ChatMessageResource"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List messages in a chat session","tags":["Chat"]},"post":{"description":"Persists the user message and enqueues a `ChatTurnWorkflow`. Returns 202 Accepted with the persisted message id + the Temporal workflow id. The agent's streamed response is consumed via `GET /chat/sessions/<id>/events`. Pass `client_message_id` for idempotent retries \u2014 a duplicate returns 409 with the original message id and no new turn is enqueued.\n\nThe response also includes `since_cursor`: the SSE stream id snapshotted right before this turn was enqueued. Pass it as `?since=<since_cursor>` on the very next call to `/chat/sessions/<id>/events` so the tail skips envelopes from prior turns on this session \u2014 skipping the cursor on a 2nd+ turn against the same session causes the tail to return the previous turn's final state.\n\nTo include images or documents, first upload each via `POST /chat/sessions/<id>/attachments/upload-url`, then pass the returned `blob_path` values in `attachments`. `message` may be empty when at least one attachment is provided. Attachments are surfaced on later `GET .../messages` replays.","operationId":"public_api.chat_session_post_message_post","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostMessageRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PostMessageResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Append a user message + enqueue a chat turn","tags":["Chat"]}},"/public-api/chat/sessions/{session_id}/reset":{"post":{"description":"Archives this chat session and cancels any in-flight turn so the conversation starts fresh \u2014 the next message on the channel begins a new session with no carried context. Used by the Teams relay's `/reset` command. Idempotent: resetting an already-archived session still returns 200.","operationId":"public_api.chat_session_reset_post","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Reset a chat session (archive + start fresh)","tags":["Chat"]}},"/public-api/clients/me":{"get":{"description":"Basic facts about the authenticated tenant (`itsm_type`, region, name) \u2014 the anchor for any PSA-shaped follow-up call.","operationId":"public_api.clients_me_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/ClientInfo"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get the caller's tenant","tags":["Tenant"]}},"/public-api/company-filters":{"get":{"description":"The tenant's effective company filters \u2014 which PSA companies Neo tracks in its company directory. Returns the saved filters, or the default (Active + Customer) when none are set.","operationId":"public_api.company_filters_get_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicCompanyFilters"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get company filters","tags":["Integrations"]},"put":{"description":"Replace the company filters. Widening-only: newly in-scope companies are added immediately; the response previews the companies that no longer fit, which you remove via the remove-unmatched endpoint.","operationId":"public_api.company_filters_update_put","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCompanyFiltersUpdate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicCompanyFilterSaveResult"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Update company filters","tags":["Integrations"]}},"/public-api/company-filters/options":{"get":{"description":"The available filter dimensions and their selectable values: Active/Inactive for the active dimension, the tenant's own company account types, and \u2014 ConnectWise only \u2014 the tenant's own raw company-status names.","operationId":"public_api.company_filters_options_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicCompanyFilterOptions"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get company-filter options","tags":["Integrations"]}},"/public-api/company-filters/remove-unmatched":{"post":{"description":"Durably remove the tracked companies that no longer fit the current company filters. Idempotent; returns the number removed.","operationId":"public_api.company_filters_remove_unmatched_post","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicRemovalResult"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Remove companies that no longer match","tags":["Integrations"]}},"/public-api/end-companies":{"get":{"description":"End-client companies for the tenant.","operationId":"public_api.end_companies_list_get","parameters":[{"description":"Filter by PSA company name.","in":"query","name":"target_psa_company_name","required":false,"schema":{"type":"string"}},{"description":"Filter by Azure access-granted state (`true`/`false`).","in":"query","name":"target_access_granted","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicEndCompany"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List end-companies","tags":["End companies"]},"post":{"description":"Onboard a new end-client. On-prem service-account passwords are dashboard-only and not accepted here.","operationId":"public_api.end_companies_create_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEndCompanyRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicEndCompany"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Create an end-company","tags":["End companies"]}},"/public-api/end-companies/bulk-update":{"post":{"description":"Applies the same partial patch to every listed `psa_company_id` (\u2264500). Always requires technician approval. Partial failures surface inside the 200 envelope as per-id `{id, status, error?}` rows \u2014 they do not raise a top-level error. Allowed patch fields: `custom_instructions`, `auto_assign_exchange_admin`, `auto_assign_priv_auth_admin`, `employee_identity_provider`, `mailbox_provider`, `marketplace_company_ids`.","operationId":"public_api.end_companies_bulk_update_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/BulkUpdateResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Bulk-update end-companies","tags":["End companies"]}},"/public-api/end-companies/{psa_company_id}":{"delete":{"description":"Hard-deletes the end-company. Always requires technician approval when reached via `NEO_API_REQUEST`.","operationId":"public_api.end_companies_delete_delete","parameters":[{"in":"path","name":"psa_company_id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Delete an end-company","tags":["End companies"]},"get":{"operationId":"public_api.end_companies_get_get","parameters":[{"in":"path","name":"psa_company_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicEndCompany"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get an end-company","tags":["End companies"]},"patch":{"description":"Partial patch. Only the supplied fields are changed.","operationId":"public_api.end_companies_update_patch","parameters":[{"in":"path","name":"psa_company_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEndCompanyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicEndCompany"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Update an end-company","tags":["End companies"]}},"/public-api/escalate-to-neo-team":{"post":{"description":"Opens a HubSpot support ticket on the MSP's behalf (this is the agent / dashboard chat escalating, not an end-user feedback link). Returns the created ticket reference.","operationId":"public_api.escalate_to_neo_team_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EscalateToNeoTeamRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/EscalateToNeoTeamResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Escalate to the Neo team","tags":["Escalation"]}},"/public-api/executions":{"get":{"description":"Agent/workflow execution rows for the caller's tenant. Cursor-paginated, newest first on a stable `(created_at, run_id)` cursor.","operationId":"public_api.executions_list_get","parameters":[{"description":"Filter by agent (workflow) id.","in":"query","name":"agent_id","required":false,"schema":{"type":"integer"}},{"description":"Filter by PSA entity id.","in":"query","name":"entity_id","required":false,"schema":{"type":"string"}},{"description":"Filter by PSA entity number (e.g. ticket number).","in":"query","name":"entity_number","required":false,"schema":{"type":"string"}},{"description":"Comma-separated execution statuses to include.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Items per page (1-200, default 50).","in":"query","name":"page_size","required":false,"schema":{"type":"integer"}},{"description":"Opaque pagination cursor from a previous response's `meta.pagination.next_cursor`.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Execution"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List executions","tags":["Executions"]}},"/public-api/executions/{execution_id}":{"get":{"operationId":"public_api.executions_get_get","parameters":[{"in":"path","name":"execution_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Execution"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get an execution","tags":["Executions"]}},"/public-api/executions/{execution_id}/additional-custom-instructions":{"get":{"description":"The free-form `additional_custom_instructions` string passed into this specific run (the agent- and company-level layers are not here \u2014 see /agents/<id>/version-at).","operationId":"public_api.executions_additional_custom_instructions_get","parameters":[{"in":"path","name":"execution_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/AdditionalCustomInstructions"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get the per-run custom instructions","tags":["Executions"]}},"/public-api/executions/{execution_id}/artifacts":{"get":{"description":"Artifacts (markdown notes inline, sandbox files referenced) the agent produced during this run. For `SANDBOX_FILE` artifacts, fetch the binary via the sibling `/download-url` endpoint \u2014 this list never returns the file content.","operationId":"public_api.executions_artifacts_get","parameters":[{"in":"path","name":"execution_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ExecutionArtifact"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List artifacts an execution produced","tags":["Executions"]}},"/public-api/executions/{execution_id}/artifacts/{artifact_id}/content":{"get":{"description":"Returns the artifact's real body inline, reading a `SANDBOX_FILE` from blob server-side \u2014 for callers that can't resolve the SAS `/download-url` (e.g. an in-product agent whose sandbox/`web_fetch` egress can't reach the blob host). MARKDOWN returns its inline content. Text (UTF-8) only: a binary or larger-than-1 MiB artifact returns 400 `validation_error` \u2014 use `/download-url` for those. Cross-tenant ids return 404 (blob_path carries this tenant's `client_id` suffix).","operationId":"public_api.executions_artifact_content_get","parameters":[{"in":"path","name":"artifact_id","required":true,"schema":{"type":"string"}},{"in":"path","name":"execution_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/ExecutionArtifactContent"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get an artifact's full body inline","tags":["Executions"]}},"/public-api/executions/{execution_id}/artifacts/{artifact_id}/download-url":{"get":{"description":"Returns a short-lived SAS URL for the artifact's blob. 400 `validation_error` for MARKDOWN artifacts (content is inline on the list endpoint). Cross-tenant ids return 404 \u2014 the handler verifies the blob_path carries this tenant's `client_id` suffix.","operationId":"public_api.executions_artifact_download_url_get","parameters":[{"in":"path","name":"artifact_id","required":true,"schema":{"type":"string"}},{"in":"path","name":"execution_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/ArtifactDownloadUrl"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get a download URL for a sandbox-file artifact","tags":["Executions"]}},"/public-api/executions/{execution_id}/callback":{"get":{"description":"The PSA callback (webhook event) that started this execution, with the workflow-match details. `null` if the run wasn't callback-triggered.","operationId":"public_api.executions_callback_get","parameters":[{"in":"path","name":"execution_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/CallbackDetail"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get the callback that triggered an execution","tags":["Executions"]}},"/public-api/executions/{execution_id}/cancel":{"post":{"description":"Requests cancellation of an in-progress run (409 if it isn't cancellable). Returns 202 with `{status}`.","operationId":"public_api.executions_cancel_post","parameters":[{"in":"path","name":"execution_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelExecutionRequestBody"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Cancel an execution","tags":["Executions"]}},"/public-api/executions/{execution_id}/field-update-audit":{"get":{"description":"Per-field AI decision audit \u2014 one row per PSA field a CHAINED_ACTIONS smart action predicted for this run (triage/categorize, dispatch, field updates, merge, QA, tagging, sentiment, \u2026): chosen value, justification, the raw LLM `system_prompt` / `user_prompt` / `gpt_response`, and the candidate `options_to_choose_from`. An AGENTIC agent's field writes appear here only as a stub (prompts `\"N/A\"`, no options) \u2014 its reasoning is in the step trace.","operationId":"public_api.executions_field_update_audit_get","parameters":[{"in":"path","name":"execution_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/FieldUpdateAuditEntry"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get the field-update audit for an execution","tags":["Executions"]}},"/public-api/executions/{execution_id}/retry":{"post":{"description":"Starts a fresh run for the same entity. Refused (409) while a sibling run is still in progress. Returns 202 with `{status, agent_id, entity_id}`.","operationId":"public_api.executions_retry_post","parameters":[{"in":"path","name":"execution_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetryExecutionRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Retry an execution","tags":["Executions"]}},"/public-api/executions/{execution_id}/rmm-script-executions":{"get":{"operationId":"public_api.executions_rmm_script_executions_get","parameters":[{"in":"path","name":"execution_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/RmmScriptExecution"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List the RMM script runs in an execution","tags":["Executions"]}},"/public-api/executions/{execution_id}/steps":{"get":{"description":"The ordered steps (tool calls, messages, errors) recorded for a run \u2014 the forensic trace of what the agent actually saw and did. The path id accepts either an AGENTIC / CHAINED_ACTIONS execution (run) id or a CONVERSATIONAL chat session id; both resolve their trace here. AGENTIC / CONVERSATIONAL traces can be large; use the filters to fetch only what you need (e.g. the agent's baseline ticket read) rather than pulling every step. `type` and `tool_type_name` narrow by step kind and tool; `include_data=false` returns a lightweight index (no per-step I/O) to locate a step, then re-fetch just it by `step_id`.","operationId":"public_api.executions_steps_get","parameters":[{"in":"path","name":"execution_id","required":true,"schema":{"type":"string"}},{"description":"Comma-separated StepType values to include (e.g. TOOL_CALL,TOOL_RESULT,THOUGHT,FINAL_MESSAGE).","in":"query","name":"type","required":false,"schema":{"type":"string"}},{"description":"Only steps for this tool (e.g. CW_PSA_REQUEST, GET_TECHNICIAN_CONTEXT). Case-insensitive.","in":"query","name":"tool_type_name","required":false,"schema":{"type":"string"}},{"description":"Return only the single step with this id (with its full data).","in":"query","name":"step_id","required":false,"schema":{"type":"string"}},{"description":"Set false to omit each step's data (tool inputs/outputs, reasoning) and return a lightweight index. Default true.","in":"query","name":"include_data","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ExecutionStep"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List execution steps","tags":["Executions"]}},"/public-api/executions/{execution_id}/til-requests":{"get":{"operationId":"public_api.executions_til_requests_get","parameters":[{"in":"path","name":"execution_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TilRequest"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List the TIL requests raised in an execution","tags":["Executions"]}},"/public-api/feedback":{"post":{"description":"Records end-user feedback for an agent/workflow run. Reached from the Neo-generated feedback link \u2014 no Authorization header; the `signature` query param is the credential.","operationId":"public_api.feedback_create_post","parameters":[{"description":"HMAC signature from the Neo-generated link. No Authorization header is used.","in":"query","name":"signature","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/FeedbackCreatedResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[],"summary":"Submit feedback","tags":["Feedback"]}},"/public-api/feedback/{feedback_id}":{"put":{"description":"Adds a comment / submitter name to a previously created feedback record.","operationId":"public_api.feedback_update_put","parameters":[{"in":"path","name":"feedback_id","required":true,"schema":{"type":"string"}},{"description":"HMAC signature from the Neo-generated link. No Authorization header is used.","in":"query","name":"signature","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[],"summary":"Update feedback","tags":["Feedback"]}},"/public-api/handover-requests/{request_id}/accept":{"post":{"description":"A technician accepts a pending end-user\u2192technician handover. Flips the request to accepted, DMs the tech the tracking ticket, notifies the other technicians, and opens the cross-tenant tech\u2194end-user group chat. Returns 200 with `status` (`accepted` / `already_taken` / `expired` / `not_found`) \u2014 these are outcomes the caller renders onto the card, not transport errors.","operationId":"public_api.handover_requests_accept_post","parameters":[{"in":"path","name":"request_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptHandoverRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/HandoverAcceptResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Accept a Neo Pulse handover request","tags":["Handover"]}},"/public-api/health":{"get":{"description":"Returns `{\"status\": \"ok\"}`. No authentication required.","operationId":"public_api.health_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[],"summary":"Liveness probe","tags":["Meta"]}},"/public-api/inbox":{"get":{"description":"Inbox messages for the tenant, newest first.","operationId":"public_api.inbox_list_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/InboxMessage"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List inbox messages","tags":["Inbox & Comms"]}},"/public-api/inbox/{deduplication_message_id}/read":{"post":{"operationId":"public_api.inbox_mark_read_post","parameters":[{"in":"path","name":"deduplication_message_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/InboxMessage"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Mark an inbox message as read","tags":["Inbox & Comms"]}},"/public-api/insights/analyze":{"post":{"description":"Async. Queues a Temporal workflow that classifies the tenant's recent tickets and computes ROI. Returns 202 with `{analysis_id, status: PENDING}`; poll `/insights/status` for progress and `/insights/result` for the completed output. 409 if an analysis is already running or a PSA sync is in progress. Trial accounts are capped to 25 completed analyses. `hourly_rate` is the MSP's customer-facing ticket-handling rate (drives ROI dollars) \u2014 not Neo's LLM cost.","operationId":"public_api.insights_analyze_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartAnalysisRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/StartAnalysisResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Start an Insights analysis","tags":["Insights"]}},"/public-api/insights/defaults":{"get":{"description":"Region defaults (hourly rate + currency), available `period_days` options, the tenant's trial state, and current PSA-sync status (so callers don't kick off an analysis while a sync is still running).","operationId":"public_api.insights_defaults_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/InsightsDefaults"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Insights presets \u2014 suggested region, period options, trial state","tags":["Insights"]}},"/public-api/insights/result":{"get":{"description":"Latest *completed* analysis with the full ROI payload (`result` is an opaque blob \u2014 render verbatim). 404 if nothing has completed yet.","operationId":"public_api.insights_result_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/InsightsResult"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Latest completed analysis","tags":["Insights"]}},"/public-api/insights/status":{"get":{"description":"Status of the most recent analysis on the tenant. Returns `{status: null}` when nothing has run.","operationId":"public_api.insights_status_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/InsightsStatus"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Latest analysis status","tags":["Insights"]}},"/public-api/integrations":{"get":{"description":"Every integration Neo supports with its current connection state for the tenant, plus `last_sync_at` / `last_sync_status` projected from `pipeline_runs`. Integrations that don't sync (e.g. ScalePad) return `null` for both last-sync fields. Each RMM vendor is its own row with an independent `connected` flag and per-vendor last-sync \u2014 a tenant can have several RMMs connected simultaneously.","operationId":"public_api.integrations_list_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicIntegration"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List integrations","tags":["Integrations"]}},"/public-api/integrations/{name}":{"get":{"description":"One integration with connection state and latest sync row. Returns `404 unknown_integration` if the name isn't in the canonical registry.","operationId":"public_api.integrations_get_get","parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicIntegration"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get an integration","tags":["Integrations"]}},"/public-api/integrations/{name}/connect-url":{"post":{"description":"Returns dashboard instructions for connecting the integration. v1 does not synthesize OAuth consent URLs \u2014 the dashboard owns those flows for every integration.","operationId":"public_api.integrations_connect_url_post","parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/ConnectUrlResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get an integration's connect instructions","tags":["Integrations"]}},"/public-api/integrations/{name}/disconnect":{"post":{"description":"Dashboard-only in v1 \u2014 returns 501 with a pointer to the dashboard URL. Always requires technician approval once implemented (severs the PSA/M365/RMM link).","operationId":"public_api.integrations_disconnect_post","parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."},"501":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."}},"security":[{"bearerAuth":[]}],"summary":"Disconnect an integration","tags":["Integrations"]}},"/public-api/integrations/{name}/sync-runs":{"get":{"description":"Sync history for one integration on the caller's tenant \u2014 per-activity counts and per-resource failures from `pipeline_runs.sync_details`. Use when an MSP asks \"I created X in PSA, where is it?\": a recent successful run with empty failures means watermark-or-cadence latency; a run with failures on a specific resource means a real per-type problem. Default window is the last 30 days; max window is 30 days. Returns 404 `unknown_integration` for an unrecognised name, `integration_not_connected` if the tenant doesn't have it configured, and `integration_does_not_sync` for connected integrations that don't run scheduled syncs.","operationId":"public_api.sync_runs_list_get","parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"ISO-8601 lower bound on run start time. Defaults to 30 days before `until`.","in":"query","name":"since","required":false,"schema":{"type":"string"}},{"description":"ISO-8601 upper bound on run start time. Defaults to now.","in":"query","name":"until","required":false,"schema":{"type":"string"}},{"description":"Items per page (1-200, default 50).","in":"query","name":"page_size","required":false,"schema":{"type":"integer"}},{"description":"Opaque pagination cursor from a previous response's `meta.pagination.next_cursor`.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SyncRun"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List integration sync runs","tags":["Integrations"]}},"/public-api/intents":{"get":{"description":"Every non-deleted intent for the tenant (enabled or not).","operationId":"public_api.intents_list_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicIntent"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List intents","tags":["Intents"]},"post":{"description":"A curated request type \u2014 a menu name/description plus an `ask_for` intake script. `surfaces` (END_USER_CHAT | TRIGGERED, at least one) declares which agent kinds it runs on; every assigned `agent_id` must be valid for one of them (an end-user chat agent for END_USER_CHAT, a ticket-triggered agent for TRIGGERED). Empty `agent_ids` applies it to all agents of the surface; empty `end_company_ids` to all companies. An enabled intent is capped at 15 per applicable agent.","operationId":"public_api.intents_create_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntentRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicIntent"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Create an intent","tags":["Intents"]}},"/public-api/intents/{intent_id}":{"delete":{"description":"Soft-deletes the intent.","operationId":"public_api.intents_delete_delete","parameters":[{"in":"path","name":"intent_id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Delete an intent","tags":["Intents"]},"get":{"operationId":"public_api.intents_get_get","parameters":[{"in":"path","name":"intent_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicIntent"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get an intent","tags":["Intents"]},"put":{"description":"Full replace of every editable field. Disabling is always allowed; re-enabling re-checks the 15-per-agent cap.","operationId":"public_api.intents_update_put","parameters":[{"in":"path","name":"intent_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicIntent"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Update an intent","tags":["Intents"]}},"/public-api/iteration-sessions/{session_id}":{"get":{"description":"The session's state plus a summary of every pause (all attempts).","operationId":"public_api.iteration_sessions_get_get","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicIterationSession"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get an iteration session","tags":["Iteration Sessions"]}},"/public-api/iteration-sessions/{session_id}/finish":{"post":{"description":"Ends the session: abandons any open pause, unfreezes the agent's schedule, and marks the session COMPLETED. Idempotent.","operationId":"public_api.iteration_sessions_finish_post","parameters":[{"in":"path","name":"session_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicIterationSession"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Finish an iteration session","tags":["Iteration Sessions"]}},"/public-api/iteration-sessions/{session_id}/pauses/{pause_id}":{"get":{"description":"One pause in full, including `withheld_outputs` \u2014 the real tool output(s) captured at the park, not yet delivered to the agent's model. `execution_id` links to `GET /executions/{id}/steps` for the run trace up to the pause.","operationId":"public_api.iteration_sessions_get_pause_get","parameters":[{"in":"path","name":"pause_id","required":true,"schema":{"type":"string"}},{"in":"path","name":"session_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicIterationPause"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get an iteration pause","tags":["Iteration Sessions"]}},"/public-api/iteration-sessions/{session_id}/pauses/{pause_id}/directive":{"post":{"description":"Resolves one AWAITING_DIRECTIVE pause: `CONTINUE` resumes with the withheld output delivered verbatim (free \u2014 resumes never bill); `FINISH_RUN` resumes with a wrap-up note so the agent concludes; `RESTART_RUN` abandons the parked attempt and starts a fresh one from the beginning against the agent's current (just-edited) config \u2014 bills like a normal run; `CANCEL` abandons the parked attempt and leaves the session open. 409 when the pause already received a directive. CONTINUE/FINISH_RUN require a parked tool output (an EVERY_STEP pause, not a RUN_COMPLETE one).","operationId":"public_api.iteration_sessions_submit_directive_post","parameters":[{"in":"path","name":"pause_id","required":true,"schema":{"type":"string"}},{"in":"path","name":"session_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IterationDirectiveRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicIterationPause"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Submit an iteration directive","tags":["Iteration Sessions"]}},"/public-api/memories":{"get":{"description":"The tenant's durable agent memories \u2014 the facts and playbooks recall injects into agent runs. Offset-paginated; returns the page plus a total and facet counts for the current filter.","operationId":"public_api.memories_list_get","parameters":[{"description":"Filter by scope: `CLIENT` (MSP-wide) or `END_CLIENT`.","in":"query","name":"scope_type","required":false,"schema":{"type":"string"}},{"description":"Filter by scope id (the end-client company id for `END_CLIENT`).","in":"query","name":"scope_id","required":false,"schema":{"type":"string"}},{"description":"Filter by category: `SEMANTIC`, `PROCEDURAL`, or `EPISODIC`.","in":"query","name":"category","required":false,"schema":{"type":"string"}},{"description":"Filter by source (e.g. `ADMIN`, `SYNC_PSA_DISCOVERY`, `REVIEWER`).","in":"query","name":"created_by","required":false,"schema":{"type":"string"}},{"description":"Full-text filter over memory content.","in":"query","name":"text","required":false,"schema":{"type":"string"}},{"description":"Include soft-deleted memories (`true`/`false`, default false).","in":"query","name":"include_deleted","required":false,"schema":{"type":"boolean"}},{"description":"Include test-mode memories (`true`/`false`, default false).","in":"query","name":"include_test_mode","required":false,"schema":{"type":"boolean"}},{"description":"Row offset for pagination (default 0).","in":"query","name":"offset","required":false,"schema":{"type":"integer"}},{"description":"Items per page (1-100, default 50).","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicMemoryListPage"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List agent memories","tags":["Memories"]},"post":{"description":"Author a manual memory. `CLIENT` memories are scoped to the caller's tenant; `END_CLIENT` memories require `scope_id` (the end-client company id). Set `pinned: true` to create-and-pin in one call \u2014 required for standing instructions that must apply on every run (unpinned memories only surface via on-demand recall). When the scope's pin cap is full the memory is still created and the call returns 409 (`memory_pin_limit_exceeded`); curate pins, then `POST /memories/<id>/pin`. Tenant-admin only: a non-admin dashboard user or on-behalf-of end user gets 403 (`insufficient_scope`). Requires technician approval when reached via `NEO_API_REQUEST`.","operationId":"public_api.memories_create_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMemoryRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicMemory"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Create an agent memory","tags":["Memories"]}},"/public-api/memories/{memory_id}":{"delete":{"description":"Excludes the memory from recall (restorable). Tenant-admin only (403 `insufficient_scope` otherwise). Always requires technician approval when reached via `NEO_API_REQUEST`.","operationId":"public_api.memories_delete_delete","parameters":[{"in":"path","name":"memory_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicMemory"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Soft-delete an agent memory","tags":["Memories"]},"get":{"operationId":"public_api.memories_get_get","parameters":[{"in":"path","name":"memory_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicMemory"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get an agent memory","tags":["Memories"]}},"/public-api/memories/{memory_id}/pin":{"post":{"description":"Pin a memory so it bypasses decay and is always injected. Subject to per-scope pin caps (409 when full). Tenant-admin only (403 `insufficient_scope` otherwise).","operationId":"public_api.memories_pin_post","parameters":[{"in":"path","name":"memory_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicMemory"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Pin an agent memory","tags":["Memories"]}},"/public-api/memories/{memory_id}/restore":{"post":{"description":"Bring a soft-deleted memory back into recall. A memory pinned when deleted is restored unpinned if the scope's pin cap is now full. Tenant-admin only (403 `insufficient_scope` otherwise).","operationId":"public_api.memories_restore_post","parameters":[{"in":"path","name":"memory_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicMemory"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Restore an agent memory","tags":["Memories"]}},"/public-api/memories/{memory_id}/supersede":{"post":{"description":"Replace a memory's content within its own scope/category, preserving surface targeting unless re-tagged. Tenant-admin only (403 `insufficient_scope` otherwise). Always requires technician approval when reached via `NEO_API_REQUEST`.","operationId":"public_api.memories_supersede_post","parameters":[{"in":"path","name":"memory_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupersedeMemoryRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicMemory"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Supersede an agent memory","tags":["Memories"]}},"/public-api/memories/{memory_id}/unpin":{"post":{"description":"Remove a pin; the memory resumes normal decay-based ranking. Tenant-admin only (403 `insufficient_scope` otherwise).","operationId":"public_api.memories_unpin_post","parameters":[{"in":"path","name":"memory_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicMemory"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Unpin an agent memory","tags":["Memories"]}},"/public-api/observability/callback-funnel":{"get":{"description":"End-to-end pipeline metrics for the caller's tenant \u2014 webhook receipt \u2192 concurrency cap \u2192 event processing \u2192 workflow execution \u2192 PSA API calls. Drives the `investigate-processing-performance` discipline: durations, counts, and ratios only. **Never** returns LLM / provider cost (token spend, $) \u2014 customer-facing credits exposure is on the billing endpoints, not here. Default window 24h; max 7d.","operationId":"public_api.observability_callback_funnel_get","parameters":[{"description":"ISO-8601 lower bound (UTC). Default = `until - 24h`.","in":"query","name":"since","required":false,"schema":{"type":"string"}},{"description":"ISO-8601 upper bound (UTC). Default = now.","in":"query","name":"until","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/CallbackFunnel"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Callback-processing funnel","tags":["Observability"]}},"/public-api/observability/workflow-performance":{"get":{"description":"Per-agent execution stats once the funnel points at a slow agent \u2014 durations (p95 total / actual / overhead), LLM call counts by purpose, PSA call count. **No cost fields.** Optional `agent_id` narrows to one agent.","operationId":"public_api.observability_workflow_performance_get","parameters":[{"description":"ISO-8601 lower bound (UTC). Default = `until - 24h`.","in":"query","name":"since","required":false,"schema":{"type":"string"}},{"description":"ISO-8601 upper bound (UTC). Default = now.","in":"query","name":"until","required":false,"schema":{"type":"string"}},{"description":"Narrow to one agent (workflow id).","in":"query","name":"agent_id","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/WorkflowPerformance"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Per-agent performance breakdown","tags":["Observability"]}},"/public-api/openapi.json":{"get":{"description":"This document. No authentication required.","operationId":"public_api.openapi_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[],"summary":"OpenAPI 3.1 document","tags":["Meta"]}},"/public-api/performance/categories":{"get":{"description":"Execution quality by classifier category (success rate, fully-resolved counts, hours saved).","operationId":"public_api.performance_categories_get","parameters":[{"description":"ISO-8601 window start (inclusive).","in":"query","name":"from","required":true,"schema":{"type":"string"}},{"description":"ISO-8601 window end (exclusive).","in":"query","name":"to","required":true,"schema":{"type":"string"}},{"description":"Optional filter: AGENTIC, CHAINED_ACTIONS, or CONVERSATIONAL (chat \u2014 credits only, no execution/hours).","in":"query","name":"autonomy_type","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CategoryPerformance"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Per-category execution stats","tags":["Performance"]}},"/public-api/performance/chat/by-agent":{"get":{"operationId":"public_api.performance_chat_by_agent_get","parameters":[{"description":"ISO-8601 window start (inclusive).","in":"query","name":"from","required":true,"schema":{"type":"string"}},{"description":"ISO-8601 window end (exclusive).","in":"query","name":"to","required":true,"schema":{"type":"string"}},{"description":"Optional: `msp` (internal chat agents, default) or `end-user` (white-label end-user bot).","in":"query","name":"audience","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ChatAgentPerformance"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Per-agent chat cost + usage for a date window","tags":["Performance"]}},"/public-api/performance/chat/by-user":{"get":{"description":"Chat cost + usage attributed per user (technician for MSP agents), per session \u2014 1:1 chats exact, group sessions attributed to the first speaker.","operationId":"public_api.performance_chat_by_user_get","parameters":[{"description":"ISO-8601 window start (inclusive).","in":"query","name":"from","required":true,"schema":{"type":"string"}},{"description":"ISO-8601 window end (exclusive).","in":"query","name":"to","required":true,"schema":{"type":"string"}},{"description":"Optional: `msp` (internal chat agents, default) or `end-user` (white-label end-user bot).","in":"query","name":"audience","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ChatUserPerformance"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Per-user chat cost + usage for a date window","tags":["Performance"]}},"/public-api/performance/chat/summary":{"get":{"description":"Conversational-agent totals: credits consumed, turns (messages), sessions, and active agents.","operationId":"public_api.performance_chat_summary_get","parameters":[{"description":"ISO-8601 window start (inclusive).","in":"query","name":"from","required":true,"schema":{"type":"string"}},{"description":"ISO-8601 window end (exclusive).","in":"query","name":"to","required":true,"schema":{"type":"string"}},{"description":"Optional: `msp` (internal chat agents, default) or `end-user` (white-label end-user bot).","in":"query","name":"audience","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/ChatPerformanceSummary"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Aggregate chat-agent cost + usage for a date window","tags":["Performance"]}},"/public-api/performance/chat/timeline":{"get":{"description":"Time-bucketed chat credits + turns at day / week / month granularity.","operationId":"public_api.performance_chat_timeline_get","parameters":[{"description":"ISO-8601 window start (inclusive).","in":"query","name":"from","required":true,"schema":{"type":"string"}},{"description":"ISO-8601 window end (exclusive).","in":"query","name":"to","required":true,"schema":{"type":"string"}},{"description":"Bucket size: day, week, or month (default week).","in":"query","name":"bucket","required":false,"schema":{"type":"string"}},{"description":"Optional: `msp` (internal chat agents, default) or `end-user` (white-label end-user bot).","in":"query","name":"audience","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ChatTimeBucket"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Chat credits / turns over time","tags":["Performance"]}},"/public-api/performance/chat/tools":{"get":{"description":"Which tools the chat agents called, how often, and the credits those calls billed; `is_free` marks FREE-tier plumbing tools.","operationId":"public_api.performance_chat_tools_get","parameters":[{"description":"ISO-8601 window start (inclusive).","in":"query","name":"from","required":true,"schema":{"type":"string"}},{"description":"ISO-8601 window end (exclusive).","in":"query","name":"to","required":true,"schema":{"type":"string"}},{"description":"Optional: `msp` (internal chat agents, default) or `end-user` (white-label end-user bot).","in":"query","name":"audience","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ChatToolUsage"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Per-tool chat usage + cost for a date window","tags":["Performance"]}},"/public-api/performance/summary":{"get":{"description":"Tenant-scoped totals: executions by status, hours saved, credits consumed.","operationId":"public_api.performance_summary_get","parameters":[{"description":"ISO-8601 window start (inclusive).","in":"query","name":"from","required":true,"schema":{"type":"string"}},{"description":"ISO-8601 window end (exclusive).","in":"query","name":"to","required":true,"schema":{"type":"string"}},{"description":"Optional filter: AGENTIC, CHAINED_ACTIONS, or CONVERSATIONAL (chat \u2014 credits only, no execution/hours).","in":"query","name":"autonomy_type","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PerformanceSummary"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Aggregate execution stats for a date window","tags":["Performance"]}},"/public-api/performance/ticket-coverage":{"get":{"description":"Time-bucketed coverage: callbacks received per bucket vs. distinct tickets the platform actually ran on.","operationId":"public_api.performance_ticket_coverage_get","parameters":[{"description":"ISO-8601 window start (inclusive).","in":"query","name":"from","required":true,"schema":{"type":"string"}},{"description":"ISO-8601 window end (exclusive).","in":"query","name":"to","required":true,"schema":{"type":"string"}},{"description":"Bucket size: day, week, or month (default week).","in":"query","name":"bucket","required":false,"schema":{"type":"string"}},{"description":"Optional filter: AGENTIC, CHAINED_ACTIONS, or CONVERSATIONAL (chat \u2014 credits only, no execution/hours).","in":"query","name":"autonomy_type","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TicketCoverageBucket"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Tickets received vs. handled by Neo over time","tags":["Performance"]}},"/public-api/performance/timeline":{"get":{"description":"Time-bucketed rollup at day / week / month granularity.","operationId":"public_api.performance_timeline_get","parameters":[{"description":"ISO-8601 window start (inclusive).","in":"query","name":"from","required":true,"schema":{"type":"string"}},{"description":"ISO-8601 window end (exclusive).","in":"query","name":"to","required":true,"schema":{"type":"string"}},{"description":"Bucket size: day, week, or month (default week).","in":"query","name":"bucket","required":false,"schema":{"type":"string"}},{"description":"Optional filter: AGENTIC, CHAINED_ACTIONS, or CONVERSATIONAL (chat \u2014 credits only, no execution/hours).","in":"query","name":"autonomy_type","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TimeBucketStats"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Execution volume / hours saved over time","tags":["Performance"]}},"/public-api/performance/workflows":{"get":{"operationId":"public_api.performance_workflows_get","parameters":[{"description":"ISO-8601 window start (inclusive).","in":"query","name":"from","required":true,"schema":{"type":"string"}},{"description":"ISO-8601 window end (exclusive).","in":"query","name":"to","required":true,"schema":{"type":"string"}},{"description":"Optional filter: AGENTIC, CHAINED_ACTIONS, or CONVERSATIONAL (chat \u2014 credits only, no execution/hours).","in":"query","name":"autonomy_type","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WorkflowPerformance"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Per-agent execution stats for a date window","tags":["Performance"]}},"/public-api/phone/calls":{"get":{"description":"Recent calls the Phone Agent handled. Recording binaries are deliberately not exposed here \u2014 those are gated behind dashboard auth and the recording-retention policy.","operationId":"public_api.phone_calls_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicPhoneCall"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List Phone Agent calls","tags":["Phone Agent"]}},"/public-api/phone/numbers":{"get":{"description":"Phone numbers wired into the tenant's Phone Agent. `psa_settings` and `agent_settings` are returned as opaque JSON (the inner shapes are tenant-curated and not part of the public contract \u2014 edit them in the dashboard).","operationId":"public_api.phone_numbers_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicPhoneNumber"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List Phone Agent numbers","tags":["Phone Agent"]}},"/public-api/rmm-script-executions":{"get":{"description":"`rmm_vendor` names which connected RMM each script was dispatched to \u2014 a tenant can have several RMMs connected at once; null on legacy executions recorded before vendor stamping.","operationId":"public_api.rmm_script_executions_list_get","parameters":[{"description":"Filter to one agent execution's RMM runs.","in":"query","name":"execution_id","required":false,"schema":{"type":"string"}},{"description":"Comma-separated statuses to include.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"ISO-8601 lower bound on creation time.","in":"query","name":"since","required":false,"schema":{"type":"string"}},{"description":"Items per page (1-200, default 50).","in":"query","name":"page_size","required":false,"schema":{"type":"integer"}},{"description":"Opaque pagination cursor from a previous response's `meta.pagination.next_cursor`.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/RmmScriptExecution"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List RMM script executions","tags":["RMM scripts"]}},"/public-api/rmm-script-executions/{execution_id}":{"get":{"description":"Includes the rendered script content for Neo dynamic scripts.","operationId":"public_api.rmm_script_executions_get_get","parameters":[{"in":"path","name":"execution_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/RmmScriptExecutionDetail"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get an RMM script execution","tags":["RMM scripts"]}},"/public-api/scheduled-work":{"get":{"description":"Scheduled work entries for the tenant.","operationId":"public_api.scheduled_work_list_get","parameters":[{"description":"Filter by status: PENDING, PROCESSING, COMPLETED, FAILED, CANCELLED.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Filter by exact ticket id.","in":"query","name":"ticket_id","required":false,"schema":{"type":"string"}},{"description":"Partial match on ticket_id or ticket_number.","in":"query","name":"search","required":false,"schema":{"type":"string"}},{"description":"1-indexed page number (default 1).","in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"description":"Items per page (1-200, default 50).","in":"query","name":"page_size","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicScheduledWork"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List scheduled work","tags":["Scheduled work"]},"post":{"description":"Schedules an enabled TRIGGERED agent to run at a future time. `scheduled_for` must be in the future.","operationId":"public_api.scheduled_work_create_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateScheduledWorkRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicScheduledWork"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Schedule work","tags":["Scheduled work"]}},"/public-api/scheduled-work/{scheduled_work_id}":{"get":{"operationId":"public_api.scheduled_work_get_get","parameters":[{"in":"path","name":"scheduled_work_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicScheduledWork"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get a scheduled-work entry","tags":["Scheduled work"]},"patch":{"description":"Reschedule or change instructions. Only PENDING entries can be updated.","operationId":"public_api.scheduled_work_update_patch","parameters":[{"in":"path","name":"scheduled_work_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateScheduledWorkRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicScheduledWork"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Update a scheduled-work entry","tags":["Scheduled work"]}},"/public-api/scheduled-work/{scheduled_work_id}/cancel":{"post":{"description":"Cancels a PENDING entry. Already-non-PENDING entries return 409.","operationId":"public_api.scheduled_work_cancel_post","parameters":[{"in":"path","name":"scheduled_work_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicScheduledWork"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Cancel a scheduled-work entry","tags":["Scheduled work"]}},"/public-api/schemas/actions":{"get":{"operationId":"public_api.schemas_actions_get","parameters":[{"description":"Restrict to a single action type (e.g. FIND_ENTITIES). Omit for the full catalog \u2014 which is large.","in":"query","name":"action_type","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Action-type schema catalog","tags":["Schemas"]}},"/public-api/schemas/agent-integrations":{"get":{"operationId":"public_api.schemas_agent_integrations_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Agent-integration schema catalog","tags":["Schemas"]}},"/public-api/schemas/agents":{"get":{"description":"The autonomy\u2194trigger\u2194entity matrix and per-rule list used by the server to validate `POST/PUT /public-api/agents`. Co-located with the validator \u2014 every shape rejected by the validator is described here so external writers can validate locally and skip the POST\u2192400\u2192fix loop. Stable `rules[].code` matches the `details.field_errors[].code` returned on 400.","operationId":"public_api.schemas_agents_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Agent structural schema","tags":["Schemas"]}},"/public-api/schemas/callback-change-options":{"get":{"operationId":"public_api.schemas_callback_change_options_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Callback change-option catalog","tags":["Schemas"]}},"/public-api/schemas/custom-field-condition":{"get":{"operationId":"public_api.schemas_custom_field_condition_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Custom-field-condition schema","tags":["Schemas"]}},"/public-api/schemas/entity-options":{"get":{"description":"With no `entity_name`, returns the manifest of queryable names. An unknown name returns 400 `invalid_entity_name` with the manifest URL in `error.details`.","operationId":"public_api.schemas_entity_options_get","parameters":[{"description":"The queryable entity name (omit to get the manifest).","in":"query","name":"entity_name","required":false,"schema":{"type":"string"}},{"description":"Scope options to a PSA board, where applicable (e.g. ConnectWise Status/Type/Subtype are board-specific).","in":"query","name":"board_id","required":false,"schema":{"type":"integer"}},{"description":"For ConnectWise Subtype, narrow to the parent Type (used with board_id).","in":"query","name":"type_id","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Queryable-entity options","tags":["Schemas"]}},"/public-api/schemas/integrations":{"get":{"operationId":"public_api.schemas_integrations_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Integrations schema catalog","tags":["Schemas"]}},"/public-api/schemas/ticket":{"get":{"operationId":"public_api.schemas_ticket_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Ticket-field schema","tags":["Schemas"]}},"/public-api/schemas/time_entry":{"get":{"operationId":"public_api.schemas_time_entry_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Time-entry-field schema","tags":["Schemas"]}},"/public-api/schemas/tools":{"get":{"operationId":"public_api.schemas_tools_get","parameters":[{"description":"Restrict to tools available for this entity type.","in":"query","name":"entity_type","required":false,"schema":{"type":"string"}},{"description":"Restrict to one trust domain (MSP | END_USER). MSP = Internal/technician tools; END_USER = user-facing chat-agent tools. Omit for the full catalog.","in":"query","name":"audience","required":false,"schema":{"type":"string"}},{"description":"Restrict to a single tool type (e.g. UPDATE_TICKET_FIELDS). Omit for the full catalog \u2014 which is large.","in":"query","name":"tool_type","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Tool catalog","tags":["Schemas"]}},"/public-api/sessions":{"post":{"description":"Mints a short-lived JWT bound to one chat `session_id`. The Teams relay (or any future end-user-facing channel) attaches it as `Authorization: Bearer <token>` on subsequent `/chat/sessions/<session_id>/*` calls. Only service-account or dashboard callers can mint; the resulting token cannot mint or revoke.\n\nA **platform** service account may pass `client_id` to mint for another tenant, but only when `session_id` is that tenant's Neo Support session (otherwise 403); any non-platform caller passing `client_id` is rejected with 403.\n\nWhen the session is scoped to an end-company (white-label sessions are, at create), the minted `end_company_id` claim is taken from the session itself \u2014 a caller-supplied value never widens or changes the session's scope.","operationId":"public_api.session_token_mint_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintSessionTokenRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/MintSessionTokenResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Mint an end-user session token","tags":["Chat"]}},"/public-api/sessions/{jti}":{"delete":{"description":"Adds the token's `jti` to the per-tenant Redis denylist for a 24h TTL ceiling. Future verifies reject it as long as the entry persists.","operationId":"public_api.session_token_revoke_delete","parameters":[{"in":"path","name":"jti","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Revoke an end-user session token by jti","tags":["Chat"]}},"/public-api/settings":{"get":{"description":"A public projection of the tenant's settings (the Slack token / app id are omitted).","operationId":"public_api.settings_get_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicSettings"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get tenant settings","tags":["Settings"]},"put":{"description":"Partial patch \u2014 only the fields present in the body are changed. Returns the updated settings.","operationId":"public_api.settings_update_put","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSettingsUpdate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicSettings"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Update tenant settings","tags":["Settings"]}},"/public-api/settings/schema":{"get":{"description":"The JSON schema of the settings object, for building editors.","operationId":"public_api.settings_schema_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Tenant-settings JSON schema","tags":["Settings"]}},"/public-api/shared-agents/{share_token}":{"get":{"description":"Read-only public view of an agent/workflow shared via a 'Share Agent' link. No authentication \u2014 the opaque share token in the path is the credential. Returns the agent's name, prompt, triggers, filters and enabled tools, sanitized for public viewing (no tenant identity, usage, cost or integration permission detail). Returns 404 if the link is unknown or has been disabled.","operationId":"public_api.shared_agents_get_get","parameters":[{"in":"path","name":"share_token","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/SharedAgentSnapshot"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[],"summary":"Get a publicly shared agent","tags":["Sharing"]}},"/public-api/skills":{"get":{"description":"The MSP's authored skills (metadata only). Read one whole with GET /skills/{skill_id}.","operationId":"public_api.skills_list_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicSkillSummary"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List the tenant's skills","tags":["Skills"]},"post":{"description":"Create a tenant skill from a full set of files. Must include a SKILL.md file. The slug is chosen here and is immutable after creation because it is the skill's agent lookup key and sandbox directory. If a live skill with the same slug already exists, returns 409 `skill_already_exists` with the existing skill's id in `error.details.existing_skill_id` \u2014 PUT/PATCH that id to update it.","operationId":"public_api.skills_create_post","parameters":[],"requestBody":{"content":{"application/json":{"examples":{"license_true_up":{"summary":"A skill with a playbook and one script","value":{"description":"Monthly license true-ups. Use when reconciling agreements vs device counts.","files":[{"content":"## When to use\nReconcile licenses monthly.\n\n## Steps\nRun scripts/reconcile.py.","path":"SKILL.md"},{"content":"print('reconcile')\n","path":"scripts/reconcile.py"}],"name":"License true-up","slug":"license-true-up","source_run_id":"24183-0512"}}},"schema":{"$ref":"#/components/schemas/CreateSkillRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicSkill"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Create a skill","tags":["Skills"]}},"/public-api/skills/{skill_id}":{"delete":{"description":"Soft-delete the skill (sets deleted_at). File version history is retained.","operationId":"public_api.skills_delete_delete","parameters":[{"in":"path","name":"skill_id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Delete a skill","tags":["Skills"]},"get":{"description":"Read one skill whole \u2014 its files, each at its latest version.","operationId":"public_api.skills_get_get","parameters":[{"in":"path","name":"skill_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicSkill"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get a skill","tags":["Skills"]},"patch":{"description":"Surgical search/replace edits to part of a file (the default for a tweak). Each edit must match exactly once unless replace_all is set; base_hash guards against concurrent writes.","operationId":"public_api.skills_patch_patch","parameters":[{"in":"path","name":"skill_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"examples":{"tighten_one_rule":{"summary":"Swap one line inside a script","value":{"base_hash":"sha256:7c1f...","edits":[{"file_id":"a91f0000-0000-0000-0000-000000000000","new_string":"    if matched and matched.active:  # skip archived","old_string":"    if matched:","replace_all":false}]}}},"schema":{"$ref":"#/components/schemas/PatchSkillRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicSkill"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Edit part of a skill's file","tags":["Skills"]},"put":{"description":"Replace whole files (each gets a new version) and/or update the editable display name, description, or source-run provenance. The slug is immutable after creation; sending `slug` is rejected rather than silently treating it as a display-name change. Use PATCH for surgical file edits.","operationId":"public_api.skills_update_put","parameters":[{"in":"path","name":"skill_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"examples":{"fold_in_a_fixed_script":{"summary":"Replace a whole script after a repaired run","value":{"files":[{"content":"print('reconcile v2')\n","path":"scripts/reconcile.py"}],"source_run_id":"24183-0610"}}},"schema":{"$ref":"#/components/schemas/UpdateSkillRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicSkill"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Replace whole files / update skill metadata","tags":["Skills"]}},"/public-api/support-chat-contact":{"post":{"description":"Sets the person to invite to the MSP's Microsoft Teams support chat and immediately re-attempts the invite. Reached from the Neo-generated access-email link via the dashboard's no-login page \u2014 no Authorization header; the `signature` query param is the credential and authorizes only this action for this client.","operationId":"public_api.support_chat_contact_set_post","parameters":[{"description":"HMAC signature from the Neo-generated link. No Authorization header is used.","in":"query","name":"signature","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportChatContactRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/SupportChatContactResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[],"summary":"Set support-chat contact","tags":["Feedback"]}},"/public-api/teams-availability/auto-map":{"post":{"description":"Matches PSA technicians to their Microsoft Entra identity by email/UPN against the members of every Team in the tenant and persists each match. Takes no body. Manual mappings set on the Profiles tab are never overwritten. Always requires technician approval via NEO_API_REQUEST (rewrites who dispatch reads presence for).","operationId":"public_api.teams_availability_auto_map_post","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/TeamsAvailabilityAutoMapResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Auto-map technicians to their Microsoft user","tags":["Integrations"]}},"/public-api/teams-availability/consent-url":{"get":{"description":"Builds the own-tenant admin-consent URL for the 'Microsoft Teams \u2014 Workforce Availability' integration. An M365 admin of the MSP's own tenant opens it to grant the read-only presence/shifts/group scopes, after which teams can be listed and technicians auto-mapped.","operationId":"public_api.teams_availability_consent_url_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/TeamsAvailabilityConsentUrlResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get the Teams availability admin-consent URL","tags":["Integrations"]}},"/public-api/teams-availability/teams":{"get":{"description":"Lists the Microsoft Teams in the MSP's own tenant \u2014 used to pick the team(s) whose members/Shifts rota drive presence-aware dispatch. Requires admin consent (returns 502 until granted).","operationId":"public_api.teams_availability_teams_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicTeam"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List the MSP tenant's Teams","tags":["Integrations"]}},"/public-api/technicians":{"get":{"operationId":"public_api.technicians_list_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Technician"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List technicians","tags":["Technicians"]},"post":{"description":"Adds a technician to the roster. Returns 409 `technician_already_exists` if a technician with the same `psa_id` already exists. Always requires technician approval (the roster controls who receives TIL and gets paged).","operationId":"public_api.technicians_create_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTechnicianRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Technician"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Create a technician","tags":["Technicians"]}},"/public-api/technicians/{profile_id}":{"delete":{"description":"Clears the technician profile and marks the row not-ready. Always requires technician approval.","operationId":"public_api.technicians_delete_delete","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Technician"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Soft-delete a technician","tags":["Technicians"]},"get":{"operationId":"public_api.technicians_get_get","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Technician"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get a technician","tags":["Technicians"]},"patch":{"description":"Partial patch \u2014 only supplied fields change. Always requires technician approval.","operationId":"public_api.technicians_update_patch","parameters":[{"in":"path","name":"profile_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTechnicianRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Technician"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Update a technician","tags":["Technicians"]}},"/public-api/templates":{"get":{"description":"Neo-curated catalog of starter agents/workflows. Filtered server-side to the tenant's PSA (`supported_psas` membership). Use as a starting point for `POST /agents` \u2014 the `actions`, `toolbox`, `agent_settings`, and `integrations` blobs are passthrough-shaped against the `/schemas/agents` contract.","operationId":"public_api.templates_list_get","parameters":[{"description":"Filter by autonomy type (CHAINED_ACTIONS / AGENTIC / CONVERSATIONAL).","in":"query","name":"autonomy_type","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicTemplate"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List agent/workflow templates","tags":["Templates"]}},"/public-api/templates/categories":{"get":{"description":"Distinct `category` values present in the active template catalog. Use to drive a picker sidebar.","operationId":"public_api.templates_categories_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Operation-specific payload."},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List template categories","tags":["Templates"]}},"/public-api/templates/{template_id}":{"get":{"operationId":"public_api.templates_get_get","parameters":[{"in":"path","name":"template_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/PublicTemplate"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get a template","tags":["Templates"]}},"/public-api/til-requests":{"get":{"operationId":"public_api.til_requests_list_get","parameters":[{"description":"Comma-separated TIL statuses to include.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Filter by agent (workflow) id.","in":"query","name":"agent_id","required":false,"schema":{"type":"integer"}},{"description":"Filter to requests sent to this approver (their stable user id). Honored for admins / API callers; a non-admin is always scoped to their own requests.","in":"query","name":"approver","required":false,"schema":{"type":"string"}},{"description":"Free-text search over the ticket id, ticket number, and request text (case-insensitive).","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Only requests created at or after this ISO-8601 timestamp.","in":"query","name":"created_after","required":false,"schema":{"type":"string"}},{"description":"Only requests created at or before this ISO-8601 timestamp.","in":"query","name":"created_before","required":false,"schema":{"type":"string"}},{"description":"Items per page (1-200, default 50).","in":"query","name":"page_size","required":false,"schema":{"type":"integer"}},{"description":"Opaque pagination cursor from a previous response's `meta.pagination.next_cursor`.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TilRequest"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List technician-in-the-loop requests","tags":["TIL requests"]}},"/public-api/til-requests/approvers":{"get":{"operationId":"public_api.til_requests_approvers_get","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TilApprover"},"type":"array"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"List the tenant's distinct TIL approvers","tags":["TIL requests"]}},"/public-api/til-requests/bulk-decision":{"post":{"description":"Applies one decision (approve or reject) to up to 50 technician-in-the-loop requests in the caller's own tenant. Each decision resumes a paused agent, so the operation is best-effort and not atomic: requests are processed sequentially, each is re-checked for a pending status, and results are grouped into `succeeded`, `already_resolved`, and `failed`. Partial success is normal \u2014 inspect the three groups rather than relying on a single overall status.","operationId":"public_api.til_requests_bulk_decision_post","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TilBulkDecisionRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/TilBulkDecisionResponse"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Approve or reject multiple TIL requests","tags":["TIL requests"]}},"/public-api/til-requests/{request_id}":{"get":{"operationId":"public_api.til_requests_get_get","parameters":[{"in":"path","name":"request_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/TilRequest"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Get a TIL request","tags":["TIL requests"]}},"/public-api/til-requests/{request_id}/decision":{"post":{"description":"Records the technician's decision (409 if it was already resolved). Returns the updated request. A **platform** service account may pass `client_id` to resolve a TIL in another tenant \u2014 but only when the acting technician is a recipient of the request, the request belongs to a conversational chat agent, or it belongs to that tenant's Neo Support agent (any other agent \u2192 403); any non-platform caller passing `client_id` is rejected with 403.","operationId":"public_api.til_requests_decision_post","parameters":[{"in":"path","name":"request_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TilDecisionRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/TilRequest"},"meta":{"$ref":"#/components/schemas/SuccessMeta"}},"required":["data","meta"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Bad request \u2014 malformed input."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Unauthenticated \u2014 missing or invalid credentials."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Forbidden \u2014 authenticated but not allowed."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Conflict \u2014 the resource is in a state that blocks this operation."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Request validation failed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Rate limited \u2014 see Retry-After."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Internal server error."}},"security":[{"bearerAuth":[]}],"summary":"Approve or reject a TIL request","tags":["TIL requests"]}}},"servers":[{"url":"https://api.neoagent.io"}],"tags":[{"description":"Service metadata \u2014 health, OpenAPI.","name":"Meta"},{"description":"Agents and workflows \u2014 read, version history, delete, stats.","name":"Agents"},{"description":"Agent/workflow execution history, sub-resources, retry/cancel.","name":"Executions"},{"description":"PSA webhook events and their workflow-match results.","name":"Callbacks"},{"description":"Technician-in-the-loop approval requests.","name":"TIL requests"},{"description":"RMM script executions triggered by agents.","name":"RMM scripts"},{"description":"Dispatch-agent field-update decisions.","name":"Dispatch"},{"description":"The authenticated tenant.","name":"Tenant"},{"description":"Agent-builder schema catalogs (raw JSON payloads).","name":"Schemas"},{"description":"Escalate to the Neo team (HubSpot ticket).","name":"Escalation"},{"description":"Tenant settings.","name":"Settings"},{"description":"Tenant API-key management (dashboard JWT only).","name":"API keys"},{"description":"End-user feedback links (signed-URL auth).","name":"Feedback"},{"description":"End-client companies (CRUD + bulk-update).","name":"End companies"},{"description":"Channels \u2014 bind a CONVERSATIONAL agent to a transport (Teams).","name":"Channels"},{"description":"PSA/RMM/M365 integration status and connection management.","name":"Integrations"},{"description":"Technician roster (controls TIL routing and paging).","name":"Technicians"},{"description":"Future runs queued for TRIGGERED agents.","name":"Scheduled work"},{"description":"Subscription state and customer-facing credit usage (no provider $).","name":"Billing"},{"description":"Inbox messages and announcements.","name":"Inbox & Comms"},{"description":"Tenant-authored agent skills (CRUD) and the built-in skill catalog.","name":"Skills"}]}
