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

# OpenAI Ads Product Feed as a destination

> Keep prices and availability in your OpenAI Ads product feed up to date from Nekt.

OpenAI Ads is OpenAI's advertising platform, where ads appear inside ChatGPT conversations and are managed in OpenAI Ads Manager. Product-feed campaigns advertise items from a merchant catalog linked to your ad account, and the Delta Feeds API lets you update that catalog incrementally — sending only the products that changed instead of re-uploading everything.

This destination points that endpoint at a table in your Lakehouse, so the price and stock level your ads show follow the same numbers your business runs on.

If you also want to read your OpenAI Ads campaign and delivery data into the Lakehouse, see [OpenAI Ads as a data source](/sources/openai-ads).

## 1. Overview

Each row of your input table is one product variant to update. Rows are grouped by parent product before being sent, and a variant that appears twice in the same run is sent once, with the last row winning.

## 2. Important considerations

<Warning>
  This destination **updates existing variants only**. It never creates products and never adds items that are not already in the feed. The initial catalog has to be uploaded to OpenAI first — see OpenAI's [Product Feeds](https://developers.openai.com/ads/product-feeds) guide.
</Warning>

* **Enabled per account.** The product feed API is switched on by OpenAI for each ad account. If the destination reports that the feed API is unavailable, ask your OpenAI representative to enable it for the account.
* **Acceptance is not delivery.** OpenAI acknowledges the update as accepted by feed processing; the change then propagates to serving asynchronously. Marking a product in stock does not by itself make it serve — the product, campaign, ad group and ad still have to meet the normal serving requirements.
* **Prices are integers.** Every monetary value in OpenAI Ads is an integer in the currency's minor unit: `8999` means R\$ 89,99. If your column holds a decimal, add the `to_minor_units` transform to the mapping and Nekt converts it.

## 3. Configuring the destination

1. In the [Destinations](https://app.nekt.ai/destinations) tab, click the "Add destination" button at the top right of your screen. Then select the OpenAI Ads - Product Feed option from the list of connectors.

2. Click **Next** and you'll be prompted to add your access.

<Steps>
  <Step title="Open Ads Manager">
    Sign in at [ads.openai.com](https://ads.openai.com) with the ad account the feed is linked to.
  </Step>

  <Step title="Go to Settings">
    Open the **Settings** tab and issue an API key, then copy the value.
  </Step>

  <Step title="Find the feed ID">
    Take the ID of the product feed you want to keep up to date.
  </Step>
</Steps>

<Note>
  This is not the same credential as an OpenAI API key from `platform.openai.com`. The Ads API uses its own key, issued from Ads Manager, and each key is tied to a single ad account.
</Note>

The following configurations are available:

* **Ads API key**: the key you copied from Ads Manager.
* **Feed ID**: the product feed to update. It must be linked to the same ad account as the key.
* **Default currency**: the ISO 4217 currency code used for prices when your table has no currency column, such as `BRL`.
* **Continue on error**: keep syncing the remaining rows after OpenAI refuses one. When off, the run stops at the first refused row.
* **Dry run**: log what would be written without writing anything.

3. Click **Next**.

## 4. Select your data to send

1. Select the layer and then the table holding the products you want to keep up to date.

   > Tip: The table can be found more easily by typing its name.

2. Click **Next**.

## 5. Map your data to the destination

| Field name      | Description                                                                                                                                                                                  | Required |
| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| product\_id     | The parent product identifier, exactly as it exists in the feed.                                                                                                                             | Yes      |
| variant\_id     | The variant or item identifier, exactly as it exists in the feed.                                                                                                                            | Yes      |
| title           | The updated title of the variant.                                                                                                                                                            | No       |
| price\_amount   | The updated price, as an integer in the currency's minor unit. Use the `to_minor_units` transform if your column holds a decimal.                                                            | No       |
| price\_currency | The three-letter ISO 4217 currency code for the price. Falls back to the default currency when not mapped.                                                                                   | No       |
| availability    | Whether the variant is in stock. Accepts `in_stock` and `out_of_stock`, as well as the usual spellings a warehouse column carries: true/false, yes/no, 1/0, available/unavailable, sold out. | No       |

<Note>
  Map at least one of `title`, `price_amount` or `availability`. A row carrying only the identifiers has nothing for OpenAI to change and is skipped.
</Note>

Once the fields are mapped, click **Next**.

## 6. Configure your OpenAI Ads Product Feed destination

1. Describe your destination for easy identification within your organization. You can inform things like what data it brings, to which team it belongs, etc.

2. To define your [Trigger](https://docs.nekt.com/runs/scheduling-and-triggers), consider how quickly a price change or a stockout has to reach your ads.

3. Click **Done**.

### Check your new destination!

1. Once completed, you'll receive confirmation that your new destination is set up.

2. You can view it on the [Destinations](https://app.nekt.ai/destinations) page and trigger the pipeline manually with the refresh icon. Use your normal feed and campaign monitoring in Ads Manager to confirm the change reached serving — the acceptance response carries no completion timestamp.

> If you encounter any issues, reach out to us via Slack, and we'll gladly assist you!
