> ## Documentation Index
> Fetch the complete documentation index at: https://docs.interchange.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Get campaign products

> Read the products selected for a campaign

`GET /api/v2/buyer/campaigns/:id/products`

Returns the products selected for the campaign. On a `DRAFT` campaign, this is the current selection. After [execute](/v2/buyer/campaigns/tasks/execute-campaign), each product's `mediaBuys[]` entries include the complete `packageIds` needed for package-level updates. This is the lean package-ID read surface for media buys whose full campaign response is too large.

## Request

```bash theme={null}
curl https://api.interchange.io/api/v2/buyer/campaigns/cmp_987654321/products \
  -H "Authorization: Bearer $SCOPE3_API_KEY"
```

No request body.

## Parameters

| Field        | Type   | Required | Notes                                                                                                                                                                                                                         |
| ------------ | ------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`         | string | Yes      | Campaign ID (path parameter).                                                                                                                                                                                                 |
| `mediaBuyId` | string | No       | Query parameter. Filter to products attached to the given media buy. Accepts a single value or repeated values (`?mediaBuyId=mb_X&mediaBuyId=mb_Y`). When set, discovery-staged products not yet on a media buy are excluded. |

## Response

```json theme={null}
{
  "campaignId": "cmp_987654321",
  "discoveryId": "disc_abc123",
  "products": [
    {
      "productId": "prod_xyz789",
      "productName": "Example Media - CTV Premium",
      "salesAgentId": "agent_example",
      "selectedAt": "2026-05-01T10:00:00Z",
      "mediaBuys": [
        {
          "mediaBuyId": "mb_abc123",
          "name": "Example Media buy",
          "status": "ACTIVE",
          "packageIds": ["pkg_video_15s", "pkg_video_30s"]
        }
      ]
    }
  ],
  "searchContexts": [
    {
      "id": "ctx_abc",
      "brief": "Premium video for tech-savvy professionals",
      "channels": ["ctv"],
      "countries": ["US"],
      "createdAt": "2026-05-01T09:30:00Z",
      "productCount": 1
    }
  ],
  "summary": {
    "totalProducts": 1,
    "productsOnMediaBuys": 0,
    "productsPending": 1
  }
}
```

* On a `DRAFT` campaign, the response reflects the current product selection (see `productCount` on the campaign).
* After execute, use each product's `mediaBuys[].packageIds` to construct `update_campaign` package updates. Filtering by `mediaBuyId` keeps the response small while still returning every package ID for that buy.
* To resolve a package by description instead ("the display package ending 2026-08-11"), or to read a package's own budget, pacing, and delivery, use [Get media buy packages](/v2/buyer/campaigns/tasks/get-media-buy-packages): it is scoped to one media buy and returns richer per-package detail than the `packageIds` array here.

## Errors

| Code        | When                                                      |
| ----------- | --------------------------------------------------------- |
| `NOT_FOUND` | Campaign ID does not exist for the authenticated account. |

See [Errors](/v2/reference/errors) for the full error shape and recovery semantics.

## Related

<CardGroup cols={2}>
  <Card title="Auto-select products" href="/v2/buyer/campaigns/tasks/auto-select-products" icon="wand-magic-sparkles">
    Let Scope3 pick a balanced product set
  </Card>

  <Card title="Execute campaign" href="/v2/buyer/campaigns/tasks/execute-campaign" icon="rocket">
    Turn selected products into media buys
  </Card>

  <Card title="Media buy status" href="/v2/buyer/campaigns/tasks/get-media-buy-status" icon="signal-stream">
    Poll live ADCP status after execute
  </Card>

  <Card title="Get media buy packages" href="/v2/buyer/campaigns/tasks/get-media-buy-packages" icon="boxes-stacked">
    Resolve a package by description within one media buy
  </Card>

  <Card title="Campaign overview" href="/v2/object-guides/campaign" icon="rocket">
    The campaign object and lifecycle
  </Card>
</CardGroup>
