IntegrationsAdvertisingOpenAI Ads Conversions API

OpenAI Ads

Datafly Signal sends conversions to OpenAI Ads (ChatGPT Ads) server-to-server through the Conversions API, with hashed customer data for matching and the event ID for deduplication against the OpenAI pixel.

Why route OpenAI Ads through Datafly Signal

  • Conversions survive ad blockers and tracking prevention. A browser tag served from an advertising domain is blocked outright for part of your traffic, and Safari’s ITP shortens the cookies it can set. Signal sends the event from your own server, so what OpenAI Ads receives is not filtered by the browser.
  • Personal data is hashed before it leaves your infrastructure. Signal normalises and SHA-256 hashes the identifiers inside your own deployment, so the vendor receives match keys, never the raw values.
  • One consent decision governs every destination. OpenAI Ads is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
  • No vendor tag on the page. Removing it removes its page weight and its independent access to your visitors.

Prerequisites

Create a Pixel ID and API key

In ChatGPT Ads Manager open the Conversions tab and create a pixel and a Conversions API key. Approved API partners can provision both with the conversion setup endpoints.

Pass the oppref identifier

OpenAI appends an opaque oppref attribution identifier to ad clicks. Keep it on the landing URL; Signal forwards it when the collector has captured it (see Known limitations).

Share the event ID with the pixel

If the OpenAI pixel also runs, give each pixel event the same event_id you send to Signal so OpenAI can deduplicate the two.

Configure in Signal

Configuration Fields

FieldRequiredDescription
pixel_idYesYour OpenAI Ads Pixel ID. Sent as the pid query parameter. Found in ChatGPT Ads Manager > Conversions tab. Must match the Pixel ID used by your JavaScript pixel so events deduplicate correctly.
api_keyYesBearer API key for the Conversions API, generated in ChatGPT Ads Manager > Conversions tab. Sent as Authorization: Bearer <key>. Store securely — it grants write access to your pixel’s conversions.
validate_onlyNoWhen true, events are validated by OpenAI but NOT recorded for optimisation or reporting. Use during setup to confirm payloads are accepted, then set to false (or remove) for production.

Management UI Setup

  1. Go to Integrations > Add Integration > OpenAI Ads.
  2. Choose a preset: Default (default), Retail (ecommerce), Lead Generation (lead_gen), SaaS (saas), Insurance (insurance).
  3. Fill in the fields above and click Save.

Request format

One event per request (OpenAI accepts batches of up to 1,000, and one bad event fails the whole batch). The Pixel ID is the pid query parameter and the API key is a Bearer token. Amounts are integers in the currency’s minor unit, using the currency’s ISO 4217 exponent (JPY in whole yen, GBP in pence, #1464).

POST https://bzr.openai.com/v1/events?pid={pixel_id}
{
 "events": [
  {
   "action_source": "web",
   "data": {
    "amount": 25999,
    "contents": [
     {
      "id": "SKU_1",
      "name": "Parka",
      "quantity": 2
     },
     {
      "id": "SKU_2",
      "name": "Gloves",
      "quantity": 1
     }
    ],
    "currency": "GBP",
    "type": "contents"
   },
   "id": "evt-e2-1",
   "oppref": "oppref_abc",
   "opt_out": false,
   "source_url": "https://shop.example.co.uk/checkout/done",
   "timestamp_ms": 1758500000123,
   "type": "order_created",
   "user": {
    "emails_sha256": [
     "86e0b9e56c17cc4d12387e1949b85053fbe73bc3ce5a1188713a9d300cc6133d"
    ],
    "external_ids_sha256": [
     "1b67d6af59c6bf7d0501fc1d88bf9f95c00995a26f63518364153224c8141635"
    ],
    "ip_address": "203.0.113.9",
    "obref": "123e4567-e89b-42d3-a456-426614174000",
    "phone_numbers_sha256": [
     "11072303eb5c8cb5c5a1ebb762f11b37b07131265b46fdfe1276196bfbd3ca51"
    ],
    "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)"
   }
  }
 ],
 "integration_source": "datafly-signal"
}

Event Mapping

Signal eventVendor eventPresets
pagepage_viewedDefault, Retail, Lead Generation, SaaS, Insurance
view_itemcontents_viewedDefault, Retail
add_to_cartitems_addedDefault, Retail
begin_checkoutcheckout_startedDefault, Retail
purchaseorder_createdDefault, Retail, Insurance
generate_leadlead_createdDefault, Lead Generation, Insurance
sign_upregistration_completedDefault, Lead Generation, SaaS
trial_startedtrial_startedDefault, SaaS
subscription_startedsubscription_createdDefault, SaaS
service_appointment_bookedappointment_scheduledLead Generation
demo_requestedappointment_scheduledSaaS
get_quotecheckout_startedInsurance
quote_completedlead_createdInsurance

data.type follows OpenAI’s data shape for each event: contents for page views, product views, add to cart, checkout and orders; customer_action for leads, registrations and appointments; plan_enrollment for trials and subscriptions.

Signal forwards event properties the preset does not map unless the integration’s strict output contract is on. Turn on strict_output_contract for this integration so only the documented fields are sent.

Identity

Email (emails_sha256), phone (phone_numbers_sha256, the digits with the country code and no plus, as OpenAI documents) and the Signal visitor ID (external_ids_sha256) are sent as SHA-256 hashes, each in a one-element list. IP address and user agent are sent unhashed. obref (the pixel’s __obref cookie) is sent when an ID provider collects it into collected_ids.obref.

OpenAI Ads is an advertising destination and requires marketing consent by default. opt_out is true when the visitor has not granted marketing consent, which excludes the event from user-level personalisation.

Known limitations

  • The collector does not capture oppref from the landing URL yet (#1461); until it does, Signal sends it only when an ID provider collects it into collected_ids.oppref.
  • Item-level contents[].amount is not sent: array mappings cannot convert each item’s price to minor units yet (#1382). The event-level data.amount carries the value.

Troubleshooting

ProblemSolution
Every request rejected with 400One invalid event fails the batch; check source_url (required for web events) and that the event is less than 7 days old.
No conversions in Ads ManagerCheck the Pixel ID and that the API key belongs to the same account.

Blueprint

The OpenAI Ads blueprint version is 0.6.0. It was last reviewed against the vendor’s documentation on 2026-09-22.

See also