LinkedIn API

The LinkedIn API without partner program gating

LinkedIn's Marketing API requires a formal partner program application, a 500-member organization requirement, and weeks of review. Aether is already approved — connect your Company Page and post in under 15 minutes.

Post to LinkedIn in under 15 minutes

One call for text posts, images, and scheduled content. Aether handles token management, content type validation, and retry logic.

Node.js / TypeScript
import Aether from "aether";

const aether = new Aether({ apiKey: process.env.AETHER_API_KEY });

// Post to a LinkedIn Company Page
const post = await aether.posts.create({
  text: "We just crossed 1,000 developers on Aether 🚀\n\nHere's what we learned building the API layer for social media...",
  profileIds: ["li_company789"],
  overrides: {
    linkedin: { visibility: "PUBLIC" },
  },
  scheduledFor: "2026-06-15T08:00:00Z",
});

// Post with an image
const imagePost = await aether.posts.create({
  text: "Behind the scenes of our engineering team 📸",
  profileIds: ["li_company789"],
  mediaUrls: ["https://your-cdn.com/team-photo.jpg"],
  overrides: {
    linkedin: { visibility: "PUBLIC" },
  },
});

Free tier · 3 accounts · no credit card

Get your free API key

The same call in Python and cURL

Python
import os
import aether

client = aether.Aether(api_key=os.environ["AETHER_API_KEY"])

# Post to a LinkedIn Company Page
post = client.posts.create(
    text="We just crossed 1,000 developers on Aether 🚀\n\nHere's what we learned...",
    profile_ids=["li_company789"],
    overrides={"linkedin": {"visibility": "PUBLIC"}},
    scheduled_for="2026-06-15T08:00:00Z",
)

# Post with an image
image_post = client.posts.create(
    text="Behind the scenes of our engineering team 📸",
    profile_ids=["li_company789"],
    media_urls=["https://your-cdn.com/team-photo.jpg"],
    overrides={"linkedin": {"visibility": "PUBLIC"}},
)
cURL
curl -X POST https://api.aetherhq.dev/v1/posts \
  -H "Authorization: Bearer $AETHER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "We just crossed 1,000 developers on Aether 🚀",
    "profileIds": ["li_company789"],
    "scheduledFor": "2026-06-15T08:00:00Z",
    "overrides": {
      "linkedin": { "visibility": "PUBLIC" }
    }
  }'

The actual API response

Aether returns a normalized post object immediately. Once published, publishResults includes the LinkedIn UGC post ID and publish timestamp.

JSON
{
  "success": true,
  "data": {
    "id": "post_4n6oq1z",
    "status": "scheduled",
    "text": "We just crossed 1,000 developers on Aether 🚀",
    "profileIds": ["li_company789"],
    "mediaUrls": [],
    "mediaKeys": [],
    "scheduledFor": "2026-06-15T08:00:00.000Z",
    "publishResults": [],
    "publishedAt": null,
    "failedAt": null,
    "createdAt": "2026-06-08T14:23:11.000Z"
  }
}

LinkedIn OAuth — without the partner program

Getting direct LinkedIn Marketing API access means: applying for the partner program with a 500-member org, waiting for LinkedIn to review your application, then managing OAuth 2.0 token refresh every 60 days.

Aether's Connect Link removes all of that. Call one endpoint, get a URL, send it to your user. They click, LinkedIn authenticates them, and their Page or profile appears in your dashboard automatically.

TypeScript
// Generate a Connect Link for your user to authenticate LinkedIn
const link = await aether.connectLinks.create({
  platform: "linkedin",
  redirectUrl: "https://yourapp.com/settings/social",
});

// Send link.url to your user — they click, authorize on LinkedIn,
// and the Company Page or profile appears in your dashboard automatically.
// No LinkedIn partner program setup needed on your end.
console.log(link.url);      // "https://connect.aetherhq.dev/link/cl_li9q4r..."
console.log(link.expiresAt); // "2026-06-15T14:23:11.000Z"

Everything the LinkedIn API gives you

No partner program needed

LinkedIn's Marketing API requires partner program approval with a 500-member org requirement. Aether holds the platform approvals — connect your Page instantly.

Pages and personal profiles

Post on behalf of Company Pages and personal profiles. Each account is a separate connected profile — manage multiple organizations and team members.

All content types

Text posts, images, native videos, documents (PDF as document posts), articles, and polls. Each type has its own optional fields via the overrides object.

Articles and long-form

Publish LinkedIn Articles with title, body, and cover image. Long-form content with full markdown support — ideal for thought leadership content pipelines.

Scheduling

Pass scheduledFor and Aether queues the post for the right time. Works across all LinkedIn content types, including articles and native videos.

Automatic token refresh

LinkedIn access tokens expire after 60 days. Aether tracks expiry per account and refreshes before they lapse — no manual re-auth logic needed.

Analytics

Impressions, clicks, engagement rate, follower gains, and demographic breakdowns per Company Page post. Powered by Tinybird for sub-second queries.

MCP / AI agents

Every LinkedIn endpoint is an MCP tool. Claude, Cursor, and any MCP-compatible agent can draft, schedule, and monitor LinkedIn posts natively.

Why not build directly on the LinkedIn Marketing API?

The LinkedIn Marketing API is powerful but gated. Here is what you take on when building directly versus using Aether.

FeatureAetherLinkedIn API directly
Partner accessNo approval needed — Aether is pre-approvedLinkedIn Marketing Partner application required
Token refreshAutomatic before 60-day expiryManual refresh every 60 days
AuthenticationOne API keyOAuth 2.0 + organization URN management
Content typesPosts, articles, images, videos, documentsVaries by approval tier
API maintenanceWe absorb all breaking changesYour team's responsibility
Platform complianceOfficial API, fully compliantOfficial API, fully compliant

LinkedIn API rate limits

Platform-level limits set by LinkedIn. Aether queues and retries automatically — your integration does not need backoff logic.

OperationLimitHTTP statusNote
Member share150 requests / day429Per member access token
Organization post100 posts / day429Per org token
API calls500 calls / day / app429Across all endpoints
Token expiry60 days401Aether auto-refreshes
Video upload5 GB max / 10 min400MP4 / H.264
Text post length3,000 characters422UTF-8

LinkedIn API error codes reference

StatusMeaningHow Aether handles it
401Invalid or expired access tokenAether auto-refreshes — reconnect via Connect Link if it persists
403Operation not permitted for this member/orgRe-connect via Connect Link to re-request permissions
422Content policy violationReview post content for LinkedIn community standards violations
429Rate limit exceededAether queues and retries after the window resets
400Invalid request payload or fieldAether validates the request; check input fields and content type
404Organization or member not foundVerify profileId is correct and account is still connected

AI-Native

Let your AI agent post to LinkedIn

Aether ships an MCP server that exposes every LinkedIn endpoint as a callable tool. Claude Desktop, Cursor, Windsurf, and any MCP-compatible agent can draft, schedule, and pull analytics — with no additional integration code.

Claude Desktop config
# Add to ~/.claude/claude_desktop_config.json
{
  "mcpServers": {
    "aether": {
      "command": "npx",
      "args": ["-y", "aether-mcp"],
      "env": { "AETHER_API_KEY": "sk_live_..." }
    }
  }
}

# Claude can now post to LinkedIn:
# "Draft and schedule a LinkedIn post about our Q2 results for Monday 9am"
# "What's our LinkedIn engagement rate this month?"
# "Post our latest case study to the company page now"

Frequently asked questions

Do I need LinkedIn Marketing API partner access?+

No. Aether holds the necessary platform approvals. You connect your LinkedIn Company Page through our connect link flow and start posting immediately — no separate LinkedIn developer application required.

Can I post on behalf of a personal LinkedIn profile?+

Yes. Both Company Pages and personal profiles are supported. Personal profile posting uses the same connect link flow — the profile owner authorizes access, and you can post on their behalf programmatically.

How long do LinkedIn OAuth tokens last?+

LinkedIn access tokens expire after 60 days. Aether tracks expiry for every connected account and automatically initiates refresh before they lapse. If manual re-auth is ever needed, we fire a webhook so you can prompt the user.

Can I post LinkedIn Articles through the API?+

Yes. Use contentType: 'article' in the overrides object. You can also post rich media posts, documents (PDFs as native document posts), and native videos. Each content type has its own set of optional fields.

Is LinkedIn posting suitable for AI agent workflows?+

LinkedIn is one of the best platforms for AI-assisted content publishing. Aether's MCP server exposes LinkedIn posting as a callable tool, so Claude can draft, schedule, and monitor LinkedIn posts in a single agent workflow.

Ready to ship your LinkedIn integration?

Free tier · 3 accounts · full API access · MCP server · no credit card.

Get your free API key →