Auto-post videos from n8n to TikTok, Instagram, YouTube and more
Most n8n templates for posting video wire up each platform's API on its own, with its own app review, tokens and limits. A simpler workflow sends the video once to a publishing API and lets it reach every platform. Step by step, with the HTTP Request node.
The Reelspan teamThe people who build Reelspan
8 min read

n8n is a good fit for content workflows: a new video lands in a folder, a sheet gets a new row, or an AI step finishes an edit, and the workflow takes it from there. The last step, actually posting the video, is where most workflows get complicated.
This guide shows a workflow that posts one video to TikTok, Instagram, YouTube and the other platforms you use with one HTTP Request node. It also covers how to schedule the posts and how to check that each one went live.
Why posting video from n8n gets complicated
n8n has a built-in YouTube node that can upload videos, but no built-in TikTok or Instagram node, so most community templates connect to those platforms' APIs directly with HTTP Request nodes: one branch for TikTok, one for Instagram, one for YouTube. Each branch brings its platform's own rules:
- App reviews before anyone else can use it. TikTok keeps every post from an unaudited app private, and allows at most five users to post through it in a 24-hour window (content sharing guidelines). On Meta, with Standard Access only people with a role on your app can grant it permissions; reaching anyone else needs Advanced Access, which requires Business Verification and often App Review (access levels). Our guides to the TikTok audit and the YouTube quota cover these in detail.
- Different upload styles. YouTube uses resumable uploads, TikTok uploads in chunks or pulls from a URL, and Instagram creates a container you poll before publishing.
- Tokens that expire on different clocks. Some last hours, some 60 days, so each branch needs its own refresh logic.
- Different limits on length, size and caption text. See our guides to video length limits and caption limits.
All of this is doable, and for one platform it's fine. For several, the workflow becomes mostly plumbing.
The simpler shape: one request, every platform
A publishing API takes one video and posts it to every connected platform. It does the reviews, uploads, tokens and retries itself. In n8n that turns the branches into a single node:
Trigger → get the video → HTTP Request (publish) → Wait → HTTP Request (status) → notify
The examples below use Reelspan's API. Reelspan uses the same endpoints and fields as Upload-Post's API, so templates written for Upload-Post work after changing the base URL and key.
Before you start
- Connect your accounts in Reelspan, under a profile (for example
brand), and connect TikTok, Instagram, YouTube and the others you post to. - Create an API key in Reelspan's dashboard.
- Store the key in n8n. Create an HTTP Request credential of type Header Auth (n8n credentials docs) with:
- Name:
Authorization - Value:
Apikey YOUR_KEY
- Name:
Keeping the key in a credential, not in the node, means it never appears in exported workflows.
Step 1: The trigger
Pick whatever starts your workflow:
- Schedule Trigger (docs) to post at set times,
- a Google Drive or Dropbox trigger when a new video arrives,
- a Google Sheets row with a video URL and caption,
- or a Webhook called by another system.
Step 2: Get the video
You have two options:
- A public URL. If the video is already at a public
https://address, you can send the URL instead of the file. Nothing else to do here. - The file itself. Use a node that downloads the file, such as Google Drive's download operation or an HTTP Request that fetches a file. n8n stores it as binary data on the item, usually in a property called
data.
Step 3: Publish with the HTTP Request node
Add an HTTP Request node (n8n docs) and set:
| Setting | Value |
|---|---|
| Method | POST |
| URL | https://app.reelspan.com/api/upload |
| Authentication | Generic Credential Type → Header Auth → the credential from above |
| Send Body | On |
| Body Content Type | Form-Data |
Then add these body parameters:
| Name | Type | Value |
|---|---|---|
user |
Form Data | your profile name, e.g. brand |
platform[] |
Form Data | tiktok |
platform[] |
Form Data | instagram |
platform[] |
Form Data | youtube |
video |
n8n Binary File | input data field: data |
title |
Form Data | the caption (YouTube uses it as the title) |
async_upload |
Form Data | true |
Repeat platform[] once per platform you want, using the names from the API reference.
Sending a URL instead of a file: make video a normal Form Data field with the URL as its value.
Different captions per platform
One caption rarely fits everywhere: YouTube's title is limited to 100 characters, while TikTok and Instagram allow 2,200. Add per-platform fields to override title where needed:
youtube_titlefor a short YouTube title, andyoutube_descriptionfor the description,tiktok_title,instagram_titleandx_titlefor those platforms.
Platforms without an override use title.
TikTok settings
By default Reelspan posts TikToks publicly when the account allows it, and otherwise uses the first privacy option TikTok offers for that account. To choose, add privacy_level, for example MUTUAL_FOLLOW_FRIENDS or SELF_ONLY. Or set post_mode to MEDIA_UPLOAD to send the video to the creator's TikTok inbox to finish in the app.
Step 4: Schedule instead of posting now
You can schedule in two ways:
- Let n8n decide when. Use a Schedule Trigger and post immediately each time it fires.
- Let the API hold the post. Add
scheduled_date(an ISO 8601 date and time) andtimezone(for exampleEurope/London) to the request. The response returns ajob_id, and the post goes out at that time even if your n8n instance is off. Reelspan accepts dates up to a year ahead.
The second option is more reliable for posts days ahead, and it's the only way to "schedule" on platforms whose own APIs can't, such as Instagram and TikTok. Our scheduling guide explains those platform limits.
Step 5: Check the result on every platform
With async_upload set, the publish request returns a request_id straight away. The upload then carries on in the background, because some platforms process video for a minute or more. To check it:
- Add a Wait node (docs), for example two minutes.
- Add an HTTP Request node:
GET https://app.reelspan.com/api/uploadposts/status, with the query parameterrequest_idset to{{ $json.request_id }}from the publish step, and the same credential. - Add an IF node on the result. The response lists a result for each platform that has finished, with whether it succeeded, the post's URL or the error, plus how many platforms are done out of the total. If some are still processing, loop back to the Wait node. If any failed, send yourself a message (Slack, email, Telegram).
For a scheduled post, query the same endpoint with job_id instead.
Webhooks instead of polling. If you'd rather not wait and poll, set a webhook in Reelspan and point it at an n8n Webhook trigger. Reelspan calls it as each platform finishes, so the trigger runs once per platform, with that platform's result.
Step 6: Retry only what failed
If one platform fails, for example because a token expired or the video was too long for that network, you don't want to repost to the others. Call POST https://app.reelspan.com/api/uploadposts/posts/retry from the failure branch with the request_id (or job_id). Optionally, list only the platforms to retry, and pass changed fields, such as a shorter caption. The API reference has the details.
Tips for a workflow that runs unattended
- Send your own
request_id. Use 8 to 100 letters, digits, hyphens or underscores, for example the file name plus a date. If n8n loses the response, you can still look the post up. - Test with a private post or a test profile first. Make sure every platform shows up as you expect before you point the workflow at real accounts.
- Keep videos within every platform's limits. Under a minute, vertical 9:16, H.264 MP4 works almost everywhere; see the length and aspect ratio guides.
- Log every
request_idin a sheet next to the video, so you can trace any post later.
Example: post every new video in a Google Drive folder
A common setup, from start to finish:
- Google Drive Trigger watches a folder, say
Ready to post, for new files. - Google Drive node, operation Download, fetches the new file into the binary property
data. - Set node builds the caption. For example, it takes the file name without the extension as the YouTube title and reads a longer caption from a sheet or a text field.
- HTTP Request node publishes it, as in Step 3, with
async_uploadset totrue. - Wait node, two minutes.
- HTTP Request node checks the status with the
request_id. - IF node: everything published, or not?
- Google Drive node moves the file to
Postedon success. On failure, a Slack or email node tells you which platform failed and why.
Moving the file at the end keeps the workflow from posting the same video twice if it runs again.
Troubleshooting
| What you see | Likely cause | Fix |
|---|---|---|
401 from the publish request |
Missing or wrong key | Check the credential's header name is Authorization and the value starts with Apikey |
400 about user or platform |
A required field is missing | Send user, at least one platform[] and video |
A platform is skipped |
It isn't connected on that profile | Connect it in Reelspan, or remove it from the request |
| The request times out on big files | The upload is waiting for every platform | Set async_upload to true and check the status separately |
| The video field arrives empty | Wrong binary property name | Match Input Data Field Name to the property the download node wrote, usually data |
| One platform failed, others worked | That platform's limits or account | Read its error in the status result, fix, then retry only that platform |
When to call the platforms directly instead
A publishing API isn't always the right choice. Calling a platform's API yourself makes sense if:
- you post to one platform only,
- you need a feature the publishing API doesn't expose,
- or you already have approved developer apps and the plumbing in place.
For everything else, one request per video keeps the workflow short. The full list of fields is in the API reference, and the same actions are available to AI assistants through the MCP server.
Questions people ask
Can n8n post to TikTok?
Yes, through an HTTP Request node, either to TikTok's own Content Posting API or to a publishing API that posts to TikTok for you. Posting to TikTok's API directly means your own TikTok developer app, and posts stay private until that app passes TikTok's audit.
Is there a built-in n8n node for TikTok or Instagram posting?
n8n has a built-in YouTube node that can upload videos, but no built-in TikTok or Instagram node when we checked. For those, use the HTTP Request node, which can call any posting API.
How do I send a video file from n8n?
Use the HTTP Request node with the body content type set to Form-Data, and add a parameter of type n8n Binary File that points to the binary property holding the video, which is usually called data.
Can n8n schedule posts?
Yes, in two ways: trigger the workflow on a schedule with the Schedule Trigger node, or send a future publish time to an API that schedules for you. With Reelspan, set scheduled_date and timezone on the upload request.
How do I know if the post went live on every platform?
Ask for an asynchronous upload, keep the request_id, wait, then call the status endpoint, which returns a result per platform. Webhooks are an alternative to polling.
Sources
- HTTP Request node, n8n Docs. Checked 6 Nov 2026.
- HTTP Request credentials, n8n Docs. Checked 6 Nov 2026.
- Schedule Trigger node, n8n Docs. Checked 6 Nov 2026.
- Wait node, n8n Docs. Checked 6 Nov 2026.
- Content Sharing Guidelines, TikTok for Developers. Checked 6 Nov 2026.
- Access levels, Meta for Developers. Checked 6 Nov 2026.


