WORKFLOW · N8N
Turn one video into native TikTok, Instagram and YouTube posts with PostWire
Prompts👁 0
WORKFLOW JSON
{
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Turn one video into native TikTok, Instagram and YouTube posts with PostWire",
"nodes": [
{
"id": "a1111111-1111-4111-8111-111111111111",
"name": "When you click Test workflow",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-260,
300
],
"parameters": {},
"typeVersion": 1
},
{
"id": "a2222222-2222-4222-8222-222222222222",
"name": "Your idea, video and platforms",
"type": "n8n-nodes-base.set",
"position": [
-40,
300
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "f1",
"name": "idea",
"type": "string",
"value": "Announce that our AI meal planner now builds a full week of recipes from one photo of your fridge. Friendly, build-in-public tone."
},
{
"id": "f2",
"name": "video_url",
"type": "string",
"value": "https://example.com/your-vertical-video.mp4"
},
{
"id": "f3",
"name": "platforms",
"type": "array",
"value": "={{ [\"tiktok\", \"instagram\", \"youtube\"] }}"
},
{
"id": "f4",
"name": "brand_voice",
"type": "string",
"value": "Plain language, first person, no hype, at most one emoji."
}
]
}
},
"typeVersion": 3.4
},
{
"id": "a3333333-3333-4333-8333-333333333333",
"name": "Write a native caption per platform",
"type": "n8n-nodes-base.httpRequest",
"position": [
200,
300
],
"parameters": {
"url": "https://postwire.io/api/generate",
"method": "POST",
"options": {},
"jsonBody": "={{ JSON.stringify({ prompt: $json.idea, platforms: $json.platforms, media_url: $json.video_url, brand_voice: $json.brand_voice }) }}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"typeVersion": 4.2
},
{
"id": "a4444444-4444-4444-8444-444444444444",
"name": "Publish to every connected account",
"type": "n8n-nodes-base.httpRequest",
"position": [
440,
300
],
"parameters": {
"url": "https://postwire.io/api/post",
"method": "POST",
"options": {},
"jsonBody": "={{ JSON.stringify({ platforms: $('Your idea, video and platforms').item.json.platforms, video_url: $('Your idea, video and platforms').item.json.video_url, per_platform: $json.drafts, options: { tiktok: { privacy_level: 'SELF_ONLY' } } }) }}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"typeVersion": 4.2
},
{
"id": "a5555555-5555-4555-8555-555555555555",
"name": "About this template",
"type": "n8n-nodes-base.stickyNote",
"position": [
-900,
120
],
"parameters": {
"color": 3,
"width": 520,
"height": 760,
"content": "## Turn one video into native TikTok, Instagram and YouTube posts\n\n### Who's it for\nCreators, solo founders and small agencies who publish the same video to several networks and are tired of rewriting the caption three times — or of pasting the identical text everywhere and watching it underperform.\n\n### What it does\nYou give it one idea and one video URL. PostWire's Smart Distribute writes a **native caption for each network** — the right length, hashtags, SEO and format per platform — and then publishes the video to every connected account in a single call. TikTok, Instagram, YouTube, Facebook, LinkedIn, X, Bluesky, Mastodon, Telegram, Discord and Reddit are supported.\n\n### How to set up\n1. Create a free PostWire account at https://postwire.io/dashboard.html (1 brand, 30 posts/month, no card) and connect your social accounts there with OAuth.\n2. Copy your API key from the dashboard.\n3. In n8n, create a **Header Auth** credential: name `Authorization`, value `Bearer pw_live_your_key`.\n4. Select that credential on both HTTP Request nodes.\n5. Edit the **Your idea, video and platforms** node with your own idea, video URL and networks.\n\n### Requirements\n- A PostWire API key (free tier works).\n- A publicly reachable video URL (MP4). TikTok and YouTube reject text-only or photo posts.\n\n### How to customize\n- Change `platforms` to any mix of the supported networks.\n- Swap the manual trigger for a Schedule, RSS or Google Sheets trigger to run it unattended.\n- To queue a post for later instead of publishing now, call `POST /api/schedule` with a `run_at` timestamp.\n- `brand_voice` is free text and steers every caption at once."
},
"typeVersion": 1
},
{
"id": "a6666666-6666-4666-8666-666666666666",
"name": "Step 1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
20
],
"parameters": {
"color": 7,
"width": 300,
"height": 220,
"content": "### 1. Your input\nThe only node you need to edit.\n\n`video_url` must be a public MP4 link — TikTok and YouTube will not accept a photo or text-only post."
},
"typeVersion": 1
},
{
"id": "a7777777-7777-4777-8777-777777777777",
"name": "Step 2",
"type": "n8n-nodes-base.stickyNote",
"position": [
240,
20
],
"parameters": {
"color": 7,
"width": 300,
"height": 220,
"content": "### 2. One idea → a caption per network\nSmart Distribute returns a `drafts` object keyed by platform, each with the text (and title and tags for YouTube) written for that network's rules."
},
"typeVersion": 1
},
{
"id": "a8888888-8888-4888-8888-888888888888",
"name": "Step 3",
"type": "n8n-nodes-base.stickyNote",
"position": [
560,
20
],
"parameters": {
"color": 7,
"width": 320,
"height": 260,
"content": "### 3. Publish everywhere at once\nReturns one result per network, each with the post URL or the exact error.\n\nTikTok starts as `SELF_ONLY` so your first test run stays private — change it to `PUBLIC_TO_EVERYONE` when you are happy."
},
"typeVersion": 1
}
],
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"connections": {
"When you click Test workflow": {
"main": [
[
{
"node": "Your idea, video and platforms",
"type": "main",
"index": 0
}
]
]
},
"Your idea, video and platforms": {
"main": [
[
{
"node": "Write a native caption per platform",
"type": "main",
"index": 0
}
]
]
},
"Write a native caption per platform": {
"main": [
[
{
"node": "Publish to every connected account",
"type": "main",
"index": 0
}
]
]
}
}
}RELATED WORKFLOWS
COMMENTS
No comments yet — be the first.
