- Create an API token in the dashboard.
POSTa case to your workflow’s cases endpoint with itsattributes.- Fetch the case to read its current status and attributes.
- Optionally, update the case’s status — for example to close it from your own system.
This endpoint only works for workflows whose case source is direct. Ticketing and email workflows take in cases through their own channels and can’t be written to with this API.
Create an API token
- Go to Tokens in the dashboard.
- Click Create Token, choose the API scope, and click Create.
- Copy the token immediately — it’s shown once and cannot be retrieved again. API tokens look like
api_xxxxxxxx….
Find your workflow ID
Open the direct case workflow in the dashboard. The numeric ID is the last segment of its URL (https://dash.champ.ai/app/workflows/<WORKFLOW_ID>). You’ll use it in the request path below.
Create a case
Send aPOST request to the workflow’s cases endpoint:
integer
required
Path parameter. The numeric ID of a direct case workflow.
string
required
Request header.
Bearer <YOUR_API_TOKEN> — an API-scoped token from the Tokens page.string
Request body. A human-readable title for the case. If you omit it or leave it blank, Champ stamps a timestamped
default like
Refund Intake via API - 2026-05-28 17:04:12 UTC.object
Request body. The case’s field values, validated against the workflow’s attribute schema. Any attribute that is required in the workflow must be supplied here. Omit it (or pass
{}) for workflows with no required attributes.string
default:"live"
Request body.
"live" (default) or "test". Test cases run the workflow end to end but don’t count as real work — they’re excluded from webhooks, billing, metrics, and digests, and their runs execute in test mode. Point your staging environment here.The body accepts only
subject, attributes, and mode. Any other top-level key is rejected with a 422 before the case is created.Fetch a case
Read a case’s current status and attributes by ID:case shape as above. As the workflow runs, the status and attributes reflect the latest state.
Update a case’s status
Move a case to a new status yourself — for example to close it when it’s resolved on your side, or to reopen it:string
required
Request body. The status to move the case to. Must be one of the statuses declared on the workflow (see Case statuses).
Error is engine-managed and can’t be set through the API.case in the same shape as above.
The body accepts only
status. Any other top-level key is rejected with a 422.Test cases
Create a case with"mode": "test" to exercise a workflow without creating real work:
Test cases still execute the workflow’s real steps. If your workflow calls external systems or sends messages, design it to branch on the case’s
mode where those actions shouldn’t run for test traffic.Case statuses
Every case carries astatus. A new case always starts as Open, and the workflow’s automation moves it
through the rest as it runs. You can also move it yourself with the update endpoint.
Each workflow ships with three default statuses that are always present:
A workflow can also define custom statuses on top of these defaults (for example
Awaiting customer or
Pending review) to model the intermediate stages of its own process. A case’s status is always one of the
statuses declared on its workflow, so the exact set you’ll see depends on how that workflow is configured — open the
workflow in the dashboard to view its full status list.
A case can only ever be in a status its workflow has defined.
Error is set by the engine when a run fails and
can’t be set through the API — recover an errored case by moving it to another status.Validation errors
Ifattributes doesn’t match the workflow’s schema — a missing required field, a wrong type — the request returns 422 with a validation_errors array. Each entry points to the offending field with a JSON Pointer:
Errors
Errors return a JSON body with an
error message.
