LinkedIn Performance Report
linkedin_campaign_analyticsLinkedIn performance report. pivot: CAMPAIGN | CREATIVE | CAMPAIGN_GROUP | ACCOUNT | MEMBER_JOB_TITLE | MEMBER_JOB_FUNCTION | MEMBER_INDUSTRY | MEMBER_SENIORITY | MEMBER_COMPANY_SIZE ... Up to THREE pivots at once, comma-separated (e.g. pivot='CAMPAIGN_GROUP,CAMPAIGN,CREATIVE') via LinkedIn's Statistics finder; combinable pivots are ACCOUNT, CAMPAIGN_GROUP, CAMPAIGN, CREATIVE, CONVERSION. Professional demographic pivots (MEMBER_*) work one at a time. campaign_ids = comma-separated campaign ids to narrow the report. start_date/end_date (YYYY-MM-DD) override days. Performance data is kept 10 years, professional demographic data 2 years (https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads-reporting/ads-reporting). time_granularity: ALL | DAILY | MONTHLY. fields: comma-separated metric list (empty = default set; up to 20). Demographic pivots have a 12-24h delay and privacy thresholds.
Each row carries pivot_names — the HUMAN-READABLE labels for pivotValues, resolved for
you at EVERY level: campaign / ad set / campaign group / creative names as well as
demographic labels. Report from pivot_names; never show raw URNs like urn:li:title:95
to the user and do NOT try to reverse them with typeahead search (that only goes name→ID).
Anything that genuinely could not be resolved is listed in unresolved_pivot_urns.
With pivot=CREATIVE each row also carries creative_content (headline, description,
landing_page, format), so for TEXT-BASED formats (textAd, spotlight, follow/jobs ads) you
can correlate MESSAGING with performance directly, without a second call.
POST-BASED formats are the exception and in many accounts they are the MAJORITY of spend
(Sponsored Content, Document Ads, Thought Leader Ads). There the copy lives in the
referenced post, so by default creative_content carries post_urn + post_permalink
and ad_copy_status: "not_fetched" instead of the text — the report stays fast. The copy
IS retrievable: rank the rows first, then call linkedin_ad_copy with the top creative
ids (or re-run with include_ad_previews=true) — it reads the real ad text from LinkedIn's
PUBLIC Ad Library, plus author_type / is_thought_leader_ad (Thought Leader Ads) and
preview_url. Both paths are capped at 60 creatives, so narrow down first. Never invent
copy and never present an internal creative name as the ad text.
Rows also carry computed ctr, engagement_rate, cpc, cpm (ratios, not %) — LinkedIn
returns only raw counts; use these instead of recomputing. pivotValues is always
requested even if you pass a custom fields list (without it rows have no identity).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| pivot | No | CAMPAIGN | |
| fields | No | ||
| end_date | No | ||
| account_id | No | ||
| start_date | No | ||
| campaign_ids | No | ||
| time_granularity | No | ALL | |
| include_ad_previews | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||