领英
通过托管的OAuth认证访问领英API。分享帖子、管理广告活动、获取个人和组织信息、上传媒体文件,以及访问广告库。
快速开始
# 获取当前用户个人资料
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/linkedin/rest/me')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('LinkedIn-Version', '202506')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
基础URL
https://gateway.maton.ai/linkedin/rest/{resource}
网关将请求代理到api.linkedin.com并自动注入您的OAuth令牌。
认证
所有请求都要求在Authorization头部中包含Maton API密钥:
Authorization: Bearer $MATON_API_KEY
环境变量:将您的API密钥设置为MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
获取您的API密钥
- 请登录或前往maton.ai
- 前往maton.ai/settings
- 复制您的 API 密钥
必需请求头
LinkedIn REST API 要求包含版本请求头:
LinkedIn-Version: 202506
连接管理
请在以下地址管理您的 LinkedIn OAuth 连接https://ctrl.maton.ai。
列出连接
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=linkedin&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
创建连接
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'linkedin'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
获取连接
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
响应:
{
"connection": {
"connection_id": "ba10eb9e-b590-4e95-8c2e-3901ff94642a",
"status": "ACTIVE",
"creation_time": "2026-02-07T08:00:24.372659Z",
"last_updated_time": "2026-02-07T08:05:16.609085Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "linkedin",
"metadata": {}
}
}
打开返回的url在浏览器中完成OAuth授权。
删除连接
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
指定连接
如果您有多个LinkedIn连接,请使用Maton-Connection请求头指定要使用的连接:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/linkedin/rest/me')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('LinkedIn-Version', '202506')
req.add_header('Maton-Connection', 'ba10eb9e-b590-4e95-8c2e-3901ff94642a')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
如果省略,网关将使用默认的(最早创建的)活动连接。
API 参考
个人资料
获取当前用户个人资料
GET /linkedin/rest/me
LinkedIn-Version: 202506
示例:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/linkedin/rest/me')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('LinkedIn-Version', '202506')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
响应:
{
"firstName": {
"localized": {"en_US": "John"},
"preferredLocale": {"country": "US", "language": "en"}
},
"localizedFirstName": "John",
"lastName": {
"localized": {"en_US": "Doe"},
"preferredLocale": {"country": "US", "language": "en"}
},
"localizedLastName": "Doe",
"id": "yrZCpj2Z12",
"vanityName": "johndoe",
"localizedHeadline": "Software Engineer at Example Corp",
"profilePicture": {
"displayImage": "urn:li:digitalmediaAsset:C4D00AAAAbBCDEFGhiJ"
}
}
分享帖子
创建文本帖子
POST /linkedin/rest/posts
Content-Type: application/json
LinkedIn-Version: 202506
{
"author": "urn:li:person:{personId}",
"lifecycleState": "PUBLISHED",
"visibility": "PUBLIC",
"commentary": "Hello LinkedIn! This is my first API post.",
"distribution": {
"feedDistribution": "MAIN_FEED"
}
}
响应: 201 已创建附带包含帖子 URN 的x-restli-id 请求头。
创建文章/URL分享
POST /linkedin/rest/posts
Content-Type: application/json
LinkedIn-Version: 202506
{
"author": "urn:li:person:{personId}",
"lifecycleState": "PUBLISHED",
"visibility": "PUBLIC",
"commentary": "看看这篇好文章!",
"distribution": {
"feedDistribution": "MAIN_FEED"
},
"content": {
"article": {
"source": "https://example.com/article",
"title": "文章标题",
"description": "此处为文章描述"
}
}
}
创建图片帖子
首先,初始化图片上传,然后上传图片,最后创建帖子。
步骤 1:初始化图片上传
POST /linkedin/rest/images?action=initializeUpload
Content-Type: application/json
LinkedIn-Version: 202506
{
"initializeUploadRequest": {
"owner": "urn:li:person:{personId}"
}
}
响应:
{
"value": {
"uploadUrlExpiresAt": 1770541529250,
"uploadUrl": "https://www.linkedin.com/dms-uploads/...",
"image": "urn:li:image:D4D10AQH4GJAjaFCkHQ"
}
}
步骤 2:上传图片二进制数据
PUT {来自步骤1的uploadUrl}
Content-Type: image/png
{图片二进制数据}
步骤 3:创建图片帖子
POST /linkedin/rest/posts
Content-Type: application/json
LinkedIn-Version: 202506
{
"author": "urn:li:person:{personId}",
"lifecycleState": "PUBLISHED",
"visibility": "PUBLIC",
"commentary": "看看这张图片!",
"distribution": {
"feedDistribution": "MAIN_FEED"
},
"content": {
"media": {
"id": "urn:li:image:D4D10AQH4GJAjaFCkHQ",
"title": "图片标题"
}
}
}
可见性选项
| 值 | 描述 |
|---|---|
PUBLIC | LinkedIn上的任何人都可以查看 |
联系人 | 仅一级联系人可查看 |
分享媒体类别
| 值 | 描述 |
|---|---|
无 | 纯文本帖子 |
文章 | URL/文章分享 |
图片 | 图片帖子 |
视频 | 视频帖子 |
广告库(公开数据)
广告库API提供对LinkedIn上公开广告数据的访问。这些端点使用带有版本头的REST API。
广告库所需头部
LinkedIn-Version: 202506
搜索广告
GET /linkedin/rest/adLibrary?q=criteria&keyword={keyword}
查询参数:
keyword(字符串):搜索广告内容(多个关键词使用AND逻辑)advertiser(字符串):按广告主名称搜索countries(数组):按ISO 3166-1 alpha-2国家代码筛选dateRange(对象):按投放日期筛选start(整数):分页偏移量count(整数):每页结果数(最多25条)
示例 - 按关键词搜索广告:
GET /linkedin/rest/adLibrary?q=criteria&keyword=linkedin
示例 - 按广告主搜索广告:
GET /linkedin/rest/adLibrary?q=criteria&advertiser=microsoft
响应:
{
"paging": {
"start": 0,
"count": 10,
"total": 11619543,
"links": [...]
},
"elements": [
{
"adUrl": "https://www.linkedin.com/ad-library/detail/...",
"details": {
"advertiser": {...},
"adType": "TEXT_AD",
"targeting": {...},
"statistics": {
"firstImpressionDate": 1704067200000,
"latestImpressionDate": 1706745600000,
"impressionsFrom": 1000,
"impressionsTo": 5000
}
},
"isRestricted": false
}
]
}
搜索职位发布
GET /linkedin/rest/jobLibrary?q=criteria&keyword={keyword}
注意:职位库要求版本为202506。
查询参数:
keyword(字符串):搜索职位内容organization(字符串):按公司名称筛选countries(数组):按国家代码筛选dateRange(对象):按发布日期筛选start(整数):分页偏移量count(整数):每页结果数(最多24条)
示例:
GET /linkedin/rest/jobLibrary?q=criteria&keyword=software&organization=google
响应内容包括:
jobPostingUrl:职位发布链接jobDetails:职位标题、地点、描述、薪资、福利statistics:展示数据
营销API(广告)
营销API提供对领英广告平台的访问权限。这些端点使用版本化的REST API。
营销API所需请求头
LinkedIn-Version: 202506
列出广告账户
GET /linkedin/rest/adAccounts?q=search
返回认证用户可以访问的所有广告账户。
响应:
{
"paging": {
"start": 0,
"count": 10,
"links": []
},
"elements": [
{
"id": 123456789,
"name": "我的广告账户",
"status": "激活",
"type": "企业",
"currency": "美元",
"reference": "urn:li:organization:12345"
}
]
}
获取广告账户
GET /linkedin/rest/adAccounts/{adAccountId}
创建广告账户
POST /linkedin/rest/adAccounts
Content-Type: application/json
{
"name": "新广告账户",
"currency": "美元",
"reference": "urn:li:organization:{orgId}",
"type": "企业"
}
更新广告账户
POST /linkedin/rest/adAccounts/{adAccountId}
Content-Type: application/json
X-RestLi-Method: PARTIAL_UPDATE
{
"patch": {
"$set": {
"name": "更新账户名称"
}
}
}
列出广告系列组
广告系列组嵌套在广告账户下:
GET /linkedin/rest/adAccounts/{adAccountId}/adCampaignGroups
创建广告系列组
POST /linkedin/rest/adAccounts/{adAccountId}/adCampaignGroups
Content-Type: application/json
{
"name": "2026年第一季度广告系列",
"status": "草稿",
"runSchedule": {
"start": 1704067200000,
"end": 1711929600000
},
"totalBudget": {
"amount": "10000",
"currencyCode": "USD"
}
}
获取广告系列组
GET /linkedin/rest/adAccounts/{adAccountId}/adCampaignGroups/{campaignGroupId}
更新广告系列组
POST /linkedin/rest/adAccounts/{adAccountId}/adCampaignGroups/{campaignGroupId}
Content-Type: application/json
X-RestLi-Method: PARTIAL_UPDATE
{
"patch": {
"$set": {
"status": "活跃"
}
}
}
删除广告系列组
DELETE /linkedin/rest/adAccounts/{adAccountId}/adCampaignGroups/{campaignGroupId}
列出广告系列
广告系列同样嵌套在广告账户下:
GET /linkedin/rest/adAccounts/{adAccountId}/adCampaigns
创建广告系列
POST /linkedin/rest/adAccounts/{adAccountId}/adCampaigns
Content-Type: application/json
{
"campaignGroup": "urn:li:sponsoredCampaignGroup:123456",
"name": "品牌知名度广告系列",
"status": "草稿",
"type": "赞助内容更新",
"objectiveType": "品牌知名度",
"dailyBudget": {
"amount": "100",
"currencyCode": "USD"
},
"costType": "每千次展示成本",
"unitCost": {
"amount": "5",
"currencyCode": "USD"
},
"locale": {
"country": "美国",
"language": "英语"
}
}
获取广告系列
GET /linkedin/rest/adAccounts/{adAccountId}/adCampaigns/{campaignId}
更新广告活动
POST /linkedin/rest/adAccounts/{adAccountId}/adCampaigns/{campaignId}
Content-Type: application/json
X-RestLi-Method: PARTIAL_UPDATE
{
"patch": {
"$set": {
"status": "ACTIVE"
}
}
}
删除广告活动
DELETE /linkedin/rest/adAccounts/{adAccountId}/adCampaigns/{campaignId}
广告活动状态值
| 状态 | 描述 |
|---|---|
草稿 | 广告活动处于草稿模式 |
活跃 | 广告活动正在运行 |
已暂停 | 广告活动已暂停 |
已归档 | 广告活动已归档 |
已完成 | 广告活动已结束 |
已取消 | 广告活动已取消 |
广告活动目标类型
| 目标 | 描述 |
|---|---|
品牌知名度 | 提升品牌可见度 |
网站访问 | 为网站引流 |
互动 | 提升帖子互动率 |
视频观看量 | 最大化视频观看量 |
潜在客户开发 | 通过潜在客户开发表单收集线索 |
网站转化 | 促进网站转化 |
职位申请人 | 吸引职位申请 |
组织
列出组织访问控制列表
获取认证用户有权访问的组织:
GET /linkedin/rest/organizationAcls?q=roleAssignee
LinkedIn-Version: 202506
{ "paging": { "start": 0, "count": 10, "total": 2 }, "elements": [ { "role": "ADMINISTRATOR", "organization": "urn:li:organization:12345", "state": "APPROVED" } ] }
获取组织信息
GET /linkedin/rest/organizations/{organizationId} LinkedIn-Version: 202506
通过个性化名称查找组织
GET /linkedin/rest/organizations?q=vanityName&vanityName={vanityName}
示例:
GET /linkedin/rest/organizations?q=vanityName&vanityName=microsoft
响应:
{ "elements": [ { "vanityName": "microsoft", "localizedName": "Microsoft", "website": { "localized": {"en_US": "https://news.microsoft.com/"} } } ] }
获取组织分享统计数据
GET /linkedin/rest/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity={orgUrn}
示例:
GET /linkedin/rest/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity=urn:li:organization:12345
获取组织帖子
GET /linkedin/rest/posts?q=author&author={orgUrn}
示例:
GET /linkedin/rest/posts?q=author&author=urn:li:organization:12345
媒体上传(REST API)
REST API 提供了现代化的媒体上传端点。所有端点都需要版本头信息。
The REST API provides modern media upload endpoints. All require version headerLinkedIn版本:202506.
初始化图片上传
POST /linkedin/rest/images?action=initializeUpload
Content-Type: application/json
LinkedIn-Version: 202506
{
"initializeUploadRequest": {
"owner": "urn:li:person:{personId}"
}
}
响应:
{
"value": {
"uploadUrlExpiresAt": 1770541529250,
"uploadUrl": "https://www.linkedin.com/dms-uploads/...",
"image": "urn:li:image:D4D10AQH4GJAjaFCkHQ"
}
}
使用此uploadUrl来PUT你的图片二进制数据,然后在你的帖子中使用这个imageURN。
创建视频帖子
视频上传是一个4步流程:初始化、上传二进制文件、完成、然后创建帖子。
关键提示 — URL编码:初始化步骤返回的上传URL包含URL编码字符(例如,
%253D),这些字符在通过shell变量或curl传递时可能会损坏。你必须使用Pythonurllib完成整个流程——解析JSON响应并直接在Python中使用URL,而不通过shell传递。这是唯一可靠的方法。
完整工作示例:
python <<'EOF'
import urllib.request, os, json
GATEWAY = 'https://gateway.maton.ai'
HEADERS = {
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'Content-Type': 'application/json',
'LinkedIn-Version': '202506',
'X-Restli-Protocol-Version': '2.0.0',
}
# 步骤 0:获取个人ID
req = urllib.request.Request(f'{GATEWAY}/linkedin/rest/me')
for k, v in HEADERS.items(): req.add_header(k, v)
person_id = json.load(urllib.request.urlopen(req))['id']
owner = f'urn:li:person:{person_id}'
# 步骤 1:初始化上传(通过网关)
file_path = '/path/to/video.mp4'
file_size = os.path.getsize(file_path)
init_data = json.dumps({
'initializeUploadRequest': {
'owner': owner,
'fileSizeBytes': file_size,
'uploadCaptions': False,
'uploadThumbnail': False,
}
}).encode()
req = urllib.request.Request(f'{GATEWAY}/linkedin/rest/videos?action=initializeUpload', data=init_data, method='POST')
for k, v in HEADERS.items(): req.add_header(k, v)
init_resp = json.load(urllib.request.urlopen(req))
upload_url = init_resp['value']['uploadInstructions'][0]['uploadUrl']
video_urn = init_resp['value']['video']
# 步骤 2:将二进制文件直接上传到LinkedIn的预签名URL(不通过网关)
# 上传URL指向 www.linkedin.com —— 它是预签名的,不需要Authorization头。
# 重要:完全按照json.load()返回的URL使用——不要通过shell变量传递。
with open(file_path, 'rb') as f:
video_data = f.read()
upload_req = urllib.request.Request(upload_url, data=video_data, method='PUT')
upload_req.add_header('Content-Type', 'application/octet-stream')
upload_resp = urllib.request.urlopen(upload_req)
etag = upload_resp.headers['etag']
# 步骤 3:完成上传(通过网关)
finalize_data = json.dumps({
'finalizeUploadRequest': {
'video': video_urn,
'uploadToken': '',
'uploadedPartIds': [etag],
}
}).encode()
req = urllib.request.Request(f'{GATEWAY}/linkedin/rest/videos?action=finalizeUpload', data=finalize_data, method='POST')
for k, v in HEADERS.items(): req.add_header(k, v)
urllib.request.urlopen(req)
# 步骤 4:创建带视频的帖子(通过网关)
post_data = json.dumps({
'author': owner,
'lifecycleState': 'PUBLISHED',
'visibility': 'PUBLIC',
'commentary': '看看这个视频!',
'distribution': {'feedDistribution': 'MAIN_FEED'},
'content': {'media': {'id': video_urn}},
}).encode()
req = urllib.request.Request(f'{GATEWAY}/linkedin/rest/posts', data=post_data, method='POST')
for k, v in HEADERS.items(): req.add_header(k, v)
resp = urllib.request.urlopen(req)
print(f'视频帖子已创建! {resp.headers.get("location")}')
EOF
工作原理:
- 步骤1、3、4通过网关(
gateway.maton.ai/linkedin/...)进行——网关会自动注入你的OAuth令牌。 - 步骤2直接访问LinkedIn的预签名上传URL(
www.linkedin.com/dms-uploads/...)——不需要认证头,也不通过网关。 - 来自上传响应的
etag是完成步骤所必需的。 - 对于大视频(>4MB),LinkedIn会返回多个
uploadInstructions——将每个分块上传到其对应的URL并收集所有etag。
视频规格:
- 时长:3秒至30分钟
- 文件大小:75KB至500MB
- 格式:MP4
初始化文档上传
POST /linkedin/rest/documents?action=initializeUpload
Content-Type: application/json
LinkedIn-Version: 202506
{
"initializeUploadRequest": {
"owner": "urn:li:person:{personId}"
}
}
响应:
{
"value": {
"uploadUrlExpiresAt": 1770541530896,
"uploadUrl": "https://www.linkedin.com/dms-uploads/...",
"document": "urn:li:document:D4D10AQHr-e30QZCAjQ"
}
}
广告定向
获取可用的定向维度
GET /linkedin/rest/adTargetingFacets
返回广告活动所有可用的定向维度(共31个维度,包括雇主、学位、技能、地理位置、行业等)。
响应:
{
"elements": [
{
"facetName": "skills",
"adTargetingFacetUrn": "urn:li:adTargetingFacet:skills",
"entityTypes": ["SKILL"],
"availableEntityFinders": ["AD_TARGETING_FACET", "TYPEAHEAD"]
},
{
"facetName": "industries",
"adTargetingFacetUrn": "urn:li:adTargetingFacet:industries"
}
]
}
可用的定向维度包括:
技能- 会员技能行业- 行业类别职位头衔- 职位名称资历- 资历级别学位- 教育学位学校- 教育机构雇主/过往雇主- 当前/过往雇主地点/地理位置- 地理定位公司规模- 公司规模范围性别- 性别定位年龄范围- 年龄范围定向
获取您的个人ID
要创建帖子,您需要您的LinkedIn个人ID。请从以下/rest/me端点获取:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/linkedin/rest/me')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('LinkedIn-Version', '202506')
result = json.load(urllib.request.urlopen(req))
print(f"您的个人URN: urn:li:person:{result['id']}")
EOF
代码示例
JavaScript - 创建文本帖子
const personId = '您的个人ID';
const response = await fetch(
'https://gateway.maton.ai/linkedin/rest/posts',
{
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`,
'Content-Type': 'application/json',
'LinkedIn-Version': '202506'
},
body: JSON.stringify({
author: `urn:li:person:${personId}`,
lifecycleState: 'PUBLISHED',
visibility: 'PUBLIC',
commentary: '来自API的问候!',
distribution: {
feedDistribution: 'MAIN_FEED'
}
})
}
);
Python - 创建文本帖子
import os
import requests
person_id = '您的个人ID'
response = requests.post(
'https://gateway.maton.ai/linkedin/rest/posts',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'Content-Type': 'application/json',
'LinkedIn-Version': '202506'
},
json={
'author': f'urn:li:person:{person_id}',
'lifecycleState': 'PUBLISHED',
'visibility': 'PUBLIC',
'commentary': '来自API的问候!',
'distribution': {
'feedDistribution': 'MAIN_FEED'
}
}
)
速率限制
| 限制类型 | 每日限制(UTC) |
|---|---|
| 成员 | 150 次请求/天 |
| 应用 | 100,000 次请求/天 |
注意事项
- 个人ID在每个应用中唯一,不能跨应用转移
- `author`
字段必须使用URN格式:urn:li:person:{personId}所有帖子都需要 - All posts require
生命周期状态:"已发布" - 图片上传是一个三步流程:初始化、上传二进制文件、创建帖子
- 视频上传是一个四步流程:初始化、上传二进制文件、最终化、创建帖子
- 媒体上传URL(图片、视频、文档)指向
www.linkedin.com,而非api.linkedin.com。这些是预签名URL,不经过网关且不需要授权头。您必须使用Python的urllib处理这些URL——不要通过shell变量传递或使用curl,因为URL包含编码字符(%253D),这些字符会被shell扩展破坏。 - 在所有REST API调用中包含
LinkedIn-Version: 202506头信息 - 个人资料图片URL可能会过期;需要时请重新获取
错误处理
| 状态码 | 含义 |
|---|---|
| 400 | 缺少LinkedIn连接或请求无效 |
| 401 | 无效或缺失的Maton API密钥 |
| 403 | 权限不足(检查OAuth范围) |
| 404 | 资源未找到 |
| 422 | 请求体或URN格式无效 |
| 429 | 请求频率受限 |
| 4xx/5xx | 来自LinkedIn API的透传错误 |
错误响应格式
{
"status": 403,
"serviceErrorCode": 100,
"code": "ACCESS_DENIED",
"message": "权限不足,无法访问资源"
}
故障排除:API密钥问题
- 检查
MATON_API_KEY环境变量是否已设置:
echo $MATON_API_KEY
- 通过列出连接来验证API密钥是否有效:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
故障排除:无效的应用名称
- 请确保您的URL路径以
linkedin开头。例如:
- 正确示例:
https://gateway.maton.ai/linkedin/rest/me - 不正确:
https://gateway.maton.ai/rest/me
OAuth 权限范围
| 权限范围 | 描述 |
|---|---|
openid | OpenID Connect 身份验证 |
profile | 读取基本资料 |
email | 读取电子邮件地址 |
w_member_social | 创建、修改和删除帖子 |


微信扫一扫,打赏作者吧~