---
title: "List Runs"
method: GET
path: "/api/v1/campaigns/{campaign_id}/runs"
tags: ["campaigns"]
---

# List Runs

`GET /api/v1/campaigns/{campaign_id}/runs`

## Request

- Base URL: `https://app.kaminari.ad`
- URL: `https://app.kaminari.ad/api/v1/campaigns/{campaign_id}/runs`
- Auth: HTTP bearer

List run history for a campaign (paginated).

``limit`` is capped at 200 — runs accrue over time (daily cron
campaigns build up thousands of rows), so iteration via
``page``/``limit`` is mandatory instead of a single unbounded
response.

## Path parameters

- `campaign_id` string, uuid, required

## Query parameters

- `page` integer
- `limit` integer

## Response `200`

Successful Response

- PaginatedResponseRunResponse
  - `items` RunResponse[], required
    - `id` string, uuid, required
    - `campaign_id` string, uuid, required
    - `label` string, required
    - `total` integer, required
    - `completed` integer, required
    - `failed` integer, required
    - `partial` integer, required
    - `cancelled` integer, required
    - `source` 'ui' | 'api', required: Where the run was initiated from. ``UI`` — explicit ``POST /campaigns/{id}/run`` from the dashboard. ``API`` — auto-created bucket for ``POST /api/v1/scans`` requests that carry a ``campaign_id`` but no ``run_id``. One API run per (campaign, organization, UTC-day).
    - `created_at` string, date-time, required
  - `total` integer, required
  - `page` integer, required
  - `limit` integer, required
  - `pages` integer, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/kaminari/apis/kaminari-ad-api.md) · [All operations](https://skmtc.dev/kaminari/apis/kaminari-ad-api/llms.txt) · [OpenAPI document](https://skmtc.dev/kaminari/apis/kaminari-ad-api/revisions/013f86e2fd32?raw)
