{"slug": "openai-capi-is-not-meta-with-a-new-host", "title": "OpenAI CAPI is not Meta with a new host", "summary": "Pixellint's new validation pack for OpenAI's Conversions API highlights critical differences from Meta's CAPI, including distinct endpoints, field names, and timestamp formats. The pack flags common errors such as sending Unix seconds instead of milliseconds for OpenAI's timestamp_ms, which can cause silent failures despite HTTP 200 responses. Developers are advised to store UTC instants and convert at the edge, and to validate payloads with Pixellint's rulepack before posting to bzr.openai.com.", "body_md": "The ads conversion POST looks familiar until you count the digits and read the field names. OpenAI Ads uses a different path, a different clock, and a different id than Meta CAPI. A shared worker that only knows `event_time`\n\nwill 200 and still miss.\n\nMeta CAPI posts to the Graph API events edge. The body is `data[]`\n\nof events, each with `event_name`\n\n, `event_time`\n\n, `action_source`\n\n, `user_data`\n\n. OpenAI Ads Conversions API posts to `bzr.openai.com/v1/events`\n\n. The body is `events[]`\n\n, each with `id`\n\n, `type`\n\n, and `timestamp_ms`\n\n. The image pixel is yet another path: `/v1/sdk/events`\n\nwith `pid`\n\n.\n\nPixellint pack `vendor/openai-conversions-api`\n\nis the server hop. `vendor/openai`\n\nis the image tag. They are not aliases.\n\nOpenAI `timestamp_ms`\n\nis Unix milliseconds. `Date.now()`\n\nis already 13 digits. Meta `event_time`\n\nis Unix seconds, 10 digits, so the Meta helper is `Math.floor(Date.now() / 1000)`\n\n. Sending that 10-digit value as `timestamp_ms`\n\nis too short. Pixellint flags `vendor.openai-conversions-api.body.timestamp_ms.invalid`\n\n.\n\n```\n{\n  \"events\": [\n    {\n      \"type\": \"order_created\",\n      \"timestamp_ms\": 1770000000\n    }\n  ]\n}\n```\n\nOpenAI `events[].id`\n\nis required. Meta `event_id`\n\nis how you dedup the pixel against CAPI. Same idea, different key. `type`\n\nis an OpenAI event type such as `order_created`\n\n. Meta `event_name`\n\nis `Purchase`\n\n. Web events also need `source_url`\n\n.\n\nStore one UTC instant. Convert at the edge: floor(ms/1000) for Meta, `Date.now()`\n\nfor OpenAI. Run `pixellint validate json --rulepack vendor/openai-conversions-api`\n\non the body you POST to bzr.openai.com. One fixture cannot serve both.\n\nPixellint is not affiliated with OpenAI or Meta. Playground: [pixellint.org](https://pixellint.org/). Pack: [OpenAI Conversions API](https://pixellint.org/packs/openai-conversions-api/).\n\nOriginal: [OpenAI CAPI is not Meta with a new host](https://pixellint.org/docs/openai-capi-is-not-meta/)", "url": "https://wpnews.pro/news/openai-capi-is-not-meta-with-a-new-host", "canonical_source": "https://dev.to/aleksuix/openai-capi-is-not-meta-with-a-new-host-39nj", "published_at": "2026-08-26 04:55:53+00:00", "updated_at": "2026-08-26 05:13:16.838838+00:00", "lang": "en", "topics": ["developer-tools", "ai-infrastructure"], "entities": ["OpenAI", "Meta", "Pixellint", "bzr.openai.com", "Graph API"], "alternates": {"html": "https://wpnews.pro/news/openai-capi-is-not-meta-with-a-new-host", "markdown": "https://wpnews.pro/news/openai-capi-is-not-meta-with-a-new-host.md", "text": "https://wpnews.pro/news/openai-capi-is-not-meta-with-a-new-host.txt", "jsonld": "https://wpnews.pro/news/openai-capi-is-not-meta-with-a-new-host.jsonld"}}