pixellint

vendor/linkedin-conversions-api · vendor documented

LinkedIn conversionHappenedAt is milliseconds

The inverse of Meta. LinkedIn documents milliseconds and rejects events older than 90 days. A 10-digit Unix timestamp is seconds, and as milliseconds it is 1970, which is older than 90 days.

Date.now() is already the right unit. conversion is urn:lla:llaPartnerConversion:ID. user.userIds is required even when you identify on lead, externalIds, or userInfo: send an empty list in those cases.

conversionHappenedAt is 13 digits

Milliseconds since epoch. Do not floor Date.now() / 1000 because the Meta CAPI snippet did.

Rule: vendor.linkedin-conversions-api.body.conversionHappenedAt.invalid

What this pack matches

Hosts
api.linkedin.com
Paths
…/conversionEvents…
Vendor docs
learn.microsoft.com/en-us/linkedin/marketing/integrations/ads-reporting/conversions-api

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
conversion required It is the conversion rule URN the event is attributed to, in the form `urn:lla:llaPartnerConversion:ID`. Fix: Send the URN of a conversion rule created with `conversionMethod` set to `CONVERSIONS_API`. vendor.linkedin-conversions-api.body.conversion.missing
vendor.linkedin-conversions-api.body.conversion.empty
vendor.linkedin-conversions-api.body.conversion.invalid
docs
conversionHappenedAt required LinkedIn documents it as an epoch timestamp in milliseconds, and rejects events older than 90 days. A 10-digit value is seconds and lands in 1970. Fix: Send milliseconds, not seconds: a JavaScript `Date.now()` is already in the right unit. vendor.linkedin-conversions-api.body.conversionHappenedAt.missing
vendor.linkedin-conversions-api.body.conversionHappenedAt.empty
vendor.linkedin-conversions-api.body.conversionHappenedAt.invalid
docs
user.userIds required LinkedIn returns a 422 when `user.userIds` is absent. Identifying the person by `lead`, `externalIds`, or `userInfo` instead still requires it, sent as an empty list. Fix: Add `user.userIds`. If you match on something else, send it as an empty list: `"userIds": []`. vendor.linkedin-conversions-api.body.user.userIds.missing docs
user.userIds[].idType required It names the kind of identifier carried in `idValue`. Fix: Use one of the documented identifier types. vendor.linkedin-conversions-api.body.user.userIds[].idType.missing
vendor.linkedin-conversions-api.body.user.userIds[].idType.empty
vendor.linkedin-conversions-api.body.user.userIds[].idType.invalid
docs
user.userIds[].idValue required LinkedIn rejects the event when an identifier is present but empty. Fix: Populate `idValue`, or drop the entry entirely rather than sending it blank. vendor.linkedin-conversions-api.body.user.userIds[].idValue.missing
vendor.linkedin-conversions-api.body.user.userIds[].idValue.empty
docs
user.lead optional LinkedIn rejects a `lead` that is not a valid URN. Fix: Send it as `urn:li:leadGenFormResponse:ID`. vendor.linkedin-conversions-api.body.user.lead.empty
vendor.linkedin-conversions-api.body.user.lead.invalid
docs
conversionValue.currencyCode optional It is the three-letter currency code of the conversion value. Fix: Use the ISO 4217 code, such as `USD`. vendor.linkedin-conversions-api.body.conversionValue.currencyCode.empty
vendor.linkedin-conversions-api.body.conversionValue.currencyCode.invalid
docs
conversionValue.amount optional LinkedIn documents the amount as a decimal string, as in `"50.0"`. Fix: Send the amount as a string holding a decimal number, without a currency symbol. vendor.linkedin-conversions-api.body.conversionValue.amount.empty
vendor.linkedin-conversions-api.body.conversionValue.amount.invalid
docs
eventId optional It identifies the event so repeated sends are not counted twice. vendor.linkedin-conversions-api.body.eventId.empty docs
body.value_needs_both_fields required `conversionValue` carries an amount with no `currencyCode`. LinkedIn documents both fields together. Fix: Add `conversionValue.currencyCode` alongside the amount. vendor.linkedin-conversions-api.body.value_needs_both_fields docs
body.unhashed_email required An identifier carries what looks like a raw email address. LinkedIn matches on `SHA256_EMAIL`, which is the SHA-256 digest rather than the address. Fix: Lowercase and trim the address, hash it with SHA-256, and send the hex digest with `idType` set to `SHA256_EMAIL`. vendor.linkedin-conversions-api.body.unhashed_email docs

Validate a payload

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

Or paste it into the playground. Same engine, in the browser, nothing sent anywhere.

cargo install pixellint · npm install pixellint