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
- n8n HTTP Request Node Documentation — Official n8n docs for the HTTP Request node, including authentication and body configuration options
- OmniSocials API Reference — Full API endpoint documentation including posts, media upload, and webhooks
- Meta Graph API Documentation — Instagram and Facebook native API reference, useful for comparing complexity against the OmniSocials approach
- LinkedIn API Documentation — LinkedIn UGC Post API, showing the multi-step native posting process
- n8n Community: Social Media Automation Workflows — Community discussion and workflow templates for social media use cases


