---
title: "List campaign payments and invoices"
method: GET
path: "/billing/checkouts"
tags: ["Billing"]
---

# List campaign payments and invoices

`GET /billing/checkouts`

## Request

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

Campaign checkouts, newest first, with state, amounts and Stripe invoice links. Owner or admin keys only. Page by passing the last item's `cursor` as `before`.

## Query parameters

- `campaignId` string
- `limit` integer
- `before` string

## Response `200`

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

- CheckoutListResponse: The success body: `{"data": [Checkout]}`.
  - `data` Checkout[], required
    - `id` string, required
    - `campaignId` string, required
    - `state` 'creating' | 'open' | 'paid' | 'consumed' | 'expired' | 'cancelled', required
    - `amountCents` integer, required
    - `remainingCount` integer, required

## Other responses

- `400`: Bad request: `VALIDATION_ERROR`, `INVALID_REQUEST`. 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.
- `403`: Forbidden: `TEAM_MANAGER_REQUIRED`. Each example says when.
- `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)
