Server-side events · Platform reference
Reddit Conversions API (CAPI) checker
Reddit's Conversions API sends conversion events from your server to a Reddit Pixel ID, with match keys such as the Reddit click ID, IP address and email. Events must arrive within seven days. When the Reddit Pixel sends the same events, they need a shared conversion ID to be deduplicated. Events most often show as received but not attributed because a conversion ID was reused across different events (Reddit marks them as duplicates), the event was sent outside the dedup window, or a test ID was left on in production.
Read from the official documentation on 9 November 2026. Sources are listed at the end.
Check your own setup
rdt_cid rides on your landing URL. Paste the curl -sIL output of your tracking link into our redirect chain checker and it shows whether rdt_cid survives every hop to the final page. If it doesn't, your server has no click ID to send to Reddit. It doesn't validate the Reddit CAPI JSON payload, conversion IDs or test IDs. Our CAPI event checker reads Meta payloads only.
Open the Redirect Chain CheckerEndpoint and authentication
POST https://ads-api.reddit.com/api/v3/pixels/{pixel_id}/conversion_events (body: {"data": {"events": [...]}})
Conversion access token generated in Events Manager under the business that should receive the conversions. Reddit recommends it over a developer access token because it doesn't expire. The Pixel ID must match the business account's Pixel ID
Standard event names
In a v3 payload the event goes in type.tracking_type, in UPPER_SNAKE_CASE. v2 and the help center use the PascalCase names (PageVisit, Purchase); v3 rejects those spellings.
| Event | Use it for |
|---|---|
| PAGE_VISIT | v2: PageVisit. Someone lands on a page |
| VIEW_CONTENT | v2: ViewContent. Someone views a specific page or piece of content, such as a product page. Reddit suggests sending a product ID |
| SEARCH | v2: Search. Someone submits a search on your site |
| ADD_TO_CART | v2: AddToCart. Someone adds an item to the cart. Reddit suggests sending a product ID |
| ADD_TO_WISHLIST | v2: AddToWishlist. Someone adds an item to a wishlist |
| PURCHASE | v2: Purchase. Someone completes a purchase. Reddit suggests sending product ID, currency and value |
| LEAD | v2: Lead. Someone submits information showing interest |
| SIGN_UP | v2: SignUp. Someone submits a sign-up, registration or subscription form |
| CUSTOM | v2: Custom. Set type.custom_event_name to your own name: case-sensitive, up to 64 UTF-8 characters, and it must not match a standard event. Only the 20 most recent custom events show on the dashboard. For dedup, the custom name must match on Pixel and CAPI |
Required and recommended fields
| Field | What it needs |
|---|---|
| event_at | Required. Integer Unix epoch in milliseconds (v3; v2 event_at_ms is gone). Events must be sent within seven days after they occur |
| action_source | Required in v3. Where the event happened: WEBSITE, APP, PHYSICAL_STORE or OTHER. PHYSICAL_STORE events must not include device identifiers, click ID, UUID or MAIDs |
| type.tracking_type | Required. One of the UPPER_SNAKE_CASE values above; CUSTOM also needs type.custom_event_name |
| click_id | The Reddit click ID. Strongly recommended. If it is missing, v3 reads the click ID from event_source_url |
| event_source_url | Recommended for WEBSITE events: the page URL, with the click ID in it. Used for domain detection and as the click ID fallback |
| metadata.conversion_id | A unique ID per conversion (e.g. order number), the same on Pixel and CAPI. The dedup key; can be sent unhashed or SHA-256 pre-hashed |
| metadata.value / metadata.currency / metadata.item_count | value is a double in the base unit of the currency (v3; value_decimal is gone). Strongly recommended for revenue events |
| user.data_processing_options | Limited Data Use: {"modes": ["LDU"], "country": "...", "region": "..."}; country is required when set (replaces v2 user.opt_out) |
Match keys and hashing
| Key | Normalise and hash |
|---|---|
| user.email | Unhashed or pre-hashed. To pre-hash: lowercase, remove dots from the local part, drop everything after a plus sign, then SHA-256 as 64 lowercase hex ([email protected] hashes like [email protected]) |
| user.phone_number | E.164 like +15554441234. To pre-hash: drop any extension, remove every non-digit, make sure it starts with +, then SHA-256 as 64 lowercase hex |
| user.ip_address | Raw. Reddit says to pass IP at a minimum for device matching |
| user.user_agent | Raw |
| user.screen_dimensions | Object with width and height |
| user.idfa / user.aaid | Standard format with dashes; if pre-hashed, IDFA uppercase hex and AAID lowercase hex before SHA-256. Placeholder zero IDs are accepted with a warning |
| user.external_id | Advertiser-assigned, unique to one user; Reddit recommends sending it with the click ID |
| user.uuid | Generated by the Reddit Pixel. Send it if you also run the Pixel; needed for session-based dedup |
Click ids
| Click id | Where it comes from |
|---|---|
| rdt_cid | The Reddit click ID arrives on the landing URL as ?rdt_cid=. Reddit recommends sending it with every conversion event. Reddit says to persist it for CAPI |
Deduplication
- If the Pixel and CAPI send the same events, deduplication is required. Otherwise they are double-counted.
- Preferred method: send the same unique conversion ID on the Pixel and CAPI event for each distinct conversion. The event type must match, and for custom events the event name must match too.
- Without a conversion ID, Reddit uses session-based dedup. That needs a UUID or external ID on every Pixel and CAPI event. A session ends when more than five minutes pass between events.
- When two events share a conversion ID, the one with less metadata and fewer match keys is marked duplicate. If they're equal, the later event is the duplicate.
- Dedup runs every hour and can take up to 24 hours. Events must be sent within two days to be deduplicated properly. Dedup logs are kept for up to seven days.
- Dedup works only within the same channel: Pixel events are deduplicated only against CAPI WEBSITE events.
Time limits and batch sizes
- Send events as close to real time as possible. They must be sent within seven days after they occur.
- Limits: 1,000 requests per second, 10,000 events per second and 1,000 events per request.
- A 429 Too Many Requests response means you hit the rate limit. Back off and retry.
- CAPI events show on the dashboard within three hours of being sent.
- Events sent with a test ID are rate-limited to 10 events per second.
How to test before you trust it
- Event Testing (test_id): Copy the test ID from the Event Testing page in Ads Manager and send it as test_id (v3 replaced v2 test_mode). Reddit won't process those events; they appear in Event Testing so you can inspect metadata, match keys and conversion ID. Remove it before going live
- Events Manager real-time events: Events Manager shows incoming events in real time. Browser-side checks need third-party cookies enabled
- GET Last Fired At: Returns the most recent time events were received, in ISO 8601
Why events arrive but don't attribute
- A v2-style payload sent to v3: PascalCase event names (Purchase instead of PURCHASE), event_at in seconds or as a date string instead of epoch milliseconds, or events not wrapped in data.events.
- A reused conversion ID is the classic 'received but not attributed' cause. Reddit marks every event sharing an improperly reused ID as a duplicate, and those aren't attributed.
- A test ID left on in production means Reddit won't process the events. They only show in Event Testing.
- Pixel and CAPI events sent more than two days apart may not deduplicate correctly, which double counts or drops the lower-quality copy.
- A custom event name that differs between Pixel and CAPI breaks dedup and inflates conversions.
- Events older than seven days can't be sent, so delayed CRM or offline uploads fall outside the window.
- Splitting one conversion across several tags with different metadata causes dedup issues. Reddit says to put all metadata for a conversion in one event.
- With no rdt_cid and no IP, the event has little to match on. Reddit treats click ID and IP as the strongly recommended keys.
- Without the click ID in event_source_url (or in click_id), WEBSITE events lose the click-level match.
Sources
- Reddit Ads API v3: Conversions API direct integration
- Reddit Ads API v3: CAPI v2 to v3 migration
- Reddit Ads Help: About the Conversions API
- Reddit Ads Help: Event Deduplication
- Reddit Ads Help: Conversion Events
- Reddit Ads Help: About Match Keys
- Reddit Ads Help: Set Up the Reddit Conversions API and Pixel with GTM
Platforms change these rules without notice. If a source says something different from this page, the source wins.