# List trigger firings (/en/docs/api/native/automation/listTriggerFirings)





Read the last 30 days of firings newest first. Results include resolved versions, run IDs and failure details.

`GET /automation/v1/triggers/{id}/firings`

## Authentication [#authentication]

`Authorization: Bearer $PRAXIS_API_KEY`

## Request fields [#request-fields]

| Parameter | Type | Description |
| --- | --- | --- |
| path: id | `string` | required; Trigger ID (trg_). |
| query: limit | `integer` | optional; Page size: integer 1–100, default 25. minimum: 1; maximum: 100 |
| query: cursor | `string` | optional; Opaque next_cursor from the previous page; keep the original filters when paging. |
| query: outcome | `"accepted"` / `"started"` / `"skipped_overlap"` / `"missed"` / `"failed"` / `"deduped"[]` | optional; Filter outcomes using comma-separated values (OR); combined with run_id using AND. |
| query: run_id | `string` | optional; Return only firings associated with this exact run ID. |

## Examples [#examples]

[SDK installation and example environment](/en/docs/api/native/automation)

Set these environment variables to your own resources:

| Variable | Source |
| --- | --- |
| TRIGGER_ID | [Trigger id; resume before sending a webhook](/en/docs/api/native/automation/createTrigger) |

```bash
: "${TRIGGER_ID:?Set TRIGGER_ID}"
curl --fail-with-body -X GET "https://api.deepraxis.ai/automation/v1/triggers/${TRIGGER_ID}/firings" \
  -H "Authorization: Bearer $PRAXIS_API_KEY"
```

```typescript
import { createAutomationClient } from '@deepraxis/sdk/automation';

function env(name: string): string {
  const value = process.env[name];
  if (!value) throw new Error(`Set ${name}`);
  return value;
}
const automation = createAutomationClient({
  apiKey: env('PRAXIS_API_KEY'),
  baseUrl: 'https://api.deepraxis.ai',
  maxRetries: 0,
  timeoutMs: 90_000,
});
const result = await automation.triggers.firings.list({
  "path": {
    "id": env("TRIGGER_ID")
  }
});
console.log(result);
```

## Response [#response]

### HTTP 200 [#http-200]

Success

`application/json`

| Field | Type | Description |
| --- | --- | --- |
| data | `object[]` | required; Firing records from the last 30 days on this page, ordered by created_at descending, then id descending. |
| data[].id | `string` | required; Firing record id; records are kept for 30 days. |
| data[].trigger_id | `string` | required; Id (trg_) of the trigger this firing belongs to. |
| data[].scheduled_at | `string` | required; Planned firing time (RFC 3339 UTC); for webhooks, the time the request arrived. format: "date-time" |
| data[].fired_at | `string` | required; Time the firing actually happened (RFC 3339 UTC). format: "date-time" |
| data[].outcome | `"accepted"` / `"started"` / `"skipped_overlap"` / `"missed"` / `"failed"` / `"deduped"` | required; Firing outcome. accepted means persisted and awaiting processing; started means a run was created; skipped_overlap means skipped because the previous run was still active; missed means it was later than the catch-up window and was not run; failed means creating the run failed; deduped means it repeated a webhook-id seen within 24 hours. |
| data[].run_id | `string` / `null` | required; Id (run_) of the run this firing created, or null if no run was created. |
| data[].resolved_version | `string` / `null` | required; Exact version this firing resolved to; null when not yet resolved or when it failed before resolving. |
| data[].error | `object` / `null` | required; Reason &#123;code, message&#125; when the firing failed; null otherwise. |
| data[].error (variant 1).code | `string` | required; Error code of the failure. |
| data[].error (variant 1).message | `string` | required; Message describing the failure. |
| next_cursor | `string` / `null` | required; Cursor for the next page: pass it unchanged as cursor with the same filters; null when there are no more pages. No total is returned. |

### Measured response [#measured-response]

HTTP 200

```json
{
  "data": [
    {
      "id": "frg_00mv67n833fec8a47a90904782ac1a8f1fef264379",
      "trigger_id": "trg_00mv67mzzqa0d63b98d72446dd9d1331051a3e100e",
      "scheduled_at": "2026-10-13T04:58:20.215Z",
      "fired_at": "2026-10-13T04:58:20.215Z",
      "outcome": "started",
      "run_id": "run_00mv67n8ao7de994212f453fdfe7def756b57ec5cdeb562a1222f554c6f3d9f428ec25480e",
      "resolved_version": "1.0.0",
      "error": null
    },
    {
      "id": "frg_00mv67n6in516077a64cfc4102a4da939476a3fa78",
      "trigger_id": "trg_00mv67mzzqa0d63b98d72446dd9d1331051a3e100e",
      "scheduled_at": "2026-10-13T04:58:18.384Z",
      "fired_at": "2026-10-13T04:58:18.384Z",
      "outcome": "started",
      "run_id": "run_00mv67n6vvebb47a96bf4b54630d8a07786ec923a68d3b722c2f7ffca4e0a553053c4a5421",
      "resolved_version": "1.0.0",
      "error": null
    }
  ],
  "next_cursor": null
}
```

## Errors [#errors]

| HTTP | Codes and description |
| --- | --- |
| 400 | INVALID_PARAMS: Invalid request parameters, path, cursor, or body format. |
| 404 | TRIGGER_NOT_FOUND: The trigger does not exist or is inaccessible. Webhook authentication failures also use this code. |
| default | RFC 9457 automation problem. 429 includes Retry-After. |

[Authentication and common errors](/en/docs/api/errors) · Retain the `X-Request-Id` response header for troubleshooting.
