LinkedIn API 与托管 OAuth 集成。分享帖子、管理个人资料、投放广告以及访问 LinkedIn 功能。 当用户想要在 LinkedIn 上共享内容、管理广告活动、获取个人资料/组织信息或与 LinkedIn 平台交互时,请使用此技能。 对于其他第三方应用程序,请使用 api-gateway 技能 (https://clawhub.ai/byungkyu/api-gateway)。 需要网络访问和有效的 Maton API 密钥。
安装 / 下载方式
TotalClaw CLI推荐
totalclaw install totalclaw:byungkyu~linkedin-apicURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/totalclaw%3Abyungkyu~linkedin-api/file -o linkedin-api.mdGit 仓库获取源码
git clone https://github.com/openclaw/skills/commit/9a473f0de11bf4e90a05d52599aca32417b0f862## 概述(中文)
LinkedIn API 与托管 OAuth 集成。分享帖子、管理个人资料、投放广告以及访问 LinkedIn 功能。
当用户想要在 LinkedIn 上共享内容、管理广告活动、获取个人资料/组织信息或与 LinkedIn 平台交互时,请使用此技能。
对于其他第三方应用程序,请使用 api-gateway 技能 (https://clawhub.ai/byungkyu/api-gateway)。
需要网络访问和有效的 Maton API 密钥。
## 原文
# LinkedIn
Access the LinkedIn API with managed OAuth authentication. Share posts, manage advertising campaigns, retrieve profile and organization information, upload media, and access the Ad Library.
## Quick Start
```bash
# Get current user profile
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
```
## Base URL
```
https://gateway.maton.ai/linkedin/rest/{resource}
```
The gateway proxies requests to `api.linkedin.com` and automatically injects your OAuth token.
## Authentication
All requests require the Maton API key in the Authorization header:
```
Authorization: Bearer $MATON_API_KEY
```
**Environment Variable:** Set your API key as `MATON_API_KEY`:
```bash
export MATON_API_KEY="YOUR_API_KEY"
```
### Getting Your API Key
1. Sign in or create an account at [maton.ai](https://maton.ai)
2. Go to [maton.ai/settings](https://maton.ai/settings)
3. Copy your API key
### Required Headers
LinkedIn REST API requires the version header:
```
LinkedIn-Version: 202506
```
## Connection Management
Manage your LinkedIn OAuth connections at `https://ctrl.maton.ai`.
### List Connections
```bash
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
```
### Create Connection
```bash
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
```
### Get Connection
```bash
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
```
**Response:**
```json
{
"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": {}
}
}
```
Open the returned `url` in a browser to complete OAuth authorization.
### Delete Connection
```bash
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
```
### Specifying Connection
If you have multiple LinkedIn connections, specify which one to use with the `Maton-Connection` header:
```bash
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
```
If omitted, the gateway uses the default (oldest) active connection.
## API Reference
### Profile
#### Get Current User Profile
```bash
GET /linkedin/rest/me
LinkedIn-Version: 202506
```
**Example:**
```bash
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
```
**Response:**
```json
{
"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"
}
}
```
### Sharing Posts
#### Create a Text Post
```bash
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"
}
}
```
**Response:** `201 Created` with `x-restli-id` header containing the post URN.
#### Create an Article/URL Share
```bash
POST /linkedin/rest/posts
Content-Type: application/json
LinkedIn-Version: 202506
{
"author": "urn:li:person:{personId}",
"lifecycleState": "PUBLISHED",
"visibility": "PUBLIC",
"commentary": "Check out this great article!",
"distribution": {
"feedDistribution": "MAIN_FEED"
},
"content": {
"article": {
"source": "https://example.com/article",
"title": "Article Title",
"description": "Article description here"
}
}
}
```
#### Create an Image Post
First, initialize the image upload, then upload the image, then create the post.
**Step 1: Initialize Image Upload**
```bash
POST /linkedin/rest/images?action=initializeUpload
Content-Type: application/json
LinkedIn-Version: 202506
{
"initializeUploadRequest": {
"owner": "urn:li:person:{personId}"
}
}
```
**Response:**
```json
{
"value": {
"uploadUrlExpiresAt": 1770541529250,
"uploadUrl": "https://www.linkedin.com/dms-uploads/...",
"image": "urn:li:image:D4D10AQH4GJAjaFCkHQ"
}
}
```
**Step 2: Upload Image Binary**
```bash
PUT {uploadUrl from step 1}
Content-Type: image/png
{binary image data}
```
**Step 3: Create Image Post**
```bash
POST /linkedin/rest/posts
Content-Type: application/json
LinkedIn-Version: 202506
{
"author": "urn:li:person:{personId}",
"lifecycleState": "PUBLISHED",
"visibility": "PUBLIC",
"commentary": "Check out this image!",
"distribution": {
"feedDistribution": "MAIN_FEED"
},
"content": {
"media": {
"id": "urn:li:image:D4D10AQH4GJAjaFCkHQ",
"title": "Image Title"
}
}
}
```
### Visibility Options
| Value | Description |
|-------|-------------|
| `PUBLIC` | Viewable by anyone on LinkedIn |
| `CONNECTIONS` | Viewable by 1st-degree connections only |
### Share Media Categories
| Value | Description |
|-------|-------------|
| `NONE` | Text-only post |
| `ARTICLE` | URL/article share |
| `IMAGE` | Image post |
| `VIDEO` | Video post |
### Ad Library (Public Data)
The Ad Library API provides access to public advertising data on LinkedIn. These endpoints use the REST API with version headers.
#### Required Headers for Ad Library
```
LinkedIn-Version: 202506
```
#### Search Ads
```bash
GET /linkedin/rest/adLibrary?q=criteria&keyword={keyword}
```
Query parameters:
- `keyword` (string): Search ad content (multiple keywords use AND logic)
- `advertiser` (string): Search by advertiser name
- `countries` (array): Filter by ISO 3166-1 alpha-2 country codes
- `dateRange` (object): Filter by served dates
- `start` (intege