How do I run a task through the API?
POST /v1/tasks/:id/run sends an input to a selected live release and returns a complete answer with its validation result. In one request, Orlo selects the release, adds source passages when needed, calls the model with your provider credential, and checks the answer. The key needs inference.run.
This endpoint does not stream tokens. See the task request diagram for the full path.
curl -X POST https://api.useorlo.com/v1/tasks/$TASK_ID/run \
-H "Authorization: Bearer $ORLO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input": {"ticket": "My card was charged twice."}, "explain": "debug"}'
Request fields:
| Field | Meaning |
|---|---|
input |
An object containing the data named by {{field}} references in the saved instructions; values are sent separately as data |
deployment_id |
Optional. Select a live release belonging to this task; an inactive release is refused |
explain |
Optional. default, debug, or audit; the last two add a debug block |
Response:
{
"output": "{\"category\":\"billing\",\"priority\":\"high\"}",
"model": "gpt-4.1-mini",
"trace_id": "9c1e…",
"validation": { "valid": true, "warnings": [], "score": 1, "abstain": false, "escalate": false },
"debug": {
"latency_ms": 812,
"tokens": { "input": 412, "output": 38 },
"deployment_id": "…", "task_version_id": "…", "strategy": "prompt",
"validation": { "valid": true, "warnings": [], "score": 1, "abstain": false, "escalate": false },
"retrieval": null,
"routing": { "mode": "active_fallback" }
}
}
output is a string, even when it contains JSON. Parse it in your application after checking the HTTP status and validation result. The debug block is present only when requested with explain: "debug" or "audit".
The validation block
| Field | Meaning |
|---|---|
status |
passed, failed, or indeterminate when a check could not complete |
valid |
The required checks completed and no error-severity check failed |
warnings |
Messages describing failed checks or validation warnings |
score |
1 for a clean answer, lower by a tenth per warning, 0 when invalid |
abstain |
The answer should not be used as it is |
escalate |
Enough warnings that a person should look |
Decide in your application what each means for the user: show the answer, hold it, or route it to a person. Use trace_id to connect the answer to feedback and its console record. The answer and its rule results are recorded before Orlo returns a successful response.
What a failed rule does depends on the task’s setting. With reject, the request answers 422 VALIDATION_FAILED with the same validation block and the trace_id, and no answer is returned. With retry, Orlo attempts a configured, available fallback model and checks that answer before deciding the result. With warn, the answer comes back with valid: false. An answer marked abstain is always refused. If a required check cannot run, validation is indeterminate with abstain: true; the answer is refused even under warn behavior. Fix the rule before retrying. A fallback cannot repair a check that did not execute.
Orlo can try one configured, available fallback after a temporary transport, throttling, or provider-server failure, while time remains. Authentication failures, unreadable responses, and suspected credential exposure do not trigger a fallback. 504 INFERENCE_TIMEOUT means the request could not complete within its time limit. See inference errors and recovery.
Sources
For a source-backed release, debug.retrieval lists the passages supplied to the model, each with its document, page, and score. The same passages are shown beside the answer in the console.
Select a live release
An explicit deployment_id must belong to this task and be live. An inactive release returns 409 RELEASE_NOT_LIVE; a release from another task returns 404 DEPLOYMENT_NOT_FOUND. Without an explicit ID, Orlo uses an eligible routing-policy choice, then the live release if no choice is available.
Use comparisons to test a candidate before releasing it.
Consistency and response reuse
When the release does not specify a temperature, task requests use 0, matching comparisons. Chat requests can override it. This reduces variation without guaranteeing deterministic answers.
Enable eligible response reuse to avoid repeated model calls. It is off by default; each returned answer still has its own validation and trace.