Source: https://developers.tokportal.com/blog/n8n-tokportal-8-workflows/
Markdown: https://developers.tokportal.com/blog/n8n-tokportal-8-workflows.md

2026-08-18 · TokPortal team

# n8n + TokPortal: 8 workflows for faceless channels, UGC seeding and ban alerts

n8n has been the most common way people call TokPortal without writing code — HTTP Request nodes with an `X-API-Key` header, one per API call. That works and keeps working, but it puts the schema in your head. We are publishing a community node, `n8n-nodes-tokportal`, that exposes the API as typed operations plus a webhook trigger, and this post walks through eight workflows we built with it. The node is being published to npm as we write; the templates below are described so you can rebuild them today with HTTP nodes if the package has not landed in your instance yet.

## Install

Two ways to use TokPortal from n8n, and they combine well:

- **Community node (deterministic steps).** Settings → Community Nodes → Install → `n8n-nodes-tokportal`. Create a *TokPortal API* credential with a key from the [Developer Portal](https://app.tokportal.com/developer/api-keys). You get a **TokPortal** node with resources Bundle, Account (bundle account config), Video, Saved Account, Analytics, Webhook, Credits, and a **TokPortal Trigger** node that registers a webhook endpoint for the events you pick and verifies `TokPortal-Signature`.
- **MCP Client Tool (LLM in the loop).** For workflows where an AI Agent node decides what to do, add an MCP Client tool → HTTP Streamable → `https://app.tokportal.com/api/ext/mcp` → Bearer `sk_...`. The agent then sees all 91 `tokportal_*` tools.

If your instance cannot install community nodes (some cloud tiers), every operation below is a plain HTTP Request: base URL `https://app.tokportal.com/api/ext`, header `X-API-Key`, JSON body from the [OpenAPI reference](https://developers.tokportal.com/api-reference).

## The 8 workflows

### 1. Google Sheet → bundles

Trigger: Google Sheets *On row added* (one row per account to create: `country`, `platform`, `username`, `visible_name`, `biography`, `videos_quantity`, `warming_terms`). Steps: TokPortal → Bundle → Create (`bundle_type: account_and_videos`, `external_ref` = sheet row id) → TokPortal → Account → Configure → TokPortal → Bundle → Publish → Google Sheets *Update row* with the bundle id and status. Add a Filter after Create that stops if `get_credit_balance` is below the quoted cost (see workflow 8). This is the workflow most agencies start with.

### 2. Faceless channel factory

Trigger: Schedule (weekly). Steps: HTTP → your clip generator or storage (list this week's 21 files) → TokPortal → Video → Batch configure on the channel's bundle (`position`, `description` from a caption template, `target_publish_date` three per day, `video_url`, `ai_content_disclaimer: true`) → TokPortal → Bundle → Publish readiness → IF ready → Publish. Second branch: TokPortal → Bundle → Add video slots (`quantity: 21`) when remaining free slots < 21. One workflow per channel, or an Iterator over a channels table.

### 3. Ban → Slack alert

Trigger: TokPortal Trigger with `account.ban_appeal.submitted`, `account.banned`, `account.ban_resolution.decided`. Steps: TokPortal → Saved Account → Get (for `username`, `country`, `profile_url`) → Slack → Post message with the event type, the account, and — for `ban_resolution.decided` — `resolution`, `reason_code`, `refund_credits`. Add a Switch so `appeal_submitted` also pauses that account in your own scheduling table; it is the earliest signal that the account is unavailable.

### 4. Daily analytics digest

Trigger: Schedule (07:00). Steps: TokPortal → Analytics → Dashboard (yesterday, filters as needed) → TokPortal → Analytics → Series (`metric: views`, `granularity: day`, `mode: gained`, last 7 days) → TokPortal → Saved Account → List (`banned=false`) → Loop: Analytics → Account videos (`sort_by: views`, `per_page: 3`) → Code node to build the top-5 → TokPortal → Saved Account → List bans (`since` yesterday) → Slack / email. Optional: an AI Agent node with the MCP Client tool writes the two-sentence summary.

### 5. Airtable UGC queue

Trigger: Airtable *On record matches view* ("Approved"). Fields: creative URL, caption, target market, disclosure flag, number of accounts. Steps: TokPortal → Bundle → Create bulk (`platforms`, `country`, `accounts_count`, `videos_per_account: 1`, `external_ref` = Airtable record id) → Split Out bundle ids → per bundle: Account → Configure (persona from a personas table) and Video → Configure (`position: 1`, `video_url`, `description`, `disclose_as_ads`, staggered `target_publish_date`) → Bundle → Publish → Airtable *Update record* with bundle ids. Later, a scheduled branch pulls Analytics → Export videos filtered on `external_ref` and writes results back.

### 6. Sora / Veo URL → upload + schedule

Trigger: Webhook (your generation service posts `{url, caption, bundle_id, date}` when a render completes). Steps: HTTP → download the file (binary) → TokPortal → Video → Upload direct (multipart, `bundle_id`) → TokPortal → Video → Configure (`video_url` = returned `public_url`, `video_type: video`, `description`, `target_publish_date`, `ai_content_disclaimer: true`) → Respond. If your generator's URLs stay valid for days, skip the upload and pass the URL straight into `video_url`. The daily cap (3 per bundle per day) is enforced server-side; catch `VIDEOS_PER_DAY_EXCEEDED` and bump the date.

### 7. Delivered bundle → notify + manual reveal

Trigger: TokPortal Trigger with `account.finalized`. Steps: TokPortal → Saved Account → Get → Slack / email to the client: username, country, `profile_url`, "managed by TokPortal, no credentials needed". If a client insists on credentials, the workflow **must not** call reveal automatically: it posts a Slack message with an approval button (n8n *Wait for webhook*), and only after a human clicks does it call TokPortal → Saved Account → Reveal credentials with `acknowledge_support_forfeit: true` and the `policy_version` from a first no-body preview call (HTTP 428). This mirrors the API's two-step policy on purpose.

### 8. Credits guard

Trigger: Schedule (hourly) plus a call from workflows 1, 2, 5 before any create. Steps: TokPortal → Credits → Balance → TokPortal → Credits → Costs → IF balance < (planned operations × unit cost + safety margin) → Slack alert + set a "paused" flag in your table; ELSE continue. Add TokPortal → Credits → History (`list_credit_transactions`) once a day to reconcile spending per `external_ref` for client invoicing.

## Notes from building these

- Use `Idempotency-Key` (a UUID per n8n execution) on create/publish HTTP calls; the community node sets it for you. Retries then replay instead of double-creating.
- `external_ref` is your join key across n8n, Sheets/Airtable and TokPortal. Put the source record id in it on every bundle.
- Read-only operations never spend credits, so it is safe to poll `list_bundles`, `get_bundle`, analytics and bans as often as the 120 requests/minute limit allows.
- The trigger node verifies signatures with the endpoint secret; if you build the receiver with a plain Webhook node, verify `TokPortal-Signature` (`t=<timestamp>,v1=<hex>`, HMAC SHA-256 over the raw body) yourself — see [Webhooks](https://developers.tokportal.com/webhooks).

Templates will be linked from the [n8n guide](https://developers.tokportal.com/use-cases/no-code/n8n-tiktok-automation) as they are published; the [n8n × jobs](https://developers.tokportal.com/agents/n8n) pages show each of the twelve jobs with the exact operations.
