- Fixed
Reddit search returns post bodies again, on every sort
GET /v1/reddit/search_postswithinclude_body=truereturns each post'stextandmentionsand its exacttypeagain. Reddit closed the feed the bodies came from, so since 2026-11-11 those requests answered without bodies, markedpartial_data. The bodies now come from another Reddit feed, asked for the page's own posts, soinclude_bodyalso works withsort=relevance, the default, which used to returninvalid_input. The price is unchanged. - Added
Reddit search for image, video and gallery posts
GET /v1/reddit/search_poststakes a newmediaparameter:image,video,carousel(a gallery) orany. It returns only the posts whose image, video or gallery was uploaded to Reddit, each with its score, comment count and time, and withimageorvideothe post'stypeis exact. A gallery comes with every image inmedia. Other results carry the preview Reddit's search shows, often only a small thumbnail onpopularandmost_comments(the media item'surlis then null): the Reddit Post API returns the media file. Reddit's own search applies the filter, so pages stay full, and it works withsubreddit, everysort,sinceanduntil. A query that usessite:,url:orself:yescan't be combined withmediaand returnsinvalid_input. Posts that link to media on another site are not included. - Added
TikTok search suggestions
tiktok.search_suggestionsreturns the searches TikTok's search box completes a word or part of a word with, in TikTok's order, with no login. Each suggestion has its text, its position, the link to that search and its language, and an account TikTok proposes comes with its ID, username, display name, picture and verified badge.countryasks for the suggestions people in that country see; the endpoint's page lists the countries it takes, and the United States is the default. Use it to expand a keyword beforetiktok.search_posts, or to compare what each country searches for a word. - Added
Amazon products, search, reviews, offers, sellers, best sellers, deals and influencer storefronts
Amazon Product API, Amazon Product Search API, Amazon Reviews API, Amazon Offers API, Amazon Seller API, Amazon Best Sellers API, Amazon Deals API, Amazon Shop API, Amazon Shop Lists API, Amazon Shop Posts API
Amazon is a new platform, with no login, on 23 marketplaces: each endpoint takes a link from any of them, a short link where Amazon makes one, or an ID with
country.amazon.productreturns a product from its link, an amzn.to or a.co short link or its ASIN: price, list price, seller, who ships it, rating with its histogram, the monthly sales badge, Best Sellers Rank, specifications, variations, images and videos.amazon.search_productssearches products a page at a time, with five sorts and whether each result is sponsored.amazon.reviewsreturns the top customer reviews a product page shows on every marketplace but amazon.com, which shows reviews only to signed-in visitors and answersprivate_or_unavailable.amazon.offerslists every seller's offer of a product, with price, condition, delivery dates, the buy box and the seller's rating.amazon.sellerreturns a third-party seller's ratings over 30 days, 90 days, 12 months and lifetime, and the business details it discloses.amazon.top_productsreturns Best Sellers or New Releases of a category, ranked, andamazon.deal_productsToday's Deals with the deal price, its type, badge and end time, by category.amazon.shopreturns an Amazon Influencer storefront from its link, handle or account ID: the creator's name, bio, social links, Top Creator badge, curations and trending picks.amazon.shop_listslists its idea lists, using theplaylistresource, andamazon.shop_postsits videos and photos, with the products tagged in each.A new resource comes with it:
offer, one seller's price for one product in one condition. - Added
Pinterest pins, boards, profiles, search, ideas, Trends and link save counts
Pinterest Pin API, Pinterest Search API, Pinterest Board API, Pinterest Board Pins API, Pinterest Boards API, Pinterest Profile API, Pinterest Profile Pins API, Pinterest Topic API, Pinterest Trends API, Pinterest URL Save Count API
Pinterest is a new platform, with no login.
pinterest.pinreturns a pin from its link, a pin.it short link or its ID, on any of Pinterest's country sites: its pictures, video or every page of an idea pin, exact saves, reactions and comments, the link it points to, its board and the account that first pinned it.pinterest.search_pinssearches pins a page at a time.pinterest.boardreturns a board, or one of its sections, with its description, cover, exact pin and follower counts and collaborators, using theplaylistresource, andpinterest.board_pinslists its pins.pinterest.profilereturns an account with exact follower, pin and board counts and monthly views;pinterest.boardslists its boards, andpinterest.pinsthe pins on its saved or created tab.pinterest.topicreturns one of Pinterest's ideas pages, from its link or its words, with related and parent topics and related searches.Pinterest names the pins of its logged-out search, board and ideas lists by an encrypted ID (
e1_…) its pin page doesn't open logged out, so those pins carry that ID andpinterest.pinrefuses it with the reason; everything else about the pin is in the list's item.Two new resources come with it.
trendis what is trending on a platform:pinterest.top_trendsreturns Pinterest Trends' top monthly, top yearly, growing or seasonal searches for a country, filtered by interest, age and gender, with each term's search index and weekly, monthly and yearly change.web_pageis a web page as a platform counts it:pinterest.web_pagereturns how many times any link was saved to Pinterest, counted exactly as written. - Changed
LinkedIn members the data partner can't answer
When LinkedIn hides a member's page and the data partner can't answer for them,
linkedin.profileused to answerupstream_blocked. It now answers with a public search engine's copy of the page: name, headline, about text, current employer, school, location and connections, at the base price. These answers say so:meta.sourceisweb_search,idis the member's public name, what the text says is inapproximate_fields, and the lists the copy cannot see are inunknown_fields. A member no search engine lists still answersupstream_blocked, free.fill=trueon the web search endpoints is unchanged: it fills a result from the live page or not at all. - Changed
Test keys are retired: use a live key and your free credits
Test mode is gone. A test key (
st_test_…), the public docs key included, now answers401 unauthorizedwithdetails.reasontest_key_retired. Use an API key from your dashboard instead: every new account starts with free credits, and failed requests stay free. Every endpoint's recorded example response is still in its docs, its OpenAPI example and the MCP tools, so you can see the shape of an answer before you spend anything.With test keys gone, responses no longer carry
meta.mode, keys and request log entries no longer have amode, andGET /v1/api_keysandGET /v1/requestsno longer take amodefilter.POST /v1/api_keysrefusesmode: "test"withinvalid_inputinstead of making a live key. Magic test inputs (socialtap_test_<code>) andt1.cursors are ordinary values now, and thetest_default_examplewarning is gone. - Fixed
TikTok hashtag posts for the hashtags that failed
GET /v1/tiktok/hashtag_postsused to returnupstream_errorfor about a third of real hashtags (#kpop, #football, #recipe and other popular ones), because TikTok's US servers fail them every time. Those hashtags are now read from TikTok's servers in Asia and return their top posts. These requests take longer, often 10 to 30 seconds, and the last few posts of the page can differ from TikTok's US ranking. A hashtag that fails there too still returnsupstream_errorand isn't charged. - Changed
Cached profiles answer every form of an account
With
max_age, a profile fetched by one form of an account now also answers the forms its record proves are the same account: afterGET /v1/youtube/profile?handle=@MrBeast, the channel's/channel/UC…link and its UC… ID are cache hits too, free like every hit. A LinkedIn company fetched by its link answers its bare name. Only the account's own link, its ID and its username are aliased, and only when the endpoint reads them as that account, with the request's other params the same. - Changed
Errors and warnings say what to do
- A
forbiddenerror'sremediationis now the one for itsdetails.reason: a key without a scope reads "Use an API key with the jobs scope…", not every reason's. - A cursor that SocialTap could not have issued (
c1.garbage) isinvalid_cursorwithdetails.reasonmalformed, notexpired. - A
partial_datawarning names the fields that are null and says a retry may fill them, without our upstream request's error. urlon an endpoint that takeshandle, or the reverse, suggests the other:GET /v1/tiktok/profile?url=…answers "did you mean "handle"? handle takes a username or a profile link."- A TikTok share link (
vm.tiktok.com/…) sent ashandleis called a share link that may open a video or a profile, with what to send instead. /v1/twitter/…suggests the same endpoint under/v1/x/.
- A
- Fixed
Facebook event searches with no results answer an empty list
GET /v1/facebook/search_eventsanswers a search that matches nothing withdata: []andpage.has_more: falseagain, instead ofupstream_blockedafter several attempts. Since 2026-11-06 most searches had been answered from a thinner fallback while Facebook refused the request behind the first page. Every page now comes from the request that lists the results, so a first page holds fewer events than before and the next pages continue as they did. - Fixed
Instagram audio endpoints refuse an audio whose page shows another one
Instagram Audio API, Instagram Audio Reels API
Instagram merges some original audio with other audio, and the merged audio's page then shows another creator's audio and its reels.
GET /v1/instagram/soundused to return that other audio, with its ownid, andGET /v1/instagram/sound_postsits reels. Both now answerprivate_or_unavailablefor such an audio, free, and the error message names the audio Instagram shows instead. An audio ID that names a cluster of audios rather than one audio is refused the same way. Songs, by their audio page ID or asset ID, and original audio that Instagram still shows on its own page work as before. - Changed
A smaller MCP tool list, and call_endpoint
The MCP server now lists a small default set of tools instead of every tool, so it takes far less of your agent's context:
find_endpoint, the kinds of data most platforms have (posts, profiles, comments, transcripts, engagement, search), the docs tools,get_account, and the newcall_endpoint, which calls any endpoint by the IDfind_endpointgives. Add?tools=allto the server's URL to list every tool, or name toolsets and tools (?tools=default,jobs). Every tool still answers when called by name. Tool descriptions are shorter: each platform's details are infind_endpoint's results, which now include the endpoint's notes. A tool that takeshandlealso accepts it asurl, and the other way around. Concise results leave out null fields. In the TypeScript SDK,socialtapTools()returns the same default tools (tools: "all"for every one). See Build with AI agents. - Changed
Reddit comments count their replies
GET /v1/reddit/commentsnow fillsmetrics.reply_countwith a comment's direct replies when the page shows all of them. It stays null when Reddit holds some back behind a "more replies" link, whose count includes their own replies:platform_specific.reddit.more_replies_counthas that number. - Fixed
Snapchat Spotlight sizes and exact lengths are back
snapchat.spotlightreturnsmedia[].width,media[].heightand an exactduration_msagain where Snapchat states them, after a day of nulls and whole-second lengths when Snapchat changed its Spotlight pages. Since that change, Snapchat no longer publishes an image Spotlight's file or a sound's ID logged out:media[].urlis null on an image Spotlight (its cover stays inthumbnail_url), andplatform_specific.snapchat.sound.idis null. - Changed
sort takes the platforms' own words
sortnow readsnewandlatestasnewest,oldasoldestandtopaspopular, in any case, on every endpoint that offers that order:GET /v1/reddit/subreddit_posts?sort=newandGET /v1/youtube/comments?sort=topwork as Reddit and YouTube name their menus. Answers, cursors and cached copies are the same as for the value it means. The catalog lists them asparam_vocabulary[].value_aliases. - Added
TikTok followers and following
TikTok Followers API, TikTok Following API
GET /v1/tiktok/followersandGET /v1/tiktok/followinglist the accounts that follow a public TikTok account, newest first, and the accounts it follows, from its username, link, user ID or secUid: each account's username, display name, avatar, verified mark and exact follower, following, like and post counts. TikTok serves only an account's most recent followers; past that the list ends withpage.end_reasonplatform_limit. A private account, or a public one that hides who it follows, returnsprivate_or_unavailable. - Added
TikTok hashtag posts
GET /v1/tiktok/hashtag_postsreturns the top public videos and photo posts under a TikTok hashtag, from its link, its name or the app's share link: each post's caption, hashtags, author username, play count, cover and a video link that plays without TikTok's cookies. Logged out, TikTok shows one page of a hashtag's top posts, and its embed fails for some hashtags: those returnupstream_errorand aren't charged. - Fixed
A removed TikTok Shop product answers not_found
TikTok Shop Product API, TikTok Shop Reviews API
A product TikTok Shop has removed or delisted now answers
not_foundin one attempt, free, with a message saying it was removed, instead ofupstream_blockedafter several attempts. - Changed
X post links from fxtwitter and vxtwitter, and post IDs in X search results
X (Twitter) Post API, X (Twitter) Post Search API
GET /v1/x/posttakes post links on fxtwitter.com, vxtwitter.com, fixupx.com and fixvx.com, the mirrors people share X links on, as the post on x.com.GET /v1/x/search_postsnow fills each result'spost.idfrom its/status/<id>link.post.author.idstays null until the result is filled (fill=true): a post's link names the author's username, not X's number for the account. - Fixed
YouTube upload dates from labels are dates
Beyond each tab's newest uploads,
GET /v1/youtube/postsreadspublished_atfrom YouTube's labels ("1 year ago"). It is now the day that label allows at the latest, at midnight UTC (the hour for labels in hours), still listed inapproximate_fields, instead of a second the label never stated.sincecompares those by day, so send it as a date. - Added
Apple Music tracks, albums, artists, search and charts
Apple Music Track API, Apple Music Album API, Apple Music Artist API, Apple Music Track Search API, Apple Music Album Search API, Apple Music Artist Search API, Apple Music Playlist Search API, Apple Music Top Tracks API, Apple Music Top Albums API, Apple Music Top Playlists API
Apple Music is a new platform, with no login and any country's store through
country.applemusic.trackreturns a song, music video or radio episode from its link or ID, with its artists, album, length, ISRC, composer, genres, audio formats and preview file.applemusic.albumreturns an album or single with its tracks in order, using the newalbumresource: credited artists, release date, label, UPC, copyright, genres and total length.applemusic.artistreturns an artist's bio, pictures, genres and the sections of their page, such as top songs and albums; Apple states no follower count, so that is null.applemusic.search_tracks,search_albums,search_artistsandsearch_playlistssearch one kind each, withkindchoosing music videos, radio episodes or stations.applemusic.top_tracks,top_albumsandtop_playlistsreturn a country's charts with each row's rank. - Changed
The CLI's init command says where it stores your key
socialtap initnow prints each file it stores your API key in, and makes those files readable only by you, including ones that already existed. A key from$SOCIALTAP_API_KEYno longer goes into Claude Code's config when you runinitin a terminal: Claude Code signs you in with your browser instead. Pass--api-key, or keep a Claude Code entry that already sends a key, and the key is stored as before. - Changed
fill=true stops looking up a page's results after repeated upstream failures
With
fill=true, a page whose lookups fail five times in a row, because the platform is refusing them, no longer looks up its remaining results. They stay unfilled at no charge and the answer carries the usualpartial_datawarning, as for any lookup that fails. A result the platform no longer has (not_found) doesn't count toward the five, and a result filled starts the count over. - Changed
Accounts that have never paid get a lower request ceiling
An account that has never paid has a lower runaway-protection ceiling, which its first payment removes within a minute:
max_rpsinGET /v1/accountstates yours. In test mode the ceiling is lower than a live key's, since recorded answers need no more; theRateLimit-Policyheader states it.Failed requests stay free, within a limit: when an account's failures cost far more upstream in an hour than its charged requests paid for, its live requests answer
rate_limiteduntil that passes, withRetry-Afterand a message that says why. Failures alongside a normal share of successes never meet it, nor do failures that cost nothing to find out; and for an account that has paid, neither do a platform's outages (upstream_blocked,upstream_error,overloaded).A request body above the size the API accepts now answers
request_too_large(413), the new error code, instead ofinvalid_input. Changes to an account's keys and settings, and usage reports, are limited per account per minute, far above what a dashboard or ordinary automation sends; API keys and the dashboard count apart, and what removes access (revoking a key, removing a member) is never limited.GET /v1/usagecounts requests refused before any work (a 402 or 429 with no charge) per account, outcome and surface: grouped by endpoint or key they havenullthere, and a filter by endpoint or key leaves them out, except thatspend_limit_reachedstays with its key.GET /v1/requestsno longer lists requests refused before any work:GET /v1/usagecounts them, andGET /v1/usage/ratethe ceiling's. Withkeep_response_bodieson, uncharged answers past a small allowance per minute saynot_stored; charged answers are always kept. - Changed
Revoking an API key also revokes the admin keys it made
DELETE /v1/api_keys/{id}now also revokes every key with theadminscope that the key created, gaveadminor rotated, and those keys' in turn, so a leaked admin key's copies don't outlive it. Keys withoutadminkeep working; the answer lists both (also_revoked,left_standing), and a key can't revoke a key above it. Keys now readcreated_by_keyandcreated_by_user, and webhook endpointscreated_by_user. The account's owner is emailed when an API key makes or rotates a live key or changes a webhook endpoint, and an API key can no longer turn offapi_keysnotifications. - Changed
The TypeScript SDK keeps your key on the API's origin across redirects
The TypeScript SDK sends your key in its own header, which HTTP clients carry across a redirect. It now follows a redirect only to the same origin, or from http to https on the same host, and otherwise fails with an error instead of retrying. The API itself doesn't redirect; this matters if a proxy or a
baseURLin front of it does: point it at the origin that answers. - Changed
An answer that shows a secret is kept for less time
An
Idempotency-Keyretry of a request that showed a secret (a new key or webhook endpoint, a rotated secret) now gets the same answer for minutes rather than a day (Idempotency); after that the same key doesn't run again: it answersidempotency_key_reused,details.reasonanswer_expired. A key's previous secret, after a rotation, getsidempotency_key_reusedinstead of that answer.GET /v1/eventsanswers a job event'sresults_urlonly to a credential withjobs:read; others read the job'surlthere. - Fixed
Speech-to-text refuses a file too large for it before downloading it
A transcript endpoint that falls back to speech-to-text now answers
no_transcript, free, for a media file over 24 MB, before reading the file when its size is declared, after trying any smaller file of the media. Such a file could fail withupstream_errorafter several attempts. A file under the size runs as before, and captions are unaffected, whatever the media's size. - Added
Spotify tracks, albums, artists, playlists, podcasts and search
Spotify Track API, Spotify Album API, Spotify Artist API, Spotify Playlist API, Spotify Playlist Tracks API, Spotify Podcast API, Spotify Podcast Episodes API, Spotify Track Search API, Spotify Album Search API, Spotify Artist Search API, Spotify Playlist Search API, Spotify Podcast Search API
Spotify is a new platform, with no login.
spotify.trackreturns a track or podcast episode from its link, share link, URI or ID, with its artists, exact play count, album, ISRC, label and credits.spotify.albumreturns a release with all its tracks in order, using thealbumresource.spotify.artistreturns an artist's bio, pictures, followers, monthly listeners, world rank, top cities and top tracks, with the IDs of their releases.spotify.playlistreturns a playlist's details, andspotify.playlist_tracksits tracks a page at a time, with who added each one and when.spotify.podcastreturns a show using the newpodcastresource: publisher, topics, rating and episode count.spotify.podcast_episodeslists a show's episodes, andsinceanduntilwork whichever order the show lists them in.spotify.search_tracks,search_albums,search_artists,search_playlistsandsearch_podcastssearch one kind each:kindonsearch_trackschooses podcast episodes, and onsearch_artiststhe accounts of listeners. - Changed
Webhook deliveries are paced
Deliveries are now paced per account and per host: one over the pace stays
pendingwith a laternext_attempt_at, and is never dropped. Test mode is paced tightly. A target that has stopped answering gets a shorter timeout until it answers again; one that answers slowly keeps the full one. See Webhooks. - Added
Bluesky profiles, posts, comments and post search
Bluesky Profile API, Bluesky User Posts API, Bluesky Post API, Bluesky Comments API, Bluesky Post Search API
Bluesky is a new platform, with no login.
bluesky.profilereturns a public account by its handle, DID or link, with its exact follower, following and post counts, verified badge and the links it lists.bluesky.postslists an account's posts a page at a time, by the tabs of its profile (posts, replies, media, video) and by date.bluesky.postreturns one post from any of its links or its at:// ID, with its text, images and video, link card, quote and exact counts.bluesky.commentsreturns a post's public replies in one flat list, most liked, newest or oldest.bluesky.search_postsfinds posts by words, author, mention, hashtag, linked site, language and date, newest first or by Bluesky's Top ranking. It reads Bluesky's own search, which Bluesky's app offers only to signed-in people, so if that route stops answering, the first page comes from a public web search's index with apartial_datawarning. An account that chose to be seen only by signed-in people isprivate_or_unavailable, and its posts and replies are left out of lists. - Added
Monthly plans, and new credit packs
You can now subscribe to a monthly plan, or keep buying credit packs with no subscription. Plans are cheaper per credit, and every plan and pack gets every endpoint on every platform. See pricing and credits.
A plan's credits are spent first, and what is left of them ends at each renewal. Credits from packs and top-ups never expire, including those you already hold. If you run out, buy your plan's top-up or any pack, or turn on auto top-up.
New routes:
GET /v1/billing/subscriptionreads your plan;POST /v1/billing/subscription/checkout,PATCH /v1/billing/subscriptionandPOST /v1/billing/subscription/cancel(the dashboard session only) start, change and cancel it. New events:plan.renewed,plan.changed,plan.payment_failedandplan.ended. Credit history gains theplantype.The packs changed: the
packIDs ofPOST /v1/billing/checkoutare now1k,30k,250kand2m, plus each plan's top-up (starter_topup,growth_topup,scale_topup). The old IDs20k,80kand400kare gone. - Added
SoundCloud artists and tracks
SoundCloud Artist API, SoundCloud Artist Tracks API, SoundCloud Track API
SoundCloud is a new platform.
soundcloud.trackreturns a public track from any of its links, a share link, its URN or its ID: its title, description, uploader, exact play, like, repost, comment and download counts, genre, tags, license and release metadata.soundcloud.artistreturns a public account from its name, link, URN or ID, with its bio, follower count and links.soundcloud.trackslists an account's public tracks, newest first, a page at a time, and takessinceanduntil. A track's playback policy, monetization model, encodings and playable length depend on the listener's country, and these fields give the US view. - Added
Telegram channels, posts and channel search
Telegram Channel API, Telegram Channel Posts API, Telegram Post API, Telegram Channel Search API
Telegram is a new platform, from its public web pages with no login.
telegram.channelreturns a public channel, group, user or bot by its username or link: its title, description, subscriber or member count and verified flag, and what kind of account it is.telegram.channel_postslists a channel's posts with their text, media, views, reactions, forwards and replies, andcontainssearches inside the channel.telegram.postreturns one post from its link.telegram.search_channelsfinds public channels by keyword through a web search index, so it holds what the index has seen. Telegram shows some channels only in some countries and answersprivate_or_unavailablefor them elsewhere, and it answers only a channel search's newest matches. - Added
Twitch profiles, videos, schedules and clip transcripts
Twitch Profile API, Twitch Videos API, Twitch Video and Clip API, Twitch Schedule API, Twitch Clip Transcript API
Twitch is a new platform.
twitch.profilereturns a channel from its login, link or ID: exact followers, whether it is on air and for how many viewers, its links, its Partner or Affiliate badge and its latest broadcast.twitch.videoslists a channel's past broadcasts, highlights and uploads, newest or most viewed, up to its first 100 per type and sort.twitch.videoreturns one video or clip with its signed files, category, chapters and content labels.twitch.schedulereturns the live broadcasts a channel has announced for the coming weeks, with cancelled ones marked.twitch.transcriptreturns a clip's speech as timed segments, from the clip's audio. - Added
The TypeScript SDK and the CLI are on npm
npm install socialtapadds the TypeScript SDK: a typed method for every endpoint, retries, auto-pagination, and the agent tools for the Vercel AI SDK. The same package is the CLI:npx socialtapcalls any endpoint from the shell, andnpx socialtap initsets up Claude Code, Codex, Cursor and Gemini CLI with the Agent Skill and the MCP server. - Added
Web searches can favor a country's results
Every endpoint that finds items through a web search index now takes
country, an ISO 3166-1 alpha-2 code, to favor that country's results. It changes the search engine's ranking and is not a filter, so pages from elsewhere still appear, and how much changes depends on the query. Without it, results are as before. It takes the countries search engines rank for, listed in each endpoint's docs; any other code answersinvalid_inputat no charge./v1/telegram/search_channels?query=news&country=BRis an example. - Fixed
Web searches answer a query too long for any search engine with invalid_input
A web search endpoint (
search_profiles,search_postsand the others that find items through a search index) now answers a query too long for any search engine to read withinvalid_input, where it answeredupstream_errorafter several attempts. It costs no credit, as it did before. A query only one engine can read goes on to that engine with fewer attempts, and its list ends withpage.end_reasonplatform_limitwhere the next page used to fail withupstream_error. - Fixed
Fewer web search lists end early on an empty page
A web search endpoint could answer
page.has_moretrue and then an empty page, on a query whose next page the search engine answered with its first page again, though it held more further on. The next page is now asked the way that can reach it, so fewer lists end that way. Some still end on an empty page before the engine's results do. - Added
Agents can get an API key with auth.md, and MCP clients sign in with a browser
An agent without a key now follows
/auth.md: it registers withPOST /agent/identity, shows its user a link and a code, the user signs in or creates an account and approves it, and the agent collects its key fromPOST /oauth2/token. It works for an existing account too, needs no email address, and nobody is emailed until the user acts. The registration also returns a public test key to build with meanwhile.The MCP server now supports OAuth: add it to your client with no key, and the client signs you in the first time a tool needs it. Listing tools and the free tools still work without signing in, and an API key still works. A call to a tool that needs a key, made without a good one, now answers HTTP 401 with a
WWW-Authenticatechallenge instead of a tool error, which is what starts a client's sign-in.POST /v1/agent_signupkeeps working and is deprecated. A 401 now namesdetails.agent_auth_urlandWWW-Authenticatetoo. - Fixed
Fewer false empty answers on TikTok ads and fewer blocked requests on TikTok Shop
tiktok.search_adswithsearch_by=advertisercould answer an empty page for an advertiser that has ads, because TikTok's own advertiser lookup answers some calls with nothing. It now asks again several times before it reports no such advertiser.tiktokshop.productandtiktokshop.reviewscould answerupstream_blockedfor products that TikTok Shop refuses to many US exits. They now try many more exits before giving up, so these requests can take a few seconds longer. - Fixed
Fewer failed requests on Google ads and Instagram songs
Instagram Audio API, Google Ads Transparency Center Ad API, Google Ads Transparency Center Advertiser Ads API, Google Ads Transparency Center Advertiser API, Google Ads Transparency Center Ads by Website API, Google Ads Transparency Center Advertiser Search API, Google Ads Transparency Center Search Suggestions API
GET /v1/instagram/soundcould answer 502upstream_errorfor a licensed song when Instagram served one of our exits an empty record, and thegoogleendpoints could answer 502 when Google rate-limited an exit by redirecting it. Both now move on to another exit, so these requests succeed more often.When no exit can serve one, the answer is 503
upstream_blockedinstead of 502. It is still free and still retryable. - Added
The public events of a Facebook Page or person
facebook.eventslists the events of a Facebook profile's Events tab from its handle, a Page's or a person's:time=upcoming(the default, soonest first) ortime=past(latest first), a page at a time, withsinceanduntil. It returns theeventresource, asfacebook.eventandfacebook.place_eventsdo. - Added
Search public Facebook events
GET /v1/facebook/search_eventssearches Facebook's public events by keywords, withsince,untilandlocation, and returns theeventresource, in the Facebook Events section. - Added
Facebook web search
Facebook Post Search API, Facebook Page and People Search API, Facebook Group Search API
Three searches of Facebook through a public web search's index:
GET /v1/facebook/search_postsfor public posts (media=videofor videos),GET /v1/facebook/search_profilesfor Pages and people (account_typechooses), andGET /v1/facebook/search_groupsfor public groups.fill=trueadds each result's full record. - Added
Instagram place and sound search
Instagram Location Search API, Instagram Audio Search API
GET /v1/instagram/search_placesandGET /v1/instagram/search_soundsfind Instagram's places and sounds for your words through a public web search's index.fill=trueadds each result's full record. - Added
Kick clips and transcripts
Kick Clip API, Kick Clip Transcript API
Kick is a new platform.
kick.postreturns a public clip from its link or ID: its title, views, length, thumbnail, playback link, category, channel with its verified badge, who clipped it, the broadcast it came from and, while Kick keeps it, the saved video with its link and the clip's offset.kick.transcriptreturns the clip's speech as timed segments with their language, from the clip's audio, since Kick clips carry no captions of their own. - Added
Kwai
Kwai Profile API, Kwai User Posts API, Kwai Post API
Kwai is a new platform.
kwai.profilereturns a public account from its name, link, share link or ID, with its followers, following, likes received and post count.kwai.postslists an account's posts, andkwai.postreturns one post from any of its links or share links, with its counts, video, sound, place and tagged accounts. - Added
LinkedIn
LinkedIn Profile API, LinkedIn Post API, LinkedIn Company and People Search API, LinkedIn Post Search API
A new platform.
GET /v1/linkedin/profilereads a company, school or showcase Page, or a member's profile, from its link.GET /v1/linkedin/postreads a public post or article.GET /v1/linkedin/search_profilesfinds Pages and members through a public web search, withaccount_typechoosing which, andGET /v1/linkedin/search_postsfinds public posts,#tagsincluded.fill=trueon either search adds each result's full record. - Added
LinkedIn Ad Library
LinkedIn Ad Library Ad API, LinkedIn Ad Library Search API
GET /v1/linkedin/adreads one ad of LinkedIn's public Ad Library from its link or ID, in every format the library lists: the advertiser and who paid, text, media, every carousel slide, a message ad's sender and buttons, a job's or event's details. Ads shown in the EU and Brazil add their run dates, impressions range, share of impressions by country and targeting.GET /v1/linkedin/search_adssearches the library by words in the ad, an advertiser's name or exact company ID, or who paid, within countries and a window of days, newest or oldest first, and returns each ad's card; a result's ID goes tolinkedin.adfor the rest. - Added
Linkme pages
linkme.profilereturns a public Linkme page as a profile, from its name or link: the account's ID, name, bio, picture, logo and verified badge, its total followers, every social icon with the handle and followers Linkme holds for it, every link in its list with its title, section and carousel, each destination of a music link, the links behind an adult notice, and the emails, phone numbers and addresses it publishes. - Fixed
Partial answers are no longer replayed from the cache
An answer carrying a
partial_datawarning is no longer stored in the cache at the edge, on any endpoint. Before, a request withmax_agecould be answered, and charged nothing, from an earlier partial answer for as long asmax_ageallowed, with the warning still on it. Now the next request fetches again, so it can get the whole answer. - Added
Snapchat
Snapchat Profile API, Snapchat Spotlight API, Snapchat Comments API
Snapchat is a new platform.
snapchat.profilereturns a public account from its username or link: its name, bio, picture, subscribers, category, recent Story, saved Stories with their Snaps, Spotlights and related accounts.snapchat.spotlightreturns one Spotlight from its link or ID: its video or image, caption, transcript, counts, sound, Lens, place and author.snapchat.commentswalks a Spotlight's comments by cursor, with each comment's text, author, likes and reply count, andcomment_idreturns a comment's replies. - Fixed
A regional lang works on speech-to-text transcripts
On the transcript endpoints that pass
langto speech-to-text, alangwith a region (pt-BR,zh-TW) now reaches it as its language (pt,zh), and a language it lists under another code is found there (nb,iw,jv,cmn,fil,zh-yue). Before, each failed withupstream_errorafter retries and was not charged. Alangspeech-to-text doesn't have (zu) now answersinvalid_inputonlangat once, instead of the sameupstream_error. Ontiktok.transcript, where the language hint is TikTok's own and not yours, speech-to-text now detects the language when it doesn't have TikTok's, instead of failing. - Fixed
TikTok links with a percent-encoded @ are accepted
A TikTok link written with
%40in place of@(https://www.tiktok.com/%40nasa/video/…), as some apps copy it, now answers like the plain link. Before, it answeredinvalid_input. - Added
Facebook Pages, groups, comments, Marketplace, Events and the Ad Library
Facebook Profile API, Facebook Profile Posts API, Facebook Reels API, Facebook Profile Photos API, Facebook Engagement API, Facebook Comments API, Facebook Comment Replies API, Facebook Group API, Facebook Group Posts API, Facebook Marketplace Listing API, Facebook Marketplace Search API, Facebook Marketplace Location Search API, Facebook Event API, Facebook City Events API, Facebook Ad Library Ad API, Facebook Ad Library Advertiser Ads API, Facebook Ad Library Advertiser Search API, Facebook Ad Transcript API
Facebook now covers public Pages and profiles (
profile,posts,reels,photos,engagement), comments and their replies (comments,replies) and public groups (group,group_posts). Facebook Marketplace, Facebook Events and the Facebook Ad Library are listed as their own sections, on the same/v1/facebook/paths:listing,search_listingsandsearch_places;eventandplace_events, which return the neweventresource;ad,ads,search_advertisersandad_transcript.facebook.search_adsresults now carryplatform_specific.facebook, and a branded content ad's advertiser no longer gets the creator's link and avatar. - Fixed
Facebook photo posts
GET /v1/facebook/postbegan returning some photo posts astype: "link"with an emptymediaarray, after Facebook started sending a link alongside the photo. They come back astype: "image"with the photo inmediaagain. - Changed
Free filtered pages on Google ad lists, individuals' election registrations, account IDs for agents
Google Ads Transparency Center Advertiser Ads API, Google Ads Transparency Center Ads by Website API, Google Ads Transparency Center Advertiser API
google.adsandgoogle.search_adsno longer charge for a page our ownsince/untilfilter emptied (asincemore than a year back, oruntilwithoutsince, which Google cannot filter on): those pages are free, as onrumble.posts.google.advertisernow returns an individual's own registration with an election regulator inplatform_specific.google.election.regulatory_ids, as typeus_individual.The MCP tools' concise results now carry each account's
idbeside itsusername(an ad's advertiser, a post's or comment's author, a suggestion's profile, …), on every platform: Google advertisers have no username, so the ID is how an agent names them. - Added
Komi page
GET /v1/komi/pagereturns a creator's Komi page from its<name>.komi.iolink, a deep link on that host, the host alone, or the bare username: the name, bio and pictures, the row of social and contact links, and every item on the page in its order, including links, products, videos, music releases, podcasts and events, each with its group and section.Komi is a new platform on the API. A name no page has answers
not_found; a page Komi has switched off answersprivate_or_unavailable. - Added
Lnk.Bio pages
linkbio.profilereturns a public Lnk.Bio page as a profile, from its name or link: the account's ID, name, bio, picture and verified badge, every link in its list, including those the page only loads as a visitor scrolls, its social icons by name, the emails and phone numbers it publishes, the place it shows on a map, its own domain, and how many links it holds. - Added
Linktree profiles
Linktree is a new platform.
GET /v1/linktree/profilereturns a public page from its username or any link to it: its ID, title, bio, avatar, banner, verification badge, country and join date, every link in page order with its type, group, position and thumbnail, and the page's social icons and listed email address.A sensitive-content or age label is a click-through, so its link keeps its URL and names the label in
gates. A link behind a passcode, password or NFT lock has its label and a nullurl. A name nobody has isnot_found, and a page Linktree removed isprivate_or_unavailable. - Added
Pillar pages
GET /v1/pillar/pagereturns a public Pillar link-in-bio page from its name, its link or the creator's ID: the creator's profile, the social accounts and links on the page in page order with each link's click count, what the page sells, its featured videos, the email addresses it lists, and the audience its media kit shows, as an exact total and per account.Only what the page shows is returned: links and products the creator hid, and courses never published, are left out.
- Fixed
TikTok ad partial takedowns
GET /v1/tiktok/adcould report an ad TikTok took down in some countries as not removed, because TikTok states such a takedown in some languages and not others. The endpoint now checks a second language:is_removed,removal_reasonsandremoval_country_codesreport the takedown when either language states it, with the reasons in German when only German does.If that second check fails,
is_removedisnullwith apartial_datawarning instead offalse. - Added
TikTok hashtag search
GET /v1/tiktok/search_hashtagsreturns the TikTok hashtags a public web search finds for your words: each tag's name and link, with its post count and description when the search index shows them.fill=trueadds each hashtag's full, current TikTok record to the same response. - Changed
TikTok account search refuses queries with nothing to find
GET /v1/tiktok/search_profilesnow answers400 invalid_inputto a query made only of exclusions (-barber,-"wine bar"), which used to return and bill a page of unrelated accounts. Send at least one word to search for.A result's
biois now null when the search index's text is not the account's description (a video's caption, the page's links or its video counts), and adisplay_nameis no longer read from counts.fill=truereturns the account's record, with its bio. A result found through a link by numeric ID now has its realusername. - Added
TikTok sound search
GET /v1/tiktok/search_soundsreturns the TikTok sounds a public web search finds for your words, in one paged list, each with the title, author and video count the search index shows;fill=trueadds each sound's full TikTok record fromtiktok.sound. - Added
TikTok Top search
GET /v1/tiktok/search_topreturns the TikTok accounts, videos, photo posts, hashtags and sounds a public web search finds for your words, in one paged list. Each result names its type and holds what the search index shows of it;fill=trueadds each result's full TikTok record from its own lookup. - Added
Truth Social
Truth Social Profile API, Truth Social Posts API, Truth Social Post API
Truth Social is a new platform.
GET /v1/truthsocial/profilereturns a public account by its handle, link or ID,GET /v1/truthsocial/poststhe Truths and ReTruths it posted, andGET /v1/truthsocial/postone post by any of its links or its ID. - Added
X (Twitter) posts
GET /v1/x/postreturns a public X (formerly Twitter) post by any x.com or twitter.com link or bare ID: its whole text, long posts and X Articles included, every photo, video and GIF with all its renditions, exact view, like, repost, quote, reply and bookmark counts, the post it quotes or replies to, its poll with exact votes, its card, community and edit history, and the author's counts underplatform_specific.x. - Added
X (Twitter) profiles
GET /v1/x/profilereturns a public X (formerly Twitter) account by username, numeric user ID or any x.com or twitter.com profile link (Follow-button and intent links included): name, bio with its links written out, website, location, join date, profile picture and header, its check and what kind (blue, business or government), affiliate badge, professional category, whether it is protected, and exact follower, following and post counts, with X's own media, like and list counts, pinned posts and identity verification underplatform_specific.x. - Added
X (Twitter) Community search
X (Twitter) Community Search API
GET /v1/x/search_communitiesreturns the X Communities a public web search finds for your words, in one paged list: each community's link, with what the search index shows of its title, description and member count.fill=trueadds each community's full, current record fromx.community. - Added
X (Twitter) hashtag search
X (Twitter) Hashtag Search API
GET /v1/x/search_hashtagsreturns the X hashtags a public web search finds for your words, in one paged list: each tag's name, spelled as X's page spells it, and its link. Use it to discover a topic's hashtags and their spellings. - Added
X (Twitter) post search
GET /v1/x/search_postsreturns the X posts a public web search finds for your words, a #hashtag or an @handle, in one paged list: each post's link, author and exact publish time, with what the search index shows of its text.sinceanduntilhold a date window to each post's exact time.fill=trueadds each post's full, current record fromx.post. - Added
X (Twitter) account search
GET /v1/x/search_profilesreturns the X accounts a public web search finds for your words, in one paged list: each account's username and profile link, with what the search index shows of its display name, bio and counts.fill=trueadds each account's full, current X profile fromx.profile. - Changed
Ad libraries listed on their own
TikTok Ad Library Ad API, TikTok Ad Library Search API, TikTok Top Ads API, Facebook Ad Library Search API
The docs, the API pages and the playground now list TikTok Ad Library and Facebook Ad Library on their own, next to TikTok and Facebook, with their own pages. The TikTok Ad Library holds
tiktok.ad,tiktok.search_adsandtiktok.top_ads; the Facebook Ad Library holdsfacebook.search_ads.Nothing changes for API callers: paths, parameters and responses are the same, including
data.platform. The OpenAPI document tags these operations "TikTok Ad Library" and "Facebook Ad Library" instead of "TikTok" and "Facebook", so a client generated from it by tag may group them under a new class. - Added
Google Ads Transparency Center ad
Google Ads Transparency Center Ad API
GET /v1/google/adreturns one ad from Google's Ads Transparency Center from its link, the old political ads report's link or its creative ID: the advertiser with its verification badge, who paid, the format, each image variation (or, for a local text ad, its headline, description and link), when the ad was first and last shown and for how many days, the countries it ran in, and the topic Google labels it with. Ads shown in Europe and election ads also carry Google's impressions per country and per Google service and the kinds of audience criteria used; election ads their spend range and their age, gender and location targeting, with Google's names for the locations.Google is a new platform; its Ads Transparency Center is listed as a section of its own.
- Added
Google Ads Transparency Center advertiser ads
Google Ads Transparency Center Advertiser Ads API
GET /v1/google/adslists an advertiser's ads from Google's Ads Transparency Center by its advertiser ID or page link, most recently shown first: each ad's format, image, exact first and last shown times, days shown, and the advertiser's name and verification badge. Filter by country, format, Google service (Search, YouTube, Maps, Play, Shopping) and the days shown, or list only the advertiser's election ads with their countries, impressions and spend, sortable by impressions. - Added
Google Ads Transparency Center advertiser search
Google Ads Transparency Center Advertiser Search API
GET /v1/google/search_advertisersfinds the advertisers of Google's Ads Transparency Center whose name matches a query, every match rather than the search box's first few: each advertiser's ID, name, country, verification badge and ad count as Google's range. Filter to the advertisers whose ads ran in one country, with their ad counts there, and sort by Google's order or most ads first. - Added
Google Ads Transparency Center search suggestions
Google Ads Transparency Center Search Suggestions API
GET /v1/google/search_suggestionsreturns what the Ads Transparency Center's search box suggests for a query, in its order: the matching advertisers, each with its ID, name, country, verification badge and ad count as Google's range, then the websites whose ads the center lists, each as its bare domain. Suggestions gain thewebsitetype and Google's own fields,platform_specific.google.country_codeandads. Filter to one country, and page past what the box shows. - Added
Instagram audio
GET /v1/instagram/soundreturns one Instagram audio, a licensed song or a creator's original audio, from its audio link or ID: title, artist and the artist's or creator's Instagram account, length, cover art, the full audio file, its Spotify link, the exact number of reels using it, and whether Instagram marks it explicit, trending or shows its lyrics. A song asked for by its audio asset ID is answered under its audio page's ID.The Instagram sound schema gains
platform_specific.instagram.is_lyrics_shown. - Changed
Reddit comment threads in full, and more Reddit sorts
Reddit Comments API, Reddit User Posts API, Reddit User Comments API
A walk of
reddit.commentsnow returns the whole thread: the replies Reddit leaves behind a "more replies" link come on the following pages, right after the page that shows their parent comment, before the post's next top-level comments.platform_specific.reddit.more_replies_countstill says how many each page left out.reddit.commentstakes two more of Reddit's orders:sort=controversialandsort=qa(Q&A: the comments the post's author answered first).reddit.postsandreddit.profile_commentstakesort=controversial, of all time or of Reddit's time filter that coverssince, assort=populardoes.A caller who wants only the shown tree sends
replies=shown: the post's comments with the replies Reddit shows under them, each comment'smore_replies_countand url leading to the rest, at a fraction of the requests of the full tree. - Changed
Reddit IDs are fullnames everywhere
Reddit Post API, Reddit Comments API, Reddit Video Transcript API, Reddit Search API, Reddit Comment Search API, Reddit Subreddit API, Reddit Subreddit Posts API, Reddit Subreddit Search API, Reddit User Posts API, Reddit User Comments API, Reddit Engagement API
Every Reddit endpoint now writes IDs as Reddit's fullnames, the form Reddit itself uses for every kind:
t3_…for a post,t1_…for a comment,t2_…for an account andt5_…for a subreddit. This applies toid,post_id,parent_id,author.id,top_post_id,bottom_post_idandmeta.input.id. Account IDs already had their prefix; post, comment and subreddit IDs used to drop it.Post endpoints still take a post's bare ID (
z1c9z) as well as its fullname (t3_z1c9z).If you stored bare IDs from these endpoints, strip the prefix before comparing (
t3_z1c9zisz1c9z), or add it to what you stored. A comment, account or subreddit ID sent back asurlgets aninvalid_inputthat says what to send instead (a comment's permalink, a username, a subreddit's name): Reddit's public pages don't look those up by ID. - Changed
Reddit search post bodies and video types
GET /v1/reddit/search_poststakesinclude_body=trueto return each post's body and mentions, with an exacttype, read from Reddit's search feed (onnewest,popularandmost_comments; the feed doesn't follow Reddit's relevance order). It makes a second upstream request per page at the same price.Without it, Reddit videos now read as
video(with their poster inmedia) instead oflink, and a type the results page can't confirm (a result without a preview, or a thumbs.redditmedia.com thumbnail) is listed inapproximate_fields. - Added
TikTok effect
GET /v1/tiktok/effectreturns one TikTok camera effect from its effect link, its older sticker link or its ID: name, whether TikTok made it or an Effect House creator did, the creator's ID, handle, profile link, picture and secUid, the icon, when it was published, and TikTok's exact counts of the posts made with it and the views those posts drew.An ID TikTok knows no effect by, or a retired one, is
not_found, checked against a second answer before it is given. - Added
Instagram engagement
GET /v1/instagram/engagementreturns a public Instagram account's profile with its exact follower count, its latest posts, reels and carousels, and the engagement figures over them in one call: engagement rate per follower and per view (mean, median and spread), likes and comments per post, views per reel and their median, comment-to-like ratio, posting cadence, the mix of reels, photos and carousels, and the top and bottom post. Each post carries its own rate and how it compares with the account's typical post.The profile and every post are exactly what
instagram.profileandinstagram.postsreturn. Pinned posts and collabs another account published are flagged and left out of the figures. A private account comes back with its profile and posts unknown; an unknown account isnot_found, an age-restricted oneprivate_or_unavailable. - Added
SocialTap is live
SocialTap returns public social media data from the major platforms through one API key and one JSON schema. Browse every API to see what you can fetch today, or follow the quickstart to make your first request.
From here on, this page lists what changes for developers using the API: new endpoints and platforms, changes in behavior, deprecations with their sunset dates, and fixes you would notice. Subscribe with the JSON Feed.
- Added
TikTok engagement
GET /v1/tiktok/engagementreturns a public TikTok account's profile, its latest posts and the engagement figures over them in one call: engagement rate per follower and per view (mean, median and spread), views, likes, comments, shares and saves per post, median views, comment-to-like ratio, posting cadence, the mix of videos and photo posts, and the top and bottom post. Each post carries its own rate and how it compares with the account's typical post.The profile and every post are exactly what
tiktok.profileandtiktok.postsreturn. Figures computed from counts TikTok rounds are listed inapproximate_fields. A private account comes back with its profile and posts unknown; an unknown account isnot_found.
Changelog
What's new
What changes for developers using the API, newest first. Changes within /v1 are additive: anything that would break a client is announced here first, with a sunset date.