Accepts PUT or PATCH (identical partial-merge semantics). Partial-patches an agent — only the fields you send change. autonomy_type, entity_type, and trigger_type are immutable — trigger_type may be sent but must match the agent’s current value, and a differing value returns 400. 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) — 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 — a PUT can never drop or reorder an action (do structural pipeline edits in the dashboard). A change to the python_code of a DATA_ANALYSIS action (a saved report) returns 400. On a TRIAGE_TICKET / TRIAGE_TIME_ENTRY action, fields_to_triage is a list and so replaces wholesale under the normal merge — send fields_to_triage_edits in that action’s input_as_dict to change one field keyed by field_name: a matching entry merges key-by-key (every other triage field stays byte-identical), an unmatched one is appended (field_name is the only setting it must carry), and an entry carrying remove: true drops its target instead of editing it — a removal names its target and nothing else, must match a configured field (a no-match returns 400 rather than silently doing nothing), and cannot remove the last remaining field. A PSA-unsupported field_name returns 400, and sending both fields_to_triage and fields_to_triage_edits in one action returns 400. Use the field_name spelling GET /agents/<id> returns (the PSA name, e.g. contact, customFields); the enum member name (CONTACT, CUSTOM_FIELD) is also accepted. A custom field is keyed by field_name (customFields) plus custom_field_name, since all custom fields share one field_name — send both to target the right one. 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 — e.g. {"agent_settings": {"custom_instructions": "…"}} edits only the instructions and leaves test_mode/model/til_channel intact, sending one integration’s permissions leaves the others connected, and {"schedule": {"timezone": "…"}} leaves the run cadence and business-hours windows intact. An update never adds a ticket_cooldown_hours you did not send. To edit a long custom_instructions runbook without resending the whole blob, send agent_settings_edits.custom_instructions with either edits (a list of exact old_string/new_string search-replaces — each must match exactly once, or pass replace_all; zero or multiple matches reject the request and write nothing) or append (text added with a newline separator). An optional base_hash (sha256:… of the instructions you read) gives optimistic concurrency: a stale hash returns 409 agent_stale_write instead of clobbering a concurrent dashboard edit. This form is mutually exclusive with a full agent_settings.custom_instructions in the same request (400), and applies only to AGENTIC / CONVERSATIONAL agents (CHAINED_ACTIONS has no agent_settings layer → 400). 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. An update that turns a scheduled Agent on, or makes an enabled one run more often, when its estimated cost reaches 25% of the workspace’s monthly credits (GET /agents/{id}/cost-estimate), returns 409 estimated_cost_confirmation_required with the estimate in error.details.estimate and changes nothing; send the same body with confirm_estimated_cost: true once the person who pays has agreed. An update that keeps an enabled agent’s schedule, or runs it less often, never asks. An update that turns on use_round_robin for a DISPATCH_TICKET action returns meta.warnings naming what round robin ignores; pass it to the person.
PUT
/
public-api
/
agents
/
{agent_id}
curl --request PUT \ --url https://api.neoagent.io/public-api/agents/{agent_id} \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "agent_settings_edits": { "custom_instructions": { "append": "- Only cite ticket history you have actually read." } }}'
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).
PUT /public-api/agents/<id> body — a partial patch. Only the fields you send are
changed; everything else keeps its current value. autonomy_type, entity_type, and
trigger_type are immutable: autonomy_type/entity_type aren't fields here at
all, and trigger_type may be sent but must match the agent's current value — a differing
value returns 400. Editing actions, agent_settings, toolbox, integrations, or the
conditions is a destructive change and triggers a TIL approval when an agent makes the
call via NEO_API_REQUEST.
The intent-shape applies on update too: 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) — do not include FIND_ENTITIES yourself.
actions MERGES (ENG-5712): each entry targets one existing action by id (preferred —
read it from GET /agents/<id>) or, when id is omitted, by action_type if exactly one
existing action has that type. The targeted action keeps its other config — its
input_as_dict is merged key-by-key with what you send (nested objects merged, an explicit
null deletes a key, scalars/lists replace), so changing one dispatch setting no longer
wipes the technician pool, instructions, or calendar settings you didn't resend. Entries
that match nothing are appended as new actions; existing actions you don't mention are left
untouched. There is deliberately no wholesale-replace mode: a PUT can never drop or reorder
an action — do structural pipeline edits (remove/reorder) in the dashboard.
Because an id-less entry matches by action_type, it can only ever ADD an action of a type
the agent does not already have. Send an id-less entry for a type that already has exactly one
action and you EDIT that action (200), rather than adding a second one; two or more of that
type return 400. There is therefore no supported way to add a second action of an existing
type through this endpoint — add it in the dashboard.
On a TRIAGE_TICKET / TRIAGE_TIME_ENTRY action, fields_to_triage is a list and so replaces
wholesale under that per-action merge; to change one triage field without resending the others
send fields_to_triage_edits in the action's input_as_dict. Each entry is keyed by
field_name: a match merges key-by-key (every other triage field stays byte-identical), an
unmatched field_name is appended (field_name is the only setting it must carry), an entry
carrying remove: true drops its target, a PSA-unsupported field_name is rejected 400, and
sending both fields_to_triage and fields_to_triage_edits in one action is a 400. A removal
names its target and nothing else, must match a configured field, and cannot empty the list.
A custom field is keyed by field_name AND custom_field_name, so an edit to one must send
both — custom_field_name alone says which custom field you mean. An edit that omits it keys
to a different slot, matches nothing, and is appended as a new entry; on an enabled agent that
entry is rejected 400 (custom_triage_field_without_a_name), because a custom field with no
name triages nothing.
toolbox, agent_settings, integrations, schedule, and callback_settings all MERGE the
same way (RFC 7396) — send only what you're changing, and everything you omit keeps its current
value:
toolbox merges per tool under tool_settings_by_type (nested objects merge; scalars and
lists — e.g. allowed_users — replace wholesale; a null tool key disables that tool).
agent_settings merges per field, so {"agent_settings": {"custom_instructions": "…"}}
changes only the instructions and leaves test_mode, til_channel, etc. untouched (a partial send used to silently reset them to defaults, e.g.
flipping an agent out of test mode).
integrations merges per integration, so sending one integration's permissions leaves every
other connected integration untouched (a partial send used to disable them all).
schedule merges per field, so {"schedule": {"timezone": "…"}} changes only the timezone
and leaves the run cadence / business-hours windows / weekend-skip intact.
callback_settings merges per field (target_changes is still required).
Nested objects merge key-by-key, scalars/lists replace wholesale, and an explicit null
deletes that key. An explicit top-level "toolbox": null still clears the whole toolbox.
Surgical, config-preserving edits to agent_settings string fields. Today only
custom_instructions is editable this way. Use this instead of sending the whole
agent_settings.custom_instructions string when you want to change one span of a long runbook
without a full read-modify-write of the blob. Mutually exclusive with a full
agent_settings.custom_instructions in the same request.
Set to true to save a scheduled Agent whose estimated cost needs confirmation (see GET /agents/{id}/cost-estimate). Without it, a save that leaves a scheduled Agent ENABLED at an estimate of 25% or more of the monthly credits returns 409 estimated_cost_confirmation_required, with the estimate in error.details.estimate, and changes nothing, when it turns the agent on (a create defaults to ENABLED) or makes an enabled one run more often. Send it only after the person who pays has seen the estimate and agreed. Ignored everywhere else.
Minutes of technician time one successful run saves, as your team measured it. A triggered CHAINED_ACTIONS workflow only; a whole number from 1 to 1440. null restores the default, the sum of each action's fixed minutes (manual_minutes_parts). On an update, omit the key to keep the stored value.
Trigger/entity filter for OPPORTUNITY agents (ConnectWise only) — which opportunities this agent fires on. Same shape as ticket_conditions; GET /public-api/schemas/opportunity lists the fields. An OPPORTUNITY agent filters with this field alone.
Trigger/entity filter — 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). A TIME_ENTRY agent carries this field too — there it selects the tickets whose time entries are searched, and time_entry_conditions then selects the time entries on them. 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 — 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. A leaf's value is a single value; only the in and notIn operators take a list. A list under any other operator returns 400.
Trigger/entity filter for TIME_ENTRY agents — which time entries this agent fires on, on the tickets ticket_conditions selected. Same shape as ticket_conditions. Ignored for TICKET agents.
Lean summary of a workflow row — the per-item shape GET /public-api/agents
(list) returns. The single-resource GET /public-api/agents/<id> returns the
richer AgentDetail; historical snapshots come back as AgentVersion.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Neo Agent","colors":{"primary":"#2563EB","light":"#60A5FA","dark":"#1D4ED8"},"logo":{"light":"https://mintcdn.com/neoagent/G1PkeWrWjzTWVbma/images/neo_agent_bright_logo.png?fit=max\u0026auto=format\u0026n=G1PkeWrWjzTWVbma\u0026q=85\u0026s=090e8010cda28a9adb16dfaf022b8382","dark":"https://mintcdn.com/neoagent/G1PkeWrWjzTWVbma/images/neo_agent_bright_logo.png?fit=max\u0026auto=format\u0026n=G1PkeWrWjzTWVbma\u0026q=85\u0026s=090e8010cda28a9adb16dfaf022b8382"},"favicon":"https://mintcdn.com/neoagent/5W3oClPQBV6lFR1g/favicon.png?fit=max\u0026auto=format\u0026n=5W3oClPQBV6lFR1g\u0026q=85\u0026s=5164157b0a6bf030ec592e23c172440a","appearance":{"default":"light"},"navbar":{"primary":{"type":"button","label":"Dashboard","href":"https://dashboard.neoagent.io"}},"footer":{"socials":{"x":"https://x.com/NeoAgent_AI","linkedin":"https://www.linkedin.com/company/neoagent"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Website","icon":"globe","href":"https://neoagent.io"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"neoagent","hasAudioNarration":false,"actualSubdomain":"neoagent","customDomains":["docs.neoagent.io"],"gitSource":{"type":"github","owner":"chatmsp","repo":"neo-agent","deployBranch":"development","contentDirectory":"mintlify_docs","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af5c8aa55c1ebcca522ad5d","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"default","tag":"Guides","count":808},{"language":"default","tag":"Integrations","count":500},{"language":"default","tag":"API reference","count":343},{"language":"default","tag":"Endpoints","count":338},{"language":"default","tag":"Triggered \u0026 Scheduled Agents","count":239},{"language":"default","tag":"Tools","count":233},{"language":"default","tag":"Business","count":110},{"language":"default","tag":"Security","count":101},{"language":"default","tag":"Service Desk","count":94},{"language":"default","tag":"Infrastructure","count":80}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".perm-list{display:flex;flex-direction:column;gap:0;margin:0.25rem 0 0.5rem}.perm-row{display:grid;grid-template-columns:minmax(9rem, 13rem) 1fr;gap:0.5rem 1rem;align-items:start;padding:0.7rem 0;border-bottom:1px solid rgb(229 231 235)}.perm-row:last-child{border-bottom:none;padding-bottom:0}.perm-row:first-child{padding-top:0}.perm-label{font-weight:600;font-size:0.875rem;line-height:1.4;color:rgb(17 24 39);padding-top:0.15rem}.perm-list{display:flex;flex-direction:column;gap:0;margin:0.25rem 0 0.5rem;width:100%}.perm-chips{display:grid;grid-template-columns:repeat(auto-fill, minmax(14rem, 1fr));gap:0.4rem;margin:0.15rem 0 0.25rem;width:100%}.perm-list .perm-chips{display:flex;flex-wrap:wrap;margin:0;grid-template-columns:none}.perm-chip{display:inline-flex;align-items:center;justify-content:flex-start;padding:0.15rem 0.55rem;border-radius:9999px;font-size:0.8125rem;line-height:1.25rem;background:rgb(243 244 246);border:1px solid rgb(229 231 235);color:rgb(55 65 81);white-space:nowrap}html.dark .perm-row{border-bottom-color:rgb(55 65 81)}html.dark .perm-label{color:rgb(243 244 246)}html.dark .perm-chip{background:rgb(31 41 55);border-color:rgb(75 85 99);color:rgb(229 231 235)}#content table{width:100%!important;min-width:100%!important;max-width:100%!important;table-layout:fixed!important;border-collapse:separate!important;border-spacing:0!important;border:1px solid rgb(229 231 235);border-radius:0.75rem;overflow:hidden}#content thead th{background:rgb(249 250 251);font-size:0.75rem;letter-spacing:0.03em;text-transform:uppercase}#content th,#content td{padding:0.7rem 1rem!important;vertical-align:top;overflow-wrap:break-word}#content th:first-child,#content td:first-child{width:24%;font-weight:600;white-space:normal}#content tbody tr:nth-child(even) td{background:rgb(249 250 251)}html.dark #content table{border-color:rgb(55 65 81)}html.dark #content thead th,html.dark #content tbody tr:nth-child(even) td{background:rgb(31 41 55)}"}],"page":{"pagePath":"api-reference/agents/update-an-agent","slug":"/api-reference/agents/update-an-agent","pageMetadata":{"title":"Update an agent","description":"Accepts **PUT** or **PATCH** (identical partial-merge semantics). Partial-patches an agent — only the fields you send change. `autonomy_type`, `entity_type`, and `trigger_type` are immutable — `trigger_type` may be sent but must match the agent's current value, and a differing value returns 400. 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) — 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 — a PUT can never drop or reorder an action (do structural pipeline edits in the dashboard). A change to the `python_code` of a `DATA_ANALYSIS` action (a saved report) returns 400. On a `TRIAGE_TICKET` / `TRIAGE_TIME_ENTRY` action, `fields_to_triage` is a list and so replaces wholesale under the normal merge — send `fields_to_triage_edits` in that action's `input_as_dict` to change one field keyed by `field_name`: a matching entry merges key-by-key (every other triage field stays byte-identical), an unmatched one is appended (`field_name` is the only setting it must carry), and an entry carrying `remove: true` drops its target instead of editing it — a removal names its target and nothing else, must match a configured field (a no-match returns 400 rather than silently doing nothing), and cannot remove the last remaining field. A PSA-unsupported `field_name` returns 400, and sending both `fields_to_triage` and `fields_to_triage_edits` in one action returns 400. Use the `field_name` spelling `GET /agents/\u003cid>` returns (the PSA name, e.g. `contact`, `customFields`); the enum member name (`CONTACT`, `CUSTOM_FIELD`) is also accepted. A custom field is keyed by `field_name` (`customFields`) plus `custom_field_name`, since all custom fields share one `field_name` — send both to target the right one. 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 — e.g. `{\"agent_settings\": {\"custom_instructions\": \"…\"}}` edits only the instructions and leaves `test_mode`/`model`/`til_channel` intact, sending one integration's permissions leaves the others connected, and `{\"schedule\": {\"timezone\": \"…\"}}` leaves the run cadence and business-hours windows intact. An update never adds a `ticket_cooldown_hours` you did not send. To edit a long `custom_instructions` runbook without resending the whole blob, send `agent_settings_edits.custom_instructions` with either `edits` (a list of exact `old_string`/`new_string` search-replaces — each must match exactly once, or pass `replace_all`; zero or multiple matches reject the request and write nothing) or `append` (text added with a newline separator). An optional `base_hash` (`sha256:…` of the instructions you read) gives optimistic concurrency: a stale hash returns 409 `agent_stale_write` instead of clobbering a concurrent dashboard edit. This form is mutually exclusive with a full `agent_settings.custom_instructions` in the same request (400), and applies only to AGENTIC / CONVERSATIONAL agents (CHAINED_ACTIONS has no agent_settings layer → 400). 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. An update that turns a scheduled Agent on, or makes an enabled one run more often, when its estimated cost reaches 25% of the workspace's monthly credits (`GET /agents/{id}/cost-estimate`), returns 409 `estimated_cost_confirmation_required` with the estimate in `error.details.estimate` and changes nothing; send the same body with `confirm_estimated_cost: true` once the person who pays has agreed. An update that keeps an enabled agent's schedule, or runs it less often, never asks. An update that turns on `use_round_robin` for a `DISPATCH_TICKET` action returns `meta.warnings` naming what round robin ignores; pass it to the person.","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/agents/{agent_id}","href":"/api-reference/agents/update-an-agent","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Accepts \", _jsx(_components.strong, {\n children: \"PUT\"\n }), \" or \", _jsx(_components.strong, {\n children: \"PATCH\"\n }), \" (identical partial-merge semantics). Partial-patches an agent — only the fields you send change. \", _jsx(_components.code, {\n children: \"autonomy_type\"\n }), \", \", _jsx(_components.code, {\n children: \"entity_type\"\n }), \", and \", _jsx(_components.code, {\n children: \"trigger_type\"\n }), \" are immutable — \", _jsx(_components.code, {\n children: \"trigger_type\"\n }), \" may be sent but must match the agent’s current value, and a differing value returns 400. Send updated \", _jsx(_components.code, {\n children: \"ticket_conditions\"\n }), \" / \", _jsx(_components.code, {\n children: \"time_entry_conditions\"\n }), \" to change the entity filter; the server rebuilds the \", _jsx(_components.code, {\n children: \"FIND_ENTITIES\"\n }), \" action. \", _jsx(_components.code, {\n children: \"actions\"\n }), \" is the pipeline AFTER \", _jsx(_components.code, {\n children: \"FIND_ENTITIES\"\n }), \" (CHAINED_ACTIONS only) — patching \", _jsx(_components.code, {\n children: \"actions\"\n }), \" on an AGENTIC agent or conditions on a CONVERSATIONAL agent returns 400. An \", _jsx(_components.code, {\n children: \"actions\"\n }), \" patch MERGES per-action: each entry targets one existing action by \", _jsx(_components.code, {\n children: \"id\"\n }), \" (or unique \", _jsx(_components.code, {\n children: \"action_type\"\n }), \") and its \", _jsx(_components.code, {\n children: \"input_as_dict\"\n }), \" 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 — a PUT can never drop or reorder an action (do structural pipeline edits in the dashboard). A change to the \", _jsx(_components.code, {\n children: \"python_code\"\n }), \" of a \", _jsx(_components.code, {\n children: \"DATA_ANALYSIS\"\n }), \" action (a saved report) returns 400. On a \", _jsx(_components.code, {\n children: \"TRIAGE_TICKET\"\n }), \" / \", _jsx(_components.code, {\n children: \"TRIAGE_TIME_ENTRY\"\n }), \" action, \", _jsx(_components.code, {\n children: \"fields_to_triage\"\n }), \" is a list and so replaces wholesale under the normal merge — send \", _jsx(_components.code, {\n children: \"fields_to_triage_edits\"\n }), \" in that action’s \", _jsx(_components.code, {\n children: \"input_as_dict\"\n }), \" to change one field keyed by \", _jsx(_components.code, {\n children: \"field_name\"\n }), \": a matching entry merges key-by-key (every other triage field stays byte-identical), an unmatched one is appended (\", _jsx(_components.code, {\n children: \"field_name\"\n }), \" is the only setting it must carry), and an entry carrying \", _jsx(_components.code, {\n children: \"remove: true\"\n }), \" drops its target instead of editing it — a removal names its target and nothing else, must match a configured field (a no-match returns 400 rather than silently doing nothing), and cannot remove the last remaining field. A PSA-unsupported \", _jsx(_components.code, {\n children: \"field_name\"\n }), \" returns 400, and sending both \", _jsx(_components.code, {\n children: \"fields_to_triage\"\n }), \" and \", _jsx(_components.code, {\n children: \"fields_to_triage_edits\"\n }), \" in one action returns 400. Use the \", _jsx(_components.code, {\n children: \"field_name\"\n }), \" spelling \", _jsx(_components.code, {\n children: \"GET /agents/\u003cid>\"\n }), \" returns (the PSA name, e.g. \", _jsx(_components.code, {\n children: \"contact\"\n }), \", \", _jsx(_components.code, {\n children: \"customFields\"\n }), \"); the enum member name (\", _jsx(_components.code, {\n children: \"CONTACT\"\n }), \", \", _jsx(_components.code, {\n children: \"CUSTOM_FIELD\"\n }), \") is also accepted. A custom field is keyed by \", _jsx(_components.code, {\n children: \"field_name\"\n }), \" (\", _jsx(_components.code, {\n children: \"customFields\"\n }), \") plus \", _jsx(_components.code, {\n children: \"custom_field_name\"\n }), \", since all custom fields share one \", _jsx(_components.code, {\n children: \"field_name\"\n }), \" — send both to target the right one. A \", _jsx(_components.code, {\n children: \"toolbox\"\n }), \" patch also MERGES per tool: each entry under \", _jsx(_components.code, {\n children: \"tool_settings_by_type\"\n }), \" is merged key-by-key onto that tool’s current settings (lists like \", _jsx(_components.code, {\n children: \"allowed_users\"\n }), \" replace; \", _jsx(_components.code, {\n children: \"null\"\n }), \" for a tool key disables it), so changing one tool’s setting no longer requires resending the whole toolbox. \", _jsx(_components.code, {\n children: \"agent_settings\"\n }), \", \", _jsx(_components.code, {\n children: \"integrations\"\n }), \", \", _jsx(_components.code, {\n children: \"schedule\"\n }), \", and \", _jsx(_components.code, {\n children: \"callback_settings\"\n }), \" MERGE the same way: send only the fields you’re changing — e.g. \", _jsx(_components.code, {\n children: \"{\\\"agent_settings\\\": {\\\"custom_instructions\\\": \\\"…\\\"}}\"\n }), \" edits only the instructions and leaves \", _jsx(_components.code, {\n children: \"test_mode\"\n }), \"/\", _jsx(_components.code, {\n children: \"model\"\n }), \"/\", _jsx(_components.code, {\n children: \"til_channel\"\n }), \" intact, sending one integration’s permissions leaves the others connected, and \", _jsx(_components.code, {\n children: \"{\\\"schedule\\\": {\\\"timezone\\\": \\\"…\\\"}}\"\n }), \" leaves the run cadence and business-hours windows intact. An update never adds a \", _jsx(_components.code, {\n children: \"ticket_cooldown_hours\"\n }), \" you did not send. To edit a long \", _jsx(_components.code, {\n children: \"custom_instructions\"\n }), \" runbook without resending the whole blob, send \", _jsx(_components.code, {\n children: \"agent_settings_edits.custom_instructions\"\n }), \" with either \", _jsx(_components.code, {\n children: \"edits\"\n }), \" (a list of exact \", _jsx(_components.code, {\n children: \"old_string\"\n }), \"/\", _jsx(_components.code, {\n children: \"new_string\"\n }), \" search-replaces — each must match exactly once, or pass \", _jsx(_components.code, {\n children: \"replace_all\"\n }), \"; zero or multiple matches reject the request and write nothing) or \", _jsx(_components.code, {\n children: \"append\"\n }), \" (text added with a newline separator). An optional \", _jsx(_components.code, {\n children: \"base_hash\"\n }), \" (\", _jsx(_components.code, {\n children: \"sha256:…\"\n }), \" of the instructions you read) gives optimistic concurrency: a stale hash returns 409 \", _jsx(_components.code, {\n children: \"agent_stale_write\"\n }), \" instead of clobbering a concurrent dashboard edit. This form is mutually exclusive with a full \", _jsx(_components.code, {\n children: \"agent_settings.custom_instructions\"\n }), \" in the same request (400), and applies only to AGENTIC / CONVERSATIONAL agents (CHAINED_ACTIONS has no agent_settings layer → 400). Refuses Neo-managed agents (403 \", _jsx(_components.code, {\n children: \"agent_managed_by_neo\"\n }), \"). Editing \", _jsx(_components.code, {\n children: \"actions\"\n }), \", \", _jsx(_components.code, {\n children: \"agent_settings\"\n }), \", \", _jsx(_components.code, {\n children: \"toolbox\"\n }), \", \", _jsx(_components.code, {\n children: \"integrations\"\n }), \", or the conditions is a destructive change (triggers a TIL approval when an agent makes the call via \", _jsx(_components.code, {\n children: \"NEO_API_REQUEST\"\n }), \"). 409 \", _jsx(_components.code, {\n children: \"agent_update_conflict\"\n }), \" on a concurrent edit. An update that turns a scheduled Agent on, or makes an enabled one run more often, when its estimated cost reaches 25% of the workspace’s monthly credits (\", _jsx(_components.code, {\n children: \"GET /agents/{id}/cost-estimate\"\n }), \"), returns 409 \", _jsx(_components.code, {\n children: \"estimated_cost_confirmation_required\"\n }), \" with the estimate in \", _jsx(_components.code, {\n children: \"error.details.estimate\"\n }), \" and changes nothing; send the same body with \", _jsx(_components.code, {\n children: \"confirm_estimated_cost: true\"\n }), \" once the person who pays has agreed. An update that keeps an enabled agent’s schedule, or runs it less often, never asks. An update that turns on \", _jsx(_components.code, {\n children: \"use_round_robin\"\n }), \" for a \", _jsx(_components.code, {\n children: \"DISPATCH_TICKET\"\n }), \" action returns \", _jsx(_components.code, {\n children: \"meta.warnings\"\n }), \" naming what round robin ignores; pass it to the person.\"]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Update an agent","description":"Accepts **PUT** or **PATCH** (identical partial-merge semantics). Partial-patches an agent — only the fields you send change. `autonomy_type`, `entity_type`, and `trigger_type` are immutable — `trigger_type` may be sent but must match the agent's current value, and a differing value returns 400. 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) — 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 — a PUT can never drop or reorder an action (do structural pipeline edits in the dashboard). A change to the `python_code` of a `DATA_ANALYSIS` action (a saved report) returns 400. On a `TRIAGE_TICKET` / `TRIAGE_TIME_ENTRY` action, `fields_to_triage` is a list and so replaces wholesale under the normal merge — send `fields_to_triage_edits` in that action's `input_as_dict` to change one field keyed by `field_name`: a matching entry merges key-by-key (every other triage field stays byte-identical), an unmatched one is appended (`field_name` is the only setting it must carry), and an entry carrying `remove: true` drops its target instead of editing it — a removal names its target and nothing else, must match a configured field (a no-match returns 400 rather than silently doing nothing), and cannot remove the last remaining field. A PSA-unsupported `field_name` returns 400, and sending both `fields_to_triage` and `fields_to_triage_edits` in one action returns 400. Use the `field_name` spelling `GET /agents/\u003cid>` returns (the PSA name, e.g. `contact`, `customFields`); the enum member name (`CONTACT`, `CUSTOM_FIELD`) is also accepted. A custom field is keyed by `field_name` (`customFields`) plus `custom_field_name`, since all custom fields share one `field_name` — send both to target the right one. 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 — e.g. `{\"agent_settings\": {\"custom_instructions\": \"…\"}}` edits only the instructions and leaves `test_mode`/`model`/`til_channel` intact, sending one integration's permissions leaves the others connected, and `{\"schedule\": {\"timezone\": \"…\"}}` leaves the run cadence and business-hours windows intact. An update never adds a `ticket_cooldown_hours` you did not send. To edit a long `custom_instructions` runbook without resending the whole blob, send `agent_settings_edits.custom_instructions` with either `edits` (a list of exact `old_string`/`new_string` search-replaces — each must match exactly once, or pass `replace_all`; zero or multiple matches reject the request and write nothing) or `append` (text added with a newline separator). An optional `base_hash` (`sha256:…` of the instructions you read) gives optimistic concurrency: a stale hash returns 409 `agent_stale_write` instead of clobbering a concurrent dashboard edit. This form is mutually exclusive with a full `agent_settings.custom_instructions` in the same request (400), and applies only to AGENTIC / CONVERSATIONAL agents (CHAINED_ACTIONS has no agent_settings layer → 400). 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. An update that turns a scheduled Agent on, or makes an enabled one run more often, when its estimated cost reaches 25% of the workspace's monthly credits (`GET /agents/{id}/cost-estimate`), returns 409 `estimated_cost_confirmation_required` with the estimate in `error.details.estimate` and changes nothing; send the same body with `confirm_estimated_cost: true` once the person who pays has agreed. An update that keeps an enabled agent's schedule, or runs it less often, never asks. An update that turns on `use_round_robin` for a `DISPATCH_TICKET` action returns `meta.warnings` naming what round robin ignores; pass it to the person.","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/agents/{agent_id}","href":"/api-reference/agents/update-an-agent","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"Accepts **PUT** or **PATCH** (identical partial-merge semantics). Partial-patches an agent — only the fields you send change. `autonomy_type`, `entity_type`, and `trigger_type` are immutable — `trigger_type` may be sent but must match the agent's current value, and a differing value returns 400. 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) — 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 — a PUT can never drop or reorder an action (do structural pipeline edits in the dashboard). A change to the `python_code` of a `DATA_ANALYSIS` action (a saved report) returns 400. On a `TRIAGE_TICKET` / `TRIAGE_TIME_ENTRY` action, `fields_to_triage` is a list and so replaces wholesale under the normal merge — send `fields_to_triage_edits` in that action's `input_as_dict` to change one field keyed by `field_name`: a matching entry merges key-by-key (every other triage field stays byte-identical), an unmatched one is appended (`field_name` is the only setting it must carry), and an entry carrying `remove: true` drops its target instead of editing it — a removal names its target and nothing else, must match a configured field (a no-match returns 400 rather than silently doing nothing), and cannot remove the last remaining field. A PSA-unsupported `field_name` returns 400, and sending both `fields_to_triage` and `fields_to_triage_edits` in one action returns 400. Use the `field_name` spelling `GET /agents/\u003cid>` returns (the PSA name, e.g. `contact`, `customFields`); the enum member name (`CONTACT`, `CUSTOM_FIELD`) is also accepted. A custom field is keyed by `field_name` (`customFields`) plus `custom_field_name`, since all custom fields share one `field_name` — send both to target the right one. 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 — e.g. `{\"agent_settings\": {\"custom_instructions\": \"…\"}}` edits only the instructions and leaves `test_mode`/`model`/`til_channel` intact, sending one integration's permissions leaves the others connected, and `{\"schedule\": {\"timezone\": \"…\"}}` leaves the run cadence and business-hours windows intact. An update never adds a `ticket_cooldown_hours` you did not send. To edit a long `custom_instructions` runbook without resending the whole blob, send `agent_settings_edits.custom_instructions` with either `edits` (a list of exact `old_string`/`new_string` search-replaces — each must match exactly once, or pass `replace_all`; zero or multiple matches reject the request and write nothing) or `append` (text added with a newline separator). An optional `base_hash` (`sha256:…` of the instructions you read) gives optimistic concurrency: a stale hash returns 409 `agent_stale_write` instead of clobbering a concurrent dashboard edit. This form is mutually exclusive with a full `agent_settings.custom_instructions` in the same request (400), and applies only to AGENTIC / CONVERSATIONAL agents (CHAINED_ACTIONS has no agent_settings layer → 400). 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. An update that turns a scheduled Agent on, or makes an enabled one run more often, when its estimated cost reaches 25% of the workspace's monthly credits (`GET /agents/{id}/cost-estimate`), returns 409 `estimated_cost_confirmation_required` with the estimate in `error.details.estimate` and changes nothing; send the same body with `confirm_estimated_cost: true` once the person who pays has agreed. An update that keeps an enabled agent's schedule, or runs it less often, never asks. An update that turns on `use_round_robin` for a `DISPATCH_TICKET` action returns `meta.warnings` naming what round robin ignores; pass it to the person.","operationId":"public_api.agents_update_put","parameters":["3dd49bd4-72b9-4e77-a567-6b7166d87043"],"requestBody":"62e251c0-6e49-4303-a21c-f306b77cfaa0","responses":{"200":"5f936587-c6a3-4125-b71f-fe4261fcf2e7","400":"2173d799-7ca4-4944-b37b-4c10b8764da9","401":"b0173310-b588-4e65-8f13-0ddc07ca6f66","403":"9c022238-ffbb-4026-abf3-a9b28b6f7da3","404":"6335ca61-f547-477e-9371-7e5135f0369b","409":"e42b114f-448e-4de3-8404-86dfbcd1904f","422":"f21fddcb-9205-4e74-9ea5-56df3780ba38","429":"4810a677-fbaf-4314-adcf-361ac8d25ee1","500":"60c0ee5d-19fc-448a-944d-422c6d92a01f"},"security":["bf402db4-ac3b-4734-b215-dfc520cb7c3a"],"summary":"Update an agent","tags":["Agents"],"method":"put","type":"path","servers":["576d0000-fa50-4b7c-b0b3-c173d983b590"],"path":"/public-api/agents/{agent_id}","baseUrlOptions":["https://api.neoagent.io"],"title":"Update an agent","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"3dd49bd4-72b9-4e77-a567-6b7166d87043":{"in":"path","name":"agent_id","required":true,"schema":{"type":"string","isRequired":true,"uniqueKey":"","typeLabel":"string"}}},"requestBody":{"content":{"application/json":{"examples":{"append_to_custom_instructions":{"title":"append_to_custom_instructions","value":{"agent_settings_edits":{"custom_instructions":{"append":"- Only cite ticket history you have actually read."}}}},"cosmetic_patch":{"title":"cosmetic_patch","value":{"name":"Triage agent (v2)"}},"disable_agent":{"title":"disable_agent","value":{"state":"DISABLED"}},"edit_one_triage_field":{"title":"edit_one_triage_field","value":{"actions":[{"id":"1422fbcf-fd01-4940-bd35-43aa8dabf636","input_as_dict":{"fields_to_triage_edits":[{"custom_instructions":"Route to James Everett when the ticket is about billing.","field_name":"contact"}]}}]}},"merge_one_action_setting":{"title":"merge_one_action_setting","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":{"title":"merge_one_toolbox_tool","value":{"toolbox":{"tool_settings_by_type":{"SEND_TEAMS_MESSAGE_TO_INTERNAL_TEAM":{"allowed_users":[{"id":"11111111-1111-1111-1111-111111111111","name":"Alex Doe"}],"channel_scope":"OFF","user_scope":"SPECIFIC"}}}}},"patch_ticket_conditions":{"title":"patch_ticket_conditions","value":{"ticket_conditions":{"conditions":{"combinator":"and","rules":[{"field":"priority","operator":"in","value":["high","urgent"]}]},"custom_field_conditions":null,"workload_conditions":null}}},"remove_one_triage_field":{"title":"remove_one_triage_field","value":{"actions":[{"id":"1422fbcf-fd01-4940-bd35-43aa8dabf636","input_as_dict":{"fields_to_triage_edits":[{"field_name":"priority","remove":true}]}}]}},"set_minutes_saved_per_run":{"title":"set_minutes_saved_per_run","value":{"manual_minutes_per_run_override":4}},"surgical_edit_custom_instructions":{"title":"surgical_edit_custom_instructions","value":{"agent_settings_edits":{"custom_instructions":{"base_hash":"sha256:7c1f…","edits":[{"new_string":"## Evidence rules\n- Only cite ticket history you have actually read.","old_string":"## Evidence rules"}]}}}}},"schema":{"description":"`PUT /public-api/agents/\u003cid>` body — a partial patch. Only the fields you send are\nchanged; everything else keeps its current value. `autonomy_type`, `entity_type`, and\n`trigger_type` are immutable: `autonomy_type`/`entity_type` aren't fields here at\nall, and `trigger_type` may be sent but must match the agent's current value — a differing\nvalue returns 400. 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) — do not include `FIND_ENTITIES` yourself.\n\n`actions` MERGES (ENG-5712): each entry targets one existing action by `id` (preferred —\nread it from `GET /agents/\u003cid>`) or, when `id` is omitted, by `action_type` if exactly one\nexisting action has that type. The targeted action keeps its other config — 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 — do structural pipeline edits (remove/reorder) in the dashboard.\n\nBecause an id-less entry matches by `action_type`, it can only ever ADD an action of a type\nthe agent does not already have. Send an id-less entry for a type that already has exactly one\naction and you EDIT that action (200), rather than adding a second one; two or more of that\ntype return 400. There is therefore no supported way to add a second action of an existing\ntype through this endpoint — add it in the dashboard.\n\nOn a `TRIAGE_TICKET` / `TRIAGE_TIME_ENTRY` action, `fields_to_triage` is a list and so replaces\nwholesale under that per-action merge; to change one triage field without resending the others\nsend `fields_to_triage_edits` in the action's `input_as_dict`. Each entry is keyed by\n`field_name`: a match merges key-by-key (every other triage field stays byte-identical), an\nunmatched `field_name` is appended (`field_name` is the only setting it must carry), an entry\ncarrying `remove: true` drops its target, a PSA-unsupported `field_name` is rejected 400, and\nsending both `fields_to_triage` and `fields_to_triage_edits` in one action is a 400. A removal\nnames its target and nothing else, must match a configured field, and cannot empty the list.\n\nA custom field is keyed by `field_name` AND `custom_field_name`, so an edit to one must send\nboth — `custom_field_name` alone says which custom field you mean. An edit that omits it keys\nto a different slot, matches nothing, and is appended as a new entry; on an enabled agent that\nentry is rejected 400 (`custom_triage_field_without_a_name`), because a custom field with no\nname triages nothing.\n\n`toolbox`, `agent_settings`, `integrations`, `schedule`, and `callback_settings` all MERGE the\nsame way (RFC 7396) — 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 — e.g. `allowed_users` — replace wholesale; a `null` tool key disables that tool).\n- `agent_settings` merges per field, so `{\"agent_settings\": {\"custom_instructions\": \"…\"}}`\n changes only the instructions and leaves `test_mode`, `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\": \"…\"}}` 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":{"oneOf":[{"type":"array","items":{"additionalProperties":true,"type":"object","uniqueKey":"actions.oneOf.0.items.[INDEX]","typeLabel":"object"},"title":"Actions","uniqueKey":"actions.oneOf.0","typeLabel":"Actions · object[]"},{"type":"null","title":"Actions","uniqueKey":"actions.oneOf.1","typeLabel":"null"}],"uniqueKey":"actions","typeLabel":"Actions · object[] | null"},"agent_settings":{"oneOf":[{"type":"object","title":"Agent Settings","additionalProperties":true,"uniqueKey":"agent_settings.oneOf.0","typeLabel":"Agent Settings · object"},{"type":"null","title":"Agent Settings","uniqueKey":"agent_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"agent_settings","typeLabel":"Agent Settings · object | null"},"agent_settings_edits":{"oneOf":[{"type":"object","title":"AgentSettingsEdits","description":"Surgical, config-preserving edits to `agent_settings` string fields. Today only\n`custom_instructions` is editable this way. Use this instead of sending the whole\n`agent_settings.custom_instructions` string when you want to change one span of a long runbook\nwithout a full read-modify-write of the blob. Mutually exclusive with a full\n`agent_settings.custom_instructions` in the same request.","required":["custom_instructions"],"properties":{"custom_instructions":{"description":"A surgical, config-preserving edit to an agent's `custom_instructions`.\nSend exactly ONE of `edits` or `append`:\n\n- `edits`: a list of exact search/replace edits (`old_string`/`new_string`/`replace_all`),\n the same primitive as `PATCH /public-api/skills/{id}` and the Claude Code Edit tool. Each\n `old_string` must match exactly ONCE (or pass `replace_all`) — zero or multiple matches\n reject the whole request and write nothing.\n- `append`: text added to the end of the current instructions with a newline separator. The\n cheapest form for \"add one rule to a long runbook\" — no read of the existing blob needed.\n\n`base_hash` is optional optimistic concurrency: the `sha256:…` hash of the instructions you\nread (skills-style). If the stored instructions changed since then, the edit is rejected with\n`409 agent_stale_write` instead of clobbering a concurrent dashboard edit.","properties":{"append":{"oneOf":[{"type":"string","title":"Append","uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions.append.oneOf.0","typeLabel":"string"},{"type":"null","title":"Append","uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions.append.oneOf.1","typeLabel":"null"}],"uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions.append","typeLabel":"string | null"},"base_hash":{"oneOf":[{"type":"string","title":"Base Hash","uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions.base_hash.oneOf.0","typeLabel":"string"},{"type":"null","title":"Base Hash","uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions.base_hash.oneOf.1","typeLabel":"null"}],"uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions.base_hash","typeLabel":"string | null"},"edits":{"oneOf":[{"type":"array","items":{"description":"A surgical search/replace on a text blob (the same primitive as the Claude Code\nEdit tool): find `old_string` exactly and swap it for `new_string`.","properties":{"new_string":{"title":"New String","type":"string","isRequired":true,"uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions.edits.oneOf.0.items.[INDEX].new_string","typeLabel":"string"},"old_string":{"title":"Old String","type":"string","isRequired":true,"uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions.edits.oneOf.0.items.[INDEX].old_string","typeLabel":"string"},"replace_all":{"default":false,"title":"Replace All","type":"boolean","uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions.edits.oneOf.0.items.[INDEX].replace_all","typeLabel":"boolean"}},"required":["old_string","new_string"],"title":"TextEdit","type":"object","uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions.edits.oneOf.0.items.[INDEX]","typeLabel":"TextEdit · object"},"title":"Edits","uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions.edits.oneOf.0","typeLabel":"TextEdit · object[]"},{"type":"null","title":"Edits","uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions.edits.oneOf.1","typeLabel":"null"}],"uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions.edits","typeLabel":"TextEdit · object[] | null"}},"title":"CustomInstructionsEdits","type":"object","isRequired":true,"uniqueKey":"agent_settings_edits.oneOf.0.custom_instructions","typeLabel":"CustomInstructionsEdits · object"}},"uniqueKey":"agent_settings_edits.oneOf.0","typeLabel":"AgentSettingsEdits · object"},{"type":"null","uniqueKey":"agent_settings_edits.oneOf.1","typeLabel":"null"}],"uniqueKey":"agent_settings_edits","typeLabel":"AgentSettingsEdits · object | null"},"callback_settings":{"oneOf":[{"type":"object","title":"Callback Settings","additionalProperties":true,"uniqueKey":"callback_settings.oneOf.0","typeLabel":"Callback Settings · object"},{"type":"null","title":"Callback Settings","uniqueKey":"callback_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"callback_settings","typeLabel":"Callback Settings · object | null"},"confirm_estimated_cost":{"default":false,"description":"Set to true to save a scheduled Agent whose estimated cost needs confirmation (see `GET /agents/{id}/cost-estimate`). Without it, a save that leaves a scheduled Agent ENABLED at an estimate of 25% or more of the monthly credits returns 409 `estimated_cost_confirmation_required`, with the estimate in `error.details.estimate`, and changes nothing, when it turns the agent on (a create defaults to ENABLED) or makes an enabled one run more often. Send it only after the person who pays has seen the estimate and agreed. Ignored everywhere else.","title":"Confirm Estimated Cost","type":"boolean","uniqueKey":"confirm_estimated_cost","typeLabel":"boolean"},"description":{"oneOf":[{"type":"string","title":"Description","uniqueKey":"description.oneOf.0","typeLabel":"string"},{"type":"null","title":"Description","uniqueKey":"description.oneOf.1","typeLabel":"null"}],"uniqueKey":"description","typeLabel":"string | null"},"group_name":{"oneOf":[{"type":"string","title":"Group Name","uniqueKey":"group_name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Group Name","uniqueKey":"group_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"group_name","typeLabel":"string | null"},"group_order":{"oneOf":[{"type":"integer","title":"Group Order","uniqueKey":"group_order.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Group Order","uniqueKey":"group_order.oneOf.1","typeLabel":"null"}],"uniqueKey":"group_order","typeLabel":"integer | null"},"integrations":{"oneOf":[{"type":"object","title":"Integrations","additionalProperties":true,"uniqueKey":"integrations.oneOf.0","typeLabel":"Integrations · object"},{"type":"null","title":"Integrations","uniqueKey":"integrations.oneOf.1","typeLabel":"null"}],"uniqueKey":"integrations","typeLabel":"Integrations · object | null"},"manual_minutes_per_run_override":{"oneOf":[{"type":"number","title":"Manual Minutes Per Run Override","description":"Minutes of technician time one successful run saves, as your team measured it. A triggered CHAINED_ACTIONS workflow only; a whole number from 1 to 1440. `null` restores the default, the sum of each action's fixed minutes (`manual_minutes_parts`). On an update, omit the key to keep the stored value.","uniqueKey":"manual_minutes_per_run_override.oneOf.0","typeLabel":"number"},{"type":"null","title":"Manual Minutes Per Run Override","description":"Minutes of technician time one successful run saves, as your team measured it. A triggered CHAINED_ACTIONS workflow only; a whole number from 1 to 1440. `null` restores the default, the sum of each action's fixed minutes (`manual_minutes_parts`). On an update, omit the key to keep the stored value.","uniqueKey":"manual_minutes_per_run_override.oneOf.1","typeLabel":"null"}],"uniqueKey":"manual_minutes_per_run_override","typeLabel":"number | null"},"name":{"oneOf":[{"type":"string","title":"Name","uniqueKey":"name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","uniqueKey":"name.oneOf.1","typeLabel":"null"}],"uniqueKey":"name","typeLabel":"string | null"},"opportunity_conditions":{"oneOf":[{"type":"object","title":"PsaConditions","description":"Trigger/entity filter for OPPORTUNITY agents (ConnectWise only) — which opportunities this agent fires on. Same shape as `ticket_conditions`; `GET /public-api/schemas/opportunity` lists the fields. An OPPORTUNITY agent filters with this field alone.","required":["conditions"],"properties":{"conditions":{"properties":{"combinator":{"enum":["and","or"],"title":"Combinator","type":"string","isRequired":true,"uniqueKey":"opportunity_conditions.oneOf.0.conditions.combinator","typeLabel":"enum\u003cstring>"},"rules":{"items":{"oneOf":[{"type":"object","title":"Rule","required":["field","operator","value"],"properties":{"field":{"title":"Field","type":"string","isRequired":true,"uniqueKey":"opportunity_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.field","typeLabel":"string"},"operator":{"enum":["=","!=","\u003c",">","\u003c=",">=","beginsWith","endsWith","contains","doesNotContain","doesNotBeginWith","doesNotEndWith","null","notNull","in","notIn"],"title":"Operator","type":"string","isRequired":true,"uniqueKey":"opportunity_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.operator","typeLabel":"enum\u003cstring>"},"value":{"oneOf":[{"title":"Value","isRequired":true}],"isRequired":true,"uniqueKey":"opportunity_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.value","typeLabel":"any"},"id":{"oneOf":[{"type":"string","title":"Id","uniqueKey":"opportunity_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","uniqueKey":"opportunity_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"opportunity_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"valueProviderInput":{"oneOf":[{"type":"string","title":"Valueproviderinput","uniqueKey":"opportunity_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.valueProviderInput.oneOf.0","typeLabel":"string"},{"type":"null","title":"Valueproviderinput","uniqueKey":"opportunity_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.valueProviderInput.oneOf.1","typeLabel":"null"}],"uniqueKey":"opportunity_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.valueProviderInput","typeLabel":"string | null"}},"uniqueKey":"opportunity_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0","typeLabel":"Rule · object"},{}],"uniqueKey":"opportunity_conditions.oneOf.0.conditions.rules.items.[INDEX]","typeLabel":"Rule · object"},"title":"Rules","type":"array","isRequired":true,"uniqueKey":"opportunity_conditions.oneOf.0.conditions.rules","typeLabel":"Rule · object[]"}},"required":["rules","combinator"],"title":"RulesGroup","type":"object","isRequired":true,"uniqueKey":"opportunity_conditions.oneOf.0.conditions","typeLabel":"RulesGroup · object"}},"uniqueKey":"opportunity_conditions.oneOf.0","typeLabel":"PsaConditions · object"},{"type":"null","description":"Trigger/entity filter for OPPORTUNITY agents (ConnectWise only) — which opportunities this agent fires on. Same shape as `ticket_conditions`; `GET /public-api/schemas/opportunity` lists the fields. An OPPORTUNITY agent filters with this field alone.","uniqueKey":"opportunity_conditions.oneOf.1","typeLabel":"null"}],"uniqueKey":"opportunity_conditions","typeLabel":"PsaConditions · object | null"},"process_entities_sequentially":{"oneOf":[{"type":"boolean","title":"Process Entities Sequentially","uniqueKey":"process_entities_sequentially.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Process Entities Sequentially","uniqueKey":"process_entities_sequentially.oneOf.1","typeLabel":"null"}],"uniqueKey":"process_entities_sequentially","typeLabel":"boolean | null"},"process_sub_entities_only_once":{"oneOf":[{"type":"boolean","title":"Process Sub Entities Only Once","uniqueKey":"process_sub_entities_only_once.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Process Sub Entities Only Once","uniqueKey":"process_sub_entities_only_once.oneOf.1","typeLabel":"null"}],"uniqueKey":"process_sub_entities_only_once","typeLabel":"boolean | null"},"schedule":{"oneOf":[{"type":"object","title":"Schedule","additionalProperties":true,"uniqueKey":"schedule.oneOf.0","typeLabel":"Schedule · object"},{"type":"null","title":"Schedule","uniqueKey":"schedule.oneOf.1","typeLabel":"null"}],"uniqueKey":"schedule","typeLabel":"Schedule · object | null"},"show_in_psa_pod":{"oneOf":[{"type":"boolean","title":"Show In Psa Pod","uniqueKey":"show_in_psa_pod.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Show In Psa Pod","uniqueKey":"show_in_psa_pod.oneOf.1","typeLabel":"null"}],"uniqueKey":"show_in_psa_pod","typeLabel":"boolean | null"},"state":{"oneOf":[{"type":"string","title":"WorkflowState","enum":["ENABLED","DISABLED","DELETED"],"uniqueKey":"state.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"state.oneOf.1","typeLabel":"null"}],"uniqueKey":"state","typeLabel":"enum\u003cstring> | null"},"ticket_conditions":{"oneOf":[{"type":"object","title":"PsaTicketConditions","description":"Trigger/entity filter — 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`). A TIME_ENTRY agent carries this field too — there it selects the tickets whose time entries are searched, and `time_entry_conditions` then selects the time entries on them. 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 — 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. A leaf's `value` is a single value; only the `in` and `notIn` operators take a list. A list under any other operator returns 400.","required":["conditions"],"properties":{"conditions":{"properties":{"combinator":{"enum":["and","or"],"title":"Combinator","type":"string","isRequired":true,"uniqueKey":"ticket_conditions.oneOf.0.conditions.combinator","typeLabel":"enum\u003cstring>"},"rules":{"items":{"oneOf":[{"type":"object","title":"Rule","required":["field","operator","value"],"properties":{"field":{"title":"Field","type":"string","isRequired":true,"uniqueKey":"ticket_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.field","typeLabel":"string"},"operator":{"enum":["=","!=","\u003c",">","\u003c=",">=","beginsWith","endsWith","contains","doesNotContain","doesNotBeginWith","doesNotEndWith","null","notNull","in","notIn"],"title":"Operator","type":"string","isRequired":true,"uniqueKey":"ticket_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.operator","typeLabel":"enum\u003cstring>"},"value":{"oneOf":[{"title":"Value","isRequired":true}],"isRequired":true,"uniqueKey":"ticket_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.value","typeLabel":"any"},"id":{"oneOf":[{"type":"string","title":"Id","uniqueKey":"ticket_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","uniqueKey":"ticket_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"ticket_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"valueProviderInput":{"oneOf":[{"type":"string","title":"Valueproviderinput","uniqueKey":"ticket_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.valueProviderInput.oneOf.0","typeLabel":"string"},{"type":"null","title":"Valueproviderinput","uniqueKey":"ticket_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.valueProviderInput.oneOf.1","typeLabel":"null"}],"uniqueKey":"ticket_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.valueProviderInput","typeLabel":"string | null"}},"uniqueKey":"ticket_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0","typeLabel":"Rule · object"},{}],"uniqueKey":"ticket_conditions.oneOf.0.conditions.rules.items.[INDEX]","typeLabel":"Rule · object"},"title":"Rules","type":"array","isRequired":true,"uniqueKey":"ticket_conditions.oneOf.0.conditions.rules","typeLabel":"Rule · object[]"}},"required":["rules","combinator"],"title":"RulesGroup","type":"object","isRequired":true,"uniqueKey":"ticket_conditions.oneOf.0.conditions","typeLabel":"RulesGroup · object"},"custom_field_conditions":{"oneOf":[{"properties":{"combinator":{"enum":["and","or"],"title":"Combinator","type":"string"},"conditions":{"items":{"properties":{"field":{"title":"Field","type":"string"},"operator":{"enum":["=","!=","\u003c",">","\u003c=",">=","contains","null","notNull"],"title":"Operator","type":"string","default":"="},"value":{"title":"Value","type":"string"}},"required":["field","value"],"title":"CustomFieldCondition","type":"object"},"title":"Conditions","type":"array"}},"required":["conditions","combinator"],"title":"Use Custom Field Conditions","type":"null","default":null,"uniqueKey":"ticket_conditions.oneOf.0.custom_field_conditions.oneOf.0","typeLabel":"null"},{"properties":{"combinator":{"enum":["and","or"],"title":"Combinator","type":"string","isRequired":true,"uniqueKey":"ticket_conditions.oneOf.0.custom_field_conditions.oneOf.1.combinator","typeLabel":"enum\u003cstring>"},"conditions":{"items":{"properties":{"field":{"title":"Field","type":"string","isRequired":true,"uniqueKey":"ticket_conditions.oneOf.0.custom_field_conditions.oneOf.1.conditions.items.[INDEX].field","typeLabel":"string"},"value":{"title":"Value","type":"string","isRequired":true,"uniqueKey":"ticket_conditions.oneOf.0.custom_field_conditions.oneOf.1.conditions.items.[INDEX].value","typeLabel":"string"},"operator":{"enum":["=","!=","\u003c",">","\u003c=",">=","contains","null","notNull"],"title":"Operator","type":"string","default":"=","uniqueKey":"ticket_conditions.oneOf.0.custom_field_conditions.oneOf.1.conditions.items.[INDEX].operator","typeLabel":"enum\u003cstring>"}},"required":["field","value"],"title":"CustomFieldCondition","type":"object","uniqueKey":"ticket_conditions.oneOf.0.custom_field_conditions.oneOf.1.conditions.items.[INDEX]","typeLabel":"CustomFieldCondition · object"},"title":"Conditions","type":"array","isRequired":true,"uniqueKey":"ticket_conditions.oneOf.0.custom_field_conditions.oneOf.1.conditions","typeLabel":"CustomFieldCondition · object[]"}},"required":["conditions","combinator"],"title":"Use Custom Field Conditions","type":"object","default":null,"uniqueKey":"ticket_conditions.oneOf.0.custom_field_conditions.oneOf.1","typeLabel":"Use Custom Field Conditions · object"}],"uniqueKey":"ticket_conditions.oneOf.0.custom_field_conditions","typeLabel":"null | Use Custom Field Conditions · object"},"workload_conditions":{"oneOf":[{"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":"Workload Conditions","type":"null","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.","uniqueKey":"ticket_conditions.oneOf.0.workload_conditions.oneOf.0","typeLabel":"null"},{"properties":{"end_date_excluding":{"format":"date","title":"End Date Excluding","type":"string","isRequired":true,"uniqueKey":"ticket_conditions.oneOf.0.workload_conditions.oneOf.1.end_date_excluding","typeLabel":"string\u003cdate>"},"start_date_including":{"format":"date","title":"Start Date Including","type":"string","isRequired":true,"uniqueKey":"ticket_conditions.oneOf.0.workload_conditions.oneOf.1.start_date_including","typeLabel":"string\u003cdate>"},"companies":{"description":"The names of the companies to filter tickets by. Empty list means no filtering by company","items":{"type":"string","uniqueKey":"ticket_conditions.oneOf.0.workload_conditions.oneOf.1.companies.items.[INDEX]","typeLabel":"string"},"title":"Companies","type":"array","uniqueKey":"ticket_conditions.oneOf.0.workload_conditions.oneOf.1.companies","typeLabel":"string[]"}},"required":["start_date_including","end_date_excluding"],"title":"Workload Conditions","type":"object","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.","uniqueKey":"ticket_conditions.oneOf.0.workload_conditions.oneOf.1","typeLabel":"Workload Conditions · object"}],"uniqueKey":"ticket_conditions.oneOf.0.workload_conditions","typeLabel":"null | Workload Conditions · object"}},"uniqueKey":"ticket_conditions.oneOf.0","typeLabel":"PsaTicketConditions · object"},{"type":"null","description":"Trigger/entity filter — 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`). A TIME_ENTRY agent carries this field too — there it selects the tickets whose time entries are searched, and `time_entry_conditions` then selects the time entries on them. 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 — 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. A leaf's `value` is a single value; only the `in` and `notIn` operators take a list. A list under any other operator returns 400.","uniqueKey":"ticket_conditions.oneOf.1","typeLabel":"null"}],"uniqueKey":"ticket_conditions","typeLabel":"PsaTicketConditions · object | null"},"time_entry_conditions":{"oneOf":[{"type":"object","title":"PsaConditions","description":"Trigger/entity filter for TIME_ENTRY agents — which time entries this agent fires on, on the tickets `ticket_conditions` selected. Same shape as `ticket_conditions`. Ignored for TICKET agents.","required":["conditions"],"properties":{"conditions":{"properties":{"combinator":{"enum":["and","or"],"title":"Combinator","type":"string","isRequired":true,"uniqueKey":"time_entry_conditions.oneOf.0.conditions.combinator","typeLabel":"enum\u003cstring>"},"rules":{"items":{"oneOf":[{"type":"object","title":"Rule","required":["field","operator","value"],"properties":{"field":{"title":"Field","type":"string","isRequired":true,"uniqueKey":"time_entry_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.field","typeLabel":"string"},"operator":{"enum":["=","!=","\u003c",">","\u003c=",">=","beginsWith","endsWith","contains","doesNotContain","doesNotBeginWith","doesNotEndWith","null","notNull","in","notIn"],"title":"Operator","type":"string","isRequired":true,"uniqueKey":"time_entry_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.operator","typeLabel":"enum\u003cstring>"},"value":{"oneOf":[{"title":"Value","isRequired":true}],"isRequired":true,"uniqueKey":"time_entry_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.value","typeLabel":"any"},"id":{"oneOf":[{"type":"string","title":"Id","uniqueKey":"time_entry_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","uniqueKey":"time_entry_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"time_entry_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"valueProviderInput":{"oneOf":[{"type":"string","title":"Valueproviderinput","uniqueKey":"time_entry_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.valueProviderInput.oneOf.0","typeLabel":"string"},{"type":"null","title":"Valueproviderinput","uniqueKey":"time_entry_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.valueProviderInput.oneOf.1","typeLabel":"null"}],"uniqueKey":"time_entry_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0.valueProviderInput","typeLabel":"string | null"}},"uniqueKey":"time_entry_conditions.oneOf.0.conditions.rules.items.[INDEX].oneOf.0","typeLabel":"Rule · object"},{}],"uniqueKey":"time_entry_conditions.oneOf.0.conditions.rules.items.[INDEX]","typeLabel":"Rule · object"},"title":"Rules","type":"array","isRequired":true,"uniqueKey":"time_entry_conditions.oneOf.0.conditions.rules","typeLabel":"Rule · object[]"}},"required":["rules","combinator"],"title":"RulesGroup","type":"object","isRequired":true,"uniqueKey":"time_entry_conditions.oneOf.0.conditions","typeLabel":"RulesGroup · object"}},"uniqueKey":"time_entry_conditions.oneOf.0","typeLabel":"PsaConditions · object"},{"type":"null","description":"Trigger/entity filter for TIME_ENTRY agents — which time entries this agent fires on, on the tickets `ticket_conditions` selected. Same shape as `ticket_conditions`. Ignored for TICKET agents.","uniqueKey":"time_entry_conditions.oneOf.1","typeLabel":"null"}],"uniqueKey":"time_entry_conditions","typeLabel":"PsaConditions · object | null"},"toolbox":{"oneOf":[{"type":"object","title":"Toolbox","additionalProperties":true,"uniqueKey":"toolbox.oneOf.0","typeLabel":"Toolbox · object"},{"type":"null","title":"Toolbox","uniqueKey":"toolbox.oneOf.1","typeLabel":"null"}],"uniqueKey":"toolbox","typeLabel":"Toolbox · object | null"},"trigger_type":{"oneOf":[{"type":"string","title":"WorkflowTriggerType","enum":["SCHEDULED","TRIGGERED","NONE"],"uniqueKey":"trigger_type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"trigger_type.oneOf.1","typeLabel":"null"}],"uniqueKey":"trigger_type","typeLabel":"enum\u003cstring> | null"}},"title":"UpdateAgentRequest","type":"object","uniqueKey":"","typeLabel":"UpdateAgentRequest · object"},"exampleType":"examples"}},"required":true,"exampleType":"examples"},"responses":{"5f936587-c6a3-4125-b71f-fe4261fcf2e7":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"Lean summary of a workflow row — the per-item shape `GET /public-api/agents`\n(list) returns. The single-resource `GET /public-api/agents/\u003cid>` returns the\nricher `AgentDetail`; historical snapshots come back as `AgentVersion`.","properties":{"access":{"description":"Who, within the MSP's own staff, may message an INTERNAL chat agent.\n\nALL_USERS — 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 — 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 — it is never forced; even managed agents default to ALL_USERS.\nSPECIFIC_USERS — 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","isRequired":true,"uniqueKey":"data.access","typeLabel":"enum\u003cstring>"},"audience":{"description":"Trust domain a tool / agent / channel may be exposed to.\n\nMSP — 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 — 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","isRequired":true,"uniqueKey":"data.audience","typeLabel":"enum\u003cstring>"},"autonomy_type":{"enum":["CHAINED_ACTIONS","AGENTIC","CONVERSATIONAL"],"title":"AutonomyType","type":"string","isRequired":true,"uniqueKey":"data.autonomy_type","typeLabel":"enum\u003cstring>"},"created_at":{"format":"date-time","title":"Created At","type":"string","isRequired":true,"uniqueKey":"data.created_at","typeLabel":"string\u003cdate-time>"},"created_via":{"oneOf":[{"type":"string","title":"AgentCreatedVia","description":"Which door an agent was created through. Set once, by the server, never by the caller.","enum":["EDITOR","NEO_SUPPORT","PUBLIC_API"],"isRequired":true,"uniqueKey":"data.created_via.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","isRequired":true,"uniqueKey":"data.created_via.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.created_via","typeLabel":"enum\u003cstring> | null"},"entity_type":{"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","isRequired":true,"uniqueKey":"data.entity_type","typeLabel":"enum\u003cstring>"},"group_name":{"oneOf":[{"type":"string","title":"Group Name","isRequired":true,"uniqueKey":"data.group_name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Group Name","isRequired":true,"uniqueKey":"data.group_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.group_name","typeLabel":"string | null"},"group_order":{"title":"Group Order","type":"integer","isRequired":true,"uniqueKey":"data.group_order","typeLabel":"integer"},"id":{"title":"Id","type":"string","isRequired":true,"uniqueKey":"data.id","typeLabel":"string"},"name":{"title":"Name","type":"string","isRequired":true,"uniqueKey":"data.name","typeLabel":"string"},"source_template_id":{"oneOf":[{"type":"integer","title":"Source Template Id","isRequired":true,"uniqueKey":"data.source_template_id.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Source Template Id","isRequired":true,"uniqueKey":"data.source_template_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.source_template_id","typeLabel":"integer | null"},"state":{"enum":["ENABLED","DISABLED","DELETED"],"title":"WorkflowState","type":"string","isRequired":true,"uniqueKey":"data.state","typeLabel":"enum\u003cstring>"},"trigger_type":{"enum":["SCHEDULED","TRIGGERED","NONE"],"title":"WorkflowTriggerType","type":"string","isRequired":true,"uniqueKey":"data.trigger_type","typeLabel":"enum\u003cstring>"},"updated_at":{"format":"date-time","title":"Updated At","type":"string","isRequired":true,"uniqueKey":"data.updated_at","typeLabel":"string\u003cdate-time>"}},"required":["id","name","state","autonomy_type","entity_type","trigger_type","audience","access","created_at","updated_at","source_template_id","created_via","group_name","group_order"],"title":"Agent","type":"object","isRequired":true,"uniqueKey":"data","typeLabel":"Agent · object"},"meta":{"properties":{"request_id":{"format":"uuid","type":"string","isRequired":true,"uniqueKey":"meta.request_id","typeLabel":"string\u003cuuid>"},"timings_ms":{"additionalProperties":{"type":"number","uniqueKey":"meta.timings_ms.additionalProperties","typeLabel":"number"},"type":"object","isRequired":true,"uniqueKey":"meta.timings_ms","typeLabel":"object"},"pagination":{"properties":{"has_more":{"type":"boolean","isRequired":true,"uniqueKey":"meta.pagination.has_more","typeLabel":"boolean"},"next_cursor":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"meta.pagination.next_cursor.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"meta.pagination.next_cursor.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"meta.pagination.next_cursor","typeLabel":"string | null"}},"required":["next_cursor","has_more"],"type":"object","uniqueKey":"meta.pagination","typeLabel":"object"},"warnings":{"description":"Non-fatal warnings about the created/updated resource (e.g. an unhealthy PSA callback).","items":{"type":"string","uniqueKey":"meta.warnings.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"meta.warnings","typeLabel":"string[]"}},"required":["request_id","timings_ms"],"type":"object","isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"required":["data","meta"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"access":"ALL_USERS","audience":"MSP","autonomy_type":"CHAINED_ACTIONS","created_at":"2023-11-07T05:31:56Z","created_via":"EDITOR","entity_type":"ticket","group_name":"\u003cstring>","group_order":123,"id":"\u003cstring>","name":"\u003cstring>","source_template_id":123,"state":"ENABLED","trigger_type":"SCHEDULED","updated_at":"2023-11-07T05:31:56Z"},"meta":{"request_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","timings_ms":{},"pagination":{"has_more":true,"next_cursor":"\u003cstring>"},"warnings":["\u003cstring>"]}}}},"exampleType":"generated"}},"description":"Success.","exampleType":"generated"},"2173d799-7ca4-4944-b37b-4c10b8764da9":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"description":"Stable machine-readable error code.","type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"additionalProperties":true,"type":"object","uniqueKey":"error.details","typeLabel":"object"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"properties":{"request_id":{"oneOf":[{"format":"uuid","type":"string","uniqueKey":"meta.request_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"format":"uuid","type":"null","uniqueKey":"meta.request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"meta.request_id","typeLabel":"string\u003cuuid> | null"}},"type":"object","isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"required":["error","meta"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","details":{}},"meta":{"request_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}}}},"exampleType":"generated"}},"description":"Bad request — malformed input.","exampleType":"generated"},"b0173310-b588-4e65-8f13-0ddc07ca6f66":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"description":"Stable machine-readable error code.","type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"additionalProperties":true,"type":"object","uniqueKey":"error.details","typeLabel":"object"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"properties":{"request_id":{"oneOf":[{"format":"uuid","type":"string","uniqueKey":"meta.request_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"format":"uuid","type":"null","uniqueKey":"meta.request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"meta.request_id","typeLabel":"string\u003cuuid> | null"}},"type":"object","isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"required":["error","meta"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","details":{}},"meta":{"request_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}}}},"exampleType":"generated"}},"description":"Unauthenticated — missing or invalid credentials.","exampleType":"generated"},"9c022238-ffbb-4026-abf3-a9b28b6f7da3":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"description":"Stable machine-readable error code.","type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"additionalProperties":true,"type":"object","uniqueKey":"error.details","typeLabel":"object"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"properties":{"request_id":{"oneOf":[{"format":"uuid","type":"string","uniqueKey":"meta.request_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"format":"uuid","type":"null","uniqueKey":"meta.request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"meta.request_id","typeLabel":"string\u003cuuid> | null"}},"type":"object","isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"required":["error","meta"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","details":{}},"meta":{"request_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}}}},"exampleType":"generated"}},"description":"Forbidden — authenticated but not allowed.","exampleType":"generated"},"6335ca61-f547-477e-9371-7e5135f0369b":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"description":"Stable machine-readable error code.","type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"additionalProperties":true,"type":"object","uniqueKey":"error.details","typeLabel":"object"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"properties":{"request_id":{"oneOf":[{"format":"uuid","type":"string","uniqueKey":"meta.request_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"format":"uuid","type":"null","uniqueKey":"meta.request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"meta.request_id","typeLabel":"string\u003cuuid> | null"}},"type":"object","isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"required":["error","meta"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","details":{}},"meta":{"request_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}}}},"exampleType":"generated"}},"description":"Not found.","exampleType":"generated"},"e42b114f-448e-4de3-8404-86dfbcd1904f":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"description":"Stable machine-readable error code.","type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"additionalProperties":true,"type":"object","uniqueKey":"error.details","typeLabel":"object"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"properties":{"request_id":{"oneOf":[{"format":"uuid","type":"string","uniqueKey":"meta.request_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"format":"uuid","type":"null","uniqueKey":"meta.request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"meta.request_id","typeLabel":"string\u003cuuid> | null"}},"type":"object","isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"required":["error","meta"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","details":{}},"meta":{"request_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}}}},"exampleType":"generated"}},"description":"Conflict — the resource is in a state that blocks this operation.","exampleType":"generated"},"f21fddcb-9205-4e74-9ea5-56df3780ba38":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"description":"Stable machine-readable error code.","type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"additionalProperties":true,"type":"object","uniqueKey":"error.details","typeLabel":"object"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"properties":{"request_id":{"oneOf":[{"format":"uuid","type":"string","uniqueKey":"meta.request_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"format":"uuid","type":"null","uniqueKey":"meta.request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"meta.request_id","typeLabel":"string\u003cuuid> | null"}},"type":"object","isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"required":["error","meta"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","details":{}},"meta":{"request_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}}}},"exampleType":"generated"}},"description":"Request validation failed.","exampleType":"generated"},"4810a677-fbaf-4314-adcf-361ac8d25ee1":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"description":"Stable machine-readable error code.","type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"additionalProperties":true,"type":"object","uniqueKey":"error.details","typeLabel":"object"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"properties":{"request_id":{"oneOf":[{"format":"uuid","type":"string","uniqueKey":"meta.request_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"format":"uuid","type":"null","uniqueKey":"meta.request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"meta.request_id","typeLabel":"string\u003cuuid> | null"}},"type":"object","isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"required":["error","meta"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","details":{}},"meta":{"request_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}}}},"exampleType":"generated"}},"description":"Rate limited — see Retry-After.","exampleType":"generated"},"60c0ee5d-19fc-448a-944d-422c6d92a01f":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"description":"Stable machine-readable error code.","type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"additionalProperties":true,"type":"object","uniqueKey":"error.details","typeLabel":"object"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"properties":{"request_id":{"oneOf":[{"format":"uuid","type":"string","uniqueKey":"meta.request_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"format":"uuid","type":"null","uniqueKey":"meta.request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"meta.request_id","typeLabel":"string\u003cuuid> | null"}},"type":"object","isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"required":["error","meta"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","details":{}},"meta":{"request_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"}}}},"exampleType":"generated"}},"description":"Internal server error.","exampleType":"generated"}},"security":{"bf402db4-ac3b-4734-b215-dfc520cb7c3a":{"bearerAuth":{"description":"`Authorization: Bearer \u003ctoken>` where `\u003ctoken>` is either a `neo_sk_\u003cenv>_\u003csecret>` API key (service account) or a Microsoft Entra ID access token (dashboard user).","scheme":"bearer","type":"http","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"576d0000-fa50-4b7c-b0b3-c173d983b590":{"url":"https://api.neoagent.io"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"description":"`Authorization: Bearer \u003ctoken>` where `\u003ctoken>` is either a `neo_sk_\u003cenv>_\u003csecret>` API key (service account) or a Microsoft Entra ID access token (dashboard user).","scheme":"bearer","type":"http","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"`Authorization: Bearer \u003ctoken>` where `\u003ctoken>` is either a `neo_sk_\u003cenv>_\u003csecret>` API key (service account) or a Microsoft Entra ID access token (dashboard user).","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"https://api.neoagent.io/public-api/openapi.json"},"subdomain":"neoagent","siteName":"Neo Agent","title":"Update an agent - Neo Agent","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-12T13:28:03.443Z","originalFileLocation":"api-reference/agents/update-an-agent.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Accepts PUT or PATCH (identical partial-merge semantics). Partial-patches an agent — only the fields you send change. autonomy_type, entity_type, and trigger_type are immutable — trigger_type may be sent but must match the agent\u0026#x27;s current value, and a differing value returns 400. 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) — 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 — a PUT can never drop or reorder an action (do structural pipeline edits in the dashboard). A change to the python_code of a DATA_ANALYSIS action (a saved report) returns 400. On a TRIAGE_TICKET / TRIAGE_TIME_ENTRY action, fields_to_triage is a list and so replaces wholesale under the normal merge — send fields_to_triage_edits in that action\u0026#x27;s input_as_dict to change one field keyed by field_name: a matching entry merges key-by-key (every other triage field stays byte-identical), an unmatched one is appended (field_name is the only setting it must carry), and an entry carrying remove: true drops its target instead of editing it — a removal names its target and nothing else, must match a configured field (a no-match returns 400 rather than silently doing nothing), and cannot remove the last remaining field. A PSA-unsupported field_name returns 400, and sending both fields_to_triage and fields_to_triage_edits in one action returns 400. Use the field_name spelling GET /agents/ returns (the PSA name, e.g. contact, customFields); the enum member name (CONTACT, CUSTOM_FIELD) is also accepted. A custom field is keyed by field_name (customFields) plus custom_field_name, since all custom fields share one field_name — send both to target the right one. A toolbox patch also MERGES per tool: each entry under tool_settings_by_type is merged key-by-key onto that tool\u0026#x27;s current settings (lists like allowed_users replace; null for a tool key disables it), so changing one tool\u0026#x27;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\u0026#x27;re changing — e.g. {\u0026quot;agent_settings\u0026quot;: {\u0026quot;custom_instructions\u0026quot;: \u0026quot;…\u0026quot;}} edits only the instructions and leaves test_mode/model/til_channel intact, sending one integration\u0026#x27;s permissions leaves the others connected, and {\u0026quot;schedule\u0026quot;: {\u0026quot;timezone\u0026quot;: \u0026quot;…\u0026quot;}} leaves the run cadence and business-hours windows intact. An update never adds a ticket_cooldown_hours you did not send. To edit a long custom_instructions runbook without resending the whole blob, send agent_settings_edits.custom_instructions with either edits (a list of exact old_string/new_string search-replaces — each must match exactly once, or pass replace_all; zero or multiple matches reject the request and write nothing) or append (text added with a newline separator). An optional base_hash (sha256:… of the instructions you read) gives optimistic concurrency: a stale hash returns 409 agent_stale_write instead of clobbering a concurrent dashboard edit. This form is mutually exclusive with a full agent_settings.custom_instructions in the same request (400), and applies only to AGENTIC / CONVERSATIONAL agents (CHAINED_ACTIONS has no agent_settings layer → 400). 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. An update that turns a scheduled Agent on, or makes an enabled one run more often, when its estimated cost reaches 25% of the workspace\u0026#x27;s monthly credits (GET /agents/{id}/cost-estimate), returns 409 estimated_cost_confirmation_required with the estimate in error.details.estimate and changes nothing; send the same body with confirm_estimated_cost: true once the person who pays has agreed. An update that keeps an enabled agent\u0026#x27;s schedule, or runs it less often, never asks. An update that turns on use_round_robin for a DISPATCH_TICKET action returns meta.warnings naming what round robin ignores; pass it to the person.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Neo Agent\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/neoagent/w6a7B12EcByGYRPp/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/neoagent/w6a7B12EcByGYRPp/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/neoagent/w6a7B12EcByGYRPp/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/neoagent/w6a7B12EcByGYRPp/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/neoagent/w6a7B12EcByGYRPp/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/neoagent/w6a7B12EcByGYRPp/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/neoagent/w6a7B12EcByGYRPp/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/neoagent/w6a7B12EcByGYRPp/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/neoagent/w6a7B12EcByGYRPp/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Update an agent - Neo Agent\">\u003cmeta data-mint-head property=\"og:description\" content=\"Accepts PUT or PATCH (identical partial-merge semantics). Partial-patches an agent — only the fields you send change. autonomy_type, entity_type, and trigger_type are immutable — trigger_type may be sent but must match the agent\u0026#x27;s current value, and a differing value returns 400. 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) — 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 — a PUT can never drop or reorder an action (do structural pipeline edits in the dashboard). A change to the python_code of a DATA_ANALYSIS action (a saved report) returns 400. On a TRIAGE_TICKET / TRIAGE_TIME_ENTRY action, fields_to_triage is a list and so replaces wholesale under the normal merge — send fields_to_triage_edits in that action\u0026#x27;s input_as_dict to change one field keyed by field_name: a matching entry merges key-by-key (every other triage field stays byte-identical), an unmatched one is appended (field_name is the only setting it must carry), and an entry carrying remove: true drops its target instead of editing it — a removal names its target and nothing else, must match a configured field (a no-match returns 400 rather than silently doing nothing), and cannot remove the last remaining field. A PSA-unsupported field_name returns 400, and sending both fields_to_triage and fields_to_triage_edits in one action returns 400. Use the field_name spelling GET /agents/ returns (the PSA name, e.g. contact, customFields); the enum member name (CONTACT, CUSTOM_FIELD) is also accepted. A custom field is keyed by field_name (customFields) plus custom_field_name, since all custom fields share one field_name — send both to target the right one. A toolbox patch also MERGES per tool: each entry under tool_settings_by_type is merged key-by-key onto that tool\u0026#x27;s current settings (lists like allowed_users replace; null for a tool key disables it), so changing one tool\u0026#x27;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\u0026#x27;re changing — e.g. {\u0026quot;agent_settings\u0026quot;: {\u0026quot;custom_instructions\u0026quot;: \u0026quot;…\u0026quot;}} edits only the instructions and leaves test_mode/model/til_channel intact, sending one integration\u0026#x27;s permissions leaves the others connected, and {\u0026quot;schedule\u0026quot;: {\u0026quot;timezone\u0026quot;: \u0026quot;…\u0026quot;}} leaves the run cadence and business-hours windows intact. An update never adds a ticket_cooldown_hours you did not send. To edit a long custom_instructions runbook without resending the whole blob, send agent_settings_edits.custom_instructions with either edits (a list of exact old_string/new_string search-replaces — each must match exactly once, or pass replace_all; zero or multiple matches reject the request and write nothing) or append (text added with a newline separator). An optional base_hash (sha256:… of the instructions you read) gives optimistic concurrency: a stale hash returns 409 agent_stale_write instead of clobbering a concurrent dashboard edit. This form is mutually exclusive with a full agent_settings.custom_instructions in the same request (400), and applies only to AGENTIC / CONVERSATIONAL agents (CHAINED_ACTIONS has no agent_settings layer → 400). 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. An update that turns a scheduled Agent on, or makes an enabled one run more often, when its estimated cost reaches 25% of the workspace\u0026#x27;s monthly credits (GET /agents/{id}/cost-estimate), returns 409 estimated_cost_confirmation_required with the estimate in error.details.estimate and changes nothing; send the same body with confirm_estimated_cost: true once the person who pays has agreed. An update that keeps an enabled agent\u0026#x27;s schedule, or runs it less often, never asks. An update that turns on use_round_robin for a DISPATCH_TICKET action returns meta.warnings naming what round robin ignores; pass it to the person.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Neo Agent\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.neoagent.io/api-reference/agents/update-an-agent\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://neoagent.mintlify.site/_mintlify/api/og/v2?division=Agents\u0026amp;title=Update+an+agent\u0026amp;description=Accepts+**PUT**+or+**PATCH**+%28identical+partial-merge+semantics%29.+Partial-patches+an+agent+%E2%80%94+only+the+fields+you+send+change.+%60autonomy_type%60%2C+%60entity_type%60%2C+an\u0026amp;theme=4ae218e53f7e9d2bedb5912e\u0026amp;signature=cdd09f18f4fb1381d9df667d9b4111d95310a3c7ce8f19c02c601b90df67233c\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Update an agent - Neo Agent\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Accepts PUT or PATCH (identical partial-merge semantics). Partial-patches an agent — only the fields you send change. autonomy_type, entity_type, and trigger_type are immutable — trigger_type may be sent but must match the agent\u0026#x27;s current value, and a differing value returns 400. 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) — 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 — a PUT can never drop or reorder an action (do structural pipeline edits in the dashboard). A change to the python_code of a DATA_ANALYSIS action (a saved report) returns 400. On a TRIAGE_TICKET / TRIAGE_TIME_ENTRY action, fields_to_triage is a list and so replaces wholesale under the normal merge — send fields_to_triage_edits in that action\u0026#x27;s input_as_dict to change one field keyed by field_name: a matching entry merges key-by-key (every other triage field stays byte-identical), an unmatched one is appended (field_name is the only setting it must carry), and an entry carrying remove: true drops its target instead of editing it — a removal names its target and nothing else, must match a configured field (a no-match returns 400 rather than silently doing nothing), and cannot remove the last remaining field. A PSA-unsupported field_name returns 400, and sending both fields_to_triage and fields_to_triage_edits in one action returns 400. Use the field_name spelling GET /agents/ returns (the PSA name, e.g. contact, customFields); the enum member name (CONTACT, CUSTOM_FIELD) is also accepted. A custom field is keyed by field_name (customFields) plus custom_field_name, since all custom fields share one field_name — send both to target the right one. A toolbox patch also MERGES per tool: each entry under tool_settings_by_type is merged key-by-key onto that tool\u0026#x27;s current settings (lists like allowed_users replace; null for a tool key disables it), so changing one tool\u0026#x27;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\u0026#x27;re changing — e.g. {\u0026quot;agent_settings\u0026quot;: {\u0026quot;custom_instructions\u0026quot;: \u0026quot;…\u0026quot;}} edits only the instructions and leaves test_mode/model/til_channel intact, sending one integration\u0026#x27;s permissions leaves the others connected, and {\u0026quot;schedule\u0026quot;: {\u0026quot;timezone\u0026quot;: \u0026quot;…\u0026quot;}} leaves the run cadence and business-hours windows intact. An update never adds a ticket_cooldown_hours you did not send. To edit a long custom_instructions runbook without resending the whole blob, send agent_settings_edits.custom_instructions with either edits (a list of exact old_string/new_string search-replaces — each must match exactly once, or pass replace_all; zero or multiple matches reject the request and write nothing) or append (text added with a newline separator). An optional base_hash (sha256:… of the instructions you read) gives optimistic concurrency: a stale hash returns 409 agent_stale_write instead of clobbering a concurrent dashboard edit. This form is mutually exclusive with a full agent_settings.custom_instructions in the same request (400), and applies only to AGENTIC / CONVERSATIONAL agents (CHAINED_ACTIONS has no agent_settings layer → 400). 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. An update that turns a scheduled Agent on, or makes an enabled one run more often, when its estimated cost reaches 25% of the workspace\u0026#x27;s monthly credits (GET /agents/{id}/cost-estimate), returns 409 estimated_cost_confirmation_required with the estimate in error.details.estimate and changes nothing; send the same body with confirm_estimated_cost: true once the person who pays has agreed. An update that keeps an enabled agent\u0026#x27;s schedule, or runs it less often, never asks. An update that turns on use_round_robin for a DISPATCH_TICKET action returns meta.warnings naming what round robin ignores; pass it to the person.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://neoagent.mintlify.site/_mintlify/api/og/v2?division=Agents\u0026amp;title=Update+an+agent\u0026amp;description=Accepts+**PUT**+or+**PATCH**+%28identical+partial-merge+semantics%29.+Partial-patches+an+agent+%E2%80%94+only+the+fields+you+send+change.+%60autonomy_type%60%2C+%60entity_type%60%2C+an\u0026amp;theme=4ae218e53f7e9d2bedb5912e\u0026amp;signature=cdd09f18f4fb1381d9df667d9b4111d95310a3c7ce8f19c02c601b90df67233c\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/neoagent/w6a7B12EcByGYRPp/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Neo Agent\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2563EB\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.neoagent.io/api-reference/agents/update-an-agent\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/agents/update-an-agent.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.neoagent.io/#organization\",\"name\":\"Neo Agent\",\"url\":\"https://docs.neoagent.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/neoagent/G1PkeWrWjzTWVbma/images/neo_agent_bright_logo.png?fit=max\u0026auto=format\u0026n=G1PkeWrWjzTWVbma\u0026q=85\u0026s=090e8010cda28a9adb16dfaf022b8382\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.neoagent.io#website\",\"name\":\"Neo Agent\",\"url\":\"https://docs.neoagent.io\",\"publisher\":{\"@id\":\"https://docs.neoagent.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.neoagent.io/api-reference/agents/update-an-agent#webpage\",\"url\":\"https://docs.neoagent.io/api-reference/agents/update-an-agent\",\"name\":\"Update an agent\",\"description\":\"Accepts PUT or PATCH (identical partial-merge semantics). Partial-patches an agent — only the fields you send change. autonomy_type, entity_type, and trigger_type are immutable — trigger_type may be sent but must match the agent's current value, and a differing value returns 400. 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) — 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 — a PUT can never drop or reorder an action (do structural pipeline edits in the dashboard). A change to the python_code of a DATA_ANALYSIS action (a saved report) returns 400. On a TRIAGE_TICKET / TRIAGE_TIME_ENTRY action, fields_to_triage is a list and so replaces wholesale under the normal merge — send fields_to_triage_edits in that action's input_as_dict to change one field keyed by field_name: a matching entry merges key-by-key (every other triage field stays byte-identical), an unmatched one is appended (field_name is the only setting it must carry), and an entry carrying remove: true drops its target instead of editing it — a removal names its target and nothing else, must match a configured field (a no-match returns 400 rather than silently doing nothing), and cannot remove the last remaining field. A PSA-unsupported field_name returns 400, and sending both fields_to_triage and fields_to_triage_edits in one action returns 400. Use the field_name spelling GET /agents/ returns (the PSA name, e.g. contact, customFields); the enum member name (CONTACT, CUSTOM_FIELD) is also accepted. A custom field is keyed by field_name (customFields) plus custom_field_name, since all custom fields share one field_name — send both to target the right one. 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 — e.g. {\\\"agent_settings\\\": {\\\"custom_instructions\\\": \\\"…\\\"}} edits only the instructions and leaves test_mode/model/til_channel intact, sending one integration's permissions leaves the others connected, and {\\\"schedule\\\": {\\\"timezone\\\": \\\"…\\\"}} leaves the run cadence and business-hours windows intact. An update never adds a ticket_cooldown_hours you did not send. To edit a long custom_instructions runbook without resending the whole blob, send agent_settings_edits.custom_instructions with either edits (a list of exact old_string/new_string search-replaces — each must match exactly once, or pass replace_all; zero or multiple matches reject the request and write nothing) or append (text added with a newline separator). An optional base_hash (sha256:… of the instructions you read) gives optimistic concurrency: a stale hash returns 409 agent_stale_write instead of clobbering a concurrent dashboard edit. This form is mutually exclusive with a full agent_settings.custom_instructions in the same request (400), and applies only to AGENTIC / CONVERSATIONAL agents (CHAINED_ACTIONS has no agent_settings layer → 400). 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. An update that turns a scheduled Agent on, or makes an enabled one run more often, when its estimated cost reaches 25% of the workspace's monthly credits (GET /agents/{id}/cost-estimate), returns 409 estimated_cost_confirmation_required with the estimate in error.details.estimate and changes nothing; send the same body with confirm_estimated_cost: true once the person who pays has agreed. An update that keeps an enabled agent's schedule, or runs it less often, never asks. An update that turns on use_round_robin for a DISPATCH_TICKET action returns meta.warnings naming what round robin ignores; pass it to the person.\",\"dateModified\":\"2026-11-12T13:28:03.443Z\",\"isPartOf\":{\"@id\":\"https://docs.neoagent.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.neoagent.io/api-reference/agents/update-an-agent#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.neoagent.io/api-reference/agents/update-an-agent#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.neoagent.io/api-reference/agents/list-agents\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Agents\",\"item\":\"https://docs.neoagent.io/api-reference/agents/list-agents\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Update an agent\",\"item\":\"https://docs.neoagent.io/api-reference/agents/update-an-agent\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.neoagent.io/api-reference/agents/update-an-agent#apireference\",\"headline\":\"Update an agent\",\"name\":\"Update an agent\",\"description\":\"Accepts PUT or PATCH (identical partial-merge semantics). Partial-patches an agent — only the fields you send change. autonomy_type, entity_type, and trigger_type are immutable — trigger_type may be sent but must match the agent's current value, and a differing value returns 400. 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) — 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 — a PUT can never drop or reorder an action (do structural pipeline edits in the dashboard). A change to the python_code of a DATA_ANALYSIS action (a saved report) returns 400. On a TRIAGE_TICKET / TRIAGE_TIME_ENTRY action, fields_to_triage is a list and so replaces wholesale under the normal merge — send fields_to_triage_edits in that action's input_as_dict to change one field keyed by field_name: a matching entry merges key-by-key (every other triage field stays byte-identical), an unmatched one is appended (field_name is the only setting it must carry), and an entry carrying remove: true drops its target instead of editing it — a removal names its target and nothing else, must match a configured field (a no-match returns 400 rather than silently doing nothing), and cannot remove the last remaining field. A PSA-unsupported field_name returns 400, and sending both fields_to_triage and fields_to_triage_edits in one action returns 400. Use the field_name spelling GET /agents/ returns (the PSA name, e.g. contact, customFields); the enum member name (CONTACT, CUSTOM_FIELD) is also accepted. A custom field is keyed by field_name (customFields) plus custom_field_name, since all custom fields share one field_name — send both to target the right one. 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 — e.g. {\\\"agent_settings\\\": {\\\"custom_instructions\\\": \\\"…\\\"}} edits only the instructions and leaves test_mode/model/til_channel intact, sending one integration's permissions leaves the others connected, and {\\\"schedule\\\": {\\\"timezone\\\": \\\"…\\\"}} leaves the run cadence and business-hours windows intact. An update never adds a ticket_cooldown_hours you did not send. To edit a long custom_instructions runbook without resending the whole blob, send agent_settings_edits.custom_instructions with either edits (a list of exact old_string/new_string search-replaces — each must match exactly once, or pass replace_all; zero or multiple matches reject the request and write nothing) or append (text added with a newline separator). An optional base_hash (sha256:… of the instructions you read) gives optimistic concurrency: a stale hash returns 409 agent_stale_write instead of clobbering a concurrent dashboard edit. This form is mutually exclusive with a full agent_settings.custom_instructions in the same request (400), and applies only to AGENTIC / CONVERSATIONAL agents (CHAINED_ACTIONS has no agent_settings layer → 400). 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. An update that turns a scheduled Agent on, or makes an enabled one run more often, when its estimated cost reaches 25% of the workspace's monthly credits (GET /agents/{id}/cost-estimate), returns 409 estimated_cost_confirmation_required with the estimate in error.details.estimate and changes nothing; send the same body with confirm_estimated_cost: true once the person who pays has agreed. An update that keeps an enabled agent's schedule, or runs it less often, never asks. An update that turns on use_round_robin for a DISPATCH_TICKET action returns meta.warnings naming what round robin ignores; pass it to the person.\",\"url\":\"https://docs.neoagent.io/api-reference/agents/update-an-agent\",\"mainEntityOfPage\":{\"@id\":\"https://docs.neoagent.io/api-reference/agents/update-an-agent#webpage\"},\"dateModified\":\"2026-11-12T13:28:03.443Z\",\"publisher\":{\"@id\":\"https://docs.neoagent.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.neoagent.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Neo Agent\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Neo Agent\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/agents/update-an-agent.md","siteName":"Neo Agent","nav":{"global":{"anchors":[{"anchor":"Website","icon":"globe","href":"https://neoagent.io"}]},"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":"/getting-started/welcome"}]},{"tab":"Recipes","pages":[{"title":"Recipes","href":"/recipes/assign-technician-basic"}]},{"tab":"API reference","groups":[{"group":"Get started","pages":[{"title":"Neo public API","href":"/developers/introduction"},{"title":"Authentication","href":"/developers/authentication"},{"title":"Quickstart","href":"/developers/quickstart"},{"title":"Errors","href":"/developers/errors"},{"title":"Rate limits","href":"/developers/rate-limits"}]},{"group":"Endpoints","pages":[{"group":"Agents","pages":[{"title":"List agents","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/agents","href":"/api-reference/agents/list-agents"},{"title":"Create an agent","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/agents","href":"/api-reference/agents/create-an-agent"},{"title":"Estimate a schedule's credit cost before creating the agent","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/agents/cost-estimate","href":"/api-reference/agents/estimate-a-schedules-credit-cost-before-creating-the-agent"},{"title":"Get an agent","description":"Returns the full current config of one agent: the summary fields plus the three config layers — `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). `process_entities_sequentially` true means the agent runs one ticket at a time; its waiting tickets are on `GET /agents/\u003cid>/queue`. For a historical snapshot use `GET /agents/\u003cid>/version-at`.","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/agents/{agent_id}","href":"/api-reference/agents/get-an-agent"},{"title":"Update an agent","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/agents/{agent_id}","href":"/api-reference/agents/update-an-agent"},{"title":"Delete an agent","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 — delete those first.","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/agents/{agent_id}","href":"/api-reference/agents/delete-an-agent"},{"title":"Update an agent","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json patch /public-api/agents/{agent_id}","href":"/api-reference/agents/update-an-agent-1"},{"title":"Estimate a scheduled agent's credit cost","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/agents/{agent_id}/cost-estimate","href":"/api-reference/agents/estimate-a-scheduled-agents-credit-cost"},{"title":"List what this agent could still be given","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/agents/{agent_id}/improvement-options","href":"/api-reference/agents/list-what-this-agent-could-still-be-given"},{"title":"List the pinned memories this agent reads","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/agents/{agent_id}/pinned-memories","href":"/api-reference/agents/list-the-pinned-memories-this-agent-reads"},{"title":"Get an agent's sequential queue","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/agents/{agent_id}/queue","href":"/api-reference/agents/get-an-agents-sequential-queue"},{"title":"Run an agent now","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/agents/{agent_id}/run-now","href":"/api-reference/agents/run-an-agent-now"},{"title":"Get agent execution stats","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/agents/{agent_id}/stats","href":"/api-reference/agents/get-agent-execution-stats"},{"title":"Get the agent version at a point in time","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/agents/{agent_id}/version-at","href":"/api-reference/agents/get-the-agent-version-at-a-point-in-time"},{"title":"List agent versions","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/agents/{agent_id}/versions","href":"/api-reference/agents/list-agent-versions"}]},{"group":"Credit alert rules","pages":[{"title":"Get an agent's credit alert rule","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/agents/{agent_id}/credit-alert-rule","href":"/api-reference/credit-alert-rules/get-an-agents-credit-alert-rule"},{"title":"Create or replace an agent's credit alert rule","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/agents/{agent_id}/credit-alert-rule","href":"/api-reference/credit-alert-rules/create-or-replace-an-agents-credit-alert-rule"},{"title":"Delete an agent's credit alert rule","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/agents/{agent_id}/credit-alert-rule","href":"/api-reference/credit-alert-rules/delete-an-agents-credit-alert-rule"},{"title":"Preview a credit alert rule","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/agents/{agent_id}/credit-alert-rule/preview","href":"/api-reference/credit-alert-rules/preview-a-credit-alert-rule"},{"title":"List credit alert rules","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/credit-alert-rules","href":"/api-reference/credit-alert-rules/list-credit-alert-rules"}]},{"group":"Inbox \u0026 Comms","pages":[{"title":"List active announcements","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/announcements","href":"/api-reference/inbox-\u0026-comms/list-active-announcements"},{"title":"List inbox messages","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/inbox","href":"/api-reference/inbox-\u0026-comms/list-inbox-messages"},{"title":"Mark an inbox message as read","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/inbox/{deduplication_message_id}/read","href":"/api-reference/inbox-\u0026-comms/mark-an-inbox-message-as-read"}]},{"group":"API keys","pages":[{"title":"List API keys","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/api-keys","href":"/api-reference/api-keys/list-api-keys"},{"title":"Create an API key","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/api-keys","href":"/api-reference/api-keys/create-an-api-key"},{"title":"Revoke an API key","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/api-keys/{key_id}","href":"/api-reference/api-keys/revoke-an-api-key"},{"title":"Rotate an API key","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/api-keys/{key_id}/rotate","href":"/api-reference/api-keys/rotate-an-api-key"}]},{"group":"Audit Log","pages":[{"title":"Audit Log summary — call counts per tool and per agent","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/audit-log/facets","href":"/api-reference/audit-log/audit-log-summary-—-call-counts-per-tool-and-per-agent"},{"title":"List agent tool calls (Audit Log)","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/audit-log/tool-calls","href":"/api-reference/audit-log/list-agent-tool-calls-audit-log"}]},{"group":"Backfills","pages":[{"title":"List backfills","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/backfills","href":"/api-reference/backfills/list-backfills"},{"title":"Create a backfill","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/backfills","href":"/api-reference/backfills/create-a-backfill"},{"title":"Preflight a backfill filter","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/backfills/verify","href":"/api-reference/backfills/preflight-a-backfill-filter"},{"title":"Get a backfill","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/backfills/{backfill_id}","href":"/api-reference/backfills/get-a-backfill"},{"title":"Cancel a backfill","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/backfills/{backfill_id}/cancel","href":"/api-reference/backfills/cancel-a-backfill"},{"title":"List a backfill's failed tickets","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/backfills/{backfill_id}/failures","href":"/api-reference/backfills/list-a-backfills-failed-tickets"},{"title":"Pause a backfill","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/backfills/{backfill_id}/pause","href":"/api-reference/backfills/pause-a-backfill"},{"title":"Rerun a backfill against its failed tickets","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/backfills/{backfill_id}/rerun-failed","href":"/api-reference/backfills/rerun-a-backfill-against-its-failed-tickets"},{"title":"Resume a backfill","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/backfills/{backfill_id}/resume","href":"/api-reference/backfills/resume-a-backfill"}]},{"group":"Billing","pages":[{"title":"Get end-user bot (MAU) usage and charge for a month","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/billing/end-user-teams-usage","href":"/api-reference/billing/get-end-user-bot-mau-usage-and-charge-for-a-month"},{"title":"Detailed end-user bot (MAU) breakdown for a month","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/billing/end-user-teams/detail","href":"/api-reference/billing/detailed-end-user-bot-mau-breakdown-for-a-month"},{"title":"Get the tenant's metered billing month so far","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/billing/metered","href":"/api-reference/billing/get-the-tenants-metered-billing-month-so-far"},{"title":"Get this workspace's organization billing","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/billing/organization","href":"/api-reference/billing/get-this-workspaces-organization-billing"},{"title":"Get the tenant's referral program state","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/billing/referrals","href":"/api-reference/billing/get-the-tenants-referral-program-state"},{"title":"Get the tenant's subscription / plan state","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/billing/subscription","href":"/api-reference/billing/get-the-tenants-subscription-plan-state"},{"title":"Get credit usage for a month","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/billing/usage","href":"/api-reference/billing/get-credit-usage-for-a-month"},{"title":"Get per-agent credit usage for a month","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/billing/usage-by-agent","href":"/api-reference/billing/get-per-agent-credit-usage-for-a-month"},{"title":"Get credit usage per ticket for a period","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/billing/usage-by-ticket","href":"/api-reference/billing/get-credit-usage-per-ticket-for-a-period"}]},{"group":"Callbacks","pages":[{"title":"List callbacks","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/callbacks","href":"/api-reference/callbacks/list-callbacks"},{"title":"Get a callback","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/callbacks/{callback_id}","href":"/api-reference/callbacks/get-a-callback"}]},{"group":"Channels","pages":[{"title":"List channels","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/channels","href":"/api-reference/channels/list-channels"},{"title":"Create a channel","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/channels","href":"/api-reference/channels/create-a-channel"},{"title":"Resolve install greeting branding","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/channels/install-events","href":"/api-reference/channels/resolve-install-greeting-branding"},{"title":"Get a channel","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/channels/{channel_id}","href":"/api-reference/channels/get-a-channel"},{"title":"Delete a channel","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/channels/{channel_id}","href":"/api-reference/channels/delete-a-channel"},{"title":"Update a channel","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json patch /public-api/channels/{channel_id}","href":"/api-reference/channels/update-a-channel"},{"title":"Get a channel's Slack app","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/channels/{channel_id}/slack-app","href":"/api-reference/channels/get-a-channels-slack-app"},{"title":"Request a channel's Slack app","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/channels/{channel_id}/slack-app","href":"/api-reference/channels/request-a-channels-slack-app"},{"title":"Upload a Slack channel's icon","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/channels/{channel_id}/slack-app/icon","href":"/api-reference/channels/upload-a-slack-channels-icon"},{"title":"Create a Slack install link","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/channels/{channel_id}/slack-install-link","href":"/api-reference/channels/create-a-slack-install-link"},{"title":"List a channel's Slack workspaces","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/channels/{channel_id}/slack-installs","href":"/api-reference/channels/list-a-channels-slack-workspaces"},{"title":"Remove a Slack workspace","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/channels/{channel_id}/slack-installs/{install_id}","href":"/api-reference/channels/remove-a-slack-workspace"},{"title":"List a Teams channel's client tenants","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/channels/{channel_id}/teams-installs","href":"/api-reference/channels/list-a-teams-channels-client-tenants"},{"title":"Send a technician's Live chat in Teams \u0026 Slack thread reply to the end user (relays only)","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/technician-inbox/replies","href":"/api-reference/channels/send-a-technicians-live-chat-in-teams-\u0026-slack-thread-reply-to-the-end-user-relays-only"},{"title":"Is this channel thread a Live chat in Teams \u0026 Slack post? (relays only)","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/technician-inbox/threads/lookup","href":"/api-reference/channels/is-this-channel-thread-a-live-chat-in-teams-\u0026-slack-post?-relays-only"}]},{"group":"Chat","pages":[{"title":"Create a chat session","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/chat/sessions","href":"/api-reference/chat/create-a-chat-session"},{"title":"Get a chat session","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/chat/sessions/{session_id}","href":"/api-reference/chat/get-a-chat-session"},{"title":"Get a signed URL to upload a chat image or document","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/chat/sessions/{session_id}/attachments/upload-url","href":"/api-reference/chat/get-a-signed-url-to-upload-a-chat-image-or-document"},{"title":"Tail chat-session events (SSE)","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/chat/sessions/{session_id}/events","href":"/api-reference/chat/tail-chat-session-events-sse"},{"title":"List messages in a chat session","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/chat/sessions/{session_id}/messages","href":"/api-reference/chat/list-messages-in-a-chat-session"},{"title":"Append a user message + enqueue a chat turn","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/chat/sessions/{session_id}/messages","href":"/api-reference/chat/append-a-user-message-+-enqueue-a-chat-turn"},{"title":"Reset a chat session (archive + start fresh)","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/chat/sessions/{session_id}/reset","href":"/api-reference/chat/reset-a-chat-session-archive-+-start-fresh"},{"title":"Stop the turn running on a chat session","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/chat/sessions/{session_id}/stop","href":"/api-reference/chat/stop-the-turn-running-on-a-chat-session"},{"title":"Mint an end-user session token","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/sessions","href":"/api-reference/chat/mint-an-end-user-session-token"},{"title":"Revoke an end-user session token by jti","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/sessions/{jti}","href":"/api-reference/chat/revoke-an-end-user-session-token-by-jti"}]},{"group":"Tenant","pages":[{"title":"Get the caller's tenant","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/clients/me","href":"/api-reference/tenant/get-the-callers-tenant"}]},{"group":"Integrations","pages":[{"title":"Get company filters","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/company-filters","href":"/api-reference/integrations/get-company-filters"},{"title":"Update company filters","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/company-filters","href":"/api-reference/integrations/update-company-filters"},{"title":"Get company-filter options","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/company-filters/options","href":"/api-reference/integrations/get-company-filter-options"},{"title":"Remove companies that no longer match","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/company-filters/remove-unmatched","href":"/api-reference/integrations/remove-companies-that-no-longer-match"},{"title":"Get documentation storage usage against the plan allowance","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/documentation/quota","href":"/api-reference/integrations/get-documentation-storage-usage-against-the-plan-allowance"},{"title":"List integrations","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations","href":"/api-reference/integrations/list-integrations"},{"title":"Get the Neo panel in Autotask tickets","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/autotask-neo-panel","href":"/api-reference/integrations/get-the-neo-panel-in-autotask-tickets"},{"title":"Turn the Neo panel in Autotask tickets on or off","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/integrations/autotask-neo-panel","href":"/api-reference/integrations/turn-the-neo-panel-in-autotask-tickets-on-or-off"},{"title":"Give the Neo panel in Autotask a new signing secret","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/integrations/autotask-neo-panel/rotate-secret","href":"/api-reference/integrations/give-the-neo-panel-in-autotask-a-new-signing-secret"},{"title":"Get the Neo panel in ConnectWise tickets","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/connectwise-neo-panel","href":"/api-reference/integrations/get-the-neo-panel-in-connectwise-tickets"},{"title":"Turn the Neo panel in ConnectWise tickets on or off","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/integrations/connectwise-neo-panel","href":"/api-reference/integrations/turn-the-neo-panel-in-connectwise-tickets-on-or-off"},{"title":"Get the ConnectWise schedule types that count as time off","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/connectwise-time-off-schedule-types","href":"/api-reference/integrations/get-the-connectwise-schedule-types-that-count-as-time-off"},{"title":"Set the ConnectWise schedule types that count as time off","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/integrations/connectwise-time-off-schedule-types","href":"/api-reference/integrations/set-the-connectwise-schedule-types-that-count-as-time-off"},{"title":"Get the tenant's ConnectWise customer-reply policy","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/customer-reply-policy","href":"/api-reference/integrations/get-the-tenants-connectwise-customer-reply-policy"},{"title":"Update the tenant's ConnectWise customer-reply policy","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/integrations/customer-reply-policy","href":"/api-reference/integrations/update-the-tenants-connectwise-customer-reply-policy"},{"title":"Get the tenant's Datto EDR settings","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/datto-edr-config","href":"/api-reference/integrations/get-the-tenants-datto-edr-settings"},{"title":"Turn Datto EDR location mapping on or off","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/integrations/datto-edr-config","href":"/api-reference/integrations/turn-datto-edr-location-mapping-on-or-off"},{"title":"Get the Neo panel in HaloPSA tickets","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/halo-neo-panel","href":"/api-reference/integrations/get-the-neo-panel-in-halopsa-tickets"},{"title":"Turn the Neo panel in HaloPSA tickets on or off","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/integrations/halo-neo-panel","href":"/api-reference/integrations/turn-the-neo-panel-in-halopsa-tickets-on-or-off"},{"title":"Give the Neo panel in HaloPSA a new signing secret","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/integrations/halo-neo-panel/rotate-secret","href":"/api-reference/integrations/give-the-neo-panel-in-halopsa-a-new-signing-secret"},{"title":"Get the tenant's ticket-relay policy","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/relay-policy","href":"/api-reference/integrations/get-the-tenants-ticket-relay-policy"},{"title":"Ask Neo to build an integration","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/integrations/requests","href":"/api-reference/integrations/ask-neo-to-build-an-integration"},{"title":"Get the Neo panel on ServiceNow ticket forms","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/servicenow-neo-panel","href":"/api-reference/integrations/get-the-neo-panel-on-servicenow-ticket-forms"},{"title":"Turn the Neo panel on ServiceNow ticket forms on or off","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/integrations/servicenow-neo-panel","href":"/api-reference/integrations/turn-the-neo-panel-on-servicenow-ticket-forms-on-or-off"},{"title":"Give the Neo panel on ServiceNow a new signing secret","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/integrations/servicenow-neo-panel/rotate-secret","href":"/api-reference/integrations/give-the-neo-panel-on-servicenow-a-new-signing-secret"},{"title":"Get the Neo AI Agent Slack app status","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/slack-neo-app","href":"/api-reference/integrations/get-the-neo-ai-agent-slack-app-status"},{"title":"Disconnect the Neo AI Agent Slack app","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/integrations/slack-neo-app","href":"/api-reference/integrations/disconnect-the-neo-ai-agent-slack-app"},{"title":"List the Slack channels the Neo AI Agent app is in","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/slack-neo-app/channels","href":"/api-reference/integrations/list-the-slack-channels-the-neo-ai-agent-app-is-in"},{"title":"Create the Neo AI Agent Slack install link","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/integrations/slack-neo-app/install-link","href":"/api-reference/integrations/create-the-neo-ai-agent-slack-install-link"},{"title":"List the people of the connected Slack workspace","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/slack-neo-app/users","href":"/api-reference/integrations/list-the-people-of-the-connected-slack-workspace"},{"title":"List the channels Live chat in Teams \u0026 Slack can post in","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/technician-inbox-channels","href":"/api-reference/integrations/list-the-channels-live-chat-in-teams-\u0026-slack-can-post-in"},{"title":"Get the tenant's Live chat in Teams \u0026 Slack channels","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/technician-inbox-config","href":"/api-reference/integrations/get-the-tenants-live-chat-in-teams-\u0026-slack-channels"},{"title":"Set the tenant's Live chat in Teams \u0026 Slack channels","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/integrations/technician-inbox-config","href":"/api-reference/integrations/set-the-tenants-live-chat-in-teams-\u0026-slack-channels"},{"title":"Get the tenant's ticket board/queue sync filter","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/ticket-sync-filter","href":"/api-reference/integrations/get-the-tenants-ticket-boardqueue-sync-filter"},{"title":"Get an integration","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/{name}","href":"/api-reference/integrations/get-an-integration"},{"title":"Get an integration's connect instructions","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/integrations/{name}/connect-url","href":"/api-reference/integrations/get-an-integrations-connect-instructions"},{"title":"Disconnect an integration","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/integrations/{name}/disconnect","href":"/api-reference/integrations/disconnect-an-integration"},{"title":"List integration sync runs","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/integrations/{name}/sync-runs","href":"/api-reference/integrations/list-integration-sync-runs"},{"title":"Auto-map technicians to their Microsoft user","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/teams-availability/auto-map","href":"/api-reference/integrations/auto-map-technicians-to-their-microsoft-user"},{"title":"Get the Teams availability admin-consent URL","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/teams-availability/consent-url","href":"/api-reference/integrations/get-the-teams-availability-admin-consent-url"},{"title":"List the MSP tenant's Teams","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/teams-availability/teams","href":"/api-reference/integrations/list-the-msp-tenants-teams"}]},{"group":"End companies","pages":[{"title":"List an integration's company links","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/company-links","href":"/api-reference/end-companies/list-an-integrations-company-links"},{"title":"Map an integration's entity to a PSA company","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/company-links/assign","href":"/api-reference/end-companies/map-an-integrations-entity-to-a-psa-company"},{"title":"List the companies whose CIPP tenant a person can confirm","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/company-links/cipp-matches","href":"/api-reference/end-companies/list-the-companies-whose-cipp-tenant-a-person-can-confirm"},{"title":"Confirm CIPP tenants as the companies' Microsoft tenants","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/company-links/cipp-matches/confirm","href":"/api-reference/end-companies/confirm-cipp-tenants-as-the-companies-microsoft-tenants"},{"title":"Clear a manual company link","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/company-links/clear","href":"/api-reference/end-companies/clear-a-manual-company-link"},{"title":"List end-companies","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/end-companies","href":"/api-reference/end-companies/list-end-companies"},{"title":"Create an end-company","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/end-companies","href":"/api-reference/end-companies/create-an-end-company"},{"title":"Bulk-update end-companies","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/end-companies/bulk-update","href":"/api-reference/end-companies/bulk-update-end-companies"},{"title":"List the Microsoft permissions Neo can hold in a GDAP company","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/end-companies/gdap-permissions-catalog","href":"/api-reference/end-companies/list-the-microsoft-permissions-neo-can-hold-in-a-gdap-company"},{"title":"Get the MSP-wide GDAP permission default","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/end-companies/gdap-permissions-default","href":"/api-reference/end-companies/get-the-msp-wide-gdap-permission-default"},{"title":"Set the MSP-wide GDAP permission default","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/end-companies/gdap-permissions-default","href":"/api-reference/end-companies/set-the-msp-wide-gdap-permission-default"},{"title":"Get the default for companies with no identity provider","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/end-companies/identity-provider-default","href":"/api-reference/end-companies/get-the-default-for-companies-with-no-identity-provider"},{"title":"Set the default for companies with no identity provider","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/end-companies/identity-provider-default","href":"/api-reference/end-companies/set-the-default-for-companies-with-no-identity-provider"},{"title":"Get an end-company","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/end-companies/{psa_company_id}","href":"/api-reference/end-companies/get-an-end-company"},{"title":"Delete an end-company","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/end-companies/{psa_company_id}","href":"/api-reference/end-companies/delete-an-end-company"},{"title":"Update an end-company","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json patch /public-api/end-companies/{psa_company_id}","href":"/api-reference/end-companies/update-an-end-company"},{"title":"List an end-company's contacts","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/end-companies/{psa_company_id}/contacts","href":"/api-reference/end-companies/list-an-end-companys-contacts"},{"title":"Get one company's GDAP permissions","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/end-companies/{psa_company_id}/gdap-permissions","href":"/api-reference/end-companies/get-one-companys-gdap-permissions"},{"title":"Override one company's GDAP permissions","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/end-companies/{psa_company_id}/gdap-permissions","href":"/api-reference/end-companies/override-one-companys-gdap-permissions"},{"title":"Clear one company's GDAP permission override","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/end-companies/{psa_company_id}/gdap-permissions","href":"/api-reference/end-companies/clear-one-companys-gdap-permission-override"},{"title":"Exclude or include an end-company's tickets","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/end-companies/{psa_company_id}/ticket-exclusion","href":"/api-reference/end-companies/exclude-or-include-an-end-companys-tickets"}]},{"group":"Dashboards","pages":[{"title":"List the workspace's dashboards","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/dashboards","href":"/api-reference/dashboards/list-the-workspaces-dashboards"},{"title":"Create a dashboard","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/dashboards","href":"/api-reference/dashboards/create-a-dashboard"},{"title":"See which dashboards one member sees, and why","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/dashboards/access","href":"/api-reference/dashboards/see-which-dashboards-one-member-sees-and-why"},{"title":"List the dashboard folders","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/dashboards/folders","href":"/api-reference/dashboards/list-the-dashboard-folders"},{"title":"Create a dashboard folder","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/dashboards/folders","href":"/api-reference/dashboards/create-a-dashboard-folder"},{"title":"Rename a dashboard folder","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/dashboards/folders/{folder_id}","href":"/api-reference/dashboards/rename-a-dashboard-folder"},{"title":"Delete a dashboard folder","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/dashboards/folders/{folder_id}","href":"/api-reference/dashboards/delete-a-dashboard-folder"},{"title":"List dashboard templates","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/dashboards/templates","href":"/api-reference/dashboards/list-dashboard-templates"},{"title":"Get a dashboard template","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/dashboards/templates/{template_id}","href":"/api-reference/dashboards/get-a-dashboard-template"},{"title":"Start a dashboard from a template","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/dashboards/templates/{template_id}/instantiate","href":"/api-reference/dashboards/start-a-dashboard-from-a-template"},{"title":"Get a dashboard with its latest widget data","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/dashboards/{dashboard_id}","href":"/api-reference/dashboards/get-a-dashboard-with-its-latest-widget-data"},{"title":"Update a dashboard","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/dashboards/{dashboard_id}","href":"/api-reference/dashboards/update-a-dashboard"},{"title":"Delete a dashboard","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/dashboards/{dashboard_id}","href":"/api-reference/dashboards/delete-a-dashboard"},{"title":"Read a dashboard's dataset rows","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/dashboards/{dashboard_id}/dataset","href":"/api-reference/dashboards/read-a-dashboards-dataset-rows"},{"title":"List a dashboard's versions","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/dashboards/{dashboard_id}/definitions","href":"/api-reference/dashboards/list-a-dashboards-versions"},{"title":"Share a dashboard publicly by link, or revoke the link","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json patch /public-api/dashboards/{dashboard_id}/public","href":"/api-reference/dashboards/share-a-dashboard-publicly-by-link-or-revoke-the-link"},{"title":"Refresh every widget","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/dashboards/{dashboard_id}/refresh","href":"/api-reference/dashboards/refresh-every-widget"},{"title":"See who a dashboard is shared with","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/dashboards/{dashboard_id}/sharing","href":"/api-reference/dashboards/see-who-a-dashboard-is-shared-with"},{"title":"Share a dashboard with named members, make it private, or open it to the workspace","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/dashboards/{dashboard_id}/sharing","href":"/api-reference/dashboards/share-a-dashboard-with-named-members-make-it-private-or-open-it-to-the-workspace"},{"title":"Copy a widget onto this dashboard","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/dashboards/{dashboard_id}/widgets/copy","href":"/api-reference/dashboards/copy-a-widget-onto-this-dashboard"},{"title":"Edit one widget's code","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/dashboards/{dashboard_id}/widgets/{widget_id}/code","href":"/api-reference/dashboards/edit-one-widgets-code"},{"title":"Refresh one widget","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/dashboards/{dashboard_id}/widgets/{widget_id}/refresh","href":"/api-reference/dashboards/refresh-one-widget"},{"title":"Compute a described widget under a view","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/dashboards/{dashboard_id}/widgets/{widget_id}/result","href":"/api-reference/dashboards/compute-a-described-widget-under-a-view"}]},{"group":"End-user notifications","pages":[{"title":"List end-user notifications","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/end-user-notifications","href":"/api-reference/end-user-notifications/list-end-user-notifications"},{"title":"Send a notification to end users","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/end-user-notifications","href":"/api-reference/end-user-notifications/send-a-notification-to-end-users"},{"title":"Preview who an end-user notification reaches","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/end-user-notifications/reach","href":"/api-reference/end-user-notifications/preview-who-an-end-user-notification-reaches"},{"title":"Get an end-user notification and its outcome per person","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/end-user-notifications/{notification_id}","href":"/api-reference/end-user-notifications/get-an-end-user-notification-and-its-outcome-per-person"}]},{"group":"End users","pages":[{"title":"List an end user's tickets (Teams Tickets tab)","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/end-user/tickets","href":"/api-reference/end-users/list-an-end-users-tickets-teams-tickets-tab"},{"title":"Continue a ticket in the bot chat (Teams Tickets tab)","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/end-user/tickets/chat-request","href":"/api-reference/end-users/continue-a-ticket-in-the-bot-chat-teams-tickets-tab"},{"title":"Ask the bot for a new ticket (Teams Tickets tab)","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/end-user/tickets/new-request","href":"/api-reference/end-users/ask-the-bot-for-a-new-ticket-teams-tickets-tab"}]},{"group":"Escalation","pages":[{"title":"Escalate to the Neo team","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/escalate-to-neo-team","href":"/api-reference/escalation/escalate-to-the-neo-team"}]},{"group":"Executions","pages":[{"title":"List executions","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/executions","href":"/api-reference/executions/list-executions"},{"title":"Get an execution","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/executions/{execution_id}","href":"/api-reference/executions/get-an-execution"},{"title":"Get the per-run custom instructions","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/executions/{execution_id}/additional-custom-instructions","href":"/api-reference/executions/get-the-per-run-custom-instructions"},{"title":"List artifacts an execution produced","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/executions/{execution_id}/artifacts","href":"/api-reference/executions/list-artifacts-an-execution-produced"},{"title":"Get an artifact's full body inline","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/executions/{execution_id}/artifacts/{artifact_id}/content","href":"/api-reference/executions/get-an-artifacts-full-body-inline"},{"title":"Get a download URL for a sandbox-file artifact","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/executions/{execution_id}/artifacts/{artifact_id}/download-url","href":"/api-reference/executions/get-a-download-url-for-a-sandbox-file-artifact"},{"title":"Get the callback that triggered an execution","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/executions/{execution_id}/callback","href":"/api-reference/executions/get-the-callback-that-triggered-an-execution"},{"title":"Cancel an execution","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/executions/{execution_id}/cancel","href":"/api-reference/executions/cancel-an-execution"},{"title":"Get the field-update audit for an execution","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/executions/{execution_id}/field-update-audit","href":"/api-reference/executions/get-the-field-update-audit-for-an-execution"},{"title":"Retry an execution","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/executions/{execution_id}/retry","href":"/api-reference/executions/retry-an-execution"},{"title":"List the RMM script runs in an execution","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/executions/{execution_id}/rmm-script-executions","href":"/api-reference/executions/list-the-rmm-script-runs-in-an-execution"},{"title":"List execution steps","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/executions/{execution_id}/steps","href":"/api-reference/executions/list-execution-steps"},{"title":"List the TIL requests raised in an execution","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/executions/{execution_id}/til-requests","href":"/api-reference/executions/list-the-til-requests-raised-in-an-execution"}]},{"group":"Feedback","pages":[{"title":"Submit feedback","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/feedback","href":"/api-reference/feedback/submit-feedback"},{"title":"Update feedback","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/feedback/{feedback_id}","href":"/api-reference/feedback/update-feedback"},{"title":"Set support-chat contact","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/support-chat-contact","href":"/api-reference/feedback/set-support-chat-contact"}]},{"group":"Handover","pages":[{"title":"Accept a Neo Pulse handover request","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/handover-requests/{request_id}/accept","href":"/api-reference/handover/accept-a-neo-pulse-handover-request"}]},{"group":"Meta","pages":[{"title":"Liveness probe","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/health","href":"/api-reference/meta/liveness-probe"},{"title":"OpenAPI 3.1 document","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/openapi.json","href":"/api-reference/meta/openapi-31-document"}]},{"group":"Insights","pages":[{"title":"Start an Insights analysis","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/insights/analyze","href":"/api-reference/insights/start-an-insights-analysis"},{"title":"Insights presets — suggested region, period options, trial state","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/insights/defaults","href":"/api-reference/insights/insights-presets-—-suggested-region-period-options-trial-state"},{"title":"Build a problem map","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/insights/problems/analyze","href":"/api-reference/insights/build-a-problem-map"},{"title":"Automation coverage per recurring problem, with Neo's plan for each","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/insights/problems/coverage","href":"/api-reference/insights/automation-coverage-per-recurring-problem-with-neos-plan-for-each"},{"title":"List the stored problem maps","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/insights/problems/reports","href":"/api-reference/insights/list-the-stored-problem-maps"},{"title":"A completed problem map","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/insights/problems/result","href":"/api-reference/insights/a-completed-problem-map"},{"title":"Problem map status","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/insights/problems/status","href":"/api-reference/insights/problem-map-status"},{"title":"The newest tickets of one recurring problem, with Neo's coverage on each","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/insights/problems/{problem_id}/tickets","href":"/api-reference/insights/the-newest-tickets-of-one-recurring-problem-with-neos-coverage-on-each"},{"title":"List the stored Insights category reports","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/insights/reports","href":"/api-reference/insights/list-the-stored-insights-category-reports"},{"title":"Latest completed analysis","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/insights/result","href":"/api-reference/insights/latest-completed-analysis"},{"title":"Set the minutes per ticket of report categories","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json patch /public-api/insights/result/category-minutes","href":"/api-reference/insights/set-the-minutes-per-ticket-of-report-categories"},{"title":"Set the hourly rate of a category report","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json patch /public-api/insights/result/hourly-rate","href":"/api-reference/insights/set-the-hourly-rate-of-a-category-report"},{"title":"Latest analysis status","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/insights/status","href":"/api-reference/insights/latest-analysis-status"}]},{"group":"Intents","pages":[{"title":"List intents","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/intents","href":"/api-reference/intents/list-intents"},{"title":"Create an intent","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/intents","href":"/api-reference/intents/create-an-intent"},{"title":"Get an intent","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/intents/{intent_id}","href":"/api-reference/intents/get-an-intent"},{"title":"Update an intent","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/intents/{intent_id}","href":"/api-reference/intents/update-an-intent"},{"title":"Delete an intent","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/intents/{intent_id}","href":"/api-reference/intents/delete-an-intent"}]},{"group":"Memberships","pages":[{"title":"Accept an email invitation","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/invitations/accept","href":"/api-reference/memberships/accept-an-email-invitation"},{"title":"Preview an email invitation","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/invitations/preview","href":"/api-reference/memberships/preview-an-email-invitation"},{"title":"List my workspaces","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/me/workspaces","href":"/api-reference/memberships/list-my-workspaces"},{"title":"List workspace members","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/memberships","href":"/api-reference/memberships/list-workspace-members"},{"title":"Invite a workspace member","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/memberships","href":"/api-reference/memberships/invite-a-workspace-member"},{"title":"Cancel a pending invitation","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/memberships/invitations","href":"/api-reference/memberships/cancel-a-pending-invitation"},{"title":"Resend a pending email invitation","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/memberships/invitations/resend","href":"/api-reference/memberships/resend-a-pending-email-invitation"},{"title":"Revoke a workspace membership","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/memberships/{user_id}","href":"/api-reference/memberships/revoke-a-workspace-membership"},{"title":"Set a member's end-user notifications permission","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/memberships/{user_id}/end-user-notifications-access","href":"/api-reference/memberships/set-a-members-end-user-notifications-permission"}]},{"group":"Memories","pages":[{"title":"List agent memories","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/memories","href":"/api-reference/memories/list-agent-memories"},{"title":"Create an agent memory","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/memories","href":"/api-reference/memories/create-an-agent-memory"},{"title":"Read how full the memory budgets are","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/memories/budget","href":"/api-reference/memories/read-how-full-the-memory-budgets-are"},{"title":"Soft-delete several agent memories","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/memories/bulk-delete","href":"/api-reference/memories/soft-delete-several-agent-memories"},{"title":"Get an agent memory","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/memories/{memory_id}","href":"/api-reference/memories/get-an-agent-memory"},{"title":"Soft-delete an agent memory","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/memories/{memory_id}","href":"/api-reference/memories/soft-delete-an-agent-memory"},{"title":"Pin an agent memory","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/memories/{memory_id}/pin","href":"/api-reference/memories/pin-an-agent-memory"},{"title":"Restore an agent memory","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/memories/{memory_id}/restore","href":"/api-reference/memories/restore-an-agent-memory"},{"title":"Supersede an agent memory","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/memories/{memory_id}/supersede","href":"/api-reference/memories/supersede-an-agent-memory"},{"title":"Unpin an agent memory","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/memories/{memory_id}/unpin","href":"/api-reference/memories/unpin-an-agent-memory"},{"title":"List a memory's earlier versions","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/memories/{memory_id}/versions","href":"/api-reference/memories/list-a-memorys-earlier-versions"}]},{"group":"Observability","pages":[{"title":"Callback-processing funnel","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/observability/callback-funnel","href":"/api-reference/observability/callback-processing-funnel"},{"title":"Per-agent performance breakdown","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/observability/workflow-performance","href":"/api-reference/observability/per-agent-performance-breakdown"}]},{"group":"Organizations","pages":[{"title":"Get this workspace's organization","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/organizations/current","href":"/api-reference/organizations/get-this-workspaces-organization"},{"title":"Get organization administration details","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/organizations/{organization_id}","href":"/api-reference/organizations/get-organization-administration-details"},{"title":"Rename an organization","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json patch /public-api/organizations/{organization_id}","href":"/api-reference/organizations/rename-an-organization"},{"title":"Get the organization's billing","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/organizations/{organization_id}/billing","href":"/api-reference/organizations/get-the-organizations-billing"},{"title":"Set an organization-billed workspace's monthly credit limit","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/organizations/{organization_id}/billing/workspaces/{client_id}/limit","href":"/api-reference/organizations/set-an-organization-billed-workspaces-monthly-credit-limit"},{"title":"Assign an organization administrator","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/organizations/{organization_id}/members","href":"/api-reference/organizations/assign-an-organization-administrator"},{"title":"Revoke organization administration","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/organizations/{organization_id}/members","href":"/api-reference/organizations/revoke-organization-administration"},{"title":"Create a subsidiary workspace","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/organizations/{organization_id}/workspaces","href":"/api-reference/organizations/create-a-subsidiary-workspace"},{"title":"Grant explicit workspace access","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/organizations/{organization_id}/workspaces/{client_id}/access","href":"/api-reference/organizations/grant-explicit-workspace-access"},{"title":"Get workspace Microsoft directory","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/workspace-directory","href":"/api-reference/organizations/get-workspace-microsoft-directory"},{"title":"Connect my Microsoft directory","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/workspace-directory","href":"/api-reference/organizations/connect-my-microsoft-directory"}]},{"group":"Performance","pages":[{"title":"Per-category execution stats","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/performance/categories","href":"/api-reference/performance/per-category-execution-stats"},{"title":"Per-agent chat cost + usage for a date window","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/performance/chat/by-agent","href":"/api-reference/performance/per-agent-chat-cost-+-usage-for-a-date-window"},{"title":"Per-user chat cost + usage for a date window","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/performance/chat/by-user","href":"/api-reference/performance/per-user-chat-cost-+-usage-for-a-date-window"},{"title":"Aggregate chat-agent cost + usage for a date window","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/performance/chat/summary","href":"/api-reference/performance/aggregate-chat-agent-cost-+-usage-for-a-date-window"},{"title":"Chat credits / turns over time","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/performance/chat/timeline","href":"/api-reference/performance/chat-credits-turns-over-time"},{"title":"Per-tool chat usage + cost for a date window","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/performance/chat/tools","href":"/api-reference/performance/per-tool-chat-usage-+-cost-for-a-date-window"},{"title":"Phone agent billed minutes and credits for a date window","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/performance/phone","href":"/api-reference/performance/phone-agent-billed-minutes-and-credits-for-a-date-window"},{"title":"Aggregate execution stats for a date window","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/performance/summary","href":"/api-reference/performance/aggregate-execution-stats-for-a-date-window"},{"title":"Tickets received vs. handled by Neo over time","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/performance/ticket-coverage","href":"/api-reference/performance/tickets-received-vs-handled-by-neo-over-time"},{"title":"Tickets one agent ran on, each counted once, by how it ended","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/performance/ticket-outcomes","href":"/api-reference/performance/tickets-one-agent-ran-on-each-counted-once-by-how-it-ended"},{"title":"Execution volume / hours saved over time","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/performance/timeline","href":"/api-reference/performance/execution-volume-hours-saved-over-time"},{"title":"Per-agent execution stats for a date window","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/performance/workflows","href":"/api-reference/performance/per-agent-execution-stats-for-a-date-window"}]},{"group":"Phone Agent","pages":[{"title":"List Phone Agent calls","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/phone/calls","href":"/api-reference/phone-agent/list-phone-agent-calls"},{"title":"Get one Phone Agent call","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/phone/calls/{call_id}","href":"/api-reference/phone-agent/get-one-phone-agent-call"},{"title":"List notetaker calls: calls routed to the help desk while Neo takes notes","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/phone/notetaker-calls","href":"/api-reference/phone-agent/list-notetaker-calls:-calls-routed-to-the-help-desk-while-neo-takes-notes"},{"title":"Add a notetaker call's notes to a ticket","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/phone/notetaker-calls/{call_id}/ticket","href":"/api-reference/phone-agent/add-a-notetaker-calls-notes-to-a-ticket"},{"title":"List Phone Agent numbers","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/phone/numbers","href":"/api-reference/phone-agent/list-phone-agent-numbers"},{"title":"Change a number's greetings, after-hours instructions, business hours, notetaker note visibility, transfer, end-call, caller-tickets, documentation and web search settings","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json patch /public-api/phone/numbers/{number}","href":"/api-reference/phone-agent/change-a-numbers-greetings-after-hours-instructions-business-hours-notetaker-note-visibility-transfer-end-call-caller-tickets-documentation-and-web-search-settings"},{"title":"Choose who takes a number's calls","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/phone/numbers/{number}/call-mode","href":"/api-reference/phone-agent/choose-who-takes-a-numbers-calls"},{"title":"List outbound calls: calls agents had Neo place to a ticket's contact","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/phone/outbound-calls","href":"/api-reference/phone-agent/list-outbound-calls:-calls-agents-had-neo-place-to-a-tickets-contact"},{"title":"List notetaker calls (old path)","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/phone/passive-calls","href":"/api-reference/phone-agent/list-notetaker-calls-old-path"},{"title":"Add a notetaker call's notes to a ticket (old path)","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/phone/passive-calls/{call_id}/ticket","href":"/api-reference/phone-agent/add-a-notetaker-calls-notes-to-a-ticket-old-path"},{"title":"List dashboard test calls","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/phone/test-calls","href":"/api-reference/phone-agent/list-dashboard-test-calls"},{"title":"Get one dashboard test call","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/phone/test-calls/{test_call_id}","href":"/api-reference/phone-agent/get-one-dashboard-test-call"}]},{"group":"RMM scripts","pages":[{"title":"List RMM script executions","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/rmm-script-executions","href":"/api-reference/rmm-scripts/list-rmm-script-executions"},{"title":"Get an RMM script execution","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/rmm-script-executions/{execution_id}","href":"/api-reference/rmm-scripts/get-an-rmm-script-execution"}]},{"group":"Scheduled work","pages":[{"title":"List scheduled work","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/scheduled-work","href":"/api-reference/scheduled-work/list-scheduled-work"},{"title":"Schedule work","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/scheduled-work","href":"/api-reference/scheduled-work/schedule-work"},{"title":"Get a scheduled-work entry","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/scheduled-work/{scheduled_work_id}","href":"/api-reference/scheduled-work/get-a-scheduled-work-entry"},{"title":"Update a scheduled-work entry","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json patch /public-api/scheduled-work/{scheduled_work_id}","href":"/api-reference/scheduled-work/update-a-scheduled-work-entry"},{"title":"Cancel a scheduled-work entry","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/scheduled-work/{scheduled_work_id}/cancel","href":"/api-reference/scheduled-work/cancel-a-scheduled-work-entry"}]},{"group":"Schemas","pages":[{"title":"Action-type schema catalog","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/schemas/actions","href":"/api-reference/schemas/action-type-schema-catalog"},{"title":"Agent-integration schema catalog","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/schemas/agent-integrations","href":"/api-reference/schemas/agent-integration-schema-catalog"},{"title":"Agent structural schema","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/schemas/agents","href":"/api-reference/schemas/agent-structural-schema"},{"title":"Callback change-option catalog","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/schemas/callback-change-options","href":"/api-reference/schemas/callback-change-option-catalog"},{"title":"Custom-field-condition schema","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/schemas/custom-field-condition","href":"/api-reference/schemas/custom-field-condition-schema"},{"title":"Queryable-entity options","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/schemas/entity-options","href":"/api-reference/schemas/queryable-entity-options"},{"title":"Integrations schema catalog","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/schemas/integrations","href":"/api-reference/schemas/integrations-schema-catalog"},{"title":"Opportunity-field schema (ConnectWise only)","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/schemas/opportunity","href":"/api-reference/schemas/opportunity-field-schema-connectwise-only"},{"title":"Project-ticket-field schema (ConnectWise only)","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/schemas/project_ticket","href":"/api-reference/schemas/project-ticket-field-schema-connectwise-only"},{"title":"Ticket-field schema","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/schemas/ticket","href":"/api-reference/schemas/ticket-field-schema"},{"title":"Time-entry-field schema","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/schemas/time_entry","href":"/api-reference/schemas/time-entry-field-schema"},{"title":"Tool catalog","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/schemas/tools","href":"/api-reference/schemas/tool-catalog"}]},{"group":"Settings","pages":[{"title":"Get tenant settings","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/settings","href":"/api-reference/settings/get-tenant-settings"},{"title":"Update tenant settings","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/settings","href":"/api-reference/settings/update-tenant-settings"},{"title":"Get who receives the inbox emails","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/settings/inbox-alerts","href":"/api-reference/settings/get-who-receives-the-inbox-emails"},{"title":"Set who receives the inbox emails","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/settings/inbox-alerts","href":"/api-reference/settings/set-who-receives-the-inbox-emails"},{"title":"Tenant-settings JSON schema","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/settings/schema","href":"/api-reference/settings/tenant-settings-json-schema"},{"title":"Get the agent credit spend notice settings","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/settings/spend-alerts","href":"/api-reference/settings/get-the-agent-credit-spend-notice-settings"},{"title":"Get the cost of technician time","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/settings/value","href":"/api-reference/settings/get-the-cost-of-technician-time"},{"title":"Set the cost of technician time","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/settings/value","href":"/api-reference/settings/set-the-cost-of-technician-time"}]},{"group":"Sharing","pages":[{"title":"Get a publicly shared agent","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/shared-agents/{share_token}","href":"/api-reference/sharing/get-a-publicly-shared-agent"},{"title":"Get a shared agent's definition","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/shared-agents/{share_token}/definition","href":"/api-reference/sharing/get-a-shared-agents-definition"}]},{"group":"Skills","pages":[{"title":"List the tenant's skills","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/skills","href":"/api-reference/skills/list-the-tenants-skills"},{"title":"Create a skill","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/skills","href":"/api-reference/skills/create-a-skill"},{"title":"Rename a skill folder","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/skills/folders/rename","href":"/api-reference/skills/rename-a-skill-folder"},{"title":"Get a skill","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/skills/{skill_id}","href":"/api-reference/skills/get-a-skill"},{"title":"Replace whole files / update skill metadata","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/skills/{skill_id}","href":"/api-reference/skills/replace-whole-files-update-skill-metadata"},{"title":"Delete a skill","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/skills/{skill_id}","href":"/api-reference/skills/delete-a-skill"},{"title":"Edit part of a skill's file","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json patch /public-api/skills/{skill_id}","href":"/api-reference/skills/edit-part-of-a-skills-file"},{"title":"List the versions of a skill file","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/skills/{skill_id}/files/{file_path}/versions","href":"/api-reference/skills/list-the-versions-of-a-skill-file"},{"title":"Get one version of a skill file","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/skills/{skill_id}/files/{file_path}/versions/{version}","href":"/api-reference/skills/get-one-version-of-a-skill-file"},{"title":"List a skill's recent test runs","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/skills/{skill_id}/test-runs","href":"/api-reference/skills/list-a-skills-recent-test-runs"},{"title":"Run a skill script in the sandbox (SSE)","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/skills/{skill_id}/test-runs","href":"/api-reference/skills/run-a-skill-script-in-the-sandbox-sse"},{"title":"Get a test run","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/skills/{skill_id}/test-runs/{run_id}","href":"/api-reference/skills/get-a-test-run"}]},{"group":"Technicians","pages":[{"title":"List removed Teams users","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/teams-users/removed","href":"/api-reference/technicians/list-removed-teams-users"},{"title":"Remove a Teams user","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/teams-users/{user_id}","href":"/api-reference/technicians/remove-a-teams-user"},{"title":"Restore a removed Teams user","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/teams-users/{user_id}/restore","href":"/api-reference/technicians/restore-a-removed-teams-user"},{"title":"List technician groups","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/technician-groups","href":"/api-reference/technicians/list-technician-groups"},{"title":"Create a technician group","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/technician-groups","href":"/api-reference/technicians/create-a-technician-group"},{"title":"Set a technician's groups","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/technician-groups/memberships","href":"/api-reference/technicians/set-a-technicians-groups"},{"title":"Replace a technician group","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/technician-groups/{group_id}","href":"/api-reference/technicians/replace-a-technician-group"},{"title":"Delete a technician group","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/technician-groups/{group_id}","href":"/api-reference/technicians/delete-a-technician-group"},{"title":"List technician working-hours schedules","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/technician-schedules","href":"/api-reference/technicians/list-technician-working-hours-schedules"},{"title":"Create a technician working-hours schedule","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/technician-schedules","href":"/api-reference/technicians/create-a-technician-working-hours-schedule"},{"title":"Put technicians on a working-hours schedule","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/technician-schedules/assignments","href":"/api-reference/technicians/put-technicians-on-a-working-hours-schedule"},{"title":"List each technician's PSA working hours","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/technician-schedules/psa-hours","href":"/api-reference/technicians/list-each-technicians-psa-working-hours"},{"title":"Replace a technician working-hours schedule","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/technician-schedules/{schedule_id}","href":"/api-reference/technicians/replace-a-technician-working-hours-schedule"},{"title":"Delete a technician working-hours schedule","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/technician-schedules/{schedule_id}","href":"/api-reference/technicians/delete-a-technician-working-hours-schedule"},{"title":"List technicians","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/technicians","href":"/api-reference/technicians/list-technicians"},{"title":"Create a technician","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/technicians","href":"/api-reference/technicians/create-a-technician"},{"title":"List the companies with technician rules","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/technicians/companies","href":"/api-reference/technicians/list-the-companies-with-technician-rules"},{"title":"Set a company's technician rules","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json put /public-api/technicians/companies/{psa_company_id}","href":"/api-reference/technicians/set-a-companys-technician-rules"},{"title":"List the Microsoft accounts Neo knows","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/technicians/microsoft-accounts","href":"/api-reference/technicians/list-the-microsoft-accounts-neo-knows"},{"title":"List the technicians' Slack links","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/technicians/slack-links","href":"/api-reference/technicians/list-the-technicians-slack-links"},{"title":"Match technicians to Slack users again","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/technicians/slack-links/refresh","href":"/api-reference/technicians/match-technicians-to-slack-users-again"},{"title":"Get a technician","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/technicians/{profile_id}","href":"/api-reference/technicians/get-a-technician"},{"title":"Soft-delete a technician","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json delete /public-api/technicians/{profile_id}","href":"/api-reference/technicians/soft-delete-a-technician"},{"title":"Update a technician","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json patch /public-api/technicians/{profile_id}","href":"/api-reference/technicians/update-a-technician"}]},{"group":"Templates","pages":[{"title":"List agent/workflow templates","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/templates","href":"/api-reference/templates/list-agentworkflow-templates"},{"title":"List template categories","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/templates/categories","href":"/api-reference/templates/list-template-categories"},{"title":"Get a template","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/templates/{template_id}","href":"/api-reference/templates/get-a-template"},{"title":"Instantiate a template for this tenant","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/templates/{template_id}/instantiate","href":"/api-reference/templates/instantiate-a-template-for-this-tenant"}]},{"group":"TIL requests","pages":[{"title":"List technician-in-the-loop requests","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/til-requests","href":"/api-reference/til-requests/list-technician-in-the-loop-requests"},{"title":"List the tenant's distinct TIL approvers","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/til-requests/approvers","href":"/api-reference/til-requests/list-the-tenants-distinct-til-approvers"},{"title":"Approve or reject multiple TIL requests","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/til-requests/bulk-decision","href":"/api-reference/til-requests/approve-or-reject-multiple-til-requests"},{"title":"Dismiss pending TIL requests without a decision","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/til-requests/dismiss","href":"/api-reference/til-requests/dismiss-pending-til-requests-without-a-decision"},{"title":"Approval-queue stats","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/til-requests/stats","href":"/api-reference/til-requests/approval-queue-stats"},{"title":"Get a TIL request","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json get /public-api/til-requests/{request_id}","href":"/api-reference/til-requests/get-a-til-request"},{"title":"Approve, reject, or request changes on a TIL request","deprecated":null,"version":null,"openapi":"https://api.neoagent.io/public-api/openapi.json post /public-api/til-requests/{request_id}/decision","href":"/api-reference/til-requests/approve-reject-or-request-changes-on-a-til-request"}]}]}]},{"tab":"Changelog","href":"https://feedback.neoagent.io/changelog"}]},"basePath":"","title":"Update an agent - Neo Agent","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CybtLBIt.js","utils-BMLj2fvV.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-B6In562Y.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Dr8Mfhp9.js","snippetPresets-2rmQvMVl.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-WMqJYdZj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CJ-MlPHu.js","shallow-dY3TMRCk.js","getApiPlaygroundDisplay-v-1B2bKm.js","CodeSnippet-BDhiTB7U.js","CodeSnippets-D9hnzQcS.js","Page-C4GwDT3_.js","getPastedJson-Th2V45jI.js","icon-BQXch1W9.js","MethodPill-BCqUneP3.js","DuplicateIcon-Q_-bhurZ.js","createIcon-DUjLHRqp.js","DynamicMarkdown-B-f2cqXQ.js","SectionHeading-Da5NsV4v.js","axios-vUo_bRtp.js","Markdown-D13FWkIM.js","clsx-D3Isdib3.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-C-XZBk9h.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink--qIqmmVG.js"]}