# Automate LinkedIn Posts with Images and Videos

LinkedIn has no native node in n8n. Make.com has a LinkedIn module, but it breaks often and lacks video support. The LinkedIn API itself requires a multi-step upload flow for images (register upload, binary PUT, then create post referencing the asset) and an even more complex flow for video. Users on both forums spend weeks debugging OAuth scopes, upload URLs, and undocumented error responses.

This is the platform that causes the most frustration in social media automation workflows. On the [n8n forum](https://community.n8n.io), multiple threads describe workflows that execute without errors but never publish the post. On [Make.com](https://community.make.com), users report the LinkedIn module silently failing after API changes.

Here is how to skip the LinkedIn API entirely and post text, images, and videos to LinkedIn with one API call.

## Why the LinkedIn API is painful

Posting an image to LinkedIn through their API requires four steps:

1. Register an upload with `POST /rest/images?action=initializeUpload`, providing your organization or person URN.
2. Upload the binary image data with a PUT request to the upload URL returned in step 1.
3. Create the post with `POST /rest/posts`, referencing the image asset URN from step 1.
4. Handle OAuth2 token refresh when your access token expires (every 60 days for most apps).

Video uploads are worse. LinkedIn requires chunked uploads for videos over 4MB, with a separate "finalize" step after all chunks are uploaded, followed by a processing wait before you create the post.

On n8n, users build this with 4-6 HTTP Request nodes chained together. On Make.com, users add custom HTTP modules because the native LinkedIn module does not support image or video uploads reliably.

If any step fails, debugging is difficult. LinkedIn returns vague error messages like `PERMISSION_DENIED` or `INVALID_MEDIA_UPLOAD` without specifying which permission or which upload step failed.

## The simpler approach: one API call

With the [Blotato Publish API](https://help.blotato.com/api/publish-post), posting to LinkedIn is one request. Pass image or video URLs directly -- no upload step, no binary PUT, no asset URNs.

### Text-only post

```json
{
  "post": {
    "accountId": "your-linkedin-account-id",
    "content": {
      "text": "Your LinkedIn post text here. Up to 3,000 characters.",
      "mediaUrls": [],
      "platform": "linkedin"
    },
    "target": {
      "targetType": "linkedin"
    }
  }
}
```

### Post with an image

```json
{
  "post": {
    "accountId": "your-linkedin-account-id",
    "content": {
      "text": "Here is our latest product update.",
      "mediaUrls": ["https://example.com/product-screenshot.jpg"],
      "platform": "linkedin"
    },
    "target": {
      "targetType": "linkedin"
    }
  }
}
```

### Post with a video

```json
{
  "post": {
    "accountId": "your-linkedin-account-id",
    "content": {
      "text": "Watch our 60-second product demo.",
      "mediaUrls": ["https://example.com/demo-video.mp4"],
      "platform": "linkedin"
    },
    "target": {
      "targetType": "linkedin"
    }
  }
}
```

### Post to a company page

Add `pageId` in the target object. Get your `pageId` by calling `GET /v2/users/me/accounts/{accountId}/subaccounts` ([docs](https://help.blotato.com/api/accounts)).

```json
{
  "post": {
    "accountId": "your-linkedin-account-id",
    "content": {
      "text": "Company announcement from our page.",
      "mediaUrls": ["https://example.com/announcement.jpg"],
      "platform": "linkedin"
    },
    "target": {
      "targetType": "linkedin",
      "pageId": "your-page-id"
    }
  }
}
```

## Step-by-step: n8n workflow

1. Install the [Blotato community node](https://help.blotato.com/api/n8n/n8n-blotato-node) in n8n (Settings > Community Nodes > search "Blotato").
2. Add a trigger node. Use Google Sheets, Airtable, a webhook, or a schedule.
3. Add a Blotato **Publish Post** node.
4. Set the platform to LinkedIn.
5. Pass your `accountId`. To find it, add a Blotato **List Accounts** node earlier in the workflow, or look it up in the [Blotato dashboard](https://my.blotato.com).
6. For company page posts, add a Blotato **List Subaccounts** node to get the `pageId`, and pass it in the target.
7. Set the `text` field with your post content.
8. Pass image or video URLs in the `mediaUrls` field. No upload step required.
9. Run the workflow.

For a full walkthrough, see: [n8n Post Everywhere](https://help.blotato.com/api/n8n/n8n-basics)

## Step-by-step: Make.com scenario

1. Add a trigger module (Google Sheets, Airtable, webhook).
2. Add an HTTP module:
   * Method: POST
   * URL: `https://backend.blotato.com/v2/posts`
   * Headers: `blotato-api-key: your-api-key`
   * Body type: JSON
   * Body: your post JSON with `platform` and `targetType` set to `"linkedin"`
3. Add a second HTTP module to poll `GET https://backend.blotato.com/v2/posts/{postSubmissionId}` for the publish status.
4. Run the scenario.

## LinkedIn-specific limits

| Content type  | Limit                                           |
| ------------- | ----------------------------------------------- |
| Text          | Up to 3,000 characters                          |
| Images        | JPG, PNG, GIF -- up to 5 MB                     |
| Video         | MP4 -- up to 500 MB, up to 30 minutes           |
| Aspect ratios | 16:9 (landscape), 9:16 (portrait), 1:1 (square) |

For full details, see: [LinkedIn Supported Posts and Media](https://help.blotato.com/platforms/linkedin/supported-posts-and-media)

## Scheduling LinkedIn posts

Add `scheduledTime` to queue a post for a specific time instead of publishing immediately:

```json
{
  "post": {
    "accountId": "your-linkedin-account-id",
    "content": {
      "text": "This posts next Tuesday at 9am EST.",
      "mediaUrls": [],
      "platform": "linkedin"
    },
    "target": {
      "targetType": "linkedin"
    }
  },
  "scheduledTime": "2026-04-07T09:00:00-04:00"
}
```

Or use `"useNextFreeSlot": true` to fill the next open slot in your content calendar. See [Build a Social Media Scheduler](https://help.blotato.com/blog/build-social-media-scheduler-n8n-make) for a full scheduling setup.

## Combining with AI content generation

Pair LinkedIn publishing with Blotato's [Source API](https://help.blotato.com/api/create-source) to repurpose content:

1. Feed a blog post URL into the Create Source endpoint with custom instructions: "Rewrite as a LinkedIn post with a hook, 3 key points, and a call to action."
2. Pass the extracted text into the Publish Post endpoint.
3. Schedule it for peak LinkedIn hours (Tuesday-Thursday, 8-10am in your audience's timezone).

See [Repurpose a URL into Social Media Posts](https://help.blotato.com/blog/repurpose-url-into-social-media-posts) for the full repurposing workflow.

## Forum threads referenced

These are the community discussions that prompted this post:

* [LinkedIn post automation is not posting but executing the workflow](https://community.n8n.io/t/linkedin-post-automation-is-not-posting-but-executing-the-workflow/221973) (n8n)
* [New Custom LinkedIn Node for n8n](https://community.n8n.io/t/new-custom-linkedin-node-for-n8n/218904) (n8n)
* [Template: Publish a LinkedIn Post using RapidAPI + n8n HTTP Request](https://community.n8n.io/t/template-publish-a-linkedin-post-using-rapidapi-n8n-http-request/221848) (n8n)
* [Posting automatically on social media with n8n and an API](https://community.n8n.io/t/posting-automatically-on-social-media-with-n8n-and-an-api/276334) (n8n)
* [Automate social media](https://community.make.com/t/automate-social-media/29135) (Make)
* [Automation for social media](https://community.make.com/t/automation-for-social-media/33577) (Make)
