
StoriesFly: Instagram and TikTok data
com.storiesflyPublished by storiesfly.comOfficial publisherv1.0.0Updated Oct 30, 2026
Live public Instagram and TikTok data for AI assistants: profiles, posts, stories, followers.
Overview
Remote MCP server giving assistants live public Instagram and TikTok data: profiles, posts, stories, followers, hashtags and media links.
- What you can do
- Look up Instagram profiles, about info, posts, reels, tagged and pinned posts, stories, highlights and shop storefronts
- Read posts, comments, replies, likers, tagged people and music, plus hashtags, places and search results
- List followers and following, with search within those lists, and suggested accounts
- Retrieve TikTok profiles, videos, stories, followers, following and reposts
- Resolve share links and get downloadable file links for Instagram posts and reels or TikTok videos
- Check account balance, free units and usage
- When to use it
- Useful when an assistant needs current public social media data for research, influencer or competitor analysis, content monitoring, or pulling media files from Instagram and TikTok links, without logging into either platform.
- Requirements
- Remote endpoint at storiesfly.com over streamable HTTP, with OAuth sign-in (the README describes signing in with Telegram). A prepaid StoriesFly account with a balance is needed; a new account gets 100 free requests. No Instagram or TikTok login, cookies or sessions are involved.
Installation
In SourceWeft
- Open StoriesFly: Instagram and TikTok data in the dashboard and add it to a workspace.
- Connect the required credentials. They are stored privately and never shown on public pages.
- Enable the server for the chats that should use its tools.
Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.
Use with an agent
Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.
Read https://sourceweft.com/mcp/com.storiesfly%2Fmcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.Other MCP clients
Add this to your client's mcpServers config. The client completes OAuth sign-in on first connect.
{
"mcpServers": {
"storiesfly-instagram-and-tiktok-data": {
"type": "http",
"url": "https://storiesfly.com/mcp"
}
}
}README
storiesfly
TypeScript client for the StoriesFly API. It reads public Instagram and TikTok data over HTTP. For Instagram: profiles, stories, highlights, posts, reels, comments, followers, hashtags, places and search. For TikTok: profiles, videos, stories, followers and following lists, reposts, and video download without the watermark. You do not log in to Instagram or TikTok and you do not handle cookies or sessions. You send an API key and pay per request. The same data works inside ChatGPT and Claude through the StoriesFly MCP server: see Use it from ChatGPT and Claude (MCP).
The package has no runtime dependencies. It needs Node 18 or newer (it uses the global fetch), it is ESM only, and it ships its own types. The 46 data calls and the free account call each have a method, and every answer is typed.
Install
Get a key
- Sign in with Telegram at https://storiesfly.com/developers/dashboard.
- Create a key there. A new account gets 100 free requests, so you can try every call before you pay.
Keep the key on your server. Anyone who has it can spend your balance.
Quick start
The stories an account has up right now:
Things to know:
- An account is named by
{ username }or{ id }, never both. A post is named by{ url },{ code }or{ id }. The types enforce this. - Ids are strings. Instagram ids pass 2^53, and a JSON number would round them.
- Field names are
snake_case, as the API sends them. A value the answer does not carry isnull. It is never0or"". - Media links in answers are signed Instagram CDN links. They expire within days, so download what you need soon.
A post, with the links to its pictures and video:
A TikTok video without the watermark, and a TikTok account's followers:
Options
Every call also takes a last argument with signal (an AbortSignal), timeoutMs, maxRetries and withMeta.
Paging
A call that returns a list returns one page, with next_cursor and has_more. client.paginate follows the list for you. It is an async iterator that calls the method, yields the page, then calls it again with the next_cursor of the page before, until has_more is false:
- Every page is one call and is charged as one. A large account has many pages, so set
maxPagesunless you mean to read the whole list. paginatetakes the method itself (client.user.followers), its parameters, and options:maxPages,signalandwithMeta. Acursorin the parameters starts the walk from a page you already have.- Only methods that take
cursorcan be paginated, and the compiler refuses the rest. ThePagedcolumn of the methods table marks them, andENDPOINTS(exported) has apagedflag on each. - To page by hand, pass
next_cursorback ascursorand keep every other parameter the same. A cursor is opaque. A cursor the API did not return givesbad_request. - Page size follows Instagram and varies by endpoint. The spec fixes it for three:
user.postsreturns up to 9 items a page,user.followersanduser.followingup to 25. ThePagedcolumn of the methods table shows the size wherever the spec gives one.
TikTok
TikTok calls live under client.tiktok. An account is named by { username }.
videos,followers,followingandrepoststakecursorand returnnext_cursor, soclient.paginatefollows them. Page size follows TikTok and varies by endpoint.- An account that hides its followers or following list answers an empty page with
hidden: true. - A number is
nullwhen it is not exact. File links are temporary: save the files right away. - On a later page of
tiktok.user.videos,video_urlisnull. To get the file of one video, calltiktok.videoordownloadwith itsurl.
Download
client.download({ url }) takes the link of an Instagram post, reel or IGTV, or of a TikTok video or photo post (short links too), and returns the file links: the video (TikTok's without the watermark), every picture of a carousel or photo post, the cover, and for TikTok the soundtrack. It returns files only; for the numbers use post.get or tiktok.video. The price is fixed per call: $0.50 per 1,000 for an Instagram link and $0.20 per 1,000 for a TikTok link.
File links are temporary, so download them right away. client.account() also shows the download prices as download_price_usd.
Use it from ChatGPT and Claude (MCP)
The same data is available to AI assistants at https://storiesfly.com/mcp, with no code. Details: https://storiesfly.com/developers/mcp.
- In Claude Code:
claude mcp add --transport http storiesfly https://storiesfly.com/mcp - ChatGPT and Claude connect to the same address and sign in with Telegram.
What a call cost: response meta
A call resolves to the parsed body. To see the billing headers too, pass { withMeta: true } as the last argument and the call resolves to { data, meta }:
A header the answer did not carry is null. The meta is returned per call and not kept on the client (there is no lastResponse), so calls that run at the same time cannot overwrite each other's numbers. With paginate, { withMeta: true } yields { data, meta } for each page.
Errors and what is charged
Every call that does not return data throws StoriesFlyError. Test code, not message:
Other fields: fields (with bad_request, the names of the refused parameters), linkUrl (with telegram_required, the link that links your account to Telegram), url (the URL called; it holds no key) and body (the parsed error body).
You are charged for answers: a 200, not_found and private_account. A wrong parameter, a rate limit and an empty balance cost nothing, and a failure on our side is refunded. err.meta.unitsCharged and X-Units-Charged say what a call took.
The client adds three codes of its own, with status 0 when no answer came: timeout (no answer within timeoutMs), network_error (fetch failed; the error has the cause) and invalid_response (an answer that is not in the documented shape, such as a proxy's error page; the status and the body are kept).
Retries
- A
429is retried up tomaxRetriestimes (2 by default). The client waits for theRetry-Afterthe API sent, or half a second and then longer when it sent none. ARetry-Afterlonger than 30 seconds is not waited out: the error is thrown at once, withretryAfterMsset. - A
402is never retried: another call would not change it. - Other errors, timeouts and network errors are not retried. A
500or503is refunded, so you can retry it yourself.
Pricing
From $1.50 per 1,000 requests, prepaid. See https://storiesfly.com/developers/pricing.
One unit is one request. Every call takes 1 unit, a page of a list included. Resolving a share link takes 2, and account takes none. download is sold at a fixed price per call (see Download) and uses one free unit when you have any. Free units are spent before your balance. Requests per second are limited per account.
Methods
Each method is a call of API v1. This table is generated from the OpenAPI spec (openapi.json) and checked by the tests.
Parameters, in short:
- TikTok calls (
tiktok.user.*) take{ username }, andtiktok.videoanddownloadtake{ url }. The paged TikTok calls also takecursor. - Account calls (
user.*,shop.storefront) take{ username }or{ id }. The calls with a cursor also takecursor.user.followersSearchanduser.followingSearchalso takeq. - Post calls (
post.*) take{ url },{ code }(the part of the link after/p/or/reel/) or{ id }.post.commentstakescursor.post.commentRepliesalso takescomment_id. story.getandhighlight.gettake{ url }or{ id }.hashtag.poststakesname,sort(top,recentorreels; keep it the same from page to page) andcursor.location.poststakesid,sort(toporrecent) andcursor.location.searchtakesq, orlatandlng. Thesearch.*calls takeq, 1 to 100 characters.post.getreturns the whole post:media(the links to its pictures and video, one entry per slide of a carousel), caption, owner, time, and the numbers. It is the same shape as an item ofuser.posts,user.reels,hashtag.postsand the other lists of posts, andresolvereturns it for a post link.
Docs
- API docs, with a page for each endpoint: https://storiesfly.com/developers/docs
- OpenAPI 3.1 spec: https://storiesfly.com/openapi.json (this repository holds a copy as
openapi.jsonandopenapi.yaml) - API changelog: https://storiesfly.com/developers/changelog
- Changelog of this package: CHANGELOG.md
- Examples:
stories.mjs(stories of an account),followers.mjs(followers withpaginate) andpost.mjs(a post with its media links and numbers). Run them withSTORIESFLY_API_KEY=your_key node examples/stories.mjs instagram.
Migrating from 0.x
1.0 is a rewrite for API v1. The old methods are gone, the base URL changed, and the old plans and daily quotas do not exist in v1.
What else changed:
baseUrlnow defaults tohttps://storiesfly.com/api/v1. ThebearerTokenoption is gone: v1 takes the key inX-Api-Keyand nowhere else.- Methods are grouped by resource:
client.user.profile(),client.post.get(),client.search.users(). Every method takes one object of parameters. - Answers use the API's own
snake_casenames, andnullfor a value that is missing:fullNameis nowfull_name,profilePicUrlisprofile_pic_url,isPrivateisis_private,takenAtistaken_at. StoriesFlyErrorhascode,requestIdandretryAfterMs. The 0.x fieldsrateLimit,retryAfterSec,requiresUpgrade,isRateLimitedandmethodare gone. Compareerr.codewithrate_limited,credits_exhaustedand the rest. A429is now retried for you.- The old plans (DEV, Starter, Growth, Scale, and the Tracker plans), their daily quotas and the 60 requests a minute burst limit are gone. v1 bills from a prepaid balance, per request, with 100 free requests for a new account. See Pricing.
- A key from before works on v1 once the account behind it is linked to Telegram. Until then v1 answers
telegram_required, anderr.linkUrlhas the link. - The tracker, shadow ban and outbound analytics endpoints still answer over HTTP, but 1.0 does not wrap them. To keep using them, stay on
storiesfly@0or call them yourself. The older/api/stories,/api/profile,/api/highlights,/api/mediaand/api/downloadendpoints that 0.x calls keep working for existing free keys until 2026-12-31. Details: https://storiesfly.com/developers/docs/legacy.
FAQ
Does it need an Instagram or TikTok login? No. You send a StoriesFly API key and nothing else. There are no cookies or sessions to manage.
Can I get a TikTok account's followers list?
Yes. client.tiktok.user.followers({ username }) returns it page by page, and client.paginate follows the pages. An account that hides the list answers an empty page with hidden: true.
Can I download a TikTok video without the watermark?
Yes. client.tiktok.video({ url }) returns video_url without the watermark, and client.download({ url }) returns the file links for an Instagram or TikTok link.
Can I use it from ChatGPT or Claude?
Yes, through the MCP server at https://storiesfly.com/mcp. See Use it from ChatGPT and Claude (MCP).
How is it priced? Per request, from prepaid balance. A new account gets 100 free requests, once. See Pricing.
Not affiliated
This is a client for the StoriesFly API. It reads public data only, and a private account gives private_account. It is not an Instagram or Meta product and is not affiliated with or endorsed by them.
Development
To update the spec: replace openapi.json with the new file, run npm run openapi:sync and npm run readme:sync, and run the tests.
License
MIT. See LICENSE.
Source: README.md at commit 5a343ca
Tools
0Version history
1- v1.0.0LatestOct 30, 2026
Score
85% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 daysRequired25 pts
- Auth declaredRequired10 pts
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts