---
title: "List output deliveries and notifications for an agent run"
method: GET
path: "/api/agent-runs/{runId}/deliveries"
tags: ["Agent Runs"]
---

# List output deliveries and notifications for an agent run

`GET /api/agent-runs/{runId}/deliveries`

## Request

- Base URL: `https://app.cotool.ai`
- URL: `https://app.cotool.ai/api/agent-runs/{runId}/deliveries`
- Auth: HTTP bearer

Returns each output delivery and acceptance-criteria notification issued for the run, with its status, what was sent, and the most recent error.

## Path parameters

- `runId` string, uuid, required: Agent run (chat) ID

## Response `200`

Successful response

- object
  - `deliveries` object[], required: Deliveries for the run, oldest first
    - `id` string, uuid, required: Delivery ID
    - `runId` string, uuid, required: Agent run (chat) ID this delivery belongs to
    - `turnId` string, uuid, required: Turn of the run whose output or evaluation was sent
    - `evalId` string, uuid, nullable, required: Evaluation whose failed criteria were sent, for acceptance-criteria deliveries
    - `agentId` string, uuid, required: Agent that produced the run
    - `destinationId` string, uuid, required: Output destination ID
    - `destinationType` 'webhook' | 'teams' | 'slack' | 'pagerduty' | 'linear' | 'tines' | 'incidentio', required: Destination type
    - `destinationName` string, required: Destination name
    - `destinationDeleted` boolean, required: True when the destination has since been deleted; such deliveries cannot be resent
    - `purpose` 'response' | 'acceptance-criteria', required: What was sent: the turn output or an acceptance-criteria notification
    - `status` 'pending' | 'in_progress' | 'retrying' | 'sent' | 'failed', required: Status of the current attempt
    - `attempt` integer, required: Latest job retry number reported by the current attempt
    - `resendCount` integer, required: How many times a user has resent this delivery
    - `preview` object, required: Preview of the content sent
      - `title` string: Short title of the content that was (or will be) sent
      - `text` string, required: Truncated preview of the content that was (or will be) sent
    - `sentSummary` object, nullable, required: Details recorded when the current attempt sent
      - `target` string, required: Credential-free description of where it went (hostname, channel list, team, dedup key)
      - `refs` object[], required: Artifacts created or messages posted by the send
        - `label` string, required: Human-readable label for the created/sent artifact (e.g. Linear issue identifier)
        - `url` string: Direct link to the artifact when the destination provides one
        - `externalId` string: Destination-side identifier (e.g. Slack message ts, Linear issue id)
      - `slackChannels` object[]: Per-channel results for Slack destinations
        - `channelId` string, required: Slack channel ID
        - `status` 'sent' | 'skipped', required: Whether the message was posted to this channel
        - `messageTs` string: Slack message timestamp when posted by this attempt
        - `threadTs` string: Thread root the message replied in, when it was a reply
        - `skipReason` string: Why the channel was skipped (e.g. archived, bot not in channel)
      - `partial` boolean, required: True when at least one target (e.g. a Slack channel) was skipped
    - `error` object, nullable, required: Most recent error of the current attempt, if any
      - `message` string, required: Error message from the most recent failed attempt
      - `name` string: Error class name, when available
      - `attempt` integer, required: Job retry number that produced this error
      - `at` string, required: ISO timestamp when the error was recorded
    - `lastEnqueuedAt` string, required: ISO timestamp when the current attempt was queued
    - `startedAt` string, nullable, required: ISO timestamp when the current attempt first started
    - `sentAt` string, nullable, required: ISO timestamp when the current attempt sent
    - `failedAt` string, nullable, required: ISO timestamp when the current attempt failed
    - `attempts` object[], required: Every attempt of this delivery, oldest first
      - `id` string, uuid, required: Attempt ID
      - `number` integer, required: Position of this attempt within the delivery, starting at 1
      - `trigger` 'initial' | 'resend', required: What opened the attempt: the run itself or a user resend
      - `requestedByUserId` string, uuid, nullable, required: User who requested the resend, when the trigger is resend
      - `jobId` string, uuid, required: The delivery job that ran this attempt
      - `jobAttempt` integer, required: Latest retry number the job reported
      - `status` 'pending' | 'in_progress' | 'retrying' | 'sent' | 'failed', required: Attempt status
      - `error` object, nullable, required: Most recent error of this attempt, if any
        - `message` string, required: Error message from the most recent failed attempt
        - `name` string: Error class name, when available
        - `attempt` integer, required: Job retry number that produced this error
        - `at` string, required: ISO timestamp when the error was recorded
      - `sentSummary` object, nullable, required: Details recorded when this attempt sent
        - `target` string, required: Credential-free description of where it went (hostname, channel list, team, dedup key)
        - `refs` object[], required: Artifacts created or messages posted by the send
          - `label` string, required: Human-readable label for the created/sent artifact (e.g. Linear issue identifier)
          - `url` string: Direct link to the artifact when the destination provides one
          - `externalId` string: Destination-side identifier (e.g. Slack message ts, Linear issue id)
        - `slackChannels` object[]: Per-channel results for Slack destinations
          - `channelId` string, required: Slack channel ID
          - `status` 'sent' | 'skipped', required: Whether the message was posted to this channel
          - `messageTs` string: Slack message timestamp when posted by this attempt
          - `threadTs` string: Thread root the message replied in, when it was a reply
          - `skipReason` string: Why the channel was skipped (e.g. archived, bot not in channel)
        - `partial` boolean, required: True when at least one target (e.g. a Slack channel) was skipped
      - `enqueuedAt` string, required: ISO timestamp when the attempt was queued
      - `startedAt` string, nullable, required: ISO timestamp when the job first started this attempt
      - `finishedAt` string, nullable, required: ISO timestamp when the attempt reached sent or failed
    - `createdAt` string, required: ISO timestamp when the delivery was created
    - `updatedAt` string, required: ISO timestamp of the last status change

## Other responses

- `400`: Bad request — input validation failed or the request was malformed
- `401`: Unauthorized — missing or invalid API key / session
- `403`: Forbidden — the authenticated user lacks the required permissions
- `500`: Internal server error

---

[API](https://skmtc.dev/cotool/apis/cotool-api.md) - [All operations](https://skmtc.dev/cotool/apis/cotool-api/llms.txt) - [OpenAPI document](https://skmtc.dev/cotool/apis/cotool-api/revisions/f5abe0add203?raw)
