LinkedIn Conversions API
Conversion rules
Campaign Manager → ad account → Analyze → Conversion tracking → Create conversion → data
source Conversions API or CSV (method Direct API). Create one rule per definition (for example
type Lead for forms, Book appointment for bookings, Contact for WhatsApp) and select the
campaigns it applies to. The rule id appears in the URL and in the rule details – put it into the
definition's providers.linkedin.conversionRule.
Access token
The token needs the rw_conversions scope (and r_ads to read the account):
- Campaign Manager often offers Generate token in the Conversions API setup dialog, or
- developer.linkedin.com → your app → Products → Conversions API → Auth → OAuth 2.0 tools
→ scopes
rw_conversions,r_ads→ sign in as a member with a role on the ad account.
Member tokens expire after 60 days. Put a reminder in your calendar; an expired token shows as
error with HTTP 401 on the conversions (re-send them after renewing the token).
PUT /v1/projects/{project}/destinations/linkedin
{
"enabled": true,
"mode": "live",
"transport": "direct",
"settings": { "adAccountId": "512345678", "apiVersion": "202609" },
"secrets": { "accessToken": "AQX…" }
}With "transport": "composio" the same request goes through the Composio proxy on your LinkedIn
ad connection – the LinkedIn auth config must then include rw_conversions.
What is sent
POST https://api.linkedin.com/rest/conversionEvents with headers LinkedIn-Version: <apiVersion>
and X-Restli-Protocol-Version: 2.0.0:
| Field | Value |
|---|---|
conversion | urn:lla:llaPartnerConversion:<rule id> |
conversionHappenedAt | conversion time in ms |
conversionValue | {currencyCode, amount} when the value is above 0 |
user.userIds | SHA256_EMAIL (hashed e-mail) and LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID (the session's li_fat_id) |
user.userInfo | hashed first and last name, plus company and country when known |
eventId | the conversion's event id (deduplication with the Insight Tag) |
Without e-mail, li_fat_id or a full name the status is skipped. LinkedIn accepts conversions up
to 90 days old (3x: 89).
Testing
LinkedIn has no test mode. In test mode 3x builds the payload and records dry_run with
"LinkedIn has no test mode" – unless X3_LINKEDIN_BASE_URL points to a local mock (outside
live). To verify for real, send one conversion in live mode and check Conversion tracking →
rule → Recent activity (it can take a few hours to show).
API versions
apiVersion is a YYYYMM month (default 202609). LinkedIn sunsets versions after about a year;
bump it once a year after checking LinkedIn's changelog. A sunset version answers
426 Upgrade Required. Like every 4xx except 408/429 this is final (error, no automatic retry);
after updating the version, re-send the affected conversions with POST …/conversions/{id}/retry
or MCP conversions_retry.