There is no Reelspan node for n8n yet. The built-in HTTP Request node calls the Reelspan REST API directly, and one node posts to every network you name. This page builds a workflow that publishes a video, waits, and reads each network's result.
Trigger → get the video → HTTP Request (publish) → Wait → HTTP Request (status) → IF → notifyBefore you start
- In Reelspan, create a profile (for example
my-brand) and connect the networks you post to. - Create an API key under Developers → API keys. A test key (
rs_test_…) lets you build the whole workflow without posting anything. - In n8n, create a credential of type Header Auth with:
- Name:
Authorization - Value:
Bearer rs_test_…(your key)
- Name:
Keeping the key in a credential means it never appears in exported workflows.
Post a video
Get the video into the workflow first. Either it is already at a public https URL, or a node such as Google Drive Download puts the file on the item as binary data, usually in a property called data.
Add an HTTP Request node:
| Setting | Value |
|---|---|
| Method | POST |
| URL | https://api.reelspan.com/v1/posts/video |
| Authentication | Generic Credential Type → Header Auth → your credential |
| Send Body | On |
| Body Content Type | Form-Data |
Then add the body parameters:
| Name | Type | Value |
|---|---|---|
user |
Form Data | my-brand |
platform[] |
Form Data | tiktok |
platform[] |
Form Data | youtube |
platform[] |
Form Data | instagram |
title |
Form Data | the caption (YouTube uses it as the title) |
video |
n8n Binary File | Input Data Field Name: data |
async_upload |
Form Data | true |
Add one platform[] row per network. To send a URL instead of a file, make video a normal Form Data field with the URL as its value.
With async_upload set, the node returns at once with a request_id:
{
"success": true,
"message": "Upload initiated successfully in background.",
"request_id": "9b1f6c2e8a3d4f50b7e1c9a2d6f3e8b1",
"total_platforms": 3
}Every other field from Post a video is another Form Data row: youtube_title and tiktok_title for per-network captions, privacy_level for TikTok, first_comment, and so on.
Post text
Text posts take JSON, so there is no file to handle. In an HTTP Request node, set Method to POST, URL to https://api.reelspan.com/v1/posts/text, the same credential, Send Body on, Body Content Type JSON, Specify Body Using JSON, and:
{
"user": "my-brand",
"platform": ["x", "bluesky", "threads"],
"title": "{{ $json.text }}",
"async_upload": "true"
}To try it without a connected account, use "platform": ["sandbox"]. See Post text for the networks that take text.
Read the results
Poll the status
- Add a Wait node, for example one or two minutes for a video.
- Add an HTTP Request node:
GET https://api.reelspan.com/v1/posts/status, the same credential, with the query parameterrequest_idset to{{ $('Publish').item.json.request_id }}(use your publish node's name). - Add an IF node on
{{ $json.status }}. It ispendingorin_progresswhile networks are still working, thencompleted(at least one network published) orfailed. Loop back to the Wait node while it is still working.
{
"success": true,
"request_id": "9b1f6c2e8a3d4f50b7e1c9a2d6f3e8b1",
"status": "in_progress",
"completed": 1,
"total": 3,
"results": [
{ "platform": "tiktok", "success": true, "status": "completed", "post_url": "https://www.tiktok.com/@mybrand/video/7441…", "error_message": null, "error_code": null }
]
}Only networks that have finished appear in results. Each has its own success, post_url and error_message, so send yourself a message for the ones that failed. Poll no more often than every 5 seconds. For a scheduled post, query with job_id instead. See Post status.
Or get a webhook
Instead of waiting and polling, start a second workflow with a Webhook trigger node, and set its production URL as your Reelspan webhook in the dashboard or with POST /v1/webhook. Reelspan sends an upload_completed event as each network finishes, so the workflow runs once per network with that network's result. Deliveries are signed with X-Reelspan-Signature; see Webhooks.
Retry what failed
From the failure branch, call POST https://api.reelspan.com/v1/posts/retry with a JSON body holding the request_id and, optionally, platforms to retry only some. The media is not uploaded again. See Retry.
Schedule instead of posting now
Add scheduled_date (ISO 8601) and timezone (for example Europe/London) to the publish request. Reelspan answers 202 with a job_id and posts at that time even when n8n is off. Or add add_to_queue = true to take the profile's next queue slot. See Scheduled posts.
Tips
- Send an
Idempotency-Keyheader (for example the file name plus the date) so a retried run never posts twice. See Retrying safely. - Log the
request_idnext to the video in a sheet, so you can trace any post later. - Move or mark the source file after it posts, so the workflow doesn't pick it up again.
Troubleshooting
| What you see | Likely cause | Fix |
|---|---|---|
401 |
Missing or wrong key | The credential's name must be Authorization and its value must start with Bearer |
400 about user or platform |
A required field is missing | Send user, at least one platform[], title and video |
A network shows skipped |
It isn't connected on that profile | Connect it, or drop it from the request |
| The video arrives empty | Wrong binary property | Match Input Data Field Name to the property the download node wrote, usually data |
| Posts show as done but nothing appears | You are using a test key | Switch the credential to a live key (rs_live_…) |