pixellint

vendor/reddit-conversions-api · vendor documented

Reddit conversion API v3 wants milliseconds

The Reddit conversion API is Reddit CAPI. event_at is milliseconds. action_source is WEBSITE. Each event needs a match key. WEBSITE should send event_source_url. CUSTOM needs custom_event_name. PURCHASE should send metadata.value.

What this pack matches

Hosts
ads-api.reddit.com
Paths
…/conversion_events…
Vendor docs
ads-api-reddit.netlify.app/docs/v3/guides/programs/capi/direct-integration

Rules

Codes are stable. A finding in CI, MCP, or the playground lands on the same id.

Field Required What it checks Rule ids Source
pixel_id required It is the Reddit Pixel ID, and it travels in the v3 path. Fix: Put the Pixel ID from Events Manager in the path as `/api/v3/pixels/{pixel_id}/conversion_events`. vendor.reddit-conversions-api.param.pixel_id.missing
vendor.reddit-conversions-api.param.pixel_id.empty
docs
event_at required Reddit CAPI v3 documents `event_at` as Unix time in milliseconds. A 10-digit value is seconds and lands in 1970. Fix: Send milliseconds: a JavaScript `Date.now()` is already in the right unit. vendor.reddit-conversions-api.body.event_at.missing
vendor.reddit-conversions-api.body.event_at.empty
vendor.reddit-conversions-api.body.event_at.invalid
docs
action_source required v3 makes `action_source` required. Reddit documents `WEBSITE`, `APP`, `PHYSICAL_STORE`, and `OTHER`. Fix: Send `WEBSITE`, `APP`, `PHYSICAL_STORE`, or `OTHER`. vendor.reddit-conversions-api.body.action_source.missing
vendor.reddit-conversions-api.body.action_source.empty
vendor.reddit-conversions-api.body.action_source.invalid
docs
type.tracking_type required v3 spells standard events in UPPER_SNAKE_CASE. Custom events use `CUSTOM` plus `custom_event_name`. Fix: Send `PURCHASE` or another documented type. For a custom event, send `CUSTOM` and `type.custom_event_name`. vendor.reddit-conversions-api.body.type.tracking_type.missing
vendor.reddit-conversions-api.body.type.tracking_type.empty
vendor.reddit-conversions-api.body.type.tracking_type.invalid
docs
click_id optional It is the Reddit click id. Reddit documents it as a match key and reads it from `event_source_url` when the field itself is omitted. Fix: Send the `rdt_cid` click id in `click_id`, or put it on `event_source_url`. vendor.reddit-conversions-api.body.click_id.empty docs
event_source_url optional Reddit documents `event_source_url` as recommended on `WEBSITE` events so the domain can be extracted. Fix: Send the absolute page URL in `event_source_url`. vendor.reddit-conversions-api.body.event_source_url.empty
vendor.reddit-conversions-api.body.event_source_url.invalid
docs
type.custom_event_name optional It is the custom event name. Reddit documents it as required when `tracking_type` is `CUSTOM`, any UTF-8 character up to 64 characters including spaces. Fix: Set `type.custom_event_name` to a name that is not a standard tracking type, at most 64 characters. vendor.reddit-conversions-api.body.type.custom_event_name.empty
vendor.reddit-conversions-api.body.type.custom_event_name.invalid
docs
metadata.currency optional It is an ISO 4217 currency code. Fix: Use the three-letter code, such as `USD`. vendor.reddit-conversions-api.body.metadata.currency.empty
vendor.reddit-conversions-api.body.metadata.currency.invalid
docs
metadata.value optional It is the conversion value. Reddit documents `value` as strongly recommended on revenue events. Fix: Set `metadata.value` to the order total on `PURCHASE`. vendor.reddit-conversions-api.body.metadata.value.empty docs
metadata.conversion_id optional It is the id Reddit uses to deduplicate Pixel and CAPI events. Reddit strongly recommends it when both fire. Fix: Send the same `conversion_id` the Pixel sent. vendor.reddit-conversions-api.body.metadata.conversion_id.empty docs
metadata.item_count optional It is the number of items in the conversion. Reddit documents `item_count` as strongly recommended on revenue events, and says product `quantity` is not a replacement. Fix: Set `metadata.item_count` to the order item count, such as `2`. vendor.reddit-conversions-api.body.metadata.item_count.empty
vendor.reddit-conversions-api.body.metadata.item_count.invalid
docs
metadata.products[].id optional It is the product id on a metadata products row. Reddit documents `id` on each product object. Fix: Set `metadata.products[].id` to the SKU or catalog id, or drop the empty pair. vendor.reddit-conversions-api.body.metadata.products[].id.empty docs
metadata.products[].name optional It is the product name on a metadata products row. Reddit documents `name` on each product object. Fix: Set `metadata.products[].name` to the product name, or drop the empty pair. vendor.reddit-conversions-api.body.metadata.products[].name.empty docs
metadata.products[].category optional It is the product category on a metadata products row. Reddit documents `category` on each product object. Fix: Set `metadata.products[].category` to the category, or drop the empty pair. vendor.reddit-conversions-api.body.metadata.products[].category.empty docs
metadata.products[].quantity optional It is the quantity of that product. Reddit documents `quantity` on each product object. It is not a replacement for `metadata.item_count`. Fix: Send `metadata.products[].quantity` as a whole number, such as `2`. vendor.reddit-conversions-api.body.metadata.products[].quantity.empty
vendor.reddit-conversions-api.body.metadata.products[].quantity.invalid
docs
metadata.products[].item_price optional It is the unit price of that product. Reddit documents `item_price` on each product object. It is not a replacement for `metadata.value`. Fix: Send `metadata.products[].item_price` as a number, such as `9.99`. Put the order total in `metadata.value`. vendor.reddit-conversions-api.body.metadata.products[].item_price.empty
vendor.reddit-conversions-api.body.metadata.products[].item_price.invalid
docs
user.email optional It is the visitor email. Reddit accepts it unhashed or as SHA-256 hex. Fix: Send a canonical email, or the SHA-256 hex digest. vendor.reddit-conversions-api.body.user.email.empty docs
user.phone_number optional It is the visitor phone number. Reddit accepts it unhashed or as SHA-256 hex. vendor.reddit-conversions-api.body.user.phone_number.empty docs
user.uuid optional It is the Reddit UUID match key. Reddit documents it for session-based deduplication against the Pixel. vendor.reddit-conversions-api.body.user.uuid.empty docs
user.external_id optional It is an advertiser-assigned identifier. Reddit documents it as a match key. vendor.reddit-conversions-api.body.user.external_id.empty docs
user.idfa optional It is the iOS advertising id. Reddit documents it as a match key. vendor.reddit-conversions-api.body.user.idfa.empty docs
user.aaid optional It is the Android advertising id. Reddit documents it as a match key. vendor.reddit-conversions-api.body.user.aaid.empty docs
user.ip_address optional It is the visitor IP address. Reddit accepts it unhashed. Fix: Send the browser's public IP, not a digest. vendor.reddit-conversions-api.body.user.ip_address.empty docs
user.user_agent optional It is the visitor user agent. Reddit accepts it unhashed. Fix: Send the browser's user agent string, not a digest. vendor.reddit-conversions-api.body.user.user_agent.empty docs
user.screen_dimensions.width optional It is the display width. Reddit documents `user.screen_dimensions.width` as a match-key field. Fix: Send `user.screen_dimensions.width` as an integer pixel count. vendor.reddit-conversions-api.body.user.screen_dimensions.width.empty
vendor.reddit-conversions-api.body.user.screen_dimensions.width.invalid
docs
user.screen_dimensions.height optional It is the display height. Reddit documents `user.screen_dimensions.height` as a match-key field. Fix: Send `user.screen_dimensions.height` as an integer pixel count. vendor.reddit-conversions-api.body.user.screen_dimensions.height.empty
vendor.reddit-conversions-api.body.user.screen_dimensions.height.invalid
docs
user.data_processing_options.modes[] optional It is the Limited Data Use mode. Reddit documents `modes` as the fixed value `LDU`. Fix: Send `user.data_processing_options.modes` as `["LDU"]`. vendor.reddit-conversions-api.body.user.data_processing_options.modes[].empty
vendor.reddit-conversions-api.body.user.data_processing_options.modes[].invalid
docs
user.data_processing_options.country optional It is the country for Limited Data Use. Reddit documents country as required when LDU is set. Fix: Send `user.data_processing_options.country` when `modes` includes `LDU`. vendor.reddit-conversions-api.body.user.data_processing_options.country.empty docs
user.data_processing_options.region optional It is the region for Limited Data Use. Reddit documents region as optional when LDU is set. Fix: Send `user.data_processing_options.region`, or omit it. vendor.reddit-conversions-api.body.user.data_processing_options.region.empty docs
body.hashed_plaintext_field required This field looks like a SHA-256 digest, but Reddit documents `user.ip_address` and `user.user_agent` as unhashed match keys. Fix: Send the raw IP address or user agent. Hashing it makes the event unmatchable. vendor.reddit-conversions-api.body.hashed_plaintext_field docs
body.match_key_required required The event has no match key. Reddit documents match keys as required on each conversion so the event can be matched to a Reddit user. Fix: Send `click_id`, hashed or raw `user.email`, `user.phone_number`, `user.uuid`, `user.external_id`, `user.ip_address`, `user.idfa`, or `user.aaid`. vendor.reddit-conversions-api.body.match_key_required docs
body.website_requires_source_url recommended A `WEBSITE` event has no `event_source_url`. Reddit documents it as recommended so the domain can be extracted. Fix: Send the absolute page URL in `event_source_url`. vendor.reddit-conversions-api.body.website_requires_source_url docs
body.custom_requires_name required A `CUSTOM` event has no `custom_event_name`. Reddit documents that field as the custom event's name. Fix: Set `type.custom_event_name` to a name that is not a standard tracking type. vendor.reddit-conversions-api.body.custom_requires_name docs
body.purchase_requires_value recommended A `PURCHASE` event has no `metadata.value`. Reddit documents value as strongly recommended on revenue events. Fix: Set `metadata.value` to the order total. vendor.reddit-conversions-api.body.purchase_requires_value docs
body.ldu_requires_country required Limited Data Use is enabled but `user.data_processing_options.country` is missing. Reddit documents country as required when `modes` is `LDU`. Fix: Send `user.data_processing_options.country` with `modes: ["LDU"]`. vendor.reddit-conversions-api.body.ldu_requires_country docs

Validate a payload

pixellint validate json @payload.json --rulepack vendor/reddit-conversions-api

Try this failing payload in the playground. Reddit CAPI v3 with a 10-digit event_at.

{"data":{"events":[{"event_at":1770000000,"action_source":"WEBSITE","type":{"tracking_type":"PURCHASE"},"event_source_url":"https://example.com/checkout","metadata":{"value":"129.99"},"user":{"ip_address":"203.0.113.42"}}]}}

cargo install pixellint · npm install pixellint