Blog · 2026-08-18 · TokPortal team

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

Install the n8n-nodes-tokportal community node and copy eight workflows: Sheets → bundles, faceless channels, ban → Slack, analytics digest, credits guard.

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. 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.

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.decidedresolution, 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.

Templates will be linked from the n8n guide as they are published; the n8n × jobs pages show each of the twelve jobs with the exact operations.

More from the blog