# Get a campaign's queue

`GET https://api.versionseven.ai/v1/campaigns/{campaign_id}/queue`

Queue depth and runway for a campaign: the not-started backlog, in-progress and completed leads, first-touch daily capacity, the number of active senders, the most recent lead refill, and `days_of_runway`, the backlog divided by daily capacity.

- Required scope: `campaigns:read`

## Request

**cURL**

```bash
curl "https://api.versionseven.ai/v1/campaigns/550e8400-e29b-41d4-a716-446655440000/queue" \
  -H "Authorization: Bearer $VICTORIA_API_KEY"
```

**Node.js**

```javascript
const response = await fetch("https://api.versionseven.ai/v1/campaigns/550e8400-e29b-41d4-a716-446655440000/queue", {
  headers: {
    Authorization: `Bearer ${process.env.VICTORIA_API_KEY}`,
  },
});

const data = await response.json();
```

**Python**

```python
import os

import requests

response = requests.get(
    "https://api.versionseven.ai/v1/campaigns/550e8400-e29b-41d4-a716-446655440000/queue",
    headers={
        "Authorization": f"Bearer {os.environ['VICTORIA_API_KEY']}",
    },
)
data = response.json()
```

## Headers

- `Authorization` (string, required): `Bearer` followed by a space and your API key, for example `Bearer vk_…`.

## Path parameters

- `campaign_id` (string · uuid, required): ID of the campaign.

## Response

### `200`

```json
{
  "campaign_id": "550e8400-e29b-41d4-a716-446655440000",
  "queue": {
    "active_senders": 0,
    "backlog": 0,
    "capacity_source": "none",
    "completed": 0,
    "daily_capacity": 0,
    "days_of_runway": 1,
    "enabled_accounts": [
      "string"
    ],
    "has_filters": false,
    "in_progress": 0,
    "is_active": false,
    "last_refill": {},
    "limits": {},
    "name": "string",
    "refill_policy": {},
    "total": 0,
    "warnings": [
      "string"
    ]
  },
  "active_senders": 0,
  "backlog": 0,
  "capacity_source": "none",
  "completed": 0,
  "daily_capacity": 0,
  "days_of_runway": 1,
  "enabled_accounts": [
    "string"
  ],
  "has_filters": false,
  "in_progress": 0,
  "is_active": false,
  "last_refill": {},
  "limits": {},
  "name": "string",
  "refill_policy": {},
  "success": true,
  "total": 0,
  "warnings": [
    "string"
  ]
}
```

- `campaign_id` (string, required)
- `queue` (object, required): The queue report. Prefer this over the repeated top-level fields.
  - `active_senders` (integer, optional, default `0`)
  - `backlog` (integer, optional, default `0`): Sequence leads not yet started (is\_active=false, completed=false)
  - `capacity_source` (string, optional, default `"none"`, one of `"campaign"`, `"org"`, `"none"`)
  - `completed` (integer, optional, default `0`)
  - `daily_capacity` (integer, optional, default `0`): Sum of first-touch daily limits (connection\_request + email)
  - `days_of_runway` (number or null, optional): backlog / daily\_capacity; null when capacity or senders are zero
  - `enabled_accounts` (array of strings, optional)
  - `has_filters` (boolean, optional, default `false`): Whether lead\_database\_filters is set (required for auto-refill)
  - `in_progress` (integer, optional, default `0`): Sequence leads mid-sequence
  - `is_active` (boolean, optional, default `false`)
  - `last_refill` (object or null, optional): The most recent lead-refill job for the campaign (status, counts, timestamps), or null if none has run
  - `limits` (object, optional): Per-platform {daily\_limit, current\_usage, reset\_date}
  - `name` (string or null, optional)
  - `refill_policy` (object or null, optional)
  - `total` (integer, optional, default `0`)
  - `warnings` (array of strings, optional)
- `active_senders` (integer, optional, default `0`)
- `backlog` (integer, optional, default `0`): Sequence leads not yet started (is\_active=false, completed=false)
- `capacity_source` (string, optional, default `"none"`, one of `"campaign"`, `"org"`, `"none"`)
- `completed` (integer, optional, default `0`)
- `daily_capacity` (integer, optional, default `0`): Sum of first-touch daily limits (connection\_request + email)
- `days_of_runway` (number or null, optional): backlog / daily\_capacity; null when capacity or senders are zero
- `enabled_accounts` (array of strings, optional)
- `has_filters` (boolean, optional, default `false`): Whether lead\_database\_filters is set (required for auto-refill)
- `in_progress` (integer, optional, default `0`): Sequence leads mid-sequence
- `is_active` (boolean, optional, default `false`)
- `last_refill` (object or null, optional): The most recent lead-refill job for the campaign (status, counts, timestamps), or null if none has run
- `limits` (object, optional): Per-platform {daily\_limit, current\_usage, reset\_date}
- `name` (string or null, optional)
- `refill_policy` (object or null, optional)
- `success` (boolean, optional, default `true`)
- `total` (integer, optional, default `0`)
- `warnings` (array of strings, optional)

## Errors

Errors share one JSON body: `success`, `error`, `message`, optional `details`, and `request_id`. For example:

```json
{
  "success": false,
  "error": "UNAUTHORIZED",
  "message": "Invalid or inactive API key",
  "request_id": "734d11a1-54d4-414c-9e8d-4e1ada977db4"
}
```

| Status | Code | Meaning |
| --- | --- | --- |
| 401 | `UNAUTHORIZED` | The `Authorization` header is missing or malformed, or the API key is unknown or has been deactivated. |
| 401 | `API_KEY_EXPIRED` | The API key is past its expiry date. Create a new key in the Victoria AI app. |
| 403 | `INSUFFICIENT_SCOPE` | The API key doesn't have the scope this endpoint requires, such as `leads:write`. |
| 403 | `ORGANIZATION_DEACTIVATED` | The organization that owns this API key has been deactivated. |
| 404 | `CAMPAIGN_NOT_FOUND` | No campaign with this ID exists in your organization. |
| 404 | `NOT_FOUND` | No endpoint matches the path. A resource ID in the path that isn't a valid UUID also answers `NOT_FOUND`. |
| 429 | `RATE_LIMITED` | Too many requests for this API key: more than 100 a minute to one endpoint, or 600 a minute in total. Retry after the number of seconds in the `Retry-After` header. See [Rate limits](https://docs.versionseven.ai/guides/rate-limits). |
| 500 | `INTERNAL_ERROR` | Something failed on our side. The response never includes internal details; quote its `request_id` when you contact support. |
| 503 | `UPSTREAM_TIMEOUT` | A service the API depends on timed out. The request is safe to retry. |
| 503 | `AUTH_UNAVAILABLE` | The API key couldn't be checked because the authentication service was unavailable. The request is safe to retry. |

## Response headers

| Header | Description |
| --- | --- |
| `X-Request-ID` | Correlation ID for the request, also returned as `request_id` in error bodies. Send your own `X-Request-ID`, up to 128 letters, digits, `.`, `_`, `:` or `-`, and it's used instead. |
| `RateLimit-Limit` | Requests allowed to this endpoint per minute. |
| `RateLimit-Remaining` | Requests you can still send to this endpoint right now. |
| `RateLimit-Reset` | Seconds until the endpoint's full limit is available again. |
| `Retry-After` | On a `429`: seconds to wait before retrying. |
