<!-- BusyBot node reference — https://busybot.net/tools/linkedin/ -->

> Node: LinkedIn (`linkedin`) · Action (binary) · v1
> Category: Marketing · Credentials: LinkedIn OAuth2 (`linkedInOAuth2`)
> Updated: 2026-08-16

# LinkedIn

> Create posts on LinkedIn with text, images, or article links

## Overview

Publishes posts to LinkedIn through the LinkedIn REST API, either as yourself or on behalf of an organization you administer. Three kinds of post are supported: text only, an article share built from a link with an optional custom thumbnail, and an image post where the picture is taken from the item's binary data and uploaded before the post is created. Personal posts can choose their visibility; organization posts are always public.

**Category:** Marketing  
**Tool Name:** `linkedin`  
**Version:** 1

**Appearance:** Icon: `lucide-Briefcase` | Color: `#0A66C2`

## Node Type

**Action (Binary)** — handles file/binary data operations

## Input / Output

| Direction | Port(s) |
|-----------|--------|
| Input | `Input` |
| Output | `Output`, `Error` |

## Credentials

This tool requires **LinkedIn OAuth2** credentials.
See the [Credentials Guide](https://busybot.net/credentials/linked-in-oauth2/) for setup instructions.

### Resources

| Resource | Value |
|----------|-------|
| Post | `post` |

### Operations

| Operation | Value | Description |
|-----------|-------|-------------|
| Create | `create` | Create a new post |

### Parameters

#### Post: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Post As | `options` | No | `person` | Whether to post on behalf of a person or an organization. |
| | | | | Options: `person`, `organization` |
| Person | `string` | Yes | — | Person ID to post as. This is the user ID from your LinkedIn profile URN (e.g., the value after urn:li:person:). You can find this via the LinkedIn /v2/userinfo or /v2/me endpoint. _(shown when Post As is `person`)_ |
| Organization URN | `string` | Yes | — | The numeric ID of the organization to post as (from the organization page URL). _(shown when Post As is `organization`)_ |
| Text | `string` | Yes | — | The primary content of the post. Special characters for LinkedIn little-text format will be auto-escaped. Supports expressions like {{ $json.message }}. |
| Media Category | `options` | No | `NONE` | The type of media to include in the post. |
| | | | | Options: `NONE` (text-only post without media), `ARTICLE` (post contains an article URL link), `IMAGE` (post contains an uploaded image) |
| Input Binary Field | `string` | Yes | `data` | Name of the binary property containing the image to upload. Names are case-sensitive — see the upstream node's Binary Data panel for the exact names to use. _(shown when Media Category is `IMAGE`)_ |
| Additional Fields | `collection` | No | `{}` | Optional extras for article and image posts, and visibility for personal posts. |
| — Description | `string` | No | — | Short description for the article. _(shown when Media Category is `ARTICLE`)_ |
| — Original URL | `string` | No | — | URL of the article to share. _(shown when Media Category is `ARTICLE`)_ |
| — Thumbnail Binary Field | `string` | No | `data` | Name of the binary property containing the thumbnail image for the article. _(shown when Media Category is `ARTICLE`)_ |
| — Title | `string` | No | — | Title for the image or article. _(shown when Media Category is `ARTICLE`, `IMAGE`)_ |
| — Visibility | `options` | No | `PUBLIC` | Post visibility. Only applicable when posting as a person. _(shown when Post As is `person`)_ |
| | | | | Options: `CONNECTIONS`, `PUBLIC` |

#### All Operations

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| LinkedIn Account | `credential` | No | — | Connect your LinkedIn account via OAuth2. |
| Max Concurrency | `number` | No | `5` | Maximum number of items to process concurrently. LinkedIn has strict rate limits, so keep this low. |

## Output Data

One output item per input item — this node never fans out. The result is **merged onto the input item JSON**: the API response is spread over the item, then `postAs` and `shareMediaCategory` are added so a downstream node can tell what kind of post was made without re-reading the node's configuration. Binary on the input item is forwarded unchanged, and the node creates no new binary — an image or thumbnail is read from the item and uploaded, not written back.

A successful create returns the new post's identifier on `urn`, so a typical output item looks like:

```json
{
  "urn": "urn:li:share:7212345678901234567",
  "postAs": "person",
  "shareMediaCategory": "IMAGE"
}
```

alongside every field the input item already carried. Reference it downstream by expression, e.g. `{{ $json.urn }}`.

An item that reaches the node with a resource/operation combination the tool does not implement is passed straight through with a `_warning` field explaining why, rather than being failed.

## Usage Examples

- Create a text-only LinkedIn post
- Post an image to LinkedIn with a caption
- Share an article link on LinkedIn with a thumbnail
- Post on behalf of a LinkedIn organization

## Example Configuration

Publish a text-only post as yourself, visible to everyone:

```json
{
  "type": "linkedin",
  "parameters": {
    "resource": "post",
    "operation": "create",
    "postAs": "person",
    "person": "{{ $json.personId }}",
    "text": "{{ $json.message }}",
    "shareMediaCategory": "NONE",
    "additionalFields": {
      "visibility": "PUBLIC"
    }
  }
}
```

Share an article with a title and description, limited to your connections:

```json
{
  "type": "linkedin",
  "parameters": {
    "resource": "post",
    "operation": "create",
    "postAs": "person",
    "person": "AbC123dEf4",
    "text": "Worth a read — our take on {{ $json.topic }}.",
    "shareMediaCategory": "ARTICLE",
    "additionalFields": {
      "originalUrl": "{{ $json.url }}",
      "title": "{{ $json.title }}",
      "description": "{{ $json.summary }}",
      "visibility": "CONNECTIONS"
    }
  }
}
```

Post an image that an upstream node placed on the `teamPhoto` binary property:

```json
{
  "type": "linkedin",
  "parameters": {
    "resource": "post",
    "operation": "create",
    "postAs": "person",
    "person": "AbC123dEf4",
    "text": "{{ $json.caption }}",
    "shareMediaCategory": "IMAGE",
    "binaryPropertyName": "teamPhoto",
    "additionalFields": {
      "title": "{{ $json.title }}"
    }
  }
}
```

Announce something as a company page:

```json
{
  "type": "linkedin",
  "parameters": {
    "resource": "post",
    "operation": "create",
    "postAs": "organization",
    "organization": "1234567",
    "text": "{{ $json.announcement }}",
    "shareMediaCategory": "NONE",
    "maxConcurrency": 2
  }
}
```

### Error Handling

| Mode | Behavior |
|------|----------|
| **stop** | Halts workflow on first error |
| **continue** | Skips failed items, passes successful ones through |
| **errorPort** | Routes failed items to Error output port |

## Tips

Create LinkedIn posts with text, images (3-step binary upload), or article links as a person or organization.

### Notes

- **Media Category decides which extras apply.** With `NONE`, the article and image fields are ignored. With `ARTICLE`, set **Original URL** — the post is a link share, and Title, Description and Thumbnail Binary Field decorate it. With `IMAGE`, the picture named in **Input Binary Field** is uploaded first and then attached to the post.
- **Visibility applies to personal posts only.** Organization posts are always public, so setting Visibility alongside `Post As: organization` has no effect.
- **Person is an ID, not a URL.** Use the value that follows `urn:li:person:` for your profile. The organization field takes the numeric ID from the company page URL.
- **Images have a size ceiling.** A file larger than roughly 36 MB is rejected before upload rather than being sent and refused by LinkedIn.
- **Keep Max Concurrency low.** LinkedIn rate-limits aggressively; the node backs off and retries when it is throttled, but a high concurrency simply spends that budget faster. The default of 5 is already conservative — lower it for large batches.
- **A post cannot be edited or deleted from this node.** It creates posts only; keep the returned `urn` if you need a record of what was published.