Skip to main content
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 '
{
  "name": "Triage agent (v2)"
}
'
{
  "data": {
    "created_at": "2023-11-07T05:31:56Z",
    "id": "<string>",
    "name": "<string>",
    "updated_at": "2023-11-07T05:31:56Z"
  },
  "meta": {
    "request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "timings_ms": {},
    "pagination": {
      "has_more": true,
      "next_cursor": "<string>"
    },
    "warnings": [
      "<string>"
    ]
  }
}

Authorizations

Authorization
string
header
required

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).

Path Parameters

agent_id
string
required

Body

application/json

PUT /public-api/agents/<id> body — a partial patch. Only the fields you send are changed; everything else keeps its current value. autonomy_type and entity_type are immutable. 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.

toolbox MERGES per tool: send only the tools you're changing. Each entry under tool_settings_by_type is merged key-by-key onto that tool's current settings (nested objects merge; scalars and lists — e.g. allowed_users — replace wholesale; an explicit null for a tool key disables that tool). Tools you don't mention keep their settings, so flipping one tool's setting no longer requires resending the whole toolbox. An explicit top-level "toolbox": null still clears the whole toolbox. agent_settings and integrations remain whole-value replaces — send the complete object for those.

actions
Actions · object[] | null
agent_settings
AgentSettings · object

Settings that control the behavior of the agent.

callback_settings
EventMatchSettings · object
description
string | null
group_name
string | null
group_order
integer | null
integrations
Integrations · object

Per-agent integration permissions: which permission-aware integrations (PSA, M365, RMM, etc.) the agent may call, and at what access level.

name
string | null
process_entities_sequentially
boolean | null
process_sub_entities_only_once
boolean | null
schedule
WorkflowSchedule · object
show_in_psa_pod
boolean | null
state
enum<string> | null
Available options:
ENABLED,
DISABLED,
DELETED
ticket_conditions
PsaTicketConditions · object
time_entry_conditions
PsaConditions · object
toolbox
Toolbox · object
trigger_type
enum<string> | null
Available options:
SCHEDULED,
TRIGGERED,
NONE

Response

Success.

data
Agent · object
required

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.

meta
object
required