Social Fetch

Capability matrix

Auto-generated endpoint capability appendix derived from the public OpenAPI spec and LLMS index helpers

This page is generated from the same OpenAPI-derived data used by /llms.json.

TikTok

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/tiktok/profiles/{handle}Get TikTok profilehandle (path)client.tiktok.getProfile({ handle })nonedata.lookupStatus: found, private, not_found1 credit per successful request.no
GET /v1/tiktok/profiles/{handle}/videosList TikTok profile videoshandle (path), userId (query)client.tiktok.getProfileVideos({ handle, sortBy?, cursor?, userId?, region?, trim? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: latest, popularAn empty data.videos array can mean no videos in the selected sort window, a private profile, or other cases—there is no lookupStatus field on this route. Call GET /v1/tiktok/profiles/{handle} when you need explicit lookupStatus including private or not_found before interpreting an empty video list.1 credit per successful request.no
GET /v1/tiktok/profiles/{handle}/followersList TikTok profile followershandle (path), userId (query)client.tiktok.getProfileFollowers({ handle, cursor?, userId?, trim? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, hidden, private, not_found An empty data.followers array with lookupStatus: "found" means the profile resolved but this page returned no followers (for example a zero-follower account). Use lookupStatus to distinguish found, hidden, private, and not_found. Call GET /v1/tiktok/profiles/{handle} when you need full profile details.1 credit per successful request.no
GET /v1/tiktok/profiles/{handle}/followingList TikTok profile followinghandle (path)client.tiktok.getProfileFollowing({ handle, cursor?, trim? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, hidden, private, not_found An empty data.accounts array with lookupStatus: "found" means the profile resolved but this page returned no accounts (for example the profile follows nobody). Use lookupStatus to distinguish found, hidden, private, and not_found. Call GET /v1/tiktok/profiles/{handle} when you need full profile details.1 credit per successful request.no
GET /v1/tiktok/profiles/{handle}/regionGet TikTok profile regionhandle (path)client.tiktok.getProfileRegion({ handle })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/tiktok/profiles/{handle}/liveGet TikTok live streamhandle (path)client.tiktok.getProfileLive({ handle })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/tiktok/users/searchSearch TikTok usersnone documentedclient.tiktok.searchUsers({ query, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMorestandard HTTP / success envelope1 credit per successful request.no
GET /v1/tiktok/searchSearch TikTok videosnone documentedclient.tiktok.searchVideos({ query, datePosted?, sortBy?, region?, cursor?, trim? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: relevance, most-liked, date-postedstandard HTTP / success envelope1 credit per successful request.no
GET /v1/tiktok/search/hashtagsSearch TikTok by hashtagnone documentedclient.tiktok.searchHashtags({ hashtag, region?, cursor?, trim? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoreUse data.page.hasMore and data.page.nextCursor for pagination. Repeat the same hashtag and filters when requesting the next page.1 credit per successful request.no
GET /v1/tiktok/videosGet TikTok videourl (query)client.tiktok.getVideo({ url, region?, trim?, downloadMedia? })nonedata.lookupStatus: found, not_found1 credit base, +10 with downloadMedia. Up to 11 credits max.downloadMedia=true
GET /v1/tiktok/videos/commentsList TikTok video commentsurl (query)client.tiktok.getVideoComments({ url, cursor?, trim? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/tiktok/videos/transcriptGet TikTok video transcripturl (query)client.tiktok.getVideoTranscript({ url, language?, useAiFallback? })nonedata.lookupStatus: found, not_found1 credit base, +10 with useAiFallback. Up to 11 credits max.no
GET /v1/tiktok/feed/trendingList TikTok trending feednone documentedclient.tiktok.listTrendingFeed({ region, trim? })noneAn empty data.items array means no trending posts were available for that request. Repeat the same request for a fresh trending batch. New and overlapping posts are both possible. No cursor or page parameters.1 credit per successful request.no
GET /v1/tiktok/shop/products/searchSearch TikTok Shop productsnone documentedclient.tiktok.searchShopProducts({ query, page?, region? })nonestandard HTTP / success envelope1 credit per successful request.no
GET /v1/tiktok/shop/productsList TikTok Shop store productsurl (query)client.tiktok.listShopProducts({ url, cursor?, region? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/tiktok/productsGet TikTok Shop producturl (query)client.tiktok.getProduct({ url, region? })nonestandard HTTP / success envelope1 credit per successful request.no
GET /v1/tiktok/products/reviewsList TikTok Shop product reviewsurl (query)client.tiktok.getProductReviews({ url?, productId?, region?, page? })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/tiktok/profiles/{handle}/showcase-productsList TikTok profile showcase productshandle (path)client.tiktok.getProfileShowcaseProducts({ handle, cursor?, region? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoreAn empty data.products array can mean no showcased products, a private profile, or other cases—there is no lookupStatus field on this route. Call GET /v1/tiktok/profiles/{handle} when you need explicit profile lookup status before interpreting an empty showcase list.1 credit per successful request.no

Facebook

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/facebook/profilesGet Facebook profileurl (query)client.facebook.getProfile({ url, includeBusinessHours? })nonedata.lookupStatus: found, private, not_found1 credit per successful request.no
GET /v1/facebook/profiles/postsList Facebook profile postsurl (query)client.facebook.getProfilePosts({ url?, pageId?, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoreAn empty data.posts page with hasMore: false can represent no public posts, restricted visibility, or an unresolvable URL or id—there is no lookupStatus field on this route. Call GET /v1/facebook/profiles first when you need found / private / not_found before interpreting an empty posts page.1 credit per successful request.no
GET /v1/facebook/profiles/reelsList Facebook profile reelsurl (query)client.facebook.getProfileReels({ url, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/facebook/profiles/photosList Facebook profile photosurl (query)client.facebook.getProfilePhotos({ url, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/facebook/postsGet Facebook post or reelurl (query)client.facebook.getPost({ url, includeComments?, includeTranscript? })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/facebook/posts/commentsList Facebook post or reel commentsurl (query)client.facebook.getPostComments({ url?, cursor?, feedbackId? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/facebook/posts/transcriptGet Facebook post transcripturl (query)client.facebook.getPostTranscript({ url })nonedata.lookupStatus: found, not_found, lookup_failed1 credit per successful request.no
GET /v1/facebook/groups/postsList Facebook group postsurl (query)client.facebook.listGroupPosts({ url, sortBy?, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: top, recentActivity, chronological, chronologicalListingsdata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/facebook/marketplace/itemsGet Facebook Marketplace itemurl (query)client.facebook.getMarketplaceItem({ itemId?, url? })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/facebook/marketplace/locations/searchSearch Facebook Marketplace locationsnone documentedclient.facebook.searchMarketplaceLocations({ query })nonestandard HTTP / success envelope1 credit per successful request.no
GET /v1/facebook/marketplace/searchSearch Facebook Marketplace listingsnone documentedclient.facebook.searchMarketplace({ query, lat, lng, sortBy?, deliveryMethod?, cursor?, ... })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: suggested, distanceAscend, creationTimeDescend, priceAscend, priceDescendstandard HTTP / success envelope1 credit per successful request.no
GET /v1/facebook/ad-library/adsGet Facebook Ad Library adurl (query)client.facebook.getAdLibraryAd({ adId?, url?, includeTranscript?, trim? })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/facebook/ad-library/ads/searchSearch Facebook Ad Library adsnone documentedclient.facebook.searchAdLibraryAds({ query, sortBy?, searchType?, adType?, country?, status?, mediaType?, startDate?, endDate?, cursor?, trim? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: impressions, most-recentstandard HTTP / success envelope1 credit per successful request.no
GET /v1/facebook/ad-library/companies/adsList Facebook company adsnone documentedclient.facebook.listCompanyAds({ pageId?, companyName?, country?, status?, mediaType?, language?, sortBy?, startDate?, endDate?, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: impressions, most-recentdata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/facebook/ad-library/companies/searchSearch Facebook ad library companiesnone documentedclient.facebook.searchAdLibraryCompanies({ query })nonestandard HTTP / success envelope1 credit per successful request.no

Instagram

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/instagram/profiles/{handle}Get Instagram profilehandle (path)client.instagram.getProfile({ handle })nonedata.lookupStatus: found, private, not_found1 credit per successful request.no
GET /v1/instagram/profiles/{userId}/basicGet Instagram basic profileuserId (path)client.instagram.getBasicProfile({ userId })nonedata.lookupStatus: found, private, not_found1 credit per successful request.no
GET /v1/instagram/profiles/{handle}/postsList Instagram profile postshandle (path)client.instagram.getProfilePosts({ handle, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, private, not_found When lookupStatus is found, an empty data.posts page with hasMore: false can still mean a public profile with no posts in range. When lookupStatus is private or not_found, posts will be empty by design. Use data.lookupStatus for the domain outcome; call GET /v1/instagram/profiles/{handle} when you need full profile cards and related fields.1 credit per successful request.no
GET /v1/instagram/profiles/{handle}/reelsList Instagram profile reelshandle (path)client.instagram.getProfileReels({ handle, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found When lookupStatus is found, an empty data.reels page with hasMore: false can mean a public profile with no reels in range. When lookupStatus is not_found, reels will be empty by design. Use data.lookupStatus for the domain outcome; call GET /v1/instagram/profiles/{handle} when you need full profile cards and related fields.1 credit per successful request.no
GET /v1/instagram/profiles/{handle}/highlightsList Instagram profile highlightshandle (path)client.instagram.getProfileHighlights({ handle })nonedata.lookupStatus: found, not_found When lookupStatus is found, an empty data.highlights list can mean the profile has no visible story highlight albums. When lookupStatus is not_found, highlights will be empty by design. Use data.lookupStatus for the domain outcome; call GET /v1/instagram/profiles/{handle} when you need full profile cards and related fields.1 credit per successful request.no
GET /v1/instagram/highlights/{highlightId}Get Instagram highlightnone documentedclient.instagram.getHighlight({ highlightId })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/instagram/postsGet Instagram post or reelurl (query)client.instagram.getPost({ url, region?, trim?, downloadMedia? })nonedata.lookupStatus: found, not_found, restricted1 credit base, +10 with downloadMedia. Up to 11 credits max.downloadMedia=true
GET /v1/instagram/posts/commentsList Instagram post or reel commentsurl (query)client.instagram.getPostComments({ url, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/instagram/posts/transcriptGet Instagram post transcripturl (query)client.instagram.getPostTranscript({ url })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/instagram/search/reelsSearch Instagram Reelsnone documentedclient.instagram.searchReels({ query, datePosted?, page? })nonestandard HTTP / success envelope1 credit per successful request.no

LinkedIn

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/linkedin/profilesGet LinkedIn profilesurl (query)client.linkedin.getProfiles({ urls }) or client.linkedin.getProfile({ url })nonestandard HTTP / success envelope2 credits per profile URL requested. Up to 50 profiles per request (100 credits max).no
GET /v1/linkedin/profiles/postsList LinkedIn profile postsurl (query)client.linkedin.listProfilePosts({ url, startDate?, endDate?, onlyAuthoredPosts? })nonedata.lookupStatus: found, not_found2 credits per returned record. Up to 200 per request (400 credits max). limit defaults to 10.no
GET /v1/linkedin/people/searchSearch LinkedIn peoplenone documentedclient.linkedin.searchPeople({ firstName?, lastName? })nonedata.lookupStatus: found, not_found This search usually takes around one and a half minutes to complete, so expect a longer wait than most endpoints.2 credits per returned record. Up to 50 per request (100 credits max).no
GET /v1/linkedin/organizationsGet LinkedIn organization pageurl (query)client.linkedin.getOrganizations({ urls }) or client.linkedin.getOrganization({ url })noneThis endpoint covers company, school, and other LinkedIn organization pages. If you only need a standard company page lookup, the Company page endpoint may be a better fit.2 credits per organization URL requested. Up to 50 organizations per request (100 credits max).no
GET /v1/linkedin/companiesGet LinkedIn company pageurl (query)client.linkedin.getCompany({ url })nonedata.lookupStatus: found, not_found This endpoint is for LinkedIn company pages only. If you have a school URL or another organization page type, use the Organization page endpoint instead.1 credit per successful request.no
GET /v1/linkedin/companies/postsList LinkedIn company postsurl (query)client.linkedin.listCompanyPosts({ url, page? })nonedata.lookupStatus: found, not_found This endpoint is for LinkedIn company pages only. If you have a school URL or another organization page type, use the Organization page endpoint instead.1 credit per successful request.no
GET /v1/linkedin/postsGet LinkedIn post or articleurl (query)client.linkedin.getPost({ url })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/linkedin/jobsGet LinkedIn jobsurl (query)client.linkedin.getJobs({ urls })nonestandard HTTP / success envelope2 credits per job URL requested. Up to 50 jobs per request (100 credits max).no
GET /v1/linkedin/jobs/searchSearch LinkedIn jobsnone documentedclient.linkedin.searchJobs({ keyword, location, country?, timeRange?, jobType?, experienceLevel?, remote?, company?, locationRadius? })nonedata.lookupStatus: found, not_found This search usually takes around one and a half minutes.2 credits per returned record. Up to 1000 per request (2000 credits max). limit defaults to 10.no

YouTube

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/youtube/channelGet YouTube channelhandle (query), url (query)client.youtube.getChannel({ channelId?, handle?, url? })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/youtube/channels/videosList YouTube channel videoshandle (query)client.youtube.getChannelVideos({ channelId?, handle?, sortBy?, cursor?, includeExtras? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: latest, populardata.lookupStatus: found, not_found An empty data.videos array can still mean data.lookupStatus: "found" when the channel resolves but the returned page has no videos. Use data.lookupStatus to distinguish a resolved empty result from not_found.1 credit per successful request.no
GET /v1/youtube/channels/shortsList YouTube channel shortshandle (query)client.youtube.getChannelShorts({ channelId?, handle?, sortBy?, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: latest, populardata.lookupStatus: found, not_found An empty data.shorts array can still mean data.lookupStatus: "found" when the channel resolves but the returned page has no Shorts. Use data.lookupStatus to distinguish a resolved empty result from not_found.1 credit per successful request.no
GET /v1/youtube/playlistsGet YouTube playlistplaylistId (query)client.youtube.getPlaylist({ playlistId })nonedata.lookupStatus: found, not_found An empty data.videos array with data.lookupStatus: "found" means the playlist resolved but returned no videos in the response. Use data.lookupStatus to distinguish a resolved playlist from not_found.1 credit per successful request.no
GET /v1/youtube/community-postsGet YouTube community posturl (query)client.youtube.getCommunityPost({ url })nonedata.lookupStatus: found, not_found Use data.lookupStatus to distinguish a resolved community post from not_found.1 credit per successful request.no
GET /v1/youtube/searchSearch YouTubenone documentedclient.youtube.search({ query, uploadDate?, sortBy?, type?, duration?, region?, cursor?, includeExtras? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: relevance, popularUse data.page.hasMore and data.page.nextCursor for pagination rather than inferring completion from bucket sizes alone.1 credit per successful request.no
GET /v1/youtube/search/hashtagsSearch YouTube by hashtagnone documentedclient.youtube.searchHashtag({ hashtag, type?, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoreUse data.page.hasMore and data.page.nextCursor for pagination rather than inferring completion from result count alone.1 credit per successful request.no
GET /v1/youtube/shorts/trendingList trending YouTube Shortsnone documentedclient.youtube.getTrendingShorts()noneAn empty data.shorts array means no trending Shorts were available for that call (you normally receive about 48 when the feed is populated). Typically returns about 48 trending Shorts per call. Repeat the same request for another fresh batch (new and overlapping Shorts are both possible). No cursor or page parameters.1 credit per successful request.no
GET /v1/youtube/videosGet YouTube videourl (query)client.youtube.getVideo({ url, language? })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/youtube/videos/commentsList YouTube video commentsurl (query)client.youtube.getVideoComments({ url, cursor?, order? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/youtube/videos/comments/repliesList YouTube comment repliesnone documentedclient.youtube.getVideoCommentReplies({ cursor })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMorestandard HTTP / success envelope1 credit per successful request.no
GET /v1/youtube/videos/transcriptGet YouTube video transcripturl (query)client.youtube.getVideoTranscript({ url, language? })nonedata.lookupStatus: found, not_found, lookup_failed1 credit per successful request.no

Twitter

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/twitter/profiles/{handle}Get Twitter profilehandle (path)client.twitter.getProfile({ handle })nonedata.lookupStatus: found, private, not_found1 credit per successful request.no
GET /v1/twitter/profiles/{handle}/tweetsList Twitter profile tweetshandle (path)client.twitter.getProfileTweets({ handle, trim? })nonedata.lookupStatus: found, not_found An empty data.tweets array can occur with lookupStatus: "found" (no popular public tweets in this window) or lookupStatus: "not_found" (handle did not resolve). Call GET /v1/twitter/profiles/{handle} when you must distinguish private from not_found before interpreting an empty tweet list.1 credit per successful request.no
GET /v1/twitter/tweetsGet Twitter tweeturl (query)client.twitter.getTweet({ url, trim? })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/twitter/tweets/repliesList Twitter tweet repliesurl (query)client.twitter.listTweetReplies({ url, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMorestandard HTTP / success envelope2 credits per successful request.no
GET /v1/twitter/tweets/transcriptGet Twitter tweet transcripturl (query)client.twitter.getTweetTranscript({ url })nonedata.lookupStatus: found, not_found, lookup_failed For video tweets only. Responses can take longer than typical lookups. Videos longer than about two minutes cannot be transcribed.1 credit per successful request.no
GET /v1/twitter/searchSearch Twitter postsnone documentedclient.twitter.search({ query, section?, minRetweets?, minLikes?, minReplies?, limit?, startDate?, endDate?, language?, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMorestandard HTTP / success envelope2 credits per successful request.no
GET /v1/twitter/hashtagsSearch Twitter by hashtagnone documentedclient.twitter.searchHashtags({ hashtag, section?, limit?, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMorestandard HTTP / success envelope2 credits per successful request.no
GET /v1/twitter/communitiesGet Twitter communityurl (query)client.twitter.getCommunity({ url })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/twitter/communities/tweetsList Twitter community tweetsurl (query)client.twitter.getCommunityTweets({ url })nonedata.lookupStatus: found, not_found1 credit per successful request.no

Auth

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/whoamiWhoaminone documentedclient.auth.whoami()nonestandard HTTP / success envelopesee meta.creditsChargedno
GET /v1/balanceGet account balancenone documentedclient.billing.getBalance()nonestandard HTTP / success envelopesee meta.creditsChargedno

System

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /healthHealth checknone documentedclient.health()nonestandard HTTP / success envelopesee meta.creditsChargedno

Telegram

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/telegram/channels/{handle}Get Telegram channelhandle (path)client.telegram.getChannel({ handle: "durov" })nonedata.lookupStatus: found, not_found, restricted1 credit per successful request.no
GET /v1/telegram/channels/{handle}/postsList Telegram channel postshandle (path)client.telegram.getChannelPosts({ handle: "durov", cursor? })cursor via cursordata.lookupStatus: found, not_found, restricted1 credit per successful request.no
GET /v1/telegram/channels/{handle}/posts/{postId}Get Telegram channel posthandle (path), postId (path)client.telegram.getChannelPost({ handle: "Premiumoji", postId: "93" })nonedata.lookupStatus: found, not_found, restricted1 credit per successful request.no

Threads

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/threads/profiles/{handle}Get Threads profilehandle (path)client.threads.getProfile({ handle })nonedata.lookupStatus: found, private, not_found1 credit per successful request.no
GET /v1/threads/profiles/{handle}/postsList Threads profile postshandle (path)client.threads.getProfilePosts({ handle, trim? })nonedata.lookupStatus: found, not_found An empty data.posts array can occur with lookupStatus: "found" (no posts in this response) or lookupStatus: "not_found" (handle did not resolve). Call GET /v1/threads/profiles/{handle} when you must distinguish private from not_found before interpreting an empty post list.1 credit per successful request.no
GET /v1/threads/searchSearch Threads postsnone documentedclient.threads.search({ query, startDate?, endDate?, trim? })nonestandard HTTP / success envelope1 credit per successful request.no
GET /v1/threads/postsGet Threads posturl (query)client.threads.getPost({ url, trim? })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/threads/users/searchSearch Threads usersnone documentedclient.threads.searchUsers({ query })nonestandard HTTP / success envelope1 credit per successful request.no

Reddit

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/reddit/subredditsGet Reddit subredditurl (query)client.reddit.getSubreddit({ subreddit } | { url }) — subreddit names are case-sensitivenonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/reddit/searchSearch Reddit postsnone documentedclient.reddit.search({ query, sortBy?, timeframe?, cursor?, trim? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: relevance, new, topUse data.page.hasMore and data.page.nextCursor for pagination rather than inferring completion from data.totalResults alone.1 credit per successful request.no

Rumble

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/rumble/searchSearch Rumblenone documentedclient.rumble.search({ query, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoreUse data.page.hasMore and data.page.nextCursor for pagination rather than inferring completion from data.totalResults alone.1 credit per successful request.no
GET /v1/rumble/channels/videosList Rumble channel videosurl (query)client.rumble.listChannelVideos({ url, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/rumble/videosGet Rumble videourl (query)client.rumble.getVideo({ url })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/rumble/videos/transcriptGet Rumble video transcripturl (query)client.rumble.getVideoTranscript({ url })nonedata.lookupStatus: found, not_found, lookup_failed1 credit when a transcript is found; no charge when captions are unavailable.no
GET /v1/rumble/videos/commentsList Rumble video commentsurl (query)client.rumble.listVideoComments({ url })nonedata.lookupStatus: found, not_found1 credit per successful request.no

Reddit

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/reddit/subreddits/{subreddit}/postsList Reddit subreddit postsnone documentedclient.reddit.listSubredditPosts({ subreddit, sort?, timeframe?, cursor? }) — subreddit is case-sensitivecursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/reddit/subreddits/searchSearch Reddit subredditnone documentedclient.reddit.searchSubreddit({ subreddit, query?, sort?, timeframe?, cursor? }) — subreddit is case-sensitivecursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoreUse data.page.hasMore and data.page.nextCursor for pagination rather than inferring completion from data.totalResults alone.1 credit per successful request.no
GET /v1/reddit/posts/commentsList Reddit post commentsurl (query)client.reddit.listPostComments({ url, cursor?, trim? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found1 credit per successful request.no

GitHub

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/github/profiles/{handle}Get GitHub profilehandle (path)client.github.getProfile({ handle })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/github/profiles/{handle}/repositoriesList GitHub profile repositorieshandle (path)client.github.listProfileRepositories({ handle, cursor?, type?, sort?, direction? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found An empty data.repositories array with lookupStatus: "found" means the profile resolved but this page returned no repositories.1 credit per successful request.no
GET /v1/github/repositoriesGet GitHub repositoryurl (query)client.github.getRepository({ url })nonedata.lookupStatus: found, not_found Use this endpoint for one repository when you have a full owner/repo URL. To list every public repository for a user, use the profile repositories list endpoint instead.1 credit per successful request.no
GET /v1/github/profiles/{handle}/activityList GitHub profile activityhandle (path)client.github.listProfileActivity({ handle, year?, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found This endpoint returns one month of public contribution activity per request. Keep the same year on follow-up calls and pass data.page.nextCursor as cursor to page backward through the year.1 credit per successful request.no
GET /v1/github/profiles/{handle}/followersList GitHub profile followershandle (path)client.github.listProfileFollowers({ handle, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found An empty data.followers array with lookupStatus: "found" means the profile resolved but this page returned no followers. Use lookupStatus to distinguish found and not_found. Call GET /v1/github/profiles/{handle} when you need full profile details.1 credit per successful request.no
GET /v1/github/profiles/{handle}/followingList GitHub profile followinghandle (path)client.github.listProfileFollowing({ handle, cursor? })cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMoredata.lookupStatus: found, not_found An empty data.following array with lookupStatus: "found" means the profile resolved but this page returned no accounts (for example the profile follows nobody). Use lookupStatus to distinguish found and not_found. Call GET /v1/github/profiles/{handle} when you need full profile details.1 credit per successful request.no
GET /v1/github/profiles/{handle}/contributionsGet GitHub contribution graphhandle (path)client.github.getProfileContributions({ handle, year? })nonedata.lookupStatus: found, not_found Optional year defaults to the current calendar year when omitted. Contribution counts reflect public GitHub activity for that year.1 credit per successful request.no
GET /v1/github/trending/repositoriesList trending GitHub repositoriesnone documentedclient.github.listTrendingRepositories({ language?, since?, spokenLanguageCode? })noneAn empty data.repositories array means GitHub returned no trending repositories for the selected filters. Use since (daily, weekly, monthly) and optional language / spokenLanguageCode to narrow results. For trending developers instead of repositories, use the trending developers endpoint.1 credit per successful request.no
GET /v1/github/trending/developersList trending GitHub developersnone documentedclient.github.listTrendingDevelopers({ language?, since? })noneAn empty data.developers array means GitHub returned no trending developers for the selected filters. Use since (daily, weekly, monthly) and optional language to narrow results. Each developer may include popularRepository when GitHub highlights one. For trending repositories instead of developers, use the trending repositories endpoint.1 credit per successful request.no

Spotify

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/spotify/artistGet Spotify artisturl (query)client.spotify.getArtist({ artistId?, url? })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/spotify/albumGet Spotify albumurl (query)client.spotify.getAlbum({ albumId?, url? })nonedata.lookupStatus: found, not_found1 credit per successful request.no
GET /v1/spotify/trackGet Spotify trackurl (query)client.spotify.getTrack({ trackId?, url? })nonedata.lookupStatus: found, not_found1 credit per successful request.no

Web

RouteSummaryIdentifiersSDKPagination / orderingOutcome / empty-result notesCreditsMedia
GET /v1/web/searchSearch the webnone documentedclient.web.search({ query: "Social media scraping API", region: "US" })nonestandard HTTP / success envelope1 credit per successful request.no
GET /v1/web/markdownGenerate web page markdownurl (query)client.web.getMarkdown({ url: "https://www.socialfetch.dev/" })nonedata.lookupStatus: found, restricted1 credit per successful request.no
GET /v1/web/askAsk a question about a web pageurl (query)client.web.ask({ url: "https://www.socialfetch.dev/", q: "What is this page about?" })nonedata.lookupStatus: found, restricted1 credit per successful request.no
GET /v1/web/htmlGenerate web page HTMLurl (query)client.web.getHtml({ url: "https://www.socialfetch.dev/" })nonedata.lookupStatus: found, restricted1 credit per successful request.no
GET /v1/web/crawlCrawl web pagesurl (query)client.web.crawl({ urls: ["https://www.socialfetch.dev/"] })nonestandard HTTP / success envelope1 credit per URL requested. Up to 5 URLs per request (5 credits max).no

On this page