Changelog

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.

JSON Feed

  1. Fixed

    Reddit search returns post bodies again, on every sort

    Reddit Search API

    GET /v1/reddit/search_posts with include_body=true returns each post's text and mentions and its exact type again. Reddit closed the feed the bodies came from, so since 2026-11-11 those requests answered without bodies, marked partial_data. The bodies now come from another Reddit feed, asked for the page's own posts, so include_body also works with sort=relevance, the default, which used to return invalid_input. The price is unchanged.

  2. Added

    Reddit search for image, video and gallery posts

    Reddit Search API

    GET /v1/reddit/search_posts takes a new media parameter: image, video, carousel (a gallery) or any. It returns only the posts whose image, video or gallery was uploaded to Reddit, each with its score, comment count and time, and with image or video the post's type is exact. A gallery comes with every image in media. Other results carry the preview Reddit's search shows, often only a small thumbnail on popular and most_comments (the media item's url is then null): the Reddit Post API returns the media file. Reddit's own search applies the filter, so pages stay full, and it works with subreddit, every sort, since and until. A query that uses site:, url: or self:yes can't be combined with media and returns invalid_input. Posts that link to media on another site are not included.

  3. Added

    TikTok search suggestions

    TikTok Search Suggestions API

    tiktok.search_suggestions returns 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. country asks 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 before tiktok.search_posts, or to compare what each country searches for a word.

  4. 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.product returns 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_products searches products a page at a time, with five sorts and whether each result is sponsored. amazon.reviews returns the top customer reviews a product page shows on every marketplace but amazon.com, which shows reviews only to signed-in visitors and answers private_or_unavailable. amazon.offers lists every seller's offer of a product, with price, condition, delivery dates, the buy box and the seller's rating. amazon.seller returns a third-party seller's ratings over 30 days, 90 days, 12 months and lifetime, and the business details it discloses. amazon.top_products returns Best Sellers or New Releases of a category, ranked, and amazon.deal_products Today's Deals with the deal price, its type, badge and end time, by category.

    amazon.shop returns 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_lists lists its idea lists, using the playlist resource, and amazon.shop_posts its 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.

  5. 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.pin returns 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_pins searches pins a page at a time. pinterest.board returns a board, or one of its sections, with its description, cover, exact pin and follower counts and collaborators, using the playlist resource, and pinterest.board_pins lists its pins. pinterest.profile returns an account with exact follower, pin and board counts and monthly views; pinterest.boards lists its boards, and pinterest.pins the pins on its saved or created tab. pinterest.topic returns 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 and pinterest.pin refuses it with the reason; everything else about the pin is in the list's item.

    Two new resources come with it. trend is what is trending on a platform: pinterest.top_trends returns 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_page is a web page as a platform counts it: pinterest.web_page returns how many times any link was saved to Pinterest, counted exactly as written.

  6. Changed

    LinkedIn members the data partner can't answer

    LinkedIn Profile API

    When LinkedIn hides a member's page and the data partner can't answer for them, linkedin.profile used to answer upstream_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.source is web_search, id is the member's public name, what the text says is in approximate_fields, and the lists the copy cannot see are in unknown_fields. A member no search engine lists still answers upstream_blocked, free. fill=true on the web search endpoints is unchanged: it fills a result from the live page or not at all.

  7. 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 answers 401 unauthorized with details.reason test_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 a mode, and GET /v1/api_keys and GET /v1/requests no longer take a mode filter. POST /v1/api_keys refuses mode: "test" with invalid_input instead of making a live key. Magic test inputs (socialtap_test_<code>) and t1. cursors are ordinary values now, and the test_default_example warning is gone.

  8. Fixed

    TikTok hashtag posts for the hashtags that failed

    TikTok Hashtag Posts API

    GET /v1/tiktok/hashtag_posts used to return upstream_error for 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 returns upstream_error and isn't charged.

  9. 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: after GET /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.

  10. Changed

    Errors and warnings say what to do

    • A forbidden error's remediation is now the one for its details.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) is invalid_cursor with details.reason malformed, not expired.
    • A partial_data warning names the fields that are null and says a retry may fill them, without our upstream request's error.
    • url on an endpoint that takes handle, 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 as handle is 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/.
  11. Fixed

    Facebook event searches with no results answer an empty list

    Facebook Event Search API

    GET /v1/facebook/search_events answers a search that matches nothing with data: [] and page.has_more: false again, instead of upstream_blocked after 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.

  12. 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/sound used to return that other audio, with its own id, and GET /v1/instagram/sound_posts its reels. Both now answer private_or_unavailable for 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.

  13. Changed

    LinkedIn members LinkedIn hides, filled in full

    LinkedIn hides most members' public profiles from logged-out visitors. GET /v1/linkedin/profile used to answer upstream_blocked for them. It now returns them in full: a data partner reads the public profile live at request time and fills the same fields, with meta.source vendor and the vendor price shown on the endpoint's page. Those answers have the member's experience, education, skills, certifications, projects, publications, patents, honors and recommendations, plus two new fields, platform_specific.linkedin.is_open_to_work and is_hiring. follower_count and connection_count are null on them. A member name that doesn't exist now returns not_found instead of upstream_blocked, and as with every failed request it isn't charged. Members whose public page LinkedIn shows, and every company, school and showcase Page, are unchanged.

  14. 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 new call_endpoint, which calls any endpoint by the ID find_endpoint gives. Add ?tools=all to 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 in find_endpoint's results, which now include the endpoint's notes. A tool that takes handle also accepts it as url, 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.

  15. Changed

    Reddit comments count their replies

    Reddit Comments API

    GET /v1/reddit/comments now fills metrics.reply_count with 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_count has that number.

  16. Fixed

    Snapchat Spotlight sizes and exact lengths are back

    Snapchat Spotlight API

    snapchat.spotlight returns media[].width, media[].height and an exact duration_ms again 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[].url is null on an image Spotlight (its cover stays in thumbnail_url), and platform_specific.snapchat.sound.id is null.

  17. Changed

    sort takes the platforms' own words

    sort now reads new and latest as newest, old as oldest and top as popular, in any case, on every endpoint that offers that order: GET /v1/reddit/subreddit_posts?sort=new and GET /v1/youtube/comments?sort=top work 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 as param_vocabulary[].value_aliases.

  18. Added

    TikTok followers and following

    TikTok Followers API, TikTok Following API

    GET /v1/tiktok/followers and GET /v1/tiktok/following list 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 with page.end_reason platform_limit. A private account, or a public one that hides who it follows, returns private_or_unavailable.

  19. Added

    TikTok hashtag posts

    TikTok Hashtag Posts API

    GET /v1/tiktok/hashtag_posts returns 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 return upstream_error and aren't charged.

  20. 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_found in one attempt, free, with a message saying it was removed, instead of upstream_blocked after several attempts.

  21. 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/post takes 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_posts now fills each result's post.id from its /status/<id> link. post.author.id stays null until the result is filled (fill=true): a post's link names the author's username, not X's number for the account.

  22. Fixed

    YouTube upload dates from labels are dates

    YouTube Channel Videos API

    Beyond each tab's newest uploads, GET /v1/youtube/posts reads published_at from 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 in approximate_fields, instead of a second the label never stated. since compares those by day, so send it as a date.

  23. 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.track returns 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.album returns an album or single with its tracks in order, using the new album resource: credited artists, release date, label, UPC, copyright, genres and total length. applemusic.artist returns 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_artists and search_playlists search one kind each, with kind choosing music videos, radio episodes or stations. applemusic.top_tracks, top_albums and top_playlists return a country's charts with each row's rank.

  24. Changed

    The CLI's init command says where it stores your key

    socialtap init now 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_KEY no longer goes into Claude Code's config when you run init in 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.

  25. 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 usual partial_data warning, 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.

  26. 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_rps in GET /v1/account states yours. In test mode the ceiling is lower than a live key's, since recorded answers need no more; the RateLimit-Policy header 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_limited until that passes, with Retry-After and 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 of invalid_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/usage counts requests refused before any work (a 402 or 429 with no charge) per account, outcome and surface: grouped by endpoint or key they have null there, and a filter by endpoint or key leaves them out, except that spend_limit_reached stays with its key. GET /v1/requests no longer lists requests refused before any work: GET /v1/usage counts them, and GET /v1/usage/rate the ceiling's. With keep_response_bodies on, uncharged answers past a small allowance per minute say not_stored; charged answers are always kept.

  27. Changed

    Revoking an API key also revokes the admin keys it made

    DELETE /v1/api_keys/{id} now also revokes every key with the admin scope that the key created, gave admin or rotated, and those keys' in turn, so a leaked admin key's copies don't outlive it. Keys without admin keep working; the answer lists both (also_revoked, left_standing), and a key can't revoke a key above it. Keys now read created_by_key and created_by_user, and webhook endpoints created_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 off api_keys notifications.

  28. 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 baseURL in front of it does: point it at the origin that answers.

  29. Changed

    An answer that shows a secret is kept for less time

    An Idempotency-Key retry 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 answers idempotency_key_reused, details.reason answer_expired. A key's previous secret, after a rotation, gets idempotency_key_reused instead of that answer. GET /v1/events answers a job event's results_url only to a credential with jobs:read; others read the job's url there.

  30. 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 with upstream_error after several attempts. A file under the size runs as before, and captions are unaffected, whatever the media's size.

  31. 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.track returns 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.album returns a release with all its tracks in order, using the album resource. spotify.artist returns an artist's bio, pictures, followers, monthly listeners, world rank, top cities and top tracks, with the IDs of their releases. spotify.playlist returns a playlist's details, and spotify.playlist_tracks its tracks a page at a time, with who added each one and when. spotify.podcast returns a show using the new podcast resource: publisher, topics, rating and episode count. spotify.podcast_episodes lists a show's episodes, and since and until work whichever order the show lists them in. spotify.search_tracks, search_albums, search_artists, search_playlists and search_podcasts search one kind each: kind on search_tracks chooses podcast episodes, and on search_artists the accounts of listeners.

  32. Changed

    Webhook deliveries are paced

    Deliveries are now paced per account and per host: one over the pace stays pending with a later next_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.

  33. 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.profile returns 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.posts lists an account's posts a page at a time, by the tabs of its profile (posts, replies, media, video) and by date. bluesky.post returns one post from any of its links or its at:// ID, with its text, images and video, link card, quote and exact counts. bluesky.comments returns a post's public replies in one flat list, most liked, newest or oldest. bluesky.search_posts finds 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 a partial_data warning. An account that chose to be seen only by signed-in people is private_or_unavailable, and its posts and replies are left out of lists.

  34. 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/subscription reads your plan; POST /v1/billing/subscription/checkout, PATCH /v1/billing/subscription and POST /v1/billing/subscription/cancel (the dashboard session only) start, change and cancel it. New events: plan.renewed, plan.changed, plan.payment_failed and plan.ended. Credit history gains the plan type.

    The packs changed: the pack IDs of POST /v1/billing/checkout are now 1k, 30k, 250k and 2m, plus each plan's top-up (starter_topup, growth_topup, scale_topup). The old IDs 20k, 80k and 400k are gone.

  35. Added

    SoundCloud artists and tracks

    SoundCloud Artist API, SoundCloud Artist Tracks API, SoundCloud Track API

    SoundCloud is a new platform. soundcloud.track returns 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.artist returns a public account from its name, link, URN or ID, with its bio, follower count and links. soundcloud.tracks lists an account's public tracks, newest first, a page at a time, and takes since and until. A track's playback policy, monetization model, encodings and playable length depend on the listener's country, and these fields give the US view.

  36. 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.channel returns 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_posts lists a channel's posts with their text, media, views, reactions, forwards and replies, and contains searches inside the channel. telegram.post returns one post from its link. telegram.search_channels finds 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 answers private_or_unavailable for them elsewhere, and it answers only a channel search's newest matches.

  37. 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.profile returns 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.videos lists a channel's past broadcasts, highlights and uploads, newest or most viewed, up to its first 100 per type and sort. twitch.video returns one video or clip with its signed files, category, chapters and content labels. twitch.schedule returns the live broadcasts a channel has announced for the coming weeks, with cancelled ones marked. twitch.transcript returns a clip's speech as timed segments, from the clip's audio.

  38. Added

    The TypeScript SDK and the CLI are on npm

    npm install socialtap adds 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 socialtap calls any endpoint from the shell, and npx socialtap init sets up Claude Code, Codex, Cursor and Gemini CLI with the Agent Skill and the MCP server.

  39. 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 answers invalid_input at no charge. /v1/telegram/search_channels?query=news&country=BR is an example.

  40. Fixed

    Web searches answer a query too long for any search engine with invalid_input

    A web search endpoint (search_profiles, search_posts and the others that find items through a search index) now answers a query too long for any search engine to read with invalid_input, where it answered upstream_error after 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 with page.end_reason platform_limit where the next page used to fail with upstream_error.

  41. Fixed

    Fewer web search lists end early on an empty page

    A web search endpoint could answer page.has_more true 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.

  42. 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 with POST /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 from POST /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-Authenticate challenge instead of a tool error, which is what starts a client's sign-in.

    POST /v1/agent_signup keeps working and is deprecated. A 401 now names details.agent_auth_url and WWW-Authenticate too.

  43. Fixed

    Fewer false empty answers on TikTok ads and fewer blocked requests on TikTok Shop

    tiktok.search_ads with search_by=advertiser could 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.product and tiktokshop.reviews could answer upstream_blocked for 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.

  44. 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/sound could answer 502 upstream_error for a licensed song when Instagram served one of our exits an empty record, and the google endpoints 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_blocked instead of 502. It is still free and still retryable.

  45. Added

    The public events of a Facebook Page or person

    Facebook Page Events API

    facebook.events lists 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) or time=past (latest first), a page at a time, with since and until. It returns the event resource, as facebook.event and facebook.place_events do.

  46. Added

    Search public Facebook events

    Facebook Event Search API

    GET /v1/facebook/search_events searches Facebook's public events by keywords, with since, until and location, and returns the event resource, in the Facebook Events section.

  47. 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_posts for public posts (media=video for videos), GET /v1/facebook/search_profiles for Pages and people (account_type chooses), and GET /v1/facebook/search_groups for public groups. fill=true adds each result's full record.

  48. Added

    Instagram place and sound search

    Instagram Location Search API, Instagram Audio Search API

    GET /v1/instagram/search_places and GET /v1/instagram/search_sounds find Instagram's places and sounds for your words through a public web search's index. fill=true adds each result's full record.

  49. Added

    Kick clips and transcripts

    Kick Clip API, Kick Clip Transcript API

    Kick is a new platform. kick.post returns 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.transcript returns the clip's speech as timed segments with their language, from the clip's audio, since Kick clips carry no captions of their own.

  50. Added

    Kwai

    Kwai Profile API, Kwai User Posts API, Kwai Post API

    Kwai is a new platform. kwai.profile returns a public account from its name, link, share link or ID, with its followers, following, likes received and post count. kwai.posts lists an account's posts, and kwai.post returns one post from any of its links or share links, with its counts, video, sound, place and tagged accounts.

  51. Added

    LinkedIn

    LinkedIn Profile API, LinkedIn Post API, LinkedIn Company and People Search API, LinkedIn Post Search API

    A new platform. GET /v1/linkedin/profile reads a company, school or showcase Page, or a member's profile, from its link. GET /v1/linkedin/post reads a public post or article. GET /v1/linkedin/search_profiles finds Pages and members through a public web search, with account_type choosing which, and GET /v1/linkedin/search_posts finds public posts, #tags included. fill=true on either search adds each result's full record.

  52. Added

    LinkedIn Ad Library

    LinkedIn Ad Library Ad API, LinkedIn Ad Library Search API

    GET /v1/linkedin/ad reads 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_ads searches 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 to linkedin.ad for the rest.

  53. Added

    Linkme pages

    Linkme Profile API

    linkme.profile returns 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.

  54. Fixed

    Partial answers are no longer replayed from the cache

    An answer carrying a partial_data warning is no longer stored in the cache at the edge, on any endpoint. Before, a request with max_age could be answered, and charged nothing, from an earlier partial answer for as long as max_age allowed, with the warning still on it. Now the next request fetches again, so it can get the whole answer.

  55. Added

    Snapchat

    Snapchat Profile API, Snapchat Spotlight API, Snapchat Comments API

    Snapchat is a new platform. snapchat.profile returns 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.spotlight returns one Spotlight from its link or ID: its video or image, caption, transcript, counts, sound, Lens, place and author. snapchat.comments walks a Spotlight's comments by cursor, with each comment's text, author, likes and reply count, and comment_id returns a comment's replies.

  56. Fixed

    A regional lang works on speech-to-text transcripts

    On the transcript endpoints that pass lang to speech-to-text, a lang with 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 with upstream_error after retries and was not charged. A lang speech-to-text doesn't have (zu) now answers invalid_input on lang at once, instead of the same upstream_error. On tiktok.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.

  57. Fixed

    TikTok links with a percent-encoded @ are accepted

    A TikTok link written with %40 in place of @ (https://www.tiktok.com/%40nasa/video/…), as some apps copy it, now answers like the plain link. Before, it answered invalid_input.

  58. 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_listings and search_places; event and place_events, which return the new event resource; ad, ads, search_advertisers and ad_transcript.

    facebook.search_ads results now carry platform_specific.facebook, and a branded content ad's advertiser no longer gets the creator's link and avatar.

  59. Fixed

    Facebook photo posts

    Facebook Post API

    GET /v1/facebook/post began returning some photo posts as type: "link" with an empty media array, after Facebook started sending a link alongside the photo. They come back as type: "image" with the photo in media again.

  60. 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.ads and google.search_ads no longer charge for a page our own since/until filter emptied (a since more than a year back, or until without since, which Google cannot filter on): those pages are free, as on rumble.posts.

    google.advertiser now returns an individual's own registration with an election regulator in platform_specific.google.election.regulatory_ids, as type us_individual.

    The MCP tools' concise results now carry each account's id beside its username (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.

  61. Added

    Komi page

    Komi Page API

    GET /v1/komi/page returns a creator's Komi page from its <name>.komi.io link, 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 answers private_or_unavailable.

  62. Added

    Lnk.Bio pages

    Lnk.Bio Profile API

    linkbio.profile returns 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.

  63. Added

    Linktree profiles

    Linktree Profile API

    Linktree is a new platform. GET /v1/linktree/profile returns 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 null url. A name nobody has is not_found, and a page Linktree removed is private_or_unavailable.

  64. Added

    Pillar pages

    Pillar Page API

    GET /v1/pillar/page returns 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.

  65. Fixed

    TikTok ad partial takedowns

    TikTok Ad Library Ad API

    GET /v1/tiktok/ad could 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_reasons and removal_country_codes report the takedown when either language states it, with the reasons in German when only German does.

    If that second check fails, is_removed is null with a partial_data warning instead of false.

  66. Added

    TikTok hashtag search

    TikTok Hashtag Search API

    GET /v1/tiktok/search_hashtags returns 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=true adds each hashtag's full, current TikTok record to the same response.

  67. Changed

    TikTok account search refuses queries with nothing to find

    TikTok User Search API

    GET /v1/tiktok/search_profiles now answers 400 invalid_input to 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 bio is 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 a display_name is no longer read from counts. fill=true returns the account's record, with its bio. A result found through a link by numeric ID now has its real username.

  68. Added

    TikTok sound search

    TikTok Sound Search API

    GET /v1/tiktok/search_sounds returns 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=true adds each sound's full TikTok record from tiktok.sound.

  69. Added

    TikTok Top search

    TikTok Top Search API

    GET /v1/tiktok/search_top returns 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=true adds each result's full TikTok record from its own lookup.

  70. Added

    Truth Social

    Truth Social Profile API, Truth Social Posts API, Truth Social Post API

    Truth Social is a new platform. GET /v1/truthsocial/profile returns a public account by its handle, link or ID, GET /v1/truthsocial/posts the Truths and ReTruths it posted, and GET /v1/truthsocial/post one post by any of its links or its ID.

  71. Added

    X (Twitter) posts

    X (Twitter) Post API

    GET /v1/x/post returns 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 under platform_specific.x.

  72. Added

    X (Twitter) profiles

    X (Twitter) Profile API

    GET /v1/x/profile returns 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 under platform_specific.x.

  73. Added

    X (Twitter) Community search

    X (Twitter) Community Search API

    GET /v1/x/search_communities returns 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=true adds each community's full, current record from x.community.

  74. Added

    X (Twitter) hashtag search

    X (Twitter) Hashtag Search API

    GET /v1/x/search_hashtags returns 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.

  75. Added

    X (Twitter) post search

    X (Twitter) Post Search API

    GET /v1/x/search_posts returns 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. since and until hold a date window to each post's exact time. fill=true adds each post's full, current record from x.post.

  76. Added

    X (Twitter) account search

    X (Twitter) User Search API

    GET /v1/x/search_profiles returns 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=true adds each account's full, current X profile from x.profile.

  77. 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_ads and tiktok.top_ads; the Facebook Ad Library holds facebook.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.

  78. Added

    Google Ads Transparency Center ad

    Google Ads Transparency Center Ad API

    GET /v1/google/ad returns 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.

  79. Added

    Google Ads Transparency Center advertiser ads

    Google Ads Transparency Center Advertiser Ads API

    GET /v1/google/ads lists 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.

  80. Added

    Google Ads Transparency Center advertiser search

    Google Ads Transparency Center Advertiser Search API

    GET /v1/google/search_advertisers finds 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.

  81. Added

    Google Ads Transparency Center search suggestions

    Google Ads Transparency Center Search Suggestions API

    GET /v1/google/search_suggestions returns 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 the website type and Google's own fields, platform_specific.google.country_code and ads. Filter to one country, and page past what the box shows.

  82. Added

    Instagram audio

    Instagram Audio API

    GET /v1/instagram/sound returns 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.

  83. 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.comments now 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_count still says how many each page left out.

    reddit.comments takes two more of Reddit's orders: sort=controversial and sort=qa (Q&A: the comments the post's author answered first). reddit.posts and reddit.profile_comments take sort=controversial, of all time or of Reddit's time filter that covers since, as sort=popular does.

    A caller who wants only the shown tree sends replies=shown: the post's comments with the replies Reddit shows under them, each comment's more_replies_count and url leading to the rest, at a fraction of the requests of the full tree.

  84. 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 and t5_… for a subreddit. This applies to id, post_id, parent_id, author.id, top_post_id, bottom_post_id and meta.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_z1c9z is z1c9z), or add it to what you stored. A comment, account or subreddit ID sent back as url gets an invalid_input that 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.

  85. Changed

    Reddit search post bodies and video types

    Reddit Search API

    GET /v1/reddit/search_posts takes include_body=true to return each post's body and mentions, with an exact type, read from Reddit's search feed (on newest, popular and most_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 in media) instead of link, and a type the results page can't confirm (a result without a preview, or a thumbs.redditmedia.com thumbnail) is listed in approximate_fields.

  86. Added

    TikTok effect

    TikTok Effect API

    GET /v1/tiktok/effect returns 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.

  87. Added

    Instagram engagement

    Instagram Engagement API

    GET /v1/instagram/engagement returns 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.profile and instagram.posts return. 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 is not_found, an age-restricted one private_or_unavailable.

  88. 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.

  89. Added

    TikTok engagement

    TikTok Engagement API

    GET /v1/tiktok/engagement returns 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.profile and tiktok.posts return. Figures computed from counts TikTok rounds are listed in approximate_fields. A private account comes back with its profile and posts unknown; an unknown account is not_found.