---
title: "Test-run a task"
method: POST
path: "/tasks/{id}/run_test"
tags: ["Tasks"]
---

# Test-run a task

`POST /tasks/{id}/run_test`

## Request

- Base URL: `https://api.crevio.co/v1`
- URL: `https://api.crevio.co/v1/tasks/{id}/run_test`
- Auth: API key in header `Authorization`

Fire the task once as a test. The run does real research and produces real output, but every write-style tool refuses and every configured delivery is captured on the run instead of being sent. Poll the returned run, then read `captured_deliveries` for the exact message each channel would have received. Called from an agent chat, the chat is signalled when the run ends, so it need not poll.

To test an event-triggered task against a sample record (a fake order, lead or form answer), pass `event`: the run receives it as its trigger event exactly as it would a real one, with `type` set to the task's `event_conditions.event_type`. Test the real task this way; there is no need to copy it onto a temporary webhook source. Without `event`, an event task runs with no trigger event. The task's `condition_script` is not applied to a test run.

A test run never counts as a run of the task: it does not advance `next_run_at`, does not reset or trip the failure breaker, does not count toward autonomy graduation or `max_runs_per_day`, and does not appear in the run history a later run reads. It does consume credits. 400 if `event` is malformed or the task is not event-triggered; 422 if the task already has a run in flight or the account is out of AI credits.

## Path parameters

- `id` string, required

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `event` object: Event tasks only: the sample event the test run receives as its trigger event, shaped as a real one. `data` is what the run reads as `event.data`: for an app event, `{"object": <the record as its GET endpoint returns it>}`, e.g. `{"data": {"object": {"id": "ord_test", "amount": 25000, "status": "succeeded", "customer": {"email": "jane@example.com", "first_name": "Jane"}}}}` for `order.paid`; for a webhook source, the delivery's JSON body.
    - `type` string: Optional. Must equal the task's `event_conditions.event_type` when given.
    - `data` object, required

## Response `202`

Accepted — the test run executes in the background; poll GET /task_runs/{id}.

- AiTaskRun
  - `id` string, required
  - `object` string, required
  - `task_id` string, required
  - `task_name` string, required
  - `chat_id` string, nullable, required: The run's own conversation (`aichat_...`): what it read, called and said. Read it with `search_chats`.
  - `status` 'pending' | 'running' | 'completed' | 'failed' | 'needs_input' | 'timed_out' | 'unknown' | 'skipped', required
  - `summary` string, nullable, required
  - `error_message` string, nullable, required
  - `test_run` boolean, required
  - `input_tokens` integer, required
  - `output_tokens` integer, required
  - `credits_consumed` integer, required
  - `tool_calls_count` integer, required
  - `duration_ms` integer, nullable, required
  - `started_at` string, date-time, nullable, required
  - `completed_at` string, date-time, nullable, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `skip_reason` 'condition' | 'no_paid_plan_or_credits' | 'no_recent_activity' | 'no_task_activity' | 'no_personal_sources' | 'wake_gate' | 'wake_limit' | 'rate_limited' | 'misfire' | 'task_busy' | 'account_at_capacity' | 'null', nullable, required
  - `skip_count` integer, required
  - `delivery_status` 'delivered' | 'not_delivered' | 'not_requested' | 'unknown', required
  - `completion` 'verified' | 'recorded' | 'recovered' | 'null', nullable, required: How the agent closed a completed run: `verified` (it re-checked the result), `recorded` (it reported without re-checking), or `recovered` (it never reported; `summary` is its last message). Null unless an agent turn completed the run.
  - `trigger_source` 'scheduled' | 'event' | 'manual', required
  - `trigger_event` object, nullable, required: The event that started this run, `{type, data}`, exactly as the run received it; `data` matches the event's webhook payload. Null for a run no event started. POST /task_runs/{id}/replay runs the task again on it.
  - `replay_of` string, nullable, required: The run (`trun_...`) whose event this run replays. Null unless started by POST /task_runs/{id}/replay.
  - `captured_deliveries` unknown[], required
    - unknown
  - `pending_approval_ids` unknown[], required
    - unknown

## Other responses

- `400`: Bad request
- `401`: Authentication required
- `403`: Forbidden
- `404`: Resource not found
- `422`: Validation error
- `429`: Rate limit exceeded — 600 requests per minute per credential. Retry after the number of seconds in `Retry-After`.
- `500`: Internal server error

---

[API](https://skmtc.dev/crevio/apis/crevio-api-v1.md) · [All operations](https://skmtc.dev/crevio/apis/crevio-api-v1/llms.txt) · [OpenAPI document](https://skmtc.dev/crevio/apis/crevio-api-v1/revisions/2219f18ad651?raw)
