Vendor · engineers · marketers
Reddit CAPI wants milliseconds, not Meta seconds
Short answer
Reddit CAPI is Reddit's conversions API. event_at is 13-digit milliseconds. action_source is WEBSITE. Tracking types are UPPER_SNAKE_CASE. A Meta helper that floors Date.now() / 1000 and sends website will 200 and still miss.
Validate this snippet Open the rulepack
Reddit Pixel (browser)
The Reddit Pixel hits alb.reddit.com/rp.gif. id is the advertiser ID (required). event names the conversion, such as PageVisit or Purchase. vendor/reddit is ecosystem evidence: Reddit documents how to verify the pixel more than the query string. Two base codes are two PageVisits. Store the Reddit click id from the landing URL the same way you store fbclid, or Reddit CAPI matching leans on email, IP, and user-agent.
Ad blockers still punch the browser pipe. That is why Reddit CAPI exists. Network filter: alb.reddit.com. Pack page /packs/reddit/. Raw email on the image query is still a leak. An image cannot hash.
https://alb.reddit.com/rp.gif?event=PageVisit
pixellint validate url @reddit-pixel.txt --rulepack vendor/reddit
Reddit CAPI v3 (server)
POST ads-api.reddit.com /api/v3/pixels/{pixel_id}/conversion_events. pixel_id lives in the path. Each conversion API event under data.events[] needs event_at (exactly 13 digits, milliseconds), action_source (WEBSITE, APP, PHYSICAL_STORE, or OTHER), and type.tracking_type. Pixellint: vendor.reddit-conversions-api.body.event_at.invalid on a 10-digit seconds value. That miss lands in 1970.
tracking_type is UPPER_SNAKE_CASE: PAGE_VISIT, VIEW_CONTENT, SEARCH, ADD_TO_CART, ADD_TO_WISHLIST, PURCHASE, LEAD, SIGN_UP, or CUSTOM plus custom_event_name. Purchase copied from Meta is a custom name here. action_source website (Meta lowercase) is invalid; Reddit wants WEBSITE. Pack page: /packs/reddit-conversions-api/.
{
"data": {
"events": [{
"event_at": 1770000000000,
"action_source": "WEBSITE",
"type": { "tracking_type": "PURCHASE" },
"user": {
"email": "buyer@example.com",
"ip_address": "203.0.113.10",
"user_agent": "Mozilla/5.0"
},
"metadata": { "currency": "USD" }
}]
}
}
Clock and action_source
Reddit CAPI v3 event_at is milliseconds, like LinkedIn conversionHappenedAt and unlike Meta event_time. Date.now() is already the right unit. Math.floor(Date.now() / 1000) because the Meta snippet divided is how a purchase reads as 1970. v2 used ISO event_at; v3 does not. Do not mix the two envelopes.
Snap writes WEB. Meta writes website. Pinterest writes web. Reddit CAPI writes WEBSITE. A shared action_source column without a per-vendor map is a silent invalid on at least one hop. Pixellint: vendor.reddit-conversions-api.body.action_source.invalid.
Identity hashing is optional here, not on Meta
Reddit CAPI v3 allows email and phone raw or hashed. That is not permission to send a raw address to Meta, Pinterest, or TikTok. Hash at the Meta edge. Leave Reddit as Reddit documents it. user.ip_address and user.user_agent must stay in the clear: vendor.reddit-conversions-api.body.hashed_plaintext_field is a SHA-256 looking digest in those fields.
metadata.currency, when present, is ISO 4217 (USD), not a dollar sign. Dedup against the pixel is weaker than Meta event_id. Mint a stable id for retries of the same Reddit CAPI event so a 500 does not become two PURCHASE rows. Replays keep the original event_at.
pixellint validate json @reddit-capi.json --rulepack vendor/reddit-conversions-api
Independence and both pipes
Pixel-only: ad blockers punch holes. Reddit CAPI-only: you must collect click ids and cookies yourself or match rates collapse. Both: the pixel saw the page, the server saw the order. You can launch ads on pixel-only. You cannot call it the recommended Reddit CAPI setup until diagnostics show the server event.
Pixellint is not affiliated with Reddit. Pack pages under /packs/reddit/ and /packs/reddit-conversions-api/ are the contracts. This playbook is how not to POST Meta JSON to ads-api.reddit.com. pixellint validate url on rp.gif and pixellint validate json on the Reddit CAPI body.
Check the artifact
Paste the pixel URL or JSON body into the
playground. Same engine as
pixellint validate. Artifacts you test may be stored;
see privacy.