LinkedIn Ads API技术求助:无法通过API获取指定广告系列数据(返回404错误)
嘿,我之前也碰到过类似的LinkedIn Ads API坑,结合你的情况,咱们一步步来排查这个404问题:
1. 先修正API端点的路径格式
你当前用的/adAccounts/{accountId}/adCampaigns/{campaignId}路径可能不符合LinkedIn API的规则——LinkedIn的REST API里,获取单个广告系列不需要嵌套在账户路径下,正确的单个资源端点应该是/adCampaigns/{campaignId}。
试试把代码改成这样:
const res = await fetch(`https://api.linkedin.com/rest/adCampaigns/${process.env.LINKEDIN_CAMPAIGN_ONE_ID}`, { method: "GET", headers: { "X-Restli-Protocol": "2.0.0", "Linkedin-Version": "202601", "Authorization": `Bearer ${process.env.LINKEDIN_ACCESS_TOKEN}`, } });
如果想获取某个账户下的所有广告系列,才用/adAccounts/{accountId}/adCampaigns这个路径(不带单个campaignId),这个端点会返回该账户下的所有系列列表,也能帮你确认目标ID是否正确。
2. 确认权限和令牌没问题
虽然你能拿到账户数据,但广告系列可能需要更具体的权限。检查你的Access Token是否包含r_ads(只读)或rw_ads(读写)权限——如果权限不够,一般会返回403,但偶尔也可能有奇怪的404情况,所以还是确认下更稳妥。另外,别忘了检查令牌有没有过期,LinkedIn短期令牌有效期是60天,长期令牌需要定期刷新。
3. 核对广告系列ID的准确性
有时候Campaign Manager里显示的ID和API要求的格式可能有出入:
- 确保
LINKEDIN_CAMPAIGN_ONE_ID是纯数字的ID,LinkedIn广告系列ID通常就是一串数字,没有前缀或后缀 - 可以先调用账户下所有广告系列的接口,拿到完整列表后直接复制目标ID,避免手动输入错误。代码示例:
const res = await fetch(`https://api.linkedin.com/rest/adAccounts/${process.env.LINKEDIN_ADS_ACCOUNT_ID}/adCampaigns`, { method: "GET", headers: { "X-Restli-Protocol": "2.0.0", "Linkedin-Version": "202601", "Authorization": `Bearer ${process.env.LINKEDIN_ACCESS_TOKEN}`, // 指定需要的字段,减少返回的数据量 "fields": "id,name,budget_amount,cost_in_local_currency" } }); const campaigns = await res.json(); console.log("账户下的广告系列列表:", campaigns);
4. 检查广告系列的状态过滤
即使广告系列存在,未投放状态的系列会不会被默认过滤?LinkedIn API默认应该返回所有状态的系列,但保险起见,你可以在请求所有系列时显式指定状态参数,比如:
const res = await fetch(`https://api.linkedin.com/rest/adAccounts/${process.env.LINKEDIN_ADS_ACCOUNT_ID}/adCampaigns?q=search&search.statuses=ACTIVE,PAUSED,DRAFT,COMPLETED`, { method: "GET", headers: { "X-Restli-Protocol": "2.0.0", "Linkedin-Version": "202601", "Authorization": `Bearer ${process.env.LINKEDIN_ACCESS_TOKEN}`, "fields": "id,name,budget_amount,cost_in_local_currency" } });
5. 试试切换到稳定的API版本
你用的202601是未来版本,LinkedIn允许提前使用,但可能存在一些未公开的兼容性问题。建议换成较新的稳定版本,比如202412,看看能不能解决问题:
headers: { "X-Restli-Protocol": "2.0.0", "Linkedin-Version": "202412", // 换成稳定版本 "Authorization": `Bearer ${process.env.LINKEDIN_ACCESS_TOKEN}`, }
关于获取你需要的核心数据
当成功拿到广告系列数据后,要获取预算、当月花费、名称这些字段,记得在请求头里加fields参数指定:
name:广告系列名称budget_amount:预算金额(包含币种信息)cost_in_local_currency:累计总花费
如果需要当月的累计花费,基础广告系列接口可能满足不了,得调用Ads Analytics API,它支持按时间范围过滤数据。示例代码大概是这样:
const res = await fetch(`https://api.linkedin.com/rest/adAnalytics?q=analytics&pivot=CAMPAIGN&dateRange.start=2025-01-01&dateRange.end=2025-01-31&accounts=urn:li:sponsoredAccount:${process.env.LINKEDIN_ADS_ACCOUNT_ID}&campaigns=urn:li:sponsoredCampaign:${process.env.LINKEDIN_CAMPAIGN_ONE_ID}&metrics=costInLocalCurrency`, { method: "GET", headers: { "X-Restli-Protocol": "2.0.0", "Linkedin-Version": "202412", "Authorization": `Bearer ${process.env.LINKEDIN_ACCESS_TOKEN}`, } }); const analyticsData = await res.json(); console.log("当月累计花费:", analyticsData);
内容的提问来源于stack exchange,提问作者Phoinexx

