FlowKit

Automating TikTok publishing with n8n and AI: the Content Posting API, script, and caption

Published 6 August 2026 · 5 min read

TikTok rewards consistency more than any other network: an account that posts every couple of days keeps its organic reach, while one that posts once a month starts nearly from zero with every video. That demanding pace is exactly what makes manual publishing hard to sustain — and what makes n8n a good candidate for absorbing the repetitive mechanics (script, caption, file upload) while still leaving a human to decide, video by video, what actually goes live.

What the Content Posting API really exposes

TikTok doesn't offer a simple "publish" endpoint: the Content Posting API, through its Direct Post feature, requires prior registration and a few constraints worth knowing before you build the workflow.

  • A TikTok for Developers app is required, with the Content Posting API product enabled and a TikTok Business or Creator account connected via OAuth2 to authorize publishing.
  • SELF_ONLY mode until your app is audited. Without passing the Content Posting API's specific audit — separate from standard developer registration — every publish is forced to private visibility, seen only by the owning account. The workflow works, the call succeeds, but nothing is actually public until the audit is approved: a common trap that's often discovered too late, when the automation looks broken but is actually running perfectly.
  • Mandatory disclosure for sponsored content. The API requires declaring whether a post promotes a third-party brand or the creator's own business — a field that must be set systematically in the workflow as soon as content is commercial, or risk rejection or account penalties.

Native node, community node, or third-party service?

There's no official n8n-nodes-base node for TikTok. Three options coexist:

  1. A community node (such as n8n-nodes-tiktok): quick to get started with, but often maintained by a single contributor and worth watching for compatibility as TikTok's API evolves.
  2. A third-party aggregation service (Blotato, Postiz, Upload-Post): these platforms handle TikTok authentication and expose a single API across several social networks, at the cost of a subscription and one more dependency in the chain.
  3. An HTTP Request node pointed directly at the Content Posting API: more upfront setup, but no third-party dependency and full control over every parameter — the approach used here, consistent with what's already documented for publishing automatically to Instagram and to X (Twitter).

The pipeline in n8n

1. Trigger and topic source

A Schedule Trigger (every couple of days, to match the pace mentioned above) launches the workflow from a "to process" row in a Notion or Airtable editorial calendar, the same principle detailed in our multi-network editorial calendar with Notion and n8n.

2. Script and caption generated by an AI Agent node

An AI Agent node turns the topic into a short script (a hook for the first three seconds, a body, and a closer) and a caption with hashtags, locked down with a Structured Output Parser (script, caption, hashtags, is_sponsored). That last boolean field feeds directly into the disclosure parameter the API requires.

3. Producing or fetching the video file

Depending on the pipeline, the video either comes from an already-produced edit (dropped into storage) or from an AI-assisted generation (an AI voiceover over a generated visual, following the same principle as our guide on generating AI voice with ElevenLabs). The final file needs to be available either as binary data in the workflow or at a publicly reachable URL.

4. Human review before any API call

Just like with Instagram, the draft (script, caption, a clip or thumbnail of the video) goes out on Slack for validation, reusing the human-in-the-loop pattern described in our article on human approval with the Wait node and Slack buttons: a Wait node in On Webhook Call mode pauses the workflow until a "Publish" or "Reject" click. While the app is still unaudited, this step costs nothing in terms of visibility (the video stays private either way) — but it becomes decisive the moment the audit is approved and every publish turns genuinely public.

5. Init, upload, then publish

Two strategies depending on where the file is hosted:

Option A — PULL_FROM_URL (domain verified in TikTok for Developers):
1) POST https://open.tiktokapis.com/v2/post/publish/video/init/
   Body: { "post_info": {...}, "source_info": { "source": "PULL_FROM_URL", "video_url": "..." } }
   → returns { "publish_id": "..." }

Option B — FILE_UPLOAD (no domain to verify):
1) POST .../video/init/ with source: "FILE_UPLOAD"
   → returns { "publish_id": "...", "upload_url": "..." }
2) PUT <upload_url> with the video binary, in chunks if the file is large

In both cases:
3) GET .../v2/post/publish/status/fetch/ with the publish_id
   → poll (a Wait node between each check) until status = "PUBLISH_COMPLETE"

The init → upload → status-polling pattern is exactly the same as Instagram's container flow: the retry and timeout best practices apply as-is, particularly to avoid looping indefinitely if the status stays stuck on FAILED.

Common pitfalls

  • Confusing a silent failure with SELF_ONLY mode: a call that succeeds but whose video is only visible to you isn't a workflow bug — it's the app not yet having passed TikTok's audit. Check the audit status before hunting for an error on the n8n side.
  • Forgetting domain verification under PULL_FROM_URL: TikTok verifies the exact path, not just the domain name — a file served from an unverified subfolder fails even if the parent domain is verified.
  • Ignoring the disclosure field on clearly commercial content: beyond the risk of a penalty, it's a contractual requirement of the API's terms of use, one that should be hardcoded into the generation prompt rather than checked manually after the fact.
  • Publishing without review once the audit is approved: that's exactly the moment step 4 stops being a theoretical safety net and becomes the only protection against an awkwardly generated video going public.

Going further

The mechanics stay the same as on the other networks already covered on this blog — a scheduled trigger, generation constrained by structured output, human review, then the API call — and it's the same pattern that structures the sorting and drafting workflows in the Inbox AI Pack (€79), applied here to a video feed instead of a mailbox. Start by publishing in SELF_ONLY while you harden the technical pipeline, then kick off TikTok's audit once the format is stable, rather than waiting to go public to discover an upload issue.

FAQ

Frequently asked questions

Does n8n have a native node for publishing to TikTok?

No. There's no official n8n-nodes-base node dedicated to TikTok. Community nodes exist (such as n8n-nodes-tiktok), at varying levels of maturity, and several third-party services (Blotato, Postiz, Upload-Post) offer a simplified API that avoids handling TikTok authentication directly. For full control with no third-party dependency, an HTTP Request node pointed at the Content Posting API remains the most reliable option.

Why does my video, published via the API, only show up on my own account?

That's expected behavior as long as your TikTok for Developers app hasn't passed the Content Posting API's audit: TikTok forces the privacy level to SELF_ONLY regardless of the value sent in the request. The video is genuinely published, just visible only to you. You need to submit the app for TikTok's audit to lift that restriction and publish with public visibility.

Should every video be reviewed before publishing to TikTok?

Strongly recommended. A 2024 study by Walsh, Kliamenakis, Laroche, and Jabado published in Psychology & Marketing found that TikTok users are notably more skeptical of sponsored content from very large creators than from small accounts, with perceived authenticity mattering more than reach for the engagement it earns. Content that's too polished or generic, generated without review, runs the same credibility risk — which is why it's worth keeping a human as the final decision-maker before every publish.

PULL_FROM_URL or FILE_UPLOAD — which should I choose from n8n?

PULL_FROM_URL is the simplest to script (a single call with the video's URL) but requires you to have already verified the hosting domain in TikTok for Developers, path by path. FILE_UPLOAD requires no domain verification at all, but means sending the video file in chunks to a temporary upload_url, which takes a few more HTTP Request nodes in the workflow. Without a domain you can reliably verify, FILE_UPLOAD is the option that just works.

Bundle FlowKit Complet

€269