100 free credits. No credit card required.Start building
Logo
Changelog

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

  1. Improvement

    search/everywhere returns only new rows with since

    Pass the time of your last poll as since and items keeps only the rows published after it. Rows with no date are kept, and data.since counts what was dropped. The call still costs 20 credits.

  2. Improvement

    prism/profile/comments charges only for posts with new comments

    With since, a post whose comments are all older now costs nothing. Before, one new comment billed the comment page of every post scanned. posts[].credits shows what each post cost.

  3. Improvement

    Facebook replies name the comment they answer

    Rows from facebook/post/comment/replies now carry comment.parent_id, as TikTok and YouTube replies do. A cut or expired expansion_token returns an empty list, so an empty page now carries stale_expansion_token in _warnings with the token's issue time and length.

  4. New endpoints

    See credits per API key with /v1/credits/usage

    GET /v1/credits/usage returns 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.

  5. Improvement

    TikTok covers and photo slides open in every browser

    On tiktok/profile/videos, tiktok/post and tiktok/search, content.thumbnail_url and the photo slides in content.media_urls came 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.

  6. 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/profile returns the app's counts by default. Add counts=web to get the website's (statsV2) instead; it still costs 1 credit. author.ext.counts_source shows which set you received.

  7. New feature

    Drop AI-style posts from post lists with label=ai_style

    Add label=ai_style&exclude=ai_style to a post list such as twitter/search/tweets or linkedin/search/posts, and posts with two or more AI-style writing patterns are dropped, with their ids in data.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.

  8. New feature

    Discover runs on a schedule, sends events when a run finishes, and looks further on a finished run

    POST /v1/prism/discover takes a schedule and runs the same request again every 1h, 6h, 12h, 1d, 7d or 30d. Each run delivers only rows earlier runs did not, and max_credits_per_run and max_credits_per_month cap what it spends. Background runs now write events: discover.progress while they work, one of discover.completed, discover.partial, discover.paused or discover.failed when they settle, and discover.new_rows when a scheduled run finds rows. Read them with GET /v1/events, or register a URL once with POST /v1/webhook-endpoints and every run on the account posts its events there, signed. POST /v1/prism/discover/runs/{run_id}/more continues a completed run under the same run_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.

  9. New endpoints

    Discover: search many platforms in one call, judge every row, or get the accounts behind a topic

    GET /v1/prism/discover searches 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 a context question and drops rows about something else, and removes duplicates across platforms. A small request answers in the call. A large one, or POST /v1/prism/discover with a long keyword list, continues in the background and answers 202 with a run you follow at data.next.status_url and download as JSONL. view=accounts returns 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=communities returns the subreddits, groups and channels where a topic lives, and view=items the 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=true lists every search and the estimate free, max_credits caps what a run spends, and each search bills its own platform's page price.

  10. New endpoints

    Instagram creator country, the song behind a TikTok sound, and transcripts in the video's own language

    New GET /v1/instagram/profile/country returns the country a creator lists on Instagram, for 1 credit. Send include=country on search/reels, search/hashtag or location/posts and 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/reels now takes ZA, NG and KE as region or country, and instagram/location/posts moves later pages to a second source when the first fails. Every TikTok video row carries post.ext.matched_song_id with the song's title and artist, so different "original sound" uploads of one track group together, and tiktok/song/videos rows carry their region. YouTube, X and prism/profiles rows gain the author's country or location. youtube/video/transcript returns the video's own audio language where it used to return an auto-dub on some videos, and TikTok transcripts carry transcript_format. YouTube trending takes category names, Google Play rows carry app.rank, Google Trends rising queries carry is_breakout, and Pinterest search drops empty cards. Other prices are unchanged.

  11. New endpoints

    Hashtag and mention search on Instagram, TikTok, X and Facebook

    Six new endpoints. GET /v1/twitter/search/hashtag and GET /v1/facebook/search/hashtag join 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 #tractor leaves out #tractorlife and posts that only say tractor, and match_kind says how each row matched. Mention results leave out the account's own posts unless you send include_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, so name sets the name to look for. All six take since, until and cursor, and data.legs lists 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/hashtag and tiktok/hashtag also gained a backup source that answers with the same fields and cursor when the main sources fail.

  12. 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/everywhere now 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 in sources_failed with 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-search now 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.

  13. 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/comments and reddit/post/comments/replies refused 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/comments used 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 in data._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.

  14. Improvement

    Instagram: a further backup source on 22 endpoints, one consistent views figure, and exact stop_at_id matching

    22 Instagram endpoints, from profile and profile/posts to followers, stories, post/comments and location/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 four highlight/detail calls came back as a refunded 404 for highlights that exist; since the deploy every call has returned the highlight, currently at 0 credits. A followers or following page served by the backup carries data.truncated: true when the walk may be incomplete. Every Instagram post row now also carries ext.instagram_views and, where a reel is cross-posted to Facebook, ext.facebook_views. engagement.views keeps each endpoint's established meaning (on profile/reels, audio/reels, search/reels and search/hashtag it can include the Facebook views), so ext.instagram_views is the figure to compare one post across endpoints: on reel DYGo-RqBzLE, 3,008 combined against 2,313 on Instagram. stop_at_id on 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/post now fills media_urls with the image on posts with a single image; thumbnail_url is unchanged. GET /v1/instagram/basic-profile now 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.

  15. 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/product moved the product one level down in its response, so every live US product came back as a refunded 404 RESOURCE_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 as shop.tiktok.com/us/pdp/<slug>/<id> and shop.tiktok.com/us/store/<name>/<id>, are now accepted on tiktokshop/product and tiktokshop/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=details adds the description, brand, specifications, shipping (free shipping, fee and delivery estimate) and the official-shop label shop_identity for 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, and include=details returned its description, brand and shipping for 4 credits. The plain lookup is still 1 credit.

  16. Improvement

    Reddit profile, posts and comments lookups get backup sources, and Prism composites now use them

    On 16/10/2026 GET /v1/reddit/profile timed out with a 504 on every call from 09:54 UTC, and reddit/profile/posts and reddit/profile/comments timed out on their documented examples: reddit/profile had 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, and reddit/profile now waits at most 8 seconds before switching. One limit: a profile/comments call with before has no backup, because the backup cannot filter by date. Prism composites that call another endpoint as one of their sources, such as reddit/post/comments inside prism/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/profile returned 200 for 1 credit, and profile/posts and profile/comments returned their examples. Prices are unchanged.

  17. Improvement

    Instagram user/embed returns the profile and an embed snippet, and an expired story is no longer billed

    GET /v1/instagram/user/embed had 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, plus author.ext.embed_html (Instagram's own embed snippet for the profile) and author.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/download charged 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/embed for the documented example, instagram, returned the profile at 1 credit. Prices are unchanged.

  18. Improvement

    LinkedIn company people and three profile sections answer through rate limits

    In the week to 16/10/2026, GET /v1/linkedin/company/people answered 64 of 79 calls with a 503 saying LinkedIn was momentarily rate-limited, and profile/volunteers, profile/certifications and profile/recommendations failed the same way. Each now has a backup source that answers with the same row fields when the first source is rate limited, and data._warnings says when the backup answered. On company/people the backup serves the first page; a later page still answers 503 with Retry-After. On profile/recommendations the backup serves the first page of received recommendations, and type=given and later pages stay on the first source. Checked on production on 16/10/2026: company/people returned 10 rows for 10 credits, and the three profile sections answered 200. Prices are unchanged.

  19. 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/page had 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 under author.ext.links (id, type, title, url, clicks, order). Etsy changed the layout of its listing data, so GET /v1/etsy/product answered 404, etsy/product/similar returned no rows and etsy/shop/products returned an empty list. All three read the new layout, and etsy/shop/products now returns next_cursor when limit is below 36. Similar-product rows no longer carry a quantity, so product.ext.available_quantity is null there. GET /v1/klarna/product had 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.description is null, and a data._warnings line says so. GET /v1/github/repo/top-issues answered 502 for a repository that had been renamed, such as facebook/react. It now follows the rename, a repository that does not exist is a 404, and top_issues on repo/dossier is no longer null for a renamed repository. Checked on production on 16/10/2026: all four lanes served their documented examples. Prices are unchanged.

  20. Improvement

    Prism product reviews, review integrity and employer brand finish inside the time limit

    GET /v1/prism/product-reviews and GET /v1/prism/review-integrity sent 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 in legs[] as a 504, and the answer keeps everything that arrived in time. GET /v1/prism/employer-brand ran 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.

  21. 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/search can return a slightly different price.current for the same product on each call, and price.original appears only when that session was offered a promotion. US prices are the same on every call. Every search for a region other than US now carries a data._warnings line starting session_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 of price.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 with discount_percent. Malaysia, Japan, Thailand and Indonesia rows now name MYR, JPY, THB and IDR where price.currency was null. Checked on production on 16/10/2026: Germany returned euros with the session_priced line for 1 credit, and the cached repeat kept the line at 0 credits. The price is still 1 credit a page.

  22. Improvement

    Cross-platform search takes an end date, and each platform searches inside your window

    GET /v1/search/multi now accepts until alongside since, so one call can ask for a calendar month. until used 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 gets since: and until: in the query, Facebook and Threads get start_date and end_date, and TikTok, YouTube and Reddit get the narrowest of their own date ranges that still reaches since. A filter you set yourself, such as reddit.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 sent since now get these filters too, so they can return different rows than before. The new data.window block shows what each platform was sent and how many of its rows fell outside the window, and _warnings says 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.

  23. Improvement

    TikTok search with a limit of 30 or less now costs 1 credit, down from 10

    GET /v1/tiktok/search with any limit used to switch to a bulk collection path that cost 10 credits for limit=10 and returned the same 30 rows as the plain 1-credit page, with no cursor. A limit of 30 or less now returns the plain page cut to limit rows, at 1 credit, and keeps next_cursor. A _warnings line says the cursor continues after the whole 30-row page, so the rows that were cut are skipped. A limit above 30 still collects more rows in one call at its existing price (17 credits for 60, 32 for 120), and GET /v1/utility/estimate quotes the same numbers. Checked on production on 14/10/2026: limit=10 returned 10 rows and a cursor for 1 credit.

  24. Improvement

    Brand mentions: the digest now reports the window you asked for

    GET /v1/prism/brand-mentions with include=digest wrote 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 for date_from to date_to and 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 _warnings says digest_rewritten. Two things are new in the response: computed.windowed_sentiment_breakdown, and requested_from and requested_to under computed.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.

  25. Improvement

    Instagram: hashtag lookups share a cache across capitalisation, and keyword searches point to reels

    GET /v1/instagram/search/hashtag now treats Aruba and aruba as 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 no limit or max_items. For posts about a topic, GET /v1/utility/find now ranks instagram/search/reels (1 credit a page, with view counts) above the hashtag lane when the task names Instagram. GET /v1/instagram/search matches account, hashtag and place names, and its no-match 404 now says so and points to instagram/search/reels?query=. Checked on production on 14/10/2026: Aruba cost 5 credits, then aruba returned the same 28 posts from the cache for 0.

  26. 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 is keyword, now accepts query when keyword is not sent, and a missing-term 400 names the parameter you did send, for example "You sent term; this endpoint takes keyword". A bare GET /v1/linkedin/search, /v1/facebook/search or /v1/twitter/search still returns a free 404, now with details.retry_with holding 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 as Query:, Search: or Keywords: has the label removed before the search runs, with a _warnings line, and search operators such as subreddit: are left alone. A fields= path that matches nothing now suggests the real one, for example post.content.text for post.caption and post.engagement.likes for post.likes_count, and when every path is unknown the warning points to GET /v1/utility/endpoint?url= for the endpoint's fields. Checked on production on 14/10/2026. All of these are free.

  27. Improvement

    Amazon reviews return again, on every marketplace including the US

    GET /v1/amazon/reviews calls that came back as a refunded timeout or an empty 404 from 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.id is Amazon's own review id, the same one as before, so reviews you stored still match. All 13 marketplaces in country work, 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_url is now null. Mexico (MX) sometimes answers a refunded 404 for a listed product, and a retry usually returns the reviews. A product with no reviews, or an ASIN that does not exist, is refunded.

  28. 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/transcript and GET /v1/tiktok/post/transcript with use_ai_as_fallback=true now 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 400 INVALID_REQUEST with error.details.reason: video_too_long, max_seconds and, when known, duration_seconds, at 0 credits. A final no-transcript answer such as video_too_long, no_speech or no_captions is cached for an hour, so a repeat of the same URL comes back at once and still costs 0 credits. On Facebook, post_id is 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.

  29. Improvement

    TikTok similar accounts now returns accounts for many creators that used to come back empty

    GET /v1/tiktok/similar calls 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 carry author.ext.similar_source set to tiktok_graph and author.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.

  30. 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/shorts and /channel/lives now return each video's title in post.content.text as 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 with computed.language: en. The free per-video lookup that already returns exact dates now also returns the original title, and on channel/videos the original description, and computed.language follows the title. A row whose title could not be checked carries post.ext.title_maybe_translated: true, and exact_dates=false skips 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/lives on 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.

  31. Improvement

    Instagram reel search now says on the response when country added the creator lookups

    GET /v1/instagram/search/reels with country keeps 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 as include=creator at 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. A country call sent without include now carries data.hydration.implied_by: "country", and data.hydration.extra_credits is the lookups' share of credits_used. The price line and the country description now lead with "up to 61". region alone still localises a search for 1 credit a page. Checked on production on 10/10/2026: a country=KR call carried implied_by at 61 credits, and a plain include=creator call did not carry it.

  32. Improvement

    utility/find and utility/plan leave out search values no search should run on

    GET /v1/utility/find and GET /v1/utility/plan fill a search parameter such as query or keywords from 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 under missing, and under ask on a plan, with a note saying why. A Korean keyword on Naver, or a brand in Latin letters such as miraDry, is kept. A request that lists several topics carries topics, and plan runs each search step once per topic and prices the job for all of them. A request that names several markets carries markets as ISO codes and is uncertain. The recipe catalogue gains korea-community-research (KnowledgeiN, Naver Cafe and blog posts at 100 a page, twelve months of search interest and Korean-language YouTube videos), and korea-consumer-pulse now reads KnowledgeiN. Both endpoints stay free.

  33. Improvement

    web/extract now returns null for values the page does not state

    GET /v1/web/extract now 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 new data.page.extraction_check.removed lists each nulled field with its old value and the reason, placeholder or not_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 in extraction_check.unverified and _warnings. The price stays 5 credits a page.

  34. Improvement

    Naver KnowledgeiN and web-document rows carry the post object, and KnowledgeiN can return one row per question

    /v1/naver/kin/search and /v1/naver/webkr/search rows keep title, link and description and now also carry post and computed, as blog, cafe and news rows do, with Naver's <b> tags removed from post.ext.title and post.content.text. KnowledgeiN rows name their question and answer in post.ext.question_id and post.ext.answer_no. Naver returns one KnowledgeiN row per answer, and group=question keeps one row per question with answers_on_page. Paging and the 1-credit price are unchanged.

  35. Improvement

    Reddit post comments now say how many comments the response holds

    /v1/reddit/post/comments returns a tree. items[] holds the top-level comments and each reply sits under its parent's comment.replies[], so items.length undercounts a thread. The new data.comments_returned counts every comment in the response, replies included. /v1/prism/comments on a Reddit link no longer returns blank rows for removed comments.

  36. Improvement

    web/scrape no longer charges for block pages, CAPTCHAs and sign-in walls

    When a site answers /v1/web/scrape with its own error or block page (HTTP 400 or more), the page still comes back with page.status_code and page.page_state saying what it is, but credits_used is 0 and data._warnings says 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 as page_state.value: "empty_shell" at no charge. proxy=auto and proxy=enhanced now read the page live unless you set max_age, and a cached copy of a failed page is fetched again instead of being served. proxy=auto, proxy=enhanced and pdf_parse=true hold 5 credits and settle to what the fetch used, so a page a plain request could read costs 1.

  37. 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/tweets used 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/replies used to stop after two pages and now continues to the end of the thread. GET /v1/twitter/user/tweets used 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 with sort=top keep paging on the main source only, because their order is not by date. Measured on 09/10/2026: nike returned 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 until has_more is false now runs further and costs 1 credit for each extra page; send since with a date to stop it where you need, or max_pages on keyword search.

  38. 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-volume a row with search_volume: null now carries null_reason: withheld when Google withholds the keyword, no_data when Google holds no figure at all. A withheld row also carries last_reported, the last month Google published a volume ("shingles" in the US: 673,000 in November 2023), and its monthly_searches is 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, use GET /v1/google_trends/explore, or GET /v1/naver/search-trend in Korea. The price is unchanged.

  39. New feature

    Korean topics across platforms: Naver in universal search and audience questions

    GET /v1/search/everywhere has a new source, naver: Naver blog, cafe and KnowledgeiN search in one lane. It runs by default when the query contains Hangul, and on any query with sources=naver; each Naver row carries its corpus in metadata.corpus. GET /v1/prism/audience-questions takes naver in platforms to read KnowledgeiN, Korea's question site, and a topic written in Hangul now defaults to naver,youtube, because Reddit's search returned unrelated threads for Korean terms. On 다한증 (hyperhidrosis) it returned 82 KnowledgeiN questions, each counted once however many answers it has. For a Korean brand or name, GET /v1/utility/estimate now says before a prism/brand-mentions or prism/mentions call that their sources hold little Korean, and names the Naver searches that do. Universal-search YouTube rows dated from a month or year label ("3 years ago") are now date_confidence: "low". Two new recipes, korea-site-research and korea-clinic-prices, show how to read posts on a named Korean community with a site: search and how to find public prices for a treatment. Prices are unchanged.

  40. Improvement

    TikTok similar accounts no longer lists an unrelated account when TikTok suggests none

    When TikTok had no similar-account suggestions for a creator, GET /v1/tiktok/similar returned one unrelated account and charged 5 credits for it, and the same account could also appear at the end of a short list. That row is now removed. A creator with no TikTok suggestions now gets the fallback list instead, built from the accounts Instagram suggests for the same creator and matched to TikTok, and when that is empty too the call costs 0 credits. Lists cached before the fix are no longer served.

  41. Improvement

    Date windows now hold on YouTube lists and on searches whose own date filter leaks

    On YouTube lists, since and until now 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, so publish_time=yesterday on GET /v1/youtube/search/hashtag could return a video from January. On GET /v1/facebook/search/posts, GET /v1/facebook/search/videos, GET /v1/threads/search and GET /v1/youtube/search/advanced, a start or end date you send (start_date, published_after and 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.

  42. 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 since and until: 150 lists of comments, replies, reviews, posts and news across every platform. Send a day as YYYY-MM-DD or a full timestamp; rows published before since or after until are left off each page, and a bare until day includes that whole day. On 23 lists that can be read newest first, since sets that sort and ends the walk at your date with pagination.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_date and from_date act as since, published_before, end_date and to_date as until, and publish_time=yesterday or max_age_days=730 become a since that 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.

  43. Improvement

    Language tags now cover Hindi, Bengali, Tamil, Telugu and six more Indian languages

    computed.language on 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 "எனக்கு பிடித்த பாடல்" reads ta where it used to read null. Marathi and Nepali share the Devanagari script with Hindi and are tagged hi. Hindi typed in Latin letters is still null. The field is filled on every call at no extra cost.

  44. New platform

    Economy data: household and travel spending, US federal spending and contracts, and what US companies import

    A new economy platform with five endpoints. GET /v1/economy/consumer-spend returns yearly household spending per country and category (food, housing, transport, restaurants_hotels, insurance_financial and the other COICOP divisions, plus total) 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, which source_note names. GET /v1/economy/tourism-spend splits 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-spend adds 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-contracts returns the awards behind it, purchase orders included, with the real match count in data.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, in matches, 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.

  45. 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=TGT returns revenue, cost of goods sold, gross profit, inventory, inventory change and accounts payable from SEC filings, newest first, quarterly by default or yearly with period=annual, up to 40 periods (limit 1 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=GB returns 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&regions=US,GB,MY adds 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, and dry_run=true quotes 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.

  46. Improvement

    Amazon search rows carry the monthly purchase count in every marketplace

    GET /v1/amazon/product-search now carries Amazon's monthly purchase badge on each row that shows one: product.ext.bought_past_month_label as Amazon wrote it, and product.ext.bought_past_month as 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 with depth carry the number without the label. Multiplied by price.current, it gives monthly spend per product and marketplace. The price of the call is unchanged.

  47. Improvement

    Facebook ads that ran in the EU carry their reach by country, age band and gender

    GET /v1/facebook/adlibrary/ad now returns, for an ad that ran in the EU, post.ext.ad.eu_total_reach and post.ext.ad.eu_reach_breakdown: each EU country with its reach split into age bands from 18-24 to 65+ by male, female and unknown. target_ages, target_gender and target_locations show 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=audience on GET /v1/facebook/adlibrary/company/ads adds 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 a hydration block with the rows, lookups, credits and time.

  48. Improvement

    Cached multi-platform searches report 0 credits, and dry_run quotes their real maximum

    A repeat of GET /v1/search/multi or GET /v1/tiktokshop/sales served from cache now reports what it cost: data.credits_charged and each platform's or market's credits read 0, each request_id reads null, and data.cached_page is true. Before, a cached repeat showed the charges and request ids of the call that filled the cache. The first call is unchanged. dry_run=1 on both now quotes expected_max as each platform or market priced as its own call, so search/multi over three platforms quotes 3 and tiktokshop/sales over eight markets quotes 8; hold stays 0 because each leg bills itself. On any include= join served from cache, data.hydration.credits_held now reads 0. The data in each response and the price of each call are unchanged.

  49. 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 carry author.ext.similar_source set to instagram and author.ext.instagram_username. author.location is null on this endpoint; GET /v1/tiktok/profile returns the region for a single account.

  50. 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/comments and reddit/profile/posts have one for the first page in the default order, and GET /v1/reddit/post now 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/comments and tiktok/profile/videos keep 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/trending returns the 30-track chart again, at 5 credits. Every 200 carries data.fetched_at, when the chart was read from Instagram, and data.stale, which is false for a live chart and true when Instagram did not return the chart on the call and the last good chart, at most 6 hours old, is served instead. search/everywhere with Instagram returns reels for multi-word queries. tiktokshop/product for SG, MY, TH, VN and PH is served by a new source. The first page of twitter/search/users has a second source, and twitter/search/tweets hands over to its second source on the first rate limit. A google/business/info lookup by keyword is answered by a new first source with the previous one behind it, still at 1 credit, and a cid or place_id lookup is unchanged. A keyword with a Polish postcode or Polish letters, sent without location_name, is searched in Poland instead of New York, and a location_name you send always wins. google_news/search answers Tamil, Telugu, Malayalam, Marathi, Gujarati, Kannada, Punjabi and Urdu with India, google_play/app-info and app_store/app-info reach their second source after a timeout on the first, and prism/reputation with a business name now gets the Google place and its reviews. web/scrape tries a second scraper on a page the first refuses, and /v1/tavily/extract has 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 leaves ext.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_language and author.avatar_url null, while ext.subreddit stays filled. A rescued Reddit posts page leaves author.avatar_url and ext.content_language null, and a rescued Reddit page carries no next cursor. A Google keyword lookup leaves place.ext.attributes, ext.people_also_search and ext.status null. The price of each call is unchanged.

  51. Improvement

    Clearer answers for an empty universal search, an unreadable page, a pasted handle and a subreddit sent as a user

    GET /v1/search/everywhere with no results anywhere now returns 200 with items: [] at 0 credits, where it used to answer 502 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/scrape answers 404 RESOURCE_NOT_FOUND at 0 credits with details.reason: "site_not_supported" and retry_will_succeed: false, in place of a retryable 502, and for a Facebook, Instagram, Reddit, TikTok, YouTube, X, LinkedIn or Threads link, details.suggestion names our endpoint for it. Instagram and TikTok handles with paste noise are accepted on instagram/profile, profile/posts and the other Instagram handle endpoints, and on tiktok/profile and profile/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 as N/A stay a free 400. A subreddit sent to reddit/profile gets 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 whose handle is a profile URL is accepted by POST /v1/monitors and runs, and a failed run's skip_reason names the HTTP status and error code, for example "Run failed with HTTP 400 INVALID_REQUEST. ... not charged." instagram/search/popular answers its 404 at 0 credits without a second lookup when Instagram has no popular page for the query. tiktokshop/product for GB and ID answers at once with 503 SERVICE_UNAVAILABLE, Retry-After: 3600 and 0 credits, with a message naming the markets that are served, where it used to answer 504. US is unchanged.

  52. 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 with limit above 50 is now metered at 2 credits per post returned. It holds limit x 2 up front (200 at the maximum limit of 100) and refunds down to the posts that came back, never below 5, so a member with 60 posts costs 120 credits whatever limit was. Before, every call cost 5 credits. A call with no limit, or with limit at 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/posts is now answered from a second source where it used to return 503, with the same posts, order, ids and counts. profile/stats has a second source too, at the same 5 credits, and so does profile/skills. A row served by the second source at limit 50 or below can lack a company author's follower count (post.ext.author_followers), and a video post on a call above 50 can lack content.duration_seconds.

  53. New feature

    Instagram reel search by market, with each creator's country, followers and contact in one call

    GET /v1/instagram/search/reels takes 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 (fitness becomes fitness españa), and data.region.query_sent shows exactly what ran, at no extra cost. include=creator adds each reel's creator card from the About this account panel: post.ext.author_country, author_followers, author_following, author_posts_count, author_public_email and author_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. country keeps only the reels whose creator declares that market, adds the creator card, and reports what it dropped in data.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_pages used 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.

  54. Improvement

    Monitors refuse params the endpoint would refuse, and an empty page is not charged

    POST /v1/monitors now 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 marked failed with a skip_reason, refunded in full, and its total of 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

  1. Improvement

    Instagram sounds: full pages, a reel count, one id across re-uploads, and a trending flag

    GET /v1/instagram/audio/reels returned 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 and next_cursor continues the list. The first page adds data.total, the number of reels Instagram shows for the sound; data.is_trending, whether Instagram currently marks the sound as trending in Reels; and data.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 carries post.ext.audio_cluster_id, the id Instagram uses to group different uploads of one sound, and passing a cluster id as audio_id counts every upload in that cluster together. GET /v1/instagram/profile/reels carries the cluster id with include=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.

  2. 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.metrics on POST /v1/monitors is 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 on GET /v1/instagram/audio/reels tracking total, with an alert when it grows, at 2 credits a day; it covers TikTok too, with GET /v1/tiktok/song and post.engagement.views. A run on which none of the tracked numbers comes back is now not charged: it is marked failed with a skip_reason, refunded in full, and never compared with the next run, so it cannot fire an alert. Each run's legs now says which source in the endpoint's chain answered, as rung (primary or fallback) and rung_index. Checked on production on 30/09/2026: totl returned a 400 with the suggestion, total was 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.

  3. Improvement

    YouTube channel emails without false errors, and first-time addresses in one call

    GET /v1/youtube/channel/about failed some calls that should have succeeded. A channel that publishes no business email could return a 502 on every retry; it now succeeds with author.ext.public_email null 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 answers 503 SERVICE_UNAVAILABLE with Retry-After: 300 and 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.

  4. Improvement

    Home Depot: clearance labels, the right selected store, and real stock on search

    GET /v1/home_depot/search and /product now return Home Depot's markdown label as product.ext.promotion, with label (such as Clearance or Special Buys), amount_off and percent_off, and product.ext.price_note when the price is only shown in the cart. With store_id, is_selected_store now 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 read OutOfStock: availability now follows the fulfilment stock. store_id changes 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.

  5. Improvement

    Instagram profile post counts are back, and exact at any size

    author.posts_count on GET /v1/instagram/profile and /profile/full carries 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.

  6. Improvement

    Steadier X search, /v1/x/* paths, and multi-search that matches each platform

    GET /v1/twitter/search/tweets has 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/multi now 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-word reddit/search query that matches any of the words now gets a _warnings line with the quoted form, and YouTube Shorts rows in youtube/search carry the channel and author name. Checked on production on 26/09/2026.

  7. 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._warnings that names the parameter the endpoint does support, the free label= preset that does the job, or says there is no such parameter. For example, zzqx on tiktok/profile reads zzqx was ignored: GET /v1/tiktok/profile has no such parameter. An alias we accept and apply, such as username for handle, gets no line, and the request is never rewritten. A value outside a parameter's accepted set is a free 400 whose error.details carries allowed_values, one valid example, and did_you_mean for a one-letter slip (label=spma suggests spam) or for a search term sent to relevance (it suggests relevant_to). From the 100th identical rejection with a specific reason on one API key in a UTC day, details.repeated_today carries the count and the message says to change the request. There are two new meta.hint codes. comment_labels arrives after you open the comments on five or more posts from one search without label=, naming the labels every comment row already carries and prism/comments with its price, and search_repeat arrives when you run page 1 of the same search on a later visit, pointing at seen= and the date filter. A hint shows at most once per pattern per key per day and never on an error, and X-SocialCrawl-Hints: off turns hints off. All of it was checked on production on 25/09/2026.

  8. 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 brand lands on its job, and creator card on the prism/creator-card endpoint page. Checked on production on 25/09/2026.

  9. New endpoints

    Bluesky keyword search

    GET /v1/bluesky/search searches public Bluesky posts on a keyword for 1 credit and returns them in the same post shape as a user's post list. sort is latest or top, and since, until, lang and author narrow 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 with until set to the oldest published_at you received, so dedupe on post.id. Unauthenticated search is throttled per IP, so a burst can return a 503 with Retry-After and the credit is refunded. Checked on production on 23/09/2026: query=espresso&sort=latest returned 100 posts at 1 credit.

  10. New feature

    Numbers your calls already compute: sound adoption, format buckets, and switch receipts

    GET /v1/tiktok/song labels the use count it already returns: post.ext.use_count is the number of videos using the sound, with post.ext.use_count_unit videos. GET /v1/tiktok/song/videos adds data.adoption, the number of videos per day, the rows with no date, and returning when an old sound's first page is mostly the last three days; use=1 adds data.adoption.uses, a split by lip-sync, tutorial, before-and-after or a greeting-card reveal. GET /v1/tiktok/profile/videos accepts format=stationery and adds data.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 and window_too_short when it does not. switch_from= on GET /v1/search/everywhere, GET /v1/reddit/search/comments and GET /v1/twitter/search/tweets adds data.switch_receipts: the link, the verbatim quote, the reason and where the person went, with headline null rather than a percentage. Checked on production on 23/09/2026: the use count matched engagement.views with the unit videos, the histogram summed to the page, use=1 added the split, format=stationery returned a wedding bucket and an ungrouped share, and all three searches returned receipts with no headline.

  11. 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 of ready, after_approval or blocked. 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 returns uncertain with 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 under cannot. query is 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_profile for TikTok nike returned two steps at 0 credits for the plan itself, and a video prompt returned uncertain: true with no steps.

  12. Improvement

    Audience questions grouped by intent, and the creator's own email

    GET /v1/prism/audience-questions now groups on every call, and the clustering no longer needs a generative call. Each cluster's label is who, what, why, how, vs or other, each question's text is verbatim as written, and methodology_version is audience-questions-v3. The price stays 30 credits and there is no new parameter. contact_email=1 on instagram/profile, youtube/channel and youtube/channel/about adds author.ext.contact_email when the bio lists two or more addresses, choosing the creator's own rather than the first address found; public_email is 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, and contact_email=1 returned the leaf at 1 credit.

  13. New feature

    A monitor can keep the numbers you name, without a webhook

    POST /v1/monitors accepts track, 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_url is now optional when track is set. Caps follow the highest credit pack of the account: Free 3, Starter 10, Growth 25, Pro 100, Enterprise 500. A monitor without track is unchanged, and a create with neither a webhook nor track is still a 400. Checked on production on 23/09/2026: a monitor created with track and no webhook returned 201 with row_key post.id and max_rows 100, read back the same track, and deleted 204 then 404.

  14. Improvement

    Tell a renamed YouTube channel from a removed one, and a quiet Instagram account from a dead one

    GET /v1/youtube/channel on a missing handle returns 404 account_gone at 0 credits, and error.details.suggestion says to call the same endpoint again with channelId set to the UC... id you already stored. A 200 on that call means the channel was renamed and author.username is the new handle; a second 404 means it is gone. A lookup already made by channelId gets the reason and no suggestion. GET /v1/instagram/profile adds author.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-audit copies the profile leg's reason onto platforms.<platform>.evidence.profile.not_found_reason as account_gone, account_private or handle_unresolved. There is no region_blocked value. Checked on production on 23/09/2026: the stored channelId returned 200 at 1 credit, a ghost handle was 404 at 0 credits, nasa carried last_post_at 2026-09-22T15:52:05.000Z, and a private account returned the field null.

  15. New feature

    A free page that finds a creator's outlier videos

    /tools/outlier-video-finder and 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 match computed.vs_creator on those calls. Checked on https://www.socialcrawl.dev on 23/09/2026: both pages returned 200 with that locale's title. A scored run was not submitted.

  16. Improvement

    Top Instagram comments and newest TikTok comments, across a few pages

    GET /v1/instagram/post/comments accepts scan_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 with data.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/comments accepts sort=recent|top and the same scan_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 no data.scan. Checked on production on 23/09/2026: scan_pages=2 returned 16 Instagram comments, likes descending, at 10 credits; sort=recent alone returned 50 TikTok comments newest first at 1 credit; sort=recent&scan_pages=3 returned 149 comments, newest 11/05/2026, at 3 credits.

  17. Improvement

    Post lists stop at the last post you hold, and a response names the call you missed

    GET /v1/instagram/profile/posts and /reels, tiktok/profile/videos, youtube/channel/videos and /shorts, facebook/profile/posts, twitter/user/tweets and threads/user/posts accept since=<ISO date> and stop_at_id=<post id>. The walk stops at the first post older than the date, or at a post you already hold, and pagination.stopped_at says since, known_id or end so 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 carries meta.hint with the one call that would have done the job, for example three platform searches pointing at GET /v1/search/multi, or three profile lookups pointing at prism/creator-card. One hint per pattern per key per day, never on an error, and X-SocialCrawl-Hints: off silences it. Checked on production on 23/09/2026: a plain instagram/profile/posts?handle=nasa omits stopped_at, stop_at_id ended that walk at known_id at the same page price, and a TikTok search, an Instagram reels search and a YouTube search for one query carried search_multi.

  18. 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=views and max_pages (1 to 5, default 1). country and exclude_country read 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 a seen_rows ledger row. Omit the parameters, or send only max_pages=1, and the call is unchanged. Checked on production on 23/09/2026: TikTok skincare with min_views=500000&max_age_days=365&exclude_country=IN&max_pages=2 fetched 57 rows and returned 12 at 2 credits; a Reddit page of 25 repeats returned credits_used 0 and refunded 1; a YouTube page with 37 of 45 repeats stayed at 1 credit because the price rounds up; max_pages=9 was a free 400.

  19. New endpoints

    Batches with posts, one async job for thousands of ids, and multi-platform search

    POST /v1/prism/profiles with include: "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/jobs takes 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 same Idempotency-Key with the same body replays at 0 credits while a different body is a free 422. GET /v1/search/multi returns 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/everywhere is unchanged at 20 credits and stays the product that adds transcripts, clustering and judgments. Checked on production on 23/09/2026: include=posts returned TikTok and Instagram posts, one TikTok profile job held 1 and charged 1, and matcha latte on TikTok, Reddit and YouTube charged for the three platforms that returned rows.

  20. Improvement

    YouTube publish times are exact on a plain call

    youtube/search, youtube/search/hashtag, youtube/channel/videos and youtube/channel/lives return 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, and exact_dates=false keeps the old estimate, marked by post.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=false kept 14 of 14 estimates, and a channel's live tab returned 30 of 30 exact.

  21. Improvement

    Devtool pulse dossiers the tool's own repository

    GET /v1/prism/devtool-pulse without repo= used to fill dossier from the first GitHub repository whose name contained your query, or whose name your query contained. "React Native" could come back as react/react, and "SvelteKit" as a forms library. It now reads the top five and fills dossier only from the repository where the tool itself is developed. When none of them is that repository, dossier is empty and the Hacker News, Reddit and blog parts still return. Passing repo= still skips the search. The call is still 20 credits. Checked on production on 23/09/2026: "React Native" returned react/react-native at 20 credits, and "SvelteKit" returned an empty dossier at 20 credits.

  22. New platform

    Product Hunt launches and Xiaohongshu notes

    GET /v1/producthunt/launches returns the public launch list, about 50 products, at 1 credit. Pass topic as a slug such as artificial-intelligence. A topic we do not recognise returns no launches, names the slug in data._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/posts and post/comments read Xiaohongshu on the same key and the same post shape. Search rows and a creator's notes carry a short summary, with post.ext.text_truncated true. 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-intelligence returned 50 launches at 1 credit, and a one-note search returned a truncated summary at 5 credits.

  23. New endpoints

    Find public Facebook groups, and see who mentioned a handle

    GET /v1/facebook/search/groups finds public groups for a keyword. Each row is one group, and author.ext.search_hit.match says whether the hit was the group page or a post inside it. The group URL is the one facebook/group and facebook/group/posts already take. A page is 1 credit. include=details fills the member count and privacy on that same call, 1 extra credit for each group that comes back filled. GET /v1/prism/mentions returns the first page of posts and comments that actually contain the handle or the link. Pass handle or url. 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 in not_covered and are not called. Checked on production on 23/09/2026: vintage cars returned 10 groups at 1 credit, and with details filled members and privacy on all 10 at 11 credits. handle=nasa on X kept 19 mentions at 1 credit.

  24. 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/transcript and GET /v1/tiktok/post/transcript take q, a question of up to 300 characters. The response adds data.moments: each entry has kind answers_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, or q sent together with moments is rejected before the transcript is fetched and costs nothing. The question adds no credits. On TikTok the transcript is one caption file, and moments now 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, and data._warnings names both handles as resolved_to_different_handle. This covers include=profile on TikTok and Threads user search and on Instagram similar accounts, include=about on Instagram profile search, and include=channel on 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.

  25. New endpoints

    A country trend board, with no keyword to start from

    GET /v1/prism/trend-board?country_code=DE returns 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. period is 7 or 30. limit is 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 with limit=3: 2 breakout posts, 3 sounds, 3 hashtags and 3 searches, every source answered, 30 credits, not from cache.

  26. Improvement

    A search past its last page says so, and endpoint guides show how often each field is filled

    GET /v1/instagram/search/reels with date_posted set stops at page 11. Page 12 is a 400 with error.details.reason of page_limit, the last page, the page you asked for, and the parameters that reach a different set of reels. Credits are refunded, and error.retryable is false. A 402 for a low balance now says that sending the same request again will not succeed until the balance changes, and threads/search says when the quoted credits are a ceiling you can lower with a smaller limit or expand=false. GET /v1/utility/endpoint adds quality: 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.

  27. Improvement

    YouTube contact emails now come back with the channel biography and links

    GET /v1/youtube/channel/about returns the address behind the About tab's View email address control as author.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 with public_email null 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.

  28. Improvement

    A LinkedIn member's entire profile in one call, and no charge for a member who does not exist

    GET /v1/linkedin/profile/all returns a member's whole public profile in one call for 5 credits. author is the same object /v1/linkedin/profile returns, with the follower and connection counts filled, plus verified and the date the account was created. background carries 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.interests arrives split into Top Voices, companies, groups, schools and newsletters, and similar_profiles carries 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_totals gives 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 with section_totals. author.ext.followers_approximate is true when the follower count came back rounded; /v1/linkedin/profile returns the exact integer. background.skills[].endorsements_is_floor is true when LinkedIn published a 99+ style label, so the number is a minimum. background.given_recommendations is not on this call; /v1/linkedin/profile/complete still carries those. Separately, a member who does not exist is now a 404 for 0 credits on /v1/linkedin/profile, /profile/experiences, /profile/educations and /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 takes urls, 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.

  29. 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=200 returns 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. Without limit the endpoint is unchanged: 10 posts, 5 credits, the same cursor. limit cannot be combined with page or cursor, and anything outside 1 to 200 is refused before billing. Separately, GET /v1/linkedin/profile/complete now returns the member as the same author object /v1/linkedin/profile returns, plus background with 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-posts adds follower and connection counts and the member's recent posts in the /v1/linkedin/profile/posts shape. Both are 10 credits, in place of five separate calls.

  30. 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=1 returns the credit range and fetches nothing: data.estimate reports 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 with label=, 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=quality on 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_bait drops the bait and lists the ids. label=injection flags 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=goal with goal= 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 in data.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/posts still 404s for nothing, and now suggests /v1/instagram/profile/posts.

  31. 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/everywhere returns each post's stance, counted in data.stance_split with the ids behind every count, and its relevance; search/forums scores each thread's relevance; search/news groups the articles about the same event into data.stories; search/creators says 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.labels and data.relevance report what ran, and a row not judged in time is null and filled on your next call. Credits are unchanged, and judgments=off (or label=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=filter against your own query is free, and brief= on creator search adds 2 credits. New: GET /v1/prism/comment-leads finds buyers in the comments of the TikTok posts worth opening, and GET /v1/prism/adverse-screen flags 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-reviews and apps-lookup now 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-questions now counts questions written without a question mark, Korean ones included, so its counts change.

  32. 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/leads ranks real buyers first, drops posts about a different product that shares your name, lists their ids, and accepts offer= 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-visibility reports 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-mentions labels each mention for whether it is about your brand, its sentiment and aspect, and whether the author used the product. prism/share-of-voice publishes 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-card with verify=true says whether each account found is the same creator and shows the evidence behind it. prism/creator-vet adds a brand-safety check, the share of generic comments, news coverage, and a count of negative news. prism/app-reviews, prism/product-reviews and prism/reputation file each review into a theme and count the themes exactly, up to 600 reviews instead of 120. prism/handle-audit with relevant_to= adds how much of an account is about your topic, next to the existing score. prism/voice and prism/devtool-pulse publish the tone mix behind their label, prism/answers scores how far the engines agree on each question and explains only the pairs that disagree, and prism/employer-brand breaks its score down by category.

  33. New feature

    Cohorts can match posts by topic, not only by keyword

    POST /v1/cohorts/{cohortId}/queries now takes topics and match. topics is one to ten topics, each with an id you choose and a sentence describing it in your own words. match is keywords (the default), topics to keep only the keyword matches that are genuinely about one of your topics, or both. Every result gains matched_topics with the ids that matched and a mention_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 word apple.

  34. 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.com returns the same record /v1/linkedin/company returns, with the numeric author.id the other company calls take; /v1/linkedin/search/companies searches company pages with size, industry, location and has-jobs filters; company/also-viewed and company/employees-count round it out. People and jobs: profile/similar, profile/activity, profile/interests/schools, /newsletters and /top-voices, profile/position-skills, profile/top-position, search/people/by-url, and job/hiring-team for the people on a posting (many postings publish none, which is an empty list). Pulse: profile/articles, article with the author, date, engagement and full text, plus article/comments and article/reactions. post/with-comments packs a post with its comments. profile/about adds is_verified when 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.

  35. Improvement

    TikTok video search returns the country on every row, and up to 120 videos in one call

    GET /v1/tiktok/search and /v1/tiktok/search/top now carry post.ext.region on 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 with cursor. Filter that field to keep one country; the region query parameter still only sets where the search runs from and does not filter. The creator is on every row as post.author.username and post.ext.author_followers, so a filtered page gives a creator list for that country. For a bigger batch in one call, add limit from 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. Omit limit and the call is the 1-credit page as before. This is not country= on /v1/tiktok/search/users, which returns only creators whose account region matches.

  36. Improvement

    Instagram profile search can fill account country, join month, and public contact

    GET /v1/instagram/search/profiles?include=about still starts from the same keyword page, then fills author.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=12 buys the page. Omit include and 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/location then /v1/instagram/location/posts. An unrecognised include value is a 400 and is not billed.

  37. 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/pages already does. About 7 people a page, 1 credit. Forward pagination.next_cursor as cursor. Omit location_uid and 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/locations resource.

  38. Improvement

    Creator search can add YouTube, X, and Facebook people when you ask

    GET /v1/search/creators is still TikTok, Threads and Instagram fused and ranked the same way, still 10 credits, when you omit sources. Pass sources=youtube, twitter or facebook (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 a country= 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.

  39. Improvement

    TikTok user search can filter by the creator's country

    GET /v1/tiktok/search/users now accepts country as 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 and author.location already on the row. Default 8 results, at most 20 with limit. 5 credits per creator returned; unused slots are refunded. A code we do not accept is a 400 and is not billed. Omit country and the global 1-credit page is unchanged.

  40. 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/reviews was dropping review photos even when they were visible on the shop. A photo URL that arrives as a string now stays in review.images. A review with no photo still returns an empty array, which matches the shop. GET /v1/tiktokshop/search prices 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.

  41. 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=stats returns 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 at post.ext.music_id with the track title and artist for original sounds and licensed music alike. That id is the one GET /v1/instagram/audio/reels takes, 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=audio on profile/posts and profile/reels fills the sound on every video row on a page at 1 credit per video filled, with photos and carousels adding nothing. Every post row on profile/posts, profile/reels and post/stats now carries post.ext.media_type as image, video or carousel, a carousel its post.ext.carousel_count, and a reel its post.ext.remix_count. exclude_pinned=true leaves pinned posts out of a profile/posts or profile/reels page, and recent_days=N keeps 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/stats on a reel now returns the save and repost counts whenever Instagram's response includes them, and include=saves stays 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.

  42. 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 under images and all of them together under texts, 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.

  43. 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-stats takes 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 single GET /v1/instagram/post/stats stays at 5. The batch accepts the post links profile/posts returns, 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 back not_found at 0 credits and is refunded, where before it was billed with an all-null block. reposts joins the engagement fields on every row, and reels carry the save count.

  44. 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 followers or following used 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=full is 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/likers returns 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 on stories and the author on post/stats and tagged. profile/about has 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.

  45. Improvement

    Eleven Instagram endpoints gained a second source, and four of them had none at all

    tagged, similar, audio/reels and highlights had 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/comments and search/hashtag gained 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 carrying region, download_media, sort=recent on comments, or type=recent or type=clips on 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=saves settles at 5 credits instead of 9 whenever the save and repost counts are already on the response, which is often the case on reels.

  46. 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/popular and GET /v1/tiktok/videos/popular now 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. industry picks one of the 15 industries, and industry=all reads all 16 boards in one call and returns each hashtag once, with post.ext.trend.boards listing 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 and industry=all holds 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, so GET /v1/tiktok/songs/popular stays withdrawn; the creator board reads as coming soon on TikTok, so GET /v1/tiktok/creators/popular is withdrawn until it is published.

  47. Improvement

    Instagram posts at a place now page back through its history, and the music chart returns a real chart

    GET /v1/instagram/location/posts used to stop after one page of about 60 posts, which at a busy place covered a day or two. Each response now carries pagination.next_cursor, and passing it back as cursor returns the next, older page, about 60 posts at a time and 5 credits a page, until has_more is 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 its published_at shows the real publish time; to collect a time window, keep paging until a whole page is older than its start and filter on published_at. A malformed cursor is rejected before anything is charged. GET /v1/instagram/music/trending now 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.

  48. Improvement

    Content analysis filters now narrow the summary, sentiment, rating and trend endpoints

    filters on GET /v1/content_analysis/summary, /sentiment, /rating-distribution, /phrase-trends and /category-trends was 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/search always applied it and is unchanged. Parameters, response shape and prices are the same as before.

  49. 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/posts returns each post's text, reaction counts, comment count, media and publish time, and left post.engagement.shares null 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. Add include=engagement and 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/photos takes include=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, so engagement.views stays null. GET /v1/facebook/profile/events and GET /v1/facebook/events take 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, so engagement.views carries the interested count and engagement.likes the going count, with the same numbers under their own names on post.ext.event.interested_count and going_count, and published_at on 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 no include, 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 with include=details. Every joined response carries a data.hydration block 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 unrecognised include value is rejected before anything is charged.

  50. 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/search returned each pin's permalink, image, author and date, and nothing else: the search surface carries no counts of any kind, so post.engagement.saves, .likes (reactions), .comments and .shares were all null even though the documentation promised save counts. Add include=engagement and every row is joined to the per-pin lookup in the same call, so the four counts land on each row. GET /v1/pinterest/board takes 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=N takes the top N rows and caps the extra credits with them, and every joined response carries a data.hydration block 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/pin now returns the date the pin was created, which had been null on every pin; post.content.text falls 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-stats is 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 without include is unchanged at 1 credit, an unrecognised include value 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 returns content.text as null.

  51. 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/full returned computed.avg_engagement_rate as 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 carries computed.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 _warnings explain 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 than posts asked for, because a single call reads one page of recent posts (12 on Instagram) and posts_cursor sent back as cursor reads the next. include=computed only omits the raw posts array from the response; the metrics are computed from the same posts either way, and the documentation now says so. On GET /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 returns no_speech with a message that says so, a photo post returns no_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.likes and .comments are 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.

  52. 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/playlist and GET /v1/youtube/playlist/items returned each video's title, channel and publish date and nothing else, because YouTube's playlist listing carries no counts. Add include=engagement and 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 on GET /v1/youtube/search, GET /v1/youtube/search/hashtag and GET /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. Add include=channel and every row also carries its channel's subscriber count on post.ext.author_followers, plus the channel name, avatar and handle where they were missing; that value is available on those five calls and on GET /v1/youtube/channel/videos, /channel/shorts, /videos/trending, /shorts/trending and /search/advanced. The two combine as include=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 a data.hydration block with the rows looked up and filled, the credits held and kept, and the milliseconds the join added. A plain call without include is 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 keep likes null, and community posts are unchanged.

  53. 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/people and GET /v1/linkedin/post/reactions return 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 one GET /v1/linkedin/profile call per member. Add include=profile and 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_approximate reads false on every row the lookup filled, the connection count lands at author.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 new limit parameter (1 to 10) takes the top N rows and caps the extra credits with it, so limit=3&include=profile costs at most 22. Every hydrated response carries a data.hydration block with the rows looked up, filled and served from cache, the credits held and kept, and the milliseconds the join added. A plain call without include is unchanged at 10 credits, and an unrecognised include value is rejected before anything is charged. Separately, LinkedIn member and company URLs now normalise, so linkedin.com/in/name?trk=..., http://uk.linkedin.com/in/name and https://www.linkedin.com/in/name/ are one cached record instead of three charged calls. On LinkedIn a member's following number is the count of connections.

  54. Improvement

    Threads account search fills follower counts and bios, and both post lists fill view counts, in the same call

    GET /v1/threads/search/users returns 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. Add include=profile and every account on the page is joined to GET /v1/threads/profile in 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 new limit parameter (1 to 12) takes the top N accounts and caps the extra credits with it, so limit=5&include=profile costs 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/posts and GET /v1/threads/search leave engagement.views empty, because Threads publishes a view count on a single post's page only. Add include=engagement and each row is joined to GET /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 the computed block 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 with limit above 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 on GET /v1/threads/post alike; 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 a data.hydration block with the rows looked up, filled and served from cache, the credits held and kept, and the milliseconds the join added. A plain call without include is unchanged at 1 credit, and an unrecognised include value is rejected before anything is charged.

  55. 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/search returns 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 one GET /v1/reddit/subreddit/details call per community. Add include=details and 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 new limit parameter (1 to 25) takes the top N communities and caps the extra credits with it, so limit=5&include=details costs at most 6. Every hydrated response carries a data.hydration block with the rows looked up, filled and served from cache, the credits held and kept, and the milliseconds the join added. A plain call without include is unchanged at 1 credit, and an unrecognised include value is rejected before anything is charged. Separately, GET /v1/reddit/subreddit/details now 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.

  56. 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/users returns 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. Add include=profile and every row is joined, in the same call, to the profile lookup that carries them: the bio, the ISO region at author.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/search works the same way with include=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 new limit parameter (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 a data.hydration block with the rows looked up, filled and served from cache, the credits held and kept, and the milliseconds the join added. A plain call without include is unchanged, and an unrecognised include value is rejected before anything is charged. Separately, GET /v1/tiktok/profile now returns author.location on a cached read as well as a fresh one; since 9 September the cached read had been dropping it.

  57. 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/popular used to return a play count and nothing else per reel, because that surface publishes no like or comment counts. Add include=engagement and 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/similar works the same way with include=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=80 buys the full roster (at most 85). GET /v1/instagram/post/stats now takes include=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 a data.hydration block with the rows looked up, filled and served from cache, the credits held and kept, and the milliseconds the join added. A new limit parameter (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 without include is unchanged, and an unrecognised include value 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 keep likes null.

  58. Improvement

    Google search continues if the first source misses, and Business Profile lookups by id are faster

    GET /v1/google/search now 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/info lookups by cid or place_id are 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.

  59. Improvement

    TikTok Shop showcase rows are now the same product object as search, and product detail names the official shop

    GET /v1/tiktokshop/user/showcase used 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 canonical product object GET /v1/tiktokshop/products and GET /v1/tiktokshop/search already return: title, price, rating, sold count, images, SKU id, plus the handle you asked for under product.ext.tiktokshop.creator_handle. This is a response-shape change on that one call. GET /v1/tiktokshop/products now includes product.ext.tiktokshop.discount_percent on storefront rows, the same leaf search already had. GET /v1/tiktokshop/product now includes official-shop identity, the shop's performance percentile, positive-feedback percent, 24-hour response rate, and product.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/search now 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.

  60. Improvement

    Facebook profiles, posts and comments return the fields that used to need a second call

    GET /v1/facebook/profile/full already fetched the page and its posts in one 5-credit call, then left post.author.avatar_url null 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/post now publishes post.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/reels and GET /v1/facebook/group/posts now mint post.ext.feedback_id, the id GET /v1/facebook/post/comments already accepts, so you can open comments from the list. Each comment now carries comment.post_id and comment.ext.reaction_counts. GET /v1/facebook/group now includes the administrator and moderator lists, recent activity, and the privacy and visibility descriptions. GET /v1/facebook/profile now sets author.username to the vanity slug from the permalink (NASA from facebook.com/NASA), and fills author.verified and author.following when the source sends them. GET /v1/facebook/profile/reels now carries post.ext.music.id and post.ext.music.track_title when 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.

  61. Improvement

    LinkedIn full profiles no longer 500 before they fetch

    GET /v1/linkedin/profile/full was returning 500 on every LinkedIn URL, person or company, in well under a second, so no profile was actually fetched. GET /v1/prism/lookup did the same on a LinkedIn URL. The single-lane reads were fine: GET /v1/linkedin/profile and GET /v1/linkedin/company already 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.

  62. Improvement

    A stale Facebook reply token is a 400, not a 23-second 502

    GET /v1/facebook/post/comment/replies takes feedback_id and expansion_token from a previous /v1/facebook/post/comments page. 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, names expansion_token, and tells you to take a fresh value from comment.ext.expansion_token on /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.

  63. Improvement

    YouTube search and channel reads now return the fields that used to come back empty

    GET /v1/youtube/search?type=channels used 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 on post.ext.author_followers, and labels the row as a channel, still at 1 credit. One measured row carried 218,000 subscribers. type=playlists now carries the playlist URL, video count and owner channel, labelled as a playlist. GET /v1/youtube/channel/playlists no 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 on post.ext.channel_id, including playlist videos. A channel's videos and Shorts now carry the category on post.ext.categoryTitle. GET /v1/youtube/channel now includes lifetime view count on author.ext.total_views and the exact join instant on author.ext.joined_at_timestamp; one measured channel carried 2,510,027,091 views. GET /v1/youtube/channel/about now 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 on GET /v1/youtube/channel at 1 credit and on POST /v1/youtube/channels at 5 credits per 50 ids.

  64. Improvement

    Reddit profiles return follower counts, and two advertised reads now work

    GET /v1/reddit/profile now returns the public follower count at author.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 at author.url, and GET /v1/reddit/subreddit/details returns the community URL. Rows from GET /v1/reddit/subreddit now carry the same Reddit account id on post.author.display_name that the profile returns, so joining a person to their posts on that listing matches. Paging GET /v1/reddit/search no longer bills posts already returned on the previous page; a measured page two repeated 8 of 25. GET /v1/reddit/profile/posts?sort=top now returns the top posts; the documented call used to come back empty. GET /v1/reddit/post/transcript accepts a v.redd.it URL. Credits on that lane are still charged only when a transcript comes back. Prices on every lane in this entry are unchanged.

  65. Improvement

    A TikTok region call now includes follower counts, and a sound's videos page past the first page

    GET /v1/tiktok/profile/region still 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/videos page 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/post now reports verified: true for 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.

  66. Improvement

    LinkedIn profiles, posts and search return the fields that used to need extra calls

    GET /v1/linkedin/company/insights answers 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 under breakdowns, still at 5 credits. A video post on GET /v1/linkedin/post returns duration in whole seconds and the playable stream on content.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 and ext.article with title, source and URL. Company posts publish the company slug on author.username and the follower count on ext.author_followers. Reshare rows on GET /v1/linkedin/post/reposts now carry a permalink. GET /v1/linkedin/profile returns the join date, website, country and creator flags that used to sit behind /profile/about and /profile/contact at 5 credits each. A post carries ext.author_id, author_urn, author_headline and author_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/reactions is now the same author list as people search, with the reaction on author.ext.reaction_type. GET /v1/linkedin/search/posts is now the same post list as a member's feed: text on content.text, counts on engagement. Prices are unchanged. author.verified on a member profile stays null, because that call does not send it.

  67. Improvement

    Instagram similar accounts now include display names, and post lists carry the creator id

    GET /v1/instagram/similar now returns author.display_name on 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; pass author.username to GET /v1/instagram/profile at 1 credit, or batch up to 50 accounts through POST /v1/prism/profiles at 1 credit each. GET /v1/instagram/profile/posts and GET /v1/instagram/profile/reels now carry post.ext.author_id on 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/comments and GET /v1/instagram/post/comment/replies now set comment.post_id and comment.url from the post permalink you already passed; both used to be null. Share counts remain on the 5-credit /full lists and on GET /v1/instagram/post/stats, not on the 1-credit post and reel lists. engagement.saves stays null on every Instagram endpoint.

  68. Improvement

    X account search now pages with counts, and tweet rows carry the author's size

    GET /v1/twitter/search/users used 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 follow pagination.next_cursor as cursor until has_more is 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 on GET /v1/twitter/search/tweets, GET /v1/twitter/user/tweets, GET /v1/twitter/user/media and GET /v1/twitter/tweet now also puts the author's follower, following and tweet counts on the row as post.ext.author_followers, author_following and author_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 on post.ext.retweeted_post with 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/replies now carries the commenter's counts, the reply language, views, bookmarks and quote count on comment.ext. GET /v1/twitter/profile now returns location when the account set one, and a single tweet now returns post.flags.nsfw. Prices are unchanged. Two limits stay honest. author.likes_count is still null on every X call, because X does not publish a likes-received total. And GET /v1/twitter/profile/full still charges 5 credits and still averages over one page of about 20 tweets; posts=100 slices that page and does not walk further. trim=true is still accepted on account posts and a single tweet, and it is still ignored.

  69. Improvement

    Threads user posts go deeper with views, and account search can include followers

    GET /v1/threads/user/posts still returns about 15 recent posts for 1 credit, with view counts null on that short window. Send limit above 15, up to 50, to collect more of the same feed. That deeper call also fills engagement.views and post.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 high limit was set. Measured on @zuck on 09/09/2026, the default call returned 15 posts and limit=50 returned 32 top-level posts reaching back to 25/09/2025. GET /v1/threads/search/users still returns matching accounts for 1 credit, with follower count and bio null. Send include_details=true to fill author.followers and author.bio on those same rows, at 2 credits per account returned. GET /v1/threads/post/comments still returns the bundled window of about 20 replies for 1 credit. Send limit above 25, up to 50, for a deeper first-level window, billed 1 credit per 5 replies returned; each comment now carries comment.post_id. There is still no cursor on these three paths: limit is 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.

  70. New endpoints

    YouTube creator contact emails, at 25 credits and charged only on a hit

    GET /v1/youtube/channel/about returns 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, as author.ext.public_email. It also returns the country listed on the channel as author.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/channel costs 1 credit and already carries author.ext.public_email when 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.

  71. 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/search finds videos by keyword in Chinese, English or a mix, with sort, publish-window and duration filters. GET /v1/douyin/profile returns 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/posts lists their uploads, and exclude_pinned drops a pinned post that would otherwise make an inactive creator look busy. GET /v1/douyin/post returns one video including music, dimensions and the place the creator tagged. GET /v1/douyin/post/comments returns top-level comments at 1 credit each with the commenter's IP province, and GET /v1/douyin/comment/replies opens one thread with comment.parent_id set on every reply, so a conversation rebuilds exactly. GET /v1/douyin/search/users finds creators by keyword and filters by follower band or account type. GET /v1/douyin/trending returns the whole live hot-search board for one flat price. Two things to know before you integrate. post.engagement.views is 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.

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

  73. 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 for cari and ai alone 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, so ai stops scoring against email, rain and said, 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, and expand=false still searches the exact phrase only. One thing worth setting while you are here: limit collects 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=30 in 7.3, limit=50 in 10.2 and limit=100 in 19.5. If your HTTP client gives up at 10 seconds, limit=50 and above will not fit, so raise the timeout or ask for less and page with pagination.next_cursor for the same credits.

  74. New endpoints

    Reddit now reads accounts, comment text and communities

    Six new endpoints. GET /v1/reddit/profile returns one account, and GET /v1/reddit/profile/posts returns what it has posted, about 23 in a single call. GET /v1/reddit/search/comments searches comment text directly instead of searching posts and reading down, at about 19 a page. GET /v1/reddit/subreddits/search takes 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/media returns image and video posts for a keyword, 25 a page. Those three page with the universal cursor, and a measured page two shared no rows with page one. All five cost 1 credit a call. GET /v1/reddit/profile/comments is 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. Its limit accepts 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. Try GET /v1/reddit/search/comments?query=author:username first 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 your limit costs 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 call GET /v1/reddit/profile when you need to tell them apart.

  75. 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_mean array you can read in code. /v1/instagram/posts points at /v1/instagram/profile/posts, /v1/instagram/user/reels at /v1/instagram/profile/reels, and /v1/instagram/hashtag/posts at /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 as twitter, so /v1/x/profile now answers with /v1/twitter/profile instead 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.

  76. 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, and engagement.saves stays null everywhere because Instagram publishes no save count on any surface we can buy.

  77. New endpoints

    Reddit accounts, comment search, and community discovery

    Six new Reddit endpoints. GET /v1/reddit/profile returns an account: total karma at author.likes_count, the post, comment and award split at ext.post_karma, ext.comment_karma and ext.awardee_karma, the cake day, the bio, the avatar and banner, and the trophy count. GET /v1/reddit/profile/posts returns what that account submitted, across every community it posts in, with bodies and media on the rows and ext.subreddit naming where each one landed. GET /v1/reddit/search/comments searches 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 at ext.post_title, ext.subreddit, ext.subreddit_subscribers, ext.post_score, ext.post_comment_count and ext.post_author. Reddit's own operators work in query: author:username for one account's indexed comments, subreddit:name terms to scope a sweep. comment.parent_id is 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/search finds communities by topic, and author.id is the bare community name, which is exactly what subreddit, subreddit/details and subreddit/search take as their subreddit parameter. GET /v1/reddit/search/media returns the image, video and gallery posts for a topic. Those five are 1 credit a page, up to 25 rows, and they page with cursor. GET /v1/reddit/profile/comments returns 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, because limit is 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 your limit costs less than you asked for. Try GET /v1/reddit/search/comments?query=author:username first at 1 credit a page; it reads the search index, which held 9 comments for one account where the history endpoint returned 60.

  78. Improvement

    Searching inside a subreddit returns up to 27 posts a page

    GET /v1/reddit/subreddit/search returned about 7 posts a page. It now returns up to 27 on the same 1 credit, and the rows carry more: the post body at ext.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 of items rather 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.shares and post.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. Omitting query returns the community ranking alone at about 7 rows, because Reddit's scoped search needs terms to match against. include_body=true still works and is rarely needed now that bodies arrive on the rows themselves. Separately, on GET /v1/reddit/search and GET /v1/reddit/subreddit, post.ext.subreddit now returns null instead 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.

  79. New endpoints

    A LinkedIn member's complete post history, one page at a time

    GET /v1/linkedin/profile/posts/archive walks a member's entire post history. Ask for limit=100 and follow next_cursor until 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 your limit costs less than you asked for, and a profile we cannot find costs nothing. limit accepts 1 to 100. Try the flat 5-credit GET /v1/linkedin/profile/posts first: it returns up to 100 posts in one call and is the whole history for most members.

  80. Improvement

    TikTok Shop returns whole catalogues, whole review corpora, and one product shape

    GET /v1/tiktokshop/search now returns the same product object GET /v1/tiktokshop/products returns, 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 canonical product.* names, with the search-only signals (seller trust label, shipping origin, promotion badges, category breadcrumb, demo video) moved to product.ext.tiktokshop. Two endpoints that used to stop after one page now paginate with the universal cursor. A storefront that reported 20 products and no more now returns all of them, measured at 52 of 52 over three pages, and data.total carries 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, and data.total carries 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/product now accepts product_id as well as url, 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, language and original_language are now null rather than repeating the buyer's country code, which is still on review.author.location. A creator handle TikTok does not have now returns 404 at no charge instead of an empty list, and a bad region is rejected before billing on every endpoint that takes one.

  81. 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/history returns daily OHLCV bars with both close and adj_close, plus dividends and splits on the dated row they take effect, at 1 credit for the whole range. GET /v1/finance/statements returns 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/options returns 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/news returns 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.

  82. Improvement

    More Reddit posts per search, and far deeper comment threads

    GET /v1/reddit/search now 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 of items rather than assuming 25. include_body=true still 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/comments returns 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.truncated now reports that honestly, and it can be true with no next_cursor, which means the thread is incomplete and this endpoint cannot fetch you the rest. Comment bodies now arrive as Reddit's markdown source, so comment.text can contain **bold** and [label](url) where it used to be flattened. GET /v1/reddit/post is more reliable, and its post.engagement.shares now counts shares rather than crossposts: same field, different metric. GET /v1/reddit/subreddit returns 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, and trim=true omits them along with the rest of the trimmed leaves.

  83. 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/trades searches 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=Pelosi returns that member's summary; the same handle pages their filings. GET /v1/us_congress_trades/ticker?keyword=AAPL rolls 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.

  84. New platform

    Kohl's product search, reviews, Q&A, and store locator

    Kohl's joins the commerce coverage with five endpoints. GET /v1/kohls/search pages 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 into GET /v1/kohls/reviews (8 per page, verified-purchase flag, exact total) or GET /v1/kohls/questions (buyer questions with answers). GET /v1/kohls/stores finds stores near a lat,lng coordinate, radius 1 to 100 miles. GET /v1/kohls/categories is a 1-credit reference dump. Products and reviews use the same canonical shape as Amazon, Target, and H&M.

  85. New platform

    Gumtree UK listings, sellers, similar ads, and locations

    Gumtree joins the classifieds coverage with 11 endpoints. GET /v1/gumtree/search pages 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/product returns one listing by ad id or gumtree.com URL. GET /v1/gumtree/product/similar returns similar ads as a single page. GET /v1/gumtree/seller and GET /v1/gumtree/seller/listings take both seller_id and public_id from 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.

  86. New platform

    AliExpress products, search, similar items, reviews, and shipping

    AliExpress joins the commerce coverage with nine endpoints. GET /v1/aliexpress/product returns 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/search pages keyword results, 10 per page by default (max 50), with sort and price filters. GET /v1/aliexpress/reviews pages 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.

  87. 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/product returns one product by id or shopping URL: title, description, brand, rating, and specs, at 5 credits. This payload has no list price; call GET /v1/klarna/product/offers for merchant prices. GET /v1/klarna/search returns 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.

  88. Improvement

    Instagram reel search paginates to a clean finish

    Paging GET /v1/instagram/search/reels now ends the way the rest of the API does. Reaching the end of a result set used to return a 404, so a loop following pagination.has_more finished on an error rather than a clean stop. The last page now returns 200 with an empty items list, 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 check items.length rather 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 when date_posted is 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 while has_more is true.

  89. New endpoints

    Tripadvisor hotels, restaurants, attractions, and cruises

    Tripadvisor goes from two endpoints to sixteen, all at 1 credit. GET /v1/tripadvisor/place resolves any Tripadvisor URL into a place, which is the fastest way to confirm a url_path points 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/autocomplete turns a typed name into a resolved place, and GET /v1/tripadvisor/experience-types returns a destination's activity taxonomy with a count per type. Two things to know: hotel search rows carry no rating or review count, so chain GET /v1/tripadvisor/hotel when you need those, and the attraction and cruise review lanes carry no owner replies and no per-review permalink.

  90. Improvement

    Tripadvisor reviews are about 4x faster

    GET /v1/tripadvisor/reviews now 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_votes is now populated, where it was always null before. review.author.location is now null on unfiltered requests, because the faster path does not carry it: if you read that field, pass any one of sort_by, rating, visit_type, search_reviews_keyword, or translate and it comes back as before.

  91. New endpoints

    Yelp search, full search, and suggestions

    Yelp now has five endpoints. GET /v1/yelp/search and GET /v1/yelp/search/full take required query and location, plus optional sort (recommended, rating, review_count), ads, and cursor, at 1 credit. GET /v1/yelp/search/suggestions takes query and location and returns typeahead rows (category, common, chain, business). Business suggestion URLs are aliases and do not resolve on GET /v1/yelp/business/info. If search reports a non-zero total with no rows, the call fails and is refunded.

  92. New platform

    Yelp business info and reviews

    Yelp joins the reviews coverage with two endpoints. GET /v1/yelp/business/info returns 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/reviews pages 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.

  93. New platform

    H&M product search, store locator, and supplier factories

    H&M joins the commerce coverage with six endpoints. GET /v1/hm/search pages keyword results, 36 per page, with price, images, colour, sizes, and availability, at 5 credits. Sort by relevance, newest, or price. language switches catalogue (en_us default, en_gb, de_de, fr_fr). A query that matches nothing comes back empty and is not billed. GET /v1/hm/search/suggestions returns autocomplete terms. GET /v1/hm/stores returns every store in a country (pass us, gb, or de as query), with address, coordinates, and opening hours. GET /v1/hm/countries and GET /v1/hm/categories are 1-credit reference dumps. GET /v1/hm/product/suppliers returns 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.

  94. New platform

    Sephora products, reviews, search, and store stock

    Sephora joins the commerce coverage with eleven endpoints. GET /v1/sephora/product returns one US product by P-number or sephora.com/product URL: title, brand, description, price, rating, images, ingredients, and stock. GET /v1/sephora/reviews pages written reviews, 10 per page, with an exact total. GET /v1/sephora/search pages 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.

  95. 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=10 still tells you it meant limit), but it also broke requests that copy a parameter from one endpoint onto another: region on GET /v1/instagram/post/stats, trim on GET /v1/facebook/post, cache on GET /v1/tiktok/profile, limit on 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: username is accepted where the endpoint asks for handle, an Instagram shortcode is accepted where it asks for url, date_posted=last-day on reel search is served as last-week (the closest filter the source still has), and Facebook post URLs that carry a caption slug in the path are accepted again.

  96. 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 404 RESOURCE_NOT_FOUND with details.reason: handle_unresolved on GET /v1/instagram/followers and GET /v1/instagram/following, where it used to return an empty 200 list, and the same details block is now available on the 404 of account-keyed roster endpoints on other platforms whenever the account is confirmed missing. post.id on profile/reels, tagged and stories now carries the exact 19-digit media id (previously the last 2-3 digits were rounded on every row; tagged page 2 previously repeated page 1). Re-sync any ids you stored from these three endpoints. profile/posts, search/hashtag and location/posts were already exact and do not change. trim=true on profile/posts and profile/reels returns the full list again, where it returned an empty page that was still billed. With trim=true, post.ext.coauthors is omitted and post.flags.pinned is null, and everything else is unchanged. On GET /v1/instagram/search/hashtag only type=recent paginates: top (the default) and clips are single ranked pages that end with has_more: false, and you send the same type again with the cursor. date_posted on GET /v1/instagram/search/reels accepts last-week, last-month and last-year. last-day and last-hour stopped 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/full makes far fewer calls per page to collect share counts, and X-Upstream-Retries now 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.

  97. 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/replies used to return an empty list on comments that had replies. It now returns the replies. GET /v1/facebook/post/comments is 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, and GET /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.

  98. 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/search finds questions by keyword: title, URL, answer count, follower count, and publish time. GET /v1/quora/answers returns written answers with author credential, upvotes, and the parent question. GET /v1/quora/posts, GET /v1/quora/profiles, GET /v1/quora/spaces, and GET /v1/quora/topics search Space posts, profiles, Spaces, and topics the same way. GET /v1/quora/post looks up one question from its URL. Each search is a single page of up to 10 results, with an optional time window (all, hour, day, week, month, year). There is no cursor: refine the query or the window to see a different set.

  99. New platform

    G2 software products, reviews, categories, and sellers

    G2 joins as a new platform with seven endpoints. GET /v1/g2/product returns one software product by slug or G2 URL: rating, review count, categories, seller, pricing plans, features, and alternatives, at 5 credits. GET /v1/g2/reviews returns written reviews, 10 per page, filterable by stars, company segment, industry, role, and region, also 5 credits. GET /v1/g2/category lists products in a category, 15 per page. GET /v1/g2/categories dumps the full category taxonomy in one call at 1 credit. GET /v1/g2/seller and GET /v1/g2/seller/products cover a vendor profile and its product portfolio. GET /v1/g2/product-index pages 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.

  100. 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/jobs and GET /v1/linkedin/job stay 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, and GET /v1/jobs/xing/search search 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/organizations resolves company ids to pass as organization_ids on the LinkedIn search. GET /v1/jobs/salary/titles suggests canonical titles, and GET /v1/jobs/salary returns min, max, mean, and median pay for a title and country. Organization and salary calls are 1 credit. Search pages with a cursor; Indeed needs country_code on page 1.

  101. 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/product returns one listing by numeric id or etsy.com/listing URL: title, description, price, images, shop name, and quantity. GET /v1/etsy/shop/products pages 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/similar returns the listings Etsy considers similar, typically around 12, as a single page. GET /v1/etsy/search/suggestions returns 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

  1. 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 engineer returned a full window while the best coffee returned 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/search now 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/2026 best coffee machine for a small office went from 0 posts to 75, and cari vendor mesin kopi jakarta from 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, and data._warnings always names the sub-queries that ran so you can see what was actually searched. Send expand=false to switch it off and search the exact phrase only.

  2. 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=10 silently 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 on error.unknown_parameters and error.suggestions. Sending ?limitt=10 gets you "Did you mean 'limit'?", and ?curser= gets you cursor. 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_used is 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.

  3. 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/playlists lists the playlists an account has published, and GET /v1/tiktok/playlist/videos walks the videos inside one of them in playlist order. GET /v1/tiktok/user/liked returns 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/posts returns the public videos tagged at a place. GET /v1/tiktok/effects looks up camera effects by id and GET /v1/tiktok/effect/videos returns the videos made with one. GET /v1/tiktok/search/music finds sounds by keyword, and each row carries ext.dsp_ids, which maps that sound to its Apple Music, Spotify, and Amazon track ids. GET /v1/tiktok/hashtag returns 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/following is 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 a pagination block at the envelope root you can walk to the end. GET /v1/tiktok/video/comment/replies returns up to 50 replies a page where it used to return 6. Unfiltered GET /v1/tiktok/search returns 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/top standardizes at up to 30 a page. Every search row now carries the author's follower count at post.ext.author_followers, post engagement carries exact save counts, and a new post.ext.download_count reports 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 on GET /v1/tiktok/profile where 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.

  4. New endpoints

    Amazon Best Sellers, deals, seller profiles, and an on-page SEO audit

    GET /v1/amazon/best-sellers returns a category Best Sellers chart (switch type for New Releases or Movers and Shakers). GET /v1/amazon/deals lists current Amazon deals with deal price and ASIN. GET /v1/amazon/seller looks up a seller profile by seller id. GET /v1/google_shopping/price-history returns per-store dated prices for a product_id from product-search. New platform: GET /v1/on_page/page runs 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.

  5. New endpoints

    Seven new X endpoints, and user timelines now paginate

    GET /v1/twitter/user/tweets now 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 via post.flags.pinned. Pagination is now a real cursor walk: send pagination.next_cursor back as cursor and 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/tweets searches X for a keyword or phrase, about twenty tweets a page, newest first by default (sort=latest) or most popular with sort=top. GET /v1/twitter/tweet/replies returns the replies under any tweet, and GET /v1/twitter/tweet/retweeters the accounts that retweeted it. GET /v1/twitter/user/followers and GET /v1/twitter/user/following walk an account's follower and following lists on a cursor, with follower pages running about seventy accounts. GET /v1/twitter/user/media returns just the tweets on an account's Media tab, the ones carrying a photo or video. And GET /v1/twitter/search/users finds 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.

  6. Improvement

    Reddit search can return the full post body in one call

    GET /v1/reddit/search and GET /v1/reddit/subreddit/search now put the post body at ext.selftext when the source includes it, with content.text joining title and body the same way /v1/reddit/post does. Set include_body=true to 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, so ext.selftext is null.

  7. New endpoints

    Find creators across TikTok, Threads, and Instagram in one call

    GET /v1/search/creators fans 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.

  8. New endpoints

    TikTok Ad Library, Apple Music, and more DX endpoints

    GET /v1/tiktok/adlibrary/search and GET /v1/tiktok/adlibrary/ad read 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.

  9. Improvement

    Instagram reels search now fails over automatically

    GET /v1/instagram/search/reels went 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 of GET /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_followers is embedded only by the primary source, so treat it as opportunistic; and the date_posted filter is supported only by the primary source, so a filtered search fails honestly during a primary outage rather than quietly returning unfiltered results.

  10. New endpoints

    New endpoint: the replies under any Threads post

    GET /v1/threads/post/comments takes 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.

  11. Improvement

    Instagram carousels and Facebook media now arrive complete

    Two fixes in the same spirit. GET /v1/instagram/post on 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 in content.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 and marketplace/item now return the full ordered image set. Single-image posts keep their existing shape, so nothing changes unless there was more to show.

  12. Improvement

    YouTube advanced search can now return view counts and video length

    GET /v1/youtube/search/advanced returned titles, channels and exact publish times but left view counts and durations empty, because YouTube's search index only hands back snippets. Add includeExtras=true and every result now carries post.engagement.views, .likes, .comments and post.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_after and published_before take full timestamps) a sort that is actually applied (order=viewCount, order=date), or a page size you can count on (max_results returns exactly what you ask for, up to 50). The coarser uploadDate on GET /v1/youtube/search is quietly ignored by YouTube whenever a type is 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 is duration=short plus includeExtras=true and your own filter on duration_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 carries extras_unavailable in _warnings.

  13. Improvement

    Threads posts now tell you which topic tag they were filed under

    Threads files many posts under a topic tag, the label you see above the post text, and we were dropping it. Posts from GET /v1/threads/search, GET /v1/threads/user/posts and GET /v1/threads/post now carry that tag's name at post.ext.topic_tag and its id at post.ext.topic_tag_id. A live search for dokter threads came back with 6 of 17 posts tagged, under names like dokter gigi and saluran cerna. Untagged posts are the majority and simply carry no topic_tag key, so read it as optional. Note that the name is not a slug and is not always lowercase, so group on topic_tag_id if you need a stable key. This makes topic grouping possible on results you already pay for: search a keyword, then bucket the results by tag. To be clear about what this is not, Threads exposes no tags-only search mode we can reach, so /v1/threads/search remains a keyword query and there is no new parameter to pass.

  14. Improvement

    YouTube search pages stop repeating themselves, and stop when they are done

    Paging GET /v1/youtube/search for Shorts could return the same videos over and over: the continuation token advanced on every page, so the walk looked healthy and has_more stayed 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 dropping uploadDate and filtering on post.published_at yourself with includeExtras=true. uploadDate=this_year still 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 to GET /v1/youtube/search/hashtag.

  15. Improvement

    Country codes now work on Google Shopping, Trends, the App Store and Google Play

    These endpoints take a country parameter, and until now it only accepted our data provider's exact location name, so the obvious country=US came 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.

  16. 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_posted filter accepted any text and passed it straight through, so a plausible guess like last-month came 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_week and past_month, before any credit is spent. We deliberately do not rewrite last-month to past_month behind your back, because some of the values people were sending have no correct target and guessing would hide the bug in your own code.

  17. 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 limit and 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.

  18. New platform

    Wayfair is temporarily unavailable

    Wayfair went live yesterday and we have taken it back down. Our data provider started reporting that products do not exist when they plainly do, on roughly half of all calls, and returning errors on the rest. A wrong answer delivered confidently is worse than no answer: anyone crawling a SKU list would have quietly recorded most of a real catalogue as delisted. The three Wayfair endpoints now return a service-unavailable response and cost nothing, as every failed call already did. Home Depot and eBay run on the same provider and are unaffected, both measured at full health throughout. Nothing about the Wayfair integration itself changed, so bringing it back is a small step once the provider is stable; we are re-testing daily and will announce the day it returns.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  18. Improvement

    Richer fields: monthly listeners, TikTok Shop data, and more

    A batch of new unified-schema fields landed across platforms. Spotify artists now carry monthly listeners under author.ext. TikTok Shop showcase items expose post.commerce with price, rating, units sold, and seller. YouTube responses include the raw channel id under author.ext even when a channel has no @handle, plus playlist sizes as post.video_count. And LinkedIn follower counts now carry a followers_approximate flag when the source rounds them, so you can tell a bucket from an exact number.

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. New endpoints

    Instagram reels and posts, now with share counts in one call

    Two new endpoints, profile/reels/full and profile/posts/full, return a creator's reels or posts with views, likes, comments, and the per-item share count in a single call. The standard reels and posts lists leave shares null because Instagram's public data omits it; these endpoints merge a second source to fill the share count for a whole page at once, so you no longer need a separate per-post call for every clip. Each response reports shares_coverage and the legs that ran. Flat 5 credits per page.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  24. New platform

    TripAdvisor places and traveler reviews

    Search hotels, restaurants, and attractions, then fetch traveler reviews, including translations, owner responses, and rating histograms.

  25. New platform

    Google Shopping product data

    Product search, product detail, and seller listings from Google Shopping, on the same commerce schema Amazon uses.

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

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

  28. New feature

    SocialCrawl vs Apify comparison

    Pricing, maintenance burden, and what a unified schema saves you. SocialCrawl and Apify compared line by line.

  29. New platform

    Spotify, Rumble, and Bluesky arrive

    Spotify ships 6 endpoints (artists, tracks, albums, podcasts, search), Rumble 5 (search, channel videos, video, transcripts, comments), and Bluesky 3 (profile, user posts, post), all on the unified schema.

May 2026

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

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

  1. New feature

    GET /v1/search/everywhere: search 12 platforms at once

    One endpoint fans out across 12 social platforms in parallel and returns fused, reranked, clustered results as JSON or an SSE stream. Flat 20 credits per call.

  2. New feature

    SocialCrawl vs SociaVault comparison

    Our first comparison page: SocialCrawl and SociaVault side by side on features, pricing, and data coverage.

  3. New feature

    Free Reddit marketing tool

    A free AI tool that finds the subreddits and threads where your product actually fits. No signup needed.