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
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.missingvendor.linkedin-conversions-api.body.conversion.emptyvendor.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.missingvendor.linkedin-conversions-api.body.conversionHappenedAt.emptyvendor.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.missingvendor.linkedin-conversions-api.body.user.userIds[].idType.emptyvendor.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.missingvendor.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.emptyvendor.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.emptyvendor.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.emptyvendor.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