> ## 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.

# Add products

> Add discovered products to a discovery session's selection

`POST /api/v2/buyer/discovery/{discoveryId}/products`

Adds products to the session selection. Each product must already have been surfaced by [Discover products](/v2/buyer/discovery/tasks/discover-products) or [Browse products](/v2/buyer/discovery/tasks/browse-products) — pass the `productId`, `salesAgentId`, `groupId`, and `groupName` from those results. Optionally pin a budget, pricing option, bid, or per-line-item targeting. By default products merge into the existing selection; set `replace: true` to swap the whole set.

## Request

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.interchange.io/api/v2/buyer/discovery/disc_01HZX3YQ7K9R6V3M2P1E0F8B2T/products \
    -H "Authorization: Bearer $SCOPE3_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "products": [
        {
          "productId": "prod_acme_ctv_sports",
          "salesAgentId": "agent_acme_media",
          "groupId": "ctx_disc_01HZX3-group-0",
          "groupName": "Acme Media Connected TV",
          "pricingOptionId": "po_fixed_30",
          "budget": 150000
        }
      ]
    }'
  ```

  ```json Non-fixed pricing with a bid theme={null}
  {
    "products": [
      {
        "productId": "prod_example_olv_open",
        "salesAgentId": "agent_example_media",
        "groupId": "ctx_disc_01HZX3-group-1",
        "groupName": "Example Media CTV",
        "bidPrice": 12.5,
        "budget": 50000
      }
    ]
  }
  ```

  ```json Sponsored products theme={null}
  {
    "products": [
      {
        "productId": "prod_retailer_sponsored_products",
        "salesAgentId": "agent_retailer_media",
        "groupId": "ctx_disc_01HZX3-group-2",
        "groupName": "Retailer Sponsored Products",
        "pricingOptionId": "po_cpc_auction",
        "bidPrice": 1.25,
        "budget": 10000,
        "targetingOverlay": {
          "product_codes": ["sku-coffee-250g", "sku-coffee-1kg"],
          "keyword_targets": [
            { "keyword": "ground coffee", "match_type": "exact" },
            { "keyword": "arabica coffee", "match_type": "phrase" }
          ],
          "negative_keywords": [
            { "keyword": "instant coffee", "match_type": "exact" }
          ]
        }
      }
    ]
  }
  ```
</CodeGroup>

## Parameters

| Field                         | Type    | Required | Notes                                                                                                                                 |
| ----------------------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `products`                    | array   | Yes      | Products to add (min 1)                                                                                                               |
| `products[].productId`        | string  | Yes      | Product ID from the discovery results                                                                                                 |
| `products[].salesAgentId`     | string  | Yes      | Sales agent the product came from                                                                                                     |
| `products[].groupId`          | string  | Yes      | Group the product was discovered in                                                                                                   |
| `products[].groupName`        | string  | Yes      | Name of that group                                                                                                                    |
| `products[].pricingOptionId`  | string  | No       | Pricing option ID from the product's `pricingOptions`                                                                                 |
| `products[].bidPrice`         | number  | No       | Bid for non-fixed options (`isFixed: false`); read from `pricingOptions[].rate` or `floorPrice`                                       |
| `products[].budget`           | number  | No       | Budget allocation for this product                                                                                                    |
| `products[].targetingOverlay` | object  | No       | Per-line-item AdCP targeting. For sponsored products, use source-supported fields such as promoted product codes and keyword targets. |
| `replace`                     | boolean | No       | When `true`, replaces all existing products instead of merging                                                                        |

## Response

```json theme={null}
{
  "discoveryId": "disc_01HZX3YQ7K9R6V3M2P1E0F8B2T",
  "products": [
    {
      "productId": "prod_acme_ctv_sports",
      "salesAgentId": "agent_acme_media",
      "bidPrice": 32.5,
      "budget": 150000,
      "groupId": "ctx_disc_01HZX3-group-0",
      "groupName": "Acme Media Connected TV",
      "selectedAt": "2026-06-07T15:04:00Z"
    }
  ],
  "totalProducts": 1,
  "budgetContext": {
    "sessionBudget": 250000,
    "allocatedBudget": 150000,
    "remainingBudget": 100000
  }
}
```

Returns the full selection after the add, so you do not need a separate [Get products](/v2/buyer/discovery/tasks/get-products) call to confirm.

## Errors

* `400 VALIDATION_ERROR` — empty `products`, missing a required selection field, or a `productId` not present in the session's discovery results.
* `404 NOT_FOUND` — `discoveryId` does not exist or is not visible to the authenticated account.

See [Errors](/v2/reference/errors) for the full error contract.

## Related

<CardGroup cols={2}>
  <Card title="Discovery overview" href="/v2/guides/discovery" icon="rocket">
    Selection model and budget allocation
  </Card>

  <Card title="Get products" href="/v2/buyer/discovery/tasks/get-products" icon="list">
    List the current selection
  </Card>

  <Card title="Remove products" href="/v2/buyer/discovery/tasks/remove-products" icon="trash">
    Drop products from the selection
  </Card>

  <Card title="Apply proposal" href="/v2/buyer/discovery/tasks/apply-proposal" icon="wand-magic-sparkles">
    Add a whole proposal at once
  </Card>
</CardGroup>
