API reference for user management, log viewing, master data management, shared memory search, and project operations. For end-user-facing APIs (Chat / Conversations / Files / Search / public master data), see the User API Reference. For MCP / A2A connection methods, see the Connection Methods Guide.
SaaS Edition Only
All endpoints documented in this reference are available only in the SaaS edition. On the Marketplace edition, administrative operations are performed exclusively through the Admin Console.
All API requests require a Bearer token in the Authorization header.
Authorization: Bearer <access_token>
If the token is invalid or missing, 401 Unauthorized is returned. Some endpoints require additional scopes. If the required scope is missing, 403 Forbidden is returned.
List retrieval endpoints use one of two schemes. Which one applies is fixed per endpoint. Organization and job type lists do not support pagination and always return all records.
Cursor value for the next page. Pass back the cursor from the previous response as-is
Responses include hasMore. When it is true, pass the cursor value in the next request to retrieve the next page. Treat cursor as opaque: do not interpret it, just pass the previous value back.
The endpoint using this scheme is the project list. It does not use page (it is ignored if specified).
The APIs on this page handle requests as follows. See each endpoint's description and error responses for endpoint-specific handling.
Query parameters and body fields that are not in the specification are ignored. However, a field that the service accepts but this page does not document may still return 400 Bad Request if its type or value is invalid.
An invalid value for a documented query parameter returns 400 Bad Request.
A malformed JSON body returns 400 Bad Request (invalid_body).
Sending a body with a Content-Type other than application/json to an endpoint that accepts a JSON body returns 415 Unsupported Media Type (unsupported_media_type). However, if reading the body fails first with 400 (malformed JSON) or 413 (over the size limit), that error is returned instead.
A body field of the wrong type returns 400 Bad Request.
Responses include an x-request-id header. The service assigns this value, and a value sent in the request is not used. When you contact support, please tell us this value.
{ "memories":[ { "text":"Sales reports can be created from the 'Monthly Reports' tab in the dashboard", "type":"knowledge", "scope":"organization", "createdAt":"2026-03-15T10:30:00.000Z", "score":0.85 } ] }
Communication error with an upstream service (error.type: upstream_error)
504
Upstream service response timeout (error.type: upstream_error, error.code: upstream_timeout)
When the search succeeds with no matches, 200 is returned with an empty memories array. Upstream failures return 502 / 504 instead of an empty array, so an empty array in a 200 response does not indicate a failure.
View audit logs, LLM logs, LLM Gateway logs, access logs, and guardrail alerts. All list endpoints support page-based pagination and date range filters.
Start date (an existing date in YYYY-MM-DD format, UTC). A value in another format, a date that does not exist, or a non-string value returns 400
to
string
—
End date (an existing date in YYYY-MM-DD format, UTC). Includes the end of the specified day. A value in another format, a date that does not exist, or a non-string value returns 400
GET/v1/admin/audit-logs
List audit logs. Returned in descending order of creation date.
Number of tool calls — not a list of tool names, and not a count of distinct tools (calling the same tool 5 times gives 5). null means not measured; 0 means the run was measured and made no tool call. The two are distinct — do not treat 0 as null.
llmLogs[].success
boolean | null
Success/failure
llmLogs[].agentType
string | null
Agent type
llmLogs[].agentLevel
string | null
Agent level
llmLogs[].taskComplexity
string | null
Task complexity
llmLogs[].currentMessage
string | null
Current message
llmLogs[].contextSummary
string | null
Context summary
llmLogs[].suggestedApproach
string | null
Suggested approach
llmLogs[].conversationGoal
string | null
Conversation goal
llmLogs[].finalContent
string | null
Final output content
llmLogs[].metadata
object | null
Supplementary metadata that varies by operation (keys vary)
{ "llmLogs":[ { "llmLogId":"33098", "timestamp":"2026-04-19T04:12:51.102Z", "service":"agent-executor", "operation":"agent.intent.completed", "durationMs":5574.6, "conversationId":"3b72544d-d6b5-4577-b5f3-c39293124a57", "intentType":"complex_task", "confidenceScore":0.95, "toolsUsed":null, "success":null, "agentType":"intent", "agentLevel":"default", "taskComplexity":null, "currentMessage":"Tell me about this URL https://example.com/path", "contextSummary":"User is asking about a URL.", "suggestedApproach":"execute_single_tool", "conversationGoal":"Information about the contents or purpose of the specified URL", "finalContent":null, "metadata":{ "message.id":"02038f42-154b-4363-9beb-d31512934ec5", "task.complexity":"moderate", "detected_language":"en", "requires_planning":true }, "createdAt":"2026-04-18T19:16:16.964Z" }, { "llmLogId":"33097", "timestamp":"2026-04-19T04:12:48.730Z", "service":"agent-executor", "operation":"agent.guardrail.completed", "durationMs":3170.34, "conversationId":"3b72544d-d6b5-4577-b5f3-c39293124a57", "intentType":null, "confidenceScore":null, "toolsUsed":null, "success":null, "agentType":"intent.guardrails", "agentLevel":null, "taskComplexity":null, "currentMessage":null, "contextSummary":null, "suggestedApproach":null, "conversationGoal":null, "finalContent":null, "metadata":{"guardrail_detected":false}, "createdAt":"2026-04-18T19:16:14.619Z" }, { "llmLogId":"33096", "timestamp":"2026-04-19T04:12:33.662Z", "service":"agent-executor", "operation":"agent.intent.completed", "durationMs":4213.47, "conversationId":"4d7c798d-2e3e-4d40-86ab-cbb6c685a3fb", "intentType":"conversation", "confidenceScore":1, "toolsUsed":null, "success":null, "agentType":"intent", "agentLevel":"default", "taskComplexity":null, "currentMessage":"Hello", "contextSummary":"New conversation. User is greeting.", "suggestedApproach":"conversational_response", "conversationGoal":"Greeting exchange with the AI assistant", "finalContent":null, "metadata":{ "message.id":"cea9dbcc-4723-452a-bdcd-aa5f3a0e9ca6", "task.complexity":"simple", "detected_language":"en", "requires_planning":false }, "createdAt":"2026-04-18T19:15:59.681Z" } ], "total":33098, "limit":3, "page":1, "hasMore":true }
GET/v1/admin/llm-gateway-logs
List LLM Gateway logs. Returned in descending order of creation time. One request = one row, recording usage such as model, provider, tokens, cost, and latency.
{ "accessLogs":[ { "timestamp":"2026-04-19T05:17:36.735896", "sourceNamespace":"autonomous-agent", "sourceIp":"127.0.0.1", "method":"CONNECT", "host":"optimizationguide-pa.googleapis.com:443", "path":"", "userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36", "statusCode":200, "durationMs":1, "authzResult":"allowed", "authzReason":"allowed: All allow" }, { "timestamp":"2026-04-19T03:50:36.766451", "sourceNamespace":"autonomous-agent", "sourceIp":"127.0.0.1", "method":"CONNECT", "host":"update.googleapis.com:443", "path":"", "userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36", "statusCode":200, "durationMs":6, "authzResult":"allowed", "authzReason":"allowed: All allow" }, { "timestamp":"2026-04-19T03:45:48.481023", "sourceNamespace":"autonomous-agent", "sourceIp":"127.0.0.1", "method":"CONNECT", "host":"optimizationguide-pa.googleapis.com:443", "path":"", "userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36", "statusCode":200, "durationMs":0, "authzResult":"allowed", "authzReason":"allowed: All allow" } ], "total":57806, "limit":3, "page":1, "hasMore":true, "skippedCount":0 }
GET/v1/admin/access-logs/stats
Retrieves access log stats (the number of requests, the numbers allowed and denied, and the paths and hosts denied most often). Specify the period with the common query parameters from and to (both days are included). If omitted, the whole period is used. limit and page are not used.
Lists guardrail alerts. Results are returned in descending order of detection time.
These are records where Prompt Shield (prompt injection and jailbreak attempts) or Text Moderation (harmful content) detected a violation and execution was stopped. The detection surface (sourceSurface) is either AI agent execution (agent_executor) or the LLM Gateway (llm_gateway).
Where Prompt Shield detected the attack. Contains user_prompt (the user input) and document_indexes (positions in attached documents). Document contents are not included
guardrailAlerts[].moderationCategories
object | null
Severity per category. Hate / Sexual / SelfHarm / Violence on a four-level scale of 0, 2, 4, and 6
guardrailAlerts[].moderationThreshold
integer | null
Threshold used for the decision
guardrailAlerts[].policyOutcome
string
Policy outcome. Currently only blocked (execution stopped)
guardrailAlerts[].responseTemplateCode
string | null
Code of the canned response returned to the user
guardrailAlerts[].status
string
Triage status (open: not yet handled / escalated: escalated / closed: resolved / false_positive: false detection)
guardrailAlerts[].resolutionCode
string | null
Resolution code
guardrailAlerts[].resolvedAt
string | null
Resolution time (ISO 8601 format)
guardrailAlerts[].resolvedBy
string | null
User ID of the administrator who resolved the alert
guardrailAlerts[].createdAt
string
Creation time (ISO 8601 format)
guardrailAlerts[].updatedAt
string
Update time (ISO 8601 format)
total
integer
Total number of records
limit
integer
Number of items fetched
page
integer
Page number
hasMore
boolean
Whether a next page exists
About the users who triggered detections
This API does not return information that identifies the user who triggered a detection (user ID, conversation ID, or message ID). It is intended for reviewing guardrail quality and tracking the status of safety responses, and cannot be used to trace the behavior of individual users.
In addition, detections of SelfHarm alone are not recorded as alerts.
CRUD operations for organizations and job types. Unlike the read-only master data endpoints (/v1/organizations, /v1/job-types), creation, updates, and deletion require master:manage scope.
Invalid request body (missing code / name, code or name is not a string, isActive is not a boolean, displayOrder is not an integer, the body is malformed JSON or not a JSON object (code: "invalid_body"), etc.)
415
The body Content-Type is not application/json (code: "unsupported_media_type")
403
master:manage scope is missing
409
An organization with the same code already exists
GET/v1/admin/organizations/:identifier
Get organization detail. Can be specified by UUID or organization code.
Invalid request body (name exceeds 255 characters, neither name nor isActive provided, name is not a string or isActive is not a boolean, the body is malformed JSON or not a JSON object (code: "invalid_body"), etc.). Fields other than name / isActive are ignored
415
The body Content-Type is not application/json (code: "unsupported_media_type")
List job types. Fetches all records (no pagination). Response fields have the same structure as the organizations list (organizations → jobTypes, organization code → job type code).
Invalid request body (missing code / name, code or name is not a string, isActive is not a boolean, displayOrder is not an integer, the body is malformed JSON or not a JSON object (code: "invalid_body"), etc.)
415
The body Content-Type is not application/json (code: "unsupported_media_type")
403
master:manage scope is missing
409
A job type with the same code already exists
GET/v1/admin/job-types/:identifier
Get job type detail. Can be specified by UUID or job type code.
Invalid request body (name exceeds 255 characters, neither name nor isActive provided, name is not a string or isActive is not a boolean, the body is malformed JSON or not a JSON object (code: "invalid_body"), etc.). Fields other than name / isActive are ignored
415
The body Content-Type is not application/json (code: "unsupported_media_type")
403
master:manage scope is missing
404
The specified job type was not found
DELETE/v1/admin/job-types/:identifier
Delete a job type. The response structure is the same as organization deletion.
This section covers calls made with a system integration token (Client Credentials flow). For calls made with an application token (Authorization Code flow), see User API Reference (Projects).
A project is the unit in which multiple agents are placed to carry out work. From an external system you can list projects, start a run, and check run status.
There are two project types, and each is triggered differently.
Type
Description
How runs are triggered
workflow
Advances through steps in order. A run starts from the first enabled step.
POST /v1/projects/{projectId}/runs
cycle
Keeps multiple agents running on their own schedules. An external event can add one extra ad-hoc run.
POST /v1/projects/{projectId}/triggers/{triggerId}/fire
What you can operate on
The projects you can operate on are limited to the project restriction configured in Console (Console Guide — Configuring project restrictions). Specifying a project ID outside that range returns the same 404 Not Found as a project that does not exist. A system integration token can call only the four project API endpoints listed here. Calling any other project API returns 403 Forbidden (forbidden).
Retrieves the list of projects you can access. Supports cursor-based pagination. cycle projects also appear in the list, but they are not valid targets for starting a run (POST /v1/projects/{projectId}/runs).
Resending with the same key returns the same run even after the project has been paused, after the concurrent-run limit has been reached, or after that run has finished.
If a timeout leaves the outcome unknown, simply resend with the same key. Nothing is run twice.
Fires a webhook trigger configured on a cycle project and runs the target agent once, as an extra ad-hoc run. Calling it for a workflow project returns 404 Not Found.
The scheduled runs stay exactly as configured. A fired run is added separately from the schedule. Where an earlier fire has not started running yet, however, a later fire may be merged into that run. Where it is, jobId returns the same value as the earlier fire, so the number of fires and the number of runs do not necessarily match.
A unique ID issued by the sender. Resending the same ID is treated as a duplicate. 1-160 characters using alphanumerics and _ . : @ + - only
payload
any
—
Arbitrary JSON passed to the agent. It is serialized to a JSON string and added to the request sent to the agent; anything beyond 8,000 characters after serialization is omitted
This 202 Accepted means only that the request was recorded as accepted. The run happens afterwards, and its outcome is not part of this response. Do not treat 202 as business success.
Idempotency is decided by the combination of project, trigger, and eventId. Resending the same content returns 202 with result: "duplicate". Sending the same eventId with a different payload returns 409 Conflict (event_conflict).
The request body is malformed JSON or is not a JSON object
415
unsupported_media_type
A request body is sent with a Content-Type other than application/json
403
insufficient_scope
The project:run scope is missing
403
invalid_project_grant
The project restriction is missing or invalid
404
trigger_not_found
The project or trigger does not exist, is not accessible, the trigger is not a webhook trigger, or a workflow project was specified
409
trigger_disabled
The trigger is disabled
409
project_not_active
The project is not in a runnable state
409
placement_unavailable
The target agent placement does not exist, or no execution principal is configured
409
event_conflict
The same eventId was sent with a different payload
413
body_too_large
The request body exceeds 16 KiB
GET/v1/projects/{projectId}/runs/{runId}
Retrieves the status of a run. Besides runs started through the API (POST /v1/projects/{projectId}/runs), runs started from the UI, by email, or on a schedule can also be retrieved. cycle projects do not create runs, so they are out of scope for this endpoint.
Run state. One of "running" (running), "waiting_gate" (awaiting review), "closed_done" (completed), "closed_rejected" (ended by rejection), "closed_failed" (ended by failure) or "cancelled" (cancelled). Any value other than "running" and "waiting_gate" means the run has ended
originType
string | null
How the run started. One of "manual" (started from the UI), "api" (started through the API), "mail" (started by email) or "cron" (scheduled)
originRef
string | null
A reference value that depends on how the run started. For a run started through the API, the Idempotency-Key used to start it
currentStepId
string | null
ID (UUID) of the step in progress. While the run proceeds in separate lanes, the ID of the step before the branch. null for a completed run. For a run that ended for another reason, the ID of the step at that time may remain
startedByRef
string | null
Who or what started the run. See the "Who started the run" table below
actorLabel
string | null
Display name of a starter that is not a user (the system integration name or the sender address of an email). null otherwise
startedAt
string | null
Start time (ISO 8601). null before it starts
endedAt
string | null
End time (ISO 8601). null before it ends
summary
string | null
For a completed run, the output of the last completed step that recorded an output (first 2,000 characters). null if there is no such step and for a run that has not completed
runtimeKind
string | null
Kind of runtime ("autonomous"). May be null for older runs
cancelRequestedAt
string | null
Time (ISO 8601) when cancellation was requested. null if not requested
configRevision
number | null
Revision of the case configuration (Marketplace edition runs only). null for SaaS runs
steps
array
Records of the step runs, in the order they were recorded
steps[].runStepId
string
ID of the step run (starts with "rs:")
steps[].stepId
string | null
Step ID (UUID)
steps[].placementId
string | null
ID (UUID) of the placement that handled the step. null for rows that do not run an agent (such as review steps)
steps[].executionId
string | null
ID of the agent execution. Set once the agent starts running
steps[].conversationId
string | null
ID of the conversation of the agent execution. Set once the agent starts running
steps[].status
string
One of "pending" (waiting to run), "running" (running), "waiting_gate" (awaiting review), "done" (done), "failed" (failed) or "skipped" (skipped)
steps[].attempt
number | null
Retry count within the same visit (starting at 1)
steps[].lane
string | null
ID of the lane the step belongs to. "main" for steps that are not in a separate lane
steps[].scheduledAt
string | null
When the step has a scheduled time, the time (ISO 8601) this row waits for. null once it starts
steps[].startedAt
string | null
Start time (ISO 8601)
steps[].endedAt
string | null
End time (ISO 8601)
steps[].outputSummary
string | null
Summary of the step output
steps[].outcome
string | null
Result of the agent execution. One of "completed", "incomplete", "failed", "timeout", "stopped", "denied" or "skipped". null for rows without a result
steps[].reasonCode
string | null
Reason code for the result
steps[].held
boolean
Whether the step is held because the project is paused and is waiting to resume
steps[].visit
number | null
Which visit to this step this is (increases with send-backs). null for rows without this record
steps[].reworkReason
string | null
Reason for the send-back
steps[].gateFor
string | null
For a review row, the step run (runStepId) it was raised for
steps[].routedFrom
string | null
When steps were skipped by choosing a destination, the step run (runStepId) that chose it
steps[].late
string | null
Why a result that arrived late was not used to advance the run
steps[].gate
object | null
Summary of a review step. null for rows that are not review steps
steps[].gate.decision
string | null
One of "proceed", "send_back" or "reject". null if not decided yet
steps[].gate.waitSource
string | null
What the review waits for. "human" (a person's decision) or "external" (an external condition)
plannedPlacements
array
Order of steps and placements planned to run, based on the configuration when the run started
plannedPlacements[].stepId
string | null
Step ID (UUID)
plannedPlacements[].placementId
string | null
Placement ID (UUID). null for review steps and steps without an agent
lanes
array
Status of each lane after the branch. An empty array before the branch and for runs that do not use lanes
lanes[].laneId
string
Lane ID
lanes[].name
string | null
Lane name
lanes[].position
number | null
Lane order (starting at 1)
lanes[].state
string
One of "running" (running), "waiting_gate" (awaiting review), "arrived" (waiting to join) or "closed" (ended)
lanes[].currentStepId
string | null
ID (UUID) of the step in progress in that lane. null for a lane waiting to join. For a lane that has ended, the ID of its last step may remain
lanes[].arrived
boolean
Whether the lane has reached the join point
The fields are the same regardless of the token used for the call (an application or a system integration).
The same 404 Not Found is returned whether the project does not exist or is not accessible, and the response does not reveal which of the two applies. The code is fixed per endpoint: project_not_found for starting a run, trigger_not_found for firing a trigger, and run_not_found for run status.
When the type is out of scope
Calling trigger fire on a workflow project, or run status on a cycle project, returns 404. Starting a run on a cycle project is the one exception: it returns 409 unsupported_project_type.
Request body
When you send a body to start a run or fire a trigger, make it a JSON object. Anything other than Content-Type: application/json returns 415, malformed JSON or a body that is not a JSON object returns 400 (invalid_body), and a body larger than 16 KiB returns 413.
Unknown fields / queries
Fields and query parameters that are not in the specification are ignored. An invalid value for a documented query parameter, or a cursor that cannot be read, returns 400 Bad Request.
Timeouts
504 Gateway Timeout does not mean "it did not run". Resend a run start with the same Idempotency-Key, and a trigger fire with the same eventId and the same body.
All error responses are returned with the following common structure.
Field
Type
Description
error.type
string
Error category. One of "invalid_request_error", "authentication_error", "insufficient_scope_error", "forbidden_error", "not_found_error", "conflict_error", "payload_too_large_error", "rate_limit_error", "server_error", or "upstream_error"
The parameter name that caused the error. Included only for validation errors
error.suggested_action
string
Recommended action to resolve the error. Included only for some errors
JSON
{ "error":{ "type":"invalid_request_error", "message":"Invalid parameter: limit", "code":"invalid_parameter", "param":"limit", "suggested_action":"limit must be between 1 and 100" } }
Automatically Recorded Management Operations SaaS
The following management operations automatically generate an audit log entry.