LinkedIn

Connect your client's LinkedIn with a sign-in, and call its API through Operate As.

Connects by
Signing in with LinkedIn
Category
Marketing, Social and video
Services
2
Tools
10
ServiceKey
LinkedIn Adslinkedin-ads
LinkedInlinkedin

Connecting

Your client presses Connect on their link and approves on LinkedIn's own screen. Operate As never sees their password.

Check they're connected
curl https://api.operate.as/v1/me/clients \  -H "Authorization: Bearer $OPERATE_AS_API_KEY"
Response
[  {    "id": "6f1c2a7e-...",    "name": "Miller Dental",    "services": [      "linkedin-ads",      "linkedin"    ]  }]

Permissions

LinkedIn Ads

What the client readsPermission it asks for
See your ad accounts and campaignsr_ads
Create and change your campaigns and adsrw_ads
See how your ads performr_ads_reporting

LinkedIn

What the client readsPermission it asks for
Confirm who you areopenid
See your name and photoprofile
Post, comment and react as youw_member_social
See the company pages you manage, and their followers and statisticsrw_organization_admin
See your company pages' posts and commentsr_organization_social
Post and comment as your company pagesw_organization_social

Tools

LinkedIn Ads

Install LinkedIn Ads's typed package for your language:

pip install operate-as-linkedin-ads
Run linkedin-ads.get_ad_account
curl -X POST https://api.operate.as/v1/actions/linkedin-ads.get_ad_account \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {      "ad_account_id": "<ad_account_id>"    }  }'

Shows the required inputs. Every input, with its JSON Schema: GET /v1/actions/linkedin-ads.get_ad_account

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

LinkedIn

Install LinkedIn's typed package for your language:

pip install operate-as-linkedin
Run linkedin.create_post
curl -X POST https://api.operate.as/v1/actions/linkedin.create_post \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {}  }'

Every input, with its JSON Schema: GET /v1/actions/linkedin.create_post

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Pass-through

Paths continue from https://api.linkedin.com/rest. Your Operate As key goes in Authorization; the client's access is added for you.

See Pass-through requests for the full request and response format.

Call any endpoint
curl "https://api.operate.as/v1/clients/6f1c2a7e-.../linkedin-ads/adAccounts?q=search" \  -H "Authorization: Bearer $OPERATE_AS_API_KEY"
Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

When access ends

Operate As renews the sign-in before it runs out and checks it daily. If LinkedIn refuses to renew it, the service shows Expired, you're alerted, and your client reconnects from the same link.

See Keeping access alive and Removing access.

Calls answer
HTTP/1.1 409 ConflictContent-Type: application/json{  "detail": "Miller Dental's LinkedIn access ended. Send them their link to reconnect."}
Your webhook receives
{  "id": "evt_3f9a1c…",  "type": "connection.expired",  "createdAt": "2026-10-16T08:00:00+00:00",  "data": {    "clientId": "6f1c2a7e-...",    "clientName": "Miller Dental",    "provider": "linkedin",    "services": [      "linkedin-ads",      "linkedin"    ],    "reconnectUrl": "https://…"  }}