Skip to navigation

Approve a held agent action (and execute it)

View as Markdown

Approves one write an agent asked for and the workspace’s approval policy held for review (GET /api/agent-approvals lists them). By default approving executes the action, exactly once, with the exact arguments the agent sent, and the response carries the real outcome. Send "execute": false to approve it without executing — the decision is recorded and a person does it by hand.

Payments held by the platform. When a payment is confirmed (a Cobre or dLocal charge paid, or a payment receipt confirmed by a bank credit or verified by a person), Jelliu holds one action per connected ERP to register it (tool_source: erp_payment, origin: system, requested by “Jelliu”, valid for 7 days). These are never executed without approval. Approving one creates the payment exactly as shown (Alegra payment or Siigo cash receipt, applied to the matched open invoice), after re-checking that the ERP is still connected and that the invoice still belongs to that customer and still owes at least the amount. When the customer, the invoice or where the money landed could not be determined unambiguously (and always for SAP Business One), the action is held record-only: executable is false, its params.motivo says why, executing it answers 409 AGENT_ACTION_NOT_EXECUTABLE, and it is approved with "execute": false once registered by hand.

What is checked again at execution time. The approval authorizes this action; it does not bypass anything else. Before sending it, every control the agent’s own write would pass is re-checked: the app is still connected (and to the same account the request was made against), the agent is not paused or deleted, the app is still in the agent’s scope and not read-only, the tool is not disabled, the write lane is on, and the month’s execution budget is not spent. If any of these changed, nothing is sent and the action ends in execution_failed with the reason.

Outcomes (status in the response and on the row):

  • executed — it ran and the app confirmed it. executedAt and executionActionId (the agent action log entry for the execution) are set.
  • execution_failed — it definitely did not happen: a control refused it or the app rejected it. executionError says why.
  • execution_unknown — it was sent but the answer was lost (timeout, network). It may or may not have happened; check the app before doing it again. It is never retried automatically.
  • approved — only with "execute": false: recorded, nothing executed.

The workspace also gets an in-app notification with the outcome.

Idempotency. Exactly once. Two concurrent approvals of the same action execute it a single time; the other request gets 409 AGENT_ACTION_APPROVAL_CLOSED naming the state and who decided it. An expired action is never executed. Do not retry a 200 whose status is execution_unknown: the action cannot be approved twice, by design.

Access

  • Required role: admin (a person, or a key with full scope). An agent key can never approve its own action.
  • Rate limit: Audit routes limit. See Rate limits.
  • Plan: Available on every plan.

Authentication

AuthorizationBearer

Workspace API key: jl_ followed by 64 lowercase hex characters, created by the workspace owner in the dashboard (Settings → API Keys) and sent as Authorization: Bearer jl_.... The plaintext is shown once, at creation; Jelliu stores only a SHA-256 hash. A workspace can hold up to 25 active keys.

ScopeGET / HEADPOST / PUT / PATCH / DELETEAdmin-only routes
readYesNoNo
writeYesYesNo
fullYesYesYes

Operations restricted to admins or owners reject keys without the full scope with 403, and say so in their description. No key, whatever its scope, can mint or revoke API keys or rotate a webhook secret — that requires a signed-in owner session. A revoked key stops authenticating within about 10 seconds. See Authentication.

Path parameters

idstringRequiredformat: "uuid"
UUID of the held action.

Request

This endpoint expects an object.
notestringOptional<=1000 characters
Optional note from the approver, stored with the decision.
executebooleanOptionalDefaults to true

true (default) executes the action once. false approves it without executing (record-only). Must be a JSON boolean; a string is rejected with 400.

Response

The approval was recorded. executed and status say what happened to the action; a 200 does not by itself mean the action ran.

dataobject

Errors

400
Bad Request Error
401
Unauthorized Error
403
Forbidden Error
404
Not Found Error
409
Conflict Error
429
Too Many Requests Error