tutorials

n8n Social Media Automation with OmniSocials

Robert Ligthart
April 21, 202612 min read
n8n Social Media Automation with OmniSocials

Building an n8n workflow that posts to social media sounds simple until you realize each platform has its own OAuth flow, its own rate limits, and its own idea of what a valid API request looks like.

Instagram requires a Facebook Business Manager account, a Meta app, an approved permissions review, and at minimum three separate API calls to publish a single photo. LinkedIn uses a different auth model entirely. TikTok requires a separate developer registration and has its own app approval process. By the time you have all of that wired up in n8n, you have a workflow that is brittle, hard to maintain, and breaks every time a platform changes its API.

The OmniSocials API solves this. One endpoint, one API key, 11 platforms. You connect your social accounts once in the OmniSocials dashboard. After that, every post goes through a single POST /v1/posts request from your n8n workflow. That is the integration this tutorial covers.

What is n8n social media automation?

n8n social media automation is the practice of using n8n's workflow engine to trigger, prepare, and publish social content programmatically. Instead of manually posting each piece of content, you build a workflow that handles everything: pulling content from a CMS, formatting it per platform, publishing through an API, and logging the result. With the OmniSocials API, a single HTTP Request node covers all 11 platforms in one step.

[Screenshot: n8n workflow with Schedule Trigger → HTTP Request (OmniSocials) → IF node for error handling]

Step 1: Get Your OmniSocials API Key

Log into your OmniSocials dashboard and navigate to Settings > API. Click "Generate API Key" and copy the key immediately. You won't be able to view it again after closing the modal.

If you do not have an account yet, the 14-day free trial includes full API access. No credit card required.

Keep the key in n8n's credential store, not hardcoded in a node. In n8n, create a new Header Auth credential:

  • Name: Authorization
  • Value: Bearer YOUR_API_KEY

This credential will be reused across every OmniSocials HTTP Request node in your workflows.

Step 2: Set Up the HTTP Request Node

In your n8n workflow, add an HTTP Request node and configure it as follows:

Method: POST URL: https://api.omnisocials.com/v1/posts Authentication: Header Auth (select the credential you created above) Body Content Type: JSON

Set the body to:

{
  "text": "{{ $json.caption }}",
  "platforms": ["instagram", "linkedin", "bluesky"],
  "scheduled_at": "{{ $json.publish_time }}"
}

The text and scheduled_at fields are mapped from upstream nodes (a CMS trigger, a spreadsheet row, a form submission, anything). The platforms array is where you list every platform you want the post to reach. You can hardcode it or make it dynamic based on workflow input.

Omit scheduled_at if you want to publish immediately. OmniSocials will push the post live as soon as it processes the request.

[Screenshot: n8n HTTP Request node configured with OmniSocials endpoint and JSON body]

Step 3: Add Media (Optional)

If your workflow includes images or videos, upload the file to OmniSocials first using the /v1/media/upload endpoint. The response gives you a media URL you pass into the post body.

Add a second HTTP Request node before your post node:

Method: POST URL: https://api.omnisocials.com/v1/media/upload Body Content Type: Form Data Field: file pointing to your binary input

The response looks like:

{
  "data": {
    "url": "https://cdn.omnisocials.com/media/abc123.jpg",
    "media_id": "media_abc123"
  }
}

Pass {{ $json.data.url }} into the media array of your post request:

{
  "text": "{{ $json.caption }}",
  "media": ["{{ $node['Upload Media'].json.data.url }}"],
  "platforms": ["instagram", "tiktok", "facebook"]
}

OmniSocials automatically resizes and reformats the media to meet each platform's specifications. You upload once.

Step 4: Handle the Response

A successful post request returns HTTP 200 with a body like:

{
  "data": {
    "id": "post_abc123",
    "status": "scheduled",
    "platforms": {
      "instagram": "queued",
      "linkedin": "queued",
      "bluesky": "queued"
    }
  }
}

Add an IF node after the HTTP Request node. Set the condition: {{ $json.data.status }} equals scheduled (or published for immediate posts). Route the true branch to a success handler (log to Airtable, send a Slack message, update a spreadsheet row). Route the false branch to an error handler.

For more granular error handling, check the per-platform status inside data.platforms. A post can succeed on LinkedIn but fail on Instagram if the connected account has expired credentials. Catching this at the platform level lets you alert the right person.

A Complete n8n Workflow Example

Here is the full workflow structure for a content pipeline that reads from a Google Sheet and publishes on a schedule:

Schedule Trigger (every weekday at 9am UTC)
  → Google Sheets (read next unpublished row)
  → IF node (check if row exists)
    → TRUE: HTTP Request (OmniSocials /v1/posts)
      → IF node (check response status)
        → SUCCESS: Google Sheets (mark row as published)
        → FAILURE: Slack (alert team)
    → FALSE: No operation (workflow ends)

The OmniSocials HTTP Request node in this workflow sends:

{
  "text": "{{ $json['Caption'] }}",
  "media": ["{{ $json['Image URL'] }}"],
  "platforms": ["instagram", "linkedin", "twitter", "bluesky"],
  "scheduled_at": "{{ $json['Publish Time'] }}"
}

Five nodes. Eleven platforms. That is the whole integration.

For comparison: building this workflow with native platform APIs would require separate credential stores, separate HTTP Request nodes, and separate error handling for Instagram, LinkedIn, Twitter, and Bluesky individually. The OmniSocials approach cuts that to a single node and a single credential.

JavaScript and Python Reference

If you are using n8n's Code node to build the request dynamically, here are reference implementations:

JavaScript (n8n Code node)

const caption = $input.first().json.caption;
const publishTime = $input.first().json.publish_time;
const imageUrl = $input.first().json.image_url;

const response = await fetch('https://api.omnisocials.com/v1/posts', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${$env.OMNISOCIALS_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    text: caption,
    media: imageUrl ? [imageUrl] : [],
    platforms: ['instagram', 'linkedin', 'bluesky', 'twitter'],
    scheduled_at: publishTime,
  }),
});

const { data } = await response.json();
return [{ json: data }];

Python (for n8n self-hosted with Python nodes or external scripts)

import requests
import os

def publish_post(caption, platforms, image_url=None, scheduled_at=None):
    payload = {
        'text': caption,
        'platforms': platforms,
    }
    if image_url:
        payload['media'] = [image_url]
    if scheduled_at:
        payload['scheduled_at'] = scheduled_at

    response = requests.post(
        'https://api.omnisocials.com/v1/posts',
        headers={'Authorization': f"Bearer {os.environ['OMNISOCIALS_API_KEY']}"},
        json=payload
    )
    response.raise_for_status()
    return response.json()['data']

The full API reference is at docs.omnisocials.com.

Common Pitfalls

Hardcoding the API key in the node body. Always use n8n's credential store or environment variables. Keys embedded in workflow JSON get exported accidentally and are visible to anyone with workflow view access.

Using scheduled_at in local time. The OmniSocials API expects UTC. If your n8n instance or data source is in a local timezone, convert before passing the value. new Date(localTime).toISOString() handles this in the Code node.

Posting to platforms with disconnected accounts. If a connected account's OAuth token has expired, OmniSocials returns a 200 with a platform-level error (e.g., "instagram": "auth_error"). The overall request succeeds but that platform is skipped. Check per-platform status in your IF node, not just the top-level status.

Not handling rate limits. The OmniSocials API allows 100 requests per minute per API key. If you are running a bulk content pipeline, add a Wait node between batches or use the bulk endpoint to send multiple posts in a single request.

Skipping the media upload step. You cannot pass an arbitrary public image URL directly in the media field in all cases. For best results, upload via /v1/media/upload first. This also lets OmniSocials validate and reformat the file before it hits each platform.

Frequently Asked Questions

Does n8n have a built-in social media node?

n8n has native nodes for Twitter/X and a few other platforms, but coverage is limited and each requires its own OAuth setup. Using the OmniSocials API via an HTTP Request node gives you 11 platforms from a single, consistent integration that takes about 5 minutes to configure.

Can I use n8n to schedule social media posts?

Yes. Combine n8n's Schedule Trigger node with an HTTP Request node pointing to the OmniSocials API. Pass a scheduled_at timestamp in the request body to queue the post for a future time. OmniSocials handles the actual delivery at the specified UTC time.

Is the OmniSocials API free to use?

API access is included in every OmniSocials plan, which starts at $10/mo (annual). There is no separate API pricing tier. The 14-day free trial also includes API access, so you can test the n8n integration before paying anything.

What social platforms can I post to through the OmniSocials API?

The OmniSocials API supports Instagram, Facebook, LinkedIn, YouTube, TikTok, X (Twitter), Pinterest, Bluesky, Threads, Mastodon, and Google Business Profile. All 11 platforms use the same endpoint and the same authentication.

How do I handle errors from the OmniSocials API in n8n?

Add an Error Trigger node or use n8n's built-in error workflow feature. The OmniSocials API returns standard HTTP status codes and a JSON error body with a message field. You can route on the HTTP status code or parse the response body in an IF node to handle specific failure cases.


The full API reference, including webhook setup and bulk post endpoints, is at docs.omnisocials.com. OmniSocials starts at $10/mo and the 14-day free trial includes API access. For n8n social media automation, it is the fastest path from "I need to post to 5 platforms" to a working workflow.


Sources


Tags:
tutorials
OmniSocials

The AI-friendly social media management platform. Plan, schedule, and publish across all your socials, or let your AI assistant handle it via MCP. $10/mo.

European Union flagMade in Europe
$10 /monthper workspacebilled annually
No credit card required

© 2026 OmniSocials Inc. All rights reserved.