Tikhub Skill logo

Tikhub Skill

Community
zeenie-ai
tikhub-skill

Scrape TikTok, Douyin, Instagram, YouTube, Twitter/X, Xiaohongshu, Bilibili, Kuaishou, Weibo, Reddit, Threads, LinkedIn and more through the TikHub pay-per-request API - discover endpoints, call them by id, parse any share URL, and check account balance.

Overview

Publisherzeenie-ai
RepositoryOpenCompany
Skill nametikhub-skill
Stars
995
Forks
151
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by zeenie-ai on GitHub. Read the source before you install it.

Installation

Install the Tikhub Skill AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/zeenie-ai/OpenCompany/tree/main/server/skills/web_agent/tikhub-skill
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/zeenie-ai/OpenCompany.git /tmp/OpenCompany
mkdir -p .claude/skills
cp -r /tmp/OpenCompany/server/skills/web_agent/tikhub-skill .claude/skills/tikhub-skill
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Tikhub Skill in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Tikhub Skill on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Tikhub Skill is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

TikHub Skill

TikHub (api.tikhub.io) is a pay-per-request REST API that exposes roughly 1,000 scraping endpoints across TikTok, Douyin, Instagram, YouTube, Twitter/X, Xiaohongshu, Bilibili, Kuaishou, Weibo, Reddit, Threads, LinkedIn, Zhihu, Lemon8 and others. Each endpoint is one HTTP call that returns the platform's raw data; there are no long-running jobs, no actors, no datasets to poll. The tikhub_action tool is a thin, flattened wrapper over the official tikhub Python SDK: every SDK method is addressable by its resource-dot-method id (for example douyin_web.fetch_one_video), and the tool passes your params straight through as the SDK's keyword arguments.

Tool: tikhub_action

Operations

OperationPurposeKey fields
list_endpointsDiscover endpoints (no API call, free) - returns each endpoint's id, HTTP method, path, summary and typed params with required flagsplatform (default all), search (substring over id / summary / path), limit
callInvoke one endpoint by idendpoint (resource-dot-method id or a /api/v1/... path), params (JSON object of the SDK keyword args)
fetch_urlParse any TikTok / Douyin share URL through hybrid_parsing.video_dataurl, minimal (trimmed payload)
accountBalance, free credit and today's usage for the stored key-

Response

call and fetch_url:

json
{
  "operation": "call",
  "endpoint": "douyin_web.fetch_one_video",
  "path": "/api/v1/douyin/web/fetch_one_video",
  "data": { "aweme_detail": { "aweme_id": "7372484719365098803", "desc": "...", "statistics": { "digg_count": 12345 } } },
  "code": 200,
  "router": "/api/v1/douyin/web/fetch_one_video",
  "cost_usd": 0.001
}

data is the platform payload exactly as TikHub returns it - the shape differs per endpoint and per platform. code / router are TikHub's own envelope fields. cost_usd is what this call was billed.

list_endpoints:

json
{
  "operation": "list_endpoints",
  "platform": "twitter",
  "count": 13,
  "total": 13,
  "endpoints": [
    {
      "endpoint": "twitter_web.fetch_search_timeline",
      "resource": "twitter_web",
      "method": "fetch_search_timeline",
      "http_method": "GET",
      "path": "/api/v1/twitter/web/fetch_search_timeline",
      "summary": "Search",
      "params": [
        { "name": "keyword", "type": "str", "required": true },
        { "name": "search_type", "type": "str | None", "required": false },
        { "name": "cursor", "type": "str | None", "required": false }
      ]
    }
  ]
}

count is how many endpoints came back after search + limit; total is how many the platform has. With platform: "all" and no search the listing is capped, so always narrow by platform or search term.

On failure the tool raises an error carrying TikHub's own message - surface it verbatim (see "Errors" below).

The discover-then-call loop

Never guess an endpoint id or its parameter names. Endpoints are introspected from the installed SDK at runtime, so list_endpoints is always exact, free, and returns the required flag for every parameter.

  1. Narrow by platform and a search term:
json
{ "operation": "list_endpoints", "platform": "douyin", "search": "comments" }
  1. Read the params list of the endpoint you picked, then call it with exactly those keyword names:
json
{ "operation": "call", "endpoint": "douyin_web.fetch_video_comments", "params": { "aweme_id": "7372484719365098803", "count": 20 } }
  1. Paginate by feeding the cursor that came back in data into the next call (see "Pagination").

The endpoint field also accepts the REST path (/api/v1/douyin/web/fetch_video_comments) or the slash spelling (douyin_web/fetch_video_comments); all three resolve to the same SDK method. An unknown id fails before any network call and the error lists the closest matches.

Unknown keyword names are rejected before the request is sent, and the error lists the accepted parameters - fix the names and retry, do not retry the same call.

POST batch endpoints

A few endpoints take a JSON body instead of query parameters (the SDK signature shows a single body argument). Pass it as the body key inside params:

json
{ "operation": "call", "endpoint": "douyin_web.fetch_multi_video", "params": { "body": ["7372484719365098803", "7372484719365098804"] } }

Share URLs: prefer fetch_url

For any TikTok or Douyin share link (including short links on v.douyin.com and vm.tiktok.com), use fetch_url first. It resolves the link and returns the full video payload in one billed request without you having to extract an aweme_id:

json
{ "operation": "fetch_url", "url": "https://www.tiktok.com/@scout2015/video/7372484719365098803" }
{ "operation": "fetch_url", "url": "https://v.douyin.com/iRNBho6u/", "minimal": true }

minimal: true trims the payload to the fields most tasks need (id, description, author, stats, media URLs). For other platforms use the platform's own URL-accepting endpoint (instagram_v3.get_post_info takes a url, kuaishou_web.fetch_one_video_by_url takes a url, xiaohongshu_web.get_note_info_v7 takes share_text).

Per-platform cheat sheet

Ids below are verified against the installed SDK. Parameter names are the SDK keyword names; list_endpoints remains the authority for the full signature.

TikTok

Two resource families: tiktok_web (web-client fields, camelCase params such as secUid / uniqueId / itemId) and tiktok_app_v3 (app-client fields, snake_case params such as sec_user_id / unique_id / aweme_id). Both return TikTok data; the app family tends to carry richer statistics, the web family is lighter.

EndpointRequired paramsNotes
tiktok_web.fetch_user_profileuniqueId or secUidProfile by @handle (uniqueId) or sec id
tiktok_web.fetch_user_postsecUidPaginate with cursor (int); count
tiktok_web.fetch_post_detailitemIdSingle video (web fields)
tiktok_web.fetch_search_videokeywordPaginate with offset + search_id from the previous page
tiktok_web.fetch_post_commentaweme_idPaginate with cursor; count
tiktok_app_v3.fetch_one_videoaweme_idSingle video (app fields)
tiktok_app_v3.fetch_one_video_by_share_urlshare_urlVideo from a share link
tiktok_app_v3.fetch_user_post_videossec_user_id or unique_idPaginate with max_cursor; count
tiktok_app_v3.fetch_video_search_resultkeywordoffset, count, sort_type, publish_time, region
tiktok_app_v3.handler_user_profileone of user_id / sec_user_id / unique_idProfile (app fields)
tiktok_app_v3.fetch_hashtag_video_listch_idVideos under a hashtag; get ch_id from tiktok_app_v3.fetch_hashtag_search_result

Douyin

douyin_web is the primary family; douyin_app_v3 mirrors it with app fields; douyin_search holds the current search endpoints (POST, but still plain keyword params).

EndpointRequired paramsNotes
douyin_web.fetch_one_videoaweme_idSingle video; need_anchor_info optional
douyin_web.fetch_one_video_by_share_urlshare_urlVideo from a share link (or use fetch_url)
douyin_web.handler_user_profilesec_user_idProfile; douyin_web.handler_user_profile_v2 takes unique_id (the Douyin handle)
douyin_web.fetch_user_post_videossec_user_idPaginate with max_cursor (string); count
douyin_web.fetch_video_commentsaweme_idPaginate with cursor; count
douyin_web.fetch_hot_search_result-Hot search board
douyin_search.fetch_video_search_v2keywordPaginate with cursor + search_id; sort_type, publish_time, filter_duration
douyin_app_v3.fetch_one_video_v3aweme_idVideo without copyright restrictions on media URLs

Instagram

Three generations exist: instagram_v1, instagram_v2, instagram_v3. Prefer instagram_v3 (newest; most endpoints accept either user_id or username). instagram_v2 remains useful for hashtag / location / music feeds and paginates with pagination_token.

EndpointRequired paramsNotes
instagram_v3.get_user_profileuser_id or usernameProfile
instagram_v3.get_user_postsusernamePaginate with after (cursor) and first / count
instagram_v3.get_user_reelsuser_id or usernamePaginate with after; page_size
instagram_v3.get_post_infomedia_id or urlPost from a URL or media id
instagram_v3.get_post_commentscode (the shortcode from the post URL)Paginate with min_id; sort_order
instagram_v3.general_searchqueryPaginate with next_max_id + rank_token
instagram_v3.get_user_followersuser_id or usernamePaginate with max_id; count
instagram_v2.fetch_hashtag_postskeywordPaginate with pagination_token; feed_type

YouTube

youtube_web is the primary family; youtube_web_v2 adds captions, stream URLs, community posts and URL-accepting variants.

EndpointRequired paramsNotes
youtube_web.get_video_info_v3video_idVideo metadata; language_code
youtube_web.get_channel_idchannel_nameResolve @handle to a channel id
youtube_web.get_channel_infochannel_idChannel metadata
youtube_web.get_channel_videos_v3channel_idPaginate with continuation_token
youtube_web.get_video_commentsvideo_idPaginate with continuation_token; sort_by
youtube_web.get_general_searchsearch_queryFilters: upload_time, duration, content_type, sort_by; paginate with continuation_token
youtube_web_v2.get_video_captionsvideo_id or video_urlSubtitle text; language_code, format

Twitter / X

EndpointRequired paramsNotes
twitter_web.fetch_tweet_detailtweet_idSingle tweet
twitter_web.fetch_user_profilescreen_name or rest_idProfile
twitter_web.fetch_user_post_tweetscreen_name or rest_idUser timeline; paginate with cursor
twitter_web.fetch_search_timelinekeywordsearch_type (Top / Latest / Media / People / Lists); paginate with cursor
twitter_web.fetch_post_commentstweet_idReplies; paginate with cursor
twitter_web.fetch_trending-country optional

Xiaohongshu (RedNote)

Families: xiaohongshu_web (note detail, search, user), xiaohongshu_app_v2 (comments, topic feeds, search variants), plus older xiaohongshu_app, xiaohongshu_web_v2, xiaohongshu_web_v3. Most note endpoints accept either a note_id or the raw share_text copied from the app.

EndpointRequired paramsNotes
xiaohongshu_web.get_note_info_v7note_id or share_textNote detail (newest)
xiaohongshu_web.get_note_id_and_xsec_tokenshare_textResolve a share link to note_id + xsec_token
xiaohongshu_web.search_notes_v3keywordPaginate with page; sort, noteType, noteTime
xiaohongshu_web.get_user_infouser_idProfile
xiaohongshu_web.get_user_notes_v2user_idPaginate with lastCursor
xiaohongshu_app_v2.get_note_commentsnote_id or share_textPaginate with cursor; sort_strategy

Other platforms

Every other family follows the same shape - run list_endpoints with the platform to see them. Starting points: bilibili_web.fetch_one_video (bv_id), kuaishou_web.fetch_one_video_by_url (url), weibo_web_v2.fetch_post_detail (id), reddit_app.fetch_post_details (post_id), threads_web.fetch_post_detail (post_id), linkedin_web_v2.get_user_profile (username), zhihu_web.fetch_question_answers (question_id).

Hybrid parsing and account

EndpointRequired paramsNotes
hybrid_parsing.video_dataurlWhat fetch_url calls; minimal, base64_url
tikhub_user.get_user_info-Balance, free credit, email (what account calls)
tikhub_user.get_user_daily_usage-Today's request count and spend (what account calls)
tikhub_user.get_endpoint_infoendpoint (a /api/v1/... path)Price and description of one endpoint
tikhub_user.calculate_priceendpointProjected cost; request_per_day

Pagination

Cursor names vary by platform. Read the cursor from data and pass it back under the parameter name the endpoint declares:

PlatformRequest paramWhere the next cursor lives in dataStop when
TikTok app / Douyinmax_cursor (user posts), cursor (comments, hashtags)max_cursor / cursorhas_more is false or 0
TikTok webcursor (posts, comments), offset + search_id (search)cursor, search_idhasMore / has_more is false
Instagram v3after (posts, reels), max_id (followers), min_id (comments), next_max_id (search)end_cursor under page_info, or next_max_id / next_min_idhas_next_page false or cursor absent
Instagram v2pagination_tokenpagination_tokentoken absent
YouTubecontinuation_tokencontinuation_tokentoken absent
Twittercursorcursor (bottom cursor)cursor repeats or no new entries
Xiaohongshucursor (app_v2), lastCursor (web), page (search)cursor / last_cursorhas_more false
Weibopage or max_idmax_idempty page
Kuaishoupcursorpcursorpcursor is "no_more"

Fetch pages sequentially - each page is one billed request, and the same endpoint path is limited to 10 requests per second.

Cost and rate limits

  • Roughly $0.001 per successful request (TikHub bills only 2xx responses; failed calls are free). list_endpoints never calls the API and costs nothing.
  • 10 requests per second per endpoint path. Bursting past it returns 429; the SDK retries with backoff, and the tool reports retry_after when TikHub sends it.
  • Before a large crawl (hundreds of pages), run account and tell the user the balance; tikhub_user.calculate_price gives a projection for one endpoint.
  • Every call result carries cost_usd; costs are also recorded in OpenCompany's API usage panel under the tikhub service.

Errors

The tool raises a plain error message; relay it to the user as-is and act on the class of failure:

Message containsMeaningWhat to do
rejected the API key (401)Key missing, revoked or wrongTell the user to update it in Credentials -> TikHub; do not retry
refused <endpoint> (403)Key lacks the endpoint's scope OR balance is exhaustedRun account; if balance is 0 tell the user to top up, otherwise the endpoint is outside the key's plan
rate-limited <endpoint> (429)More than 10 req/s on one pathWait retry_after seconds (or a few seconds), then retry once
rejected the request to <endpoint> (400 or 422)Wrong or malformed argument valuesThe message carries TikHub's detail; fix the value and retry
returned 404 for <endpoint>Route removed or id / resource no longer existsRun list_endpoints and pick the current id
upstream error while calling <endpoint> (5xx / connection)Platform-side failure after the SDK's retriesTry again later; try the _v2 / _v3 variant of the endpoint if one exists
Unknown TikHub endpointId typoUse the suggestions in the message or list_endpoints
... rejected paramsKeyword name not in the SDK signatureUse the accepted names listed in the message

A 200 whose body says code: 4xx is also raised as an error with TikHub's message - the platform returned nothing useful for that id.

Authentication

OpenCompany stores the TikHub API key encrypted; you never see it and must never ask the user to paste it into the chat. If a call fails with the 401 message, tell the user: open Credentials -> Scrapers -> TikHub, paste the key from the TikHub user portal (tikhub.io -> API Keys) and click Validate - the modal shows the account email and balance when the key is accepted.

Working inside a team

When this node is wired to a teammate rather than directly to the lead, the lead never sees the tikhub_action tool itself. It sees one roster line per teammate that lists the teammate's connected tools and skills, built from this node's description and this skill's description, and it assigns work through task_manager with a bounded mission. As the teammate holding TikHub:

  1. Treat the mission as the query: pick the platform from the URL or the wording, run list_endpoints if the endpoint id is not obvious, then call or fetch_url.
  2. Return the extracted fields the mission asked for, not the raw TikHub payload. Include the endpoint id used, the count of items, and the total cost_usd so the lead can report spend.
  3. If the key is missing or the balance is exhausted, say so in the result verbatim so the lead can escalate to the user; do not retry blindly.

Best practices

  1. Prefer fetch_url for any share URL. One request, no id extraction, works for TikTok and Douyin links including short links.
  2. Use list_endpoints before guessing. It is free, exact for the installed SDK, and shows which params are required. Pick the highest _vN suffix when several variants exist unless the user needs a specific field set.
  3. Pass params by their SDK names, as a JSON object, values typed as the signature says (count is an int, cursors are usually strings).
  4. Paginate deliberately. Report how many pages you fetched and stop when has_more (or the platform's equivalent) turns false; do not loop without a page cap the user agreed to.
  5. Surface errors verbatim. TikHub's detail strings are precise; do not paraphrase them or retry blindly on 401 / 403 / 404.
  6. Keep data intact when relaying to downstream nodes - the raw platform payload is what other nodes and the user's exports expect.
  7. Respect the platforms' terms and the user's intent: scrape public content only, do not collect personal data beyond the task, and do not hammer one endpoint past 10 req/s.

Frequently asked questions

What does the Tikhub Skill AI skill do?

Scrape TikTok, Douyin, Instagram, YouTube, Twitter/X, Xiaohongshu, Bilibili, Kuaishou, Weibo, Reddit, Threads, LinkedIn and more through the TikHub pay-per-request API - discover endpoints, call them by id, parse any share URL, and check account balance.

Why use Tikhub Skill on TypingMind?

Because you install it once and use it with any model. Tikhub Skill is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Tikhub Skill in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/zeenie-ai/OpenCompany/tree/main/server/skills/web_agent/tikhub-skill. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Tikhub Skill?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Tikhub Skill?

As many as you like. As long as a model supports skills, you can use Tikhub Skill with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Tikhub Skill AI skill free?

Yes. It is published on GitHub by zeenie-ai under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇