# OmniSocials LinkedIn Profile API

> Publish posts, PDF document carousels, polls and links to your personal profile, with the link in a first comment. Read what each post reached. One API key, on OmniSocials’ approved LinkedIn app.

This is the machine-readable version of [omnisocials.com/linkedin-profile-api](https://omnisocials.com/linkedin-profile-api), maintained for AI agents. Facts checked against the OmniSocials app and API on October 17, 2026. Platform reference: [docs.omnisocials.com/platforms/linkedin](https://docs.omnisocials.com/platforms/linkedin). API reference: [docs.omnisocials.com/api](https://docs.omnisocials.com/api).

## Basics

- Base URL: `https://api.omnisocials.com/v1`
- Auth: `Authorization: Bearer omsk_live_...`. One key belongs to one workspace. Keys are created in the app under Settings, API.
- Channel id in `accounts`: `linkedin`. The account connects inside the OmniSocials app, not through the API.
- Rate limit: 100 requests per minute per key. A 429 carries `Retry-After`.
- Responses use a `{ "data": ... }` envelope. Create returns `201`.
- Webhooks: `post.scheduled`, `post.published`, `post.failed`, `post.approved`, `post.rejected`, signed with HMAC-SHA256 in `X-OmniSocials-Signature`.

## Skip the LinkedIn app review

LinkedIn’s own API needs a developer app, the Community Management API approved, twelve scopes and a token refresh before day 60. Then come Development tier quotas and the upload steps for images, documents and video. OmniSocials already did that work.

- On your own: LinkedIn app, App review, Dev tier, Tokens, Versions, Uploads, Polling, PDFs, then the first post.
- Permissions your own app must get approved: `w_member_social`, `r_member_postAnalytics`, `r_member_profileAnalytics`, `r_organization_followers`, `w_member_social_feed`, `r_1st_connections_size`, `r_basicprofile`, `r_organization_social_feed`, `w_organization_social`, `r_organization_social`, `rw_organization_admin`, `w_organization_social_feed`.
- On OmniSocials: sign in, create an API key, POST. All 12 scopes already approved.

## Schedule a post

```bash
curl -X POST https://api.omnisocials.com/v1/posts/create \
  -H "Authorization: Bearer $OMNISOCIALS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "content": "SDKs in 8 languages. Docs in the first comment.",
  "accounts": ["linkedin"],
  "media_urls": ["https://cdn.example.com/sdks.jpg"],
  "schedule_at": "2026-10-22T18:00:00Z",
  "linkedin": {
    "first_comment": "https://omnisocials.com/sdk"
  }
}'
```

The answer (`201`, shortened):

```json
{
  "data": {
    "id": "1024",
    "status": "scheduled",
    "app_url": "https://app.omnisocials.com/create-post/1024"
  }
}
```

## Every format, one request

Text, an image, a video, a PDF document, a poll or a link card share one request shape. Add media URLs, a poll or a link and a time. OmniSocials checks the post against LinkedIn’s rules before it uploads.

- **Posts and first comments.** Text with an image or a video. Put the link in a first comment, posted as you right after the post goes live. (`media_urls`, `linkedin.first_comment`)
- **Documents.** Two or more images go out as a swipeable PDF document. A PDF you send goes out as the original file. (`media_urls`, `linkedin.document_source`)
- **Polls.** A question, 2 to 4 options and a duration from 1 day to 2 weeks. A poll can’t carry media or a link card. (`linkedin_poll`)

### Post

```json
{
  "content": "SDKs in 8 languages. Docs in the first comment.",
  "accounts": ["linkedin"],
  "media_urls": ["https://cdn.example.com/sdks.jpg"],
  "schedule_at": "2026-10-22T18:00:00Z",
  "linkedin": {
    "first_comment": "https://omnisocials.com/sdk"
  }
}
```

### Document

```json
{
  "content": "Best times to post, from your own posts.",
  "accounts": ["linkedin"],
  "media_urls": [
    "https://cdn.example.com/best-times-1.jpg",
    "https://cdn.example.com/best-times-2.jpg"
  ],
  "schedule_at": "2026-10-23T09:00:00Z"
}
```

### Poll

```json
{
  "content": "Quick question for founders.",
  "accounts": ["linkedin"],
  "schedule_at": "2026-10-25T10:00:00Z",
  "linkedin_poll": {
    "linkedin": {
      "question": "How often do you post on LinkedIn?",
      "options": ["Daily", "Weekly", "Less often"],
      "duration": "SEVEN_DAYS"
    }
  }
}
```

### Link

```json
{
  "content": "What's new: https://omnisocials.com/changelog",
  "accounts": ["linkedin"],
  "link_url": "https://omnisocials.com/changelog",
  "schedule_at": "2026-10-22T11:00:00Z"
}
```

## Document carousels, without the PDF work

LinkedIn has no image carousel. Send two or more images and OmniSocials builds the swipeable PDF document. Send a PDF and LinkedIn gets the original file. Or post the images as a gallery.

`POST /v1/posts/create`:

```json
{
  "content": "Sidebar update: a new Home tab, and more.",
  "accounts": ["linkedin"],
  "media_urls": ["https://cdn.example.com/sidebar.pdf"],
  "schedule_at": "2026-10-24T09:00:00Z",
  "linkedin": {
    "document_source": "original_pdf"
  }
}
```

The answer:

```json
{
  "content": "Sidebar update: a new Home tab, and more.",
  "accounts": ["linkedin"],
  "media_urls": ["https://cdn.example.com/sidebar.pdf"],
  "schedule_at": "2026-10-24T09:00:00Z",
  "linkedin": {
    "document_source": "slides"
  }
}
```

The answer:

```json
{
  "content": "Sidebar update: a new Home tab, and more.",
  "accounts": ["linkedin"],
  "media_urls": ["https://cdn.example.com/sidebar.pdf"],
  "schedule_at": "2026-10-24T09:00:00Z",
  "linkedin": {
    "carousel_as_images": true
  }
}
```

- **Original PDF.** Send a PDF URL and LinkedIn gets the file itself, with sharp text, working links and up to 300 pages. Other channels get its pages as images. (`media_urls`, `linkedin.document_source`)
- **Document carousel.** Two or more images become one swipeable PDF document, titled with the caption’s first line. For a PDF, slides rebuilds it from the page images. (`document_source: "slides"`)
- **Image gallery.** Prefer LinkedIn’s classic multi-image post? Set carousel_as_images and the images go out as a gallery instead. (`carousel_as_images: true`)

## Connect your profile once, post from code

Sign in with LinkedIn once inside OmniSocials. Create an API key, and your code posts and reports for your profile.

- **LinkedIn sign-in.** Sign in with LinkedIn and your profile connects, no picker. Your Company Page is a channel of its own.
- **A key per workspace.** A key only reaches its own workspace. Each workspace connects one personal profile.
- **What the profile can post.** The accounts call lists the profile with the formats it takes, and says when it needs a reconnect. (`GET /v1/accounts`, `content_types`)

`GET /v1/accounts?platform=linkedin` answers:

```json
{
  "data": [
    {
      "id": "4127_linkedin",
      "platform": "linkedin",
      "display_name": "Robert Ligthart",
      "content_types": ["post"],
      "status": "active"
    }
  ],
  "workspace_name": "OmniSocials"
}
```

## Read what LinkedIn reports

Impressions, members reached, reactions by type, comments, reposts, saves, sends and link clicks per post. The API returns the same numbers the app charts.

- **Per post.** Impressions, reach, reactions by type, comments, shares, saves, sends, link clicks, follows and profile visits. Videos add views and watch time. (`/analytics/posts/:id`)
- **Per profile and workspace.** The profile’s followers and its daily impressions, likes, comments and shares. Plus a workspace overview. (`/analytics/accounts`, `/analytics/overview`)
- **Best times to post.** Days and hours worked out from your own LinkedIn history, once 15 of your posts are analyzed. (`/analytics/best-times`)

`GET /v1/analytics/posts/1019` answers:

```json
{
  "data": {
    "post_id": "1019",
    "platforms": {
      "linkedin": {
        "metrics": {
          "impressions": 1284, "reach": 917,
          "likes": 41, "comments": 7,
          "shares": 3, "saves": 9, "sends": 4,
          "clicks": 18, "link_clicks": 18,
          "follows": 2, "profile_visits": 23,
          "reactions": {
            "like": 31, "praise": 6,
            "empathy": 2, "interest": 2
          }
        }
      }
    }
  }
}
```

## LinkedIn’s rules, in one place

OmniSocials checks every post against them before it reaches LinkedIn, so a bad file fails in your request, not at publish time.

| Limit | Value |
| --- | --- |
| Text | 3,000 characters |
| First comment | 1,250 characters |
| Images | JPEG, PNG, GIF or WebP, up to 10 MB each |
| Media | Images or one video per post, not both |
| PDF documents | The original file up to 100 MB, 300 pages |
| Video | MP4 or MOV, up to 30 minutes |
| Poll | A 140-character question, 2 to 4 options of 30 |
| Poll length | 1 day, 3 days, 1 week or 2 weeks |
| Rate limit | 100 requests a minute per API key |
| Accounts | One personal profile per workspace |

## Your first LinkedIn post in three steps

About five minutes from sign-up to a scheduled post on your profile. Then hand the key to your coding agent.

1. **Create an API key** (`Settings › API`). Start your trial, open Settings, API and create a key. It is shown once.
2. **Connect your profile** (`GET /v1/accounts`). Sign in with LinkedIn in OmniSocials once. Then list the profile from your code.
3. **Send your first post** (`POST /v1/posts/create`). Post now with create-and-publish, or add schedule_at to plan it.

## FAQ

### Do I need my own LinkedIn app or an app review?

No. Your profile connects through OmniSocials’ LinkedIn app, which has the Community Management API approved. You call the OmniSocials API with an API key and never handle LinkedIn tokens.

### Does the post show as me or as my company?

As you. A linkedin post and its first comment publish from your personal profile. To post as your company, connect your Company Page: it is its own channel, linkedin_page, and takes the same request.

### Which formats can I publish?

Text, one image, one video, two or more images as a swipeable PDF document or a gallery, a PDF as the original file, a poll and a link card. A post takes images or one video, not both, and a poll can’t carry media or a link card. LinkedIn articles aren’t supported.

### How does the first comment work?

Set linkedin.first_comment, up to 1,250 characters. It posts as you right after the post goes live, which keeps the link out of the post text: LinkedIn shows posts with a link in the text to fewer people. GET /v1/posts/:id returns first_comment_result once it ran.

### Can I @mention people or companies?

In the OmniSocials composer, yes: companies, and people who follow a Page you admin. The API has no mentions field, so a request posts the text as written.

### Can I read and answer comments on my profile posts?

No. LinkedIn’s API gives apps no access to comments on personal profile posts, so the Social Inbox covers LinkedIn Pages only. Connect your Company Page to answer its comments and mentions from the API.

### Do LinkedIn tokens expire?

LinkedIn access tokens last 60 days. OmniSocials refreshes them on its own from 14 days before they run out, with LinkedIn’s refresh token, which lasts a year. If a reconnect is ever needed, GET /v1/accounts says so with needs_reconnect.

### How fresh are the profile’s numbers?

OmniSocials checks a recent profile post every 6 hours, older posts less often, to stay inside LinkedIn’s quotas. A number LinkedIn doesn’t return is left out, never sent as 0.

### Can I post to my profile and my Company Page in one request?

Yes. Put both in accounts. content takes one text for both or a text per channel, the linkedin and linkedin_page objects carry each one’s first comment and carousel style, and linkedin_poll takes a poll per channel.

### What happens when a LinkedIn post fails to publish?

A temporary error is retried up to 3 times, 15 minutes apart, and a post that already went live is never sent again. Then post.published or post.failed fires on your webhook, signed with HMAC-SHA256.

### Does LinkedIn have an API, and is it free?

Yes. LinkedIn doesn’t charge for API calls, but posting through its API needs a developer app with the Community Management API approved. Through OmniSocials you post on its approved app, and the API is part of the plan, $10 per seat per month billed annually.

### What are the rate limits?

100 requests a minute per API key. Past that the API answers 429 with a Retry-After header that says when to try again.

### How much does OmniSocials cost?

One plan with every feature included: $10 per seat per month billed annually, or $12 billed monthly. Team members and client seats cost the same. Every account starts with a 14-day free trial.

The REST API, the SDKs, the CLI, webhooks and the MCP server are part of that one plan.

## Pricing

From $10 per seat a month, API included. 14-day free trial.

## Related

- [LinkedIn Profile scheduler](https://omnisocials.com/linkedin-profile.md)
- [LinkedIn Profile MCP server](https://omnisocials.com/linkedin-profile-mcp.md)
- [All channels](https://omnisocials.com/channels.md)
- [LinkedIn character limits](https://omnisocials.com/linkedin-character-limits)
- [LinkedIn video lengths](https://omnisocials.com/linkedin-video-lengths)

## Links

- Page: https://omnisocials.com/linkedin-profile-api
- LinkedIn Profile platform docs: https://docs.omnisocials.com/platforms/linkedin
- API reference: https://docs.omnisocials.com/api
- REST API overview: https://omnisocials.com/api.md
- MCP server: https://omnisocials.com/mcp.md
- Sign up: https://app.omnisocials.com/signup
