What's new in SocialCrawl
New platforms, endpoints, and product updates as they ship. The API now covers 69 platforms and 674 endpoints.
October 2026
- Improvement
search/everywherereturns only new rows withsincePass the time of your last poll as
sinceanditemskeeps only the rows published after it. Rows with no date are kept, anddata.sincecounts what was dropped. The call still costs 20 credits. - Improvement
prism/profile/commentscharges only for posts with new commentsWith
since, a post whose comments are all older now costs nothing. Before, one new comment billed the comment page of every post scanned.posts[].creditsshows what each post cost. - Improvement
Facebook replies name the comment they answer
Rows from
facebook/post/comment/repliesnow carrycomment.parent_id, as TikTok and YouTube replies do. A cut or expiredexpansion_tokenreturns an empty list, so an empty page now carriesstale_expansion_tokenin_warningswith the token's issue time and length. - New endpoints
See credits per API key with
/v1/credits/usageGET /v1/credits/usagereturns credits and requests per API key per UTC day, for up to 92 days. It's free to call, and keys are shown by name and prefix. - Improvement
TikTok covers and photo slides open in every browser
On
tiktok/profile/videos,tiktok/postandtiktok/search,content.thumbnail_urland the photo slides incontent.media_urlscame back as HEIC, which Chrome, Firefox and Edge can't display. They now return the JPEG TikTok publishes for each image, or WebP when there is no JPEG. Field names are unchanged. - Improvement
TikTok profiles can now return TikTok's website counts
TikTok's app and website keep separate follower, following, like and video counts, which can differ by a few per cent.
tiktok/profilereturns the app's counts by default. Addcounts=webto get the website's (statsV2) instead; it still costs 1 credit.author.ext.counts_sourceshows which set you received. - New feature
Drop AI-style posts from post lists with
label=ai_styleAdd
label=ai_style&exclude=ai_styleto a post list such astwitter/search/tweetsorlinkedin/search/posts, and posts with two or more AI-style writing patterns are dropped, with their ids indata.labels.dropped_ids. The patterns are ones you can check in the text, like "It's not X, it's Y" contrasts, "Here's what nobody tells you" openers, stock words, stacked em dashes and emoji bullet lists. Only the text is read, so a person who writes this way is dropped too. It adds 1 credit per 25 newly checked posts. - New feature
Discover runs on a schedule, sends events when a run finishes, and looks further on a finished run
POST /v1/prism/discovertakes ascheduleand runs the same request again every1h,6h,12h,1d,7dor30d. Each run delivers only rows earlier runs did not, andmax_credits_per_runandmax_credits_per_monthcap what it spends. Background runs now write events:discover.progresswhile they work, one ofdiscover.completed,discover.partial,discover.pausedordiscover.failedwhen they settle, anddiscover.new_rowswhen a scheduled run finds rows. Read them withGET /v1/events, or register a URL once withPOST /v1/webhook-endpointsand every run on the account posts its events there, signed.POST /v1/prism/discover/runs/{run_id}/morecontinues a completed run under the samerun_id: the next pages of its searches, or new searches steered by the rows you accept or reject, and it never fetches a row twice. A POST now holds up to 100 groups. - New endpoints
Discover: search many platforms in one call, judge every row, or get the accounts behind a topic
GET /v1/prism/discoversearches TikTok, Instagram, YouTube, Reddit, X, Threads, Facebook, LinkedIn, Telegram, news, the web and more for your keywords in one call. It keeps only posts inside your date window, judges every row against your keywords or acontextquestion and drops rows about something else, and removes duplicates across platforms. A small request answers in the call. A large one, orPOST /v1/prism/discoverwith a long keyword list, continues in the background and answers202with a run you follow atdata.next.status_urland download as JSONL.view=accountsreturns the accounts behind a topic instead: each one is looked up and judged for fit, role (seller, reseller, buyer, someone warning about sellers) and kind, with its country where the profile declares or hints it.view=communitiesreturns the subreddits, groups and channels where a topic lives, andview=itemsthe hashtags, sounds and names its posts share. A run can also read comments under the top posts, reviews from review sites, marketplace listings, places near a location, a brand's own posts and ads, and messages inside Telegram channels.dry_run=truelists every search and the estimate free,max_creditscaps what a run spends, and each search bills its own platform's page price. - New endpoints
Instagram creator country, the song behind a TikTok sound, and transcripts in the video's own language
New
GET /v1/instagram/profile/countryreturns the country a creator lists on Instagram, for 1 credit. Sendinclude=countryonsearch/reels,search/hashtagorlocation/postsand every row carries it. Each new creator costs 1 credit, a creator seen in the last 30 days is free, and a row we could not fill is refunded.instagram/search/reelsnow takesZA,NGandKEasregionorcountry, andinstagram/location/postsmoves later pages to a second source when the first fails. Every TikTok video row carriespost.ext.matched_song_idwith the song's title and artist, so different "original sound" uploads of one track group together, andtiktok/song/videosrows carry their region. YouTube, X andprism/profilesrows gain the author's country or location.youtube/video/transcriptreturns the video's own audio language where it used to return an auto-dub on some videos, and TikTok transcripts carrytranscript_format. YouTube trending takes category names, Google Play rows carryapp.rank, Google Trends rising queries carryis_breakout, and Pinterest search drops empty cards. Other prices are unchanged. - New endpoints
Hashtag and mention search on Instagram, TikTok, X and Facebook
Six new endpoints.
GET /v1/twitter/search/hashtagandGET /v1/facebook/search/hashtagjoin the Instagram and TikTok hashtag feeds.GET /v1/{instagram,tiktok,twitter,facebook}/search/mentions?handle=returns posts by other accounts that mention a handle. Every row is checked for the exact tag or mention, so#tractorleaves out#tractorlifeand posts that only say tractor, andmatch_kindsays how each row matched. Mention results leave out the account's own posts unless you sendinclude_self=true. On Instagram they combine the account's Tagged tab with reels that @mention it in the caption. Facebook pages are usually mentioned by name, sonamesets the name to look for. All six takesince,untilandcursor, anddata.legslists the searches each call ran. A call costs what those searches cost: 1 credit on X and on Facebook mentions, up to 2 on Facebook hashtags and TikTok mentions, and up to 6 on Instagram mentions.tiktok/search/hashtagandtiktok/hashtagalso gained a backup source that answers with the same fields and cursor when the main sources fail. - Improvement
search/everywhere runs X only when you ask for X alone, and twitter/ai-search keeps an answer for 30 minutes
In JSON mode,
GET /v1/search/everywherenow runs the X source only when it is the only source in the call. In a call that mixes X with other sources, X is listed insources_failedwith a reason that says how to get it: ask for X on its own, or use the streaming mode, which is unchanged. The X source almost never finished inside a mixed call's time limit, so its answer was already dropped in about 19 calls in 20. In the remaining call, a mixed search carried a short X summary, and it no longer does. The price is 20 credits, unchanged.GET /v1/twitter/ai-searchnow keeps an answer for 30 minutes instead of 2: the same query repeated inside 30 minutes returns the stored answer at 0 credits, and that answer can be up to 30 minutes old. A new query, or the same one after 30 minutes, runs fresh at 5 credits. Checked on production on 18/10/2026. - Improvement
Reddit links with non-Latin titles and LinkedIn profile URLs with emoji are accepted, and LinkedIn profile comments get a backup source
A Reddit permalink carries the post's title. When that title had an accent, a non-Latin script or a percent-encoded character,
reddit/post,reddit/post/commentsandreddit/post/comments/repliesrefused the link with a 400, between 11 and 274 times a day. Those links are now accepted, raw or percent-encoded. LinkedIn profile addresses with an emoji, a flag, a skin-tone sequence or a combining accent, such as/in/🥃jovi-o-9710599, were refused the same way on every profile endpoint and are now looked up like any other.linkedin/profile/commentsused to end in a refunded 503 on about one call in three when LinkedIn rate-limited the main source; page 1 now has a backup that returns the same comments in the same order at the same 5 credits, with a note indata._warnings. On a page from the backup, a video's duration and the post author's first and last name are null. Checked on production on 17/10 and 18/10/2026. Prices are unchanged. - Improvement
Facebook private pages answer fast and say why, Google Trends is quick again, Threads finds unspaced phrases, and web monitors record every check
A private or age-gated Facebook page now returns 404 with
error.details.reason: "account_private"at 0 credits, without trying a second source that cannot read it either, and a repeat is served from cache in well under a second.facebook/profile/reelsasks once more before it believes a "not found" for a page that is live.GET /v1/google_trends/exploreanswers in about 6 seconds again: the main source had changed its layout, every answer read as empty, and most calls fell through to a source that took 13 to 16 seconds.threads/searchnow finds posts for a Japanese, Chinese, Korean or Thai phrase written without spaces, and for a long query with no exact match, by searching the single words and keeping only posts that contain the phrase; you pay for the larger round, never both.instagram/location/postspages past its first page again. An emptytiktok/similaranswer is remembered for 15 minutes, so asking again is instant and free. On a 15-minute web monitor, about one check in four ran but was never recorded, so its result never reached you and was not billed. Every finished check is now recorded and billed at the documented rate, so a 15-minute monitor's daily spend rises by about a third to match the price page; earlier checks are not billed after the fact. Checked on production on 17/10 and 18/10/2026. - Improvement
Instagram: a further backup source on 22 endpoints, one consistent views figure, and exact stop_at_id matching
22 Instagram endpoints, from
profileandprofile/poststofollowers,stories,post/commentsandlocation/posts, gained one more independent source. It answers only when the existing sources fail, in the same response shape, so a call that used to end in a refunded 502 now returns the data, and nothing changes in your code. In the week to 18/10/2026 about three in fourhighlight/detailcalls came back as a refunded 404 for highlights that exist; since the deploy every call has returned the highlight, currently at 0 credits. Afollowersorfollowingpage served by the backup carriesdata.truncated: truewhen the walk may be incomplete. Every Instagram post row now also carriesext.instagram_viewsand, where a reel is cross-posted to Facebook,ext.facebook_views.engagement.viewskeeps each endpoint's established meaning (onprofile/reels,audio/reels,search/reelsandsearch/hashtagit can include the Facebook views), soext.instagram_viewsis the figure to compare one post across endpoints: on reelDYGo-RqBzLE, 3,008 combined against 2,313 on Instagram.stop_at_idon Instagram now matches a post by its shortcode whichever URL form you stored (/p/,/reel/,/reels/,/tv/or the bare code), so an incremental poll stops at the post you already have instead of walking and paying for the whole grid.GET /v1/instagram/postnow fillsmedia_urlswith the image on posts with a single image;thumbnail_urlis unchanged.GET /v1/instagram/basic-profilenow documents the lifetime post count as part of its answer, and the backup fills it too. Checked on production on 18/10/2026: all 22 endpoints answered 200, and every backup path was exercised end to end. - Improvement
TikTok Shop product lookups work again for live US products, accept shop.tiktok.com links, and can return full details
On the morning of 16/10/2026 the data source behind
GET /v1/tiktokshop/productmoved the product one level down in its response, so every live US product came back as a refunded 404RESOURCE_NOT_FOUND. The lane now reads the new layout, and a US lookup has a second source behind the first, so the next layout change is answered by the backup instead of becoming a 404. Product and store links from TikTok's desktop shop, such asshop.tiktok.com/us/pdp/<slug>/<id>andshop.tiktok.com/us/store/<name>/<id>, are now accepted ontiktokshop/productandtiktokshop/products; they used to be refused with a 400. The new layout no longer carries the description, brand, specifications or shipping block, so those are now an opt-in:include=detailsadds the description, brand, specifications, shipping (free shipping, fee and delivery estimate) and the official-shop labelshop_identityfor 3 more credits, 4 in all. A product id that does not exist is still a 404 at 0 credits. Checked on production on 16/10/2026: the documented Goli product returned 200 at 1 credit, andinclude=detailsreturned its description, brand and shipping for 4 credits. The plain lookup is still 1 credit. - Improvement
Reddit profile, posts and comments lookups get backup sources, and Prism composites now use them
On 16/10/2026
GET /v1/reddit/profiletimed out with a 504 on every call from 09:54 UTC, andreddit/profile/postsandreddit/profile/commentstimed out on their documented examples:reddit/profilehad one source, and the one backup the other two shared was slow all afternoon. Each of the three now has a backup on a different backend that answers with the same fields when the first source fails or runs slow, andreddit/profilenow waits at most 8 seconds before switching. One limit: aprofile/commentscall withbeforehas no backup, because the backup cannot filter by date. Prism composites that call another endpoint as one of their sources, such asreddit/post/commentsinsideprism/employer-brand, used to stop at that endpoint's first source. After a supplier error (a 429 or a 5xx) a source now moves on to the endpoint's backups within the same deadline; a 404 is still an answer and is not retried. Checked on production on 16/10/2026:reddit/profilereturned 200 for 1 credit, andprofile/postsandprofile/commentsreturned their examples. Prices are unchanged. - Improvement
Instagram user/embed returns the profile and an embed snippet, and an expired story is no longer billed
GET /v1/instagram/user/embedhad answered 404 for every account: all 86 calls in the 45 days before 16/10/2026. It now returns the account's id, username, display name, avatar, verified and private flags, follower count and post count, plusauthor.ext.embed_html(Instagram's own embed snippet for the profile) andauthor.ext.embed_url(the address of the embed frame). The whole embed page is not returned. Bio, following count and join date stay null because the embed page does not carry them. An account that does not allow embeds, a private account and a handle that does not exist all answer the same 404 at 0 credits, because the page does not say which one it is. Separately,GET /v1/instagram/story/downloadcharged 5 credits when a story id had expired or been deleted while the author still had live stories; that answer is now a 404 at 0 credits. Checked on production on 16/10/2026:user/embedfor the documented example,instagram, returned the profile at 1 credit. Prices are unchanged. - Improvement
LinkedIn company people and three profile sections answer through rate limits
In the week to 16/10/2026,
GET /v1/linkedin/company/peopleanswered 64 of 79 calls with a 503 saying LinkedIn was momentarily rate-limited, andprofile/volunteers,profile/certificationsandprofile/recommendationsfailed the same way. Each now has a backup source that answers with the same row fields when the first source is rate limited, anddata._warningssays when the backup answered. Oncompany/peoplethe backup serves the first page; a later page still answers 503 withRetry-After. Onprofile/recommendationsthe backup serves the first page of received recommendations, andtype=givenand later pages stay on the first source. Checked on production on 16/10/2026:company/peoplereturned 10 rows for 10 credits, and the three profile sections answered 200. Prices are unchanged. - Improvement
Pillar pages, Etsy listings, Klarna products and renamed GitHub repositories serve again
Four lanes that failed on valid inputs are fixed.
GET /v1/pillar/pagehad answered 404 for every page since 18/09/2026. It now reads the page from the same public record Pillar's own page loads, and returns the username, display name, bio, avatar and url, plus, for the first time, the page's visible links underauthor.ext.links(id,type,title,url,clicks,order). Etsy changed the layout of its listing data, soGET /v1/etsy/productanswered 404,etsy/product/similarreturned no rows andetsy/shop/productsreturned an empty list. All three read the new layout, andetsy/shop/productsnow returnsnext_cursorwhenlimitis below 36. Similar-product rows no longer carry a quantity, soproduct.ext.available_quantityis null there.GET /v1/klarna/producthad failed for every product since 18/09/2026. It now reads the product from Klarna's comparison data with its name, brand and review summary;product.descriptionis null, and adata._warningsline says so.GET /v1/github/repo/top-issuesanswered 502 for a repository that had been renamed, such asfacebook/react. It now follows the rename, a repository that does not exist is a 404, andtop_issuesonrepo/dossieris no longer null for a renamed repository. Checked on production on 16/10/2026: all four lanes served their documented examples. Prices are unchanged. - Improvement
Prism product reviews, review integrity and employer brand finish inside the time limit
GET /v1/prism/product-reviewsandGET /v1/prism/review-integritysent a country name such as "United States" to their Amazon sources, which take a marketplace code, so Amazon failed on every call and the composites often ended in a 502. A country name or code is now turned into the marketplace code, and a country with no Amazon marketplace skips Amazon with_warnings: ["country_not_supported:amazon"]instead of quietly using the US store. A source that ran past the deadline also used to throw away what had already been found; each source now races one deadline, a late source is listed inlegs[]as a 504, and the answer keeps everything that arrived in time.GET /v1/prism/employer-brandran past the 48-second limit on its documented example (a 504 at 54 seconds). Each surface now runs on its own and the analysis gets a fixed share of the time, so the example finished in about 37 seconds. Checked on production on 16/10/2026: product reviews returned 200 for 15 credits, review integrity 200 for 30 credits and employer brand 200 for 30 credits. Prices and refund rules are unchanged. - Improvement
TikTok Shop search flags prices that vary by shopper session and stops reading whole-euro prices as cents
Outside the US, TikTok Shop prices each shopper session separately, promotions included, so
GET /v1/tiktokshop/searchcan return a slightly differentprice.currentfor the same product on each call, andprice.originalappears only when that session was offered a promotion. US prices are the same on every call. Every search for a region other thanUSnow carries adata._warningsline startingsession_priced:, on fresh calls and cache hits, so an alert can match it and treat those prices as one session's view. Prices are always decimal amounts in the main unit ofprice.currency. A whole-euro price of 100 or more used to be read as cents, so 310.00 euros came back as 3.10 and a 3% discount as 99%. Each promoted row is now checked against the discount TikTok shows, and an original price that does not fit it is left out along withdiscount_percent. Malaysia, Japan, Thailand and Indonesia rows now nameMYR,JPY,THBandIDRwhereprice.currencywas null. Checked on production on 16/10/2026: Germany returned euros with thesession_pricedline for 1 credit, and the cached repeat kept the line at 0 credits. The price is still 1 credit a page. - Improvement
Cross-platform search takes an end date, and each platform searches inside your window
GET /v1/search/multinow acceptsuntilalongsidesince, so one call can ask for a calendar month.untilused to be dropped with a warning. Rows outside the window are removed on every platform, and a date without a time includes that whole day. Each platform is also sent a date filter of its own: X getssince:anduntil:in the query, Facebook and Threads getstart_dateandend_date, and TikTok, YouTube and Reddit get the narrowest of their own date ranges that still reachessince. A filter you set yourself, such asreddit.timeframe=month, is never replaced, and setting one is the way to get a dense month when the call runs well after the month ends. Calls that already sentsincenow get these filters too, so they can return different rows than before. The newdata.windowblock shows what each platform was sent and how many of its rows fell outside the window, and_warningssays when a platform's ranges are too coarse to reach your start date. Checked on production on 14/10/2026: a September window across five platforms returned no dated row outside September, for 4 credits. Prices are unchanged. - Improvement
TikTok search with a
limitof 30 or less now costs 1 credit, down from 10GET /v1/tiktok/searchwith anylimitused to switch to a bulk collection path that cost 10 credits forlimit=10and returned the same 30 rows as the plain 1-credit page, with no cursor. Alimitof 30 or less now returns the plain page cut tolimitrows, at 1 credit, and keepsnext_cursor. A_warningsline says the cursor continues after the whole 30-row page, so the rows that were cut are skipped. Alimitabove 30 still collects more rows in one call at its existing price (17 credits for 60, 32 for 120), andGET /v1/utility/estimatequotes the same numbers. Checked on production on 14/10/2026:limit=10returned 10 rows and a cursor for 1 credit. - Improvement
Brand mentions: the digest now reports the window you asked for
GET /v1/prism/brand-mentionswithinclude=digestwrote its summary sentence from the all-time totals, so a September request could say 29,790 mentions in the window when the window held 517. The digest now states the count and sentiment fordate_fromtodate_toand labels any all-time figure as all-time. If a written summary still presents an all-time number as the window's, or names a date outside the window, it is replaced with one built from the numbers, and_warningssaysdigest_rewritten. Two things are new in the response:computed.windowed_sentiment_breakdown, andrequested_fromandrequested_toundercomputed.trajectory.window. Checked on production on 14/10/2026: "Aruba luxury resort" for September read 520 mentions in the window and 29,800 all-time, for 50 credits. Prices are unchanged. - Improvement
Instagram: hashtag lookups share a cache across capitalisation, and keyword searches point to reels
GET /v1/instagram/search/hashtagnow treatsArubaandarubaas the same hashtag in the cache, so repeating it in different capitalisation while the cached result is fresh is a free cache hit. It used to be a new 5-credit call that returned nearly the same posts. The endpoint's description now says it costs a flat 5 credits a page and takes nolimitormax_items. For posts about a topic,GET /v1/utility/findnow ranksinstagram/search/reels(1 credit a page, with view counts) above the hashtag lane when the task names Instagram.GET /v1/instagram/searchmatches account, hashtag and place names, and its no-match404now says so and points toinstagram/search/reels?query=. Checked on production on 14/10/2026:Arubacost 5 credits, thenarubareturned the same 28 posts from the cache for 0. - Improvement
Wrong parameter names, field names and paths now get a correction
Four kinds of request that failed with little explanation now say what was probably meant.
GET /v1/google_news/search, whose search text iskeyword, now acceptsquerywhenkeywordis not sent, and a missing-term400names the parameter you did send, for example "You sentterm; this endpoint takeskeyword". A bareGET /v1/linkedin/search,/v1/facebook/searchor/v1/twitter/searchstill returns a free404, now withdetails.retry_withholding the post search URL with your own parameters, such as/v1/linkedin/search/posts?query=ai+agents. A search term that starts with a prompt label such asQuery:,Search:orKeywords:has the label removed before the search runs, with a_warningsline, and search operators such assubreddit:are left alone. Afields=path that matches nothing now suggests the real one, for examplepost.content.textforpost.captionandpost.engagement.likesforpost.likes_count, and when every path is unknown the warning points toGET /v1/utility/endpoint?url=for the endpoint's fields. Checked on production on 14/10/2026. All of these are free. - Improvement
Xiaohongshu: every image link downloads
On some responses, the image links in
post.content.media_urlsandpost.content.thumbnail_urlonGET /v1/xiaohongshu/post,searchandprofile/postsended?imageView2/2/format/png. Xiaohongshu's image servers cannot produce a PNG for a note image, so every such link returned 404. Those links now endformat/webp, the same image in a format the servers do produce. Avatar links are unchanged, and image downloads still need a browser User-Agent. Checked on production on 11/10/2026: a ten-image note, a ten-note search and five of a creator's notes all downloaded every image. Prices are unchanged at 5 credits a note. - Improvement
Amazon reviews return again, on every marketplace including the US
GET /v1/amazon/reviewscalls that came back as a refunded timeout or an empty404from 06/10/2026 now return the product's top reviews, usually 10 a call, at 5 credits. Each review carries the full text, star rating, reviewer, verified-purchase flag, helpful votes, publish date and the reviewer's country.review.idis Amazon's own review id, the same one as before, so reviews you stored still match. All 13 marketplaces incountrywork, and the date and country are read from each store's own wording: "Bewertet in Deutschland am 8. September 2026" on amazon.de reads as 2026-09-08 and DE.review.author.avatar_urlis now null. Mexico (MX) sometimes answers a refunded404for a listed product, and a retry usually returns the reviews. A product with no reviews, or an ASIN that does not exist, is refunded. - Improvement
Instagram, Facebook, X and TikTok transcripts now cover videos up to 10 minutes
GET /v1/instagram/media/transcript,GET /v1/facebook/post/transcript,GET /v1/twitter/tweet/transcriptandGET /v1/tiktok/post/transcriptwithuse_ai_as_fallback=truenow transcribe videos up to 10 minutes (600 seconds). A video over 2 minutes (30 seconds on TikTok's fallback) used to return a refunded 400, and it now returns the transcript at the endpoint's 10 credits. A longer video returns 400INVALID_REQUESTwitherror.details.reason: video_too_long,max_secondsand, when known,duration_seconds, at 0 credits. A final no-transcript answer such asvideo_too_long,no_speechorno_captionsis cached for an hour, so a repeat of the same URL comes back at once and still costs 0 credits. On Facebook,post_idis null on a video longer than 2 minutes. The activity log in the dashboard now shows the same reason and message as the API response. Facebook Ad Library transcripts keep their 2-minute limit, and YouTube transcripts are unchanged. - Improvement
TikTok similar accounts now returns accounts for many creators that used to come back empty
GET /v1/tiktok/similarcalls that used to return an empty list at 0 credits can now return accounts at 5 credits. The call still returns the accounts TikTok itself suggests first. When a creator has no such list, the call now looks for the TikTok lists already returned by this endpoint that include the creator. It returns the accounts whose list names the creator, then the other accounts on those lists, ranked by how many of those lists they appear on. These rows carryauthor.ext.similar_sourceset totiktok_graphandauthor.ext.similar_via, the account whose list named the creator, and this coverage grows as the endpoint is used. Any remaining places are filled from the accounts Instagram suggests for the same creator, matched to TikTok. That match now starts from the Instagram account linked or named in the creator's TikTok bio, and keeps accounts from 1,000 followers when their display name shares a word with the Instagram account. The price stays 5 credits a call, and an empty list costs 0 credits. - Improvement
YouTube lists now return each title as its creator wrote it, and channel lives returns only live streams
GET /v1/youtube/search,/search/hashtag,/channel/videos,/channel/shortsand/channel/livesnow return each video's title inpost.content.textas its creator wrote it. YouTube's listing pages show many non-English titles machine-translated into English, so a Korean search used to return most of its titles in English withcomputed.language: en. The free per-video lookup that already returns exact dates now also returns the original title, and onchannel/videosthe original description, andcomputed.languagefollows the title. A row whose title could not be checked carriespost.ext.title_maybe_translated: true, andexact_dates=falseskips the lookup and keeps the listing titles, each marked. The lookup now covers a full search page of up to 100 rows. Checked on production on 10/10/2026: a Korean search returned 42 of 42 original titles, and a Korean channel's videos and Shorts returned 30 of 30 and 48 of 48. Separately,channel/liveson a channel with no live streams returned the channel's Shorts labelled as live; it now returns an empty list at 0 credits. The price stays 1 credit a page. - Improvement
Instagram reel search now says on the response when country added the creator lookups
GET /v1/instagram/search/reelswithcountrykeeps only the reels whose creator is based in that market, and it reads the market from each creator's profile. That is the same lookup asinclude=creatorat the same price: 1 credit for the page plus 2 per creator looked up, up to 61 a page, and a creator seen in the last 15 minutes is free. Acountrycall sent withoutincludenow carriesdata.hydration.implied_by: "country", anddata.hydration.extra_creditsis the lookups' share ofcredits_used. The price line and thecountrydescription now lead with "up to 61".regionalone still localises a search for 1 credit a page. Checked on production on 10/10/2026: acountry=KRcall carriedimplied_byat 61 credits, and a plaininclude=creatorcall did not carry it. - Improvement
utility/find and utility/plan leave out search values no search should run on
GET /v1/utility/findandGET /v1/utility/planfill a search parameter such asqueryorkeywordsfrom the words of your request. They used to fill a placeholder (keywords: "medical keyword"from "for a medical keyword"), a market (query: "Korea"), an English phrase for Naver or Xiaohongshu, or most of the sentence. Such a value is now left out and listed undermissing, and underaskon a plan, with a note saying why. A Korean keyword on Naver, or a brand in Latin letters such asmiraDry, is kept. A request that lists several topics carriestopics, andplanruns each search step once per topic and prices the job for all of them. A request that names several markets carriesmarketsas ISO codes and isuncertain. The recipe catalogue gainskorea-community-research(KnowledgeiN, Naver Cafe and blog posts at 100 a page, twelve months of search interest and Korean-language YouTube videos), andkorea-consumer-pulsenow reads KnowledgeiN. Both endpoints stay free. - Improvement
web/extract now returns null for values the page does not state
GET /v1/web/extractnow checks every value against the page's own text before returning it. A placeholder such as "Not specified" or "/", a bare link path in a field that is not a link, or a value the page does not state comes back as null. The newdata.page.extraction_check.removedlists each nulled field with its old value and the reason,placeholderornot_on_page, and a value the page states in another language is kept. A value that could not be checked is returned as extracted and named inextraction_check.unverifiedand_warnings. The price stays 5 credits a page. - Improvement
Reddit post comments now say how many comments the response holds
/v1/reddit/post/commentsreturns a tree.items[]holds the top-level comments and each reply sits under its parent'scomment.replies[], soitems.lengthundercounts a thread. The newdata.comments_returnedcounts every comment in the response, replies included./v1/prism/commentson a Reddit link no longer returns blank rows for removed comments. - Improvement
web/scrape no longer charges for block pages, CAPTCHAs and sign-in walls
When a site answers
/v1/web/scrapewith its own error or block page (HTTP 400 or more), the page still comes back withpage.status_codeandpage.page_statesaying what it is, butcredits_usedis 0 anddata._warningssays what to try next. A CAPTCHA, a sign-in wall, a rate-limit notice or an empty app shell that our page check finds in the markdown, the default format, is free the same way. Desktop Naver cafe article links, which load the article in a frame that cannot be scraped, come back aspage_state.value: "empty_shell"at no charge.proxy=autoandproxy=enhancednow read the page live unless you setmax_age, and a cached copy of a failed page is fetched again instead of being served.proxy=auto,proxy=enhancedandpdf_parse=truehold 5 credits and settle to what the fetch used, so a page a plain request could read costs 1. - Improvement
Xiaohongshu: video links download as they are
The video link in
post.content.media_urlsonGET /v1/xiaohongshu/post,searchandprofile/postspointed at a Xiaohongshu server that refuses any download without a Referer header, so opening it in a browser tab, curl or a script returned 403. It now points at the same file on a Xiaohongshu server with no such check, and downloads with no extra headers. Image links are unchanged. Xiaohongshu's image servers refuse a download whose User-Agent does not start with Mozilla/5.0, so send a browser User-Agent when you fetch the images. Checked on production on 10/10/2026: a video note, a three-note video search and four of a creator's notes all downloaded with no Referer, and an image note returned all 18 images. Prices are unchanged at 5 credits a note. - Improvement
X: keyword search, replies and account posts page as deep as X goes, with a second source behind every busy read
GET /v1/twitter/search/tweetsused to stop after two pages, about 40 posts, on every query; it now keeps paging for as long as X has matching posts.GET /v1/twitter/tweet/repliesused to stop after two pages and now continues to the end of the thread.GET /v1/twitter/user/tweetsused to end early on busy accounts when the source sent a page with no posts on it; those pages are now skipped, so the walk carries on. When the main source fails, a second source now answers the first page of account posts and of replies, and carries an account-posts walk or a newest-first keyword search on from page 2 or later, starting below the last post you received. A rescued page is only sent when every post on it is older than that post, so nothing repeats. Until now each of those calls failed and was refunded. Searches ranked withsort=topkeep paging on the main source only, because their order is not by date. Measured on 09/10/2026:nikereturned 80 posts over 4 pages with more to fetch, where it stopped at 40; replies to one post returned 94 where they stopped at 61; a busy account returned 156 posts over 8 pages where it stopped at 38. The price per page is unchanged at 1 credit, so a loop that pages untilhas_moreis false now runs further and costs 1 credit for each extra page; sendsincewith a date to stop it where you need, ormax_pageson keyword search. - Improvement
Keyword volume says why a keyword has no number, and gives the last one Google published
Google stopped publishing search volume for many health terms in December 2023, such as "shingles" and 대상포진, and no source has a current figure for them. On
GET /v1/google/keyword-volumea row withsearch_volume: nullnow carriesnull_reason:withheldwhen Google withholds the keyword,no_datawhen Google holds no figure at all. A withheld row also carrieslast_reported, the last month Google published a volume ("shingles" in the US: 673,000 in November 2023), and itsmonthly_searchesis empty. Before, it listed twelve months of 0, which read as nobody searching. A call where no keyword has a current figure is still a free 404, and its message now lists the last published figures. For relative interest in a withheld term over time, useGET /v1/google_trends/explore, orGET /v1/naver/search-trendin Korea. The price is unchanged. - Improvement
Date windows now hold on YouTube lists and on searches whose own date filter leaks
On YouTube lists,
sinceanduntilnow judge each video by its exact publish date. Before, a video dated only by a label such as "4 months ago" was kept or dropped on that estimate, sopublish_time=yesterdayonGET /v1/youtube/search/hashtagcould return a video from January. OnGET /v1/facebook/search/posts,GET /v1/facebook/search/videos,GET /v1/threads/searchandGET /v1/youtube/search/advanced, a start or end date you send (start_date,published_afterand the like) is now also applied to every row, because the platform treats its own filter as a hint. Ad library dates are unchanged: they mean the period an ad ran. Prices are unchanged. - New feature
A date window on every list of comments, reviews and posts: since and until
Every list whose rows carry a date now takes
sinceanduntil: 150 lists of comments, replies, reviews, posts and news across every platform. Send a day asYYYY-MM-DDor a full timestamp; rows published beforesinceor afteruntilare left off each page, and a bareuntilday includes that whole day. On 23 lists that can be read newest first,sincesets that sort and ends the walk at your date withpagination.stopped_at: since, so you pay only for the pages you need: YouTube video comments, Instagram and TikTok post comments, LinkedIn post comments and company posts, Reddit subreddit, search and profile posts, X search, Trustpilot, TripAdvisor, Google Play and App Store reviews, Naver news and the eight creator feeds. Other lists, such as Facebook and Reddit post comments, filter each page and keep their cursor. Spellings copied from other endpoints are applied too:published_after,start_dateandfrom_dateact assince,published_before,end_dateandto_dateasuntil, andpublish_time=yesterdayormax_age_days=730become asincethat far back. A date on a list whose rows have no date, such as suggestions or profile lists, is a 400 that costs nothing, so it is never silently ignored. Page prices are unchanged. - Improvement
Language tags now cover Hindi, Bengali, Tamil, Telugu and six more Indian languages
computed.languageon posts, profiles and comments now covers 40 two-letter codes, up from 31. Hindi (hi), Bengali (bn), Tamil (ta), Telugu (te), Kannada (kn), Malayalam (ml), Gujarati (gu), Punjabi (pa), Odia (or) and Urdu (ur) are each tagged from their own script, at any length, so a short Tamil comment such as "எனக்கு பிடித்த பாடல்" readstawhere it used to read null. Marathi and Nepali share the Devanagari script with Hindi and are taggedhi. Hindi typed in Latin letters is still null. The field is filled on every call at no extra cost. - New platform
Economy data: household and travel spending, US federal spending and contracts, and what US companies import
A new
economyplatform with five endpoints.GET /v1/economy/consumer-spendreturns yearly household spending per country and category (food, housing, transport, restaurants_hotels, insurance_financial and the other COICOP divisions, plustotal) from Eurostat, in million euro, euro per person or share of total, through the latest year each country has published: Germany's household transport spending read EUR 307,393m for 2025. Norway, the United Kingdom, Iceland, Albania, North Macedonia and Kosovo come from Eurostat's older dataset, whichsource_notenames.GET /v1/economy/tourism-spendsplits residents' trip spending into transport, accommodation, restaurants and other categories, by personal or business purpose and by domestic or foreign trips.GET /v1/economy/government-spendadds up US federal spending by state, county or country for an industry code, product code or keyword, with per-capita figures, and defaults to the latest fiscal year that ended at least 90 days ago.GET /v1/economy/government-contractsreturns the awards behind it, purchase orders included, with the real match count indata.total; pages run to the 50,000th result, and a page past it is a free 400. Each of these four costs 1 credit, and a request with no published data costs 0.GET /v1/economy/imports?company=returns a US importer's customs record: its top overseas suppliers, main product headings, latest shipments and, inmatches, the other names it files under. It costs 20 credits and usually takes 8 to 14 seconds, accented names such as Estée Lauder are matched, and a company with no records is a 404 at 0 credits. - New endpoints
Company inventory and cost of goods sold, Google search volume by country, and TikTok Shop units sold per market
GET /v1/finance/fundamentals?keyword=TGTreturns revenue, cost of goods sold, gross profit, inventory, inventory change and accounts payable from SEC filings, newest first, quarterly by default or yearly withperiod=annual, up to 40 periods (limit1 to 40). Fiscal years and quarters follow each company's own calendar, 16-week quarters included, so retailers such as Kroger carry every quarter. Target's quarter to 01/08/2026 shows inventory of $13.249bn, up $932m, against $17.603bn of cost of goods sold. It costs 1 credit, and a ticker with no current US GAAP filings, such as a foreign filer reporting under IFRS, is a 404 at 0 credits.GET /v1/google/keyword-volume?keywords=lip gloss,lip oil&location=GBreturns monthly search volume, cost per click, competition and a 12-month trend for up to 20 keywords in one country, at a flat 16 credits: "lip gloss" reads 27,100 searches a month in the UK and 90,500 in the US.GET /v1/tiktokshop/sales?query=lip gloss®ions=US,GB,MYadds up TikTok Shop's first search page in each of up to 8 markets: listings, lifetime units sold, estimated sales in the market's currency and the top listings by units. Each market costs 1 credit, a repeat within 15 minutes costs 0, anddry_run=truequotes the most a call can cost. TikTok can return a different first page on a repeat call, so compare markets within one call; it is not a market total. - Improvement
Amazon search rows carry the monthly purchase count in every marketplace
GET /v1/amazon/product-searchnow carries Amazon's monthly purchase badge on each row that shows one:product.ext.bought_past_month_labelas Amazon wrote it, andproduct.ext.bought_past_monthas a whole number, the badge's lower bound. It is read in all 13 marketplaces the endpoint covers, each in its own wording: "2000+ Mal im letzten Monat gekauft" on amazon.de reads 2000, "過去1か月で1万点以上購入されました" on amazon.co.jp reads 10000 and "Mais de 4 mil compras no mês passado" on amazon.com.br reads 4000. A "New on Amazon" badge carries no count, so the number is null there, and pages called withdepthcarry the number without the label. Multiplied byprice.current, it gives monthly spend per product and marketplace. The price of the call is unchanged. - Improvement
Facebook ads that ran in the EU carry their reach by country, age band and gender
GET /v1/facebook/adlibrary/adnow returns, for an ad that ran in the EU,post.ext.ad.eu_total_reachandpost.ext.ad.eu_reach_breakdown: each EU country with its reach split into age bands from 18-24 to 65+ bymale,femaleandunknown.target_ages,target_genderandtarget_locationsshow who the advertiser targeted. These are the counts Facebook publishes under EU transparency rules, so an ad that never ran in the EU reads null. On 02/10/2026 a Courir ad showed an EU reach of 8,465,668, with 1,964,265 women and 1,118,198 men aged 25 to 34 in France. The call stays at 5 credits.include=audienceonGET /v1/facebook/adlibrary/company/adsadds the same breakdown to every ad on the page in one call, at 5 credits for the page plus 1 credit for each ad filled, so 35 at most. Ads with no EU data are not charged, and a page whose ads never ran in the EU costs 5 credits and 0 on a repeat within the cache window. The response carries ahydrationblock with the rows, lookups, credits and time. - Improvement
Cached multi-platform searches report 0 credits, and dry_run quotes their real maximum
A repeat of
GET /v1/search/multiorGET /v1/tiktokshop/salesserved from cache now reports what it cost:data.credits_chargedand each platform's or market'screditsread 0, eachrequest_idreads null, anddata.cached_pageistrue. Before, a cached repeat showed the charges and request ids of the call that filled the cache. The first call is unchanged.dry_run=1on both now quotesexpected_maxas each platform or market priced as its own call, sosearch/multiover three platforms quotes 3 andtiktokshop/salesover eight markets quotes 8;holdstays 0 because each leg bills itself. On anyinclude=join served from cache,data.hydration.credits_heldnow reads 0. The data in each response and the price of each call are unchanged. - New endpoints
TikTok similar accounts: lookalike creators for any handle, with counts and bio
GET /v1/tiktok/similar?handle=returns about 30 accounts similar to a TikTok creator, and the list is specific to that creator: a chef gets other chefs and food creators, a streamer gets other streamers. Each row carries the username, display name, avatar, profile URL, bio, verification, whether the account is private, and its follower, following, video and like counts, so no second lookup is needed to size a lookalike. 5 credits a call. An empty list is refunded, a handle TikTok does not know is a 404 at 0 credits, and a repeat within 15 minutes is 0 credits. When TikTok's own suggestions cannot be read, the list is built from the accounts Instagram suggests for the same creator, matched to their TikTok accounts and kept only when the TikTok account is verified or has at least 10,000 followers. Those rows carryauthor.ext.similar_sourceset toinstagramandauthor.ext.instagram_username.author.locationis null on this endpoint;GET /v1/tiktok/profilereturns the region for a single account. - Improvement
Reddit, Instagram, TikTok, X, Google and web calls answer from a second source when the first is rate limited
Several endpoints now answer from a second source when our first source is rate limited or down.
reddit/search/commentsandreddit/profile/postshave one for the first page in the default order, andGET /v1/reddit/postnow returns the post for a/r/{sub}/comments/{id}/link without the title in it, where it used to answer 404 for a post that exists.instagram/post/commentsandtiktok/profile/videoskeep paging from page 2 onward under a rate limit: an Instagram page that repeats comments already served, or a TikTok page with a post that is not older than the last post of the previous page, is refused and refunded, never sent.GET /v1/instagram/music/trendingreturns the 30-track chart again, at 5 credits. Every 200 carriesdata.fetched_at, when the chart was read from Instagram, anddata.stale, which isfalsefor a live chart andtruewhen Instagram did not return the chart on the call and the last good chart, at most 6 hours old, is served instead.search/everywherewith Instagram returns reels for multi-word queries.tiktokshop/productfor SG, MY, TH, VN and PH is served by a new source. The first page oftwitter/search/usershas a second source, andtwitter/search/tweetshands over to its second source on the first rate limit. Agoogle/business/infolookup bykeywordis answered by a new first source with the previous one behind it, still at 1 credit, and acidorplace_idlookup is unchanged. A keyword with a Polish postcode or Polish letters, sent withoutlocation_name, is searched in Poland instead of New York, and alocation_nameyou send always wins.google_news/searchanswers Tamil, Telugu, Malayalam, Marathi, Gujarati, Kannada, Punjabi and Urdu with India,google_play/app-infoandapp_store/app-inforeach their second source after a timeout on the first, andprism/reputationwith a business name now gets the Google place and its reviews.web/scrapetries a second scraper on a page the first refuses, and/v1/tavily/extracthas a second source: a rescued call answers in the same shape, and a call that fills nothing is refunded. A row from a second source can carry fewer fields. A rescued Reddit comment page leavesext.post_title,ext.post_url,ext.subreddit_subscribers,ext.post_score,ext.post_comment_count,ext.post_author,ext.post_published_at,ext.post_flair,ext.content_languageandauthor.avatar_urlnull, whileext.subredditstays filled. A rescued Reddit posts page leavesauthor.avatar_urlandext.content_languagenull, and a rescued Reddit page carries no next cursor. A Googlekeywordlookup leavesplace.ext.attributes,ext.people_also_searchandext.statusnull. The price of each call is unchanged. - Improvement
Clearer answers for an empty universal search, an unreadable page, a pasted handle and a subreddit sent as a user
GET /v1/search/everywherewith no results anywhere now returns200withitems: []at 0 credits, where it used to answer502 ZERO_RESULTS, and a search on one platform gets 25 seconds for that platform. When neither of our scrapers can read a page,GET /v1/web/scrapeanswers404 RESOURCE_NOT_FOUNDat 0 credits withdetails.reason: "site_not_supported"andretry_will_succeed: false, in place of a retryable502, and for a Facebook, Instagram, Reddit, TikTok, YouTube, X, LinkedIn or Threads link,details.suggestionnames our endpoint for it. Instagram and TikTok handles with paste noise are accepted oninstagram/profile,profile/postsand the other Instagram handle endpoints, and ontiktok/profileandprofile/videos: surrounding spaces, one trailing/,?lang=en, a leading@, or the profile URL itself (instagram.com/{handle},tiktok.com/@{handle}?lang=en). Invalid values such asN/Astay a free 400. A subreddit sent toreddit/profilegets a free 400 that names the right endpoint, for example "r/aircanada is a subreddit, not a user. Use /v1/reddit/subreddit/details?subreddit=aircanada for its details or /v1/reddit/subreddit?subreddit=aircanada for its posts." A Monitor whosehandleis a profile URL is accepted byPOST /v1/monitorsand runs, and a failed run'sskip_reasonnames the HTTP status and error code, for example "Run failed with HTTP 400 INVALID_REQUEST. ... not charged."instagram/search/popularanswers its 404 at 0 credits without a second lookup when Instagram has no popular page for the query.tiktokshop/productfor GB and ID answers at once with503 SERVICE_UNAVAILABLE,Retry-After: 3600and 0 credits, with a message naming the markets that are served, where it used to answer504. US is unchanged. - Improvement
LinkedIn profile posts above 50 are priced per post returned, and posts, stats and skills keep answering under rate limits
One price change on
GET /v1/linkedin/profile/posts: a call withlimitabove 50 is now metered at 2 credits per post returned. It holdslimitx 2 up front (200 at the maximumlimitof 100) and refunds down to the posts that came back, never below 5, so a member with 60 posts costs 120 credits whateverlimitwas. Before, every call cost 5 credits. A call with nolimit, or withlimitat 50 or below, stays at 5 credits, and the price is the same whichever source answered. When our main LinkedIn source is rate limited,profile/postsis now answered from a second source where it used to return 503, with the same posts, order, ids and counts.profile/statshas a second source too, at the same 5 credits, and so doesprofile/skills. A row served by the second source atlimit50 or below can lack a company author's follower count (post.ext.author_followers), and a video post on a call above 50 can lackcontent.duration_seconds. - New feature
Instagram reel search by market, with each creator's country, followers and contact in one call
GET /v1/instagram/search/reelstakes three new optional params, with the same names as TikTok search.region(ES, MX, DE, BR, KR or FR) localises the results: Instagram does not rank search by the caller's country, so the market's own name is added to your query (fitnessbecomesfitness españa), anddata.region.query_sentshows exactly what ran, at no extra cost.include=creatoradds each reel's creator card from the About this account panel:post.ext.author_country,author_followers,author_following,author_posts_count,author_public_emailandauthor_public_phone, at 2 credits per creator looked up. Two reels by one creator are one lookup, a creator that cannot be found is refunded, and one looked up in the last 15 minutes is free.countrykeeps only the reels whose creator declares that market, adds the creator card, and reports what it dropped indata.country; its lookups are charged whether a reel is kept or not. What took one call per creator now takes one call. Any other market code, or a typo in any of the three params, is a free 400. One billing change on this endpoint:max_pagesused to stop after the first page and charge one page. It now walks every page you ask for and charges each page walked, with each creator looked up once per walk. - Improvement
Monitors refuse params the endpoint would refuse, and an empty page is not charged
POST /v1/monitorsnow runs the same parameter checks as the endpoint it schedules, so a value that endpoint would answer with a 400 is refused when you create the monitor, for free, with the endpoint's own message. Before, the monitor was created with a monthly estimate and then failed on every run. A run whose page comes back with no results is no longer charged either: it is markedfailedwith askip_reason, refunded in full, and itstotalof 0 is not stored, because it describes the empty page and not what you are tracking. Checked on production on 01/10/2026: a handle the endpoint rejects returned a 400 with the balance unchanged, a plain handle was created, and an empty-page run was recorded as failed at 0 credits.
September 2026
- Improvement
Instagram sounds: full pages, a reel count, one id across re-uploads, and a trending flag
GET /v1/instagram/audio/reelsreturned one to three reels on many sounds, and the next page came back empty even when the first said there was more. A page now carries up to 12 reels andnext_cursorcontinues the list. The first page addsdata.total, the number of reels Instagram shows for the sound;data.is_trending, whether Instagram currently marks the sound as trending in Reels; anddata.sound, with the track title, artist, duration and Spotify track id, and for an original sound the account that made it, when it was made and the reel it was first used on. Every reel carriespost.ext.audio_cluster_id, the id Instagram uses to group different uploads of one sound, and passing a cluster id asaudio_idcounts every upload in that cluster together.GET /v1/instagram/profile/reelscarries the cluster id withinclude=stats. The price is unchanged at 1 credit a page, and an empty page is not charged. Checked on production on 30/09/2026: a licensed track returned 12 reels, a count of 427,714 and the cluster id on 12 of 12, the next page returned 12 different reels, and a cluster id returned a count of 1,733. - Improvement
Monitors catch a mistyped number on create, skip the charge on a run that records nothing, and a recipe records a sound's growth daily
Every path in
track.metricsonPOST /v1/monitorsis now checked against the numbers the saved request actually returns. A path that does not exist returns a free 400 with the closest real one, for example "Did you mean 'total'?", and a text or true/false field returns a 400 saying a monitor can only track numbers. Before, both were accepted and recorded nothing on every run. Prism requests, which have no fixed response shape, are still accepted, with a warning to check the numbers of the first run. A new recipe records how many reels use an Instagram sound once a day with one monitor onGET /v1/instagram/audio/reelstrackingtotal, with an alert when it grows, at 2 credits a day; it covers TikTok too, withGET /v1/tiktok/songandpost.engagement.views. A run on which none of the tracked numbers comes back is now not charged: it is markedfailedwith askip_reason, refunded in full, and never compared with the next run, so it cannot fire an alert. Each run'slegsnow says which source in the endpoint's chain answered, asrung(primaryorfallback) andrung_index. Checked on production on 30/09/2026:totlreturned a 400 with the suggestion,totalwas accepted with no warning, 24 runs of a sound-count monitor each recorded 1,733 at 2 credits, and a run that came back with no count was recorded as failed at 0 credits. - Improvement
YouTube channel emails without false errors, and first-time addresses in one call
GET /v1/youtube/channel/aboutfailed some calls that should have succeeded. A channel that publishes no business email could return a 502 on every retry; it now succeeds withauthor.ext.public_emailnull and is not charged. An address behind YouTube's View email address button that had not been read before takes a few minutes to retrieve, and the call gave up after about 45 seconds. The call now waits up to 5 minutes for it, so set your HTTP timeout to at least 300 seconds. If the address is still not ready, the call answers503 SERVICE_UNAVAILABLEwithRetry-After: 300and is not charged, and the same call made after that interval normally returns it. The price is unchanged: 25 credits when an address is returned, 0 otherwise. Checked on production on 28/09/2026: eight channels that had failed on every retry returned 200 at 0 credits, a first read answered at 253 seconds with the 503, and the retry returned the address. - Improvement
Home Depot: clearance labels, the right selected store, and real stock on search
GET /v1/home_depot/searchand/productnow return Home Depot's markdown label asproduct.ext.promotion, withlabel(such asClearanceorSpecial Buys),amount_offandpercent_off, andproduct.ext.price_notewhen the price is only shown in the cart. Withstore_id,is_selected_storenow marks one store per row, the store you asked for; the ship-to-home warehouse was flagged as well before. Search rows no longer all readOutOfStock: availability now follows the fulfilment stock.store_idchanges stock and pickup, not the price, which is Home Depot's online price at every store, and the docs now say so. Checked on production on 28/09/2026: one selected store per row at two stores (24 of 24 each), 23 of 24 rows in stock, and Clearance and Special Buys labels with their amounts. - Improvement
Instagram profile post counts are back, and exact at any size
author.posts_countonGET /v1/instagram/profileand/profile/fullcarries the account's lifetime post count again. It had been null for accounts with 12 or more posts, and wrong on some accounts below 12, because Instagram's web profile only counts the posts embedded in the page. The call now fills the count from a second source when the page count cannot be trusted, still for 1 credit. Checked on production on 27/09/2026: replaying 100 real handles, all 92 accounts that exist returned the exact count, and the 8 that do not returned 404 at 0 credits. - Improvement
Steadier X search, /v1/x/* paths, and multi-search that matches each platform
GET /v1/twitter/search/tweetshas a second source for the first page, so a failing primary no longer fails the call: 5xx on page 1 fell from about 27% to 2 of 31 in the first hour after release. Every/v1/x/*path now serves as/v1/twitter/*does, where it used to return a 404 with a suggestion.GET /v1/search/multinow runs each platform as that platform's own search call, so it returns exactly what the platform endpoint returns: Threads comes back with rows where it was reported empty, and each platform is billed once on its own request. A multi-wordreddit/searchquery that matches any of the words now gets a_warningsline with the quoted form, and YouTube Shorts rows inyoutube/searchcarry the channel and author name. Checked on production on 26/09/2026. - New endpoints
Find a capability, and see the parameters worth sending
GET /v1/utility/capabilitieslists the parameters that work across endpoints, each with what it does, what it costs and every endpoint that supports it, for 0 credits.param=labelreturns that one entry, with thelabel=presets split by family (comments, posts and reviews) and the free presets listed apart from the metered ones.GET /v1/utility/endpoints?search=now also matches parameter names, parameter descriptions and tags, sosearch=sentimentfinds the comment endpoints that takelabel=sentiment. Results come back in keyword order anddata.rankingsayskeyword.GET /v1/utility/endpointaddsparams.featured, up to three parameters worth sending with a one-line reason each, and its example request already sends them. None of them raises the price. Itsrelatedlist names the Prism composite that does the same job in one call, the batch variant, or the same data on another platform, each withwhy. Every endpoint page shows the same parameters under "Parameters worth sending", in Korean on Korean pages, and the per-platform llms files carry them too. On production on 25/09/2026, capabilities returned at 0 credits,param=labelreturned the three label families, andtiktok/post/commentsfeaturedlabel=purchase_intentandtrim=true. - Improvement
Warnings for dropped parameters, clearer rejections, and two new hints
An endpoint used to drop a query parameter it does not declare without a word. Each one now gets a line in
data._warningsthat names the parameter the endpoint does support, the freelabel=preset that does the job, or says there is no such parameter. For example,zzqxontiktok/profilereadszzqx was ignored: GET /v1/tiktok/profile has no such parameter.An alias we accept and apply, such asusernameforhandle, gets no line, and the request is never rewritten. A value outside a parameter's accepted set is a free 400 whoseerror.detailscarriesallowed_values, one validexample, anddid_you_meanfor a one-letter slip (label=spmasuggestsspam) or for a search term sent torelevance(it suggestsrelevant_to). From the 100th identical rejection with a specific reason on one API key in a UTC day,details.repeated_todaycarries the count and the message says to change the request. There are two newmeta.hintcodes.comment_labelsarrives after you open the comments on five or more posts from one search withoutlabel=, naming the labels every comment row already carries andprism/commentswith its price, andsearch_repeatarrives when you run page 1 of the same search on a later visit, pointing atseen=and the date filter. A hint shows at most once per pattern per key per day and never on an error, andX-SocialCrawl-Hints: offturns hints off. All of it was checked on production on 25/09/2026. - New feature
Common jobs in the docs, and docs search that finds endpoints
A new Common jobs page in the docs lists 13 jobs customers arrive with, such as watching a brand, vetting a creator, mining comments for buyers and transcribing a video. Each job lists its calls in order, a request to copy for each step, and the price of one run, computed from the same registry the API bills from. llms.txt lists the same jobs first under Common Agent Tasks. Docs search now covers endpoint pages and each job as well as the guides:
watch a brandlands on its job, andcreator cardon theprism/creator-cardendpoint page. Checked on production on 25/09/2026. - New endpoints
Bluesky keyword search
GET /v1/bluesky/searchsearches public Bluesky posts on a keyword for 1 credit and returns them in the same post shape as a user's post list.sortislatestortop, andsince,until,langandauthornarrow the search; a malformed date is a free 400. Each call asks for up to 100 posts. The lane is a single page: there is no cursor, and older posts come from calling again withuntilset to the oldestpublished_atyou received, so dedupe onpost.id. Unauthenticated search is throttled per IP, so a burst can return a 503 withRetry-Afterand the credit is refunded. Checked on production on 23/09/2026:query=espresso&sort=latestreturned 100 posts at 1 credit. - New feature
Numbers your calls already compute: sound adoption, format buckets, and switch receipts
GET /v1/tiktok/songlabels the use count it already returns:post.ext.use_countis the number of videos using the sound, withpost.ext.use_count_unitvideos.GET /v1/tiktok/song/videosaddsdata.adoption, the number of videos per day, the rows with no date, andreturningwhen an old sound's first page is mostly the last three days;use=1addsdata.adoption.uses, a split by lip-sync, tutorial, before-and-after or a greeting-card reveal.GET /v1/tiktok/profile/videosacceptsformat=stationeryand addsdata.format_buckets, a count per wedding, birthday, birth, sympathy and seasonal greeting plus the ungrouped share, with a by-day count when the page spans more than one day andwindow_too_shortwhen it does not.switch_from=onGET /v1/search/everywhere,GET /v1/reddit/search/commentsandGET /v1/twitter/search/tweetsaddsdata.switch_receipts: the link, the verbatim quote, the reason and where the person went, withheadlinenull rather than a percentage. Checked on production on 23/09/2026: the use count matchedengagement.viewswith the unitvideos, the histogram summed to the page,use=1added the split,format=stationeryreturned a wedding bucket and an ungrouped share, and all three searches returned receipts with no headline. - New feature
Describe a job and get the calls to make, from a free endpoint
GET /v1/utility/plan?query=turns a sentence into the calls for the job, in order. Each step carries the method, the path, the values your words filled, the ones still missing, the credit price, a curl and a run state ofready,after_approvalorblocked. Four jobs are planned: watching a brand, one creator, a topic search, and a search saved on a monitor; a question about one call returns that call plus the closest alternatives, and anything else returnsuncertainwith an empty step list rather than a guessed chain. The plan never runs a call and is never cached. A question that asks for follower history, an alert on every new post, or a date window the endpoint cannot express is named undercannot.queryis required and a missing one is a free 400. In the assistant the same object renders as a card, "Run this step" drafts the first ready call into the composer with the confirmation card still gating the spend, the suggested questions under an answer are written from paths on the plan, and a pasted failure is read as one of eight faults with a written reply for each. Checked on production on 23/09/2026:creator_profilefor TikToknikereturned two steps at 0 credits for the plan itself, and a video prompt returneduncertain: truewith no steps. - Improvement
Audience questions grouped by intent, and the creator's own email
GET /v1/prism/audience-questionsnow groups on every call, and the clustering no longer needs a generative call. Each cluster'slabeliswho,what,why,how,vsorother, each question'stextis verbatim as written, andmethodology_versionisaudience-questions-v3. The price stays 30 credits and there is no new parameter.contact_email=1oninstagram/profile,youtube/channelandyoutube/channel/aboutaddsauthor.ext.contact_emailwhen the bio lists two or more addresses, choosing the creator's own rather than the first address found;public_emailis unchanged, a call without the parameter is unchanged, and any value other than 1 is a free 400. It stays opt-in until a 40-bio check freezes the thresholds. Checked on production on 23/09/2026: the audience-questions call returned five intent clusters over 46 questions at 30 credits with no clustering warning, andcontact_email=1returned the leaf at 1 credit. - New feature
A monitor can keep the numbers you name, without a webhook
POST /v1/monitorsacceptstrack, a list of paths into the response your saved request returns. Each run stores those numbers per row and the change since the last run, and the page is delivered on a webhook when one is set.webhook_urlis now optional whentrackis set. Caps follow the highest credit pack of the account: Free 3, Starter 10, Growth 25, Pro 100, Enterprise 500. A monitor withouttrackis unchanged, and a create with neither a webhook nortrackis still a 400. Checked on production on 23/09/2026: a monitor created withtrackand no webhook returned 201 withrow_keypost.idandmax_rows100, read back the same track, and deleted 204 then 404. - Improvement
Tell a renamed YouTube channel from a removed one, and a quiet Instagram account from a dead one
GET /v1/youtube/channelon a missing handle returns 404account_goneat 0 credits, anderror.details.suggestionsays to call the same endpoint again withchannelIdset to theUC...id you already stored. A 200 on that call means the channel was renamed andauthor.usernameis the new handle; a second 404 means it is gone. A lookup already made bychannelIdgets the reason and no suggestion.GET /v1/instagram/profileaddsauthor.last_post_at, the newest post time already on the profile page, still 1 credit, and null when the account is private or there was no post list to read.GET /v1/prism/handle-auditcopies the profile leg's reason ontoplatforms.<platform>.evidence.profile.not_found_reasonasaccount_gone,account_privateorhandle_unresolved. There is noregion_blockedvalue. Checked on production on 23/09/2026: the storedchannelIdreturned 200 at 1 credit, a ghost handle was 404 at 0 credits,nasacarriedlast_post_at2026-09-22T15:52:05.000Z, and a private account returned the field null. - New endpoints
A country's music chart and Pinterest trends, with no keyword
GET /v1/apple_music/chartsreturns a country's Apple Music chart for 1 credit, cached for an hour.typeissongs(default),albums,music-videosorplaylists,limitis 1 to 100 (default 50), and the rank is onext.trend.rank.countryis an ISO code, and a country with no chart is a free 400.GET /v1/pinterest/trendsreturns one market's trend table for a flat 10 credits, cached for six hours.typeisgrowing(default),seasonal,top_monthlyortop_yearly,limitis 1 to 50 (default 25), andincludeandexcludetake up to 10 keywords each. 23 markets are published, Ireland reads GB and IE, Australia and New Zealand read AU and NZ, and any other country is a free 400. A filter that matches nothing is a free 404. Checked on production on 23/09/2026: German songs returned rank 1 at 1 credit, German growing trends returned rank 1 at 10 credits, and a bad country was a free 400 on both. - New feature
A free page that finds a creator's outlier videos
/tools/outlier-video-finderand its Korean page take an Instagram, TikTok or YouTube handle and list the recent posts at twice the creator's own median views or above, with up to three posts at half the median or below. Posts under 48 hours and pinned posts are left out, and fewer than eight comparable posts returns a not-enough result instead of a ratio. The visitor is not charged: a run costs 1 credit on the house key, or 2 when the first page holds fewer than eight comparable posts. The page reads the same creator baseline the post lists return, so its numbers matchcomputed.vs_creatoron those calls. Checked onhttps://www.socialcrawl.devon 23/09/2026: both pages returned 200 with that locale's title. A scored run was not submitted. - Improvement
Top Instagram comments and newest TikTok comments, across a few pages
GET /v1/instagram/post/commentsacceptsscan_pages=1..3. The call walks that many pages on the lane's own chain, drops repeated comment ids, and sorts the kept rows by likes or by date, returning all of them withdata.scan(pages_requested,pages_walked,pages_billed,comments_scanned,order,complete,stopped). A page that only repeats earlier comments is not billed.GET /v1/tiktok/post/commentsacceptssort=recent|topand the samescan_pages, so the page you already pay for can come back newest first instead of TikTok's relevance order; when a walk stops before the end of a thread, the response says the rows are the newest of what was read. A call with neither parameter is unchanged: 5 credits on Instagram, 1 on TikTok, and nodata.scan. Checked on production on 23/09/2026:scan_pages=2returned 16 Instagram comments, likes descending, at 10 credits;sort=recentalone returned 50 TikTok comments newest first at 1 credit;sort=recent&scan_pages=3returned 149 comments, newest 11/05/2026, at 3 credits. - Improvement
Post lists stop at the last post you hold, and a response names the call you missed
GET /v1/instagram/profile/postsand/reels,tiktok/profile/videos,youtube/channel/videosand/shorts,facebook/profile/posts,twitter/user/tweetsandthreads/user/postsacceptsince=<ISO date>andstop_at_id=<post id>. The walk stops at the first post older than the date, or at a post you already hold, andpagination.stopped_atsayssince,known_idorendso a sync loop knows why it stopped. Pinned posts sit outside date order and do not end the walk. Only the pages walked are billed, and the page price is unchanged. A date we cannot read is a free 400. Separately, when the calls on one key in a session complete a pattern, the response carriesmeta.hintwith the one call that would have done the job, for example three platform searches pointing atGET /v1/search/multi, or three profile lookups pointing atprism/creator-card. One hint per pattern per key per day, never on an error, andX-SocialCrawl-Hints: offsilences it. Checked on production on 23/09/2026: a plaininstagram/profile/posts?handle=nasaomitsstopped_at,stop_at_idended that walk atknown_idat the same page price, and a TikTok search, an Instagram reels search and a YouTube search for one query carriedsearch_multi. - Improvement
Search rows can be filtered server-side, and repeats can cost nothing
The searches that already return views and a date accept
min_views,max_age_days,sort_rows=viewsandmax_pages(1 to 5, default 1).countryandexclude_countryread the country already on the row and are on TikTok keyword and top search. The server walks up to the page cap, returns the rows that pass, and bills each page walked at that endpoint's usual price. Separately,seen=<id>drops rows this account already received under that id in the last 24 hours. The page price falls with the share of new rows: page credits times new rows, divided by rows on the page, rounded up, so a page of nothing but repeats is 0 credits and the refund appears as aseen_rowsledger row. Omit the parameters, or send onlymax_pages=1, and the call is unchanged. Checked on production on 23/09/2026: TikTok skincare withmin_views=500000&max_age_days=365&exclude_country=IN&max_pages=2fetched 57 rows and returned 12 at 2 credits; a Reddit page of 25 repeats returnedcredits_used0 and refunded 1; a YouTube page with 37 of 45 repeats stayed at 1 credit because the price rounds up;max_pages=9was a free 400. - New endpoints
Batches with posts, one async job for thousands of ids, and multi-platform search
POST /v1/prism/profileswithinclude: "posts"returns up to 25 profiles and adds the first page of each handle's post list, charged only for the posts that came back, and a platform that cannot return them says so per item.POST /v1/prism/jobstakes up to 5,000 handles or post URLs, holds the price up front, and answers with a job id;GET /v1/prism/jobs/{job_id}is free, the unused hold is refunded when the job finishes, and the sameIdempotency-Keywith the same body replays at 0 credits while a different body is a free 422.GET /v1/search/multireturns each platform's own search rows under the unified envelope, in the order you asked, duplicate URLs removed, each platform's filters passed through. It is charged per platform page: 1 credit on TikTok, Instagram, YouTube, Reddit, Threads, X and Facebook, and 5 on LinkedIn, only for platforms that returned rows.search/everywhereis unchanged at 20 credits and stays the product that adds transcripts, clustering and judgments. Checked on production on 23/09/2026:include=postsreturned TikTok and Instagram posts, one TikTok profile job held 1 and charged 1, andmatcha latteon TikTok, Reddit and YouTube charged for the three platforms that returned rows. - Improvement
YouTube publish times are exact on a plain call
youtube/search,youtube/search/hashtag,youtube/channel/videosandyoutube/channel/livesreturn the exact publish second on a plain call, at no extra credit. A row whose date came from a relative label such as "4 months ago" is looked up for the second, andexact_dates=falsekeeps the old estimate, marked bypost.ext.published_precision. Checked on production on 23/09/2026: a plain search returned 0 of 14 estimated and the repeat came from cache at 0 credits,exact_dates=falsekept 14 of 14 estimates, and a channel's live tab returned 30 of 30 exact. - Improvement
Devtool pulse dossiers the tool's own repository
GET /v1/prism/devtool-pulsewithoutrepo=used to filldossierfrom the first GitHub repository whose name contained your query, or whose name your query contained. "React Native" could come back asreact/react, and "SvelteKit" as a forms library. It now reads the top five and fillsdossieronly from the repository where the tool itself is developed. When none of them is that repository,dossieris empty and the Hacker News, Reddit and blog parts still return. Passingrepo=still skips the search. The call is still 20 credits. Checked on production on 23/09/2026: "React Native" returnedreact/react-nativeat 20 credits, and "SvelteKit" returned an empty dossier at 20 credits. - New platform
Product Hunt launches and Xiaohongshu notes
GET /v1/producthunt/launchesreturns the public launch list, about 50 products, at 1 credit. Passtopicas a slug such asartificial-intelligence. A topic we do not recognise returns no launches, names the slug indata._warnings, and costs nothing. Votes, rank, comments and the product website are null, and there is no next page.GET /v1/xiaohongshu/search,trending,post,profile,profile/postsandpost/commentsread Xiaohongshu on the same key and the same post shape. Search rows and a creator's notes carry a short summary, withpost.ext.text_truncatedtrue. The note call returns the body and sets that flag false. Each returned row costs 5 credits. A missing note is a 404 at 0 credits, and view counts are null. Checked on production on 23/09/2026:artificial-intelligencereturned 50 launches at 1 credit, and a one-note search returned a truncated summary at 5 credits. - New endpoints
Find public Facebook groups, and see who mentioned a handle
GET /v1/facebook/search/groupsfinds public groups for a keyword. Each row is one group, andauthor.ext.search_hit.matchsays whether the hit was the group page or a post inside it. The group URL is the onefacebook/groupandfacebook/group/postsalready take. A page is 1 credit.include=detailsfills the member count and privacy on that same call, 1 extra credit for each group that comes back filled.GET /v1/prism/mentionsreturns the first page of posts and comments that actually contain the handle or the link. Passhandleorurl. The default pages are X and both Reddit searches, and a page is charged only when it keeps a row. Instagram tags and a web search are opt-in. Instagram and TikTok comments on posts you do not already know are not covered. Facebook, Threads and TikTok search are named innot_coveredand are not called. Checked on production on 23/09/2026:vintage carsreturned 10 groups at 1 credit, and with details filled members and privacy on all 10 at 11 credits.handle=nasaon X kept 19 mentions at 1 credit. - Improvement
Ask a transcript where the video answers, and a join copies a profile only when it is the same account
GET /v1/youtube/video/transcriptandGET /v1/tiktok/post/transcripttakeq, a question of up to 300 characters. The response addsdata.moments: each entry haskindanswers_query, a start and end taken from the captions, and one line copied from the transcript. A stretch that only shares the topic is left out. A question the video never answers returns an empty list. An empty question, a question over 300 characters, orqsent together withmomentsis rejected before the transcript is fetched and costs nothing. The question adds no credits. On TikTok the transcript is one caption file, andmomentsnow reads those cue times, so the brand, sponsor-read, demo and call-to-action windows attach on that lane again. The same calls were checked on production on 23/09/2026. YouTube returned 6 answering stretches at 3 credits, and the cached repeat was 0 credits. TikTok returned the pizza score at 78.2 seconds, quoting "7 3. It's not bad at all,", at 10 credits. Separately, a handle-keyed join compares the row's handle with the profile it looked up, ignoring@, case and URL encoding. A match copies the profile and makes no further check. A different handle is copied only when it is still the same account. Otherwise the row keeps its own values, that row is not charged, anddata._warningsnames both handles asresolved_to_different_handle. This coversinclude=profileon TikTok and Threads user search and on Instagram similar accounts,include=abouton Instagram profile search, andinclude=channelon a YouTube channel's videos, Shorts and lives when you pass the channel by handle. The join price is unchanged. A Threads user search of 5 rows filled all 5 at 6 credits. - New endpoints
A country trend board, with no keyword to start from
GET /v1/prism/trend-board?country_code=DEreturns what is rising in that country on this call: TikTok posts at least 3 times that author's usual views, the sounds used most on the local feed, TikTok's hashtag board, and Google Trends Trending Now.periodis 7 or 30.limitis 1 to 10 per section. A country Google Trends does not cover is a 400 and costs nothing. The board is computed for the call. Nothing is kept between calls, and a repeat within 15 minutes comes from cache. 30 credits. That price is still provisional. Checked on production on 23/09/2026 for Germany withlimit=3: 2 breakout posts, 3 sounds, 3 hashtags and 3 searches, every source answered, 30 credits, not from cache. - Improvement
A search past its last page says so, and endpoint guides show how often each field is filled
GET /v1/instagram/search/reelswithdate_postedset stops at page 11. Page 12 is a 400 witherror.details.reasonofpage_limit, the last page, the page you asked for, and the parameters that reach a different set of reels. Credits are refunded, anderror.retryableis false. A 402 for a low balance now says that sending the same request again will not succeed until the balance changes, andthreads/searchsays when the quoted credits are a ceiling you can lower with a smallerlimitorexpand=false.GET /v1/utility/endpointaddsquality: the share of rows that carried each field over the sampled window, with fields that are null on purpose listed apart. The first window is one day, 23/09/2026. Both were checked on production the same day. The page-limit call cost 0 credits. The TikTok profile guide reported 13 measured fields, also at 0 credits. - Improvement
YouTube contact emails now come back with the channel biography and links
GET /v1/youtube/channel/aboutreturns the address behind the About tab's View email address control asauthor.ext.public_email, and the same response keeps the biography, avatar, country and profile links. A channel whose only address sits behind that control used to come back in one of two shapes: the profile withpublic_emailnull at 0 credits, or the address with an empty biography at 25 credits. Both now arrive together. You are still charged 25 credits only when an address is returned, and 0 when the channel publishes none. A channel that does not exist is still a 404 at 0 credits. Checked on production on 22/09/2026 for@bikewithoutborders: the address, the biography and 7 profile links, 25 credits, not from cache. - Improvement
A LinkedIn member's entire profile in one call, and no charge for a member who does not exist
GET /v1/linkedin/profile/allreturns a member's whole public profile in one call for 5 credits.authoris the same object/v1/linkedin/profilereturns, with the follower and connection counts filled, plusverifiedand the date the account was created.backgroundcarries the About text, work history, education, skills with endorsement counts, the recommendations the member has received, Featured, certifications, honours, languages, projects, publications, volunteering, courses, patents, organisations, causes, top skills, the current role and the top education.background.interestsarrives split into Top Voices, companies, groups, schools and newsletters, andsimilar_profilescarries the People-also-viewed rail, up to 20 members. Those six were separate 5-credit calls. Three things to read before you parse it.section_totalsgives LinkedIn's own count for each section and it can be higher than the array beside it, because long sections are cut short at the source, so count withsection_totals.author.ext.followers_approximateis true when the follower count came back rounded;/v1/linkedin/profilereturns the exact integer.background.skills[].endorsements_is_flooris true when LinkedIn published a 99+ style label, so the number is a minimum.background.given_recommendationsis not on this call;/v1/linkedin/profile/completestill carries those. Separately, a member who does not exist is now a 404 for 0 credits on/v1/linkedin/profile,/profile/experiences,/profile/educationsand/profile/all. Those calls used to answer 200 and charge 5 credits, and the two section calls returned an empty list that read like a member with nothing to list. The same endpoint also takesurls, up to 10 full profile URLs in one call, and returns{items, total}. It bills 5 credits for every profile RETURNED, so a list that repeats a member is charged once for them and a profile that does not resolve is not charged at all. A list where nothing resolves is a 404 for 0 credits. - Improvement
Collect up to 200 LinkedIn posts for a keyword in one call, and a member's whole background in another
GET /v1/linkedin/search/posts?query=lead gen&limit=200returns up to 200 posts in one call, with duplicates removed, ordered by relevance. It costs 1 credit for every 5 posts returned, so 200 posts is 40 credits, and a keyword with fewer posts settles at what came back. Repeating the identical call inside the next 2 minutes is served from cache and costs nothing. The call reads the pages for you and keeps going when one source is unavailable, so a run no longer stops at the first gap. Withoutlimitthe endpoint is unchanged: 10 posts, 5 credits, the same cursor.limitcannot be combined withpageorcursor, and anything outside 1 to 200 is refused before billing. Separately,GET /v1/linkedin/profile/completenow returns the member as the sameauthorobject/v1/linkedin/profilereturns, plusbackgroundwith the About summary, work history with employers and dates, education, skills, and recommendations received and given, each in the shape of its own/v1/linkedin/profile/*endpoint.GET /v1/linkedin/profile/with-postsadds follower and connection counts and the member's recent posts in the/v1/linkedin/profile/postsshape. Both are 10 credits, in place of five separate calls. - Improvement
Preview what a labelled call will cost, and ask for the sentence behind each label
Four controls on the labelled and relevance lanes from yesterday's release, plus a friendlier wrong path.
dry_run=1returns the credit range and fetches nothing:data.estimatereports the rows the page can hold, how many of them are already labelled and free, the extra label credits as a minimum and a maximum, and the page's own price. The call itself costs 0 credits.label_evidence=1, used withlabel=, puts the sentence that earned each label on the row, copied from the text, and it does not change the label or add a credit.label=qualityon the post lanes scores how much checkable detail a post carries, whether it is fishing for likes, whether it is written to provoke, whether it only repeats someone else's news, and what the post is mainly doing;exclude=engagement_baitdrops the bait and lists the ids.label=injectionflags text that tries to instruct an AI agent, and never drops or rewrites the row. Both are metered like the other opt-in labels, at 1 credit per 25 newly judged rows.fit=goalwithgoal=keeps the rows and fields your goal needs, plus the ones the judge is unsure about and the first and last block, stubs the rest, and lists the held ids indata.held_back. Omit the parameter and the page is exactly the page you already parse. Finally, a wrong path now names the endpoint that answers it:GET /v1/instagram/postsstill 404s for nothing, and now suggests/v1/instagram/profile/posts. - Improvement
Your existing list and search calls now return labels, relevance and stance, free
Your existing calls now return more, at the same price and with no new parameter. The ten comment endpoints return sentiment, question, purchase intent and complaint on every comment as scores on
items[].computed.labels. Eleven post endpoints and the TikTok, YouTube, Threads and LinkedIn keyword searches return sponsored, intent and niche on every post. The 22 review endpoints return sentiment read from the text, the main issue, and a flag when the words contradict the stars. Nine keyword searches return a relevance score on every row against your query.search/everywherereturns each post's stance, counted indata.stance_splitwith the ids behind every count, and its relevance;search/forumsscores each thread's relevance;search/newsgroups the articles about the same event intodata.stories;search/creatorssays whether each account is a person, a brand, a media outlet or a fan page. Existing fields, rows and order are unchanged and nothing is dropped.data.labelsanddata.relevancereport what ran, and a row not judged in time isnulland filled on your next call. Credits are unchanged, andjudgments=off(orlabel=none) returns the old response exactly. The options that need your own input stay metered at 1 credit per 25 newly judged rows:label=mention&brand=,offer=,label=reports&reports=,relevant_to=, and the spam, toxic and low quality comment labels.relevance=filteragainst your own query is free, andbrief=on creator search adds 2 credits. New:GET /v1/prism/comment-leadsfinds buyers in the comments of the TikTok posts worth opening, andGET /v1/prism/adverse-screenflags the posts on a person's own public profiles that need a human review, from 25 credits. Corrections:prism/review-integrity,product-reviews,reputation,app-reviewsandapps-lookupnow pick the listing that matches your query from the top five results instead of the first one, and a source with no match is left out and named in_warnings.prism/audience-questionsnow counts questions written without a question mark, Korean ones included, so its counts change. - Improvement
Prism composites now read each row before they count it
Eleven Prism composites now judge each row before counting it, and every field you already read is still returned. Prices are unchanged.
prism/leadsranks real buyers first, drops posts about a different product that shares your name, lists their ids, and acceptsoffer=to describe what you sell; on two competitors we had not tuned it on, the top 20 went from 0 of 5 real buyers to 5 of 5.prism/ai-visibilityreports how often each brand is recommended, how favourably it is described, and how often it is the first pick, next to the appearance share.prism/brand-mentionslabels each mention for whether it is about your brand, its sentiment and aspect, and whether the author used the product.prism/share-of-voicepublishes the share without the mentions that only share the name, next to the original figure; a search for Notion counted 246.5M engagement including songs and a DJ, and the product alone is 35.6M.prism/creator-cardwithverify=truesays whether each account found is the same creator and shows the evidence behind it.prism/creator-vetadds a brand-safety check, the share of generic comments, news coverage, and a count of negative news.prism/app-reviews,prism/product-reviewsandprism/reputationfile each review into a theme and count the themes exactly, up to 600 reviews instead of 120.prism/handle-auditwithrelevant_to=adds how much of an account is about your topic, next to the existing score.prism/voiceandprism/devtool-pulsepublish the tone mix behind their label,prism/answersscores how far the engines agree on each question and explains only the pairs that disagree, andprism/employer-brandbreaks its score down by category. - New feature
Cohorts can match posts by topic, not only by keyword
POST /v1/cohorts/{cohortId}/queriesnow takestopicsandmatch.topicsis one to ten topics, each with an id you choose and a sentence describing it in your own words.matchiskeywords(the default),topicsto keep only the keyword matches that are genuinely about one of your topics, orboth. Every result gainsmatched_topicswith the ids that matched and amention_type. A keyword-only query behaves exactly as it did before. On our test set, posts matched by keyword alone were on topic 30% of the time and topic matching took that to 93% without missing an on-topic post, and one feed that matched a single post by keyword matched five by topic, including posts about the iPhone that never write the wordapple. - New endpoints
LinkedIn gains company-by-domain, company search, Pulse articles, hiring teams and more member lookups
Companies:
GET /v1/linkedin/company/by-domain?domain=microsoft.comreturns the same record/v1/linkedin/companyreturns, with the numericauthor.idthe other company calls take;/v1/linkedin/search/companiessearches company pages with size, industry, location and has-jobs filters;company/also-viewedandcompany/employees-countround it out. People and jobs:profile/similar,profile/activity,profile/interests/schools,/newslettersand/top-voices,profile/position-skills,profile/top-position,search/people/by-url, andjob/hiring-teamfor the people on a posting (many postings publish none, which is an empty list). Pulse:profile/articles,articlewith the author, date, engagement and full text, plusarticle/commentsandarticle/reactions.post/with-commentspacks a post with its comments.profile/aboutaddsis_verifiedwhen LinkedIn shows it. Most of these are 5 credits; company search, people search by URL and the packed profile calls are 10. A domain LinkedIn cannot resolve answers 502 and is refunded. Post, comment and reaction lists also gained a second source on page 1, so fewer calls fail. - Improvement
TikTok video search returns the country on every row, and up to 120 videos in one call
GET /v1/tiktok/searchand/v1/tiktok/search/topnow carrypost.ext.regionon each video, the ISO 3166-1 alpha-2 country the video is registered to, on the same 1-credit page of about 30 that pages withcursor. Filter that field to keep one country; theregionquery parameter still only sets where the search runs from and does not filter. The creator is on every row aspost.author.usernameandpost.ext.author_followers, so a filtered page gives a creator list for that country. For a bigger batch in one call, addlimitfrom 30 to 120: it rounds up to 30, 60, 90 or 120 and costs 10, 17, 25 or 32 credits, with slots the source does not fill refunded. Repeated videos are removed, so a 120 page can hold a little under 120 unique videos. Omitlimitand the call is the 1-credit page as before. This is notcountry=on/v1/tiktok/search/users, which returns only creators whose account region matches. - Improvement
Instagram profile search can fill account country, join month, and public contact
GET /v1/instagram/search/profiles?include=aboutstill starts from the same keyword page, then fillsauthor.ext.country, the month the account joined, and the public email and phone the account publishes, when Instagram shows them. 2 extra credits per creator that comes back filled; unused slots are refunded. Default the top 8 (17 credits held).limit=12buys the page. Omitincludeand the call is the same 1-credit page as before. This is not a country filter: a query that does not surface Korean accounts will not start returning Korean accounts after the join. For posts tagged at a place, use/v1/instagram/search/locationthen/v1/instagram/location/posts. An unrecognisedincludevalue is a 400 and is not billed. - Improvement
Facebook people search can stay inside a city
GET /v1/facebook/search/people?location_uid=scopes the people tab to a Facebook location id, the same way/v1/facebook/search/pagesalready does. About 7 people a page, 1 credit. Forwardpagination.next_cursorascursor. Omitlocation_uidand the unscoped page is unchanged. The id is Facebook's own location id, not a country code and not a place name. There is no/v1/facebook/search/locationsresource. - Improvement
Creator search can add YouTube, X, and Facebook people when you ask
GET /v1/search/creatorsis still TikTok, Threads and Instagram fused and ranked the same way, still 10 credits, when you omitsources. Passsources=youtube,twitterorfacebook(or a CSV of any of the six:tiktok,threads,instagram,youtube,twitter,facebook) to include those profile searches. YouTube is channel search. Facebook people search is the people tab; city scope stays on/v1/facebook/search/people?location_uid=, it is not acountry=on this fused call. A source we do not accept is a 400 and is not billed. Coverage refund is unchanged: if fewer than half the requested sources return a usable page, half the 10 credits come back. - Improvement
TikTok user search can filter by the creator's country
GET /v1/tiktok/search/usersnow acceptscountryas an ISO 3166-1 alpha-2 code such as KR, US or DE. The response is creators whose public account region is that country, with handle, name, avatar, profile URL, verification, counts, bio andauthor.locationalready on the row. Default 8 results, at most 20 withlimit. 5 credits per creator returned; unused slots are refunded. A code we do not accept is a 400 and is not billed. Omitcountryand the global 1-credit page is unchanged. - Improvement
TikTok Shop review photos stay on the review, and EU search prices come back as they appear on the shop
GET /v1/tiktokshop/product/reviewswas dropping review photos even when they were visible on the shop. A photo URL that arrives as a string now stays inreview.images. A review with no photo still returns an empty array, which matches the shop.GET /v1/tiktokshop/searchprices in Italy and other EU regions were reading decimal and thousands separators the wrong way, so 49999, 1.299 and 1.44999 appeared instead of 499.99, 1299 and 1449.99 euros. Those values now come back in the region's currency as they appear on the shop. The same price reading applies to storefront products and creator showcase. Credit cost is unchanged. - Improvement
Instagram reels: every count on one page with include=stats, the sound behind each video, media type and slide count, the remix count, and a feed that skips pinned posts and stops at a date
GET /v1/instagram/profile/reels?include=statsreturns the full stat line for every reel on the page in one call, at 2 credits a page: views, likes, comments, shares, saves, reposts, the remix count, and the exact audio id atpost.ext.music_idwith the track title and artist for original sounds and licensed music alike. That id is the oneGET /v1/instagram/audio/reelstakes, so every sound expands into the other reels using it. Page through with the cursors that walk returns; a cursor from a plain walk is rejected before anything is charged.include=audioonprofile/postsandprofile/reelsfills the sound on every video row on a page at 1 credit per video filled, with photos and carousels adding nothing. Every post row onprofile/posts,profile/reelsandpost/statsnow carriespost.ext.media_typeasimage,videoorcarousel, a carousel itspost.ext.carousel_count, and a reel itspost.ext.remix_count.exclude_pinned=trueleaves pinned posts out of aprofile/postsorprofile/reelspage, andrecent_days=Nkeeps only posts from the last N days and ends the pagination by itself once a page reaches older posts, at the same price a page.post/statson a reel now returns the save and repost counts whenever Instagram's response includes them, andinclude=savesstays the reliable route, settling to 5 credits when the count was already there; photos and carousels carry no save or share count on any source, so those fields stay empty there and are never looked up. - New endpoints
Instagram on-screen text: read the text on a photo, on each slide of a carousel, or on a reel's cover frame
GET /v1/instagram/media/screen-text?url=takes a post link and returns the text written on it, the Instagram counterpart of the TikTok screen-text endpoint. A photo returns its text; a carousel returns each of its first 10 slides in order, each with its own text underimagesand all of them together undertexts, with a warning naming the full slide count when there are more; a reel returns the text on its cover frame, and text that appears only later in the video is not read. Every call is 5 credits. A post that does not exist is a 404 and refunded, a post whose images all fail to read is refunded, and a post with no text on it returns empty lists. - Improvement
Instagram posts in the post-stats batch now cost 2 credits each, accept the links profile/posts returns, carry reposts and saves, and refund a link that cannot be read
POST /v1/prism/post-statstakes up to 100 post URLs in one call and returns views, likes, comments, shares, saves and reposts for each. An Instagram post is now 2 credits, down from 5; the singleGET /v1/instagram/post/statsstays at 5. The batch accepts the post linksprofile/postsreturns, handle and all, where before only the bare/p/form worked and one such link failed the whole batch. A link to a post that does not exist comes backnot_foundat 0 credits and is refunded, where before it was billed with an all-null block.repostsjoins the engagement fields on every row, and reels carry the save count. - Improvement
Instagram follower lists reach the end of the list, post likers go about ten times deeper, and account details lose their monthly ceiling
A plain walk of
followersorfollowingused to end at about two thirds of the profile's count. It now reaches the end of the list on most accounts, and a page carries 46 to 74 accounts instead of about 47, at the same 5 credits: that is 0.068 to 0.102 credits an account, down from 0.106.coverage=fullis still quoted at 10 credits a page and is now settled back down to 5 on any page a single read covered in full, so the mode costs its full price only on the large verified accounts where Instagram caps every route at about 50 accounts.post/likersreturns about a thousand rows instead of roughly a hundred for the same 5 credits, and every row now carries the account's real display name, as does the creator onstoriesand the author onpost/statsandtagged.profile/abouthas no monthly ceiling any more and answers in about two seconds with the country, the join month and the exact lifetime post count, degrading to the rest of the profile rather than failing when the transparency panel cannot be reached. Private accounts, ghost handles, cursors and every published parameter behave exactly as before. - Improvement
Eleven Instagram endpoints gained a second source, and four of them had none at all
tagged,similar,audio/reelsandhighlightshad a single route to Instagram, so a bad hour there was a failed call. They now have two.post,post/stats,profile,profile/posts,profile/reels,post/commentsandsearch/hashtaggained a faster middle rescue ahead of the ones they already had. Nothing changes on a normal day: the same source answers, at the same price, with the same fields. You see the difference on the day the first route is down, when the call is answered instead of failing. A call carryingregion,download_media,sort=recenton comments, ortype=recentortype=clipson hashtag search keeps exactly the route it has today, because the new one cannot express those filters and standing aside is better than quietly ignoring them. One price moved and only downwards:post/stats?include=savessettles at 5 credits instead of 9 whenever the save and repost counts are already on the response, which is often the case on reels. - New endpoints
Google Trends Trending Now: the searches trending in a country or a state over the past 4 hours to 7 days, with no keyword
GET /v1/google_trends/trendingreturns the list Google publishes on its Trending Now page, so a trend feed can start from a place and a time window instead of a keyword you already had in mind.locationtakes an ISO country code such asDE, its English name, or a region inside it such asDE-BY, across the 125 countries Google covers;hoursis 4, 24 (the default), 48 or 168. Each row carries its rank, the search term, the search volume, the percentage increase, when it started and ended, whether it is still active, its categories, the related queries Google groups under it, and up to three news articles.categorynarrows to one of Trending Now's own 19 categories,status=activekeeps only trends still rising,sortorders by relevance, search volume, recency or title, andlimitreturns 1 to 500 rows, 100 by default. Every call is 5 credits, a repeat within five minutes is served from cache for 0, and a country Google does not cover or a window it does not offer is rejected before anything is charged. - New endpoints
TikTok's hashtag and top video trend boards are back, by country and time window, with every industry board in one call
TikTok moved its trend boards to a new page and cut them back, and
GET /v1/tiktok/hashtags/popularandGET /v1/tiktok/videos/popularnow read that page. The hashtag board covers 27 markets including Germany, over 7, 30 or 90 days, and TikTok publishes the top three hashtags on each board: the overall board and one per industry.industrypicks one of the 15 industries, andindustry=allreads all 16 boards in one call and returns each hashtag once, withpost.ext.trend.boardslisting every board it ranks on and its rank there. Each row carries the hashtag, its post count, its video views, its daily popularity curve and its top creators. The hashtag board costs 2 credits per hashtag returned, minimum 6, so one board is 6 credits andindustry=allholds 96 and settles to the hashtags actually returned, typically 88 to 92. The video board is published only for the US, Japan, Vietnam, Thailand and Indonesia, over 7 or 30 days, ordered by views, engagement or six-second views, up to 20 videos, at 25 credits a board plus 1 credit per video. Both now return the standard post shape instead of the raw board. Values TikTok no longer offers are rejected before anything is charged, with the reason: a 120-day period,newOnBoard, the three retired industries, and a video board for any other market. The song board is gone from TikTok, soGET /v1/tiktok/songs/popularstays withdrawn; the creator board reads as coming soon on TikTok, soGET /v1/tiktok/creators/popularis withdrawn until it is published. - Improvement
TikTok trending adds a local feed built for one country, stops repeating videos, and tags every video with its country
On
GET /v1/tiktok/trending,regionsets the country the request is sent from, and the feed that comes back is largely global: three calls for Germany returned no German captions. Addfeed=localand the endpoint returns the feed TikTok builds for a device set to that country, where about half of the videos are registered in it (54% for Germany on 13/09/2026), still at 5 credits. A local call takes about 10 to 35 seconds, returns around 20 to 28 videos, and a call that gets no feed back is refunded with a 503; it never quietly returns the global feed instead. Every video on both feeds now carriespost.ext.region, the country it is registered in, so a strict single-country set is one filter away, and local rows also carrypost.ext.content_language. The default feed also stops repeating a video that appeared twice on the same page, andpagination.page_sizecounts unique videos. Calls withoutfeedbehave as before, and an unknownfeedvalue is rejected before anything is charged. - Improvement
Instagram posts at a place now page back through its history, and the music chart returns a real chart
GET /v1/instagram/location/postsused to stop after one page of about 60 posts, which at a busy place covered a day or two. Each response now carriespagination.next_cursor, and passing it back ascursorreturns the next, older page, about 60 posts at a time and 5 credits a page, untilhas_moreis false. One walk at Hamburg Sternschanze returned 1,146 posts over 20 pages, back to January, with more still available. Instagram orders a place's posts by when each was created, so a scheduled post that went live later sits among older posts while itspublished_atshows the real publish time; to collect a time window, keep paging until a whole page is older than its start and filter onpublished_at. A malformed cursor is rejected before anything is charged.GET /v1/instagram/music/trendingnow returns only a licensed music chart: when Instagram answers with its royalty-free sound library instead, the call retries, and if no chart comes back it is refunded with a 503. The chart follows the market of the account Instagram serves it to and cannot be chosen, so neither Instagram trending endpoint takes a region; a place search followed by the posts at that place is the regional route. - Improvement
Content analysis filters now narrow the summary, sentiment, rating and trend endpoints
filtersonGET /v1/content_analysis/summary,/sentiment,/rating-distribution,/phrase-trendsand/category-trendswas accepted but did not change the result, so a country filter returned the same worldwide numbers as no filter: on the Cards and Greetings category, a Germany filter came back with Germany as about a tenth of each week. The filter now applies, and the same request returns German citations only.GET /v1/content_analysis/searchalways applied it and is unchanged. Parameters, response shape and prices are the same as before. - Improvement
Facebook post, photo and event lists fill their own rows: share counts, exact reel views, photo engagement and the full event record in the same call
GET /v1/facebook/profile/postsreturns each post's text, reaction counts, comment count, media and publish time, and leftpost.engagement.sharesnull on every row, because Facebook publishes a post's share count on the post itself and never on the feed; a reel's exact view count and duration were null for the same reason. Addinclude=engagementand every row is joined, in the same call, to the per-post lookup that carries them: the share count lands on each row, and the exact view count and duration on each reel. 1 credit for the page plus 1 credit per row filled from a fresh lookup, and the feed serves 3 posts a page, so a joined page is at most 4 credits; rows already in cache are filled for free, rows that could not be filled are refunded, and a repeat of the same call within the cache window is 0 credits. A row that links to an event rather than a post is not looked up, and the reaction counts and publish time the feed already carries are never replaced.GET /v1/facebook/profile/photostakesinclude=details, which fills what a photo listing has never carried: the page's name, avatar and numeric id, the reaction, comment and share counts, and the publish time, on every photo, at 1 credit per photo filled and 9 credits at most for a page of 8. A photo posted on its own carries that post's counts, a photo inside a multi-photo post carries its own, which are usually much lower, and photos have no view count, soengagement.viewsstays null.GET /v1/facebook/profile/eventsandGET /v1/facebook/eventstake the same value and join each row to the per-event lookup: the description, the street address, the coordinates, the hosts and the one-line host credit, the category, the privacy, the attendance count, the cover image and the RSVP counts land on each event, and on the city explore lane the city and the cancelled flag land with them. 1 credit per event filled, so 9 credits at most for a page's own events (8 a page) and 13 at most for a city (12 a page). An event has no views or likes, soengagement.viewscarries the interested count andengagement.likesthe going count, with the same numbers under their own names onpost.ext.event.interested_countandgoing_count, andpublished_aton both event lanes is the event's start time, so it is routinely in the future. Both event lists also publish, on a plain call with noinclude, values their rows always carried and the response used to drop: the rendered time line, the venue name, the start timestamp and the past and online flags on both, and the city and the cancelled flag on a page's own events. One correction ships with them: the description of a page's events promised a cover image and RSVP counts on a plain row, and neither was ever there. They arrive withinclude=details. Every joined response carries adata.hydrationblock with the rows looked up, filled and served from cache, the credits held and kept, and the milliseconds the join added. A plain call on all four endpoints is unchanged in shape and price, and an unrecognisedincludevalue is rejected before anything is charged. - Improvement
Pinterest search and board rows fill their own save, reaction, comment and share counts, pins carry their date, and URL save counts are answering again
GET /v1/pinterest/searchreturned each pin's permalink, image, author and date, and nothing else: the search surface carries no counts of any kind, sopost.engagement.saves,.likes(reactions),.commentsand.shareswere all null even though the documentation promised save counts. Addinclude=engagementand every row is joined to the per-pin lookup in the same call, so the four counts land on each row.GET /v1/pinterest/boardtakes the same value: board rows already carry saves, comments and shares but no date at all, and the join fills the date on every pin plus a reaction count where the board omitted it. Both cost 1 credit for the page plus 1 credit per row filled from a fresh lookup, so a full search page is at most 26 credits and a board page at most 16; rows already in cache are filled for free, rows that could not be filled are refunded, and a page that filled in full is served from cache on a repeat call for 0 credits.limit=Ntakes the top N rows and caps the extra credits with them, and every joined response carries adata.hydrationblock with the rows looked up and filled, the credits held and kept, and the milliseconds the join added. Three fixes need no flag:GET /v1/pinterest/pinnow returns the date the pin was created, which had been null on every pin;post.content.textfalls back to the pin's title when the description is empty, on the pin, search and board calls alike; and search rows now carry the full-size image alongside the thumbnail.GET /v1/pinterest/url-statsis working again after the source behind it stopped answering every request on 06/09: a second source now sits behind the endpoint, counts still follow the exact URL string, and a plain call is still 1 credit for up to 10 URLs. A plain call withoutincludeis unchanged at 1 credit, an unrecognisedincludevalue is rejected before anything is charged, view counts are not published on search results, and a pin that carries neither a title nor a description still returnscontent.textas null. - Improvement
Instagram profile analytics add a follower-based engagement rate, transcripts say why there is no transcript, and like counts are Instagram's own
GET /v1/instagram/profile/fullreturnedcomputed.avg_engagement_rateas null for any account that posts mostly photos, with nothing to say why. That average divides each post's engagement by its view count, and Instagram publishes no view count on photos or carousels, so a photo grid can never produce one. The response now also carriescomputed.avg_engagement_rate_by_followers, the mean likes and comments over the window divided by the follower count, which is the same formula the profile endpoint uses, so a photo account gets a rate at last. Two_warningsexplain the rest: one when the views-based average is empty, naming the reason and pointing at the follower-based one, and one when fewer posts came back thanpostsasked for, because a single call reads one page of recent posts (12 on Instagram) andposts_cursorsent back ascursorreads the next.include=computedonly omits the raw posts array from the response; the metrics are computed from the same posts either way, and the documentation now says so. OnGET /v1/instagram/media/transcript, a reel with no speech returned "the video is unavailable (deleted, private, or it never existed)", which was wrong: the reel exists and simply has nothing to transcribe. It now returnsno_speechwith a message that says so, a photo post returnsno_video_or_gone, and a video over the 2-minute limit returns a clear 400 in about a second and a half instead of timing out after thirty. None of those is charged. Finally,post.engagement.likesand.commentsare now Instagram's own counts everywhere. A post also shared to Facebook came back with its Facebook likes and comments added on some reads and not others, so the same post could report 850 likes on one call and 43 on the next; the Facebook share is now subtracted and the number matches what instagram.com shows on the post. Posts that are not shared to Facebook are unchanged, cross-posted posts read lower than the inflated reads (a few percent for large accounts, much more for creators whose reach is mostly on Facebook), and accounts that hide their like count return null rather than the placeholder Instagram sends. - Improvement
YouTube lists fill their own rows: view, like and comment counts, exact publish times and subscriber counts in the same call
GET /v1/youtube/playlistandGET /v1/youtube/playlist/itemsreturned each video's title, channel and publish date and nothing else, because YouTube's playlist listing carries no counts. Addinclude=engagementand every row comes back with the view, like and comment counts, the duration, the exact publish time and the channel id, joined from the per-video lookup in the same call. The same value works onGET /v1/youtube/search,GET /v1/youtube/search/hashtagandGET /v1/youtube/channel/lives, where likes and comments were empty and the publish date was worked out from a label such as "3 weeks ago": those rows now carry the exact instant instead. Addinclude=channeland every row also carries its channel's subscriber count onpost.ext.author_followers, plus the channel name, avatar and handle where they were missing; that value is available on those five calls and onGET /v1/youtube/channel/videos,/channel/shorts,/videos/trending,/shorts/trendingand/search/advanced. The two combine asinclude=engagement,channel, which is how Shorts search results get a creator: they arrive without one, so the video lookup supplies the channel id and the channel lookup then uses it. Each value costs 1 credit per distinct video or channel it filled and never more than 5 per 50, so a full 50-row page is at most 5 credits per value and a channel's own videos, Shorts or live streams cost 1, because every row there is the same channel. Anything that could not be filled is refunded, a page that filled in full is served from cache on a repeat call for 0 credits, and every joined response carries adata.hydrationblock with the rows looked up and filled, the credits held and kept, and the milliseconds the join added. A plain call withoutincludeis unchanged, and an unrecognised value is rejected before anything is charged. Share and save counts stay null on every YouTube call, videos that hide their like count keeplikesnull, and community posts are unchanged. - Improvement
LinkedIn people search, company employees and post reactions fill exact follower and connection counts in the same call
GET /v1/linkedin/search/people,GET /v1/linkedin/company/peopleandGET /v1/linkedin/post/reactionsreturn each member's name, headline, location and profile URL, and the follower count came back as LinkedIn's rounded display figure on a few rows and empty on the rest, with the connection count empty on every row. A page that reads 39,000 is a member with 39,278 followers, and 2,000 is a member with 2,344. Getting the real numbers meant oneGET /v1/linkedin/profilecall per member. Addinclude=profileand every row on the page is joined to that lookup in the same call: the exact follower count replaces the rounded one,author.ext.followers_approximatereads false on every row the lookup filled, the connection count lands atauthor.following, and the location, the joined date, the country, the website, the cover image and the creator, influencer, open-to-work, hiring, top-voice and premium flags fill wherever the row lacks them. 10 credits for the page plus 4 per member filled from a fresh lookup, so 50 at most; members already in cache are free and members that could not be filled are refunded. A newlimitparameter (1 to 10) takes the top N rows and caps the extra credits with it, solimit=3&include=profilecosts at most 22. Every hydrated response carries adata.hydrationblock with the rows looked up, filled and served from cache, the credits held and kept, and the milliseconds the join added. A plain call withoutincludeis unchanged at 10 credits, and an unrecognisedincludevalue is rejected before anything is charged. Separately, LinkedIn member and company URLs now normalise, solinkedin.com/in/name?trk=...,http://uk.linkedin.com/in/nameandhttps://www.linkedin.com/in/name/are one cached record instead of three charged calls. On LinkedIn a member'sfollowingnumber is the count of connections. - Improvement
Threads account search fills follower counts and bios, and both post lists fill view counts, in the same call
GET /v1/threads/search/usersreturns the handle, display name, avatar and verification on every row and left the follower count, bio, private flag and bio link empty, because the account index carries identity only. Addinclude=profileand every account on the page is joined toGET /v1/threads/profilein the same call, and all four land on the row. 1 credit for the page plus 1 per account filled from a fresh lookup, so 13 at most; accounts already in cache are free and accounts that could not be filled are refunded. A newlimitparameter (1 to 12) takes the top N accounts and caps the extra credits with it, solimit=5&include=profilecosts at most 6.include_details=true, the older way to ask for the follower count and bio, now runs this same join: it returns the accounts the plain call returns, at 13 credits at most rather than the 20 it used to hold, and in seconds rather than up to half a minute. On the post side,GET /v1/threads/user/postsandGET /v1/threads/searchleaveengagement.viewsempty, because Threads publishes a view count on a single post's page only. Addinclude=engagementand each row is joined toGET /v1/threads/post: the view count lands on each row that has one, along with the author's display name on user posts and the pinned flag on search, and thecomputedblock that divides by views fills with it. 1 credit per post filled, so 16 at most on user posts and 20 extra at most on search, where the join covers the first 20 posts and is not accepted withlimitabove 20. Threads publishes a view count only once it has one, so a post that is minutes old comes back without it on this endpoint and onGET /v1/threads/postalike; on search that row still receives its pinned flag and is free, because the join charges only for a landed view count or display name. Every hydrated response carries adata.hydrationblock with the rows looked up, filled and served from cache, the credits held and kept, and the milliseconds the join added. A plain call withoutincludeis unchanged at 1 credit, and an unrecognisedincludevalue is rejected before anything is charged. - Improvement
Reddit community search fills each community's activity in the same call, and subreddit details keep the subscriber count on a cached read
GET /v1/reddit/subreddits/searchreturns the community name, subscriber count, description and icon on every row, and left the creation date, weekly active users, weekly contributions, rules and language empty, because that surface publishes only those first four. Getting the rest meant oneGET /v1/reddit/subreddit/detailscall per community. Addinclude=detailsand every community on the page is joined to that lookup in the same call: the creation date, weekly active users, weekly contributions, rules and language land on each row. 1 credit for the page plus 1 per community filled from a fresh lookup, so 26 at most; communities already in cache are free and communities that could not be filled are refunded. A newlimitparameter (1 to 25) takes the top N communities and caps the extra credits with it, solimit=5&include=detailscosts at most 6. Every hydrated response carries adata.hydrationblock with the rows looked up, filled and served from cache, the credits held and kept, and the milliseconds the join added. A plain call withoutincludeis unchanged at 1 credit, and an unrecognisedincludevalue is rejected before anything is charged. Separately,GET /v1/reddit/subreddit/detailsnow returns the subscriber count and the community language on a cached read as well as a fresh one; those two had been coming back null whenever the response came from cache. Rules stay empty for a community that publishes none. - Improvement
TikTok user search fills bio and region on every row, and the Ad Library search fills the brand and landing page, in the same call
GET /v1/tiktok/search/usersreturns the follower, following, video and like counts on every row but no bio, region, bio link or category, because the search surface does not publish them. Addinclude=profileand every row is joined, in the same call, to the profile lookup that carries them: the bio, the ISO region atauthor.location, the link in the bio and the account category. 1 credit for the page plus 1 per row filled from a fresh lookup, so 31 at most; rows already in cache are free and rows that could not be filled are refunded.GET /v1/tiktok/adlibrary/searchworks the same way withinclude=ad: the registered brand name, the landing page and the advertiser's TikTok profile link and avatar land on every ad, 1 extra credit per ad filled, 17 at most. A newlimitparameter (1 to 30 on user search, 1 to 12 on the ad library) takes the top N rows and caps the extra credits with it, and every hydrated response carries adata.hydrationblock with the rows looked up, filled and served from cache, the credits held and kept, and the milliseconds the join added. A plain call withoutincludeis unchanged, and an unrecognisedincludevalue is rejected before anything is charged. Separately,GET /v1/tiktok/profilenow returnsauthor.locationon a cached read as well as a fresh one; since 9 September the cached read had been dropping it. - Improvement
Instagram popular search and similar accounts fill their own rows: likes, comments, shares and follower counts in the same call
GET /v1/instagram/search/popularused to return a play count and nothing else per reel, because that surface publishes no like or comment counts. Addinclude=engagementand every row on the page comes back with likes, comments, shares, views, the exact publish time and the duration, joined from the per-post lookup in the same call. 1 credit for the page plus 1 per row filled from a fresh lookup, so 13 at most; rows already in cache are free and rows that could not be filled are refunded.GET /v1/instagram/similarworks the same way withinclude=profile: exact follower and following counts plus the bio on every account, 1 extra credit per account filled (the post count fills only for accounts with fewer than 12 posts, the one case the source carries an exact total). The hydrated list is its top 20 accounts by default (at most 25 credits);limit=80buys the full roster (at most 85).GET /v1/instagram/post/statsnow takesinclude=saves, which adds the save count and the two-arrows repost count to one post for 4 extra credits, refunded if they could not be read. Every hydrated response carries adata.hydrationblock with the rows looked up, filled and served from cache, the credits held and kept, and the milliseconds the join added. A newlimitparameter (1 to 12 on popular search, 1 to 80 on similar) takes the top N rows of the page and caps the extra credits with it. A plain call withoutincludeis unchanged, and an unrecognisedincludevalue is rejected before anything is charged. Saves stay null on the list call, views stay null on photos, and accounts that hide their like count keeplikesnull. - Improvement
Google search continues if the first source misses, and Business Profile lookups by id are faster
GET /v1/google/searchnow continues if the primary source is unavailable or returns an empty page, so a timeout or a false empty is retried instead of becoming a hard 404. Title, URL and snippet are unchanged; rank position is still not a public field.GET /v1/google/business/infolookups bycidorplace_idare faster and recover when the primary source fails. Keyword-only lookups (business name + address, no id) are unchanged. Hours, rating, address and claimed status stay on the same Place object. Prices are unchanged. - Improvement
TikTok Shop showcase rows are now the same product object as search, and product detail names the official shop
GET /v1/tiktokshop/user/showcaseused to return each featured product as a post, so likes, comments and views were null on every row even though the row was a product. It now returns the same canonicalproductobjectGET /v1/tiktokshop/productsandGET /v1/tiktokshop/searchalready return: title, price, rating, sold count, images, SKU id, plus the handle you asked for underproduct.ext.tiktokshop.creator_handle. This is a response-shape change on that one call.GET /v1/tiktokshop/productsnow includesproduct.ext.tiktokshop.discount_percenton storefront rows, the same leaf search already had.GET /v1/tiktokshop/productnow includes official-shop identity, the shop's performance percentile, positive-feedback percent, 24-hour response rate, andproduct.ext.seller_reputation(feedback percentage and lifetime units sold). Product lookups now also resolve in GB, ID, MY, TH, SG, VN and PH; other regions still 400 before billing.GET /v1/tiktokshop/searchnow continues if the primary source is unavailable; merchandising extras on that recovery page may be absent, and page 2 of a recovery is not served. A creator showcase is still served from the US only. Prices are unchanged. - Improvement
Facebook profiles, posts and comments return the fields that used to need a second call
GET /v1/facebook/profile/fullalready fetched the page and its posts in one 5-credit call, then leftpost.author.avatar_urlnull on every row even when the profile in the same body had the avatar. Owner rows now carry that avatar, and the numeric page id, from the profile already in hand. A reshare keeps its own author.GET /v1/facebook/postnow publishespost.ext.author_id, which the page's post list already returned, so a post joins to its page without a second profile lookup.GET /v1/facebook/profile/posts,GET /v1/facebook/profile/reelsandGET /v1/facebook/group/postsnow mintpost.ext.feedback_id, the idGET /v1/facebook/post/commentsalready accepts, so you can open comments from the list. Each comment now carriescomment.post_idandcomment.ext.reaction_counts.GET /v1/facebook/groupnow includes the administrator and moderator lists, recent activity, and the privacy and visibility descriptions.GET /v1/facebook/profilenow setsauthor.usernameto the vanity slug from the permalink (NASAfromfacebook.com/NASA), and fillsauthor.verifiedandauthor.followingwhen the source sends them.GET /v1/facebook/profile/reelsnow carriespost.ext.music.idandpost.ext.music.track_titlewhen the reel has a track. Prices are unchanged. A personal profile with no vanity URL, and a group, still have a null username. Facebook's follower count on a page is a rounded display figure and is not copied onto each post as if it were exact. - Improvement
LinkedIn full profiles no longer 500 before they fetch
GET /v1/linkedin/profile/fullwas returning 500 on every LinkedIn URL, person or company, in well under a second, so no profile was actually fetched.GET /v1/prism/lookupdid the same on a LinkedIn URL. The single-lane reads were fine:GET /v1/linkedin/profileandGET /v1/linkedin/companyalready answered. The composite now uses those same sources, including the second source added on 8 September, so a call that the first source cannot serve is no longer a server error before the second source is tried. A profile or company that does not exist is still not found. A call that both sources fail is still a 502 with a refund. Prices are unchanged. - Improvement
A stale Facebook reply token is a 400, not a 23-second 502
GET /v1/facebook/post/comment/repliestakesfeedback_idandexpansion_tokenfrom a previous/v1/facebook/post/commentspage. Those tokens expire. A complete but no-longer-valid token used to retry for about 23 seconds and then return 502, which looks like an outage and tells you to retry in 30 seconds. Retrying never worked, because the token itself was the problem. It now returns 400 immediately, namesexpansion_token, and tells you to take a fresh value fromcomment.ext.expansion_tokenon/v1/facebook/post/comments. Credits are refunded. A truncated token was already a 400, and a comment that does not exist was already a 404. A freshly minted token still returns the reply thread. This is not coerced into an empty list: a comment with no replies and a token that can no longer be redeemed are different answers. - Improvement
Instagram popular search no longer 502s, and a missed reel search keeps its view counts
GET /v1/instagram/search/popularran on one source. A healthy query such asnikereturned 12 posts with play counts and no likes. A harder query such asbasketballwaited about 34 seconds and then returned 502, with a refund. It now falls through to a second source on the same 1-credit call. When that source serves, likes, comments and views come back on the row. When the first source answers, likes and comments stay null, because that surface has never sent them.GET /v1/instagram/search/reelsalready had a backup. The first source carries views; the older backup does not. A query that missed the first source, includingtop restaurants Leganés, used to land on a 10-row page with likes and no views. The next source now still carries view counts, still at 1 credit. A measured walk of that query returned views on every row.date_postedstill uses the only source that can honour a date filter, and views stay null on a date-filtered page. There is nocountryorlocationparameter on reel search: place-tagged posts areGET /v1/instagram/search/locationthenGET /v1/instagram/location/posts. Follower counts onGET /v1/instagram/similarstay null. Prices are unchanged. - Improvement
YouTube search and channel reads now return the fields that used to come back empty
GET /v1/youtube/search?type=channelsused to return 20 empty rows labelled as videos: no name, no handle, no avatar, no URL. It now returns each channel's name, handle, avatar, verification, URL and subscriber count onpost.ext.author_followers, and labels the row as a channel, still at 1 credit. One measured row carried 218,000 subscribers.type=playlistsnow carries the playlist URL, video count and owner channel, labelled as a playlist.GET /v1/youtube/channel/playlistsno longer reports the author as View full playlist, keeps rows that used to be dropped, and attaches a thumbnail from the first video. Every YouTube list that has a channel now publishes that channel's id onpost.ext.channel_id, including playlist videos. A channel's videos and Shorts now carry the category onpost.ext.categoryTitle.GET /v1/youtube/channelnow includes lifetime view count onauthor.ext.total_viewsand the exact join instant onauthor.ext.joined_at_timestamp; one measured channel carried 2,510,027,091 views.GET /v1/youtube/channel/aboutnow returns the rest of the profile beside the email (avatar, bio, URL, join date, views, keywords and links) and is still 0 credits when no address is published, still 25 credits when one is. Video comments now carry the commenter's name and the parent video id on both sources. Prices are unchanged. A video row still does not carry a subscriber count, because YouTube does not put one on a video listing; that number is onGET /v1/youtube/channelat 1 credit and onPOST /v1/youtube/channelsat 5 credits per 50 ids. - Improvement
Reddit profiles return follower counts, and two advertised reads now work
GET /v1/reddit/profilenow returns the public follower count atauthor.followers. That field was null on every account. Measured on 09/09/2026, one creator account returned 33899 and an account nobody follows returned 0; the zero is a real zero. The same call now returns the canonical profile URL atauthor.url, andGET /v1/reddit/subreddit/detailsreturns the community URL. Rows fromGET /v1/reddit/subredditnow carry the same Reddit account id onpost.author.display_namethat the profile returns, so joining a person to their posts on that listing matches. PagingGET /v1/reddit/searchno longer bills posts already returned on the previous page; a measured page two repeated 8 of 25.GET /v1/reddit/profile/posts?sort=topnow returns the top posts; the documented call used to come back empty.GET /v1/reddit/post/transcriptaccepts av.redd.itURL. Credits on that lane are still charged only when a transcript comes back. Prices on every lane in this entry are unchanged. - Improvement
A TikTok region call now includes follower counts, and a sound's videos page past the first page
GET /v1/tiktok/profile/regionstill costs 1 credit and still returns the ISO country code. It now also returns the account's follower, following, post and like counts, plus display name, avatar, bio and verified, so a second profile call is no longer required to assemble one object.GET /v1/tiktok/song/videospage 2 used to time out after about 48 seconds and return nothing; it now returns the next page, or an empty page that is refunded when the list is finished.GET /v1/tiktok/postnow reportsverified: truefor verified accounts that used to come back as not verified. Prices are unchanged. The region itself can still be absent if that one source is down; the rest of the profile is still returned. Page 1 of a sound's videos is unchanged. - Improvement
LinkedIn profiles, posts and search return the fields that used to need extra calls
GET /v1/linkedin/company/insightsanswers again. It had been returning not found for every company, including Microsoft, while the seven member breakdowns were on the payload. They now come back underbreakdowns, still at 5 credits. A video post onGET /v1/linkedin/postreturns duration in whole seconds and the playable stream oncontent.media_urls; the same clip used to come back as 161800 milliseconds here, 161 seconds on the videos tab, and null on the feed. An article share returns the preview image andext.articlewith title, source and URL. Company posts publish the company slug onauthor.usernameand the follower count onext.author_followers. Reshare rows onGET /v1/linkedin/post/repostsnow carry a permalink.GET /v1/linkedin/profilereturns the join date, website, country and creator flags that used to sit behind/profile/aboutand/profile/contactat 5 credits each. A post carriesext.author_id,author_urn,author_headlineandauthor_type, so you can join it to a profile or a company without a second call. Comment likes are the sum of the reaction breakdown that was already on the row. Two lanes change shape.GET /v1/linkedin/post/reactionsis now the same author list as people search, with the reaction onauthor.ext.reaction_type.GET /v1/linkedin/search/postsis now the same post list as a member's feed: text oncontent.text, counts onengagement. Prices are unchanged.author.verifiedon a member profile stays null, because that call does not send it. - Improvement
Instagram similar accounts now include display names, and post lists carry the creator id
GET /v1/instagram/similarnow returnsauthor.display_nameon every row. That field was null on the whole list, so a suggestion page had usernames and no names. The same 5-credit call now includes the name. Follower, following and post counts stay null on that list, because those integers are not on a suggestion row; passauthor.usernametoGET /v1/instagram/profileat 1 credit, or batch up to 50 accounts throughPOST /v1/prism/profilesat 1 credit each.GET /v1/instagram/profile/postsandGET /v1/instagram/profile/reelsnow carrypost.ext.author_idon every row, including the thin rows that used to lose the whole author block, so you can look the creator up by id without resolving a handle first. Both stay 1 credit.GET /v1/instagram/post/commentsandGET /v1/instagram/post/comment/repliesnow setcomment.post_idandcomment.urlfrom the post permalink you already passed; both used to be null. Share counts remain on the 5-credit/fulllists and onGET /v1/instagram/post/stats, not on the 1-credit post and reel lists.engagement.savesstays null on every Instagram endpoint. - Improvement
X account search now pages with counts, and tweet rows carry the author's size
GET /v1/twitter/search/usersused to return about 10 accounts with bio, follower, following, tweet count and join date all null, and no next page. It now returns about 20 full accounts a page, those five fields filled, and you followpagination.next_cursorascursoruntilhas_moreis false, still 1 credit a page. A measured NASA row carried 92 million followers, a bio and a 2007 join date, all of which used to come back null. The same 1 credit onGET /v1/twitter/search/tweets,GET /v1/twitter/user/tweets,GET /v1/twitter/user/mediaandGET /v1/twitter/tweetnow also puts the author's follower, following and tweet counts on the row aspost.ext.author_followers,author_followingandauthor_posts_count, so a second profile call per author is no longer required for those three numbers. A retweet row still publishes the wrapper's own zeros, which is unchanged, and now includes the original post onpost.ext.retweeted_postwith the real likes, views, full body and media. One measured row: the wrapper had 0 likes and 140 characters; the original had 4,640 likes, 1.1 million views and 302 characters.GET /v1/twitter/tweet/repliesnow carries the commenter's counts, the reply language, views, bookmarks and quote count oncomment.ext.GET /v1/twitter/profilenow returns location when the account set one, and a single tweet now returnspost.flags.nsfw. Prices are unchanged. Two limits stay honest.author.likes_countis still null on every X call, because X does not publish a likes-received total. AndGET /v1/twitter/profile/fullstill charges 5 credits and still averages over one page of about 20 tweets;posts=100slices that page and does not walk further.trim=trueis still accepted on account posts and a single tweet, and it is still ignored. - Improvement
Threads user posts go deeper with views, and account search can include followers
GET /v1/threads/user/postsstill returns about 15 recent posts for 1 credit, with view counts null on that short window. Sendlimitabove 15, up to 50, to collect more of the same feed. That deeper call also fillsengagement.viewsandpost.author.display_name, which were null on the default window, and it is metered at 3 credits per post returned, so an account with 20 public posts costs 60 credits however highlimitwas set. Measured on@zuckon 09/09/2026, the default call returned 15 posts andlimit=50returned 32 top-level posts reaching back to 25/09/2025.GET /v1/threads/search/usersstill returns matching accounts for 1 credit, with follower count and bio null. Sendinclude_details=trueto fillauthor.followersandauthor.bioon those same rows, at 2 credits per account returned.GET /v1/threads/post/commentsstill returns the bundled window of about 20 replies for 1 credit. Sendlimitabove 25, up to 50, for a deeper first-level window, billed 1 credit per 5 replies returned; each comment now carriescomment.post_id. There is still no cursor on these three paths:limitis a one-shot collection target. Following count and post count stay null on every Threads surface, because Threads does not publish them. A request that omits the new parameters keeps the old price and the old shape. Keyword search is unchanged. - New endpoints
YouTube creator contact emails, at 25 credits and charged only on a hit
GET /v1/youtube/channel/aboutreturns the contact email a YouTube channel publishes, including the address behind the About tab's View email address control that the public channel page does not carry, asauthor.ext.public_email. It also returns the country listed on the channel asauthor.ext.country, alongside the channel's id, handle, name, subscriber count and video count. It costs 25 credits, and you are charged only when an address actually comes back: a channel that publishes none costs 0 credits, and a channel that does not exist returns 404 at 0 credits. Check the cheap lane first.GET /v1/youtube/channelcosts 1 credit and already carriesauthor.ext.public_emailwhen the creator writes an address into their public description, which covered 17% of a 12-channel sample, so call it first and come here only when that field is null. Two things worth knowing before you size a job. About one channel in four publishes more than one address, and the endpoint returns the one most likely to be the creator's own business contact rather than simply the first one found or the one that is not a free mailbox, because a company domain is often a third-party agency rather than the creator. And mid-tail creators publish an address far less often than mainstream ones, so budget by lookups attempted rather than by emails expected. A typical single lookup answers in about three seconds. The endpoint reads two sources, and you are charged once no matter how many are tried. - New platform
Douyin: China's short-video network, on the same key
Douyin is live with 8 endpoints. It is a separate network from TikTok, with its own creators, catalogue and trends, and it needs no Chinese account, cookie or VPN.
GET /v1/douyin/searchfinds videos by keyword in Chinese, English or a mix, with sort, publish-window and duration filters.GET /v1/douyin/profilereturns a creator with followers, likes received, video count and IP province, and fetches no videos, which makes it the cheapest call on the platform for follower tracking.GET /v1/douyin/profile/postslists their uploads, andexclude_pinneddrops a pinned post that would otherwise make an inactive creator look busy.GET /v1/douyin/postreturns one video including music, dimensions and the place the creator tagged.GET /v1/douyin/post/commentsreturns top-level comments at 1 credit each with the commenter's IP province, andGET /v1/douyin/comment/repliesopens one thread withcomment.parent_idset on every reply, so a conversation rebuilds exactly.GET /v1/douyin/search/usersfinds creators by keyword and filters by follower band or account type.GET /v1/douyin/trendingreturns the whole live hot-search board for one flat price. Two things to know before you integrate.post.engagement.viewsis always null, because Douyin publishes no play count outside its own app and a zero would read as a video nobody watched; likes, comments, shares and saves are real. And search always returns rows: Douyin answers a nonsense query with loosely related videos rather than reporting no match, so read the captions rather than treating a non-empty list as coverage. Metered endpoints charge only for rows actually returned. - Improvement
LinkedIn calls that used to error now return data, and a bad filter is refused for free
Five LinkedIn reads now have a second source behind them: member profiles, company pages, a member's experience section, a member's education section, and people search. When the first source cannot answer, the second one serves the same call in the same shape, and you cannot tell which one answered. Prices are unchanged. A filter that takes a LinkedIn id now refuses a name immediately and for free. Six filters on people search and one on job search used to answer a company, school or industry name with an error telling you to retry in 30 seconds, and retrying never worked because the request shape itself was the problem. They now return an instant error naming the call that produces the id you need. The same check covers company ids on the six company endpoints that take one, and the date and sort values on post search. A profile or company that does not exist comes back as not found instead of a server error, so retry logic can tell a missing record from a broken call. Failed calls are still refunded. The second source only runs when the first one fails, so a normal call is served as before.
- Improvement
Threads keyword search stays on the words you typed
When Threads does not recognise a phrase, the query is relaxed into narrower searches and the results are merged. That relaxation used to fall back to single words once it ran out of adjacent word pairs, and single words are the loosest possible reading of a query: on
cari ai automation, the legs forcariandaialone returned a full window each and supplied two thirds of the page, so 41 of 59 posts carried one or none of the three terms. Relaxation now uses adjacent word PAIRS only, and drops to single words solely when no pair survives, which is a two-word phrase or one where every pair spans a stopword. Measured on production after the change, the same query returns 20 posts instead of 59, 15 of them carry two or more of your terms instead of 15 out of 59, and it costs 1 credit instead of 3 because it runs two searches instead of four. Two other measured phrases moved from 44% to 69% and from 37% to 84% on the same yardstick, and the high-relevance posts are kept rather than traded away: what leaves is the one-term tail. Separately, very short terms no longer match inside longer words when results are ranked, soaistops scoring againstemail,rainandsaid, while scripts that attach particles to the noun still match as before. The relaxed searches now also carry a time budget of their own instead of inheriting the whole request budget, so a slow moment upstream ends in an answer rather than a hanging call. Recall is unchanged: a phrase Threads has never heard of still comes back empty and still costs nothing, andexpand=falsestill searches the exact phrase only. One thing worth setting while you are here:limitcollects more posts by running search windows one after another at roughly 3.4 seconds each, so it buys time as well as credits. Cache-cold, no limit returns in about 3.5 seconds,limit=30in 7.3,limit=50in 10.2 andlimit=100in 19.5. If your HTTP client gives up at 10 seconds,limit=50and above will not fit, so raise the timeout or ask for less and page withpagination.next_cursorfor the same credits. - New endpoints
Reddit now reads accounts, comment text and communities
Six new endpoints.
GET /v1/reddit/profilereturns one account, andGET /v1/reddit/profile/postsreturns what it has posted, about 23 in a single call.GET /v1/reddit/search/commentssearches comment text directly instead of searching posts and reading down, at about 19 a page.GET /v1/reddit/subreddits/searchtakes a topic and returns communities, 25 a page, so you no longer need to know a subreddit's name before you start.GET /v1/reddit/search/mediareturns image and video posts for a keyword, 25 a page. Those three page with the universalcursor, and a measured page two shared no rows with page one. All five cost 1 credit a call.GET /v1/reddit/profile/commentsis the sixth and the one to read about first: it returns an account's own comment history in date order and is metered at 2 credits per comment returned, so a measured 25-comment call cost 50 credits. Itslimitaccepts 1 to 100 and is a depth control rather than a page size, so a higher number reaches further back in the same single call at the same speed, and there is no cursor. TryGET /v1/reddit/search/comments?query=author:usernamefirst at 1 credit: it looks like the same thing but reads the search index, which holds a relevance-ranked subset. Measured on one account, the search route returned 9 comments and stopped where the history endpoint returned 60 reaching back to 2021. Come to the history endpoint when you need the history rather than a sample. An account with fewer comments than yourlimitcosts less than you asked for, and a username that does not exist returns an empty list at no charge, as does a real account that has never commented. Those two cases are indistinguishable there, so callGET /v1/reddit/profilewhen you need to tell them apart. - Improvement
Google Trends answers about twice as fast, and rarely times out
GET /v1/google_trends/exploreandGET /v1/google_trends/risingnow answer in about 4.6 seconds on a typical call, measured on production across 22 billed calls after the change. The same calls used to average about 9 seconds, and one in seventy ran past our timeout ceiling and failed after roughly 48 seconds. That failure path is now rare rather than gone. The gain is in the slow tail rather than the median: a mainstream English keyword was already fast, and it is cold, non-US and non-Latin-script terms that used to stall and now come back in the same few seconds. Nothing else about these two endpoints changed. Same parameters, same response shape, same 5 credits, same free 400s and free 404s. That was checked rather than assumed: all eighttimeframevalues return the same number of data points as before, a multi-keyword comparison is still normalised across the set so the values stay directly comparable, the final still-accumulating bucket is still flaggedpartial,categorystill filters, every accepted spelling of a location still resolves, and a keyword with no measurable interest still returns 404 at 0 credits with the message that tells you the location and timeframe were accepted so you know it is the keyword. - Improvement
A wrong endpoint path now tells you the right one
Calling a path that does not exist has always been free and has always told you nothing beyond the fact that it was unknown. It now names the closest real paths, both in the error message and in a
details.did_you_meanarray you can read in code./v1/instagram/postspoints at/v1/instagram/profile/posts,/v1/instagram/user/reelsat/v1/instagram/profile/reels, and/v1/instagram/hashtag/postsat/v1/instagram/search/hashtag. It also handles the case where the platform itself is the wrong name rather than the resource: our Twitter surface is registered astwitter, so/v1/x/profilenow answers with/v1/twitter/profileinstead of a bare unknown-endpoint error. Suggestions are only offered when a real match scores well enough, because sending you to an endpoint that bills and does not answer your question would be worse than saying nothing. The error type, the 404 status and the zero charge are all unchanged, so nothing you already handle behaves differently. - Improvement
Every Instagram endpoint that ran on one source now has a second
Four Instagram lanes were each served by a single source, so a bad hour at that source was an error for you. They now fall through to a second source on the same call, at the same price, returning the same fields. Account country, join month and public contact details (
GET /v1/instagram/profile/about) had stopped answering entirely on 7 September when its source hit a monthly ceiling; it is answering again and can no longer be taken down by one supplier running out. Profile reels (GET /v1/instagram/profile/reels) was returning a server error on about one call in eighteen, across 640 accounts. Post share counts (GET /v1/instagram/post/stats), the only place a share count exists, was failing at the same rate. Video transcripts (GET /v1/instagram/media/transcript), our only ten-credit Instagram call, had no backup at all. Nothing about your requests or responses changes: the second source is only reached when the first one fails, every field maps to the same place, and no price moved. Share counts still exist only on single-post reads, andengagement.savesstays null everywhere because Instagram publishes no save count on any surface we can buy. - New endpoints
Reddit accounts, comment search, and community discovery
Six new Reddit endpoints.
GET /v1/reddit/profilereturns an account: total karma atauthor.likes_count, the post, comment and award split atext.post_karma,ext.comment_karmaandext.awardee_karma, the cake day, the bio, the avatar and banner, and the trophy count.GET /v1/reddit/profile/postsreturns what that account submitted, across every community it posts in, with bodies and media on the rows andext.subredditnaming where each one landed.GET /v1/reddit/search/commentssearches Reddit's comment index directly, so a phrase that only appears deep inside a reply is reachable in one call, and every hit carries its parent post inline atext.post_title,ext.subreddit,ext.subreddit_subscribers,ext.post_score,ext.post_comment_countandext.post_author. Reddit's own operators work inquery:author:usernamefor one account's indexed comments,subreddit:name termsto scope a sweep.comment.parent_idis null on that lane and that is honest rather than missing, because the upstream does not report whether a hit is a top-level comment or a deep reply.GET /v1/reddit/subreddits/searchfinds communities by topic, andauthor.idis the bare community name, which is exactly whatsubreddit,subreddit/detailsandsubreddit/searchtake as theirsubredditparameter.GET /v1/reddit/search/mediareturns the image, video and gallery posts for a topic. Those five are 1 credit a page, up to 25 rows, and they page withcursor.GET /v1/reddit/profile/commentsreturns an account's own comment history, deeper than any search index reaches: one measured account returned 25 comments back to July 2022 and 60 back to June 2021, in about the same time either way, becauselimitis a depth control rather than a page size. It is metered at 2 credits per comment returned and settles to what you actually receive, so an account with fewer comments than yourlimitcosts less than you asked for. TryGET /v1/reddit/search/comments?query=author:usernamefirst at 1 credit a page; it reads the search index, which held 9 comments for one account where the history endpoint returned 60. - Improvement
Searching inside a subreddit returns up to 27 posts a page
GET /v1/reddit/subreddit/searchreturned about 7 posts a page. It now returns up to 27 on the same 1 credit, and the rows carry more: the post body atext.selftext, the author's avatar, images and video, the upvote ratio, the flair and Reddit's own content language. The first rows are the same community ranking you already receive, unchanged and in the same order; the rest are appended from Reddit's search index scoped to that community, so nothing you already had moves. Page size varies between calls, so read the length ofitemsrather than assuming a number. Because one page is assembled from two indexes, three leaves are reported for only part of it and are null on the rest:post.flags.spoiler,post.engagement.sharesandpost.engagement.saves. A null there means the index that returned that row does not report the field, never that the value is false or zero, so do not aggregate over them. Omittingqueryreturns the community ranking alone at about 7 rows, because Reddit's scoped search needs terms to match against.include_body=truestill works and is rarely needed now that bodies arrive on the rows themselves. Separately, onGET /v1/reddit/searchandGET /v1/reddit/subreddit,post.ext.subredditnow returnsnullinstead of an empty string on the small number of rows whose community the source could not resolve. If you group results by that field, an empty string was a valid key and those rows were collecting under a blank community name; they are now skipped instead. - New endpoints
A LinkedIn member's complete post history, one page at a time
GET /v1/linkedin/profile/posts/archivewalks a member's entire post history. Ask forlimit=100and follownext_cursoruntil it stops coming back; a page that arrives without one means you have everything that member has posted. Measured on one profile at 851 posts over ten calls reaching back to March 2022, and on a heavier poster past 1,800 posts reaching 2017. How far back it goes is a property of the member, not a number to design against. A page takes about five seconds whatever depth you are at, so the last one costs the same wall clock as the first. Every row is one the member wrote, because reshares of other people's posts are excluded rather than billed to you. This is the only LinkedIn lane that returns an exact publish timestamp, identical on repeat calls, where the other feed lanes report a time recalculated from a relative label at the moment they answer. It is also the only one carrying share counts. Pricing is metered at 5 credits per post returned and settles to what you actually receive, so a member with fewer posts than yourlimitcosts less than you asked for, and a profile we cannot find costs nothing.limitaccepts 1 to 100. Try the flat 5-creditGET /v1/linkedin/profile/postsfirst: it returns up to 100 posts in one call and is the whole history for most members. - Improvement
TikTok Shop returns whole catalogues, whole review corpora, and one product shape
GET /v1/tiktokshop/searchnow returns the same product objectGET /v1/tiktokshop/productsreturns, with the same field names and types. If you integrated against the older raw shape, this is a breaking change: the data is the same, under the canonicalproduct.*names, with the search-only signals (seller trust label, shipping origin, promotion badges, category breadcrumb, demo video) moved toproduct.ext.tiktokshop. Two endpoints that used to stop after one page now paginate with the universalcursor. A storefront that reported 20 products and no more now returns all of them, measured at 52 of 52 over three pages, anddata.totalcarries the shop's on-sale count up front. Product reviews used to return 10 and report no more on products with thousands; they now page, anddata.totalcarries the full review count. Reaching the end of a review walk returns 404 at no charge, which is the terminator rather than an error.GET /v1/tiktokshop/productnow acceptsproduct_idas well asurl, matching its reviews sibling, and returns the listing's real description where it previously returned only the category name, plus stock, discount, shipping cost, delivery window, SKU variations, specifications, and the seller's location, rating and lifetime sales. A shop listing now names its seller and carries the shop's own rating, follower count and region. On reviews,languageandoriginal_languageare now null rather than repeating the buyer's country code, which is still onreview.author.location. A creator handle TikTok does not have now returns 404 at no charge instead of an empty list, and a badregionis rejected before billing on every endpoint that takes one. - New endpoints
Instagram account country and contact details, and YouTube channel links
GET /v1/instagram/profile/aboutis a new 1-credit lookup for the data behind Instagram's About this account panel: the country the account is based in, the month it joined, and the contact email and phone the account publishes. Country was not available on any other call. The ordinaryGET /v1/instagram/profilenow also returns the professional category, and the contact address when a creator writes one into their bio.GET /v1/youtube/channelnow returns every link in the channel's profile section asauthor.ext.links, alongside the contact email that already shipped. The YouTube links list is served by one of the two sources behind that endpoint, so it is not yet on every call. - New endpoints
Finance adds price history, statements, options, and ticker news
Four reads join Finance, and the platform path is now
/v1/finance/rather than/v1/google_finance/. Every old path still resolves, so nothing you have written needs changing.GET /v1/finance/historyreturns daily OHLCV bars with bothcloseandadj_close, plus dividends and splits on the dated row they take effect, at 1 credit for the whole range.GET /v1/finance/statementsreturns income, balance sheet, and cash flow per reporting period, at 5 credits, using the same field names as the financials block already inside a quote. Korean instruments work, including quarterly statements in won.GET /v1/finance/optionsreturns one expiry's calls and puts in a single flat list, at 5 credits, with strike, bid, ask, open interest, and implied volatility.GET /v1/finance/newsreturns recent articles in the same row shape as Google News search, at 1 credit. Quote, ticker search, and markets are unchanged on purpose. Two limits: prices are delayed (20 minutes on Korea, London, and Tokyo, 15 on US options), and statements are keyed by fiscal period end, not filing date, so this data cannot reconstruct what was known on a past date. Delisted companies return nothing, and a recycled ticker returns whichever company holds the symbol today. - Improvement
More Reddit posts per search, and far deeper comment threads
GET /v1/reddit/searchnow returns up to 25 posts a page where it returned about 7, and each row carries more: the post body, the author's avatar, images and video, the upvote ratio, the flair, and Reddit's own content language. Page size varies between calls, so read the length ofitemsrather than assuming 25.include_body=truestill works and is rarely needed now; when there is nothing to fetch its extra credits are refunded in full. Searches in Korean and other non-Latin scripts that used to come back empty now return results, and those calls bill the usual 1 credit for the page where an empty page was refunded to 0.GET /v1/reddit/post/commentsreturns roughly 4x more comments, and faster: 687 against 168 on one thread, 949 and 1,553 on larger ones. Read this before you diff two captures, because the bigger response is not a superset of the old one. On a large thread both responses are partial and they stop in different places, so between 77 and 103 comments per thread that the previous response carried are absent from the new one.data.truncatednow reports that honestly, and it can betruewith nonext_cursor, which means the thread is incomplete and this endpoint cannot fetch you the rest. Comment bodies now arrive as Reddit's markdown source, socomment.textcan contain**bold**and[label](url)where it used to be flattened.GET /v1/reddit/postis more reliable, and itspost.engagement.sharesnow counts shares rather than crossposts: same field, different metric.GET /v1/reddit/subredditreturns the same posts in the same order as before and adds the author's avatar, images and video, the upvote ratio, the flair and the content language to each row. The listing is deliberately left alone: the posts and their order still come from the source you are already reading, so nothing you have moves. As on search, the added fields can be null across a whole page on a small share of calls while every other field is unchanged, andtrim=trueomits them along with the rest of the trimmed leaves. - New platform
US Congress Trades: STOCK Act filings from the House and Senate
US Congress Trades is live with 19 endpoints, all 1 credit.
GET /v1/us_congress_trades/tradessearches House and Senate STOCK Act disclosures by ticker, politician last name, party, chamber, sector, transaction type, and date. Each row has the member, issuer, ticker, buy/sell/exchange, disclosed value, dates, and reporting gap.GET /v1/us_congress_trades/politician?handle=Pelosireturns that member's summary; the same handle pages their filings.GET /v1/us_congress_trades/ticker?keyword=AAPLrolls up a stock. Stats cover party totals, sectors, top issuers, unusual activity, buy vs sell, and late filers. Bare tickers such as AAPL are accepted. Empty lists and missing politicians are refunded. - New platform
Kohl's product search, reviews, Q&A, and store locator
Kohl's joins the commerce coverage with five endpoints.
GET /v1/kohls/searchpages keyword results, 12 per page, with price, images, colours, and rating, at 5 credits. Sort by featured, newest, price, rating, or percent off. A query that matches nothing still returns a handful of unrelated popular products, so check the titles. There is no product-detail endpoint: feed a product id from search intoGET /v1/kohls/reviews(8 per page, verified-purchase flag, exact total) orGET /v1/kohls/questions(buyer questions with answers).GET /v1/kohls/storesfinds stores near alat,lngcoordinate, radius 1 to 100 miles.GET /v1/kohls/categoriesis a 1-credit reference dump. Products and reviews use the same canonical shape as Amazon, Target, and H&M. - New platform
Gumtree UK listings, sellers, similar ads, and locations
Gumtree joins the classifieds coverage with 11 endpoints.
GET /v1/gumtree/searchpages UK listings, about 22 per page, with price in GBP, location, category, and seller type (private or trade), at 5 credits. Page 2 does not overlap page 1.GET /v1/gumtree/productreturns one listing by ad id or gumtree.com URL.GET /v1/gumtree/product/similarreturns similar ads as a single page.GET /v1/gumtree/sellerandGET /v1/gumtree/seller/listingstake bothseller_idandpublic_idfrom the listing detail; one id is not enough. Location autocomplete and nearest-location lookup sit beside those. Live listing calls are 5 credits; trending searches, categories, and filters are 1 credit. Seller reviews are not on this surface. - New platform
AliExpress products, search, similar items, reviews, and shipping
AliExpress joins the commerce coverage with nine endpoints.
GET /v1/aliexpress/productreturns one product by numeric id or aliexpress.com/item URL: title, sale price, original price, shop name, images, sold count, and category, at 5 credits. There is no product description on this surface. A product that does not exist, or is not sold to the requested country, returns 404 and is not billed.GET /v1/aliexpress/searchpages keyword results, 10 per page by default (max 50), with sort and price filters.GET /v1/aliexpress/reviewspages written reviews. Similar items, shipping info for a sku, hot products, and featured promos sit beside those. Catalogue calls are 5 credits; category and promo name lists are 1 credit. - New platform
Klarna shopping: products, merchant offers, reviews, and price history
Klarna joins the commerce coverage with 18 endpoints across 13 shopping regions.
GET /v1/klarna/productreturns one product by id or shopping URL: title, description, brand, rating, and specs, at 5 credits. This payload has no list price; callGET /v1/klarna/product/offersfor merchant prices.GET /v1/klarna/searchreturns 20 products matching a keyword, a single page with no cursor, at 5 credits. A query that matches nothing comes back empty and is not billed. Reviews, professional reviews, review overview, price history, and product compare sit beside those. Category browse, category taxonomy, stores, and store catalogues fill out the rest. Catalogue calls are 5 credits; reference lists (suggestions, categories, stores, filters) are 1 credit. - Improvement
Instagram reel search paginates to a clean finish
Paging
GET /v1/instagram/search/reelsnow ends the way the rest of the API does. Reaching the end of a result set used to return a 404, so a loop followingpagination.has_morefinished on an error rather than a clean stop. The last page now returns200with an emptyitemslist,has_more: false, and no credit charged. The same applies to a search that matches nothing: a query with no results returns an empty list instead of a 404, so checkitems.lengthrather than branching on the status code. Worth knowing when you page: a date-filtered search draws on a much smaller pool, roughly 10 reels per page over a handful of pages, against 30 per page and far greater depth whendate_postedis omitted. A page part-way through a walk can also come back empty at 0 credits when every reel on it was already returned earlier in the same walk, which is not the end, so keep going whilehas_moreis true. - New endpoints
Tripadvisor hotels, restaurants, attractions, and cruises
Tripadvisor goes from two endpoints to sixteen, all at 1 credit.
GET /v1/tripadvisor/placeresolves any Tripadvisor URL into a place, which is the fastest way to confirm aurl_pathpoints at the property you think it does. Typed search and detail arrive for hotels, restaurants, and attractions, each with its own filters: price band, hotel class, and property type for hotels; cuisine, meal, price level, and dietary restriction for restaurants; category, duration, and minimum traveler rating for attractions. Restaurants, attractions, and cruise ships each get their own reviews endpoint.GET /v1/tripadvisor/autocompleteturns a typed name into a resolved place, andGET /v1/tripadvisor/experience-typesreturns a destination's activity taxonomy with a count per type. Two things to know: hotel search rows carry no rating or review count, so chainGET /v1/tripadvisor/hotelwhen you need those, and the attraction and cruise review lanes carry no owner replies and no per-review permalink. - Improvement
Tripadvisor reviews are about 4x faster
GET /v1/tripadvisor/reviewsnow answers in about 1.1 seconds where the same request on the same property took about 5.2 seconds before. Price, parameters, and response shape are unchanged, and filtered requests keep their existing behaviour exactly. Two field changes worth reading before you deploy against it.review.helpful_votesis now populated, where it was always null before.review.author.locationis now null on unfiltered requests, because the faster path does not carry it: if you read that field, pass any one ofsort_by,rating,visit_type,search_reviews_keyword, ortranslateand it comes back as before. - New endpoints
Yelp search, full search, and suggestions
Yelp now has five endpoints.
GET /v1/yelp/searchandGET /v1/yelp/search/fulltake requiredqueryandlocation, plus optionalsort(recommended,rating,review_count),ads, andcursor, at 1 credit.GET /v1/yelp/search/suggestionstakesqueryandlocationand returns typeahead rows (category, common, chain, business). Business suggestion URLs are aliases and do not resolve onGET /v1/yelp/business/info. If search reports a non-zero total with no rows, the call fails and is refunded. - New platform
Yelp business info and reviews
Yelp joins the reviews coverage with two endpoints.
GET /v1/yelp/business/inforeturns one business by its 22-character encid: name, unrounded star rating, exact review count, price level, address, coordinates, categories, photos, and timezone, at 1 credit. Alias slugs such as prince-street-pizza-new-york-2 return 404 and are not billed.GET /v1/yelp/business/reviewspages customer reviews, 10 per page, with a cursor, owner replies, photos, and HELPFUL votes, at 5 credits. Page 2 does not overlap page 1. There is no search on this surface. Places and reviews use the same canonical shapes as Tripadvisor. - New platform
H&M product search, store locator, and supplier factories
H&M joins the commerce coverage with six endpoints.
GET /v1/hm/searchpages keyword results, 36 per page, with price, images, colour, sizes, and availability, at 5 credits. Sort by relevance, newest, or price.languageswitches catalogue (en_usdefault,en_gb,de_de,fr_fr). A query that matches nothing comes back empty and is not billed.GET /v1/hm/search/suggestionsreturns autocomplete terms.GET /v1/hm/storesreturns every store in a country (passus,gb, ordeasquery), with address, coordinates, and opening hours.GET /v1/hm/countriesandGET /v1/hm/categoriesare 1-credit reference dumps.GET /v1/hm/product/suppliersreturns the manufacturing countries, factory names, and worker-count bands for a product id from search. Products use the same canonical shape as Amazon, Target, and Etsy. There is no product-detail endpoint on this surface. - New platform
Sephora products, reviews, search, and store stock
Sephora joins the commerce coverage with eleven endpoints.
GET /v1/sephora/productreturns one US product by P-number or sephora.com/product URL: title, brand, description, price, rating, images, ingredients, and stock.GET /v1/sephora/reviewspages written reviews, 10 per page, with an exact total.GET /v1/sephora/searchpages keyword results, 60 per page, with clean page-2 advance; a query that matches nothing comes back empty and is not billed. Category browse, brand catalogue, root categories, brand directory, store locator, and per-sku store availability sit beside those. Products use the same canonical shape as Amazon, Target, and Etsy. Catalogue calls are 5 credits; reference lists (categories, brands, suggestions, stores) are 1 credit. Europe endpoints are not on this surface: they failed closed on every probe. - Improvement
Extra query parameters are ignored again, so existing requests keep working
On 31/08/2026 a validation change started rejecting any query parameter an endpoint does not declare, as an unbilled 400. That caught real typos (
?limitt=10still tells you it meantlimit), but it also broke requests that copy a parameter from one endpoint onto another:regiononGET /v1/instagram/post/stats,trimonGET /v1/facebook/post,cacheonGET /v1/tiktok/profile,limiton Instagram list calls. Those extras are ignored again, as they were before 31/08/2026. They are not forwarded, not billed, and not part of the cache key. A misspelled name of a parameter the endpoint does use still returns an unbilled 400 that names the parameter and suggests the one you probably meant. Existing identities also keep working:usernameis accepted where the endpoint asks forhandle, an Instagramshortcodeis accepted where it asks forurl,date_posted=last-dayon reel search is served aslast-week(the closest filter the source still has), and Facebook post URLs that carry a caption slug in the path are accepted again. - Improvement
Instagram follower walks reach the end, post ids are exact, and empty pages are honest
Follower and following walks no longer end early. A brief throttle in the middle of a roster used to come back as an empty page with
has_more: false, so a walk of a large account stopped thousands of rows short. That page is now retried on the same cursor, and if it still cannot be served you get a refunded error instead of a false end of list. A handle that does not exist now returns a refunded 404RESOURCE_NOT_FOUNDwithdetails.reason: handle_unresolvedonGET /v1/instagram/followersandGET /v1/instagram/following, where it used to return an empty 200 list, and the samedetailsblock is now available on the 404 of account-keyed roster endpoints on other platforms whenever the account is confirmed missing.post.idonprofile/reels,taggedandstoriesnow carries the exact 19-digit media id (previously the last 2-3 digits were rounded on every row;taggedpage 2 previously repeated page 1). Re-sync any ids you stored from these three endpoints.profile/posts,search/hashtagandlocation/postswere already exact and do not change.trim=trueonprofile/postsandprofile/reelsreturns the full list again, where it returned an empty page that was still billed. Withtrim=true,post.ext.coauthorsis omitted andpost.flags.pinnedis null, and everything else is unchanged. OnGET /v1/instagram/search/hashtagonlytype=recentpaginates:top(the default) andclipsare single ranked pages that end withhas_more: false, and you send the sametypeagain with the cursor.date_postedonGET /v1/instagram/search/reelsacceptslast-week,last-monthandlast-year.last-dayandlast-hourstopped being served around 26/08/2026 and now fail validation before any call is made, at no charge, with an error that names the three values that work; they used to fail after a wasted call with the generic message.GET /v1/instagram/profile/reels/fullmakes far fewer calls per page to collect share counts, andX-Upstream-Retriesnow counts every extra call it makes, where it reported 0 while making a dozen. An empty answer we cannot explain is now treated as a transient error, retried, and then refunded as a 502, instead of being served as an empty list; genuine empties, such as username suggestions with no results, still return 200. A post or profile that does not exist no longer renders as a 502 when a further lookup also fails: it is a refunded 404, and Prism composites stop on that definitive not-found instead of looking further. Profile lookups of nonexistent handles return their 404 faster. - Improvement
Facebook comment replies now return replies, and the busiest Facebook calls stay up if the primary source is down
GET /v1/facebook/post/comment/repliesused to return an empty list on comments that had replies. It now returns the replies.GET /v1/facebook/post/commentsis on the same path. Cost, envelope, and parameters are unchanged: 1 credit a page, same cursor, same 404 for a missing post. Separately, the busiest Facebook calls —GET /v1/facebook/post,GET /v1/facebook/profile,GET /v1/facebook/profile/posts, andGET /v1/facebook/profile/reels— now fall through to a backup source if the primary cannot answer, so they stay up instead of going dark together. No new Facebook endpoints in this wave. - New platform
Quora question, answer, profile, Space, and topic search
Quora joins as a new platform with seven endpoints, all 5 credits.
GET /v1/quora/searchfinds questions by keyword: title, URL, answer count, follower count, and publish time.GET /v1/quora/answersreturns written answers with author credential, upvotes, and the parent question.GET /v1/quora/posts,GET /v1/quora/profiles,GET /v1/quora/spaces, andGET /v1/quora/topicssearch Space posts, profiles, Spaces, and topics the same way.GET /v1/quora/postlooks up one question from its URL. Each search is a single page of up to 10 results, with an optionaltimewindow (all,hour,day,week,month,year). There is no cursor: refine the query or the window to see a different set. - New platform
G2 software products, reviews, categories, and sellers
G2 joins as a new platform with seven endpoints.
GET /v1/g2/productreturns one software product by slug or G2 URL: rating, review count, categories, seller, pricing plans, features, and alternatives, at 5 credits.GET /v1/g2/reviewsreturns written reviews, 10 per page, filterable by stars, company segment, industry, role, and region, also 5 credits.GET /v1/g2/categorylists products in a category, 15 per page.GET /v1/g2/categoriesdumps the full category taxonomy in one call at 1 credit.GET /v1/g2/sellerandGET /v1/g2/seller/productscover a vendor profile and its product portfolio.GET /v1/g2/product-indexpages the catalogue of product URLs, 100 per page, so you can feed slugs into product or reviews. Products and reviews use the same canonical shapes as the other commerce platforms. - New platform
Job search across LinkedIn, Indeed, Bing, and Xing, plus salary ranges
Jobs is a new platform, 11 endpoints, not a replacement for the LinkedIn job endpoints you already call.
GET /v1/linkedin/search/jobsandGET /v1/linkedin/jobstay as they are. This surface adds four job boards plus salary.GET /v1/jobs/linkedin/search,GET /v1/jobs/indeed/search,GET /v1/jobs/bing/search, andGET /v1/jobs/xing/searchsearch listings by keyword and location, with date, employment type, and board-specific filters, at 10 credits a page. Each has a matching detail endpoint at 5 credits.GET /v1/jobs/linkedin/organizationsresolves company ids to pass asorganization_idson the LinkedIn search.GET /v1/jobs/salary/titlessuggests canonical titles, andGET /v1/jobs/salaryreturns min, max, mean, and median pay for a title and country. Organization and salary calls are 1 credit. Search pages with a cursor; Indeed needscountry_codeon page 1. - New platform
Etsy listings, shop catalogues, similar products, and search suggestions
Etsy joins the commerce coverage with four endpoints, all 5 credits.
GET /v1/etsy/productreturns one listing by numeric id or etsy.com/listing URL: title, description, price, images, shop name, and quantity.GET /v1/etsy/shop/productspages a shop's catalogue, 36 per page, with a cursor; the reported total equals the page size so it is omitted, and you paginate until a short page.GET /v1/etsy/product/similarreturns the listings Etsy considers similar, typically around 12, as a single page.GET /v1/etsy/search/suggestionsreturns autocomplete terms for a partial query. Products use the same canonical shape as Amazon, eBay, and the other retailers. Keyword listing search and reviews are not on this surface: search failed closed on every probed query, and reviews came back empty on listings that have thousands of reviews.
August 2026
- Improvement
Threads search now answers long, multi-word queries instead of returning nothing
Threads matches a search against the topic tags it already knows rather than scoring the words you typed, so a longer phrase it did not recognise came back completely empty rather than with fewer results. This was never a keyword limit:
machine learning engineerreturned a full window whilethe best coffeereturned nothing at all. Measured across a spread of real queries, three-word searches came back empty four times out of six, five-word searches five times out of six, and eight-word searches every time.GET /v1/threads/searchnow handles this for you. When your exact phrase returns nothing, the query is relaxed into its adjacent word pairs, those searches run in parallel, and you get back one merged and de-duplicated list ordered by how many of your terms each post actually contains. On 31/08/2026best coffee machine for a small officewent from 0 posts to 75, andcari vendor mesin kopi jakartafrom 0 to 56. You are billed 1 credit for each relaxed search that returned posts and nothing for the ones that did not, so the metered range moves from 1 to 7 credits up to 1 to 11. A query that already worked is never relaxed and still costs exactly 1 credit. Two things to plan around: a relaxed response is a single page and carries no pagination cursor, because the cursor would resume the exact phrase that just returned nothing, anddata._warningsalways names the sub-queries that ran so you can see what was actually searched. Sendexpand=falseto switch it off and search the exact phrase only. - Improvement
Misspelled parameters now fail loudly, and scheduled runs that silently never fired now run
A misspelled query parameter used to be ignored, so
?limitt=10silently searched without your limit and you paid for a result you did not ask for. Any unrecognised parameter now returns an unbilled 400 that names it and suggests the parameter you probably meant, with the machine-readable detail onerror.unknown_parametersanderror.suggestions. Sending?limitt=10gets you "Did you mean 'limit'?", and?curser=gets youcursor. An undeclared parameter with an empty value is still treated as omitted, so existing callers that append empty query strings are unaffected. Separately, scheduled Monitor runs and cohort queries could be enqueued and then never execute. The job queue rejects a deduplication id containing a colon, and our idempotency keys are colon-separated, so the publish failed, the outbox row stayed pending, and the run never fired while its credits stayed reserved. Those ids are now hashed before they reach the queue, which is always a valid value, so the runs fire. Error responses also report billing more honestly: on a 5xx,credits_usedis the charge that actually committed, and when an immediate refund cannot commit, exact compensation is queued rather than the response claiming a refund that did not happen. - New endpoints
Eight new TikTok endpoints, and the follower, following, and reply lists page properly
Eight endpoints join TikTok, all at 1 credit.
GET /v1/tiktok/profile/playlistslists the playlists an account has published, andGET /v1/tiktok/playlist/videoswalks the videos inside one of them in playlist order.GET /v1/tiktok/user/likedreturns the videos an account has liked, newest first, 30 to a page; most accounts hide that list, and a hidden one comes back as a 404 you are not charged for.GET /v1/tiktok/location/postsreturns the public videos tagged at a place.GET /v1/tiktok/effectslooks up camera effects by id andGET /v1/tiktok/effect/videosreturns the videos made with one.GET /v1/tiktok/search/musicfinds sounds by keyword, and each row carriesext.dsp_ids, which maps that sound to its Apple Music, Spotify, and Amazon track ids.GET /v1/tiktok/hashtagreturns TikTok's own record for a tag, including its live view total; pass the tag name and the id lookup happens for you. The lists you already call also got bigger. Follower and following pages now return up to 150 accounts.GET /v1/tiktok/user/followingis a properly paginated endpoint for the first time: it used to return roughly 20 accounts with no cursor and no way to go further, and it now returns up to 149 in one call with apaginationblock at the envelope root you can walk to the end.GET /v1/tiktok/video/comment/repliesreturns up to 50 replies a page where it used to return 6. UnfilteredGET /v1/tiktok/searchreturns 30 results a page instead of 10, and the date, sort, and region filters are now honoured for real, so a filtered search returns up to 30 results that genuinely match.GET /v1/tiktok/search/topstandardizes at up to 30 a page. Every search row now carries the author's follower count atpost.ext.author_followers, post engagement carries exact save counts, and a newpost.ext.download_countreports how many times a video was downloaded. Two changes are worth reading before you integrate. A follower or following list that the account owner has hidden now returns a definitive 404 instead of an empty 200, so you can tell a hidden list from an empty one without a second call, and that 404 costs nothing. And an audience-controlled profile, age-gated or similar, now returns the full record onGET /v1/tiktok/profilewhere it used to return a 404. That request was free and now bills the standard 1 credit, because it comes back with data in it. - New endpoints
Amazon Best Sellers, deals, seller profiles, and an on-page SEO audit
GET /v1/amazon/best-sellersreturns a category Best Sellers chart (switchtypefor New Releases or Movers and Shakers).GET /v1/amazon/dealslists current Amazon deals with deal price and ASIN.GET /v1/amazon/sellerlooks up a seller profile by seller id.GET /v1/google_shopping/price-historyreturns per-store dated prices for a product_id from product-search. New platform:GET /v1/on_page/pageruns a one-credit technical SEO audit on a single URL (title, meta, checks, score, timing). Costco search is still not a platform: product-details still 404s on the vendor's own item numbers. - New endpoints
Seven new X endpoints, and user timelines now paginate
GET /v1/twitter/user/tweetsnow returns an account's timeline fresh and in descending chronological order: the most recent tweets first, matching the profile's Posts tab, with a pinned tweet flagged viapost.flags.pinned. Pagination is now a real cursor walk: sendpagination.next_cursorback ascursorand go as deep as you need at 1 credit a page, where the endpoint previously stopped after a single page. Alongside it, seven endpoints join the X platform, all at 1 credit a page.GET /v1/twitter/search/tweetssearches X for a keyword or phrase, about twenty tweets a page, newest first by default (sort=latest) or most popular withsort=top.GET /v1/twitter/tweet/repliesreturns the replies under any tweet, andGET /v1/twitter/tweet/retweetersthe accounts that retweeted it.GET /v1/twitter/user/followersandGET /v1/twitter/user/followingwalk an account's follower and following lists on a cursor, with follower pages running about seventy accounts.GET /v1/twitter/user/mediareturns just the tweets on an account's Media tab, the ones carrying a photo or video. AndGET /v1/twitter/search/usersfinds accounts by name or handle; it returns one fixed set of about ten matches with no cursor, so refine the query to surface different accounts. Two things to know up front: follower, following and retweeter records carry no verification status on this surface, and Media-tab tweets return no view or bookmark counts. - Improvement
Reddit search can return the full post body in one call
GET /v1/reddit/searchandGET /v1/reddit/subreddit/searchnow put the post body atext.selftextwhen the source includes it, withcontent.textjoining title and body the same way/v1/reddit/postdoes. Setinclude_body=trueto fetch any missing bodies in the same call: 1 extra credit per hydrated post, up to 25 per page, unused credits refunded. Link posts have no body, soext.selftextis null. - New endpoints
Find creators across TikTok, Threads, and Instagram in one call
GET /v1/search/creatorsfans a niche query across TikTok user search, Threads user search, and Instagram profile search, then merges matching creators into one ranked list. Rank is a published formula of query relevance, follower scale, and verification. No LLM rerank. Flat 10 credits. - New endpoints
TikTok Ad Library, Apple Music, and more DX endpoints
GET /v1/tiktok/adlibrary/searchandGET /v1/tiktok/adlibrary/adread the TikTok Ad Library (same advanced tier as the other ad libraries). Also new: TikTok search suggestions and collection videos; Instagram mixed search, popular posts, and comment replies; Facebook group lookup; Snapchat Spotlight comments; and Apple Music search, artist, album, and track. All except the mixed/suggestion passthroughs return the unified Post, Comment, or Author schema. - Improvement
Instagram reels search now fails over automatically
GET /v1/instagram/search/reelswent down on the evening of 17 August: the source behind it stopped resolving every query, and because the endpoint ran on a single source, every call returned a 404 (at no charge) until the morning of 18 August. It now runs on two independent sources with automatic failover, so an outage on one no longer takes the endpoint down; the Instagram lane ofGET /v1/search/everywhere, which rode the same source, fails over the same way. Results keep their view, like and comment counts, permalinks and author identity on both sources. Two things to know:post.ext.author_followersis embedded only by the primary source, so treat it as opportunistic; and thedate_postedfilter is supported only by the primary source, so a filtered search fails honestly during a primary outage rather than quietly returning unfiltered results. - New endpoints
New endpoint: the replies under any Threads post
GET /v1/threads/post/commentstakes a post URL and returns the replies Threads bundles with it, typically about twenty. Each comment carries its text, like count, direct reply count, author handle, display name, avatar and verification status, pinned flag, and creation timestamp, plus a permalink we construct from the reply's shortcode because the upstream sends none. One thing to know up front: Threads exposes a single window of replies with no cursor, so there is no paging deeper into a long conversation. It costs 1 credit, the same as the post lookup it mirrors. - Improvement
Instagram carousels and Facebook media now arrive complete
Two fixes in the same spirit.
GET /v1/instagram/poston a carousel returned only the first slide's cover: a seven-slide post came back as one image; it now returns one cover per slide, in order, as an array incontent.media_urls, matching what the Instagram list endpoints already did. And on Facebook, multi-photo posts, carousel ads and marketplace listings each shipped a single URL no matter how many images they carried, while image-format ads returned no media at all;facebook/post, profile and group posts, both Ad Library endpoints andmarketplace/itemnow return the full ordered image set. Single-image posts keep their existing shape, so nothing changes unless there was more to show. - Improvement
YouTube advanced search can now return view counts and video length
GET /v1/youtube/search/advancedreturned titles, channels and exact publish times but left view counts and durations empty, because YouTube's search index only hands back snippets. AddincludeExtras=trueand every result now carriespost.engagement.views,.likes,.commentsandpost.content.duration_seconds. It costs 5 credits on top of the usual 1, charged once per page rather than per result, and a page is at most 50 results. Leave the parameter off and nothing changes, price included. This is the endpoint to reach for when you need an exact date window (published_afterandpublished_beforetake full timestamps) a sort that is actually applied (order=viewCount,order=date), or a page size you can count on (max_resultsreturns exactly what you ask for, up to 50). The coarseruploadDateonGET /v1/youtube/searchis quietly ignored by YouTube whenever atypeis set alongside it. One thing to be plain about: there is no Shorts filter here and there cannot be, because YouTube's data API cannot tell a vertical Short from any other video. The closest approximation isduration=shortplusincludeExtras=trueand your own filter onduration_seconds <= 180, which will also catch short landscape videos. If the extra lookup fails you still get the page, the 5 credits are refunded, and the response carriesextras_unavailablein_warnings. - Improvement
YouTube search pages stop repeating themselves, and stop when they are done
Paging
GET /v1/youtube/searchfor Shorts could return the same videos over and over: the continuation token advanced on every page, so the walk looked healthy andhas_morestayed true, but the results had stopped being new. One measured walk billed 40 items across four pages and contained 12 distinct videos. Search pages are now de-duplicated across the whole walk against what you have already been served, and a run of pages that carries nothing new ends the walk instead of paging forever. A page whose results were all repeats returns empty at 0 credits rather than charging you for them. Related: if you filter Shorts by date, prefer droppinguploadDateand filtering onpost.published_atyourself withincludeExtras=true.uploadDate=this_yearstill works, but it measurably narrows what YouTube will page through, and the 400 you get for a shorter window now says so. The same de-duplication applies toGET /v1/youtube/search/hashtag. - Improvement
Threads profiles return bio links, and posts return every carousel slide
A Threads profile now includes the external link the account set in its bio, at
author.ext.bio_link. If you are building lead lists off Threads, that link is usually the business's own site or contact page, and it was being dropped entirely. Carousel posts now return every slide as an array incontent.media_urlsinstead of only the first image, and video posts return a playable video URL there with the cover frame incontent.thumbnail_url. Video posts previously returned a still image and no way to reach the video at all. The media change applies to user posts, search results and single post lookups alike. - Improvement
Country codes now work on Google Shopping, Trends, the App Store and Google Play
These endpoints take a
countryparameter, and until now it only accepted our data provider's exact location name, so the obviouscountry=UScame back as an upstream error rather than US results. They now accept an ISO code (US,GB,TR), a full name (United States) or a numeric location code, all resolved server-side. If you tried a two-letter code and concluded the endpoint was broken, it was not: it simply could not read what you sent. Each endpoint's parameter documentation now states all three accepted forms. - Improvement
LinkedIn holds up under load, and job search rejects bad date filters for free
LinkedIn requests now run with far more throughput headroom, which removes the single largest source of LinkedIn failures: throttling when several calls run at once. Separately, the job search
date_postedfilter accepted any text and passed it straight through, so a plausible guess likelast-monthcame back as an opaque upstream error. It is now a proper enum: an invalid value returns a free 400 naming the three accepted values,past_24h,past_weekandpast_month, before any credit is spent. We deliberately do not rewritelast-monthtopast_monthbehind your back, because some of the values people were sending have no correct target and guessing would hide the bug in your own code. - Improvement
Threads search reaches further back, and comment pages stop repeating themselves
Threads search only exposes a fixed window per call and gives us no cursor, so deep queries used to stop early. It now walks shrinking date windows server-side and de-duplicates by post id, which took one representative query from 16 posts to 83. Set
limitand the API collects up to that many unique posts in a single call, billing per window actually consumed and refunding the unused budget. Separately, TikTok and YouTube comment pagination could hand back the same comments on consecutive pages, so anyone paging for volume was paying for repeats. Those pages are now de-duplicated across the whole walk. - New platform
Wayfair, Home Depot and eBay are live
Three retailers join the commerce coverage, all on the same canonical product and review shapes as Amazon, Walmart and Target, so a cross-retailer price comparison reads identical field names. Wayfair ships keyword search, product detail by SKU and paginated reviews. eBay ships keyword search returning sixty listings a call, plus listing detail carrying full seller reputation: lifetime feedback, top-rated status, join date and four detailed sub-ratings. Home Depot ships product detail and reviews, and its product response reports the actual unit count on the shelf at each nearby store, which nothing else in the API returns. Home Depot keyword search is not included yet because the upstream returns a service error on every call; it will be added when that clears.
- Improvement
Retired the age and gender detection endpoint
GET /v1/utility/age-gender is gone from the catalog. The upstream detector was unreliable, production traffic was effectively zero, and keeping a broken premium path in the surface was worse than removing it. Use TikTok's GET /v1/tiktok/user/audience for the geography breakdown that platforms actually expose publicly. The free utility DX endpoints (endpoints, endpoint, quickstart, and llms) are unchanged.
July 2026
- New endpoints
The API now explains itself: four free utility endpoints
Four new utility endpoints make the API self-describing. GET /v1/utility/endpoints returns a machine-readable catalog of every active endpoint: path, method, credit cost, and parameters, filterable by platform, HTTP method, or a search term. GET /v1/utility/endpoint turns any endpoint id or URL into a complete usage guide: every parameter with type and example, the exact credit cost, cache behaviour, the pagination recipe, a copy-paste example request and response, and the response schema URL. GET /v1/utility/quickstart packs a first successful call into one response: authentication, the response envelope, the billing model, the error taxonomy, rate limits, and a working first request to paste as-is. GET /v1/utility/llms serves the llms.txt context corpus through the API, for the whole API or one platform, as markdown or structured JSON. The point is onboarding speed: a developer, or an AI agent holding an API key, goes from nothing to a correct first call in one request instead of reading documentation pages. Every payload is generated from the running endpoint registry at request time, so the catalog, the guides, and the quickstart never drift from what is actually callable. All four cost 0 credits, so calling them from a CI job or an agent bootstrap costs nothing. If you only work with one platform, pass platform to keep the responses small.
- New endpoints
GET /v1/search/news: planned, localized news search across 50 countries
One query in, a multi-country news sweep out. GET /v1/search/news plans your query into search angles, localizes each angle into every requested country's language in a single pass, then fans out up to 12 parallel Google News searches across 50 country editions and merges the articles with cross-country de-duplication. Every leg reports its provenance: query_source tells you whether the keyword was translated, confirmed as already correct, or fell back to your original text because localization degraded, so a quiet planner failure can never masquerade as a localized search. Ask for JSON, or send Accept: text/event-stream and the same call streams: the refined plan arrives first carrying per-leg provenance, then each country's articles as they arrive. Pricing is metered and honest: 2 credits base plus 1 credit per leg that actually returns articles, capped at 14, and the unused ceiling is refunded automatically. A search that finds nothing bills the base only, and repeating the same call inside the 5-minute cache window costs 0 credits.
- Improvement
Google News search: ~5x faster and dramatically more reliable
GET /v1/google_news/search has been re-engineered end to end. Median response time drops from over 8 seconds to about 2, the long 48-second timeout tail is gone, and the hard-error rate that peaked near a quarter of calls last month falls to well under 2% thanks to automatic retries and a second, independent serving path that takes over whenever the first one falters. Three new filters land with it: publisher (limit results to one outlet's domain, e.g. bbc.com), and from/to (an exact publish-date window as YYYY-MM-DD or a Unix timestamp), plus boolean operators (AND, OR, NOT) and quoted phrases in the keyword. The data got better too: every article now carries the publisher's real outlet name (not just a domain), a direct publisher thumbnail URL, and a precise ISO-8601 UTC publish timestamp. One honest trade-off: the short text snippet is no longer guaranteed on every result and the schema page reflects that. Same endpoint, same 1-credit price; every existing parameter keeps working unchanged.
- Improvement
Honest region errors on TikTok Shop product and showcase lookups
The data source behind GET /v1/tiktokshop/product and GET /v1/tiktokshop/user/showcase currently serves those two lookups from the US only, and until today a region=GB call surfaced that as a generic 400 after a billed-then-refunded round trip. Both endpoints now validate region up front: any value other than US returns a clear 400 naming the allowed set, before billing, at 0 credits. Search, store products, and product reviews are unaffected and keep their 16 regions, so GB and other regional markets remain reachable through them. Also fixed: product URLs without a slug, like tiktok.com/shop/pdp/1729587769570529799, which is the exact form our own product.url field returns, are now accepted instead of being rejected as malformed. Docs now state the real region support per endpoint. We are watching the upstream for regional coverage on the two lookups and will widen the allowed set the day it ships.
- Improvement
Walmart keyword search withdrawn while its source is broken
GET /v1/walmart/search is disabled as of today. The data source behind it started failing on the US marketplace, which is the endpoint's default, one day after launch, and we would rather remove an endpoint than leave one that errors by default sitting in the docs and the OpenAPI spec. Calls now return a 503 and cost nothing. Nothing was billed while it was failing either: the error was classified as an upstream fault, not an empty result, so every affected call was refunded automatically. The other four Walmart endpoints are unaffected and were re-verified against production today. If you were resolving keywords to product ids, GET /v1/walmart/category is the way to enumerate products for now, and it returns real prices, which search never did. We will re-enable search when the source recovers.
- New endpoints
Browse Target by category, and find Target stores
Three new Target endpoints close the discovery gap. GET /v1/target/categories returns the whole browse taxonomy for 1 credit, and GET /v1/target/category walks any node 24 products at a time with real prices, brands, ratings, images and TCINs. Together they are the reliable way to get from nothing to a set of TCINs, which matters because Target ships no keyword search we are willing to bill for. Note that consecutive category pages occasionally repeat a handful of products, because Target's own category ordering shifts between calls, so de-duplicate by product.id when crawling. GET /v1/target/stores rounds it out: Target stores near a ZIP, city or state with address, phone, distance, open status and two weeks of daily opening hours, also 1 credit. Category products and stores use the same canonical shapes as the rest of the API, so a Target store parses like a Google Business place.
- New platform
Target product detail and customer reviews
Target joins the commerce coverage with two endpoints: full product detail and customer reviews, both keyed by TCIN, the number at the end of any target.com product URL. Product detail returns price, brand, highlights, the image gallery, colour and size variations, and the complete 1 to 5 star distribution in a single call, so you can read a rating profile without paginating a review corpus. Reviews come back ten per page with no overlap between pages and an exact total, which makes a full crawl deterministic. Products and reviews use the same canonical shapes as Amazon, Walmart, and Google Shopping, so one parser covers all four. There is no Target keyword search: the upstream's search ignores paging, caps at 24 rows, and returns unrelated products for a query that matches nothing, so we left it out rather than bill you for rows you did not ask for.
- New platform
Walmart product, review, and seller data
Walmart joins the commerce coverage with five endpoints: product detail, up to 50 customer reviews per call, keyword search, category browsing, and every marketplace seller offering an item. Category accepts a ZIP code, state, or store id, so you can read the store-level prices and stock a shopper actually sees, and a country parameter switches between walmart.com and walmart.ca. Products, reviews, and sellers come back in the same canonical shapes as Amazon and Google Shopping, so one parser covers all three retailers. Update: keyword search was withdrawn the following day when its source broke, so four of these five are currently live.
- New endpoints
Fetch a Reddit post by URL, body included
GET /v1/reddit/post takes a Reddit post URL and returns the post itself, including the body text (selftext) that nothing else exposed: reddit/search returns titles only, and reddit/post/comments gives you the comment tree without the post it hangs off. content.text carries the title and body joined, the same shape as the subreddit listing, while ext.title and ext.selftext give you the two separately so you can read the body on its own. You also get score, upvote ratio, comment count, flair, author, thumbnail, and timestamp. Link posts, which have no body, return a null ext.selftext. It costs 1 credit, and a URL that resolves to no post refunds as a 404.
- New endpoints
Facebook reels with exact engagement, in one call
GET /v1/facebook/profile/reels/full returns a page's reels with exact views, likes, comments, and shares already merged in. The plain reels list only carries Facebook's rounded public view count (the "12K" figure parsed back to 12000) and no engagement at all, because Facebook exposes those numbers on the individual reel only. The new endpoint queries each reel server-side and overwrites the list values with the exact figures, at a flat 5 credits per page of 10 reels, roughly half the cost of chaining the list into post-stats yourself. Every item carries ext.engagement_source so you can tell exact numbers from list fallbacks, the response reports engagement_coverage, and a page with zero enrichment auto-refunds down to the plain 1-credit list price. Pass limit (up to 50) and it pages itself.
- Improvement
Transcript 404s now say why
GET /v1/youtube/video/transcript used to return a generic not-found for a video that simply has no transcript, which read as an API bug and invited blind retries. It now returns 404 with error.details.reason set to captions_disabled, no_captions, login_required, or video_gone, plus a plain-English message, at 0 credits. The reason slugs match the ext.reason vocabulary on POST /v1/youtube/transcripts batch rows, so single and batch calls classify failures the same way.
- Improvement
LinkedIn comment replies actually return now
LinkedIn's upstream sends comment replies without a flat id (identity lives only inside the comment URN), so every reply row was silently failing validation and being dropped from responses. The transformer now derives comment.id and comment.post_id from the URN, so replies come back with the same bare id format as parent comments.
- Improvement
Track Meta's split reel views on both sides
Meta stopped combining Instagram and Facebook views on cross-posted reels: the Instagram number is now Instagram-only, retroactively. Two changes help you track the full picture. GET /v1/instagram/post/stats now returns the Instagram-only counter explicitly as post.ext.ig_play_count, so you'll see immediately if Meta ever re-merges the figures. And POST /v1/prism/post-stats now accepts facebook.com/reel/ and /videos/ URLs, which previously came back unsupported, so you can batch the Facebook crossposts alongside the Instagram originals and sum the two.
- Improvement
video-intel and comments work on YouTube again
After YouTube moved to a new primary source, GET /v1/prism/video-intel failed on every YouTube URL and GET /v1/prism/comments dead-ended YouTube scans, because both composites were still dispatching legs with the old source's credentials. Both now ride the source-aware primary-with-fallback chain. Transcript legs also gained a hard time budget: a slow or absent transcript degrades to null with the 10-credit increment refunded, instead of hanging the stream for minutes.
- Improvement
Broken query encoding fails fast, at 0 credits
A query sent in a non-UTF-8 charset (arriving as replacement characters) or double-percent-encoded used to be forwarded upstream and come back as a clean empty result, which read as "the platform has no data." Those requests are now rejected before billing with a 400 carrying error.details.reason of invalid_utf8 or double_encoded and an actionable message, at 0 credits. URL parameters are exempt since they legitimately carry percent escapes.
- New platform
The open web joins the API: scrape, search, crawl, extract
SocialCrawl now covers the open web, not just social platforms. GET /v1/web/scrape turns any URL into clean markdown with metadata. GET /v1/web/search runs web, news, and image search and returns full-page content in the same normalized shape. GET /v1/web/map lists a site's URLs, and POST /v1/web/extract pulls structured JSON out of any page from a prompt or a schema. For bigger jobs there are async endpoints (crawl, batch scrape, and a browser agent) that run in the background with job polling, optional webhooks, and a credit refund when you cancel. Same key, same unified envelope as every other platform.
- Improvement
Subreddit details now include weekly activity
GET /v1/reddit/subreddit/details now returns two community-health numbers alongside the subscriber count: weekly active users and weekly contributions, under author.ext. Subscriber counts tell you how big a subreddit is; these tell you how alive it is right now, which helps when you're ranking where to actually engage.
- New endpoints
Batch endpoints: 100 transcripts or 50 profiles in one call
Two new batch endpoints for list-shaped work. POST /v1/youtube/transcripts takes up to 100 video ids and returns a transcript per row, as plain text or timestamped segments, at 3 credits per successful transcript. A caption-less or deleted video is isolated and refunded instead of failing the batch. POST /v1/prism/profiles takes up to 50 handles across 12 platforms and returns the full canonical profile for each, billed only for the profiles that actually resolve, at each platform's normal rate. Both support streaming results over SSE and a custom_id per row so you can match responses back to your own records.
- Improvement
More consistent, more honest per-post data
A reliability pass tightens the numbers you grade on. duration_seconds is now real seconds on every platform (TikTok and the YouTube fallback used to return milliseconds; Instagram was already correct). When a creator hides their like count, you now get likes: null plus a likes_hidden flag instead of a misleading small number. Instagram's reels and posts endpoints now tag each item with ext.shares_source, so a blank share count is always explainable rather than a silent gap, and the share premium is refunded on any page that returns no shares. A request for a post that no longer exists now returns a clear not-found with a full refund instead of a success charge on empty fields. And every list endpoint now accepts a single cursor parameter; send the wrong pagination name and you get a helpful error naming the right one, at no charge, instead of silently repeating page one.
- Improvement
Instagram comments now return real like counts and true top ranking
GET /v1/instagram/post/comments and prism/comments now return each comment's real like count and Instagram's own popularity order, so sort=top surfaces the genuinely most-liked comments first, the ones you actually see at the top in the app. Before this, like counts came back near zero with nothing real to rank on. Results are now consistent from one call to the next, the response carries the post's true total comment count, and you get the same result whether you pass a /p/, /reel/, /reels/, or /tv/ link. Because the mobile source that carries these fields costs more, Instagram comments move to a flat 5 credits per call.
- New endpoints
Look up a single comment by URL or ID, on Instagram and TikTok
Three new endpoints for tracking specific comments. GET /v1/instagram/comment and GET /v1/tiktok/comment take a comment link (or a post plus a comment id) and return that exact comment's current text, author, and metrics in one request, without paginating the whole comment section yourself. POST /v1/prism/comment-lookup does the same for up to 25 comments at once, made for a daily refresh of the comments you track. You can also search by author or by a text snippet. Anything we can't find is fully refunded, and a position hint from an earlier lookup makes the next check on the same comment nearly free. Flat pricing: TikTok 2 credits, Instagram 5.
- Improvement
Reddit comments now return the full thread tree
GET /v1/reddit/post/comments now returns the entire nested comment tree in one call, not just the top-level comments. It auto-follows Reddit's load-more pagination and deep-merges every reply branch for you, so you get the whole conversation (full depth and all) without walking cursors yourself. Very large threads stop at a safety limit and hand back a continuation cursor plus a truncated flag so you can pull the rest. Because one call now expands many pages of replies under the hood, the endpoint moves to the advanced tier at a flat 5 credits.
- New feature
Export your API logs to CSV or JSON
The Activity log explorer now has an export menu. Copy the loaded rows to your clipboard as CSV, or download them as a .csv or .json file, with the same fields you see in the table. It exports exactly the rows currently loaded, so filter by status, platform, cache hit, error code, or date, click Load more to pull in as much history as you need, then export just that slice.
June 2026
- New endpoints
YouTube gets a faster source, richer data, and bulk endpoints
The core YouTube endpoints (channel, video, comments, replies, playlist, and transcript) now run on a faster, more reliable source with automatic failover, so a transient upstream block no longer fails the call. Every response also carries more: full video descriptions, a channel's related-playlist links (handy for jumping straight to its uploads), inline previews of a comment's top replies, and more, all under ext. Two new bulk endpoints land too. POST /v1/youtube/videos and POST /v1/youtube/channels fetch up to 1,000 videos or channels in a single call, metered at 5 credits per 50. One change to note: a channel's joined date is now a clean ISO date (2015-02-01) instead of free text.
- New feature
A full request-log explorer in your dashboard
The Activity page in your dashboard is now a proper log explorer for every API call you make. Filter by status, platform, cache hit or miss, error code, and date from a faceted sidebar with live counts; scan a request-volume histogram to spot spikes and errors at a glance; scroll the full history with infinite scroll and search; and click any row to open a detail view with the method, path, request ID, status, latency, response size, and credits spent. Flip on live mode to watch calls stream in as they happen.
- Improvement
Cursor pagination: no more infinite loops or duplicate items
Three pagination issues are fixed across the API. An empty page no longer returns a next_cursor, so clients that paginate until the cursor runs out won't loop forever on a zero-result page. If an upstream hands back the very same cursor it was given, we now drop it instead of passing it on, another way pagination could spin in place. And on YouTube comments and replies, items that straddle a page boundary are now deduplicated, so the same comment never shows up twice as you page through. Nothing to change on your side; just keep following next_cursor.
- New feature
Three more free tools: Amazon reviews, app reviews, and stocks
Three new no-signup tools that run on the live API. Amazon Fake Review Checker scores how trustworthy a product's reviews really are. App Review Analyzer reads thousands of App Store and Google Play reviews and tells you what users actually keep saying. Stock Comparison puts any two stocks side by side. Try each in the browser, then pull the same data from the API.
- Improvement
Instagram hashtag search now returns real posts
Instagram hashtag search now reads Instagram's native hashtag feed instead of a Google-indexed scraper that returned no posts even for popular tags like #travel or #food. Results are real public posts with shortcode, URL, caption, media, engagement counts, and author. Two changes to note. Pass type to choose the ranking (top, recent, or clips for reels only) and page with the returned cursor; the old date_posted and media_type parameters are gone. The endpoint now meters at the advanced tier (5 credits) on its new source.
- Improvement
More reliable, resumable comment scans
Deep comment scans got sturdier. The comments endpoint now retries transient upstream blocks and runs under a scan budget, so a deep pull no longer dies on a single hiccup. When a scan can't finish in one pass it returns the comments it gathered plus a next_cursor and a note in _warnings, and you're only charged for the pages actually fetched. On Instagram, sort=top and max now reach the real comment pool. Its pages are smaller than other platforms, which used to cap the scan early, so pulling the genuinely most-liked comments now works.
- Improvement
Get the top comments by like count
The comments endpoint can now return the most-liked comments first. Add sort=top to any TikTok, Instagram, YouTube, Facebook, Reddit, or Hacker News post URL and it ranks the harvested comments by like count, with limit to cap how many you get back. Pulling the top 200 comments on a 10,000-comment post is now a single call instead of paging and sorting yourself. On YouTube the ranking is exact; elsewhere it sorts across what it scans, and every response reports sorted_by and returned. Sorting never changes the price. You still pay only for the pages actually scanned.
- New endpoints
Instagram, LinkedIn, and YouTube get a major upgrade
Instagram adds 14 endpoints: follower and following lists, post likers, stories, tagged media, location feeds, and a computed engagement rate. LinkedIn is rebuilt on a fresher source with job search, richer profiles, company pages, reposts, and reactions. YouTube adds eight: trending, advanced search, transcripts, audio, subtitles, and thumbnails. Two breaking changes to note: YouTube transcript now returns offset/duration in seconds instead of startMs/endMs (and drops from 10 to 3 credits), and LinkedIn profile, company, and post move to the richer source at 5 credits instead of 1, with single results wrapped under a data key.
- New feature
Build with AI: describe what you need, get working code
A new assistant in the dashboard that turns a plain-language request into a working SocialCrawl integration. Describe the data you want and it scopes the right endpoints, writes the code, estimates the credit cost, and runs it live against your own API key, so you go from idea to a tested call without reading the whole reference.
- New feature
Auto-recharge keeps your credits topped up
Set a balance threshold and a top-up amount, and SocialCrawl refills your credits automatically before you run out, so a busy traffic day never ends in a 402. Turn it on, set your limits, and forget about manual top-ups.
- New feature
Prism: composite endpoints that do the joins for you
A new proprietary family of endpoints that fan out across platforms in one call and fold the results into a single response. Resolve any social or commerce URL, pull a full creator profile with computed analytics, merge one handle across X, Threads, Bluesky, and Truth Social, or get a cited AI answer from multiple engines, and every response carries a legs array showing exactly which sources ran and which degraded.
- New feature
Three new free tools
Brand Mention Checker, Engagement Rate Calculator, and Creator Earnings Calculator: three no-signup tools that run on the live API. See where a brand is being talked about across platforms, measure any creator's real engagement rate against benchmarks, or estimate per-post earnings from follower count and engagement.
- New feature
Earn credits with the referral program
Share your referral link. When someone you refer makes their first purchase, you earn 2,500 credits. Track qualified referrals and credits earned from a new page in your dashboard.
- New endpoints
Prism brand and market intelligence
Pre-built Prism recipes that turn raw social and web signals into brand intelligence: brand-mention sweeps with sentiment, share-of-voice against competitors, cross-marketplace product ratings, review-integrity grades, sales-lead conversations, employer-brand sentiment, and developer-tool pulse, one call each, with no pipeline to build.
- New endpoints
GET /v1/search/forums: Reddit, Hacker News, and Naver in one sweep
A focused search lane that fans out across Reddit, Hacker News, and Naver's Q&A and café corpora, then fuses and clusters the threads, comment-enriched by default, no LLM planner overhead. Built for voice-of-customer and developer-sentiment research.
- New platform
Content Analysis: cross-web brand mentions and sentiment
Search where a brand or phrase is mentioned across news, blogs, e-commerce, and message boards, with six-axis sentiment, phrase trends, and top domains, the data layer behind Prism's brand-intelligence composites.
- New platform
Google Finance market data
Quotes, ticker search, and market detail for stocks, ETFs, indices, crypto, forex, and futures, all on a single Quote schema across every instrument type.
- New platform
Google News real-time search
Pull the live Google News SERP for any query: fresh articles, sources, and timestamps on a normalized news schema.
- New platform
Kwai joins the platform lineup
Kwai (the short-video network with massive reach across Brazil and Southeast Asia) is now on the unified schema. Fetch profiles and videos with the same key you use everywhere else.
- New platform
Google Play and Apple App Store app data
Two app-marketplace platforms in one release: app listings, charts, and reviews from Google Play and the Apple App Store, normalized onto a single App schema.
- Improvement
TikTok Shop becomes its own platform
TikTok Shop endpoints moved out of tiktok into a dedicated tiktokshop platform with its own docs and URLs. Existing paths keep working through legacy aliases.
- New platform
Trustpilot business search and reviews
Search businesses by domain and pull their full Trustpilot review history. Two endpoints built for brand-reputation monitoring.
- New platform
TripAdvisor places and traveler reviews
Search hotels, restaurants, and attractions, then fetch traveler reviews, including translations, owner responses, and rating histograms.
- New platform
Google Shopping product data
Product search, product detail, and seller listings from Google Shopping, on the same commerce schema Amazon uses.
- New endpoints
Amazon products, reviews, and sellers
The Amazon platform grew from a single storefront endpoint to five: product search, product detail by ASIN, review history, and seller listings, all on the same canonical commerce schema as Google Shopping.
- New endpoints
Pinterest URL save counts
Check how many times any URL has been saved across Pinterest, up to 10 URLs per call, with exact-URL semantics.
- New feature
SocialCrawl vs Apify comparison
Pricing, maintenance burden, and what a unified schema saves you. SocialCrawl and Apify compared line by line.
- New platform
May 2026
- Improvement
Universal search free on the web
Universal social search is now free on socialcrawl.dev, one search per day, no account required. The API version stays a flat 20 credits.
- New feature
MCP server live on npm and the MCP Registry
socialcrawl-mcp v1.3.0 mirrors the full API catalog, and one npx command brings SocialCrawl into Claude Desktop, Cursor, Windsurf, and any other MCP client.
April 2026
- New feature
- New feature
SocialCrawl vs SociaVault comparison
Our first comparison page: SocialCrawl and SociaVault side by side on features, pricing, and data coverage.
- New feature
Free Reddit marketing tool
A free AI tool that finds the subreddits and threads where your product actually fits. No signup needed.
