Breaking
Kick: native only, a fetch miss is 502, limit up to 100 returns full results
Effective 2026-10-24. /v1/kick/clip no longer has an extended fallback, so source is native or cache; the value extended is no longer returned. Breaking: when Kick can't be read, clip mode and channel mode answer 502 KICK_CLIPS_UNAVAILABLE (retryable, 0 credits) straight away; before, some of those calls were served by the extended path as a 200 with source extended. A clip or channel Kick does not have is still 404 CLIP_NOT_FOUND / CHANNEL_NOT_FOUND, an empty channel is still 200 at 0 credits, and a VOD or wrong-platform URL is still 400. Channel mode: limit up to 100 now returns up to limit clips, newest first; before, a native response held at most 20 clips whatever limit you passed. The default limit is now documented as 20 (it was documented as 30); the number of clips a default call returns is unchanged. Clips are always the full native shape (vod, creator, categoryBanner and parentCategory when Kick has them); the thinner extended rows are gone. Cached Kick responses from before this change are not served, so the first call per URL is a fresh fetch. Price unchanged: flat 1 credit on a 200 with rows.
- source: native | cache; extended is no longer returned
- Kick unreadable: 502 KICK_CLIPS_UNAVAILABLE, retryable, 0 credits (some were a 200 from the extended path)
- unchanged: 404 CLIP_NOT_FOUND / CHANNEL_NOT_FOUND, empty channel 200 at 0 credits, 400 for VOD / wrong-platform URLs
- channel mode: limit up to 100 returns up to 100 clips (a native response held at most 20)
- limit default documented as 20 (was 30); default call returns the same count as before
- clips: always the full native shape; thinner extended rows are gone
- older cached responses are not served; first call per URL is a fresh fetch
- price unchanged: flat 1 credit
Breaking
TikTok Shop: native-only search, new status codes, cheapest-SKU price
Shop Search reads only its native search window, with no slower fallback path. A query with no TikTok Shop products is 200 with an empty list at 0 credits; when the search window can't be read the call is 503, retryable, at 0 credits. Product Details answers 502 (retryable, Retry-After 30 seconds, 0 credits) when the product page could not be loaded, instead of 404; 404 now means the product is confirmed gone. On product pages without the full product data, price is the cheapest variant, so prices on multi-variant products can be lower than before. Product Reviews fills totalAvailable from the product's review count. TikTok Shop price fields are documented as number or null: a product that comes back without a price is a normal 2-credit response with price null, and only a call that returns no product data costs 0 credits.
- tiktok-shop/shop-search: native window fails: 503 SERVICE_UNAVAILABLE, retryable, 0 credits (was: slower fallback path, 200 or 502)
- tiktok-shop/shop-search: no products for the query: 200, products [], totalReturned 0, 0 credits (was: answered by the slower fallback path)
- tiktok-shop/shop-search: windowKind is always serp-pdp (the value extended no longer appears); source is always native
- tiktok-shop/shop-search: hasMore is true only when limit is below 10 and the window had more (no longer true on a full fallback page)
- tiktok-shop/product-details: product page could not be loaded: 502 UPSTREAM_UNAVAILABLE, retryable, retryAfterSeconds 30 + Retry-After header, 0 credits (was 404 NOT_FOUND)
- tiktok-shop/product-details: 404 NOT_FOUND only when the product is confirmed gone
- tiktok-shop/product-details and shop-search: price is the cheapest variant and originalPrice that variant's list price when the page has no full product data; new priceSource value sku_min (was the first variant listed)
- tiktok-shop/product-reviews: totalAvailable filled from the product's review count on the preview (was often null)
- tiktok-shop endpoints: price, originalPrice and savingsAmount are typed number | null in the OpenAPI spec (some were integer)
- tiktok-shop/product-details: product returned without a price is 200 with price null and priceStatus, 2 credits; no product data (404 or 502) is 0 credits
Breaking
Reddit: 404 for missing, banned, private and quarantined subreddits; no repeated search posts; analytics likes
Status codes and fields change on the Reddit endpoints. A subreddit that does not exist is now 404 NOT_FOUND on subreddit posts and subreddit search (it was a 503, or a 200 with no posts). A banned, private or quarantined subreddit is 404 with error.code SUBREDDIT_BANNED, SUBREDDIT_PRIVATE or SUBREDDIT_QUARANTINED and retryable false on subreddit details, subreddit posts and subreddit search (it was a 503, or a 200 with no posts). All of these cost 0 credits. Post transcript answers a post page it cannot read with 502 UPSTREAM_UNAVAILABLE, retryable, at 0 credits (it was a 422 VALIDATION_ERROR saying there was no transcript). An empty cursor on subreddit posts is the first page (it was a 400 INVALID_CURSOR). Search and subreddit search no longer repeat a post on a later page; nextCursor carries a new format, and cursors issued earlier still work. On /v1/analytics/post and /v1/analytics/compare, likes for a Reddit link is now the post score (upvotes - downvotes); it was always null. Reddit links there are read natively only. Prices are unchanged.
- reddit/subreddit-posts, subreddit-search: missing subreddit 503 / empty 200 -> 404 NOT_FOUND, 0 credits
- reddit/subreddit-details, subreddit-posts, subreddit-search: banned / private / quarantined 503 or empty 200 -> 404 SUBREDDIT_BANNED / SUBREDDIT_PRIVATE / SUBREDDIT_QUARANTINED, retryable false, 0 credits
- reddit/post-transcript: unreadable post page 422 VALIDATION_ERROR -> 502 UPSTREAM_UNAVAILABLE, retryable, 0 credits
- reddit/subreddit-posts: cursor="" 400 INVALID_CURSOR -> first page
- reddit/search, subreddit-search: no post repeats across pages; new nextCursor format, earlier cursors still accepted
- analytics/post, analytics/compare (Reddit links): likes null -> post score (upvotes - downvotes)
Breaking
Threads: every endpoint reads only Threads' public pages
Profile, user posts, search, search users, post details and Threads links in /v1/analytics/post now read only what a logged-out visitor sees on threads.net. The extended fallback is gone, so source is native or cache. Breaking: some status codes change. An unknown handle or post is 404; /threads/profile used to answer 200 with an almost empty card for a handle that is not on Threads. A page that can't be read within 60 seconds is 502 UPSTREAM_UNAVAILABLE, retryable, at 0 credits. Prices are unchanged.
- threads/profile: unknown handle 200 (1 credit) -> 404 THREADS_PROFILE_NOT_FOUND (0 credits)
- threads/profile: unreadable page -> 502 UPSTREAM_UNAVAILABLE, retryable, 0 credits
- threads/user-posts: unknown handle 404 THREADS_POSTS_NOT_FOUND (unchanged), now without a slow second fetch
- threads/user-posts: unreadable page 200 via the extended path -> 502 UPSTREAM_UNAVAILABLE, 0 credits
- threads/search: unreadable page and no 6h last-good page -> 502 (unchanged), without the extended step
- threads/search-users: unreadable page 200 via the extended path or 404 'No users found' -> 502 UPSTREAM_UNAVAILABLE, 0 credits
- threads/post-details: unknown post 404 'Post not found' -> 404 THREADS_POST_NOT_FOUND
- threads/post-details: unreadable page, or a short /t/ link that can't be confirmed -> 502 UPSTREAM_UNAVAILABLE, 0 credits
- analytics/post (Threads links): unknown post 404, unreadable page 502, no extended path
- every Threads endpoint: a request that can't finish within 60 s -> 502 UPSTREAM_UNAVAILABLE, 0 credits
- source: native or cache on every Threads response (extended no longer appears); timings.path is native
- post-details: author and url are the post's own, even when the URL names a different handle
- post-details: no more media-only rows (text null, engagement 0) from the extended path
- new field mediaUrlsExpireAt on posts, author cards, profiles and search-user cards (omitted when the link carries no expiry)
- schema: engagement.likes/replies/reposts, text and displayName are nullable (null when Threads omits them)
Breaking
Facebook page-details, profile-photos, event-details: 404 only when Facebook says it's missing
These three endpoints answered 404 whenever we couldn't read the page, even when the page exists. Now a 404 NOT_FOUND (retryable: false) means Facebook itself says the page or event is missing or not public. When Facebook couldn't be read this time, the answer is 502 UPSTREAM_UNAVAILABLE with retryable: true and a Retry-After header; retry later. Both cost 0 credits. If you treat every 404 from these endpoints as "gone", that is now safe; add a retry for 502.
- page-details: a failed read is 502 UPSTREAM_UNAVAILABLE, retryable, Retry-After 30 (was 404 "Page not found or not public")
- profile-photos: a failed read, or a page whose photo grid didn't load, is 502, retryable, Retry-After 30 (was 404 "Photos not found")
- profile-photos: a missing or non-public page is 404 NOT_FOUND "Page not found or not public" (was 404 "Photos not found")
- event-details: a failed read is 502, retryable, Retry-After 30 (was 404 "Event not found")
- event-details: a missing or non-public event is 404 NOT_FOUND "Event not found or not public"
- 404s are retryable: false; all of these cost 0 credits; successful responses are unchanged