vendor/pinterest-conversions-api · vendor documented
Pinterest Conversions API event payloads
The server-side sibling of the Pinterest tag. The ad account ID lives in the path. The event payload is contracted as Pinterest documents it.
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 |
|---|---|---|---|---|
ad_account_id |
required | It is the Pinterest ad account ID, and it travels in the path. Fix: Put the ad account ID in the path as `/v5/ad_accounts/{ad_account_id}/events`. | vendor.pinterest-conversions-api.param.ad_account_id.missingvendor.pinterest-conversions-api.param.ad_account_id.empty |
docs |
event_name |
required | It is the conversion event name. Pinterest documents a set of standard names and also allows a custom name of up to 100 characters. Fix: Send a documented name such as `checkout`, or a custom name mapped to a standard event in Ads Manager. | vendor.pinterest-conversions-api.body.event_name.missingvendor.pinterest-conversions-api.body.event_name.empty |
docs |
action_source |
required | It is the platform the event was ingested from. Pinterest documents `web`, `app_android`, `app_ios`, and `offline`. Fix: Send `web`, `app_android`, `app_ios`, or `offline`. Pinterest spells `web` in lower case, unlike Snap. | vendor.pinterest-conversions-api.body.action_source.missingvendor.pinterest-conversions-api.body.action_source.emptyvendor.pinterest-conversions-api.body.action_source.invalid |
docs |
event_id |
required | It identifies the event for deduplication against the Pinterest tag. Fix: Send a stable id per conversion, such as an order number. | vendor.pinterest-conversions-api.body.event_id.missingvendor.pinterest-conversions-api.body.event_id.empty |
docs |
event_time |
required | Pinterest documents a Unix timestamp in seconds. A 13-digit value is milliseconds. Fix: Send seconds, not milliseconds: divide a JavaScript `Date.now()` by 1000 and floor it. | vendor.pinterest-conversions-api.body.event_time.missingvendor.pinterest-conversions-api.body.event_time.emptyvendor.pinterest-conversions-api.body.event_time.invalid |
docs |
user_data |
required | Pinterest requires a `user_data` object, and it must include at least one of `em`, `hashed_maids`, or an IP and user agent pair. Fix: Add `user_data` with a hashed email, hashed MAIDs, or `client_ip_address` and `client_user_agent`. | vendor.pinterest-conversions-api.body.user_data.missing |
docs |
user_data.em |
optional | Email must be lowercased and SHA-256 hashed before it is sent. Fix: Lowercase the address, hash it with SHA-256, and send the hex digest. | vendor.pinterest-conversions-api.body.user_data.em.emptyvendor.pinterest-conversions-api.body.user_data.em.invalid |
docs |
user_data.em[] |
optional | Every email in the list must be lowercased and SHA-256 hashed. Fix: Hash each address with SHA-256 and send the hex digest. | vendor.pinterest-conversions-api.body.user_data.em[].emptyvendor.pinterest-conversions-api.body.user_data.em[].invalid |
docs |
user_data.ph |
optional | Phone must be digits-only with country code, then SHA-256 hashed. Fix: Strip symbols, keep the country code, hash with SHA-256, and send the hex digest. | vendor.pinterest-conversions-api.body.user_data.ph.emptyvendor.pinterest-conversions-api.body.user_data.ph.invalid |
docs |
user_data.external_id |
optional | External IDs must be SHA-256 hashed. Fix: Hash the customer id with SHA-256 and send the hex digest. | vendor.pinterest-conversions-api.body.user_data.external_id.emptyvendor.pinterest-conversions-api.body.user_data.external_id.invalid |
docs |
user_data.client_ip_address |
optional | It is the visitor IP address, sent unhashed. Fix: Send the browser's public IP, not a digest. | vendor.pinterest-conversions-api.body.user_data.client_ip_address.empty |
docs |
user_data.client_user_agent |
optional | It is the visitor user agent, sent unhashed. Fix: Send the browser's user agent string, not a digest. | vendor.pinterest-conversions-api.body.user_data.client_user_agent.empty |
docs |
user_data.hashed_maids |
optional | Hashed GAID or IDFA. Pinterest documents SHA-256. Fix: Hash the MAID with SHA-256 and send the hex digest. | vendor.pinterest-conversions-api.body.user_data.hashed_maids.emptyvendor.pinterest-conversions-api.body.user_data.hashed_maids.invalid |
docs |
user_data.hashed_maids[] |
optional | Every MAID in the list must be SHA-256 hashed. Fix: Hash each MAID with SHA-256 and send the hex digest. | vendor.pinterest-conversions-api.body.user_data.hashed_maids[].emptyvendor.pinterest-conversions-api.body.user_data.hashed_maids[].invalid |
docs |
custom_data.currency |
optional | It is an ISO 4217 currency code. Fix: Use the three-letter code, such as `USD`. | vendor.pinterest-conversions-api.body.custom_data.currency.emptyvendor.pinterest-conversions-api.body.custom_data.currency.invalid |
docs |
body.user_needs_an_identifier |
required | `user_data` carries none of the identifiers Pinterest requires. Send `em`, `hashed_maids`, or `client_ip_address` with `client_user_agent`. Fix: Add a hashed email, hashed MAIDs, or the IP and user agent pair. | vendor.pinterest-conversions-api.body.user_needs_an_identifier |
docs |
body.unhashed_email |
required | A field carries what looks like a raw email address. Pinterest requires `user_data.em` to be a SHA-256 hex digest. Fix: Lowercase the address, hash it with SHA-256, and send the hex digest. | vendor.pinterest-conversions-api.body.unhashed_email |
docs |
body.hashed_plaintext_field |
required | This field looks like a SHA-256 digest, but Pinterest documents `client_ip_address` and `client_user_agent` as unhashed. Fix: Send the raw IP address or user agent. Hashing it makes the event unmatchable. | vendor.pinterest-conversions-api.body.hashed_plaintext_field |
docs |
Validate a payload
pixellint validate json @payload.json --rulepack vendor/pinterest-conversions-api
Or paste it into the playground. Same engine, in the browser, nothing sent anywhere.
cargo install pixellint
·
npm install pixellint