---
title: "List people waiting for approval"
method: GET
path: "/queue"
tags: ["Queue & balance"]
---

# List people waiting for approval

`GET /queue`

## Request

- Base URL: `https://gtmswag.com/api/v1`
- URL: `https://gtmswag.com/api/v1/queue`
- Auth: HTTP bearer

Everyone waiting in an active playbook, with `blockers` (what approval would refuse, such as `Add funds`) and the `approvalUrl` to hand to a person. When auto-approve is on, `autoApprove` says `scheduled` or `waiting` with the `reason`. Filter by `campaignId`. Returns the whole list (MCP `list_queue` pages it with `limit` and `cursor`). Agents never approve.

## Query parameters

- `campaignId` string

## Response `200`

Success: `{"data": [QueueItem]}`.

- QueueItemListResponse: The success body: `{"data": [QueueItem]}`.
  - `data` QueueItem[], required
    - `campaignId` string, required
    - `campaignName` string, required
    - `productId` string, required
    - `recipientId` string, required
    - `recipient` object, required
      - `name` string, required
      - `email` string
      - `company` string
    - `message` string, required
    - `priceCents` integer, required
    - `blockers` string[], required
    - `approvalUrl` string, required
    - `autoApprove` union: Present when the playbook's auto-approve is on: scheduled while it finishes in the background, or waiting with the reason it was left for a person.
      - PlaybookApprovalScheduled: The auto-approve rule finishes this person in the background; watch `GET /events` for `send.auto_approved`.
        - `state` 'scheduled', required
      - PlaybookApprovalWaiting: The person waits for a person to approve; `reason` says why. Nothing is charged or sent.
        - `state` 'waiting', required
        - `reason` 'auto_approve_off' | 'over_gift_limit' | 'monthly_cap' | 'low_balance' | 'repeat_recipient' | 'photo_review' | 'age_restricted' | 'shipping_quote' | 'email_unverified' | 'blocked', required: Why the person waits for a person: auto_approve_off (no auto-approve on this playbook), over_gift_limit (the gift costs more than the per-gift limit), monthly_cap (the monthly budget is used up), low_balance (the balance cannot cover the gift; adding funds does not re-check waiting people), repeat_recipient (already gifted by another campaign), photo_review (a photo must be sourced or approved), age_restricted (alcohol always waits), shipping_quote (delivery is not priced yet, so these gifts always wait), email_unverified (the person who turned it on has not verified their email), blocked (anything else, such as an unavailable or unverified gift, or with mode live a person without a sender-supplied address).

## Other responses

- `400`: Bad request: `VALIDATION_ERROR`. Each example says when.
- `401`: Not authenticated: `AUTH_REQUIRED`. no credentials, or an OAuth token on a route that only takes workspace keys; the key is malformed, unknown or revoked.
- `429`: Too many requests: `RATE_LIMIT`. more than 240 requests in the current minute for this workspace (REST and MCP share the limit); wait `retryAfterMs`.
- `default`: Any other refusal or failure, such as 403 CSRF (a cross-origin `Origin` header), 403 HTTPS_REQUIRED or 500 INTERNAL_ERROR, with what to do next.

---

[API](https://skmtc.dev/gtmswag/apis/gtm-swag-api.md) · [All operations](https://skmtc.dev/gtmswag/apis/gtm-swag-api/llms.txt) · [OpenAPI document](https://skmtc.dev/gtmswag/apis/gtm-swag-api/revisions/9ff86fa99afe?raw)
