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 verifiesTokPortal-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→ Bearersk_.... The agent then sees all 91tokportal_*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.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_refis 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.