LinkedIn Ads API问题:无法通过API查找并获取广告活动数据
我来帮你梳理这个404问题的可能原因,结合LinkedIn Ads API的实际规则,一步步解决:
一、先排查最常见的404诱因
1. 端点路径或活动ID错误
你当前的请求路径是嵌套在adAccounts/{accountId}下的adCampaigns/{campaignId},但LinkedIn Ads API的单个活动查询端点其实是独立的:
正确的单个活动获取路径应该是 https://api.linkedin.com/rest/adCampaigns/{campaignId},而非嵌套在账户路径下。
另外务必核对LINKEDIN_CAMPAIGN_ONE_ID的准确性:去Campaign Manager的活动详情页,URL里的数字串(比如https://www.linkedin.com/campaignmanager/campaigns/123456789/...中的123456789)才是正确的活动ID,别复制到多余的符号或空格。
2. 未投放/无广告组活动的API访问限制
虽然你在后台能看到这个活动,但LinkedIn API默认可能不会返回未激活、无广告组的活动。可以先尝试获取账户下所有活动的列表,验证目标活动是否能被API识别:
const res = await fetch(`https://api.linkedin.com/rest/adAccounts/${process.env.LINKEDIN_ADS_ACCOUNT_ID}/adCampaigns?q=search&search.status:[DRAFT,PAUSED]`, { method: "GET", headers: { "X-Restli-Protocol": "2.0.0", "Linkedin-Version": "202510", // 先用稳定版本测试,避免预览版的兼容性问题 "Authorization": `Bearer ${process.env.LINKEDIN_ACCESS_TOKEN}`, } }); const data = await res.json(); console.log(data);
如果这个请求能返回你的目标活动,再用活动ID去请求单个活动;如果列表里没有,说明需要明确指定状态过滤参数,API才会返回这类非活跃活动。
3. 权限范围不足
能获取账户数据不代表能获取活动数据,检查你的Access Token是否包含r_ads和r_ads_reporting权限:
调用这个接口查看授权范围:
const res = await fetch(`https://api.linkedin.com/v2/me?projection=(serviceProviders(*(serviceName,authorizedScopes)))`, { method: "GET", headers: { "Authorization": `Bearer ${process.env.LINKEDIN_ACCESS_TOKEN}` } }); const permissions = await res.json(); console.log(permissions);
如果缺少权限,需要重新申请授权时勾选对应的广告数据访问权限。
4. 预览版本API的兼容性问题
你用的202601是LinkedIn的预览版API,可能存在端点结构的变动。先降级到稳定版本(比如202510)测试,看是否能解决404问题。
二、获取你需要的核心数据
当你成功获取活动后,以下是对应数据的获取方式:
- 活动名称:活动对象中的
name字段 - 活动预算:活动对象中的
totalBudget(总预算)或dailyBudget(日预算)字段 - 当月累计花费:需要调用广告分析API
adAnalyticsV2,指定时间范围和花费指标:
// 生成当月的起止日期 const startDate = new Date(new Date().getFullYear(), new Date().getMonth(), 1).toISOString().split('T')[0]; const endDate = new Date().toISOString().split('T')[0]; const res = await fetch(`https://api.linkedin.com/rest/adAnalyticsV2?q=analytics&pivot=CAMPAIGN&campaigns[0]=urn:li:sponsoredCampaign:${process.env.LINKEDIN_CAMPAIGN_ONE_ID}&dateRange.start=${startDate}&dateRange.end=${endDate}&metrics=costInLocalCurrency`, { method: "GET", headers: { "X-Restli-Protocol": "2.0.0", "Linkedin-Version": "202510", "Authorization": `Bearer ${process.env.LINKEDIN_ACCESS_TOKEN}`, } }); const analyticsData = await res.json(); console.log('当月花费:', analyticsData.elements[0]?.costInLocalCurrency);
内容的提问来源于stack exchange,提问作者Phoinexx

