# SOLARI > SOLARI CLI and MCP: creator and brand data in your terminal. ## Overview SOLARI CLI and MCP bring the Instagram, TikTok, and Threads data SOLARI collects into your terminal, scripts, and AI agents. The tools come in three groups: - catalog: accounts and posts SOLARI already has. - insight: results SOLARI computes, such as rankings, similar accounts, ads, and trends. - fetch: accounts, posts, and Instagram hashtags collected live from the platform. ```console $ solari insight instagram account similar username=oliveyoung_official limit=10 ``` Use the CLI in a terminal or with agents that run commands. Use MCP for apps like Claude Desktop and ChatGPT. ## Install **macOS** Shell: ```bash curl -fsSL https://solari.sh/install | sh ``` Homebrew: ```bash brew install brandazine/solari/solari ``` npm: ```bash npm install -g @brandazine/solari ``` uv: ```bash uv tool install solari-cli ``` uv tool installs the CLI in its own environment and adds it to your PATH, so it does not conflict with a project's dependencies. **Windows** PowerShell: ```powershell irm https://solari.sh/install.ps1 | iex ``` npm: ```bash npm install -g @brandazine/solari ``` uv: ```bash uv tool install solari-cli ``` uv tool installs the CLI in its own environment and adds it to your PATH, so it does not conflict with a project's dependencies. **Linux** Shell: ```bash curl -fsSL https://solari.sh/install | sh ``` npm: ```bash npm install -g @brandazine/solari ``` uv: ```bash uv tool install solari-cli ``` uv tool installs the CLI in its own environment and adds it to your PATH, so it does not conflict with a project's dependencies. ```console $ solari --version 1.0.1 ``` ## Quickstart ```console $ solari auth login # sign in through the browser $ solari # lists catalog, insight, and fetch $ solari catalog instagram account search --help # parameters only $ solari catalog instagram account search query=innisfree brands_only=true limit=3 ``` Pass a username or account_id from the result to the next tool: ```console $ solari insight instagram brand ad stats username=innisfreeofficial ``` ## Command structure ```console $ solari insight instagram brand # lists the group $ solari insight instagram brand overview username=innisfreeofficial ``` Arguments are key=value pairs. Arrays can be JSON or comma-separated, like post_ids=a,b. - `solari help all` — Every command, tool, and parameter on one page. Tools added in the last 7 days are marked NEW. - `solari get ` — Only runs a tool. An incomplete path fails instead of listing the group. - `solari cache refresh` — Reloads the tool list now and shows what changed. > New tools arrive without a CLI update. When you see note: SOLARI tools changed, run solari help all. ## Authentication - `solari auth login` — Signs in through the browser. Over SSH or from an agent, it prints a link instead. --add signs in to another account as well. - `solari auth list · switch ` — Lists signed-in accounts, or switches between them without a browser. - `solari auth status` — Shows the account and when sign-in expires. Exit code 3 means sign in again. - `solari auth logout` — Signs out. --all signs out of every account. If the browser can't get back to the machine running the CLI (SSH, containers), copy the URL from the address bar after signing in and paste it into the prompt. ## Credits and usage Only successful tool calls use credits. They come from your account's prepaid balance, which the CLI, MCP, and the REST API share, and each page of a paged result counts as a separate call. Failed calls, tool lists, the app catalog, account info, feedback, and balance checks are free. ```console $ solari usage ``` Shows your plan, credits left and when they expire, and billed calls in the last 30 days. It is free and works at a zero balance. Over MCP, use solari_usage_get. At zero balance, calls fail with CREDIT_EXHAUSTED (REST: HTTP 402) and are not charged. The error says what to do next. Plans, trial, and top-ups: https://solari.sh/pricing · Your balance: https://solari.brandazine.com/settings/billing ## Output and piping Results go to stdout and messages to stderr, so a pipe carries only data. - `--json` — Raw JSON. The data is the JSON string in content[0].text. - `--ndjson` — One JSON object per line. Fields like total go to stderr. - `--verbose, -v` — Logs progress to stderr, with secrets hidden. Every post row has assets: its media files in order, each with an asset_url you can download. They are stored copies; for the highest quality, use solari instagram download content or solari tiktok download content. ```console $ solari catalog instagram account posts username=innisfreeofficial limit=200 --ndjson \ | jq -r '.assets[].asset_url | select(.)' > urls.txt $ aria2c -i urls.txt -d media -j 8 ``` ## Feedback from agents When an agent can't finish a task with SOLARI (missing data or features, too few results, a wrong value, a failing tool), it sends feedback to the SOLARI team on its own and tells you in one line. It leaves out personal data, and SOLARI strips emails, phone numbers, and keys again before saving. ```console $ solari feedback "brand ad posts returned 3 rows for 24 months" category=insufficient_results ``` ## Configuration Settings are stored in ~/.solari/config.json. An environment variable overrides a setting for that command only. ```console $ solari config list $ solari config set server https://solari.sh ``` - `server · SOLARI_SERVER` — The SOLARI server. Default https://solari.sh. - `cacheTtl · SOLARI_CACHE_TTL` — Seconds the local tool list counts as fresh. Default 900; 0 always asks the server. - `callTimeout · SOLARI_CALL_TIMEOUT` — Seconds to wait for a tool call. Default 150. - `SOLARI_TOKEN` — An access token or API key to use instead of the stored sign-in. See From your own code. - `SOLARI_HOME` — Stores SOLARI's files somewhere other than ~/.solari. - `SOLARI_NO_UPDATE_CHECK=1` — Turns off the daily update check. ## Agents ```text set up solari.sh/get-started.md ``` Give this line to a coding agent and it sets everything up. The install script also registers the CLI with the agents it finds (Claude Code, Codex, Grok Build, Antigravity CLI, OpenCode). It never edits CLAUDE.md or a project's AGENTS.md. ```bash solari init # register again, choosing agents solari init --remove # undo ``` ### Machine-readable docs Add .md to any docs URL for Markdown (?lang=ko or ?lang=ja for Korean or Japanese). /llms.txt lists every page, and /llms-full.txt has everything in one file. ## From your own code The same tools are available over a REST API, TypeScript and Python SDKs, and MCP, all with one token. Full reference: https://solari.sh/api ```console $ solari auth token ``` Prints an access token valid for 8 hours. Keep it secret. For CI, servers, or scheduled jobs, create an API key (solari_sk_…) at https://solari.brandazine.com/me/api-keys instead. Put either one in SOLARI_TOKEN. The CLI and the SDKs then run without signing in, and HTTP calls send it as a bearer token: ```console $ export SOLARI_TOKEN= $ solari catalog instagram account search query=nike --json $ curl -sS https://solari.sh/mcp/api/v1/tools/solari_catalog_instagram_account_search \ -H "Authorization: Bearer $SOLARI_TOKEN" \ -H "Content-Type: application/json" \ -d '{"query":"nike","limit":3}' ``` ## Connect over MCP Add this remote MCP address to your app. The first time you connect, a browser opens so you can sign in. ```text https://solari.sh/mcp ``` ### Claude Desktop Open Settings → Customize. ![The Claude Desktop settings sidebar, with Customize at the bottom.](https://clip-pub.bzine.co/docs/claude-desktop-settings.webp) _Settings → Customize_ Under Connectors, press Add and enter a name and the address. ![The Add custom connector dialog in Claude Desktop, with a name and the SOLARI MCP address filled in.](https://clip-pub.bzine.co/docs/claude-desktop-add-connector.webp) _Connectors → Add → Add custom connector_ Press Continue and sign in. claude.ai works the same way. ### Claude Code ```bash claude mcp add --transport http solari https://solari.sh/mcp ``` Run /mcp to check the connection or sign in. ### ChatGPT Add the address as a custom connector under Settings → Connectors (paid plans only), then sign in. ### Other hosts Most apps that support remote MCP take an entry like this: ```json { "mcpServers": { "solari": { "url": "https://solari.sh/mcp" } } } ``` > Apps that only run local MCP servers can't connect. Use the CLI with them. ## Errors and exit codes - `0` — Success. - `1` — The tool or the server failed. - `2` — Bad input: an unknown path, a missing argument, or an invalid value. - `3` — Sign-in required. Only a person can finish it, so an agent should tell the user instead of retrying. ### Common tool errors - `auth expired, reconnect the connector` — Run solari auth login again, or reconnect the connector in your app. - `SOLARI access denied (403)` — Sign in again. - `SOLARI rate limit` — Over your plan's calls per minute. Wait the seconds the message gives. - `SOLARI upstream timed out` — The call ran past 90 seconds (120 for aggregate and trend-cluster tools). Narrow the range or lower limit. - `CREDIT_EXHAUSTED` — No credit left, or the trial hasn't started (email or card setup incomplete). Not charged. Don't retry; run solari usage and follow the error. - `ACCOUNT_BLOCKED` — Tool calls are paused for this account. Not charged; the error says who to contact. ## Data coverage - content search and content aggregate: KR, JP, US, TW, about the last 6 months. - Account, brand, and post tools: full history, any region. KR has the most data. - Counts are exact up to 10,000. TikTok search stops paging at 9,800. ### Identifiers - account_id and post_id are per platform. Instagram, TikTok, and Threads ids don't mix. - Pass account_id or username. If both are set, account_id wins. - Public post ids: slug on Instagram, video_id on TikTok, code on Threads. ## FAQ ### Can I change SOLARI data? No. SOLARI data can't be edited or deleted. The fetch tools only collect public accounts and posts. ### Can I use this with Claude? Yes. Run solari init to register the CLI with your agents, or connect over MCP. ### Why does search return no results? Account search matches the username or display name as written. For content search, use KR, JP, US, or TW, and dates inside the last six months. ### Does it cost anything? Tool calls use prepaid credits, and only successful calls use them. A new account with a verified email can start a one-time 30-day trial with 5,000 credits after card setup. Nothing is charged, and no paid plan starts on its own. Plans and prices: https://solari.sh/pricing ## Tool reference Every CLI and MCP tool, in three groups: catalog (data SOLARI already has), insight (results SOLARI computes), and fetch (live from the platform). ### solari catalog instagram account search > Find collected Instagram accounts by username, name, or a phrase in their bio. Use this to get an account_id. - **CLI**: `solari catalog instagram account search` - **MCP tool**: `solari_catalog_instagram_account_search` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Search SOLARI's catalog of collected Instagram accounts by username, display name, or words in their bio. This is not Instagram's own search. The account_id you get is what the other Instagram tools need. **When to use it** — When you have a name or username, and not an account_id yet. **What comes back** — Matching accounts, closest first. #### Parameters - `query` (string, required) — Username, display name, or — with query_type=bio — words from the profile bio. - `query_type` (enum, optional, default "auto") — Where to look: username, display name, bio, or all of those (auto). Values: `auto`, `username`, `full_name`, `bio`. - `brands_only` (boolean, optional, default false) — Only known brand accounts. Turn this on when looking up a brand. - `limit` (integer, optional, default 8, 1–50) — How many accounts to return. - `region` (string, optional, ≤ 8 chars) — Country code such as KR or JP. Leave this off to search everywhere. #### Response ##### `Response` - `found` (boolean) — Whether anyone matched. - `items` (object[]) — Accounts that matched, closest first. ##### `items[]` - `account_id` (uuid) — account_id for the other Instagram tools. - `username` (string) — Instagram username. - `full_name` (string) — Display name. - `biography` (string) — Profile bio. - `follower_count` (integer) — Follower count. - `region` (string) — Region code. - `is_verified` (boolean) — Verification badge. - `profile_pic_url` (string) — Profile picture URL. #### Example ```console $ solari catalog instagram account search query=oliveyoung brands_only=true limit=5 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "found": true, "items": [ { "account_id": "018cab6d-1648-7071-9734-c47a2be2fd19", "username": "oliveyoung_official", "full_name": "올리브영 OLIVE YOUNG", "biography": "ALL LIVE YOUNG 🫒\nALL LIVE BETTER @olivebetter.official", "follower_count": 1199628, "region": "KR", "is_verified": true, "profile_pic_url": "https://dcr.bzine.co/instagram/users/oliveyoung_official/profile-picture" }, { "account_id": "018dc63c-31b5-740f-bde0-2c00931385e1", "username": "oliveyoung_global", "full_name": "OLIVE YOUNG Global", "biography": "Korea's No.1 Health & Beauty Store\n✈️ FREE SHIPPING on orders over $60", "follower_count": 535949, "region": "KR", "is_verified": true, "profile_pic_url": "https://dcr.bzine.co/instagram/users/oliveyoung_global/profile-picture" }, { "account_id": "018cabcf-e60e-70af-95eb-eff777ce5195", "username": "oliveyoung_magazine", "full_name": "올리브영 매거진", "biography": "내 일상과 가까운 뷰티 매거진", "follower_count": 142316, "region": "KR", "is_verified": false, "profile_pic_url": "https://dcr.bzine.co/instagram/users/oliveyoung_magazine/profile-picture" }, "… 2 more" ] } ``` #### As an MCP call ```json { "name": "solari_catalog_instagram_account_search", "arguments": { "query": "oliveyoung", "brands_only": true, "limit": 5 } } ``` #### Notes - The name has to appear in the username or display name. Nicknames and abbreviations usually miss. - For a brand, set brands_only=true so fan accounts drop out. - region keeps only the specified country. Leave it off unless you need one. #### Related tools - [`solari_catalog_instagram_account_profile`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-profile.md) - [`solari_catalog_instagram_account_posts`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-posts.md) - [`solari_catalog_tiktok_account_search`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-search.md) ### solari insight instagram account similar > Use this to find similar Instagram accounts. - **CLI**: `solari insight instagram account similar` - **MCP tool**: `solari_insight_instagram_account_similar` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Find Instagram accounts in a similar network. This is about nearby accounts, not who has run ads together. **When to use it** — When you want similar accounts. For ad partners, use brand top collaborators. **What comes back** — Similar accounts, closest first. #### Parameters - `username` (string, required) — Instagram username, without @. - `limit` (integer, optional, default 50, 1–100) — How many similar accounts to return. #### Response ##### `Response` - `account_id` (uuid) — Id of the starting account. - `user` (object) — Profile of the starting account. - `params` (object) — Settings that were actually used. - `results` (object[]) — Similar accounts, score descending. - `diagnostics` (object) — How the search was run. - `note` (string) — Present only when results is empty. Says what to do next. - `next` (string) — Present only when results is empty. The command that collects the account. ##### `results[]` - `account_id` (uuid) — account_id of the similar account. - `username` (string) — Username. - `full_name / bio` (string) — Display name and bio. - `score` (number) — Similarity score for this response. - `follower_count` (integer) — Follower count. - `region` (string) — Region code. - `has_collaborated` (boolean) — Whether they have an ad collab with the starting account. - `last_collaboration_date` (date | null) — Most recent collab date. #### Example ```console $ solari insight instagram account similar username=oliveyoung_official limit=8 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "account_id": "018cab6d-1648-7071-9734-c47a2be2fd19", "user_id": "018cab6d-1648-7071-9734-c47a2be2fd19", "params": { "k": 8, "hops": 3, "max_rank_to_use": 25 }, "diagnostics": { "neighbors_used": 6137, "unique_terms": 25, "build_ms": 9419, "algorithm": "distance_weighted_jaccard", "max_rank_used": 25, "target_related_count": 25 }, "user": { "account_id": "018cab6d-1648-7071-9734-c47a2be2fd19", "user_id": "018cab6d-1648-7071-9734-c47a2be2fd19", "username": "oliveyoung_official", "full_name": "올리브영 OLIVE YOUNG", "biography": null, "profile_pic_url": "https://dcr.bzine.co/instagram/users/oliveyoung_official/profile-picture", "follower_count": 1209835, "region": "KR", "is_verified": null }, "results": [ { "account_id": "018cabd4-926b-7a58-b0cb-11dfc7c37006", "user_id": "018cabd4-926b-7a58-b0cb-11dfc7c37006", "username": "gs25_official", "score": 0.1875, "profile_pic_url": "https://dcr.bzine.co/instagram/users/gs25_official/profile-picture", "follower_count": 1018225, "median_views": null, "full_name": "대한민국 대표 편의점 GS25", "bio": "더 재미있게 더 실속있게\n오늘 가장 최신의 트렌드를 만나는\n#25매거진 #재미있는GS25 #라이프스타일플랫폼", "region": "KR", "has_collaborated": false, "last_collaboration_date": null, "collaborated_with": [] }, { "account_id": "018cab6d-19b5-7545-b202-4738e83acd81", "user_id": "018cab6d-19b5-7545-b202-4738e83acd81", "username": "romandyou", "score": 0.1, "profile_pic_url": "https://dcr.bzine.co/instagram/users/romandyou/profile-picture", "follower_count": 845616, "median_views": null, "full_name": "롬앤 romand official", "bio": "멀멀한 ☆초미녀☆ 신상으로 돌아왔어요!\n롬앤 𝗡𝗘𝗪 레오파드 산리오캐릭터즈 에디션\n올리브영 온/오프라인 𝗢𝗣𝗘𝗡 💜🩵\n⁺‧₊‧⁺‧₊‧⁺‧₊‧⁺‧₊‧⁺‧₊‧⁺‧₊‧⁺‧₊‧⁺‧₊‧", "region": "KR", "has_collaborated": false, "last_collaboration_date": null, "collaborated_with": [] } ] } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_account_similar", "arguments": { "username": "oliveyoung_official", "limit": 8 } } ``` #### Notes - Pass a username, not an account_id. - For who has run ads with a brand, use brand top collaborators. - If results is empty, run solari fetch instagram account username=… and call this again. Similar accounts come from data collected with the account. #### Related tools - [`solari_catalog_instagram_account_search`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-search.md) - [`solari_fetch_instagram_account`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-account.md) - [`solari_insight_instagram_brand_top_collaborators`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-top-collaborators.md) ### solari insight instagram brand overview > An Instagram brand's profile and ad history. - **CLI**: `solari insight instagram brand overview` - **MCP tool**: `solari_insight_instagram_brand_overview` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 A brand's profile, plus the creator ids and ad post ids behind its ads. Pass those post ids to content batch to load the posts. **When to use it** — When you are starting brand analysis. For exact ad counts, use brand ad stats. **What comes back** — Brand profile, plus creator ids and ad post ids. #### Parameters - `username` (string, required) — Brand Instagram username, without @. - `full` (boolean, optional, default false) — Return the full id lists instead of the first 20. #### Response ##### `Response` - `information` (object) — Brand profile: user_id, username, full_name, bio, follower_count. - `all_influencers_id` (uuid[]) — account_ids of creators who produced ads for the brand. First 20 by default. - `all_influencers_count` (integer) — Total creators before truncation. - `all_influencers_truncated` (boolean) — true when the list is a preview. - `all_campaign_posts_id` (uuid[]) — Ad post ids. First 20 by default. - `all_campaign_posts_count` (integer) — Total posts before truncation. - `all_campaign_posts_truncated` (boolean) — true when the list is a preview. #### Example ```console $ solari insight instagram brand overview username=innisfreeofficial ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "information": { "user_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "full_name": "INNISFREE | 이니스프리", "bio": "NATURE MEETS KOREAN SKIN SCIENCE", "follower_count": 847619, "brand_id": null }, "all_influencers_id": [ "01935f3d-8188-727e-a0bb-09e54aadfdac", "018caf6e-abfd-73da-88ad-11a56c39358b", "019a0061-b1d4-7adb-8ea4-1c5572dca38c", "… 17 more" ], "all_campaign_ids": [], "all_campaign_posts_id": [ "019f505f-f8be-7e88-ae08-6fba999950b1", "019f5060-3449-779e-a08b-d6d49add90cd", "019f4342-3357-7418-916c-da1c44468308", "… 17 more" ], "post_id_to_campaign_id": {}, "all_influencers_count": 93, "all_influencers_truncated": true, "all_campaign_posts_count": 100, "all_campaign_posts_truncated": true } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_brand_overview", "arguments": { "username": "innisfreeofficial" } } ``` #### Notes - Pass a username, not an account_id. Unknown usernames return 404. - full=true returns up to 100 ids each. For exact totals, use brand ad stats. #### Related tools - [`solari_insight_instagram_brand_ad_stats`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-ad-stats.md) - [`solari_catalog_instagram_content_batch`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-batch.md) - [`solari_insight_instagram_brand_ad_posts`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-ad-posts.md) ### solari insight instagram brand ad stats > How much an Instagram brand has advertised. - **CLI**: `solari insight instagram brand ad stats` - **MCP tool**: `solari_insight_instagram_brand_ad_stats` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Exact counts for a brand's recent ads: sponsored posts, creators, and a play-count sum. **When to use it** — When the answer is a number. Use this instead of counting the ids brand overview returns. **What comes back** — Ad post count, creator count, and a play-count sum. #### Parameters - `username` (string, required) — Brand Instagram username, without @. #### Response ##### `Response` - `total_ad_posts` (integer) — Sponsored posts in the window. Exact. - `unique_creator_count` (integer) — Distinct collaborating creators. - `total_play_count` (integer) — Sum of plays. - `play_count_covered_posts` (integer) — Posts included in the play sum. Lower than total_ad_posts means a lower bound. - `window_months` (integer) — Length of the window in months. #### Example ```console $ solari insight instagram brand ad stats username=innisfreeofficial ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "total_ad_posts": 405, "unique_creator_count": 360, "total_play_count": 27357941, "play_count_covered_posts": 405, "window_months": 3 } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_brand_ad_stats", "arguments": { "username": "innisfreeofficial" } } ``` #### Notes - Pass a username, not an account_id. #### Related tools - [`solari_insight_instagram_brand_ad_posts`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-ad-posts.md) - [`solari_insight_instagram_brand_overview`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-overview.md) ### solari insight instagram brand ad posts > An Instagram brand's ad posts. - **CLI**: `solari insight instagram brand ad posts` - **MCP tool**: `solari_insight_instagram_brand_ad_posts` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 A brand's ad posts, with the creator attached. **When to use it** — When you want the posts themselves, not just the totals. **What comes back** — Ad posts. The total is exact only when sort=recent. #### Parameters - `username` (string, required) — Brand Instagram username, without @. - `sort` (enum, optional, default "recent") — recent walks the full window. engagement ranks a recent slice. Values: `recent`, `engagement`. - `months` (integer, optional, default 3, 1–24) — How many months back to look. - `limit` (integer, optional, default 50, 1–200) — How many posts per page. - `offset` (integer, optional, default 0, ≥ 0) — How many posts to skip. #### Response ##### `Response` - `items` (object[]) — Sponsored posts. - `total` (integer) — Exact count across the window when sort=recent. - `has_more` (boolean) — Whether there is another page. - `ranking_window` (integer | null) — How far engagement ranking looked. Set when order covers a slice, not the whole window. ##### `items[]` - `id` (uuid) — Post id. - `slug` (string) — Instagram shortcode. - `text` (string) — Caption. - `posted_at` (timestamp) — Published at (UTC). - `username / user_id / account_id` (string) — The authoring creator. - `like_count / comment_count / play_count` (integer) — Engagement. - `media_type` (string) — Post format. - `media / media_url / thumbnail_url` (string) — Media links. - `virtual_campaign` (object | null) — Campaign grouping, when one is resolved. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari insight instagram brand ad posts username=innisfreeofficial limit=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "items": [ { "id": "01a062a0-2747-72eb-b20d-670cf30f2c96", "slug": "DcygG05GrA-", "text": "#광고 요즘 부쩍 신경 쓰이기 시작한 모공 고민을 직접 경험해보고 싶어 방문한 이니스프리 레티놀 시카 강의실 무빙 팝업💙\n\n업그레이드된 레티놀 시카 모공 흔적 앰플을 직접 테스트해볼 수 있을 뿐 아니라, 제품을 알아보고 체험할 수 있는 다양한 프로그램과 이벤트가 마련되어 있어 더욱 재미있게 둘러볼 수 있었어요.\n\n특히 오늘 방문했을 때는 정말 많은 분들이 찾아와서 놀랐는데요. 대기 줄이 길게 …", "posted_at": "2026-09-02T14:56:19Z", "virtual_campaign": null, "username": "_mini_mming", "user_id": "018caf92-e08a-78a2-b9c3-59f6f5740182", "profile_picture_url": null, "like_count": 384, "comment_count": 4, "thumbnail_url": null, "media_url": null, "media": [], "media_type": "post", "account_id": "018caf92-e08a-78a2-b9c3-59f6f5740182" }, "… 1 more" ], "total": 405, "has_more": true, "ranking_window": null } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_brand_ad_posts", "arguments": { "username": "innisfreeofficial", "limit": 2 } } ``` #### Notes - Pass a username. Unknown usernames return 404. - sort=engagement only ranks a recent slice. ranking_window tells you how far it looked. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_insight_instagram_brand_ad_stats`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-ad-stats.md) - [`solari_insight_instagram_account_ad_posts`](https://clip-pub.bzine.co/docs/tools/insight-instagram-account-ad-posts.md) ### solari insight instagram brand top collaborators > Creators who have collaborated with an Instagram brand. - **CLI**: `solari insight instagram brand top collaborators` - **MCP tool**: `solari_insight_instagram_brand_top_collaborators` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Creators who have run ads for a brand, ranked by how often. **When to use it** — When you want to see who a brand has worked with. The creator-side view is account collabs. **What comes back** — Creators ordered by collaboration count. #### Parameters - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Pass the brand's account_id or username. - `username` (string, optional, ≤ 64 chars) — Brand username. Ignored when account_id is set. - `promotion` (enum, optional, default "all") — All posts, promotion posts only, or non-promotion only. Values: `all`, `true_only`, `false_only`. - `limit` (integer, optional, default 20, 1–1000) — How many creators to return. - `offset` (integer, optional, default 0, ≥ 0) — How many creators to skip. #### Response ##### `Response` - `brand_id` (uuid) — The resolved brand account_id. - `promotion_filter` (string) — The promotion filter applied. - `items` (object[]) — Creators, collaboration count descending. - `total_count` (integer) — Creators matching the filter. ##### `items[]` - `creator_id` (uuid) — Creator account_id. - `username / full_name` (string) — Username and display name. - `profile_pic_url` (string) — Profile picture. - `follower_count` (integer) — Follower count. - `collaboration_count` (integer) — Collaboration posts with the brand. #### Example ```console $ solari insight instagram brand top collaborators username=innisfreeofficial limit=5 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "brand_id": "018cabce-14cc-7544-8890-7811ec33ef74", "promotion_filter": "all", "items": [ { "creator_id": "0195474c-8ee3-7690-a385-71b2913e31b5", "username": "donge_cos", "full_name": "💞동이💞", "profile_pic_url": "https://dcr.bzine.co/instagram/users/donge_cos/profile-picture", "follower_count": 83354, "collaboration_count": 31 }, { "creator_id": "018ecc75-55d8-70a7-a348-d370aa504ed9", "username": "beinny_motd", "full_name": "베이니 BEINNY", "profile_pic_url": "https://dcr.bzine.co/instagram/users/beinny_motd/profile-picture", "follower_count": 205754, "collaboration_count": 29 }, "… 3 more" ], "total_count": 2331 } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_brand_top_collaborators", "arguments": { "username": "innisfreeofficial", "limit": 5 } } ``` #### Notes - To load their posts, pass creator_id values to brand collaborator posts, 100 at a time. #### Related tools - [`solari_insight_instagram_brand_collaborator_posts`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-collaborator-posts.md) - [`solari_insight_instagram_account_collabs`](https://clip-pub.bzine.co/docs/tools/insight-instagram-account-collabs.md) ### solari insight instagram brand collaborator posts > Ad posts from creators who collaborated with a brand. - **CLI**: `solari insight instagram brand collaborator posts` - **MCP tool**: `solari_insight_instagram_brand_collaborator_posts` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Load ad posts from up to 100 creators for a brand. This is all-time, not a recent window. **When to use it** — When you need posts from many creators at once. **What comes back** — Per-creator totals and the posts, sorted by engagement. #### Parameters - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Pass the brand's account_id or username. - `username` (string, optional, ≤ 64 chars) — Brand username. Ignored when account_id is set. - `account_ids` (uuid[], required, 1–100 items, uuid) — Creator account_ids to load, up to 100. #### Response ##### `Response` - `(top level)` (object[]) — Creators, as a top-level array. ##### `[]` - `user_id` (uuid) — Creator account_id. - `username / full_name` (string) — Username and display name. - `follower_count` (integer) — Follower count. - `post_count` (integer) — Posts targeting the brand. - `reels_count / images_count` (integer) — Breakdown by format. - `posts` (object[]) — The posts: id, slug, text, posted_at, like_count, comment_count, play_count. - `like_count_avg / comment_count_avg` (number | null) — Mean engagement, when computed. - `posts[].assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `posts[].assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari insight instagram brand collaborator posts username=innisfreeofficial account_ids='["0195474c-8ee3-7690-a385-71b2913e31b5","018ecc75-55d8-70a7-a348-d370aa504ed9"]' ``` _Long strings and repeated array entries are trimmed for readability._ ```json [ { "user_id": "018ecc75-55d8-70a7-a348-d370aa504ed9", "username": "beinny_motd", "full_name": "베이니 BEINNY", "post_count": 29, "follower_count": 205754, "reels_count": 1, "images_count": 28, "posts": [ { "id": "019c98bc-a666-717d-a5fe-ea96f1345042", "slug": "ByVKkIbnQ8S", "text": "#이니스프리 에서 새롭게 출시된 #구름블러틴트 ☁️💓\n비비드 코튼 잉크 블러버젼이에용\n.\n요즘 이런 블러틴트류 많이 출시돼서 넘 행복해요🥺💛\n이니스프리 블러틴트는 보송보송한 마무리지만 꽤 촉촉하고 가볍게 발리더라구요! 발림성 넘 좋았어요✨\n총 8가지 컬러인데 그중 제 맘에 드는 4가지 컬러는 입술에 발색해서 보여드려용 :) 특히 로즈+핑크 섞인듯한 2호 #로제핑크 완전 추천👍🏻✨\n가격은 9, …", "posted_at": "2019-06-05T14:02:19Z", "virtual_campaign": null, "like_count": 2399, "comment_count": 20, "play_count": null, "username": "beinny_motd", "user_id": "018ecc75-55d8-70a7-a348-d370aa504ed9" }, "… 10 more" ], "like_count_avg": null, "comment_count_avg": null, "synced_at": null }, "… 1 more" ] ``` #### As an MCP call ```json { "name": "solari_insight_instagram_brand_collaborator_posts", "arguments": { "username": "innisfreeofficial", "account_ids": [ "0195474c-8ee3-7690-a385-71b2913e31b5", "018ecc75-55d8-70a7-a348-d370aa504ed9" ] } } ``` #### Notes - account_ids can be a JSON array or a comma-separated list, up to 100. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_insight_instagram_brand_top_collaborators`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-top-collaborators.md) - [`solari_insight_instagram_brand_overview`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-overview.md) ### solari insight instagram brand lookalike content > Use this to find posts similar to a brand's ads. - **CLI**: `solari insight instagram brand lookalike content` - **MCP tool**: `solari_insight_instagram_brand_lookalike_content` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Find posts similar to a brand's top-performing ads. Useful for creative references. **When to use it** — When you want references, not a measure of ad volume. **What comes back** — Similar posts, plus the brand ads used as the starting point. #### Parameters - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Pass the brand's account_id or username. - `username` (string, optional, ≤ 64 chars) — Brand username. Ignored when account_id is set. - `limit` (integer, optional, default 30, 1–50) — How many similar posts to return. - `region` (string, optional, default "KR") — Country code such as KR or JP. #### Response ##### `Response` - `items` (object[]) — Lookalike posts. - `basis` (object[]) — The brand's own ad posts the search started from. - `region` (string) — Region the search was scoped to. ##### `items[] · basis[]` - `post_id` (uuid) — Post id for other content tools. - `slug` (string) — Shortcode from the public URL. - `author_id` (uuid) — Author account_id. - `username` (string) — Author username. - `full_name` (string | null) — Display name. - `profile_pic_url` (string | null) — Profile picture URL. - `follower_count` (integer | null) — Author follower count. - `region` (string | null) — Author region. - `posted_at` (timestamp) — Published at (UTC). - `media_type` (string) — image, video, or carousel. - `play_count` (integer | null) — Video plays. Null for images. - `like_count` (integer | null) — Likes. - `text` (string | null) — Caption. - `media_url` (string) — Media URL. - `thumbnail_url` (string) — Thumbnail URL. - `score` (number | null) — Ranking score. Null outside ranked lists. - `efficiency_score` (number | null) — Performance vs. the author's followers. - `est_percentile` (number | null) — Region percentile, 0–1. - `total_views_3m` (integer | null) — Author views in the last 3 months. - `median_views_3m` (integer | null) — Author median views in the last 3 months. - `recent_collab_brands` (string[]) — Brands the author recently collaborated with. - `item_type` (string) — Item type. Always "content". - `content_source` (string | null) — Which feed the post came from. Null when not from a feed. - `is_saved` (boolean | null) — Whether you saved this post in SOLARI. Null when unknown. - `updated_at` (timestamp | null) — When metrics were last refreshed. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari insight instagram brand lookalike content username=innisfreeofficial limit=3 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "items": [ { "item_type": "content", "post_id": "019ecb92-a677-7421-8ed6-752efe3d99d0", "author_id": "0196cb39-870a-7a76-9773-0b95789c877d", "username": "boo_rookie", "full_name": null, "profile_pic_url": null, "follower_count": null, "region": null, "posted_at": "2026-06-11T08:14:37Z", "media_type": "video", "play_count": 427258, "like_count": null, "score": null, "efficiency_score": null, "est_percentile": null, "updated_at": null, "media_url": "https://smr-images-b.bzine.co/users/0196cb39-870a-7a76-9773-0b95789c877d/posts/019ecb92-a677-7421-8ed6-752efe3d99d0/medias/019ecb92-a92e-7fc8-b644-69b930f2e197.mp4", "thumbnail_url": "https://bzine.co/cdn-cgi/media/width=480,mode=frame,time=100ms/https://smr-images-a.bzine.co/users/0196cb39-870a-7a76-9773-0b95789c877d/posts/019ecb92-a677-7421-8ed6-752efe3d99d0/medias/019ecb92-a92e-7fc8-b644-69b930f2e1 …", "slug": "DZcD8KXxKwd", "text": null, "brand_match_score": null, "recent_collab_brands": [], "total_views_3m": null, "median_views_3m": null, "is_saved": null, "content_source": "lookalikes_by_top_ad" }, "… 2 more" ], "basis": [ { "item_type": "content", "post_id": "01a04c73-3ec3-7873-9e84-334c644abfe4", "author_id": "0196c474-c96e-71ad-aceb-61af051c81d3", "username": "hwitto_", "full_name": null, "profile_pic_url": null, "follower_count": null, "region": null, "posted_at": null, "media_type": "video", "play_count": 155729, "like_count": null, "score": null, "efficiency_score": null, "est_percentile": null, "updated_at": null, "media_url": "https://smr-images-a.bzine.co/users/0196c474-c96e-71ad-aceb-61af051c81d3/posts/01a04c73-3ec3-7873-9e84-334c644abfe4/medias/01a04c73-4036-7a83-a52a-97b0058e6732.mp4", "thumbnail_url": "https://bzine.co/cdn-cgi/media/width=480,mode=frame,time=100ms/https://smr-images.bzine.co/users/0196c474-c96e-71ad-aceb-61af051c81d3/posts/01a04c73-3ec3-7873-9e84-334c644abfe4/medias/01a04c73-4036-7a83-a52a-97b0058e6732 …", "slug": "DckGrZ6vZiU", "text": null, "brand_match_score": null, "recent_collab_brands": [], "total_views_3m": null, "median_views_3m": null, "is_saved": null, "content_source": "lookalikes_by_top_ad" }, "… 5 more" ], "region": "KR" } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_brand_lookalike_content", "arguments": { "username": "innisfreeofficial", "limit": 3 } } ``` #### Notes - If basis is empty, there are no ad posts to start from yet. #### Related tools - [`solari_insight_instagram_content_similar`](https://clip-pub.bzine.co/docs/tools/insight-instagram-content-similar.md) - [`solari_insight_instagram_brand_ad_posts`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-ad-posts.md) - [`solari_catalog_instagram_content_search`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-search.md) ### solari catalog instagram account profile > An Instagram account's profile, performance, and recent posts. - **CLI**: `solari catalog instagram account profile` - **MCP tool**: `solari_catalog_instagram_account_profile` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 An Instagram account's profile, view metrics, and a preview of recent posts and collaborations. **When to use it** — When you want a full picture of an account. Recent posts and collabs come with it. **What comes back** — Profile, performance, and recent posts and collabs. #### Parameters - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Pass account_id or username. - `username` (string, optional, ≤ 64 chars) — Instagram username. Ignored when account_id is set. #### Response ##### `Response` - `user_id` (uuid) — The account_id. - `username / full_name / bio` (string) — Username, display name, and bio. - `follower_count / following_count` (integer) — Follower and following counts. - `total_post_count` (integer) — Lifetime post count. - `post_count_3m` (integer) — Posts in the last 3 months. - `is_verified` (boolean) — Verification badge. - `account_type` (string) — Account character inferred by SOLARI (brand, creator, …). - `median_views_cur` (integer) — Median views in the current window. - `total_views_cur` (integer) — Total views in the current window. - `ad_count_cur` (integer) — Sponsored posts in the current window. - `median_views_growth_m1` (number) — Median-view change vs. the previous month, as a ratio. - `total_views_growth_m1` (number) — Total-view change vs. the previous month, as a ratio. - `median_views_region_pct` (number) — Median-view percentile within the region, 0–1. - `total_views_region_pct` (number) — Total-view percentile within the region, 0–1. - `recent_posts` (object[]) — Recent post previews. - `recent_collabs` (object[]) — Recent ad-collaboration previews. - `fetched_on_demand` (boolean) — true if the account was fetched live on this call. - `collected_at` (timestamp) — When the profile was last collected from Instagram (UTC). - `refreshes_regularly` (boolean) — Whether the account is re-collected on a schedule. #### Example ```console $ solari catalog instagram account profile username=innisfreeofficial ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "user_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "full_name": "INNISFREE | 이니스프리", "bio": "NATURE MEETS KOREAN SKIN SCIENCE", "profile_pic_url": "https://dcr.bzine.co/instagram/users/innisfreeofficial/profile-picture", "follower_count": 847619, "total_post_count": 4131, "post_count_3m": 100, "following_count": 17, "is_verified": true, "median_views_cur": 12409, "ad_count_cur": 0, "total_views_cur": 685771, "median_views_growth_m1": 0.04956440835659308, "total_views_growth_m1": 0.39407867587418205, "median_views_region_pct": 0.1736183168163037, "total_views_region_pct": 0.1457900950723917, "recent_posts": [ { "post_id": "01a06275-d974-7fda-98ee-dd3ee15b4dcf", "slug": "DcyMAmUh6FZ", "media_type": "video", "media_url": "https://smr-images-b.bzine.co/users/018cabce-14cc-7544-8890-7811ec33ef74/posts/01a06275-d974-7fda-98ee-dd3ee15b4dcf/medias/01a06275-db2b-77f7-a020-b4beb744771f.mp4", "thumbnail_url": "https://bzine.co/cdn-cgi/media/width=480,mode=frame,time=0ms/https://smr-images.bzine.co/users/018cabce-14cc-7544-8890-7811ec33ef74/posts/01a06275-d974-7fda-98ee-dd3ee15b4dcf/medias/01a06275-db2b-77f7-a020-b4beb744771f.m …", "text": "Deeply hydrated skin—NO OFF HOURS. 💚\nwherever the day takes MINGYU (@min9yu_k)—his hydration stays SUPERCHARGED ⚡️\n\nGreen Tea Ceramide Milk: Lightweight milky toner that won‘t clog your pores\nGreen Tea Ceramide Mist: Tou …", "play_count": 22467, "like_count": 3224, "video_media_count": 0, "media_count": 1 }, "… 5 more" ], "recent_collabs": [], "account_type": "brand", "fetched_on_demand": false } ``` #### As an MCP call ```json { "name": "solari_catalog_instagram_account_profile", "arguments": { "username": "innisfreeofficial" } } ``` #### Notes - This reads the catalog only. If the account is not in the catalog yet, run solari fetch instagram account username=… then retry. - A not-found error means the handle is not in the catalog. If it says the handle was renamed or deleted, Instagram has no account under that name, so search by display name instead. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_catalog_instagram_account_posts`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-posts.md) - [`solari_catalog_instagram_account_history`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-history.md) - [`solari_insight_instagram_account_collabs`](https://clip-pub.bzine.co/docs/tools/insight-instagram-account-collabs.md) - [`solari_catalog_tiktok_account_profile`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-profile.md) ### solari catalog instagram account posts > Posts from an Instagram account. - **CLI**: `solari catalog instagram account posts` - **MCP tool**: `solari_catalog_instagram_account_posts` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 List an Instagram account's posts with media, tags, and likes. You can filter by date or format. **When to use it** — When you need more posts than the profile preview, or a date range or format. **What comes back** — Posts, including carousel slides and tagged accounts or hashtags. #### Parameters - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Pass account_id or username. - `username` (string, optional, ≤ 64 chars) — Instagram username. Ignored when account_id is set. - `limit` (integer, optional, default 12, 1–200) — How many posts per page. - `offset` (integer, optional, default 0, ≥ 0) — How many posts to skip. - `since` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only posts on or after this UTC date (YYYY-MM-DD). - `until` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only posts on or before this UTC date (YYYY-MM-DD). - `post_type` (enum, optional) — Limit to reel, video, photo, or carousel. Values: `reel`, `video`, `photo`, `carousel`. #### Response ##### `Response` - `found` (boolean) — false if the username is not on Instagram. - `account_id / username` (string) — The resolved account. - `total` (integer) — Number of posts matching the filters. - `has_more` (boolean) — Whether there is another page. - `items` (object[]) — Posts, newest first. - `fetched_on_demand` (boolean) — true when only the most recent posts are available so far. - `collected_at` (timestamp) — When the profile was last collected from Instagram (UTC). - `posts_collected_at` (timestamp) — How far the stored posts reach (UTC). Later posts are not in the catalog yet. - `refreshes_regularly` (boolean) — Whether the account is re-collected on a schedule. - `stored_post_count / profile_post_count` (integer) — Posts stored in the catalog vs. the post count shown on the profile. A much lower stored count means collection is incomplete. - `refreshed` (boolean) — true if a stored copy older than a day was re-collected for this call. - `note` (string | null) — Why the result may be incomplete, or why found is false (the handle was renamed or deleted). ##### `items[]` - `post_id` (uuid) — SOLARI post id. - `slug` (string) — Instagram shortcode. - `url` (string) — Public permalink. - `post_type` (string) — reel, video, photo, or carousel. - `posted_at` (timestamp) — Published at (UTC). - `text` (string) — Caption. - `like_count / comment_count / play_count` (integer) — Engagement. - `media_count` (integer) — Number of media items. - `is_paid_partnership` (boolean | null) — Instagram paid-partnership label. - `medias` (object[]) — Every media in carousel order. - `medias[].tags` (object[]) — Accounts and hashtags tagged on the media. - `thumbnail_url` (string) — Thumbnail. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari catalog instagram account posts username=innisfreeofficial limit=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "found": true, "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "fetched_on_demand": false, "total": 4196, "has_more": true, "items": [ { "post_id": "01a06275-d974-7fda-98ee-dd3ee15b4dcf", "slug": "DcyMAmUh6FZ", "url": "https://www.instagram.com/p/DcyMAmUh6FZ/", "post_type": "reel", "posted_at": "2026-09-02T12:00:06+00:00", "text": "Deeply hydrated skin—NO OFF HOURS. 💚\nwherever the day takes MINGYU (@min9yu_k)—his hydration stays SUPERCHARGED ⚡️\n\nGreen Tea Ceramide Milk: Lightweight milky toner that won‘t clog your pores\nGreen Tea Ceramide Mist: Tou …", "like_count": 3224, "comment_count": 57, "play_count": 22467, "likes_hidden": false, "media_count": 1, "is_paid_partnership": false, "medias": [ { "media_type": "video", "media_url": "https://smr-images-b.bzine.co/users/018cabce-14cc-7544-8890-7811ec33ef74/posts/01a06275-d974-7fda-98ee-dd3ee15b4dcf/medias/01a06275-db2b-77f7-a020-b4beb744771f.mp4", "thumbnail_url": "https://bzine.co/cdn-cgi/media/width=480,mode=frame,time=0ms/https://smr-images.bzine.co/users/018cabce-14cc-7544-8890-7811ec33ef74/posts/01a06275-d974-7fda-98ee-dd3ee15b4dcf/medias/01a06275-db2b-77f7-a020-b4beb744771f.m …", "video_duration": 23.868000030517578, "tags": [] } ], "thumbnail_url": "https://bzine.co/cdn-cgi/media/width=480,mode=frame,time=0ms/https://smr-images.bzine.co/users/018cabce-14cc-7544-8890-7811ec33ef74/posts/01a06275-d974-7fda-98ee-dd3ee15b4dcf/medias/01a06275-db2b-77f7-a020-b4beb744771f.m …" }, "… 1 more" ] } ``` #### As an MCP call ```json { "name": "solari_catalog_instagram_account_posts", "arguments": { "username": "innisfreeofficial", "limit": 2 } } ``` #### Notes - since and until are UTC dates, and both ends are included. - post_type=reel is short-form video. video is a non-reel video. - The catalog can be sparse or stale. Run solari fetch instagram posts username=… (type=reels for views) to collect live and get the posts back directly. - When the requested dates run past posts_collected_at, an empty result does not mean the account posted nothing. Run solari fetch instagram posts username=… to collect the latest posts live. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_catalog_instagram_account_profile`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-profile.md) - [`solari_catalog_instagram_content_detail`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-detail.md) - [`solari_catalog_instagram_content_history`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-history.md) - [`solari_catalog_tiktok_account_posts`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-posts.md) ### solari catalog instagram account history > An Instagram account's follower and post counts over time. - **CLI**: `solari catalog instagram account history` - **MCP tool**: `solari_catalog_instagram_account_history` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Follower, following, and post counts of an Instagram account over time, as SOLARI recorded them. Use it to chart growth or compare accounts. **When to use it** — When you need follower growth or a trend, not just today's numbers. **What comes back** — Recorded values, oldest first, plus the account's current values. #### Parameters - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Pass account_id or username. - `username` (string, optional, ≤ 64 chars) — Instagram username. Ignored when account_id is set. - `since` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — First UTC date to include (YYYY-MM-DD). - `until` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Last UTC date to include (YYYY-MM-DD). - `granularity` (enum, optional, default "day") — day keeps one point per UTC day. all keeps every point. Values: `day`, `all`. #### Response ##### `Response` - `found` (boolean) — false if the account is not in the catalog. - `account_id / username` (string) — The resolved account. - `granularity` (string) — day or all, as applied. - `since / until` (date) — The UTC date range covered. - `current` (object | null) — The catalog's current values, whatever the date range. - `points` (object[]) — Recorded values, oldest first. - `truncated` (boolean) — true if older points were dropped. Narrow since to see them. ##### `current` - `follower_count / following_count / post_count` (integer | null) — Current counts in the catalog. - `is_verified / is_private` (boolean | null) — Verification badge and private flag. - `collected_at` (timestamp | null) — When the profile was last collected from Instagram. ##### `points[]` - `captured_at` (timestamp) — When SOLARI recorded these values (UTC). - `follower_count / following_count / post_count` (integer | null) — Counts at that moment. - `is_verified / is_private` (boolean | null) — Verification badge and private flag at that moment. #### Example ```console $ solari catalog instagram account history username=innisfreeofficial since=2025-03-01 until=2025-03-07 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "found": true, "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "granularity": "day", "since": "2025-03-01", "until": "2025-03-07", "current": { "follower_count": 847643, "following_count": 17, "post_count": 4164, "is_verified": true, "is_private": false, "collected_at": "2026-09-28T05:30:38.364000Z" }, "points": [ { "captured_at": "2025-03-01T18:05:16.810000Z", "follower_count": 881841, "following_count": 22, "post_count": 3611, "is_verified": true, "is_private": false }, { "captured_at": "2025-03-02T22:08:10.426000Z", "follower_count": 881784, "following_count": 22, "post_count": 3611, "is_verified": true, "is_private": false }, { "captured_at": "2025-03-03T23:15:12.611000Z", "follower_count": 881711, "following_count": 22, "post_count": 3612, "is_verified": true, "is_private": false }, "… 4 more" ], "truncated": false } ``` #### As an MCP call ```json { "name": "solari_catalog_instagram_account_history", "arguments": { "username": "innisfreeofficial", "since": "2025-03-01", "until": "2025-03-07" } } ``` #### Notes - since and until are UTC dates, and both ends are included. Without them you get the last 90 days. - A point exists only when SOLARI collected the account, so gaps between points are normal. - Most accounts have no points from 2025-08-26 to 2025-09-27. That month was not collected and cannot be filled in. - Check current.collected_at before treating current as today's numbers. - This reads the catalog only. If the account is missing, call solari fetch instagram account username=… first. Recording starts from then; past values cannot be filled in. #### Related tools - [`solari_catalog_instagram_account_profile`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-profile.md) - [`solari_catalog_instagram_content_history`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-history.md) - [`solari_fetch_instagram_account`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-account.md) ### solari catalog instagram content history > Instagram post engagement over time. - **CLI**: `solari catalog instagram content history` - **MCP tool**: `solari_catalog_instagram_content_history` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Likes, comments, plays, and reshares of Instagram posts over time, as SOLARI recorded them. Pick posts directly, or trace an account's newest posts. **When to use it** — When you want to see how a post's numbers grew, or compare posts' growth curves. **What comes back** — One entry per post, each with recorded values, oldest first. #### Parameters - `post_ids` (uuid[], optional, ≤ 50 items, uuid) — post_ids to trace. Up to 50 together with slugs and urls. - `slugs` (string[], optional, ≤ 50 items) — Instagram shortcodes to trace. - `urls` (string[], optional, ≤ 50 items) — Public Instagram post URLs to trace. - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Trace this account's newest posts. Pass account_id or username. - `username` (string, optional, ≤ 64 chars) — Instagram username to trace. Ignored when account_id is set. - `posted_since` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Account mode: only posts published on or after this UTC date (YYYY-MM-DD). - `posted_until` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Account mode: only posts published on or before this UTC date (YYYY-MM-DD). - `limit` (integer, optional, default 20, 1–50) — Account mode: how many of the newest posts to trace. - `since` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only values recorded on or after this UTC date (YYYY-MM-DD). - `until` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only values recorded on or before this UTC date (YYYY-MM-DD). - `granularity` (enum, optional, default "day") — day keeps one point per post per UTC day. all keeps every point. Values: `day`, `all`. #### Response ##### `Response` - `found` (boolean) — Account mode: false if the account is not in the catalog. Post mode: false if none of the posts are. - `account_id / username` (string | null) — Account mode: the resolved account. - `granularity` (string) — day or all, as applied. - `items` (object[]) — One entry per post. Request order for posts, newest first for an account. - `missing` (string[]) — Post mode: the post_ids or shortcodes that are not in the catalog. ##### `items[]` - `post_id` (uuid) — SOLARI post id. - `slug` (string) — Instagram shortcode. - `url` (string) — Public permalink. - `posted_at` (timestamp) — Published at (UTC). - `account_id / username` (string) — Authoring account. - `points` (object[]) — Recorded values, oldest first. - `truncated` (boolean) — true if older points were dropped. Narrow since to see them. ##### `items[].points[]` - `captured_at` (timestamp) — When SOLARI recorded these values (UTC). - `like_count / comment_count` (integer | null) — Likes and comments at that moment. - `play_count` (integer | null) — Video plays at that moment. Null for images. - `reshare_count` (integer | null) — Reshares at that moment, when Instagram shows them. - `likes_hidden` (boolean | null) — The author hid like counts. Do not use like_count then: it is null or may not be the real count. - `deleted` (boolean) — true if the post had been deleted by then. #### Example ```console $ solari catalog instagram content history username=innisfreeofficial posted_since=2026-09-20 posted_until=2026-09-23 limit=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "found": true, "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "granularity": "day", "items": [ { "post_id": "01a0caef-bf57-7996-83af-d75cd21ab215", "slug": "DdlXQy8I10z", "url": "https://www.instagram.com/p/DdlXQy8I10z/", "posted_at": "2026-09-22T09:00:12Z", "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "points": [ { "captured_at": "2026-09-22T21:05:04.820000Z", "like_count": 80, "comment_count": 2, "play_count": null, "reshare_count": null, "likes_hidden": false, "deleted": false }, { "captured_at": "2026-09-23T21:30:43.016000Z", "like_count": 112, "comment_count": 3, "play_count": null, "reshare_count": null, "likes_hidden": false, "deleted": false }, "… 1 more" ], "truncated": false }, { "post_id": "01a0c433-73cd-7141-a458-e2eeb1441dba", "slug": "DdiychFo_91", "url": "https://www.instagram.com/p/DdiychFo_91/", "posted_at": "2026-09-21T09:00:07Z", "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "points": [ { "captured_at": "2026-09-21T20:00:23.541000Z", "like_count": 94, "comment_count": 5, "play_count": null, "reshare_count": null, "likes_hidden": false, "deleted": false }, { "captured_at": "2026-09-22T21:05:05.524000Z", "like_count": 114, "comment_count": 6, "play_count": null, "reshare_count": null, "likes_hidden": false, "deleted": false }, "… 2 more" ], "truncated": false } ], "missing": [] } ``` #### As an MCP call ```json { "name": "solari_catalog_instagram_content_history", "arguments": { "username": "innisfreeofficial", "posted_since": "2026-09-20", "posted_until": "2026-09-23", "limit": 2 } } ``` #### Notes - Pass posts (post_ids, slugs, urls) or an account (account_id or username), not both. - since and until filter the recorded values. posted_since and posted_until pick which of the account's posts to trace. - Posts are re-collected mostly in their first days, so older posts have few points and gaps are normal. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. - This reads the catalog only. For a missing post, call solari fetch instagram post url=… first. Recording starts from then; past values cannot be filled in. #### Related tools - [`solari_catalog_instagram_content_detail`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-detail.md) - [`solari_catalog_instagram_account_posts`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-posts.md) - [`solari_catalog_instagram_account_history`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-history.md) - [`solari_fetch_instagram_post`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-post.md) ### solari insight instagram account collabs > An Instagram creator's recent collaborations. - **CLI**: `solari insight instagram account collabs` - **MCP tool**: `solari_insight_instagram_account_collabs` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Recent collaboration content from an Instagram creator. **When to use it** — When you want to see who a creator has collaborated with. The brand-side view is brand top collaborators. **What comes back** — Recent collaboration content. #### Parameters - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Pass the creator's account_id or username. - `username` (string, optional, ≤ 64 chars) — Creator username. Ignored when account_id is set. - `months` (integer, optional, default 3, 1–12) — How many months back to look. - `limit` (integer, optional, default 5, 1–200) — How many brands per page. - `offset` (integer, optional, default 0, ≥ 0) — How many brands to skip. #### Response ##### `Response` - `total` (integer) — Rows matching the filters. - `has_more` (boolean) — Whether there are more rows. - `items` (object[]) — Collaboration summaries, one per target brand. ##### `items[]` - `target_account_id` (uuid) — account_id of the target brand. - `target_username` (string) — Target brand username. - `collab_count` (integer) — Collaboration posts with the brand. - `last_posted_at` (timestamp) — Most recent collaboration. - `post_id / slug` (string) — Identifiers of the sample post. - `text` (string) — Sample post caption. - `like_count / play_count` (integer) — Sample post engagement. - `media_type` (string) — Sample post format. - `thumbnail_url / media_url` (string) — Sample post media. - `bio` (string) — Target brand bio. #### Example ```console $ solari insight instagram account collabs username=beinny_motd months=6 limit=3 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "items": [ { "post_id": "01a05575-7c9b-7232-8519-4a38fa061389", "target_user_id": "018cab85-8ef8-7dc9-ab0a-7044d463f65e", "target_username": "dasique_official", "collab_count": 2, "last_posted_at": "2026-08-30T05:08:56+00:00", "slug": "DcpugJ2kzv8", "text": "#광고 무겁지 않은 가을 데일리 팔레트 로즈밀크티 . .🫖🤎\n차분하고 미지근한 로즈핑크 팔레트인데\n부드러운 밀크티 무드라서 분위기가 넘 예뻐요..🥺\n\n데이지크에서 올리브영 X 산리오 콜라보\n시티팝 에디션으로 미니섀도우팔레트 4종이 출시되는데\n그 중 자주 추천드렸던 로즈밀크티, 밀크라떼가 있더라구요 !\n\nNEW 컬러 피치레코드, 모브카세트도 출시되어요🤍\n도시의 아침과 저녁 무드를 담은 데일리한 …", "play_count": 0, "media_type": "8", "like_count": 878, "video_media_count": 0, "media_count": 15, "bio": "🫒올영세일 08.30 – 09.05\nUP TO 37% SALE\n올리브영X산리오,\n🌠데이지크 🆕 미니 섀도우", "thumbnail_url": "https://bzine.co/cdn-cgi/image/fit=scale-down,width=480/https://smr-images-c.bzine.co/users/018ecc75-55d8-70a7-a348-d370aa504ed9/posts/01a05575-7c9b-7232-8519-4a38fa061389/medias/01a05575-7dd3-779e-9050-a6cb59578cb9.jpg", "media_url": "https://bzine.co/cdn-cgi/image/fit=scale-down,width=480/https://smr-images-c.bzine.co/users/018ecc75-55d8-70a7-a348-d370aa504ed9/posts/01a05575-7c9b-7232-8519-4a38fa061389/medias/01a05575-7dd3-779e-9050-a6cb59578cb9.jpg", "target_account_id": "018cab85-8ef8-7dc9-ab0a-7044d463f65e" }, "… 2 more" ], "has_more": true, "total": 7 } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_account_collabs", "arguments": { "username": "beinny_motd", "months": 6, "limit": 3 } } ``` #### Notes - For the individual ad posts, use account ad posts. #### Related tools - [`solari_insight_instagram_account_ad_posts`](https://clip-pub.bzine.co/docs/tools/insight-instagram-account-ad-posts.md) - [`solari_insight_instagram_brand_top_collaborators`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-top-collaborators.md) ### solari insight instagram account ad posts > An Instagram creator's ad posts. - **CLI**: `solari insight instagram account ad posts` - **MCP tool**: `solari_insight_instagram_account_ad_posts` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Sponsored posts from an Instagram creator. **When to use it** — When you need the ad posts themselves, not a summary. **What comes back** — Ad posts, newest first. #### Parameters - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Pass the creator's account_id or username. - `username` (string, optional, ≤ 64 chars) — Creator username. Ignored when account_id is set. - `months` (integer, optional, default 3, 1–24) — How many months back to look. - `limit` (integer, optional, default 50, 1–200) — How many rows per page. - `offset` (integer, optional, default 0, ≥ 0) — How many rows to skip. - `target` (string, optional, ≤ 64 chars) — Limit to one brand — account_id or username. #### Response ##### `Response` - `account_id / username` (string) — The resolved creator. - `months` (integer) — Lookback window applied. - `total` (integer) — Total rows. - `has_more` (boolean) — Whether there is another page. - `items` (object[]) — Post–brand pairs. ##### `items[]` - `post_id / slug / url` (string) — Post identifiers and public link. - `post_type` (string) — reel, video, photo, or carousel. - `posted_at` (timestamp) — Published at (UTC). - `text` (string) — Caption. - `like_count / comment_count / play_count` (integer) — Engagement. - `media_count` (integer) — Number of media items. - `is_paid_partnership` (boolean | null) — Instagram paid-partnership label. - `target_account_id / target_username` (string) — The brand on the row. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari insight instagram account ad posts username=beinny_motd months=6 limit=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "account_id": "018ecc75-55d8-70a7-a348-d370aa504ed9", "username": "beinny_motd", "months": 6, "total": 12, "has_more": true, "items": [ { "post_id": "01a05575-7c9b-7232-8519-4a38fa061389", "slug": "DcpugJ2kzv8", "url": "https://www.instagram.com/p/DcpugJ2kzv8/", "post_type": "carousel", "posted_at": "2026-08-30T05:08:56Z", "text": "#광고 무겁지 않은 가을 데일리 팔레트 로즈밀크티 . .🫖🤎\n차분하고 미지근한 로즈핑크 팔레트인데\n부드러운 밀크티 무드라서 분위기가 넘 예뻐요..🥺\n\n데이지크에서 올리브영 X 산리오 콜라보\n시티팝 에디션으로 미니섀도우팔레트 4종이 출시되는데\n그 중 자주 추천드렸던 로즈밀크티, 밀크라떼가 있더라구요 !\n\nNEW 컬러 피치레코드, 모브카세트도 출시되어요🤍\n도시의 아침과 저녁 무드를 담은 데일리한 …", "like_count": 878, "comment_count": 19, "play_count": 0, "media_count": 15, "is_paid_partnership": null, "target_account_id": "018cab85-8ef8-7dc9-ab0a-7044d463f65e", "target_username": "dasique_official" }, "… 1 more" ] } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_account_ad_posts", "arguments": { "username": "beinny_motd", "months": 6, "limit": 2 } } ``` #### Notes - target limits results to one brand. Pass the brand's account_id or username. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_insight_instagram_account_collabs`](https://clip-pub.bzine.co/docs/tools/insight-instagram-account-collabs.md) - [`solari_insight_instagram_brand_ad_posts`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-ad-posts.md) ### solari catalog instagram content detail > An Instagram post, by id, shortcode, or URL. - **CLI**: `solari catalog instagram content detail` - **MCP tool**: `solari_catalog_instagram_content_detail` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Load an Instagram post by post_id, shortcode, or public URL. **When to use it** — When you need a post. For many ids at once, use content batch. **What comes back** — The post, with caption and metrics. #### Parameters - `post_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — post_id. Pass this, slug, or url. - `slug` (string, optional, pattern ^[A-Za-z0-9_-]{3,20}$) — Instagram shortcode. - `url` (string, optional, ≤ 512 chars) — Public Instagram post URL. #### Response ##### `Response` - `item` (object | null) — The post. null if it does not exist or is not public. - `fetched_on_demand` (boolean) — true if the post was fetched live on this call. - `note` (string) — Only when item is null: what to do next. - `next` (string) — Only when item is null and the post was given by URL or shortcode: the fetch post command that collects it. ##### `item` - `post_id` (uuid) — Post id for other content tools. - `slug` (string) — Shortcode from the public URL. - `author_id` (uuid) — Author account_id. - `username` (string) — Author username. - `full_name` (string | null) — Display name. - `profile_pic_url` (string | null) — Profile picture URL. - `follower_count` (integer | null) — Author follower count. - `region` (string | null) — Author region. - `posted_at` (timestamp) — Published at (UTC). - `media_type` (string) — image, video, or carousel. - `play_count` (integer | null) — Video plays. Null for images. - `like_count` (integer | null) — Likes. - `text` (string | null) — Caption. - `media_url` (string) — Media URL. - `thumbnail_url` (string) — Thumbnail URL. - `score` (number | null) — Ranking score. Null outside ranked lists. - `efficiency_score` (number | null) — Performance vs. the author's followers. - `est_percentile` (number | null) — Region percentile, 0–1. - `total_views_3m` (integer | null) — Author views in the last 3 months. - `median_views_3m` (integer | null) — Author median views in the last 3 months. - `recent_collab_brands` (string[]) — Brands the author recently collaborated with. - `item_type` (string) — Item type. Always "content". - `content_source` (string | null) — Which feed the post came from. Null when not from a feed. - `is_saved` (boolean | null) — Whether you saved this post in SOLARI. Null when unknown. - `updated_at` (timestamp | null) — When metrics were last refreshed. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari catalog instagram content detail slug=DcyMAmUh6FZ ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "item": { "item_type": "content", "post_id": "01a06275-d974-7fda-98ee-dd3ee15b4dcf", "author_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "full_name": "INNISFREE | 이니스프리", "profile_pic_url": "https://dcr.bzine.co/instagram/users/innisfreeofficial/profile-picture", "follower_count": 847619, "region": null, "posted_at": "2026-09-02T12:00:06Z", "media_type": "video", "play_count": 22467, "like_count": 3224, "score": null, "efficiency_score": null, "est_percentile": null, "updated_at": null, "media_url": "https://smr-images-b.bzine.co/users/018cabce-14cc-7544-8890-7811ec33ef74/posts/01a06275-d974-7fda-98ee-dd3ee15b4dcf/medias/01a06275-db2b-77f7-a020-b4beb744771f.mp4", "thumbnail_url": "https://bzine.co/cdn-cgi/media/width=480,mode=frame,time=0ms/https://smr-images.bzine.co/users/018cabce-14cc-7544-8890-7811ec33ef74/posts/01a06275-d974-7fda-98ee-dd3ee15b4dcf/medias/01a06275-db2b-77f7-a020-b4beb744771f.m …", "slug": "DcyMAmUh6FZ", "text": "Deeply hydrated skin—NO OFF HOURS. 💚\nwherever the day takes MINGYU (@min9yu_k)—his hydration stays SUPERCHARGED ⚡️\n\nGreen Tea Ceramide Milk: Lightweight milky toner that won‘t clog your pores\nGreen Tea Ceramide Mist: Tou …", "brand_match_score": null, "recent_collab_brands": [], "total_views_3m": null, "median_views_3m": null, "is_saved": null, "content_source": null }, "fetched_on_demand": false } ``` #### As an MCP call ```json { "name": "solari_catalog_instagram_content_detail", "arguments": { "slug": "DcyMAmUh6FZ" } } ``` #### Notes - url can be any /p/, /reel/, or /tv/ link — the shortcode is picked out for you. - This reads the catalog only. To collect an untracked post, call solari fetch instagram post url=… (it also tells you the author), or solari fetch instagram posts username=… when you already know the author. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_fetch_instagram_post`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-post.md) - [`solari_catalog_instagram_content_batch`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-batch.md) - [`solari_catalog_instagram_content_history`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-history.md) - [`solari_catalog_instagram_account_posts`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-posts.md) ### solari catalog instagram content batch > Several Instagram posts at once. - **CLI**: `solari catalog instagram content batch` - **MCP tool**: `solari_catalog_instagram_content_batch` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Load captions and metrics for a list of post ids. Ids that cannot be found are skipped. **When to use it** — When you have ids from brand overview or a feed and want the posts. **What comes back** — The posts that were found. #### Parameters - `post_ids` (uuid[], required, 1–100 items, uuid) — post_ids to load, up to 100. - `sort` (enum, optional, default "recent") — Order by newest, or by engagement. Values: `recent`, `engagement`. #### Response ##### `Response` - `items` (object[]) — The posts found. - `requested` (integer) — How many ids were sent. - `found` (integer) — How many resolved. Untracked ids are dropped, so this can be lower. ##### `items[]` - `id` (uuid) — Post id. - `slug` (string) — Instagram shortcode. - `text` (string) — Caption. - `posted_at` (timestamp) — Published at (UTC). - `username / user_id / account_id` (string) — Authoring account. - `like_count / comment_count` (integer) — Engagement. - `play_count` (integer | null) — Video plays. - `media_type` (string) — Post format. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari catalog instagram content batch post_ids='["019f505f-f8be-7e88-ae08-6fba999950b1","019f5060-3449-779e-a08b-d6d49add90cd"]' ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "items": [ { "id": "019f505f-f8be-7e88-ae08-6fba999950b1", "slug": "Dam_BYyJxtR", "text": "#광고 ₊✩‧₊˚ @innisfreeofficial ˚₊✩‧₊ \n공들인 나의 화장.. 찜통 더위에 무너져 내릴때\n이니스프리 노세범 선 파우더 하나면 고민 끝!\n\n유분 가득한 피부.. 꺼진 부위, 모공, 요철 부각되어\n10년은 늙어보이는 몰골에서 노세범 선 파우더 바르는\n즉시 핑크빛 필터를 씌운 듯~ 뽀용 피부 완성 ⭒˚.⋆\n\n노세범 맛집 답게 과다 피지와 유분을 즉각 흡착시키고\n무엇보다 가벼 …", "posted_at": "2026-07-10T10:34:01Z", "virtual_campaign": null, "username": "the_ketchap", "user_id": "018d3b53-c0c1-71cc-a44f-204f7d850267", "profile_picture_url": null, "like_count": 38579, "comment_count": 31, "thumbnail_url": null, "media_url": null, "media": [], "media_type": "reel", "play_count": 676825, "account_id": "018d3b53-c0c1-71cc-a44f-204f7d850267" }, "… 1 more" ], "requested": 2, "found": 2 } ``` #### As an MCP call ```json { "name": "solari_catalog_instagram_content_batch", "arguments": { "post_ids": [ "019f505f-f8be-7e88-ae08-6fba999950b1", "019f5060-3449-779e-a08b-d6d49add90cd" ] } } ``` #### Notes - This takes SOLARI post ids only. Shortcodes go to content detail as slug. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_catalog_instagram_content_detail`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-detail.md) - [`solari_insight_instagram_brand_overview`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-overview.md) ### solari catalog instagram content search > Use this to search Instagram captions, bios, and video transcripts. - **CLI**: `solari catalog instagram content search` - **MCP tool**: `solari_catalog_instagram_content_search` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Keyword search over tracked Instagram posts in KR, JP, US, and TW, covering about the last six months. **When to use it** — When you want posts about a topic. If you need a count, use content aggregate. **What comes back** — Posts ranked by relevance, with matching text highlighted. #### Parameters - `query` (string, required) — Words to search for. - `region` (enum, optional, default "KR") — KR, JP, US, or TW. Values: `KR`, `JP`, `US`, `TW`. - `limit` (integer, optional, default 20, 1–100) — How many posts per page. - `offset` (integer, optional, default 0, ≥ 0) — How many posts to skip. - `since` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only posts on or after this UTC date (YYYY-MM-DD). - `until` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only posts on or before this UTC date (YYYY-MM-DD). #### Response ##### `Response` - `query / region` (string) — The query and region applied. - `total` (integer) — Total matches. Exact up to 10,000, then saturates. - `took_ms` (integer) — Search time. - `items` (object[]) — Hits, score descending. ##### `items[]` - `post_id` (uuid) — SOLARI post id. - `slug` (string) — Instagram shortcode. - `account_id / author_id / username` (string) — Authoring account. - `caption` (string) — Caption. - `user_bio` (string) — Author bio — part of the searched text. - `transcription_text` (string | null) — Video speech transcription. - `posted_at` (timestamp) — Published at (UTC). - `like_count / comment_count` (integer) — Engagement. - `follower_count` (integer) — Author follower count. - `score` (number) — Relevance score. Comparable only within this response. - `highlight` (object) — Matched fragments per field: caption, user_bio, transcription_text. - `is_video` (boolean) — Whether the post is a video. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari catalog instagram content search query="이니스프리 그린티" limit=3 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "query": "이니스프리 그린티", "region": "KR", "total": 10000, "took_ms": 1586, "items": [ { "post_id": "019f12d8-3e72-78e9-b7e5-39293bc56f23", "author_id": "019f12d8-3e0f-7c74-afc6-e14405bd1523", "username": "hanydiary", "caption": "[이니스프리에디터 4기 1-2 : 그린티 PDRN 아이&립 세럼] #이니스프리 #그린티PDRN 💚 자세한 포스팅은 프로필 링크 참고해주세요 :)", "user_bio": "대외활동 | 휴학생 | 취준일기 🪽과 학생회 2년 연임 🪽이니스프리 대학생 에디터 3기 / 4기", "transcription_text": null, "posted_at": "2026-02-16T05:44:45Z", "like_count": 3, "comment_count": 3, "follower_count": 972, "score": 140.43787, "slug": "DUzrl1UkoJb", "highlight": { "caption": [ "[이니스프리에디터 4기 1-2 : 그린티 PDRN 아이&립 세럼] #이니스프리 #그린티PDRN 💚 자세한 포스팅은 프로필 링크 참고해주세요 :)" ], "user_bio": [ "대외활동 | 휴학생 | 취준일기 🪽과 학생회 2년 연임 🪽이니스프리 대학생 에디터 3기 / 4기" ], "transcription_text": [] }, "is_video": false, "media_url": null, "thumbnail_url": null, "account_id": "019f12d8-3e0f-7c74-afc6-e14405bd1523" }, "… 2 more" ] } ``` #### As an MCP call ```json { "name": "solari_catalog_instagram_content_search", "arguments": { "query": "이니스프리 그린티", "limit": 3 } } ``` #### Notes - A since older than about six months returns nothing. - total counts up to 10,000, then stops. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_insight_instagram_content_aggregate`](https://clip-pub.bzine.co/docs/tools/insight-instagram-content-aggregate.md) - [`solari_catalog_instagram_content_batch`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-batch.md) - [`solari_catalog_tiktok_content_search`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-content-search.md) ### solari insight instagram content trending > Instagram posts that are trending now. - **CLI**: `solari insight instagram content trending` - **MCP tool**: `solari_insight_instagram_content_trending` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Trending Instagram posts in the region you set, with the author's profile attached. **When to use it** — When you want what's working right now. For speed of growth, use content rising. **What comes back** — Trending posts. Use next_cursor for the next page. #### Parameters - `region` (string, optional, default "KR") — Country code such as KR or JP. - `limit` (integer, optional, default 20, 1–50) — How many posts per page. - `cursor` (string, optional) — next_cursor from the previous page. - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Brand account_id to rank toward the brand. - `username` (string, optional, ≤ 64 chars) — Brand username to rank toward the brand. Ignored when account_id is set. #### Response ##### `Response` - `items` (object[]) — Trending posts. - `total_count` (integer) — Total number of items in the feed. - `region` (string) — Region applied. - `content_type` (string) — Feed kind. - `next_cursor` (string | null) — Use as cursor on the next page. ##### `items[]` - `post_id` (uuid) — Post id for other content tools. - `slug` (string) — Shortcode from the public URL. - `author_id` (uuid) — Author account_id. - `username` (string) — Author username. - `full_name` (string | null) — Display name. - `profile_pic_url` (string | null) — Profile picture URL. - `follower_count` (integer | null) — Author follower count. - `region` (string | null) — Author region. - `posted_at` (timestamp) — Published at (UTC). - `media_type` (string) — image, video, or carousel. - `play_count` (integer | null) — Video plays. Null for images. - `like_count` (integer | null) — Likes. - `text` (string | null) — Caption. - `media_url` (string) — Media URL. - `thumbnail_url` (string) — Thumbnail URL. - `score` (number | null) — Ranking score. Null outside ranked lists. - `efficiency_score` (number | null) — Performance vs. the author's followers. - `est_percentile` (number | null) — Region percentile, 0–1. - `total_views_3m` (integer | null) — Author views in the last 3 months. - `median_views_3m` (integer | null) — Author median views in the last 3 months. - `recent_collab_brands` (string[]) — Brands the author recently collaborated with. - `item_type` (string) — Item type. Always "content". - `content_source` (string | null) — Which feed the post came from. Null when not from a feed. - `is_saved` (boolean | null) — Whether you saved this post in SOLARI. Null when unknown. - `updated_at` (timestamp | null) — When metrics were last refreshed. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari insight instagram content trending region=KR limit=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "items": [ { "item_type": "content", "post_id": "01a055fe-d72c-7005-8709-eef67b4be6f0", "author_id": "018ecc27-f8e7-7100-9339-bb050ea44a7f", "username": "sixpackpiggy", "full_name": "Jinmin Park", "profile_pic_url": "https://dcr.bzine.co/instagram/users/sixpackpiggy/profile-picture", "follower_count": 93442, "region": "KR", "posted_at": "2026-08-29T02:02:20Z", "media_type": "video", "play_count": 286749, "like_count": null, "score": 96.69330916066565, "efficiency_score": null, "est_percentile": 96.69330916066565, "updated_at": "2026-09-03T04:51:42.797111Z", "media_url": "https://smr-images-b.bzine.co/users/018ecc27-f8e7-7100-9339-bb050ea44a7f/posts/01a055fe-d72c-7005-8709-eef67b4be6f0/medias/01a055fe-d964-7d73-9a77-d06823a2abc2.mp4", "thumbnail_url": "https://bzine.co/cdn-cgi/media/width=480,mode=frame,time=0ms/https://smr-images.bzine.co/users/018ecc27-f8e7-7100-9339-bb050ea44a7f/posts/01a055fe-d72c-7005-8709-eef67b4be6f0/medias/01a055fe-d964-7d73-9a77-d06823a2abc2.m …", "slug": "Dcmzs05SAae", "text": "How dedicated are you to your Korean skincare? 💅@patinaosaka \n#koreanskincare #osaka #japan #kbeauty #traveling", "brand_match_score": null, "recent_collab_brands": [], "total_views_3m": 1875678, "median_views_3m": 57780, "is_saved": false, "content_source": null }, "… 1 more" ], "total_count": 213635, "region": "KR", "content_type": "trending", "next_cursor": "eyJhcyI6ICIyMDI2LTA5LTAzVDA1OjIwOjIzLjM4Mzk3NCswMDowMCIsICJzYyI6ICIyMDI2LTA5LTAzVDA0OjQ0OjQ3LjkzNTI1OCswMDowMCIsICJzcCI6ICIwMWEwNTVmZS1mOWIyLTdiNmYtYjY1OS05ZGE1OTM3NjgzMWMifQ==" } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_content_trending", "arguments": { "region": "KR", "limit": 2 } } ``` #### Notes - Pass a brand account_id or username to rank toward the brand. - Pages use a cursor, not offset. Send back next_cursor. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_insight_instagram_content_rising`](https://clip-pub.bzine.co/docs/tools/insight-instagram-content-rising.md) - [`solari_insight_instagram_content_trend_clusters`](https://clip-pub.bzine.co/docs/tools/insight-instagram-content-trend-clusters.md) ### solari insight instagram content rising > Instagram posts that are rising fast. - **CLI**: `solari insight instagram content rising` - **MCP tool**: `solari_insight_instagram_content_rising` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Instagram posts whose recent performance is accelerating, with the author's profile attached. **When to use it** — When growth rate matters more than current totals. **What comes back** — Rising posts. Use next_cursor for the next page. #### Parameters - `region` (string, optional, default "KR") — Country code such as KR or JP. - `limit` (integer, optional, default 20, 1–50) — How many posts per page. - `cursor` (string, optional) — next_cursor from the previous page. - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Brand account_id to rank toward the brand. - `username` (string, optional, ≤ 64 chars) — Brand username to rank toward the brand. Ignored when account_id is set. #### Response ##### `Response` - `items` (object[]) — Rising posts. - `total_count` (integer) — Total number of items in the feed. - `region` (string) — Region applied. - `content_type` (string) — Feed kind. - `next_cursor` (string | null) — Use as cursor on the next page. ##### `items[]` - `post_id` (uuid) — Post id for other content tools. - `slug` (string) — Shortcode from the public URL. - `author_id` (uuid) — Author account_id. - `username` (string) — Author username. - `full_name` (string | null) — Display name. - `profile_pic_url` (string | null) — Profile picture URL. - `follower_count` (integer | null) — Author follower count. - `region` (string | null) — Author region. - `posted_at` (timestamp) — Published at (UTC). - `media_type` (string) — image, video, or carousel. - `play_count` (integer | null) — Video plays. Null for images. - `like_count` (integer | null) — Likes. - `text` (string | null) — Caption. - `media_url` (string) — Media URL. - `thumbnail_url` (string) — Thumbnail URL. - `score` (number | null) — Ranking score. Null outside ranked lists. - `efficiency_score` (number | null) — Performance vs. the author's followers. - `est_percentile` (number | null) — Region percentile, 0–1. - `total_views_3m` (integer | null) — Author views in the last 3 months. - `median_views_3m` (integer | null) — Author median views in the last 3 months. - `recent_collab_brands` (string[]) — Brands the author recently collaborated with. - `item_type` (string) — Item type. Always "content". - `content_source` (string | null) — Which feed the post came from. Null when not from a feed. - `is_saved` (boolean | null) — Whether you saved this post in SOLARI. Null when unknown. - `updated_at` (timestamp | null) — When metrics were last refreshed. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari insight instagram content rising region=KR limit=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "items": [ { "item_type": "content", "post_id": "01a0495a-4e46-73d5-a111-a818248b665b", "author_id": "019e4a24-ee85-78e9-8763-602930999853", "username": "iiiwantkitty", "full_name": "주 령", "profile_pic_url": "https://dcr.bzine.co/instagram/users/iiiwantkitty/profile-picture", "follower_count": 706, "region": "KR", "posted_at": "2026-08-28T07:38:46Z", "media_type": "video", "play_count": 48092, "like_count": null, "score": 0.1292899036795201, "efficiency_score": 0.1292899036795201, "est_percentile": 84.68488691008565, "updated_at": "2026-09-03T05:20:45.496271Z", "media_url": "https://smr-images-b.bzine.co/users/019e4a24-ee85-78e9-8763-602930999853/posts/01a0495a-4e46-73d5-a111-a818248b665b/medias/01a0495a-4fc0-7352-92dd-a04afe898589.mp4", "thumbnail_url": "https://bzine.co/cdn-cgi/media/width=480,mode=frame,time=0ms/https://smr-images-a.bzine.co/users/019e4a24-ee85-78e9-8763-602930999853/posts/01a0495a-4e46-73d5-a111-a818248b665b/medias/01a0495a-4fc0-7352-92dd-a04afe898589 …", "slug": "Dck0Wj8xeq3", "text": "이정도가 아니면 뮤트라고 하지말자..⭐️ 뮤트톤 친구 입술에 빡빡 발라주고싶음\n\n컬러 보자마자 아 내꺼하자ㅡㅡ 하고 바로 겟한 것\n\n그레이애쉬,, 핑크 ,, 브라운 다 들어간 밑힌 컬러 이거 뮤트톤들이 바르면 진짜 분위기 미처버리는 립이걸랑 영상보다 실물이 더 뮤트!\n\n입술에 올리면 좀더 투명하게 올라가면서 회끼도는데 뉴트럴하면서도 팥앙금 같은 고런 깔 느낌\n안쪽에만 톡톡 발라서 쌩얼립으로도 …", "brand_match_score": null, "recent_collab_brands": [ "apieu_cosmetics", "… 8 more" ], "total_views_3m": 2389749, "median_views_3m": 5215, "is_saved": false, "content_source": null }, "… 1 more" ], "total_count": 291665, "region": "KR", "content_type": "rising", "next_cursor": "eyJhcyI6ICIyMDI2LTA5LTAzVDA1OjIwOjQ5LjA3Mjg3MiswMDowMCIsICJzYyI6ICIyMDI2LTA5LTAzVDA1OjE5OjQwLjc1NzUwOCswMDowMCIsICJzcCI6ICIwMWEwNDNmOC1hODdlLTdiMWItYjFiNi1iODliMTU2YjU0ODgifQ==" } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_content_rising", "arguments": { "region": "KR", "limit": 2 } } ``` #### Notes - Takes the same parameters as content trending, including ranking toward a brand. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_insight_instagram_content_trending`](https://clip-pub.bzine.co/docs/tools/insight-instagram-content-trending.md) - [`solari_insight_instagram_content_trend_clusters`](https://clip-pub.bzine.co/docs/tools/insight-instagram-content-trend-clusters.md) ### solari insight instagram content trend clusters > Instagram trends grouped by theme. - **CLI**: `solari insight instagram content trend clusters` - **MCP tool**: `solari_insight_instagram_content_trend_clusters` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 A trend digest for the region you set: named themes with size, movement, and a few member posts. **When to use it** — When you want the shape of the moment, not a list of posts. **What comes back** — Named clusters with a preview of member posts. #### Parameters - `region` (string, optional, default "KR") — Country code such as KR or JP. - `since_days` (integer, optional, default 7, 1–90) — How many days back to look. - `limit` (integer, optional, default 20, 1–24) — How many clusters to return. - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Brand account_id to rank clusters for the brand. - `username` (string, optional, ≤ 64 chars) — Brand username to rank clusters for the brand. Ignored when account_id is set. - `brand_aware` (boolean, optional, default true) — Rank clusters for the brand. On by default when a brand is set. #### Response ##### `Response` - `success` (boolean) — Whether the digest was generated. - `trend_count` (integer) — Clusters returned. - `header_text` (string) — Digest headline. - `region / since_days` (string · integer) — Region and lookback applied. - `brand_aware` (boolean) — Whether brand-affinity reranking was requested. - `als_applied` (boolean) — Whether the affinity model actually ran. - `trends` (object[]) — The clusters. ##### `trends[]` - `cluster_id` (string) — Cluster id. - `name` (string) — Cluster name. - `bullets` (string[]) — Sentences describing the cluster. - `count` (integer) — Member posts. - `count_delta` (integer) — Change in member posts vs. the previous period. - `growth_pct` (number) — Growth rate, percent. - `avg_play_delta` (number) — Change in average plays. - `distinct_creators` (integer) — Creators contributing to the cluster. - `creator_delta` (integer) — Change in creator count. - `is_new` (boolean) — Whether the cluster first appeared this period. - `member_thumbnails` (object[]) — Thumbnail previews of member posts. #### Example ```console $ solari insight instagram content trend clusters region=KR since_days=7 limit=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "success": true, "trend_count": 2, "header_text": "최근 7일 인기 트렌드 2개 (브랜드 컨텍스트 없음)", "brand_aware": true, "als_applied": false, "region": "KR", "since_days": 7, "directive": null, "trends": [ { "cluster_id": "01a05857-7727-74d8-8da5-4e95981aca8d", "name": "GV90의 미래형 하이테크 기능", "bullets": [ "화면이 회전하거나 시트가 뒤로 돌아가는 등 물리적으로 변형되는 자동차 내부 장치들을 직접 시연함", "… 1 more" ], "count": 7, "count_delta": 0, "growth_pct": 0, "avg_play_delta": 0, "creator_delta": 0, "distinct_creators": 3, "is_new": false, "early_zone_creator_count": null, "early_zone_creator_ratio": null, "als_member_count": null, "mean_als_score": null, "annotation": null, "group": null, "member_thumbnails": [ { "post_id": "01a030df-c4b3-739c-9214-44b3b9463c7b", "thumbnail_url": "https://bzine.co/cdn-cgi/media/width=480,mode=frame,time=100ms/https://smr-images-c.bzine.co/users/018cb4c9-da89-7b02-8efd-53ccb65c26c9/posts/01a030df-c4b3-739c-9214-44b3b9463c7b/medias/01a030df-c7c3-788e-8775-1096728e07 …", "slug": "DcP6jgRMTRv", "username": "sol.bpd", "media_url": "https://smr-images-c.bzine.co/users/018cb4c9-da89-7b02-8efd-53ccb65c26c9/posts/01a030df-c4b3-739c-9214-44b3b9463c7b/medias/01a030df-c7c3-788e-8775-1096728e07f2.mp4", "media_type": "video", "play_count": 1947419, "posted_at": "2026-08-20T04:37:17+00:00" }, "… 3 more" ] }, "… 1 more" ], "insights": null, "insight_query": null } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_content_trend_clusters", "arguments": { "region": "KR", "since_days": 7, "limit": 2 } } ``` #### Notes - This call can take up to two minutes. - Pass a brand to rank clusters for the brand. Set brand_aware=false to keep the raw order. #### Related tools - [`solari_insight_instagram_content_trending`](https://clip-pub.bzine.co/docs/tools/insight-instagram-content-trending.md) - [`solari_insight_instagram_content_rising`](https://clip-pub.bzine.co/docs/tools/insight-instagram-content-rising.md) ### solari insight instagram content aggregate > Use this to count Instagram posts. - **CLI**: `solari insight instagram content aggregate` - **MCP tool**: `solari_insight_instagram_content_aggregate` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Add up tracked posts by account, format, hashtag, mention, or keyword — for questions that need a number. **When to use it** — When you need volume, averages, or which hashtag leads. For the posts themselves, use content search. **What comes back** — Counts per group, largest first. Extra metrics only if you ask for them. #### Parameters - `region` (enum, optional, default "KR") — KR, JP, US, or TW. Values: `KR`, `JP`, `US`, `TW`. - `group_by` (enum, optional) — How to split the counts. Values: `account`, `post_type`, `hashtag`, `mention`, `caption_keyword`, `transcription_keyword`. - `interval` (enum, optional) — Add a time series at this calendar interval. Values: `day`, `week`, `month`. - `metrics` (string[], optional) — Extra metrics besides post_count. Values: `like_sum`, `like_avg`, `comment_sum`, `comment_avg`, `view_sum`, `view_avg`, `follower_avg`, `account_count`. - `query` (string, optional) — Keyword filter over captions and transcripts. - `usernames` (string[], optional) — Only these Instagram usernames. - `hashtags` (string[], optional) — Only posts that have all of these hashtags. - `mentions` (string[], optional) — Only posts that mention all of these usernames. - `post_types` (string[], optional) — Only these formats. - `since` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only posts on or after this UTC date (YYYY-MM-DD). - `until` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only posts on or before this UTC date (YYYY-MM-DD). - `limit` (integer, optional, default 20, 1–50) — How many groups to return. #### Response ##### `Response` - `region` (string) — Region aggregated. - `since` (date) — Start date actually used. - `until` (date | null) — End date actually used. - `group_by` (string | null) — Grouping applied. - `interval` (string | null) — Time interval applied. - `total_posts` (integer) — Number of posts matching the filters. - `truncated` (boolean) — true if more groups existed than limit. - `buckets` (object[]) — Groups, largest first. ##### `buckets[]` - `key` (string) — Group value. A single total when group_by is omitted. - `metrics.post_count` (integer) — Post count. Always present. - `metrics.like_sum / like_avg` (number | null) — Like total and mean, when requested. - `metrics.comment_sum / comment_avg` (number | null) — Comment total and mean, when requested. - `metrics.view_sum / view_avg` (number | null) — View total and mean, when requested. - `metrics.share_sum / collect_sum` (number | null) — TikTok-only. Always null here. - `metrics.follower_avg` (number | null) — Mean follower count of authors. - `metrics.account_count` (integer | null) — Distinct accounts in the group. - `series` (object[] | null) — Per-period breakdown, when interval is set. #### Example ```console $ solari insight instagram content aggregate group_by=hashtag query="이니스프리" metrics='["like_avg","view_sum","account_count"]' limit=5 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "region": "KR", "since": "2026-03-04", "until": null, "group_by": "hashtag", "interval": null, "total_posts": 1647, "truncated": true, "buckets": [ { "key": "이니스프리", "metrics": { "post_count": 772, "like_sum": null, "like_avg": 320.7240932642487, "comment_sum": null, "comment_avg": null, "view_sum": 9400953, "view_avg": null, "share_sum": null, "share_avg": null, "collect_sum": null, "collect_avg": null, "follower_avg": null, "account_count": 587 }, "series": null }, { "key": "광고", "metrics": { "post_count": 548, "like_sum": null, "like_avg": 373.04021937842776, "comment_sum": null, "comment_avg": null, "view_sum": 5463711, "view_avg": null, "share_sum": null, "share_avg": null, "collect_sum": null, "collect_avg": null, "follower_avg": null, "account_count": 381 }, "series": null }, "… 3 more" ] } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_content_aggregate", "arguments": { "group_by": "hashtag", "query": "이니스프리", "metrics": [ "like_avg", "view_sum", "account_count" ], "limit": 5 } } ``` #### Notes - Only post_count is filled unless you name other metrics. - Coverage is KR, JP, US, and TW, about the last six months. An earlier since is moved up to the oldest date available. - interval alone makes one bucket per period. Combined with group_by, each group gets a series. #### Related tools - [`solari_catalog_instagram_content_search`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-search.md) - [`solari_insight_tiktok_content_aggregate`](https://clip-pub.bzine.co/docs/tools/insight-tiktok-content-aggregate.md) ### solari insight instagram account discover > Find Instagram creators that fit a campaign brief. - **CLI**: `solari insight instagram account discover` - **MCP tool**: `solari_insight_instagram_account_discover` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Build a creator shortlist from a brief: what they post about, what their bio says, who they resemble, whether they're growing, and what they've advertised before. Filter by followers and 3-month views, and drop anyone matching excluded keywords. **When to use it** — When you need creators you don't know yet. If you already have a name, use catalog account search. **What comes back** — A search_id, the total found, a preview of top usernames, and the result sections. Page the full list with discover results. #### Parameters - `intent` (string, required, ≤ 300 chars) — The brief in one sentence. It becomes the result label. - `topic_keywords` (string[], optional, 1–3 items) — 2–3 phrases about the content, in the target market's language. Multi-word phrases work better. - `profile_keywords` (string[], optional, 1–2 items) — 1–2 phrases to look for in bios, such as a job title or niche. - `similar_username` (string, optional, ≤ 64 chars) — A reference creator's username. Adds creators like them. - `trending` (boolean, optional, default false) — Also add creators whose views are growing fast. - `product_query` (string, optional, ≤ 200 chars) — Short English product description. Favors creators who advertised something similar. - `follower_min` (integer, optional, ≥ 0) — Minimum followers. - `follower_max` (integer, optional, ≥ 0) — Maximum followers. - `total_views_min` (integer, optional, ≥ 0) — Minimum total views over the last 3 months. - `total_views_max` (integer, optional, ≥ 0) — Maximum total views over the last 3 months. - `median_views_min` (integer, optional, ≥ 0) — Minimum median views per post over the last 3 months. - `median_views_max` (integer, optional, ≥ 0) — Maximum median views per post over the last 3 months. - `negative_keywords` (string[], optional, 1–10 items) — Drop creators whose bio or posts contain any of these. - `media_focus` (enum, optional, default "balanced") — Favor photo or video posts when matching visual style. Values: `balanced`, `photo`, `video`. - `region` (string, optional, default "KR") — Country code such as KR, JP, or US. - `brand_account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Brand account_id. Ranks creators by fit with the brand's audience. - `brand_username` (string, optional, ≤ 64 chars) — Brand username. Ignored when brand_account_id is set. - `limit` (integer, optional, default 20, 1–60) — How many top usernames to preview. The full list is always paged separately. #### Response ##### `Response` - `search_id` (uuid) — Pass to discover results to page the full list. - `intent` (string) — The brief, as the result label. - `total` (integer) — Creators found. - `top_usernames` (string[]) — Preview of the best matches, best first. - `sections` (object[]) — How the results are grouped. - `duration_ms` (integer) — How long the search took. - `next` (string) — Command that pages the full list. ##### `sections[]` - `type` (string) — best_match for the strongest fits, full_results for the rest. - `label` (string) — Display label. - `count` (integer) — Creators in the section's first page. - `has_more` (boolean) — Whether the section continues past its first page. #### Example ```console $ solari insight instagram account discover intent="KR makeup creators for an autumn eyeshadow palette launch" topic_keywords='["가을 메이크업 팔레트","데일리 아이섀도우"]' follower_min=10000 follower_max=300000 region=KR limit=5 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "search_id": "01a0f3c2-7e41-7b9a-8d2c-5e6f1a9b3c47", "intent": "KR makeup creators for an autumn eyeshadow palette launch", "total": 184, "top_usernames": [ "beinny_motd", "donge_cos", "… 18 more" ], "sections": [ { "type": "best_match", "label": "베스트 매칭", "count": 12, "has_more": false }, { "type": "full_results", "label": "전체 결과", "count": 48, "has_more": true } ], "duration_ms": 23871, "next": "solari insight instagram account discover results search_id=01a0f3c2-7e41-7b9a-8d2c-5e6f1a9b3c47" } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_account_discover", "arguments": { "intent": "KR makeup creators for an autumn eyeshadow palette launch", "topic_keywords": [ "가을 메이크업 팔레트", "데일리 아이섀도우" ], "follower_min": 10000, "follower_max": 300000, "region": "KR", "limit": 5 } } ``` #### Notes - Give at least one of topic_keywords, profile_keywords, similar_username, product_query, or trending=true. - A broad brief can take up to a minute. - The search_id stays valid, so you can re-sort or page later without searching again. #### Related tools - [`solari_insight_instagram_account_discover_results`](https://clip-pub.bzine.co/docs/tools/insight-instagram-account-discover-results.md) - [`solari_catalog_instagram_account_search`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-search.md) - [`solari_insight_instagram_ranking_creators`](https://clip-pub.bzine.co/docs/tools/insight-instagram-ranking-creators.md) ### solari insight instagram account discover results > Page the creators found by a discover search. - **CLI**: `solari insight instagram account discover results` - **MCP tool**: `solari_insight_instagram_account_discover_results` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Page through the full creator list of one discover search. Each creator comes with profile metrics and their top recent posts. **When to use it** — After discover, when you need more than the preview or a different order. **What comes back** — One page of creators, with profile metrics and recent posts. #### Parameters - `search_id` (string, required, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — search_id from discover. - `page` (integer, optional, default 1, ≥ 1) — Page number, starting at 1. - `page_size` (integer, optional, default 20, 1–100) — How many creators per page. - `sort` (enum, optional, default "relevance") — relevance keeps the search order. The others sort by followers, median views, one-month growth, or ad count. Values: `relevance`, `follower_count`, `follower_count_asc`, `median_views_cur`, `total_views_growth_m1`, `ad_count_cur`. #### Response ##### `Response` - `search_id` (uuid) — The search being paged. - `intent` (string) — The brief. - `total` (integer) — Creators found. - `page / page_size` (integer) — Page applied. - `has_more` (boolean) — Whether there is another page. - `items` (object[]) — Creators on this page. ##### `items[]` - `account_id` (uuid) — account_id for the other tools. - `username / full_name` (string) — Handle and display name. - `bio` (string | null) — Profile bio. - `profile_pic_url` (string | null) — Profile picture URL. - `follower_count` (integer | null) — Followers. - `median_views_cur` (integer | null) — Median views per post, last 3 months. - `total_views_cur` (integer | null) — Total views, last 3 months. - `total_views_growth_m1` (number | null) — View growth over the last month. 0.27 means +27%. - `ad_count_cur` (integer | null) — Recent ad posts. - `reel_count_cur` (integer | null) — Recent reels. - `score` (number) — Match score for this search. - `rising_score` (number | null) — Growth score. Set when the creator came in through trending=true. - `bio_matched / bio_only` (boolean) — bio_matched: the bio matched. bio_only: only the bio matched, with no matching posts. - `recent_posts` (object[]) — Top recent posts: post_id, slug, media_type, media_url, thumbnail_url, text, posted_at, play_count, like_count. #### Example ```console $ solari insight instagram account discover results search_id=01a0f3c2-7e41-7b9a-8d2c-5e6f1a9b3c47 page_size=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "search_id": "01a0f3c2-7e41-7b9a-8d2c-5e6f1a9b3c47", "intent": "KR makeup creators for an autumn eyeshadow palette launch", "total": 184, "page": 1, "page_size": 2, "has_more": true, "items": [ { "user_id": "018ecc75-55d8-70a7-a348-d370aa504ed9", "username": "beinny_motd", "full_name": "베이니 BEINNY", "bio": "메이크업 · 뷰티 크리에이터", "profile_pic_url": "https://dcr.bzine.co/instagram/users/beinny_motd/profile-picture", "follower_count": 205754, "total_views_cur": 6184200, "median_views_cur": 98200, "rising_score": null, "total_views_growth_m1": 0.27, "reel_count_cur": 38, "ad_count_cur": 15, "bio_matched": true, "bio_only": false, "score": 0.0487, "recent_posts": [ { "post_id": "01a05575-7c9b-7232-8519-4a38fa061389", "slug": "DcpugJ2kzv8", "media_type": "carousel", "media_url": null, "thumbnail_url": "https://dcr.bzine.co/instagram/posts/DcpugJ2kzv8/thumbnails/m", "text": "#광고 무겁지 않은 가을 데일리 팔레트 로즈밀크티 . .🫖🤎 …", "posted_at": "2026-08-30T05:08:56+00:00", "play_count": null, "like_count": 878 }, "… 2 more" ], "account_id": "018ecc75-55d8-70a7-a348-d370aa504ed9" }, "… 1 more" ] } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_account_discover_results", "arguments": { "search_id": "01a0f3c2-7e41-7b9a-8d2c-5e6f1a9b3c47", "page_size": 2 } } ``` #### Notes - A creator can show up with no recent_posts when they matched on bio alone. - media_url is null when the media file isn't stored. thumbnail_url still works. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_insight_instagram_account_discover`](https://clip-pub.bzine.co/docs/tools/insight-instagram-account-discover.md) - [`solari_catalog_instagram_account_profile`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-profile.md) - [`solari_insight_instagram_account_collabs`](https://clip-pub.bzine.co/docs/tools/insight-instagram-account-collabs.md) ### solari insight instagram content similar > Posts similar to one Instagram post. - **CLI**: `solari insight instagram content similar` - **MCP tool**: `solari_insight_instagram_content_similar` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Find Instagram posts that look and read like one post you already have — same subject, format, and mood. Useful for collecting creative references. **When to use it** — When you start from a single post. To start from a brand's ads, use brand lookalike content. **What comes back** — Similar posts, closest first, each marked whether it's sponsored. #### Parameters - `post_id` (string, required, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — post_id of the reference post, from any content tool. - `region` (string, optional) — Country code such as KR or JP. Leave this off to search everywhere. - `limit` (integer, optional, default 20, 1–60) — How many posts per page. - `offset` (integer, optional, default 0, 0–120) — How many posts to skip. #### Response ##### `Response` - `anchor_post_id` (uuid) — The reference post. - `items` (object[]) — Similar posts, closest first. ##### `items[]` - `post_id` (uuid) — Post id for other content tools. - `id` (uuid) — Same as post_id. - `slug` (string | null) — Shortcode from the public URL. - `account_id` (uuid | null) — Author account_id. - `label` (string | null) — Author username. - `media_type` (string | null) — image, video, or carousel. - `thumbnail_url` (string | null) — Thumbnail URL. - `media_url` (string | null) — Media URL. Null when the file isn't stored. - `play_count` (integer | null) — Video plays. - `posted_at` (timestamp | null) — Published at (UTC). - `is_ad` (boolean) — Whether it was identified as sponsored. #### Example ```console $ solari insight instagram content similar post_id=01a04c73-3ec3-7873-9e84-334c644abfe4 limit=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "anchor_post_id": "01a04c73-3ec3-7873-9e84-334c644abfe4", "items": [ { "id": "019ecb92-a677-7421-8ed6-752efe3d99d0", "post_id": "019ecb92-a677-7421-8ed6-752efe3d99d0", "user_id": "0196cb39-870a-7a76-9773-0b95789c877d", "label": "boo_rookie", "thumbnail_url": "https://dcr.bzine.co/instagram/posts/DZcD8KXxKwd/thumbnails/m", "media_url": null, "media_type": "video", "play_count": 427258, "posted_at": "2026-06-11T08:14:37+00:00", "slug": "DZcD8KXxKwd", "is_ad": false, "account_id": "0196cb39-870a-7a76-9773-0b95789c877d" }, "… 1 more" ] } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_content_similar", "arguments": { "post_id": "01a04c73-3ec3-7873-9e84-334c644abfe4", "limit": 2 } } ``` #### Notes - Covers roughly the last 4 months. Paging stops at 180 results. - An unknown or very old post_id returns an empty list. #### Related tools - [`solari_insight_instagram_brand_lookalike_content`](https://clip-pub.bzine.co/docs/tools/insight-instagram-brand-lookalike-content.md) - [`solari_catalog_instagram_content_detail`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-detail.md) - [`solari_catalog_instagram_content_batch`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-batch.md) ### solari insight instagram ranking brands > Rank Instagram brands by the content around them. - **CLI**: `solari insight instagram ranking brands` - **MCP tool**: `solari_insight_instagram_ranking_brands` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Brand leaderboard for one market: brands ranked by how the posts that tag or mention them perform. Each row splits sponsored posts from organic ones, so you can read a brand's organic performance and how much of its reach is paid. **When to use it** — When you want who leads a category, where one brand stands, or how its organic (non-sponsored) content performs. For creators, use ranking creators. **What comes back** — One page of ranked brands, plus your brand's position (me) and any brand you asked to find (lookup). #### Parameters - `region` (enum, optional, default "KR") — KR, JP, or US. Values: `KR`, `JP`, `US`. - `days` (integer, optional, default 30) — 30 or 90. - `sort` (enum, optional, default "plays") — What to rank by: total views, views per post, posts, creators, likes, sponsored views, or organic views. Values: `plays`, `median_plays`, `posts`, `creators`, `likes`, `sponsored_plays`, `organic_plays`. - `scope` (string, optional, ≤ 120 chars) — Category: all, d1:, or d2:/. Valid values come back in categories and category_groups. - `brand_account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Your brand's account_id. Sets the default category and returns your rank as me. - `brand_username` (string, optional, ≤ 64 chars) — Your brand's username. Ignored when brand_account_id is set. - `find_username` (string, optional, ≤ 64 chars) — Any brand username to locate on this board. - `min_posts` (integer, optional, default 1) — Only brands with at least this many posts: 1, 3, or 10. - `limit` (integer, optional, default 20, 1–100) — How many rows per page. - `offset` (integer, optional, default 0, ≥ 0) — How many rows to skip. #### Response ##### `Response` - `region / days / sort / min_posts` (string · integer) — Settings applied. - `scope` (string) — Category ranked in. - `scope_source` (string) — explicit, brand_default (your brand's top category), or default (all). - `total` (integer) — Brands in this category. - `median_metric` (number | null) — Median of the sort metric across the category. First page only. - `sponsored_share_median` (number | null) — Median share of sponsored posts, 0–1. First page only. - `snapshot_at` (timestamp | null) — When the board was built. - `items` (object[]) — Ranked brands. - `me` (object | null) — Your brand's rank, total, top_pct, and row. - `me_reason` (string | null) — Why me is null: no_brand, not_in_category, below_min_posts, or no_posts. - `lookup` (object | null) — The find_username brand's rank, total, top_pct, and row. - `lookup_reason` (string | null) — Why lookup is null: not_in_category, below_min_posts, or no_posts. - `lookup_scopes` (string[]) — The looked-up brand's own categories, as scopes. Retry with one of them. - `brand_categories` (object[]) — Your brand's categories, strongest first. - `categories / category_groups` (object[]) — Valid scopes with their brand counts. ##### `items[] · me.row · lookup.row` - `rank` (integer) — Position on the board. - `account_id` (uuid) — account_id for the other tools. - `username / full_name` (string) — Handle and display name. - `follower_count` (integer | null) — Followers. - `post_count / creator_count` (integer) — Posts about the brand, and how many creators made them. - `total_plays / median_plays` (integer) — Total views and views per post. - `total_likes / total_comments` (integer) — Engagement. - `sponsored_post_count / sponsored_total_plays / sponsored_median_plays` (integer) — The same numbers for sponsored posts only. - `organic_median_plays` (integer | null) — Views per post for non-sponsored posts. - `organic_post_count / organic_total_plays` (integer | null) — Posts and total views without the sponsored ones. Null when the counts don't add up. - `sponsored_share` (number | null) — Sponsored posts over all posts, 0–1. Null when there are no posts. - `sponsored_reel_count / organic_reel_count` (integer | null) — Reels in each subset. - `categories` (string[]) — The brand's categories, as /. #### Example ```console $ solari insight instagram ranking brands region=KR days=30 find_username=innisfreeofficial limit=1 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "region": "KR", "days": 30, "sort": "plays", "scope": "all", "scope_source": "default", "min_posts": 1, "offset": 0, "limit": 1, "total": 21483, "median_metric": 18250, "sponsored_share_median": 0.25, "snapshot_at": "2026-09-22T19:04:11.482913+00:00", "me_reason": "no_brand", "lookup_username": "innisfreeofficial", "lookup_reason": null, "lookup_scopes": [], "brand_categories": [], "categories": [ { "depth_1": "BEAUTY", "depth_2": "MAKEUP", "brands": 1622 }, { "depth_1": "BEAUTY", "depth_2": "SKINCARE", "brands": 1843 }, "… 41 more" ], "category_groups": [ { "depth_1": "BEAUTY", "brands": 3120 }, "… 11 more" ], "items": [ { "account_id": "018cab6d-1648-7071-9734-c47a2be2fd19", "rank": 1, "user_id": "018cab6d-1648-7071-9734-c47a2be2fd19", "username": "oliveyoung_official", "full_name": "올리브영 OLIVE YOUNG", "follower_count": 1199628, "post_count": 18342, "creator_count": 6120, "total_plays": 412880000, "median_plays": 9840, "total_likes": 15230000, "total_comments": 402100, "sponsored_post_count": 7010, "sponsored_total_plays": 131200000, "sponsored_median_plays": 11200, "organic_median_plays": 9100, "sponsored_reel_count": 5230, "organic_reel_count": 8120, "categories": [ "BEAUTY/SKINCARE", "BEAUTY/MAKEUP" ], "organic_post_count": 11332, "organic_total_plays": 281680000, "sponsored_share": 0.3822 } ], "me": null, "lookup": { "rank": 7, "total": 21483, "top_pct": 0.1, "row": { "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "rank": 7, "user_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "full_name": "INNISFREE | 이니스프리", "follower_count": 847619, "post_count": 1204, "creator_count": 688, "total_plays": 38920400, "median_plays": 14120, "total_likes": 1182300, "total_comments": 30440, "sponsored_post_count": 402, "sponsored_total_plays": 17610200, "sponsored_median_plays": 21800, "organic_median_plays": 11900, "sponsored_reel_count": 318, "organic_reel_count": 611, "categories": [ "BEAUTY/SKINCARE" ], "organic_post_count": 802, "organic_total_plays": 21310200, "sponsored_share": 0.3339 } } } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_ranking_brands", "arguments": { "region": "KR", "days": 30, "find_username": "innisfreeofficial", "limit": 1 } } ``` #### Notes - The board is rebuilt daily. snapshot_at tells you when. - With a brand and no scope, the board opens in the brand's top category, not all. - me and lookup only come back on the first page (offset=0). #### Related tools - [`solari_insight_instagram_ranking_posts`](https://clip-pub.bzine.co/docs/tools/insight-instagram-ranking-posts.md) - [`solari_insight_instagram_ranking_find`](https://clip-pub.bzine.co/docs/tools/insight-instagram-ranking-find.md) - [`solari_insight_instagram_ranking_creators`](https://clip-pub.bzine.co/docs/tools/insight-instagram-ranking-creators.md) ### solari insight instagram ranking creators > Rank Instagram creators within a category. - **CLI**: `solari insight instagram ranking creators` - **MCP tool**: `solari_insight_instagram_ranking_creators` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Creator leaderboard for one market: creators who make brand-tagged content, ranked within a category so a specialist isn't beaten by a big account with one post in it. Brand, agency, and shop accounts are left out. **When to use it** — When you want the top creators for a category, by reach, efficiency, or growth. For brands, use ranking brands. **What comes back** — One page of ranked creators, plus any creator you asked to find (lookup). #### Parameters - `region` (enum, optional, default "KR") — KR or JP — the creator's own market. Values: `KR`, `JP`. - `days` (integer, optional, default 30) — 30 or 90. - `sort` (enum, optional, default "plays") — What to rank by: total views, views per post, likes, brands worked with, sponsored views, reach, lift, or growth. Values: `plays`, `median_plays`, `likes`, `brands`, `sponsored_plays`, `reach`, `lift`, `growth`. - `kind` (enum, optional, default "creator") — creator for individuals, magazine for magazine and media accounts. Values: `creator`, `magazine`. - `scope` (string, optional, ≤ 120 chars) — Category: all, d1:, or d2:/. Valid values come back in categories and category_groups. - `brand_account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — A brand's account_id. Opens the board in that brand's top category. - `brand_username` (string, optional, ≤ 64 chars) — A brand's username. Ignored when brand_account_id is set. - `find_username` (string, optional, ≤ 64 chars) — Any creator username to locate on this board. - `min_posts` (integer, optional, default 3) — Only creators with at least this many posts in the category: 3, 10, or 30. - `min_followers` (integer, optional, default 10000) — Follower floor: 1000, 10000, or 100000. - `limit` (integer, optional, default 20, 1–100) — How many rows per page. - `offset` (integer, optional, default 0, ≥ 0) — How many rows to skip. #### Response ##### `Response` - `region / days / sort / list_kind` (string · integer) — Settings applied. - `scope / scope_source` (string) — Category ranked in, and where it came from. - `min_posts / min_followers / min_reels` (integer) — Filters applied. min_reels applies to the sorts that need reels. - `total` (integer) — Creators in this category. - `max_rank` (integer) — The deepest rank you can page to. - `snapshot_ready` (boolean) — false while the first board is still being built. - `median_metric / sponsored_share_median` (number | null) — Category medians. First page only. - `snapshot_at` (timestamp | null) — When the board was built. - `items` (object[]) — Ranked creators. - `lookup / lookup_reason / lookup_scopes` (object | string | string[]) — The find_username creator's rank, total, top_pct, and row, as in ranking brands. - `categories / category_groups` (object[]) — Valid scopes with their creator counts. ##### `items[] · lookup.row` - `rank` (integer) — Position on the board. - `account_id` (uuid) — account_id for the other tools. - `username / full_name` (string) — Handle and display name. - `follower_count` (integer | null) — Followers. - `post_count / reel_count` (integer) — Brand-tagged posts and reels in the category. - `brand_count` (integer) — Brands tagged in those posts. - `total_plays / median_plays` (integer) — Total views and views per post. - `total_likes / total_comments` (integer) — Engagement. - `sponsored_post_count / sponsored_total_plays / sponsored_median_plays` (integer) — The same numbers for sponsored posts only. - `organic_median_plays` (integer | null) — Views per post for non-sponsored posts. - `organic_post_count / organic_total_plays` (integer | null) — Posts and total views without the sponsored ones. Null when the counts don't add up. - `sponsored_share` (number | null) — Sponsored posts over all posts, 0–1. Null when there are no posts. - `baseline_median_views` (integer | null) — The creator's usual views per post across everything they post. - `ad_partner_count` (integer | null) — Brands they've run ads for. - `reach_rate` (number | null) — Views per follower. Null when the baseline is too small. - `lift` (number | null) — Views per post against their own usual median. 1.5 means 50% above usual. - `growth_m1` (number | null) — One-month view growth. 0.27 means +27%. #### Example ```console $ solari insight instagram ranking creators region=KR days=30 scope=d2:BEAUTY/MAKEUP limit=1 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "region": "KR", "days": 30, "sort": "plays", "max_rank": 1000, "list_kind": "creator", "scope": "d2:BEAUTY/MAKEUP", "scope_source": "explicit", "min_posts": 3, "min_followers": 10000, "min_reels": 0, "offset": 0, "limit": 1, "snapshot_ready": true, "total": 2841, "median_metric": 61200, "sponsored_share_median": 0.4, "snapshot_at": "2026-09-22T19:04:11.482913+00:00", "lookup_username": null, "lookup_reason": null, "lookup_scopes": [], "categories": [ { "depth_1": "BEAUTY", "creators": 2841, "depth_2": "MAKEUP" }, { "depth_1": "BEAUTY", "creators": 2310, "depth_2": "SKINCARE" }, "… 38 more" ], "category_groups": [ { "depth_1": "BEAUTY", "creators": 5120 }, "… 11 more" ], "items": [ { "account_id": "018ecc75-55d8-70a7-a348-d370aa504ed9", "rank": 1, "user_id": "018ecc75-55d8-70a7-a348-d370aa504ed9", "username": "beinny_motd", "full_name": "베이니 BEINNY", "follower_count": 205754, "post_count": 22, "brand_count": 14, "reel_count": 19, "total_plays": 3120400, "median_plays": 98200, "total_likes": 84210, "total_comments": 3120, "sponsored_post_count": 15, "sponsored_total_plays": 2010300, "sponsored_median_plays": 91200, "organic_median_plays": 112000, "baseline_median_views": 64000, "ad_partner_count": 14, "reach_rate": 0.48, "lift": 1.53, "growth_m1": 0.27, "organic_post_count": 7, "organic_total_plays": 1110100, "sponsored_share": 0.6818 } ], "lookup": null } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_ranking_creators", "arguments": { "region": "KR", "days": 30, "scope": "d2:BEAUTY/MAKEUP", "limit": 1 } } ``` #### Notes - The board is rebuilt daily. snapshot_at tells you when. - reach, lift, and growth are null for creators whose baseline is too small. - Creators only count in categories that make up a real share of their posts. #### Related tools - [`solari_insight_instagram_ranking_posts`](https://clip-pub.bzine.co/docs/tools/insight-instagram-ranking-posts.md) - [`solari_insight_instagram_ranking_find`](https://clip-pub.bzine.co/docs/tools/insight-instagram-ranking-find.md) - [`solari_insight_instagram_account_discover`](https://clip-pub.bzine.co/docs/tools/insight-instagram-account-discover.md) ### solari insight instagram ranking find > Find one account's rank on the brand and creator boards. - **CLI**: `solari insight instagram ranking find` - **MCP tool**: `solari_insight_instagram_ranking_find` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Where one Instagram account stands, without knowing if it's a brand or a creator. For each board it's on, you get its rank and top percent in every category it belongs to. **When to use it** — When the question is "where does this account rank?" or "how does its non-sponsored content do?" and you don't know which board. **What comes back** — A brand side and a creator side. A side is null when the account isn't on that board. #### Parameters - `username` (string, required, ≤ 64 chars) — Instagram username, with or without @. - `region` (enum, optional, default "KR") — KR, JP, or US. The creator board covers KR and JP only. Values: `KR`, `JP`, `US`. - `days` (integer, optional, default 30) — 30 or 90. #### Response ##### `Response` - `username` (string) — The handle looked up. - `region / days` (string · integer) — Settings applied. - `sort` (string) — Always plays (total views). - `brand` (object | null) — Its place on the brand board. - `creator` (object | null) — Its place on the creator board. ##### `brand · creator` - `account` (object) — account_id, username, full_name, follower_count. - `row` (object | null) — Its overall row, same fields as the matching ranking tool, including the organic split (organic_post_count, organic_total_plays, organic_median_plays, sponsored_share). - `positions` (object[]) — One entry per category it ranks in. - `positions[].scope / rank / total / top_pct` (string · integer · number) — Category, rank, how many ranked, and top percent (min 0.1). - `positions[].share` (number | null) — Creator side only: the category's share of their posts. - `min_posts / min_followers` (integer) — The loosest filters, used so the account isn't dropped. - `list_kind` (string) — Creator side only: creator or magazine. - `snapshot_at` (timestamp | null) — When the board was built. #### Example ```console $ solari insight instagram ranking find username=innisfreeofficial region=KR ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "username": "innisfreeofficial", "region": "KR", "days": 30, "sort": "plays", "brand": { "account": { "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "user_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "full_name": "INNISFREE | 이니스프리", "follower_count": 847619 }, "min_posts": 1, "row": { "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "rank": 7, "user_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "post_count": 1204, "total_plays": 38920400, "median_plays": 14120, "sponsored_post_count": 402, "sponsored_total_plays": 17610200, "organic_median_plays": 11900, "categories": [ "BEAUTY/SKINCARE" ], "organic_post_count": 802, "organic_total_plays": 21310200, "sponsored_share": 0.3339 }, "positions": [ { "scope": "all", "rank": 7, "total": 21483, "top_pct": 0.1 }, { "scope": "d1:BEAUTY", "rank": 4, "total": 3120, "top_pct": 0.1 }, { "scope": "d2:BEAUTY/SKINCARE", "rank": 2, "total": 1843, "top_pct": 0.1 } ], "snapshot_at": "2026-09-22T19:04:11.482913+00:00" }, "creator": null } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_ranking_find", "arguments": { "username": "innisfreeofficial", "region": "KR" } } ``` #### Notes - It uses the loosest filters, so a rank here can be better than on a list with stricter filters. #### Related tools - [`solari_insight_instagram_ranking_brands`](https://clip-pub.bzine.co/docs/tools/insight-instagram-ranking-brands.md) - [`solari_insight_instagram_ranking_creators`](https://clip-pub.bzine.co/docs/tools/insight-instagram-ranking-creators.md) ### solari insight instagram ranking posts > The top posts behind a ranking row. - **CLI**: `solari insight instagram ranking posts` - **MCP tool**: `solari_insight_instagram_ranking_posts` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 The best-performing posts behind one leaderboard row — the evidence for a brand's or creator's number. Each post is marked sponsored or not, and kind=organic keeps only the non-sponsored ones. **When to use it** — After ranking brands or creators, when you want to see what drove a row. **What comes back** — Top posts with their authors, best first. #### Parameters - `board` (enum, required) — brand or creator — the board the row came from. Values: `brand`, `creator`. - `account_id` (string, required, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — account_id from the ranking row. - `region` (enum, optional, default "KR") — Same market as the list. Values: `KR`, `JP`, `US`. - `days` (integer, optional, default 30) — Same window as the list: 30 or 90. - `scope` (string, optional, ≤ 120 chars) — Creator board only: the same scope the list used. - `kind` (enum, optional, default "all") — all, sponsored for sponsored posts only, or organic for non-sponsored posts only. Values: `all`, `sponsored`, `organic`. - `limit` (integer, optional, default 6, 1–12) — How many posts to return. #### Response ##### `Response` - `account_id` (uuid) — The row's account. - `kind` (string) — all, sponsored, or organic. - `checked_top_posts` (integer) — kind=organic only: how many of the row's top posts were checked. - `items` (object[]) — Top posts, best first. ##### `items[]` - `post_id / slug` (string) — Post identifiers. - `posted_at` (timestamp | null) — Published at (UTC). - `media_type` (string) — image or video. - `thumbnail_url` (string) — Thumbnail URL. - `media_url` (string | null) — Media URL. Null when the file isn't stored. - `play_count` (integer | null) — Video plays. - `sponsored` (boolean) — Whether it's a sponsored post. - `author` (object) — account_id, username, full_name, follower_count, profile_pic_url. #### Example ```console $ solari insight instagram ranking posts board=brand account_id=018cabce-14cc-7544-8890-7811ec33ef74 region=KR limit=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "kind": "all", "items": [ { "post_id": "01a04c73-3ec3-7873-9e84-334c644abfe4", "slug": "DckGrZ6vZiU", "posted_at": "2026-08-21T10:03:52+00:00", "media_type": "video", "media_url": null, "thumbnail_url": "https://dcr.bzine.co/instagram/posts/DckGrZ6vZiU/thumbnails/m", "play_count": 155729, "author": { "account_id": "0196c474-c96e-71ad-aceb-61af051c81d3", "user_id": "0196c474-c96e-71ad-aceb-61af051c81d3", "username": "hwitto_", "full_name": null, "follower_count": 48210, "profile_pic_url": "https://dcr.bzine.co/instagram/users/hwitto_/profile-picture" }, "sponsored": true }, "… 1 more" ] } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_ranking_posts", "arguments": { "board": "brand", "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "region": "KR", "limit": 2 } } ``` #### Notes - Use the same region, days, and (for creators) scope as the list, or the posts won't match the numbers. - On the brand board, the authors are mostly creators who tagged or mentioned the brand. - A row keeps its top 6 posts by views. kind=organic returns the non-sponsored ones among them, so it can come back short or empty. #### Related tools - [`solari_insight_instagram_ranking_brands`](https://clip-pub.bzine.co/docs/tools/insight-instagram-ranking-brands.md) - [`solari_insight_instagram_ranking_creators`](https://clip-pub.bzine.co/docs/tools/insight-instagram-ranking-creators.md) - [`solari_catalog_instagram_content_batch`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-batch.md) ### solari insight instagram hashtag trending > Trending Instagram hashtags, rising and top. - **CLI**: `solari insight instagram hashtag trending` - **MCP tool**: `solari_insight_instagram_hashtag_trending` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Hashtag leaderboard for a market and window, in two lists: rising (share growing fastest against the previous window) and top (volume weighted by how much more it's used than usual). Pass a brand to see what's moving among that brand's creators. **When to use it** — When you want which hashtags are taking off now, across a market or around a brand. **What comes back** — The rising and top lists, with volume, growth, and a daily share series per tag. #### Parameters - `region` (enum, optional, default "KR") — KR or JP. Values: `KR`, `JP`. - `days` (integer, optional, default 30) — 7, 30, or 90. Growth compares with the window before. - `brand_account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Brand account_id. Scopes the numbers to creators around that brand. - `brand_username` (string, optional, ≤ 64 chars) — Brand username. Ignored when brand_account_id is set. - `limit` (integer, optional, default 30, 1–100) — How many tags to keep per list. #### Response ##### `Response` - `region / days / start_date / end_date` (string · integer · date) — Market and window applied. - `lens` (string) — brand when scoped to a brand's creators, global for the whole market. - `lens_reason` (string | null) — brand, no_brand (none given), or brand_not_modeled (SOLARI can't place creators around this brand yet, so the whole market was used). - `pool_size` (integer | null) — Creators in the brand lens. Null for global. - `spark_dates` (date[]) — Dates for each spark value. - `top / rising` (object[]) — The two lists. - `top_total / rising_total` (integer) — Full list sizes before limit. ##### `top[] · rising[]` - `tag` (string) — Hashtag, without #. - `count / prev_count` (integer) — Posts now and in the previous window. - `unique_creators` (integer) — Creators who used it. - `views` (integer) — Total views. - `sponsored_pct` (integer) — Sponsored posts, percent. - `growth_x` (number) — Share growth against the previous window. 3.9 means 3.9×. - `is_new` (boolean) — Barely used in the previous window. - `spark` (number[]) — Share of all posts, percent, per spark_dates entry. - `momentum` (number | null) — Late-window share against early-window share. Above 1 means still climbing. - `lift / global_growth_x / contrast` (number · number · string | null) — Brand lens only: how much more the brand's creators use it than the market, market growth, and local or nationwide when the two differ. - `watch` (boolean) — Worth a look: new or fast-growing, not crowded with ads. - `watch_reasons` (string[]) — new, lift, growth, room (few ads yet), creators — most important first. - `family` (object[]) — Other spellings folded into this tag, with their counts. #### Example ```console $ solari insight instagram hashtag trending region=KR days=7 limit=1 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "region": "KR", "days": 7, "start_date": "2026-09-15", "end_date": "2026-09-22", "lens": "global", "lens_reason": "no_brand", "pool_size": null, "spark_dates": [ "2026-09-15", "2026-09-16", "… 6 more" ], "top": [ { "tag": "올영세일", "count": 4812, "unique_creators": 2210, "views": 38400000, "sponsored_pct": 41, "prev_count": 1290, "growth_x": 3.62, "is_new": false, "spark": [ 0.62, 0.71, 0.94, 1.38, 1.52, 1.61, 1.49, 1.44 ], "momentum": 1.84, "lift": null, "global_growth_x": null, "contrast": null, "watch": false, "watch_reasons": [ "growth", "creators" ], "family": [ { "tag": "올리브영세일", "count": 612 } ] } ], "rising": [ { "tag": "가을메이크업", "count": 356, "unique_creators": 241, "views": 2140000, "sponsored_pct": 12, "prev_count": 88, "growth_x": 3.9, "is_new": false, "spark": [ 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12 ], "momentum": 1.52, "lift": null, "global_growth_x": null, "contrast": null, "watch": true, "watch_reasons": [ "growth", "room", "creators" ], "family": [] } ], "top_total": 20, "rising_total": 20 } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_hashtag_trending", "arguments": { "region": "KR", "days": 7, "limit": 1 } } ``` #### Notes - Covers KR and JP. - Check lens before reading a brand-scoped board. brand_not_modeled means you got the whole market. #### Related tools - [`solari_insight_instagram_hashtag_detail`](https://clip-pub.bzine.co/docs/tools/insight-instagram-hashtag-detail.md) - [`solari_insight_instagram_hashtag_posts`](https://clip-pub.bzine.co/docs/tools/insight-instagram-hashtag-posts.md) - [`solari_insight_instagram_content_trend_clusters`](https://clip-pub.bzine.co/docs/tools/insight-instagram-content-trend-clusters.md) ### solari insight instagram hashtag detail > One Instagram hashtag in depth. - **CLI**: `solari insight instagram hashtag detail` - **MCP tool**: `solari_insight_instagram_hashtag_detail` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 One hashtag in depth for a market and window: volume, growth, momentum, the daily share series, tags used with it, and the creators who used it most. **When to use it** — After hashtag trending, when one tag needs a closer look. **What comes back** — The tag's numbers, its daily series, related tags, and top creators. #### Parameters - `tag` (string, required, ≤ 100 chars) — Hashtag, with or without #. - `region` (enum, optional, default "KR") — KR or JP. Values: `KR`, `JP`. - `days` (integer, optional, default 30) — 7, 30, or 90. - `brand_account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Brand account_id. Use the same brand as the leaderboard to keep the same lens. - `brand_username` (string, optional, ≤ 64 chars) — Brand username. Ignored when brand_account_id is set. #### Response ##### `Response` - `tag` (string) — The tag, without #. - `region / days / start_date / end_date` (string · integer · date) — Market and window applied. - `lens / lens_reason / pool_size` (string · string · integer | null) — Same as hashtag trending. - `count / prev_count / unique_creators / views` (integer) — Volume now, previous volume, creators, and views. - `sponsored_pct` (integer) — Sponsored posts, percent. - `share_pct` (number) — Share of all posts in the window, percent. - `growth_x` (number) — Share growth against the previous window. - `is_new` (boolean) — Barely used in the previous window. - `momentum` (number | null) — Late-window share against early-window share. - `series` (object[]) — Over time: date, count, share (percent). - `related` (object[]) — Tags used with it: tag, count, pct of its posts. - `creators` (object[]) — Top users of the tag. ##### `creators[]` - `account_id` (uuid) — account_id for the other tools. - `username` (string) — Handle. - `posts` (integer) — Posts with the tag in the window. - `views` (integer) — Views on those posts. - `follower_count` (integer | null) — Followers. #### Example ```console $ solari insight instagram hashtag detail tag=가을메이크업 region=KR days=7 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "tag": "가을메이크업", "region": "KR", "days": 7, "start_date": "2026-09-15", "end_date": "2026-09-22", "lens": "global", "lens_reason": "no_brand", "pool_size": null, "count": 356, "prev_count": 88, "unique_creators": 241, "views": 2140000, "sponsored_pct": 12, "share_pct": 0.084, "growth_x": 3.9, "is_new": false, "momentum": 1.52, "series": [ { "date": "2026-09-15", "count": 21, "share": 0.05 }, { "date": "2026-09-16", "count": 27, "share": 0.06 }, "… 6 more" ], "related": [ { "tag": "가을립", "count": 64, "pct": 18 }, { "tag": "데일리메이크업", "count": 57, "pct": 16 }, "… 22 more" ], "creators": [ { "username": "beinny_motd", "user_id": "018ecc75-55d8-70a7-a348-d370aa504ed9", "posts": 3, "views": 184300, "follower_count": 205754, "account_id": "018ecc75-55d8-70a7-a348-d370aa504ed9" }, { "username": "donge_cos", "user_id": "0195474c-8ee3-7690-a385-71b2913e31b5", "posts": 2, "views": 96120, "follower_count": 83354, "account_id": "0195474c-8ee3-7690-a385-71b2913e31b5" }, "… 10 more" ] } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_hashtag_detail", "arguments": { "tag": "가을메이크업", "region": "KR", "days": 7 } } ``` #### Notes - Covers KR and JP. #### Related tools - [`solari_insight_instagram_hashtag_trending`](https://clip-pub.bzine.co/docs/tools/insight-instagram-hashtag-trending.md) - [`solari_insight_instagram_hashtag_posts`](https://clip-pub.bzine.co/docs/tools/insight-instagram-hashtag-posts.md) ### solari insight instagram hashtag posts > Posts behind one trending Instagram hashtag. - **CLI**: `solari insight instagram hashtag posts` - **MCP tool**: `solari_insight_instagram_hashtag_posts` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Posts carrying one hashtag inside a trend window, most viewed or newest first — the examples behind a leaderboard entry. **When to use it** — When you want the posts that drove a tag's trend. For a tag's full history, use catalog tag search. **What comes back** — One page of posts, with a total for paging. #### Parameters - `tag` (string, required, ≤ 100 chars) — Hashtag, with or without #. - `region` (enum, optional, default "KR") — KR or JP. Values: `KR`, `JP`. - `days` (integer, optional, default 30) — 7, 30, or 90. - `brand_account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Brand account_id. Keeps the same lens as the leaderboard. - `brand_username` (string, optional, ≤ 64 chars) — Brand username. Ignored when brand_account_id is set. - `sort` (enum, optional, default "views") — views for most viewed first, recent for newest first. Values: `views`, `recent`. - `limit` (integer, optional, default 12, 1–24) — How many posts per page. - `offset` (integer, optional, default 0, 0–960) — How many posts to skip. #### Response ##### `Response` - `tag` (string) — The tag, without #. - `total` (integer) — Posts with the tag in the window. - `offset` (integer) — Offset applied. - `items` (object[]) — The posts. ##### `items[]` - `post_id / slug` (string) — Post identifiers. - `account_id / username` (string) — Author. - `posted_at` (timestamp) — Published at. - `play_count / like_count` (integer) — Views and likes. #### Example ```console $ solari insight instagram hashtag posts tag=가을메이크업 region=KR days=30 limit=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "tag": "가을메이크업", "total": 1204, "offset": 0, "items": [ { "post_id": "01a05575-7c9b-7232-8519-4a38fa061389", "user_id": "018ecc75-55d8-70a7-a348-d370aa504ed9", "username": "beinny_motd", "slug": "DcpugJ2kzv8", "posted_at": "2026-08-30T05:08:56+00:00", "play_count": 0, "like_count": 878, "account_id": "018ecc75-55d8-70a7-a348-d370aa504ed9" }, "… 1 more" ] } ``` #### As an MCP call ```json { "name": "solari_insight_instagram_hashtag_posts", "arguments": { "tag": "가을메이크업", "region": "KR", "days": 30, "limit": 2 } } ``` #### Notes - Paging stops at offset 960. - Pass post_ids to catalog content batch for captions and media. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_insight_instagram_hashtag_detail`](https://clip-pub.bzine.co/docs/tools/insight-instagram-hashtag-detail.md) - [`solari_catalog_instagram_tag_search`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-tag-search.md) - [`solari_catalog_instagram_content_batch`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-batch.md) ### solari catalog instagram tag search > Use this to find posts with a hashtag or mention. - **CLI**: `solari catalog instagram tag search` - **MCP tool**: `solari_catalog_instagram_tag_search` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Find an exact hashtag or mention across the full tracked history. For keywords anywhere in the text, use content search. **When to use it** — When you want a campaign hashtag's reach, or posts that mentioned an account. **What comes back** — Posts that carry the tag, newest collected first. #### Parameters - `query` (string, required, ≤ 200 chars) — Hashtag (#ootd) or mention (@username). - `limit` (integer, optional, default 20, 1–1000) — How many posts per page. - `cursor` (string, optional) — next_cursor from the previous page. #### Response ##### `Response` - `query` (string) — The tag the lookup actually ran on, without its leading # or @. - `tag_kind` (string) — hashtag or mention — how the query was read. - `matched_tags` (integer) — How many stored spellings matched. 0 means the tag has never been seen. - `items` (object[]) — The posts found. - `found` (integer) — Number of posts whose full details were loaded. - `next_cursor` (string | null) — Pass back as cursor for the next page. null on the last page. - `mirror_synced_at` (timestamp | null) — When the tag index was last refreshed (UTC). ##### `items[]` - `id` (uuid) — Post id. - `slug` (string) — Instagram shortcode. - `text` (string) — Caption. - `posted_at` (timestamp) — Published at (UTC). - `username / user_id / account_id` (string) — Authoring account. - `like_count / comment_count` (integer) — Engagement. - `play_count` (integer | null) — Video plays. - `media_type` (string) — Post format. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari catalog instagram tag search query=#ootd limit=3 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "query": "ootd", "tag_kind": "hashtag", "matched_tags": 1, "items": [ { "id": "01a06a16-781f-7578-822b-1c326e72f28d", "slug": "DW1jniHiVSU", "text": "御殿場是一個一天逛不完的地方 希望下次有時間可以慢慢逛 —— OOTD —— Pants:LAKOLE / Shirt:HARE #LYNN__OOTD #日常穿搭 #ootd …", "posted_at": "2026-04-07T16:16:21Z", "virtual_campaign": null, "username": "llling_yinnnnn", "user_id": "019dbc46-1a67-7ef5-b95a-2fb466790d04", "account_id": "019dbc46-1a67-7ef5-b95a-2fb466790d04", "profile_picture_url": null, "like_count": 3, "comment_count": 4, "media_type": "post", "play_count": null, "media": [] }, { "id": "01a06a16-552d-7099-ae0a-77e6b68de960", "slug": "DaS66VzJBPW", "text": "SEOUL OOTD — 這次搭配了四種完全不同風格 #ootd #lynn__ootd #穿搭販賣機 #韓國穿搭", "posted_at": "2026-07-02T15:33:13Z", "virtual_campaign": null, "username": "llling_yinnnnn", "user_id": "019dbc46-1a67-7ef5-b95a-2fb466790d04", "account_id": "019dbc46-1a67-7ef5-b95a-2fb466790d04", "profile_picture_url": null, "like_count": 32, "comment_count": 1, "media_type": "reel", "play_count": 888, "media": [] }, "… 1 more" ], "found": 3, "next_cursor": "01a06a16-552d-7099-ae0a-77e6b68de960", "mirror_synced_at": "2026-09-03T21:47:19Z" } ``` #### As an MCP call ```json { "name": "solari_catalog_instagram_tag_search", "arguments": { "query": "#ootd", "limit": 3 } } ``` #### Notes - Order is collection time, not posted_at. Sort by posted_at yourself if publish time matters. - The tag index refreshes daily. mirror_synced_at is the cutoff. - Matching is exact: #ootd does not match #ootdkorea. Prefix with @ for mentions. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_catalog_instagram_content_search`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-search.md) - [`solari_insight_instagram_content_aggregate`](https://clip-pub.bzine.co/docs/tools/insight-instagram-content-aggregate.md) - [`solari_insight_instagram_hashtag_posts`](https://clip-pub.bzine.co/docs/tools/insight-instagram-hashtag-posts.md) ### solari catalog tiktok account search > Find tracked TikTok accounts by username or name. Use this to get an account_id. - **CLI**: `solari catalog tiktok account search` - **MCP tool**: `solari_catalog_tiktok_account_search` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Look up a brand or creator among the TikTok accounts SOLARI already tracks, by username or display name. The TikTok catalog is small, so start with fetch tiktok account search. Instagram account_ids will not work here. **When to use it** — When the account is already tracked and you need its account_id. For a new name, start with fetch tiktok account search. **What comes back** — Matching accounts, closest first. #### Parameters - `query` (string, required) — Name or TikTok username. - `limit` (integer, optional, default 8, 1–50) — How many accounts to return. - `region` (string, optional, ≤ 8 chars) — Country code such as KR or JP. Leave this off to search everywhere. #### Response ##### `Response` - `found` (boolean) — Whether anyone matched. - `items` (object[]) — Accounts that matched, closest first. ##### `items[]` - `account_id` (uuid) — TikTok account_id. Not interchangeable with Instagram. - `username` (string) — TikTok username. - `nickname` (string) — Display name. - `follower_count / video_count` (integer) — Followers and videos. - `region` (string | null) — Region code. Many tracked accounts carry none. - `is_verified / is_private` (boolean) — Verification and privacy flags. - `is_commerce_user` (boolean) — Whether this is a commerce account. - `commerce_user_category` (string | null) — Commerce category, e.g. Beauty. - `profile_url` (string) — Public profile URL. #### Example ```console $ solari catalog tiktok account search query=innisfree limit=5 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "found": true, "items": [ { "account_id": "019b2137-f76e-7b33-9437-26044fa7b1ed", "username": "innisfree_official", "nickname": "Innisfreeofficial", "follower_count": 143800, "video_count": 767, "region": "KR", "is_verified": true, "is_private": false, "is_commerce_user": true, "commerce_user_category": "Beauty", "profile_url": "https://www.tiktok.com/@innisfree_official" } ] } ``` #### As an MCP call ```json { "name": "solari_catalog_tiktok_account_search", "arguments": { "query": "innisfree", "limit": 5 } } ``` #### Notes - region keeps only the specified country, and drops accounts with no region. Leave it off unless you need one. - Usernames SOLARI has not seen yet will not show up here. Find them with fetch tiktok account search, or pass an exact handle to solari fetch tiktok account, then read it with catalog tiktok account profile. #### Related tools - [`solari_catalog_tiktok_account_profile`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-profile.md) - [`solari_catalog_tiktok_account_posts`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-posts.md) - [`solari_catalog_instagram_account_search`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-search.md) ### solari catalog tiktok account profile > A TikTok account's profile and recent posts. - **CLI**: `solari catalog tiktok account profile` - **MCP tool**: `solari_catalog_tiktok_account_profile` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 A TikTok account's profile and a preview of recent posts. **When to use it** — When you want a full picture of a TikTok account. **What comes back** — Profile, recent posts, and whether the account is being tracked. #### Parameters - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — TikTok account_id (SOLARI account UUID). Provide this or username. - `username` (string, optional, ≤ 64 chars) — TikTok username. Ignored when account_id is set. #### Response ##### `Response` - `account_id` (uuid) — TikTok account_id. - `username / nickname / bio` (string) — Username, display name, and bio. - `bio_links` (string[]) — Links in the bio. - `follower_count / following_count` (integer) — Followers and following. - `heart_count` (integer) — Lifetime likes across the account. - `video_count` (integer) — Videos published. - `is_verified / is_private` (boolean) — Verification and privacy flags. - `is_commerce_user / commerce_user_category` (boolean · string) — Commerce status and category. - `region / language` (string | null) — Region and language codes. - `avatar_url / profile_url` (string) — Avatar and public profile link. - `tracked` (boolean) — Whether the account is on the regular crawl. - `sync_status` (string) — Crawl state. - `synced_at` (timestamp) — Last crawl time. - `recent_posts` (object[]) — Recent post previews. - `fetched_on_demand` (boolean) — true if the account was fetched live on this call. ##### `recent_posts[]` - `post_id` (uuid) — TikTok post id. Not interchangeable with Instagram. - `video_id` (string) — Public numeric id from the TikTok URL. - `url` (string) — Public permalink. - `account_id` (uuid) — Author account_id. - `username` (string) — Author username. - `post_type` (string) — video or carousel. - `posted_at` (timestamp) — Published at (UTC). - `caption` (string) — Caption. - `duration_seconds` (integer) — Video length. - `width / height` (integer) — Resolution. - `play_count` (integer) — Plays. - `like_count` (integer) — Likes. - `comment_count` (integer) — Comments. - `share_count` (integer) — Shares. - `collect_count` (integer) — Saves. - `is_ad` (boolean) — TikTok ad flag. - `is_pinned` (boolean) — Pinned on the profile. - `aigc_label_type` (string | null) — AI-content label, when TikTok sets one. - `original_language_code` (string | null) — Source language. - `cover_url` (string) — Cover image URL. - `video_url` (string) — Video file URL. - `images` (string[]) — Carousel slides. Empty for video. - `hashtags` (string[]) — Hashtags from the caption. - `mentions` (string[]) — Usernames mentioned in the caption. - `transcript` (string | null) — Spoken transcript. In account posts and content batch, only when include_transcript=true. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari catalog tiktok account profile username=innisfree_official ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "account_id": "019b2137-f76e-7b33-9437-26044fa7b1ed", "username": "innisfree_official", "nickname": "Innisfreeofficial", "bio": "NATURE MEETS KOREAN SKIN SCIENCE", "bio_links": [ "https://linktr.ee/innisfree_official" ], "follower_count": 143900, "following_count": 14, "heart_count": 2200000, "video_count": 767, "is_verified": true, "is_private": false, "is_commerce_user": true, "commerce_user_category": "Beauty", "region": "KR", "language": null, "avatar_url": "https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-avt-0068/3f8e48dc4a284a8ead37e93175ebdb86~tplv-tiktokx-cropcenter:720:720.jpeg?dr=10399&refresh_token=04b90255&x-expires=1788541200&x-signature=Gd3gJu4HyBZPCr%2FqEevyDs6 …", "profile_url": "https://www.tiktok.com/@innisfree_official", "sync_status": "OK", "tracked": true, "synced_at": "2026-09-02T17:16:05.835000Z", "recent_posts": [ { "post_id": "01a0631e-f0df-7e9d-a09b-d84bc31d3834", "video_id": "7680375687139642645", "url": "https://www.tiktok.com/@innisfree_official/video/7680375687139642645", "account_id": "019b2137-f76e-7b33-9437-26044fa7b1ed", "username": "innisfree_official", "post_type": "video", "posted_at": "2026-09-02T12:00:00Z", "caption": "Deeply hydrated skin—NO OFF HOURS. 💚 wherever the day takes MINGYU—his hydration stays SUPERCHARGED ⚡️ Green Tea Ceramide Milk: Lightweight milky toner that won't clog your pores Green Tea Ceramide Mist: Touch-free, fa …", "duration_seconds": 23, "width": 1080, "height": 1920, "play_count": 493, "like_count": 37, "comment_count": 2, "share_count": 0, "collect_count": 3, "is_ad": false, "is_pinned": false, "aigc_label_type": null, "original_language_code": null, "cover_url": "https://smr-images-a.bzine.co/tiktok/users/019b2137-f76e-7b33-9437-26044fa7b1ed/posts/01a0631e-f0df-7e9d-a09b-d84bc31d3834/medias/cover.jpg", "video_url": "https://smr-images-a.bzine.co/tiktok/users/019b2137-f76e-7b33-9437-26044fa7b1ed/posts/01a0631e-f0df-7e9d-a09b-d84bc31d3834/medias/origin.mp4", "images": [], "hashtags": [], "mentions": [], "transcript": null }, "… 5 more" ], "fetched_on_demand": false } ``` #### As an MCP call ```json { "name": "solari_catalog_tiktok_account_profile", "arguments": { "username": "innisfree_official" } } ``` #### Notes - This reads the catalog only. If the account is not in the catalog yet, run solari fetch tiktok account username=… then retry. - A not-found error means the handle is not in the catalog. #### Related tools - [`solari_catalog_tiktok_account_posts`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-posts.md) - [`solari_catalog_tiktok_account_history`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-history.md) - [`solari_catalog_tiktok_account_search`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-search.md) - [`solari_catalog_instagram_account_profile`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-profile.md) ### solari catalog tiktok account posts > Posts from a TikTok account. - **CLI**: `solari catalog tiktok account posts` - **MCP tool**: `solari_catalog_tiktok_account_posts` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 List a TikTok account's posts. Turn on include_transcript only when the spoken words matter. **When to use it** — When you need more posts than the profile preview, or a date range or format. **What comes back** — Posts, with transcripts when you ask for them. #### Parameters - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — TikTok account_id (SOLARI account UUID). Provide this or username. - `username` (string, optional, ≤ 64 chars) — TikTok username. Ignored when account_id is set. - `limit` (integer, optional, default 12, 1–200) — How many posts per page. - `offset` (integer, optional, default 0, ≥ 0) — How many posts to skip. - `since` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only posts on or after this UTC date (YYYY-MM-DD). - `until` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only posts on or before this UTC date (YYYY-MM-DD). - `post_type` (enum, optional) — Limit to video or carousel. Values: `video`, `carousel`. - `include_transcript` (boolean, optional, default false) — Include spoken transcripts. #### Response ##### `Response` - `found` (boolean) — false if the username is not on TikTok. - `account_id / username` (string) — The resolved account. - `total` (integer) — Number of posts matching the filters. - `has_more` (boolean) — Whether there is another page. - `items` (object[]) — Posts, newest first. - `fetched_on_demand` (boolean) — true when only the most recent posts are available so far. ##### `items[]` - `post_id` (uuid) — TikTok post id. Not interchangeable with Instagram. - `video_id` (string) — Public numeric id from the TikTok URL. - `url` (string) — Public permalink. - `account_id` (uuid) — Author account_id. - `username` (string) — Author username. - `post_type` (string) — video or carousel. - `posted_at` (timestamp) — Published at (UTC). - `caption` (string) — Caption. - `duration_seconds` (integer) — Video length. - `width / height` (integer) — Resolution. - `play_count` (integer) — Plays. - `like_count` (integer) — Likes. - `comment_count` (integer) — Comments. - `share_count` (integer) — Shares. - `collect_count` (integer) — Saves. - `is_ad` (boolean) — TikTok ad flag. - `is_pinned` (boolean) — Pinned on the profile. - `aigc_label_type` (string | null) — AI-content label, when TikTok sets one. - `original_language_code` (string | null) — Source language. - `cover_url` (string) — Cover image URL. - `video_url` (string) — Video file URL. - `images` (string[]) — Carousel slides. Empty for video. - `hashtags` (string[]) — Hashtags from the caption. - `mentions` (string[]) — Usernames mentioned in the caption. - `transcript` (string | null) — Spoken transcript. In account posts and content batch, only when include_transcript=true. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari catalog tiktok account posts username=innisfree_official limit=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "found": true, "account_id": "019b2137-f76e-7b33-9437-26044fa7b1ed", "username": "innisfree_official", "total": 87, "has_more": true, "items": [ { "post_id": "01a0631e-f0df-7e9d-a09b-d84bc31d3834", "video_id": "7680375687139642645", "url": "https://www.tiktok.com/@innisfree_official/video/7680375687139642645", "account_id": "019b2137-f76e-7b33-9437-26044fa7b1ed", "username": "innisfree_official", "post_type": "video", "posted_at": "2026-09-02T12:00:00Z", "caption": "Deeply hydrated skin—NO OFF HOURS. 💚 wherever the day takes MINGYU—his hydration stays SUPERCHARGED ⚡️ Green Tea Ceramide Milk: Lightweight milky toner that won't clog your pores Green Tea Ceramide Mist: Touch-free, fa …", "duration_seconds": 23, "width": 1080, "height": 1920, "play_count": 493, "like_count": 37, "comment_count": 2, "share_count": 0, "collect_count": 3, "is_ad": false, "is_pinned": false, "aigc_label_type": null, "original_language_code": null, "cover_url": "https://smr-images-b.bzine.co/tiktok/users/019b2137-f76e-7b33-9437-26044fa7b1ed/posts/01a0631e-f0df-7e9d-a09b-d84bc31d3834/medias/cover.jpg", "video_url": "https://smr-images-a.bzine.co/tiktok/users/019b2137-f76e-7b33-9437-26044fa7b1ed/posts/01a0631e-f0df-7e9d-a09b-d84bc31d3834/medias/origin.mp4", "images": [], "hashtags": [], "mentions": [], "transcript": null }, "… 1 more" ], "fetched_on_demand": false } ``` #### As an MCP call ```json { "name": "solari_catalog_tiktok_account_posts", "arguments": { "username": "innisfree_official", "limit": 2 } } ``` #### Notes - Transcripts are large, so include_transcript is off by default. - This reads the catalog only. If the account is not in the catalog yet, run solari fetch tiktok posts username=… then retry. #### Related tools - [`solari_catalog_tiktok_account_profile`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-profile.md) - [`solari_catalog_tiktok_content_detail`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-content-detail.md) - [`solari_catalog_instagram_account_posts`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-posts.md) ### solari catalog tiktok account history > A TikTok account's follower and video counts over time. - **CLI**: `solari catalog tiktok account history` - **MCP tool**: `solari_catalog_tiktok_account_history` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Follower, following, like, and video counts of a TikTok account over time, as SOLARI recorded them. Use it to chart growth or compare accounts. **When to use it** — When you need follower growth or a trend, not just today's numbers. **What comes back** — Recorded values, oldest first, plus the account's current values. #### Parameters - `account_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — Pass account_id or username. - `username` (string, optional, ≤ 64 chars) — TikTok username. Ignored when account_id is set. - `since` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — First UTC date to include (YYYY-MM-DD). - `until` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Last UTC date to include (YYYY-MM-DD). - `granularity` (enum, optional, default "day") — day keeps one point per UTC day. all keeps every point. Values: `day`, `all`. #### Response ##### `Response` - `found` (boolean) — false if the account is not in the catalog. - `account_id / username` (string) — The resolved account. - `granularity` (string) — day or all, as applied. - `since / until` (date) — The UTC date range covered. - `current` (object | null) — The catalog's current values, whatever the date range. - `points` (object[]) — Recorded values, oldest first. - `truncated` (boolean) — true if older points were dropped. Narrow since to see them. ##### `current` - `follower_count / following_count / heart_count / video_count` (integer | null) — Current counts in the catalog. heart_count is total likes received. - `is_verified / is_private` (boolean | null) — Verification badge and private flag. - `collected_at` (timestamp | null) — When the profile was last collected from TikTok. ##### `points[]` - `captured_at` (timestamp) — When SOLARI recorded these values (UTC). - `follower_count / following_count / heart_count / video_count` (integer | null) — Counts at that moment. - `is_verified / is_private` (boolean | null) — Verification badge and private flag at that moment. #### Example ```console $ solari catalog tiktok account history username=innisfree_official since=2026-09-20 until=2026-09-30 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "found": true, "account_id": "019b2137-f76e-7b33-9437-26044fa7b1ed", "username": "innisfree_official", "granularity": "day", "since": "2026-09-20", "until": "2026-09-30", "current": { "follower_count": 144300, "following_count": 14, "heart_count": 2200000, "video_count": 768, "is_verified": true, "is_private": false, "collected_at": "2026-09-26T22:06:21.624000Z" }, "points": [ { "captured_at": "2026-09-20T21:23:21.898000Z", "follower_count": 143800, "following_count": 14, "heart_count": 2200000, "video_count": 767, "is_verified": true, "is_private": false }, { "captured_at": "2026-09-24T04:16:11.995000Z", "follower_count": 143800, "following_count": 14, "heart_count": 2200000, "video_count": 768, "is_verified": true, "is_private": false }, { "captured_at": "2026-09-26T22:06:21.624000Z", "follower_count": 144300, "following_count": 14, "heart_count": 2200000, "video_count": 768, "is_verified": true, "is_private": false } ], "truncated": false } ``` #### As an MCP call ```json { "name": "solari_catalog_tiktok_account_history", "arguments": { "username": "innisfree_official", "since": "2026-09-20", "until": "2026-09-30" } } ``` #### Notes - since and until are UTC dates, and both ends are included. Without them you get the last 90 days. - A point exists only when SOLARI collected the account, so gaps between points are normal. - No points exist before 2025-12-15. - TikTok rounds counts of 10,000 and above, so small changes between points do not show. - Check current.collected_at before treating current as today's numbers. - This reads the catalog only. If the account is missing, call solari fetch tiktok account username=… first. Recording starts from then; past values cannot be filled in. #### Related tools - [`solari_catalog_tiktok_account_profile`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-profile.md) - [`solari_catalog_tiktok_account_posts`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-posts.md) - [`solari_fetch_tiktok_account`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-account.md) - [`solari_catalog_instagram_account_history`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-history.md) ### solari catalog tiktok content detail > A TikTok post, by id, video_id, or URL. - **CLI**: `solari catalog tiktok content detail` - **MCP tool**: `solari_catalog_tiktok_content_detail` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Load a TikTok post by post_id, video_id, or public URL. **When to use it** — When you need a post. For many ids at once, use content batch. **What comes back** — The post, with a transcript when one exists. #### Parameters - `post_id` (string, optional, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — post_id. Pass this, video_id, or url. - `video_id` (string, optional, pattern ^\d{15,20}$) — Public numeric TikTok id. - `url` (string, optional, ≤ 512 chars) — Public TikTok post URL. #### Response ##### `Response` - `item` (object | null) — The post. null if it does not exist or is not public. - `fetched_on_demand` (boolean) — true if the post was fetched live on this call. - `note` (string) — Only when item is null: what to do next. - `next` (string) — Only when item is null and the post was given by URL: the fetch post command that collects it. ##### `item` - `post_id` (uuid) — TikTok post id. Not interchangeable with Instagram. - `video_id` (string) — Public numeric id from the TikTok URL. - `url` (string) — Public permalink. - `account_id` (uuid) — Author account_id. - `username` (string) — Author username. - `post_type` (string) — video or carousel. - `posted_at` (timestamp) — Published at (UTC). - `caption` (string) — Caption. - `duration_seconds` (integer) — Video length. - `width / height` (integer) — Resolution. - `play_count` (integer) — Plays. - `like_count` (integer) — Likes. - `comment_count` (integer) — Comments. - `share_count` (integer) — Shares. - `collect_count` (integer) — Saves. - `is_ad` (boolean) — TikTok ad flag. - `is_pinned` (boolean) — Pinned on the profile. - `aigc_label_type` (string | null) — AI-content label, when TikTok sets one. - `original_language_code` (string | null) — Source language. - `cover_url` (string) — Cover image URL. - `video_url` (string) — Video file URL. - `images` (string[]) — Carousel slides. Empty for video. - `hashtags` (string[]) — Hashtags from the caption. - `mentions` (string[]) — Usernames mentioned in the caption. - `transcript` (string | null) — Spoken transcript. In account posts and content batch, only when include_transcript=true. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari catalog tiktok content detail video_id=7680375687139642645 include_transcript=true ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "item": { "post_id": "01a0631e-f0df-7e9d-a09b-d84bc31d3834", "video_id": "7680375687139642645", "url": "https://www.tiktok.com/@innisfree_official/video/7680375687139642645", "account_id": "019b2137-f76e-7b33-9437-26044fa7b1ed", "username": "innisfree_official", "post_type": "video", "posted_at": "2026-09-02T12:00:00Z", "caption": "Deeply hydrated skin—NO OFF HOURS. 💚 wherever the day takes MINGYU—his hydration stays SUPERCHARGED ⚡️ Green Tea Ceramide Milk: Lightweight milky toner that won't clog your pores Green Tea Ceramide Mist: Touch-free, fa …", "duration_seconds": 23, "width": 1080, "height": 1920, "play_count": 493, "like_count": 37, "comment_count": 2, "share_count": 0, "collect_count": 3, "is_ad": false, "is_pinned": false, "aigc_label_type": null, "original_language_code": null, "cover_url": "https://smr-images-b.bzine.co/tiktok/users/019b2137-f76e-7b33-9437-26044fa7b1ed/posts/01a0631e-f0df-7e9d-a09b-d84bc31d3834/medias/cover.jpg", "video_url": "https://smr-images-c.bzine.co/tiktok/users/019b2137-f76e-7b33-9437-26044fa7b1ed/posts/01a0631e-f0df-7e9d-a09b-d84bc31d3834/medias/origin.mp4", "images": [], "hashtags": [], "mentions": [], "transcript": null }, "fetched_on_demand": false } ``` #### As an MCP call ```json { "name": "solari_catalog_tiktok_content_detail", "arguments": { "video_id": "7680375687139642645" } } ``` #### Notes - vm.tiktok.com and vt.tiktok.com short links work too. - This reads the catalog only. To collect an untracked post, call solari fetch tiktok post url=… (it also tells you the author), or solari fetch tiktok posts username=… when you already know the author. #### Related tools - [`solari_fetch_tiktok_post`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-post.md) - [`solari_catalog_tiktok_content_batch`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-content-batch.md) - [`solari_catalog_tiktok_account_posts`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-posts.md) ### solari catalog tiktok content batch > Several TikTok posts at once. - **CLI**: `solari catalog tiktok content batch` - **MCP tool**: `solari_catalog_tiktok_content_batch` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Load captions and metrics for a list of TikTok post ids. Ids that cannot be found are skipped. **When to use it** — When you have ids from search or account posts and want them together. **What comes back** — The posts that were found. #### Parameters - `post_ids` (uuid[], required, 1–100 items, uuid) — TikTok post ids to load, up to 100. - `sort` (enum, optional, default "recent") — Order by newest, or by engagement. Values: `recent`, `engagement`. - `include_transcript` (boolean, optional, default false) — Include spoken transcripts. #### Response ##### `Response` - `requested` (integer) — How many ids were sent. - `found` (integer) — How many resolved. - `items` (object[]) — The posts found. ##### `items[]` - `post_id` (uuid) — TikTok post id. Not interchangeable with Instagram. - `video_id` (string) — Public numeric id from the TikTok URL. - `url` (string) — Public permalink. - `account_id` (uuid) — Author account_id. - `username` (string) — Author username. - `post_type` (string) — video or carousel. - `posted_at` (timestamp) — Published at (UTC). - `caption` (string) — Caption. - `duration_seconds` (integer) — Video length. - `width / height` (integer) — Resolution. - `play_count` (integer) — Plays. - `like_count` (integer) — Likes. - `comment_count` (integer) — Comments. - `share_count` (integer) — Shares. - `collect_count` (integer) — Saves. - `is_ad` (boolean) — TikTok ad flag. - `is_pinned` (boolean) — Pinned on the profile. - `aigc_label_type` (string | null) — AI-content label, when TikTok sets one. - `original_language_code` (string | null) — Source language. - `cover_url` (string) — Cover image URL. - `video_url` (string) — Video file URL. - `images` (string[]) — Carousel slides. Empty for video. - `hashtags` (string[]) — Hashtags from the caption. - `mentions` (string[]) — Usernames mentioned in the caption. - `transcript` (string | null) — Spoken transcript. In account posts and content batch, only when include_transcript=true. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari catalog tiktok content batch post_ids='["01a0631e-f0df-7e9d-a09b-d84bc31d3834"]' ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "requested": 1, "found": 1, "items": [ { "post_id": "01a0631e-f0df-7e9d-a09b-d84bc31d3834", "video_id": "7680375687139642645", "url": "https://www.tiktok.com/@innisfree_official/video/7680375687139642645", "account_id": "019b2137-f76e-7b33-9437-26044fa7b1ed", "username": "innisfree_official", "post_type": "video", "posted_at": "2026-09-02T12:00:00Z", "caption": "Deeply hydrated skin—NO OFF HOURS. 💚 wherever the day takes MINGYU—his hydration stays SUPERCHARGED ⚡️ Green Tea Ceramide Milk: Lightweight milky toner that won't clog your pores Green Tea Ceramide Mist: Touch-free, fa …", "duration_seconds": 23, "width": 1080, "height": 1920, "play_count": 493, "like_count": 37, "comment_count": 2, "share_count": 0, "collect_count": 3, "is_ad": false, "is_pinned": false, "aigc_label_type": null, "original_language_code": null, "cover_url": "https://smr-images-b.bzine.co/tiktok/users/019b2137-f76e-7b33-9437-26044fa7b1ed/posts/01a0631e-f0df-7e9d-a09b-d84bc31d3834/medias/cover.jpg", "video_url": "https://smr-images-b.bzine.co/tiktok/users/019b2137-f76e-7b33-9437-26044fa7b1ed/posts/01a0631e-f0df-7e9d-a09b-d84bc31d3834/medias/origin.mp4", "images": [], "hashtags": [], "mentions": [], "transcript": null } ] } ``` #### As an MCP call ```json { "name": "solari_catalog_tiktok_content_batch", "arguments": { "post_ids": [ "01a0631e-f0df-7e9d-a09b-d84bc31d3834" ] } } ``` #### Notes - This takes SOLARI post ids only. A numeric video id goes to content detail as video_id. - TikTok post ids and Instagram post ids are not interchangeable. #### Related tools - [`solari_catalog_tiktok_content_detail`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-content-detail.md) - [`solari_catalog_tiktok_content_search`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-content-search.md) ### solari catalog tiktok content search > Use this to search collected TikTok captions and video transcripts by date. - **CLI**: `solari catalog tiktok content search` - **MCP tool**: `solari_catalog_tiktok_content_search` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Keyword search over tracked TikTok posts in KR, JP, US, and TW, covering about the last six months. The TikTok catalog is small, so start with fetch tiktok post search. Use this when you need a date range. **When to use it** — When you need TikTok posts from a date range, or what is said on screen. To find posts about a topic, start with fetch tiktok post search. **What comes back** — Posts ranked by relevance, with matching text highlighted. #### Parameters - `query` (string, required) — Words to search for. - `region` (enum, optional, default "KR") — KR, JP, US, or TW. Values: `KR`, `JP`, `US`, `TW`. - `limit` (integer, optional, default 20, 1–100) — How many posts per page. - `offset` (integer, optional, default 0, 0–9800) — How many posts to skip. - `since` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only posts on or after this UTC date (YYYY-MM-DD). - `until` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only posts on or before this UTC date (YYYY-MM-DD). #### Response ##### `Response` - `query / region` (string) — The query and region applied. - `total` (integer) — Total matches. Exact up to 10,000, then saturates. - `took_ms` (integer) — Search time. - `items` (object[]) — Hits, score descending. ##### `items[]` - `post_id / video_id / url` (string) — Post identifiers and public link. - `account_id / username` (string) — Authoring account. - `caption` (string) — Caption. - `user_bio` (string) — Author bio. - `transcription_text` (string | null) — Spoken transcript. It is part of the searched text. - `transcription_language` (string | null) — Transcript language code. - `post_type` (string) — video or carousel. - `posted_at` (timestamp) — Published at (UTC). - `duration_seconds` (integer) — Video length. - `play_count / like_count / comment_count / share_count / collect_count` (integer) — Engagement. - `follower_count` (integer) — Author follower count. - `is_ad` (boolean) — TikTok's own ad flag. - `cover_url` (string) — Cover image. - `score` (number) — Relevance score. - `highlight` (object) — Matched fragments per field. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. - `region_inferred` (boolean) — true when the author's country is unknown and the post was filed by its caption language. #### Example ```console $ solari catalog tiktok content search query="올리브영 세일" limit=3 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "query": "올리브영 세일", "region": "KR", "total": 4041, "took_ms": 29, "items": [ { "post_id": "01a05c46-9a08-7e92-a40e-b1a039103118", "video_id": "7679484556189207815", "url": "https://www.tiktok.com/@flos_bonita/video/7679484556189207815", "account_id": "0196cb39-87a7-7be3-ac4a-4a80b7818a90", "username": "flos_bonita", "caption": "태닝한 산리오 키링이라니…☀️🥹💗 푸드올로지 X 산리오 콜라보 실물 너무 귀엽잖아!! 헬로키티·쿠로미·한교동·마이멜로디까지🎀 제품마다 다른 키링이라 산리오 덕후들 취향 제대로 저격💘 올영 세일 시작했으니 얼른 구경해봐요👀🛒 #푸드올로지 #태닝키티 #올리브영추천템 #올영세일", "user_bio": "화미 프로필 링크", "transcription_text": "살리오 덕후라면 절대 그냥 넘길 수 없는 영상 오늘부터 시작인 올리브영 세일과 함께 푸드올로지와 살리오 콜라보 나왔어요 이번 콜라보는 젤리 폼 앰플 젤리 3 종으로 피디아렌 앰플 젤리 글루타치원 씨 앰플 젤리 히알루론산 앰플 젤리까지 제품마다 귀여운 살리오 굿즈도 함께 만나 볼 수 있는데 헬로키티 크로미 한교동부터 마이 멜로디까지 저는 역시 헬로키티 더 쿠답게 키티 키링으로 폼구 최애 캐릭터 …", "transcription_language": "ko", "post_type": "video", "posted_at": "2026-08-29T16:02:22Z", "duration_seconds": 37, "play_count": 955, "like_count": 26, "comment_count": 0, "share_count": 0, "collect_count": 5, "follower_count": 1345, "is_ad": true, "cover_url": "https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-p-0037/oEu4VAolaEBAAYjMAjBtiyCIAABiPp9TOCAME~tplv-tiktokx-origin.image?dr=10395&x-expires=1788426000&x-signature=FAP0C10M1M1gEwD4YMB03pYd0YA%3D&t=4d5b0474&ps=13740610&sh …", "score": 53.787056, "highlight": { "caption": [ "헬로키티·쿠로미·한교동·마이멜로디까지🎀 제품마다 다른 키링이라 산리오 덕후들 취향 제대로 저격💘 올영 세일 시작했으니 얼른 구경해봐요👀🛒 #푸드올로지 #태닝키티 #올리브영추천템 #올영세일" ], "user_bio": [], "transcription_text": [ "살리오 덕후라면 절대 그냥 넘길 수 없는 영상 오늘부터 시작인 올리브영 세일과 함께 푸드올로지와 살리오 콜라보 나왔어요 이번 콜라보는 젤리 폼 앰플 젤리 3 종으로 피디아렌 앰플 젤리 글루타치원 씨 앰플 젤리 히알루론산 앰플 젤리까지 제품마다 귀여운 살리오 굿즈도 함께", "… 1 more" ] } }, "… 2 more" ] } ``` #### As an MCP call ```json { "name": "solari_catalog_tiktok_content_search", "arguments": { "query": "올리브영 세일", "limit": 3 } } ``` #### Notes - offset tops out at 9,800. Narrow the date range to go deeper. - total counts up to 10,000, then stops. - When the author's country is unknown, the post is filed under the region of its caption language and carries region_inferred=true. #### Related tools - [`solari_insight_tiktok_content_aggregate`](https://clip-pub.bzine.co/docs/tools/insight-tiktok-content-aggregate.md) - [`solari_catalog_tiktok_content_batch`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-content-batch.md) - [`solari_catalog_instagram_content_search`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-search.md) ### solari insight tiktok content aggregate > Use this to count TikTok posts. - **CLI**: `solari insight tiktok content aggregate` - **MCP tool**: `solari_insight_tiktok_content_aggregate` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Add up tracked TikTok posts by account, format, hashtag, mention, or keyword. **When to use it** — When you need cadence, hashtag mix, or average plays. For the posts themselves, use content search. **What comes back** — Counts per group, largest first. Extra metrics only if you ask for them. #### Parameters - `region` (enum, optional, default "KR") — KR, JP, US, or TW. Values: `KR`, `JP`, `US`, `TW`. - `group_by` (enum, optional) — How to split the counts. Values: `account`, `post_type`, `hashtag`, `mention`, `caption_keyword`. - `interval` (enum, optional) — Add a time series at this calendar interval. Values: `day`, `week`, `month`. - `metrics` (string[], optional) — Extra metrics besides post_count. Values: `like_sum`, `like_avg`, `comment_sum`, `comment_avg`, `view_sum`, `view_avg`, `share_sum`, `share_avg`, `collect_sum`, `collect_avg`, `follower_avg`, `account_count`. - `query` (string, optional) — Keyword filter over captions and transcripts. - `usernames` (string[], optional) — Only these TikTok usernames. - `hashtags` (string[], optional) — Only posts that have all of these hashtags. - `mentions` (string[], optional) — Only posts that mention all of these usernames. - `post_types` (string[], optional) — Only these formats. Values: `video`, `carousel`. - `since` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only posts on or after this UTC date (YYYY-MM-DD). - `until` (string, optional, pattern ^\d{4}-\d{2}-\d{2}$) — Only posts on or before this UTC date (YYYY-MM-DD). - `limit` (integer, optional, default 20, 1–50) — How many groups to return. #### Response ##### `Response` - `region` (string) — Region aggregated. - `since` (date) — Start date actually used. - `until` (date | null) — End date actually used. - `group_by` (string | null) — Grouping applied. - `interval` (string | null) — Time interval applied. - `total_posts` (integer) — Number of posts matching the filters. - `truncated` (boolean) — true if more groups existed than limit. - `buckets` (object[]) — Groups, largest first. ##### `buckets[]` - `key` (string) — Group value. A single total when group_by is omitted. - `metrics.post_count` (integer) — Post count. Always present. - `metrics.like_sum / like_avg` (number | null) — Like total and mean, when requested. - `metrics.comment_sum / comment_avg` (number | null) — Comment total and mean, when requested. - `metrics.view_sum / view_avg` (number | null) — Play total and mean, when requested. - `metrics.share_sum / collect_sum` (number | null) — Share and save totals, when requested. - `metrics.follower_avg` (number | null) — Mean follower count of authors. - `metrics.account_count` (integer | null) — Distinct accounts in the group. - `series` (object[] | null) — Per-period breakdown, when interval is set. #### Example ```console $ solari insight tiktok content aggregate group_by=account query="이니스프리" metrics='["view_sum","like_avg","account_count"]' limit=5 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "region": "KR", "since": "2026-03-04", "until": null, "group_by": "account", "interval": null, "total_posts": 20, "truncated": true, "buckets": [ { "key": "merryview_", "metrics": { "post_count": 2, "like_sum": null, "like_avg": 2378.5, "comment_sum": null, "comment_avg": null, "view_sum": 179504, "view_avg": null, "share_sum": null, "share_avg": null, "collect_sum": null, "collect_avg": null, "follower_avg": null, "account_count": 1 }, "series": null }, { "key": "_kimdayun_", "metrics": { "post_count": 1, "like_sum": null, "like_avg": 1829, "comment_sum": null, "comment_avg": null, "view_sum": 102000, "view_avg": null, "share_sum": null, "share_avg": null, "collect_sum": null, "collect_avg": null, "follower_avg": null, "account_count": 1 }, "series": null }, "… 3 more" ] } ``` #### As an MCP call ```json { "name": "solari_insight_tiktok_content_aggregate", "arguments": { "group_by": "account", "query": "이니스프리", "metrics": [ "view_sum", "like_avg", "account_count" ], "limit": 5 } } ``` #### Notes - view_* is plays. share_* and collect_* are filled here, unlike Instagram. - Coverage is KR, JP, US, and TW, about the last six months. An earlier since is moved up to the oldest date available. #### Related tools - [`solari_catalog_tiktok_content_search`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-content-search.md) - [`solari_insight_instagram_content_aggregate`](https://clip-pub.bzine.co/docs/tools/insight-instagram-content-aggregate.md) ### solari fetch instagram account > Ingest one Instagram handle into the catalog. - **CLI**: `solari fetch instagram account` - **MCP tool**: `solari_fetch_instagram_account` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Add one Instagram account to the SOLARI catalog by exact username. This is not a search. An account collected within the last day is not scraped again; an older copy is re-collected now. A handle the catalog only knows by name from a tag or mention is crawled now. **When to use it** — When catalog search does not know an exact handle you already have. **What comes back** — Whether it was ingested, the account_id, and the catalog command to read it. #### Parameters - `username` (string, required, ≤ 64 chars) — Instagram username. #### Response ##### `Response` - `ingested` (boolean) — true if this call collected it live. - `already_tracked` (boolean) — true if it was already crawled. - `fetched_on_demand` (boolean) — Same as ingested. - `account_id` (uuid) — The ingested account. - `username` (string) — Resolved handle. - `note` (string) — What to expect next. - `next` (string) — Catalog command to read the result. - `refreshed` (boolean) — true if a stored copy older than a day was re-collected now. - `collected_at` (timestamp) — When the stored profile was collected (UTC). #### Example ```console $ solari fetch instagram account username=innisfreeofficial ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "ingested": false, "already_tracked": true, "fetched_on_demand": false, "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "note": "Already in the SOLARI catalog. Nothing was scraped.", "next": "solari catalog instagram account profile username=innisfreeofficial" } ``` #### As an MCP call ```json { "name": "solari_fetch_instagram_account", "arguments": { "username": "innisfreeofficial" } } ``` #### Notes - Do not use this to search a name. Use catalog account search first. - A first-time ingest can take several seconds. Metrics and collaborations stay empty until the crawl finishes. - A handle that catalog search cannot find but whose profile comes back empty is a name-only placeholder. This call crawls it. #### Related tools - [`solari_catalog_instagram_account_search`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-search.md) - [`solari_catalog_instagram_account_profile`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-profile.md) - [`solari_fetch_instagram_posts`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-posts.md) ### solari fetch instagram posts > Collect an Instagram account's posts, reels, or tagged posts live. - **CLI**: `solari fetch instagram posts` - **MCP tool**: `solari_fetch_instagram_posts` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Collect one tab of an Instagram account live and get its posts back in the same call, in tab order, with views, likes, and comments. type picks the tab: posts (the profile grid), reels, or tagged_posts (other accounts' posts that tag this account). **When to use it** — When you need an account's latest posts or current reel views, or catalog account posts looks sparse or stale. **What comes back** — The collected posts, in the same item shape as catalog account posts, and what the collection did. #### Parameters - `username` (string, required, ≤ 64 chars) — Instagram username. - `type` (enum, optional, default "posts") — posts (profile grid), reels (reels tab), or tagged_posts (other accounts' posts that tag this account). Values: `posts`, `reels`, `tagged_posts`. - `pages` (integer, optional, default 1, 1–3) — Pages of the tab to collect, roughly 12 posts each. - `cursor` (string, optional, ≤ 8192 chars) — collection.next_cursor from the previous call, to continue further back. #### Response ##### `Response` - `found` (boolean) — false if Instagram has no account under that handle. items is empty then. - `account_id` (uuid) — The account. - `username` (string) — Resolved handle. - `type` (string) — Tab that was collected. - `collection` (object) — What the collection did. - `total` (integer) — Posts in items. - `items` (object[]) — The collected posts, in tab order. - `note` (string) — Only when there is something to say: private account, tab unavailable, posts still being stored, or more pages available. - `next` (string) — Only when the tab goes further back: the same call with cursor=next_cursor to continue. ##### `collection` - `type / pages` (string / integer) — Tab and pages read. - `fetched_count` (integer) — Posts Instagram returned. - `stored_count` (integer) — Posts stored or updated in the catalog by this call. - `has_more` (boolean) — true if the tab goes further back than the pages read. Continue with cursor=next_cursor. - `truncated` (boolean) — true if the collection stopped before every requested page was read. - `pending_count` (integer) — Posts still being stored. Their items carry only post_id, slug, url, and posted_at for now. - `skipped_reason` (string | null) — Why nothing was collected. private means the account is private. - `unavailable_reason` (string | null) — Why Instagram did not return the tab. ##### `items[]` - `post_id` (uuid) — SOLARI post id. - `slug` (string) — Instagram shortcode. - `url` (string) — Public permalink. - `post_type` (string) — reel, video, photo, or carousel. - `posted_at` (timestamp) — Published at (UTC). - `text` (string) — Caption. - `like_count / comment_count` (integer) — Engagement. - `play_count` (integer | null) — Views. null when Instagram gave no view count, as for most photos. - `media_count` (integer) — Number of media items. - `is_paid_partnership` (boolean | null) — Instagram paid-partnership label. - `medias` (object[]) — Every media in carousel order. - `assets` (object[]) — Media files in order. Each has a direct-download asset_url, media_type, and video_duration. - `thumbnail_url` (string) — Thumbnail. - `author_username / author_account_id` (string / uuid) — tagged_posts only: the account that posted it. #### Example ```console $ solari fetch instagram posts username=innisfreeofficial type=reels ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "found": true, "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "type": "reels", "collection": { "type": "reels", "pages": 1, "fetched_count": 12, "stored_count": 12, "has_more": true, "truncated": false, "next_cursor": "eyJhIjoiMDE4Y2FiY2UiLCJ0IjoicmVlbHMiLCJjIjoiUUZEIn0", "pending_count": 0, "skipped_reason": null, "unavailable_reason": null }, "total": 12, "items": [ { "post_id": "01a06275-d974-7fda-98ee-dd3ee15b4dcf", "slug": "DcyMAmUh6FZ", "url": "https://www.instagram.com/p/DcyMAmUh6FZ/", "post_type": "reel", "posted_at": "2026-09-02T12:00:06+00:00", "text": "Deeply hydrated skin—NO OFF HOURS. 💚\nwherever the day takes MINGYU (@min9yu_k)—his hydration stays SUPERCHARGED ⚡️\n\nGreen Tea Ceramide Milk: Lightweight milky toner that won‘t clog your pores\nGreen Tea Ceramide Mist: Tou …", "like_count": 3224, "comment_count": 57, "play_count": 22467, "media_count": 1, "is_paid_partnership": false, "medias": [ { "media_type": "video", "media_url": "https://smr-images-b.bzine.co/users/018cabce-14cc-7544-8890-7811ec33ef74/posts/01a06275-d974-7fda-98ee-dd3ee15b4dcf/medias/01a06275-db2b-77f7-a020-b4beb744771f.mp4", "thumbnail_url": "https://bzine.co/cdn-cgi/media/width=480,mode=frame,time=0ms/https://smr-images.bzine.co/users/018cabce-14cc-7544-8890-7811ec33ef74/posts/01a06275-d974-7fda-98ee-dd3ee15b4dcf/medias/01a06275-db2b-77f7-a020-b4beb744771f.m …", "video_duration": 23.868000030517578, "tags": [] } ], "assets": [ { "asset_url": "https://smr-images-b.bzine.co/users/018cabce-14cc-7544-8890-7811ec33ef74/posts/01a06275-d974-7fda-98ee-dd3ee15b4dcf/medias/01a06275-db2b-77f7-a020-b4beb744771f.mp4", "media_type": "video", "video_duration": 23.868000030517578 } ], "thumbnail_url": "https://bzine.co/cdn-cgi/media/width=480,mode=frame,time=0ms/https://smr-images.bzine.co/users/018cabce-14cc-7544-8890-7811ec33ef74/posts/01a06275-d974-7fda-98ee-dd3ee15b4dcf/medias/01a06275-db2b-77f7-a020-b4beb744771f.m …" }, "… 11 more" ], "note": "The tab has more posts: request up to 3 pages to collect further back.", "next": "solari fetch instagram posts username=innisfreeofficial type=reels pages=3 cursor=eyJhIjoiMDE4Y2FiY2UiLCJ0IjoicmVlbHMiLCJjIjoiUUZEIn0" } ``` #### As an MCP call ```json { "name": "solari_fetch_instagram_posts", "arguments": { "username": "innisfreeofficial", "type": "reels" } } ``` #### Notes - Use type=reels for view counts. On the profile grid, photos come back with play_count null. - Prefer this over catalog instagram account posts when you need every recent post or current views. The stored catalog can be sparse or stale. - A call usually takes 5 to 45 seconds. Everything collected is also stored in the catalog. - A private account returns no items and collection.skipped_reason=private. An unknown handle is collected first; found=false means Instagram has no such account. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_catalog_instagram_account_posts`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-posts.md) - [`solari_fetch_instagram_account`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-account.md) - [`solari_fetch_instagram_post`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-post.md) - [`solari_fetch_instagram_hashtag_posts`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-hashtag-posts.md) ### solari fetch instagram post > Collect one Instagram post by URL and get its author. - **CLI**: `solari fetch instagram post` - **MCP tool**: `solari_fetch_instagram_post` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Collect one Instagram post into the SOLARI catalog by its public URL or shortcode, and learn who posted it. If the post is already stored, nothing is scraped. **When to use it** — When you were given a post link, catalog content detail says item=null, and you do not know the author. **What comes back** — Whether it was collected, the post with its author, and the fetch command to crawl that author. #### Parameters - `url` (string, optional, ≤ 512 chars) — Public post URL (/p/, /reel/, or /tv/). - `slug` (string, optional, pattern ^[A-Za-z0-9_-]{3,20}$) — Instagram shortcode. Wins over url. #### Response ##### `Response` - `ingested` (boolean) — true if this call collected it live. - `already_tracked` (boolean) — true if it was already in the catalog. - `fetched_on_demand` (boolean) — Same as ingested. - `found` (boolean) — false if Instagram has no public post at that reference. - `post_id` (uuid) — The stored post. - `account_id` (uuid) — The author's account. - `username` (string) — The author's handle. - `item` (object | null) — The post, with assets. - `note` (string) — What to expect next. - `next` (string) — Fetch command to crawl the author. ##### `item` - `post_id` (uuid) — Post id for other content tools. - `slug` (string) — Shortcode from the public URL. - `author_id` (uuid) — Author account_id. - `username` (string) — Author username. - `full_name` (string | null) — Display name. - `profile_pic_url` (string | null) — Profile picture URL. - `follower_count` (integer | null) — Author follower count. - `region` (string | null) — Author region. - `posted_at` (timestamp) — Published at (UTC). - `media_type` (string) — image, video, or carousel. - `play_count` (integer | null) — Video plays. Null for images. - `like_count` (integer | null) — Likes. - `text` (string | null) — Caption. - `media_url` (string) — Media URL. - `thumbnail_url` (string) — Thumbnail URL. - `score` (number | null) — Ranking score. Null outside ranked lists. - `efficiency_score` (number | null) — Performance vs. the author's followers. - `est_percentile` (number | null) — Region percentile, 0–1. - `total_views_3m` (integer | null) — Author views in the last 3 months. - `median_views_3m` (integer | null) — Author median views in the last 3 months. - `recent_collab_brands` (string[]) — Brands the author recently collaborated with. - `item_type` (string) — Item type. Always "content". - `content_source` (string | null) — Which feed the post came from. Null when not from a feed. - `is_saved` (boolean | null) — Whether you saved this post in SOLARI. Null when unknown. - `updated_at` (timestamp | null) — When metrics were last refreshed. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari fetch instagram post url=https://www.instagram.com/p/DcyMAmUh6FZ/ ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "ingested": true, "already_tracked": false, "fetched_on_demand": true, "found": true, "post_id": "01a06275-d974-7fda-98ee-dd3ee15b4dcf", "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "item": { "account_id": "018cabce-14cc-7544-8890-7811ec33ef74", "item_type": "content", "post_id": "01a06275-d974-7fda-98ee-dd3ee15b4dcf", "author_id": "018cabce-14cc-7544-8890-7811ec33ef74", "username": "innisfreeofficial", "slug": "DcyMAmUh6FZ", "posted_at": "2026-09-02T12:00:06Z", "media_type": "video", "play_count": 22467, "like_count": 3224 }, "note": "Collected live and stored now. The author is known by name only: run next to crawl their profile and posts.", "next": "solari fetch instagram account username=innisfreeofficial" } ``` #### As an MCP call ```json { "name": "solari_fetch_instagram_post", "arguments": { "url": "https://www.instagram.com/p/DcyMAmUh6FZ/" } } ``` #### Notes - The author arrives as a name-only account. Run next (fetch instagram account) to crawl their profile and posts. - A first-time collect takes a few seconds. #### Related tools - [`solari_fetch_instagram_post_assets`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-post-assets.md) - [`solari_catalog_instagram_content_detail`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-detail.md) - [`solari_fetch_instagram_account`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-account.md) - [`solari_fetch_instagram_posts`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-posts.md) ### solari fetch instagram post assets > Original-size download links for one Instagram post. - **CLI**: `solari fetch instagram post assets` - **MCP tool**: `solari_fetch_instagram_post_assets` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Get fresh download links for every media file of one Instagram post, at the largest size Instagram serves: a reel, a single photo or video, or every carousel slide. Every call reads the post from Instagram live. **When to use it** — When you need the original files of a post. The assets on other tools point at stored copies, which can be smaller. **What comes back** — The post's author and type, and one download link per media file in order. #### Parameters - `url` (string, optional, ≤ 512 chars) — Public post URL (/p/, /reel/, or /tv/). - `slug` (string, optional, pattern ^[A-Za-z0-9_-]{3,20}$) — Instagram shortcode. Wins over url. #### Response ##### `Response` - `found` (boolean) — false if Instagram has no public post at that reference. - `slug` (string | null) — Shortcode of the post. - `url` (string | null) — Public permalink. - `username` (string | null) — The author's handle. - `post_type` (string | null) — reel, video, photo, or carousel. - `media_count` (integer) — Number of files in assets. - `assets` (object[]) — The media files in order. - `note` (string | null) — Why there is nothing to download, when that is the case. ##### `assets[]` - `index` (integer) — Position of the file in the post, from 1. - `media_type` (string) — video or image. - `asset_url` (string) — Download link for the file at the largest size the platform serves. It is temporary, so download promptly. - `fallback_urls` (string[]) — Other links to the same file, to try in order when asset_url fails. - `width` (integer | null) — Width in pixels, when known. - `height` (integer | null) — Height in pixels, when known. - `video_duration` (number | null) — Video length in seconds. - `file_extension` (string) — File extension to save with, such as mp4 or jpg. - `size_bytes` (integer | null) — File size in bytes, when known. - `referer` (string | null) — Send this as the Referer header when downloading. Null when no header is needed. #### Example ```console $ solari fetch instagram post assets slug=DcyMAmUh6FZ ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "found": true, "slug": "DcyMAmUh6FZ", "video_id": null, "url": "https://www.instagram.com/p/DcyMAmUh6FZ/", "username": "innisfreeofficial", "post_type": "reel", "media_count": 1, "assets": [ { "index": 1, "media_type": "video", "asset_url": "https://scontent-cph2-1.cdninstagram.com/….mp4?…", "fallback_urls": [], "width": 720, "height": 1280, "video_duration": 23.868, "file_extension": "mp4", "size_bytes": null, "referer": null } ], "note": null } ``` #### As an MCP call ```json { "name": "solari_fetch_instagram_post_assets", "arguments": { "slug": "DcyMAmUh6FZ" } } ``` #### Notes - To save the files in one step, run solari instagram download content slugs=… dir=… instead. It calls this tool and downloads every file. - The links are temporary signed links. Download promptly and call again for fresh ones. - Every call goes out to Instagram and takes a few seconds. #### Related tools - [`solari instagram download content`](https://clip-pub.bzine.co/docs/tools/instagram-download-content.md) - [`solari_fetch_instagram_post`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-post.md) - [`solari_catalog_instagram_content_detail`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-detail.md) - [`solari_fetch_tiktok_post_assets`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-post-assets.md) ### solari fetch instagram account search > Find accounts on Instagram by name, live. - **CLI**: `solari fetch instagram account search` - **MCP tool**: `solari_fetch_instagram_account_search` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Ask Instagram itself for accounts matching a name or handle fragment. Catalog account search only knows tracked accounts; this finds the rest and tells you which ones are already tracked. **When to use it** — When catalog account search returns nothing for a name, or you need the exact handle before ingesting it. **What comes back** — Up to 50 accounts in Instagram's order, with account_id on the ones already in the catalog. #### Parameters - `query` (string, required, ≤ 100 chars) — Name or handle fragment, with or without @. #### Response ##### `Response` - `query` (string) — The text the lookup ran on, without @. - `items` (object[]) — Matching accounts, Instagram's order. - `found` (integer) — Accounts returned. - `tracked` (integer) — How many carry an account_id. ##### `items[]` - `username` (string) — Handle, lowercased. - `full_name` (string | null) — Display name. - `is_verified` (boolean) — Verified badge. - `is_private` (boolean) — Private account. - `profile_picture_url` (string | null) — Profile picture URL. - `account_id` (uuid | null) — SOLARI account id if already tracked; null means ingest it with fetch instagram account first. #### Example ```console $ solari fetch instagram account search query=innisfree ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "query": "innisfree", "items": [ { "username": "innisfreeofficial", "full_name": "innisfree official", "is_verified": true, "is_private": false, "profile_picture_url": "https://scontent.cdninstagram.com/v/t51.2885-19/example.jpg", "account_id": "018cabce-14cc-7544-8890-7811ec33ef74" }, { "username": "innisfree_jp", "full_name": "innisfree Japan", "is_verified": false, "is_private": false, "profile_picture_url": null, "account_id": null } ], "found": 2, "tracked": 1 } ``` #### As an MCP call ```json { "name": "solari_fetch_instagram_account_search", "arguments": { "query": "innisfree" } } ``` #### Notes - Nothing is stored. To bring an untracked hit into the catalog, run fetch instagram account with its username. - Order and ranking are Instagram's, so the official account is not always first: check is_verified. - No follower counts here; read them with catalog account profile once the account is tracked. #### Related tools - [`solari_catalog_instagram_account_search`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-search.md) - [`solari_fetch_instagram_account`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-account.md) - [`solari_catalog_instagram_account_profile`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-account-profile.md) ### solari fetch instagram hashtag posts > Collect a live page of a hashtag's posts. - **CLI**: `solari fetch instagram hashtag posts` - **MCP tool**: `solari_fetch_instagram_hashtag_posts` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Collect one live page of an Instagram hashtag feed, store the posts, and get them back in feed order. Every call goes out to Instagram, so read catalog tag search first. **When to use it** — When a hashtag is missing or stale in catalog tag search, or you need its top posts or reels right now. **What comes back** — The posts of that page, already stored, and a cursor for the next page. #### Parameters - `hashtag` (string, required, ≤ 150 chars) — Hashtag, with or without #. - `tab` (enum, optional) — recent, top, or clips (reels). Values: `recent`, `top`, `clips`. - `cursor` (string, optional, ≤ 8192 chars) — next_cursor from the previous page. #### Response ##### `Response` - `ingested` (boolean) — true if this call stored at least one post. - `fetched_on_demand` (boolean) — Always true: every call collects live. - `hashtag` (string) — The hashtag the fetch ran on, without #. - `tab` (string) — Feed the page came from. - `is_hidden` (boolean) — true if Instagram returns no feed for this hashtag: hidden, restricted, or nonexistent. items is empty then. - `hidden_reason` (string | null) — Instagram's label for a hidden hashtag. - `found` (integer) — Posts in items. - `fetched_count` (integer) — Posts Instagram returned for this page. Higher than found when some could not be stored. - `items` (object[]) — The posts of this page, in feed order. - `next_cursor` (string | null) — Pass back as cursor for the next page. null when the feed ends. - `note` (string) — What to expect next. - `next` (string) — Catalog command that reads the same tag later. ##### `items[]` - `id` (uuid) — Post id. - `slug` (string) — Instagram shortcode. - `text` (string) — Caption. - `posted_at` (timestamp) — Published at (UTC). - `username / user_id / account_id` (string) — Authoring account. - `like_count / comment_count` (integer) — Engagement. - `play_count` (integer | null) — Video plays. - `media_type` (string) — Post format. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored yet. #### Example ```console $ solari fetch instagram hashtag posts hashtag=ootd tab=top ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "ingested": true, "fetched_on_demand": true, "hashtag": "ootd", "tab": "top", "is_hidden": false, "hidden_reason": null, "found": 1, "fetched_count": 1, "items": [ { "id": "01a06a16-552d-7099-ae0a-77e6b68de960", "slug": "DaS66VzJBPW", "text": "SEOUL OOTD — 這次搭配了四種完全不同風格 #ootd #lynn__ootd #穿搭販賣機 #韓國穿搭", "posted_at": "2026-07-02T15:33:13Z", "virtual_campaign": null, "username": "llling_yinnnnn", "user_id": "019dbc46-1a67-7ef5-b95a-2fb466790d04", "account_id": "019dbc46-1a67-7ef5-b95a-2fb466790d04", "profile_picture_url": null, "like_count": 32, "comment_count": 1, "media_type": "reel", "play_count": 888, "media": [] } ], "next_cursor": "eyJwIjoxLCJtIjoiUVZGRC4uLiJ9", "note": "These posts were collected live and are stored now. solari_catalog_instagram_tag_search lists them after its next daily refresh.", "next": "solari catalog instagram tag search query=#ootd" } ``` #### As an MCP call ```json { "name": "solari_fetch_instagram_hashtag_posts", "arguments": { "hashtag": "ootd", "tab": "top" } } ``` #### Notes - One page is roughly 20 to 30 posts and takes several seconds. - A cursor only works with the hashtag and tab it came from. - The feed ends only when next_cursor is null. A page can come back with found 0 and a next_cursor: keep going. - Instagram answers a hidden, restricted, or misspelled hashtag the same way: is_hidden=true and no posts. Check the spelling with hashtag search. - The posts are stored at once, but catalog tag search lists them only after its next daily refresh. - Media files of a just-collected post can take a moment to be stored, so asset_url may be null at first. - When likes_hidden is true, do not use like_count. The author hid likes, so it is null or may not be the real count. #### Related tools - [`solari_fetch_instagram_hashtag_search`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-hashtag-search.md) - [`solari_catalog_instagram_tag_search`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-tag-search.md) - [`solari_catalog_instagram_content_batch`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-content-batch.md) ### solari fetch instagram hashtag search > Find hashtags by keyword, with their sizes. - **CLI**: `solari fetch instagram hashtag search` - **MCP tool**: `solari_fetch_instagram_hashtag_search` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Look hashtags up on Instagram by keyword and see how many posts each one has. Nothing is stored. **When to use it** — When you need the exact spelling or the biggest variant of a tag before reading or collecting it. **What comes back** — Up to 20 hashtags with the post count Instagram reports. #### Parameters - `query` (string, required, ≤ 100 chars) — Keyword, with or without #. #### Response ##### `Response` - `query` (string) — The keyword the lookup ran on. - `hashtags` (object[]) — Matching hashtags, best match first. - `found` (integer) — Hashtags returned. ##### `hashtags[]` - `name` (string) — Hashtag without #. - `post_count` (integer | null) — Posts Instagram reports under it. #### Example ```console $ solari fetch instagram hashtag search query=skincare ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "query": "skincare", "hashtags": [ { "name": "skincare", "post_count": 128000000 }, { "name": "skincareroutine", "post_count": 31000000 }, { "name": "skincaretips", "post_count": 9400000 } ], "found": 3 } ``` #### As an MCP call ```json { "name": "solari_fetch_instagram_hashtag_search", "arguments": { "query": "skincare" } } ``` #### Notes - post_count is Instagram's own total, not the number of posts SOLARI has collected. - There is no pagination: Instagram returns at most 20 candidates. #### Related tools - [`solari_fetch_instagram_hashtag_posts`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-hashtag-posts.md) - [`solari_catalog_instagram_tag_search`](https://clip-pub.bzine.co/docs/tools/catalog-instagram-tag-search.md) ### solari fetch tiktok account > Ingest one TikTok handle into the catalog. - **CLI**: `solari fetch tiktok account` - **MCP tool**: `solari_fetch_tiktok_account` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Add one TikTok account to the SOLARI catalog by exact username. This is not a search. If it is already stored, nothing is scraped. **When to use it** — When catalog search does not know an exact handle you already have. **What comes back** — Whether it was ingested, the account_id, and the catalog command to read it. #### Parameters - `username` (string, required, ≤ 64 chars) — TikTok username. #### Response ##### `Response` - `ingested` (boolean) — true if this call collected it live. - `already_tracked` (boolean) — true if it was already in the catalog. - `fetched_on_demand` (boolean) — Same as ingested. - `account_id` (uuid) — The ingested account. - `username` (string) — Resolved handle. - `note` (string) — What to expect next. - `next` (string) — Catalog command to read the result. #### Example ```console $ solari fetch tiktok account username=innisfree_official ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "ingested": false, "already_tracked": true, "fetched_on_demand": false, "account_id": "01a0631e-f0df-7e9d-a09b-d84bc31d3834", "username": "innisfree_official", "note": "Already in the SOLARI catalog. Nothing was scraped.", "next": "solari catalog tiktok account profile username=innisfree_official" } ``` #### As an MCP call ```json { "name": "solari_fetch_tiktok_account", "arguments": { "username": "innisfree_official" } } ``` #### Notes - Do not use this to search a name. Use catalog account search first. - A first-time ingest can take 10 to 40 seconds. Only recent posts exist until the crawl finishes. #### Related tools - [`solari_catalog_tiktok_account_search`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-search.md) - [`solari_catalog_tiktok_account_profile`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-profile.md) - [`solari_fetch_tiktok_posts`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-posts.md) - [`solari_fetch_tiktok_account_search`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-account-search.md) ### solari fetch tiktok post > Collect one TikTok post by URL and get its author. - **CLI**: `solari fetch tiktok post` - **MCP tool**: `solari_fetch_tiktok_post` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Collect one TikTok post into the SOLARI catalog by its public URL, and learn who posted it. If the post is already stored, nothing is scraped. **When to use it** — When you were given a post link, catalog content detail says item=null, and you do not know the author. **What comes back** — Whether it was collected, the post with its author, and the fetch command to crawl that author. #### Parameters - `url` (string, required, ≤ 512 chars) — Public post URL, including vm.tiktok.com and vt.tiktok.com short links. #### Response ##### `Response` - `ingested` (boolean) — true if this call collected it live. - `already_tracked` (boolean) — true if it was already in the catalog. - `fetched_on_demand` (boolean) — Same as ingested. - `found` (boolean) — false if TikTok has no public post at that URL. - `post_id` (uuid) — The stored post. - `account_id` (uuid) — The author's account. - `username` (string) — The author's handle. - `item` (object | null) — The post, with assets. - `note` (string) — What to expect next. - `next` (string) — Fetch command to crawl the author. ##### `item` - `post_id` (uuid) — TikTok post id. Not interchangeable with Instagram. - `video_id` (string) — Public numeric id from the TikTok URL. - `url` (string) — Public permalink. - `account_id` (uuid) — Author account_id. - `username` (string) — Author username. - `post_type` (string) — video or carousel. - `posted_at` (timestamp) — Published at (UTC). - `caption` (string) — Caption. - `duration_seconds` (integer) — Video length. - `width / height` (integer) — Resolution. - `play_count` (integer) — Plays. - `like_count` (integer) — Likes. - `comment_count` (integer) — Comments. - `share_count` (integer) — Shares. - `collect_count` (integer) — Saves. - `is_ad` (boolean) — TikTok ad flag. - `is_pinned` (boolean) — Pinned on the profile. - `aigc_label_type` (string | null) — AI-content label, when TikTok sets one. - `original_language_code` (string | null) — Source language. - `cover_url` (string) — Cover image URL. - `video_url` (string) — Video file URL. - `images` (string[]) — Carousel slides. Empty for video. - `hashtags` (string[]) — Hashtags from the caption. - `mentions` (string[]) — Usernames mentioned in the caption. - `transcript` (string | null) — Spoken transcript. In account posts and content batch, only when include_transcript=true. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari fetch tiktok post url=https://www.tiktok.com/@innisfree_official/video/7680375687139642645 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "ingested": true, "already_tracked": false, "fetched_on_demand": true, "found": true, "post_id": "01a0631e-f0df-7e9d-a09b-d84bc31d3900", "account_id": "01a0631e-f0df-7e9d-a09b-d84bc31d3834", "username": "innisfree_official", "item": { "account_id": "01a0631e-f0df-7e9d-a09b-d84bc31d3834", "post_id": "01a0631e-f0df-7e9d-a09b-d84bc31d3900", "video_id": "7680375687139642645", "url": "https://www.tiktok.com/@innisfree_official/video/7680375687139642645", "username": "innisfree_official", "post_type": "video", "posted_at": "2026-09-01T09:00:00Z", "play_count": 12000, "like_count": 800 }, "note": "Collected live and stored now. The author is known by name only: run next to crawl their profile and posts.", "next": "solari fetch tiktok account username=innisfree_official" } ``` #### As an MCP call ```json { "name": "solari_fetch_tiktok_post", "arguments": { "url": "https://www.tiktok.com/@innisfree_official/video/7680375687139642645" } } ``` #### Notes - The author arrives as a name-only account. Run next (fetch tiktok account) to crawl their profile and posts. - A first-time collect takes a few seconds. #### Related tools - [`solari_fetch_tiktok_post_assets`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-post-assets.md) - [`solari_catalog_tiktok_content_detail`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-content-detail.md) - [`solari_fetch_tiktok_account`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-account.md) - [`solari_fetch_tiktok_posts`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-posts.md) ### solari fetch tiktok post assets > Original-size download links for one TikTok post. - **CLI**: `solari fetch tiktok post assets` - **MCP tool**: `solari_fetch_tiktok_post_assets` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Get fresh download links for the media of one TikTok post, at the largest size TikTok serves: the video, or every photo of a photo post. Every call reads the post from TikTok live. **When to use it** — When you need the original files of a post. The assets on other tools point at stored copies, which can be smaller. **What comes back** — The post's author and type, and one download link per media file in order. #### Parameters - `url` (string, optional, ≤ 512 chars) — Public post URL, including vm.tiktok.com and vt.tiktok.com short links. Wins over video_id. - `video_id` (string, optional, pattern ^\d{15,20}$) — Numeric video id. Only for posts already in the catalog; use url otherwise. #### Response ##### `Response` - `found` (boolean) — false if TikTok has no public post at that reference. - `video_id` (string | null) — Public numeric id of the post. - `url` (string | null) — Public permalink. - `username` (string | null) — The author's handle. - `post_type` (string | null) — video or carousel. - `media_count` (integer) — Number of files in assets. - `assets` (object[]) — The media files in order. - `note` (string | null) — Why there is nothing to download, when that is the case. ##### `assets[]` - `index` (integer) — Position of the file in the post, from 1. - `media_type` (string) — video or image. - `asset_url` (string) — Download link for the file at the largest size the platform serves. It is temporary, so download promptly. - `fallback_urls` (string[]) — Other links to the same file, to try in order when asset_url fails. - `width` (integer | null) — Width in pixels, when known. - `height` (integer | null) — Height in pixels, when known. - `video_duration` (number | null) — Video length in seconds. - `file_extension` (string) — File extension to save with, such as mp4 or jpg. - `size_bytes` (integer | null) — File size in bytes, when known. - `referer` (string | null) — Send this as the Referer header when downloading. Null when no header is needed. #### Example ```console $ solari fetch tiktok post assets url=https://www.tiktok.com/@innisfree_official/video/7680375687139642645 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "found": true, "slug": null, "video_id": "7680375687139642645", "url": "https://www.tiktok.com/@innisfree_official/video/7680375687139642645", "username": "innisfree_official", "post_type": "video", "media_count": 1, "assets": [ { "index": 1, "media_type": "video", "asset_url": "https://www.tiktok.com/aweme/v1/play/?…", "fallback_urls": [ "https://www.tiktok.com/aweme/v1/play/?…" ], "width": 1080, "height": 1920, "video_duration": 23, "file_extension": "mp4", "size_bytes": 2775677, "referer": "https://www.tiktok.com/" } ], "note": null } ``` #### As an MCP call ```json { "name": "solari_fetch_tiktok_post_assets", "arguments": { "url": "https://www.tiktok.com/@innisfree_official/video/7680375687139642645" } } ``` #### Notes - To save the files in one step, run solari tiktok download content urls=… dir=… instead. It calls this tool and downloads every file. - TikTok rejects a video download without the Referer header, so send the referer value with the request. - The links are temporary signed links. Download promptly and call again for fresh ones. #### Related tools - [`solari tiktok download content`](https://clip-pub.bzine.co/docs/tools/tiktok-download-content.md) - [`solari_fetch_tiktok_post`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-post.md) - [`solari_catalog_tiktok_content_detail`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-content-detail.md) - [`solari_fetch_instagram_post_assets`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-post-assets.md) ### solari fetch tiktok posts > Collect one TikTok account's posts into the catalog. - **CLI**: `solari fetch tiktok posts` - **MCP tool**: `solari_fetch_tiktok_posts` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Collect posts for one TikTok account into the SOLARI catalog by exact username. This is not a post listing. If the handle is already stored, nothing is scraped. **When to use it** — When catalog posts does not know an exact handle you already have. **What comes back** — Whether it was ingested, how many posts came back, and the catalog command to read them. #### Parameters - `username` (string, required, ≤ 64 chars) — TikTok username. #### Response ##### `Response` - `ingested` (boolean) — true if this call collected it live. - `already_tracked` (boolean) — true if it was already in the catalog. - `fetched_on_demand` (boolean) — Same as ingested. - `found` (boolean) — false if the handle could not be collected. - `account_id` (uuid) — The ingested account. - `username` (string) — Resolved handle. - `total` (integer) — Posts available so far. - `note` (string) — What to expect next. - `next` (string) — Catalog command to read the result. #### Example ```console $ solari fetch tiktok posts username=innisfree_official ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "ingested": false, "already_tracked": true, "fetched_on_demand": false, "found": true, "account_id": "01a0631e-f0df-7e9d-a09b-d84bc31d3834", "username": "innisfree_official", "total": 12, "note": "Already in the SOLARI catalog. Nothing was scraped.", "next": "solari catalog tiktok account posts username=innisfree_official" } ``` #### As an MCP call ```json { "name": "solari_fetch_tiktok_posts", "arguments": { "username": "innisfree_official" } } ``` #### Notes - Do not use this to list stored posts. Use catalog tiktok account posts for that. - A first-time ingest can take 10 to 40 seconds. Only recent posts exist until the crawl finishes. #### Related tools - [`solari_fetch_tiktok_account`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-account.md) - [`solari_catalog_tiktok_account_posts`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-posts.md) - [`solari_catalog_tiktok_account_search`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-search.md) ### solari fetch tiktok account search > Find TikTok accounts by name, live. Start here on TikTok. - **CLI**: `solari fetch tiktok account search` - **MCP tool**: `solari_fetch_tiktok_account_search` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Ask TikTok itself for accounts matching a name or handle fragment. Start here for any TikTok name, because the TikTok catalog is small. Hits already in the catalog carry account_id; for the rest, fetch tiktok account adds the one you pick. **When to use it** — Whenever you have a TikTok brand or creator name. Use it before catalog account search. **What comes back** — Up to limit candidates in TikTok's order, a cursor for the next page, and the command to read or add the first one. #### Parameters - `query` (string, required, ≤ 100 chars) — Name or handle fragment, with or without @. - `limit` (integer, optional, default 10, 1–30) — How many hits per page, at most. - `cursor` (string, optional, ≤ 1024 chars) — next_cursor from the previous page of the same query. Leave it out for the first page. #### Response ##### `Response` - `query` (string) — The text the lookup ran on, without @. - `items` (object[]) — Matching accounts, TikTok's order. - `total` (integer) — Hits on this page. - `has_more` (boolean) — true when TikTok has another page. - `next_cursor` (string | null) — Pass it back as cursor with the same query. Null on the last page. - `next` (string) — Command for the first hit: its catalog profile when it is already collected, else fetch tiktok account. Only when there is a hit. ##### `items[]` - `username` (string) — Handle, without the @. - `nickname` (string | null) — Display name. - `bio` (string | null) — Bio text. - `is_verified` (boolean | null) — Verified badge. - `follower_count` (integer | null) — Followers, as TikTok reports them now. - `profile_pic_url` (string | null) — Profile picture URL. - `url` (string) — Public profile URL. - `account_id` (uuid | null) — TikTok account_id when the account is already in the catalog, else null. #### Example ```console $ solari fetch tiktok account search query=innisfree limit=1 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "query": "innisfree", "items": [ { "username": "innisfree_official", "nickname": "Innisfreeofficial", "bio": "NATURE MEETS KOREAN SKIN SCIENCE", "is_verified": true, "follower_count": 143900, "profile_pic_url": "https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-avt-0068/3f8e48dc4a284a8ead37e93175ebdb86~tplv-tiktokx-cropcenter:720:720.jpeg?…", "url": "https://www.tiktok.com/@innisfree_official", "account_id": "019b2137-f76e-7b33-9437-26044fa7b1ed" } ], "total": 1, "has_more": true, "next_cursor": "eyJjIjoiMSIsInMiOiIyMDI2MDkyOTA2NDMxMkE3QzRFMTlCMkQzRjVBOEM2RTAxIn0", "next": "solari catalog tiktok account profile username=innisfree_official" } ``` #### As an MCP call ```json { "name": "solari_fetch_tiktok_account_search", "arguments": { "query": "innisfree", "limit": 1 } } ``` #### Notes - Order and ranking are TikTok's own, so the official account is not always first: check is_verified and follower_count before choosing. - Hits are saved as thin records. A hit with account_id is already in the catalog, so the catalog tiktok tools read it. For a hit without one, fetch tiktok account with its username adds it. - When has_more is true, pass next_cursor as cursor with the same query for the next page. A cursor does not carry over to another query. - Every call asks TikTok live, takes a few seconds, and is not cached. An empty items list means TikTok matched nothing. #### Related tools - [`solari_fetch_tiktok_account`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-account.md) - [`solari_catalog_tiktok_account_search`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-search.md) - [`solari_catalog_tiktok_account_profile`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-account-profile.md) - [`solari_fetch_tiktok_post_search`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-post-search.md) ### solari fetch tiktok post search > Find TikTok videos by keyword, live. Start here on TikTok. - **CLI**: `solari fetch tiktok post search` - **MCP tool**: `solari_fetch_tiktok_post_search` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Search TikTok itself for videos matching a keyword, in TikTok's own relevance order. Start here for any TikTok topic, because the TikTok catalog is small. Hits are saved as thin records; fetch tiktok post completes any hit by its URL. **When to use it** — Whenever you want what people post on TikTok about a topic, brand, or phrase. Use it before catalog content search. **What comes back** — Up to limit videos in TikTok's order, a cursor for the next page, and the fetch command to collect the first one. #### Parameters - `query` (string, required, ≤ 100 chars) — Keyword or phrase to search for. - `limit` (integer, optional, default 20, 1–30) — How many videos per page, at most. - `cursor` (string, optional, ≤ 1024 chars) — next_cursor from the previous page of the same query. Leave it out for the first page. #### Response ##### `Response` - `query` (string) — The keyword the search ran on. - `items` (object[]) — Matching videos, TikTok's relevance order. - `total` (integer) — Videos on this page. - `has_more` (boolean) — true when TikTok has another page. - `next_cursor` (string | null) — Pass it back as cursor with the same query. Null on the last page. - `note` (string | null) — Caveat, when there is one: for example when nothing matched. - `next` (string) — Fetch command to collect the first video. Only when there is a hit. ##### `items[]` - `video_id` (string) — Public numeric TikTok id. - `url` (string) — Public video URL. Pass it to fetch tiktok post. - `username` (string | null) — Author handle, when the URL carries it. - `caption` (string | null) — Caption text. - `posted_at` (timestamp | null) — Published at (UTC). - `play_count` (integer | null) — Plays. - `like_count` (integer | null) — Likes. - `comment_count` (integer | null) — Comments. - `share_count` (integer | null) — Shares. - `duration_seconds` (integer | null) — Video length in seconds. - `cover_url` (string | null) — Cover image URL. It can expire, so use it promptly. #### Example ```console $ solari fetch tiktok post search query="green tea ceramide" limit=1 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "query": "green tea ceramide", "items": [ { "video_id": "7680375687139642645", "url": "https://www.tiktok.com/@innisfree_official/video/7680375687139642645", "username": "innisfree_official", "caption": "Deeply hydrated skin—NO OFF HOURS. 💚 wherever the day takes MINGYU—his hydration stays SUPERCHARGED ⚡️ Green Tea Ceramide Milk: Lightweight milky toner that won't clog your pores …", "posted_at": "2026-09-02T12:00:00Z", "play_count": 493, "like_count": 37, "comment_count": 2, "share_count": 0, "duration_seconds": 23, "cover_url": "https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-p-0037/oQfAEIgDBRiLAeFsAQeZhIQ9CEfIAgBDpAqbfE~tplv-tiktokx-origin.image?…" } ], "total": 1, "has_more": true, "next_cursor": "eyJjIjoiMSIsInMiOiIyMDI2MDkyOTA2NDUxOEIzRDJGMDdBOUMxRTRCNkQ4RjAyIn0", "note": null, "next": "solari fetch tiktok post url=https://www.tiktok.com/@innisfree_official/video/7680375687139642645" } ``` #### As an MCP call ```json { "name": "solari_fetch_tiktok_post_search", "arguments": { "query": "green tea ceramide", "limit": 1 } } ``` #### Notes - Results follow TikTok's relevance ranking and may include loosely related videos. Read caption and username before using one. - Hits are saved as thin records and carry no post_id. fetch tiktok post with a hit's url collects the full post with its author. - When has_more is true, pass next_cursor as cursor with the same query for the next page. A cursor does not carry over to another query. - Every call asks TikTok live, takes a few seconds, and is not cached. An empty items list with a note means no public video matched. - There is no date filter. For a date range, use catalog tiktok content search with since and until. #### Related tools - [`solari_fetch_tiktok_post`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-post.md) - [`solari_fetch_tiktok_account_search`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-account-search.md) - [`solari_catalog_tiktok_content_search`](https://clip-pub.bzine.co/docs/tools/catalog-tiktok-content-search.md) ### solari fetch threads account > One Threads account's profile, read live. - **CLI**: `solari fetch threads account` - **MCP tool**: `solari_fetch_threads_account` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Read one Threads account's profile by exact username: display name, bio, follower count, verified and private flags, bio links, and profile picture. A handle SOLARI has never seen is collected live, which takes 5 to 30 seconds; within an hour the stored copy is reused unless refresh=true. **When to use it** — When you have an exact Threads handle and want its profile. If you only know a name, run fetch threads account search first. **What comes back** — The profile, when it was collected, and the fetch command to read its posts. #### Parameters - `username` (string, required, ≤ 64 chars) — Threads username, with or without @. - `refresh` (boolean, optional) — Collect again even if a copy from the last hour exists. #### Response ##### `Response` - `account` (object) — The profile. - `collected_at` (timestamp | null) — When this copy was collected. - `fetched_on_demand` (boolean) — true if this call collected it live. - `stale` (boolean) — true if live collection failed and an older copy is returned. collected_at says how old. - `note` (string | null) — Caveat, when there is one. - `next` (string) — Fetch command to read its posts. ##### `account` - `account_id` (uuid) — Threads account id. Not interchangeable with Instagram or TikTok. - `username` (string) — Handle, lowercase, without the @. - `full_name` (string | null) — Display name. - `biography` (string | null) — Bio text. - `follower_count` (integer | null) — Followers at collection time. - `is_verified` (boolean | null) — Verified badge. - `is_private` (boolean | null) — Private account. Its posts come back empty. - `bio_links` (string[]) — Links listed in the bio. - `profile_pic_url` (string | null) — Profile picture URL, largest size available. - `url` (string | null) — Public profile URL. #### Example ```console $ solari fetch threads account username=zuck ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "account": { "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d5e", "username": "zuck", "full_name": "Mark Zuckerberg", "biography": "Mostly superintelligence and MMA takes", "follower_count": 5745085, "is_verified": true, "is_private": false, "bio_links": [], "profile_pic_url": "https://scontent-gmp1-1.cdninstagram.com/v/t51.82787-19/825322135_17989325280103224_1252773933700107438_n.jpg?…", "url": "https://www.threads.com/@zuck" }, "collected_at": "2026-09-28T09:13:55Z", "fetched_on_demand": true, "stale": false, "note": null, "next": "solari fetch threads posts username=zuck" } ``` #### As an MCP call ```json { "name": "solari_fetch_threads_account", "arguments": { "username": "zuck" } } ``` #### Notes - To find a handle from a name, use fetch threads account search. - A first collection takes 5 to 30 seconds (fetched_on_demand=true). Repeat calls within an hour return the stored copy unless refresh=true. - stale=true means the live collection failed and an older copy came back. collected_at says how old it is. - Media URLs right after a collection may be temporary. Read them promptly. - A handle with no Threads profile is an error, not an empty result. Failed calls cost nothing. #### Related tools - [`solari_fetch_threads_account_search`](https://clip-pub.bzine.co/docs/tools/fetch-threads-account-search.md) - [`solari_fetch_threads_posts`](https://clip-pub.bzine.co/docs/tools/fetch-threads-posts.md) - [`solari_fetch_threads_post`](https://clip-pub.bzine.co/docs/tools/fetch-threads-post.md) ### solari fetch threads posts > One Threads account's recent posts, read live. - **CLI**: `solari fetch threads posts` - **MCP tool**: `solari_fetch_threads_posts` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Read one Threads account's newest top-level posts, with its profile, by exact username. Each post carries text, hashtags, mentions, links, like, reply, repost, quote, and share counts, the quoted post, and assets with a direct-download asset_url. A handle SOLARI has never seen is collected live, which takes 5 to 30 seconds; within an hour the stored copy is reused unless refresh=true. **When to use it** — When you have an exact Threads handle and want what it posted recently. **What comes back** — The profile, up to limit top-level posts newest first, and the fetch command to open the newest one with its replies. #### Parameters - `username` (string, required, ≤ 64 chars) — Threads username, with or without @. - `limit` (integer, optional, default 12, 1–25) — How many posts, newest first. - `refresh` (boolean, optional) — Collect again even if a copy from the last hour exists. #### Response ##### `Response` - `account` (object) — The profile. - `posts` (object[]) — Top-level posts, newest first. - `total` (integer) — Posts returned. - `collected_at` (timestamp | null) — When this copy was collected. - `fetched_on_demand` (boolean) — true if this call collected it live. - `stale` (boolean) — true if live collection failed and an older copy is returned. collected_at says how old. - `note` (string | null) — Caveat, when there is one: for example a private account. - `next` (string) — Fetch command to open the newest post with its replies. Only when a post exists. ##### `account` - `account_id` (uuid) — Threads account id. Not interchangeable with Instagram or TikTok. - `username` (string) — Handle, lowercase, without the @. - `full_name` (string | null) — Display name. - `biography` (string | null) — Bio text. - `follower_count` (integer | null) — Followers at collection time. - `is_verified` (boolean | null) — Verified badge. - `is_private` (boolean | null) — Private account. Its posts come back empty. - `bio_links` (string[]) — Links listed in the bio. - `profile_pic_url` (string | null) — Profile picture URL, largest size available. - `url` (string | null) — Public profile URL. ##### `posts[]` - `post_id` (uuid) — Threads post id. Not interchangeable with Instagram or TikTok. - `code` (string | null) — Permalink code, the segment after /post/ in the URL. - `url` (string | null) — Public permalink. - `account_id` (uuid | null) — Author account_id. - `username` (string | null) — Author handle. - `text` (string | null) — Post text. - `posted_at` (timestamp | null) — Published at (UTC). - `like_count` (integer | null) — Likes. - `reply_count` (integer | null) — Replies on Threads. Can exceed the replies returned. - `repost_count` (integer | null) — Reposts. - `quote_count` (integer | null) — Quotes. - `reshare_count` (integer | null) — Shares. - `counts_hidden` (boolean | null) — true if the author hides engagement counts. - `hashtags` (string[]) — Hashtags without the #. - `mentions` (string[]) — Handles mentioned, without the @. - `link_urls` (string[]) — Links attached to the post. - `is_reply` (boolean | null) — true for a reply to another post. - `reply_to_username` (string | null) — Handle this post replies to. Null for top-level posts. - `is_paid_partnership` (boolean | null) — Paid partnership label. - `topic` (string | null) — Topic tag, when Threads sets one. - `language` (string | null) — Language code of the text. - `quoted_post` (object | null) — The quoted post: username, text, like_count, posted_at, url. Null unless this is a quote. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari fetch threads posts username=zuck limit=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "account": { "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d5e", "username": "zuck", "full_name": "Mark Zuckerberg", "biography": "Mostly superintelligence and MMA takes", "follower_count": 5745085, "is_verified": true, "is_private": false, "bio_links": [], "profile_pic_url": "https://scontent-gmp1-1.cdninstagram.com/v/t51.82787-19/825322135_17989325280103224_1252773933700107438_n.jpg?…", "url": "https://www.threads.com/@zuck" }, "posts": [ { "post_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d60", "code": "Ddt7cL5EfUG", "url": "https://www.threads.com/@zuck/post/Ddt7cL5EfUG", "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d5e", "username": "zuck", "text": "Agrippa said it's time to get back to work 😎", "posted_at": "2026-09-25T16:50:21.000Z", "like_count": 4964, "reply_count": 477, "repost_count": 254, "quote_count": 45, "reshare_count": 136, "counts_hidden": false, "hashtags": [], "mentions": [], "link_urls": [], "is_reply": false, "reply_to_username": null, "is_paid_partnership": false, "topic": null, "language": null, "quoted_post": null, "assets": [ { "asset_url": "https://smr-images.bzine.co/threads/…", "media_type": "image", "video_duration": null }, { "asset_url": "https://smr-images.bzine.co/threads/…", "media_type": "image", "video_duration": null } ] }, { "post_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d61", "code": "Ddpj4YZkd3P", "url": "https://www.threads.com/@zuck/post/Ddpj4YZkd3P", "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d5e", "username": "zuck", "text": "Here's everything I announced at Meta Connect today 👇", "posted_at": "2026-09-24T00:07:31.000Z", "like_count": 2680, "reply_count": 612, "repost_count": 164, "quote_count": 34, "reshare_count": 138, "counts_hidden": false, "hashtags": [], "mentions": [], "link_urls": [], "is_reply": false, "reply_to_username": null, "is_paid_partnership": false, "topic": null, "language": null, "quoted_post": null, "assets": [] } ], "total": 2, "collected_at": "2026-09-28T09:13:55Z", "fetched_on_demand": true, "stale": false, "note": null, "next": "solari fetch threads post url=https://www.threads.com/@zuck/post/Ddt7cL5EfUG" } ``` #### As an MCP call ```json { "name": "solari_fetch_threads_posts", "arguments": { "username": "zuck", "limit": 2 } } ``` #### Notes - Only top-level posts are listed, newest first. The account's own replies are not included; fetch threads post reads one post with its replies. - A first collection takes 5 to 30 seconds (fetched_on_demand=true). Repeat calls within an hour return the stored copy unless refresh=true. - stale=true means the live collection failed and an older copy came back. collected_at says how old it is. - A private account answers its profile with posts empty. Media URLs right after a collection may be temporary, so read them promptly. - A handle with no Threads profile is an error, not an empty result. Failed calls cost nothing. #### Related tools - [`solari_fetch_threads_account`](https://clip-pub.bzine.co/docs/tools/fetch-threads-account.md) - [`solari_fetch_threads_account_search`](https://clip-pub.bzine.co/docs/tools/fetch-threads-account-search.md) - [`solari_fetch_threads_post`](https://clip-pub.bzine.co/docs/tools/fetch-threads-post.md) ### solari fetch threads post > One Threads post with its first replies, read live. - **CLI**: `solari fetch threads post` - **MCP tool**: `solari_fetch_threads_post` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Read one Threads post by its public URL or permalink code, with its author and the first batch of direct replies, most liked first. A post SOLARI has never seen is collected live, which takes 5 to 30 seconds; within an hour the stored copy is reused unless refresh=true. **When to use it** — When you were given a Threads post link or code and want the post, its author, or what people replied. **What comes back** — The post, up to replies_limit direct replies most liked first, and the fetch command to read the author's profile. #### Parameters - `url` (string, optional, ≤ 512 chars) — Public post URL on threads.com or threads.net. Provide this or code. - `code` (string, optional, pattern ^[A-Za-z0-9_-]{5,40}$) — Permalink code, the segment after /post/ in the URL. Provide this or url. - `replies_limit` (integer, optional, default 20, 0–50) — How many direct replies, most liked first. 0 skips them. - `refresh` (boolean, optional) — Collect again even if a copy from the last hour exists. #### Response ##### `Response` - `item` (object) — The post, with its author's handle. - `replies` (object[]) — Direct replies, most liked first. The first batch only. - `collected_at` (timestamp | null) — When this copy was collected. - `fetched_on_demand` (boolean) — true if this call collected it live. - `stale` (boolean) — true if live collection failed and an older copy is returned. collected_at says how old. - `note` (string | null) — Caveat, when there is one. - `next` (string) — Fetch command to read the author's profile. ##### `item · replies[]` - `post_id` (uuid) — Threads post id. Not interchangeable with Instagram or TikTok. - `code` (string | null) — Permalink code, the segment after /post/ in the URL. - `url` (string | null) — Public permalink. - `account_id` (uuid | null) — Author account_id. - `username` (string | null) — Author handle. - `text` (string | null) — Post text. - `posted_at` (timestamp | null) — Published at (UTC). - `like_count` (integer | null) — Likes. - `reply_count` (integer | null) — Replies on Threads. Can exceed the replies returned. - `repost_count` (integer | null) — Reposts. - `quote_count` (integer | null) — Quotes. - `reshare_count` (integer | null) — Shares. - `counts_hidden` (boolean | null) — true if the author hides engagement counts. - `hashtags` (string[]) — Hashtags without the #. - `mentions` (string[]) — Handles mentioned, without the @. - `link_urls` (string[]) — Links attached to the post. - `is_reply` (boolean | null) — true for a reply to another post. - `reply_to_username` (string | null) — Handle this post replies to. Null for top-level posts. - `is_paid_partnership` (boolean | null) — Paid partnership label. - `topic` (string | null) — Topic tag, when Threads sets one. - `language` (string | null) — Language code of the text. - `quoted_post` (object | null) — The quoted post: username, text, like_count, posted_at, url. Null unless this is a quote. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari fetch threads post url=https://www.threads.com/@zuck/post/Ddt7cL5EfUG replies_limit=2 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "item": { "post_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d66", "code": "DdU1-6okapE", "url": "https://www.threads.com/@zuck/post/DdU1-6okapE", "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d5e", "username": "zuck", "text": "Last month I wrote about how we can build a positive and safe future for everyone: meta.com/thefutureisforeveryone \n\nEvery lab has the responsibility and incentive to move at the pace required to train its models safely,…", "posted_at": "2026-09-15T23:01:39.000Z", "like_count": 1639, "reply_count": 412, "repost_count": 136, "quote_count": 30, "reshare_count": 112, "counts_hidden": false, "hashtags": [], "mentions": [], "link_urls": [], "is_reply": false, "reply_to_username": null, "is_paid_partnership": false, "topic": null, "language": null, "quoted_post": null, "assets": [] }, "replies": [ { "post_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d62", "code": "DdU1-7_kb4B", "url": "https://www.threads.com/@zuck/post/DdU1-7_kb4B", "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d5e", "username": "zuck", "text": "The reality is:\n\n- People won't want to use agents that are misaligned with them and that don't do what they ask, so labs have a strong natural incentive to make their models more aligned.\n\nThere is a lot of debate about…", "posted_at": "2026-09-15T23:01:39.000Z", "like_count": 663, "reply_count": 77, "repost_count": 27, "quote_count": 4, "reshare_count": 10, "counts_hidden": false, "hashtags": [], "mentions": [], "link_urls": [], "is_reply": true, "reply_to_username": "zuck", "is_paid_partnership": false, "topic": null, "language": null, "quoted_post": null, "assets": [] }, { "post_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d63", "code": "DdU1-7tEf-q", "url": "https://www.threads.com/@zuck/post/DdU1-7tEf-q", "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d5e", "username": "zuck", "text": "- Labs face significant liability if their models cause harm, so they have a strong incentive to prevent this as well. \n\nMeta delayed shipping Muse for several months to focus on safety and security. We didn't call for e…", "posted_at": "2026-09-15T23:01:39.000Z", "like_count": 230, "reply_count": 11, "repost_count": 3, "quote_count": 0, "reshare_count": 2, "counts_hidden": false, "hashtags": [], "mentions": [], "link_urls": [], "is_reply": true, "reply_to_username": "zuck", "is_paid_partnership": false, "topic": null, "language": null, "quoted_post": null, "assets": [] } ], "collected_at": "2026-09-28T09:13:55Z", "fetched_on_demand": true, "stale": false, "note": null, "next": "solari fetch threads account username=zuck" } ``` #### As an MCP call ```json { "name": "solari_fetch_threads_post", "arguments": { "url": "https://www.threads.com/@zuck/post/Ddt7cL5EfUG", "replies_limit": 2 } } ``` #### Notes - Pass url or code, not both. threads.com and threads.net URLs both work. - Replies are the first batch only, so reply_count on the post can exceed the replies returned. replies_limit=0 skips them. - A first collection takes 5 to 30 seconds (fetched_on_demand=true). Repeat calls within an hour return the stored copy unless refresh=true. - stale=true means the live collection failed and an older copy came back. collected_at says how old it is. - Media URLs right after a collection may be temporary. Read them promptly. - A reference with no public post is an error, not an empty result. Failed calls cost nothing. #### Related tools - [`solari_fetch_threads_post_search`](https://clip-pub.bzine.co/docs/tools/fetch-threads-post-search.md) - [`solari_fetch_threads_account`](https://clip-pub.bzine.co/docs/tools/fetch-threads-account.md) - [`solari_fetch_threads_posts`](https://clip-pub.bzine.co/docs/tools/fetch-threads-posts.md) ### solari fetch threads account search > Find Threads accounts by name, live. - **CLI**: `solari fetch threads account search` - **MCP tool**: `solari_fetch_threads_account_search` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Ask Threads itself for accounts matching a name or handle fragment. Hits are thin: handle, display name, verified badge, profile picture, and URL, in Threads' own order. Pick a hit, then fetch threads account reads its full profile. **When to use it** — When you know a name or part of a handle but not the exact Threads handle. **What comes back** — Up to limit candidates in Threads' order, and the fetch command to read the first one's profile. #### Parameters - `query` (string, required, ≤ 100 chars) — Name or handle fragment, with or without @. - `limit` (integer, optional, default 10, 1–20) — How many hits, at most. #### Response ##### `Response` - `query` (string) — The text the lookup ran on, without @. - `items` (object[]) — Matching accounts, Threads' order. - `total` (integer) — Hits returned. - `next` (string) — Fetch command to read the first hit's profile. Only when there is a hit. ##### `items[]` - `username` (string) — Handle, lowercase, without the @. - `full_name` (string | null) — Display name. - `is_verified` (boolean | null) — Verified badge. - `profile_pic_url` (string | null) — Profile picture URL. - `url` (string | null) — Public profile URL. #### Example ```console $ solari fetch threads account search query=nike limit=1 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "query": "nike", "items": [ { "username": "nike", "full_name": "Nike", "is_verified": true, "profile_pic_url": "https://scontent-gmp1-1.cdninstagram.com/v/t51.2885-19/467733497_2299328197118830_1129133478722126916_n.jpg?…", "url": "https://www.threads.com/@nike" } ], "total": 1, "next": "solari fetch threads account username=nike" } ``` #### As an MCP call ```json { "name": "solari_fetch_threads_account_search", "arguments": { "query": "nike", "limit": 1 } } ``` #### Notes - Order and ranking are Threads' own, so the official account is not always first: check is_verified and full_name before choosing. - Nothing is stored and hits carry no account_id. fetch threads account with the chosen username reads follower count, bio, and bio links; fetch threads posts reads its posts. - Every call asks Threads live, takes a second or two, and is not cached. An empty items list means Threads matched nothing. #### Related tools - [`solari_fetch_threads_account`](https://clip-pub.bzine.co/docs/tools/fetch-threads-account.md) - [`solari_fetch_threads_posts`](https://clip-pub.bzine.co/docs/tools/fetch-threads-posts.md) - [`solari_fetch_threads_post_search`](https://clip-pub.bzine.co/docs/tools/fetch-threads-post-search.md) ### solari fetch threads post search > Threads' top posts for a keyword, live. - **CLI**: `solari fetch threads post search` - **MCP tool**: `solari_fetch_threads_post_search` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 Search Threads itself for posts matching a keyword and get its top results: one page of about 20 posts in Threads' own relevance order, each with full post fields and assets. The matching posts are collected and stored, so fetch threads post can open any of them with its replies. **When to use it** — When you want what people post on Threads about a topic, brand, or phrase and have no handle to start from. **What comes back** — Up to limit posts from Threads' one result page, best first, and the fetch command to open the first one with its replies. #### Parameters - `query` (string, required, ≤ 100 chars) — Keyword or phrase to search for. - `limit` (integer, optional, default 20, 1–25) — How many posts from the one result page, at most. #### Response ##### `Response` - `query` (string) — The keyword the search ran on. - `items` (object[]) — Matching posts, Threads' relevance order. - `total` (integer) — Posts returned. - `fetched_on_demand` (boolean) — Always true: every search collects live. - `note` (string | null) — Caveat, when there is one: for example when nothing matched. - `next` (string) — Fetch command to open the first post with its replies. Only when there is a hit. ##### `items[]` - `post_id` (uuid) — Threads post id. Not interchangeable with Instagram or TikTok. - `code` (string | null) — Permalink code, the segment after /post/ in the URL. - `url` (string | null) — Public permalink. - `account_id` (uuid | null) — Author account_id. - `username` (string | null) — Author handle. - `text` (string | null) — Post text. - `posted_at` (timestamp | null) — Published at (UTC). - `like_count` (integer | null) — Likes. - `reply_count` (integer | null) — Replies on Threads. Can exceed the replies returned. - `repost_count` (integer | null) — Reposts. - `quote_count` (integer | null) — Quotes. - `reshare_count` (integer | null) — Shares. - `counts_hidden` (boolean | null) — true if the author hides engagement counts. - `hashtags` (string[]) — Hashtags without the #. - `mentions` (string[]) — Handles mentioned, without the @. - `link_urls` (string[]) — Links attached to the post. - `is_reply` (boolean | null) — true for a reply to another post. - `reply_to_username` (string | null) — Handle this post replies to. Null for top-level posts. - `is_paid_partnership` (boolean | null) — Paid partnership label. - `topic` (string | null) — Topic tag, when Threads sets one. - `language` (string | null) — Language code of the text. - `quoted_post` (object | null) — The quoted post: username, text, like_count, posted_at, url. Null unless this is a quote. - `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration. - `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored. #### Example ```console $ solari fetch threads post search query="Meta AI" limit=1 ``` _Long strings and repeated array entries are trimmed for readability._ ```json { "query": "Meta AI", "items": [ { "post_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d64", "code": "Dd008mwipTJ", "url": "https://www.threads.com/@meta.ai/post/Dd008mwipTJ", "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d7b", "username": "meta.ai", "text": "Từng tháng âm:\n\n1. Tháng Giêng - Cung Phu Thê (Sửu): Có Hồng Loan, Thanh Long. Tháng khởi duyên, dễ có người mai mối, gặp gỡ nơi đông người. Tài chính hao nhẹ do Đầu Quân.\n\n2. Tháng 2 - Cung Huynh Đệ (Tý): Liêm Trinh Thi…", "posted_at": "2026-09-28T09:08:17.000Z", "like_count": 0, "reply_count": 2, "repost_count": 0, "quote_count": 0, "reshare_count": 0, "counts_hidden": false, "hashtags": [], "mentions": [], "link_urls": [], "is_reply": true, "reply_to_username": "meta.ai", "is_paid_partnership": false, "topic": null, "language": null, "quoted_post": null, "assets": [] } ], "total": 1, "fetched_on_demand": true, "note": null, "next": "solari fetch threads post url=https://www.threads.com/@meta.ai/post/Dd008mwipTJ" } ``` #### As an MCP call ```json { "name": "solari_fetch_threads_post_search", "arguments": { "query": "Meta AI", "limit": 1 } } ``` #### Notes - Only Threads' top tab is available: one page, no recent tab, no further page. Calling again with the same keyword returns the same page. - Results follow Threads' relevance ranking and may include loosely related posts, including replies. Read text and username before using one. - Matching posts are stored: fetch threads post opens any of them with its replies, and fetch threads account reads an author. - Every call asks Threads live, takes a few seconds, and is not cached. An empty items list with a note means no public post matched. #### Related tools - [`solari_fetch_threads_post`](https://clip-pub.bzine.co/docs/tools/fetch-threads-post.md) - [`solari_fetch_threads_account`](https://clip-pub.bzine.co/docs/tools/fetch-threads-account.md) - [`solari_fetch_threads_account_search`](https://clip-pub.bzine.co/docs/tools/fetch-threads-account-search.md) ### solari instagram download content > Download Instagram content. - **CLI**: `solari instagram download content` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 per content Downloads Instagram content. You can download several at once. Videos and images are saved at the highest quality. #### Parameters - `slugs` (string[], optional) — Shortcodes or post URLs, comma-separated. - `urls` (string[], optional) — Post URLs, comma-separated. - `dir` (string, optional) — Folder to save into. Defaults to the current folder. - `output` (string, optional) — File path when saving a single post. - `parallel` (integer, optional, default 4, 1–16) — How many downloads run at once. - `overwrite` (boolean, optional, default true) — false keeps files that already exist. #### Example ```console $ solari instagram download content slugs=DcyMAmUh6FZ,DdJ7IRyE6Pu dir=~/Downloads ``` #### Related tools - [`solari_fetch_instagram_post_assets`](https://clip-pub.bzine.co/docs/tools/fetch-instagram-post-assets.md) - [`solari tiktok download content`](https://clip-pub.bzine.co/docs/tools/tiktok-download-content.md) ### solari tiktok download content > Download TikTok content. - **CLI**: `solari tiktok download content` - **Access**: `solari:read` - **Plans**: Free Trial · Plus · Pro · Enterprise - **Credit**: 1 per content Downloads TikTok content. You can download several at once. Videos and images are saved at the highest quality. #### Parameters - `urls` (string[], optional) — Post URLs, comma-separated. Short links work too. - `video_ids` (string[], optional) — Numeric video ids, comma-separated. Only for posts already in the catalog. - `dir` (string, optional) — Folder to save into. Defaults to the current folder. - `output` (string, optional) — File path when saving a single post. - `parallel` (integer, optional, default 4, 1–16) — How many downloads run at once. - `overwrite` (boolean, optional, default true) — false keeps files that already exist. #### Example ```console $ solari tiktok download content urls=https://www.tiktok.com/@innisfree_official/video/7680375687139642645 dir=~/Downloads ``` #### Related tools - [`solari_fetch_tiktok_post_assets`](https://clip-pub.bzine.co/docs/tools/fetch-tiktok-post-assets.md) - [`solari instagram download content`](https://clip-pub.bzine.co/docs/tools/instagram-download-content.md)