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
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.missingvendor.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.missingvendor.reddit-conversions-api.body.event_at.emptyvendor.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.missingvendor.reddit-conversions-api.body.action_source.emptyvendor.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.missingvendor.reddit-conversions-api.body.type.tracking_type.emptyvendor.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.emptyvendor.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.emptyvendor.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.emptyvendor.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.emptyvendor.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.emptyvendor.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.emptyvendor.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.emptyvendor.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.emptyvendor.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[].emptyvendor.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