API Capability Matrix — Endpoints by Platform
Every Social Fetch endpoint by platform: identifiers, SDK methods, pagination, credits, and lookup outcomes. From the public OpenAPI spec.
This page is generated from the same OpenAPI-derived data used by /llms.json.
TikTok
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/tiktok/profiles/{handle} | Get TikTok profile | handle (path) | client.tiktok.getProfile({ handle }) | none | data.lookupStatus: found, private, not_found | 1 credit per successful request. | no |
GET /v1/tiktok/profiles/{handle}/videos | List TikTok profile videos | handle (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, popular | An 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}/followers | List TikTok profile followers | handle (path), userId (query) | client.tiktok.getProfileFollowers({ handle, cursor?, userId?, trim? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, hidden, private, not_found | 1 credit per successful request. | no |
GET /v1/tiktok/profiles/{handle}/following | List TikTok profile following | handle (path) | client.tiktok.getProfileFollowing({ handle, cursor?, trim? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, hidden, private, not_found | 1 credit per successful request. | no |
GET /v1/tiktok/profiles/{handle}/region | Get TikTok profile region | handle (path) | client.tiktok.getProfileRegion({ handle }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/tiktok/profiles/{handle}/audience | Get TikTok profile audience | handle (path) | client.tiktok.getProfileAudience({ handle }) | none | data.lookupStatus: found, not_found | 30 credits per successful request. | no |
GET /v1/tiktok/profiles/{handle}/live | Get TikTok live stream | handle (path) | client.tiktok.getProfileLive({ handle }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/tiktok/users/search | Search TikTok users | query (query) | client.tiktok.searchUsers({ query, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/tiktok/search | Search TikTok videos | query (query) | client.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-posted | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/tiktok/search/hashtags | Search TikTok by hashtag | none documented | client.tiktok.searchHashtags({ hashtag, region?, cursor?, trim? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | Use 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/videos | Get TikTok video | url (query) | client.tiktok.getVideo({ url, region?, trim?, downloadMedia? }) | none | data.lookupStatus: found, not_found | 1 credit base, +10 with downloadMedia. Up to 11 credits max. | downloadMedia=true |
GET /v1/tiktok/videos/comments | List TikTok video comments | url (query) | client.tiktok.getVideoComments({ url, cursor?, trim? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found Cursor pagination with variable page size — use data.page.hasMore and data.page.nextCursor; do not assume a fixed number of comments per page or loop on totalComments alone. | 1 credit per successful request. | no |
GET /v1/tiktok/videos/comments/replies | List TikTok comment replies | commentId (query), url (query) | client.tiktok.getVideoCommentReplies({ commentId, url, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found Requires parent commentId from List TikTok video comments plus the same video url. Paginate with data.page.hasMore and data.page.nextCursor; do not assume a fixed page size. | 1 credit per successful request. | no |
GET /v1/tiktok/videos/transcript | Get TikTok video transcript | url (query) | client.tiktok.getVideoTranscript({ url, language?, useAiFallback? }) | none | data.lookupStatus: found, not_found | 1 credit base, +10 with useAiFallback. Up to 11 credits max. | no |
GET /v1/tiktok/feed/trending | List TikTok trending feed | none documented | client.tiktok.listTrendingFeed({ region, trim? }) | none | 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/songs | Get TikTok song | id (query) | client.tiktok.getSong({ id }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/tiktok/music/{clipId}/videos | List TikTok music videos | none documented | client.tiktok.listMusicVideos({ clipId, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | An empty data.videos array can mean no public videos use this music clip, or other cases—there is no lookupStatus field on this route. | 1 credit per successful request. | no |
GET /v1/tiktok/shop/products/search | Search TikTok Shop products | query (query) | client.tiktok.searchShopProducts({ query, page?, region? }) | page via page, has more: data.page.hasMore | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/tiktok/shop/products | List TikTok Shop store products | url (query) | client.tiktok.listShopProducts({ url, cursor?, region? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/tiktok/products | Get TikTok Shop product | url (query) | client.tiktok.getProduct({ url, region? }) | none | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/tiktok/products/reviews | List TikTok Shop product reviews | url (query) | client.tiktok.getProductReviews({ url?, productId?, region?, page? }) | page via page, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/tiktok/profiles/{handle}/showcase-products | List TikTok profile showcase products | handle (path) | client.tiktok.getProfileShowcaseProducts({ handle, cursor?, region? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | An 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 |
GET /v1/tiktok/ad-library/ads | Get TikTok Ad Library ad | url (query) | client.tiktok.getAdLibraryAd({ adId?, url? }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/tiktok/ad-library/ads/search | Search TikTok Ad Library ads | query (query) | client.tiktok.searchAdLibraryAds({ region?, period?, query?, advertiserName?, orderBy?, industry?, objective?, duration?, likes?, adFormat?, adLanguage?, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | standard HTTP / success envelope | 1 credit per successful request. | no |
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/facebook/profiles | Get Facebook profile | url (query) | client.facebook.getProfile({ url, includeBusinessHours? }) | none | data.lookupStatus: found, private, not_found | 1 credit per successful request. | no |
GET /v1/facebook/profiles/posts | List Facebook profile posts | url (query) | client.facebook.getProfilePosts({ url?, pageId?, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | An 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/reels | List Facebook profile reels | url (query) | client.facebook.getProfileReels({ url, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/facebook/profiles/photos | List Facebook profile photos | url (query) | client.facebook.getProfilePhotos({ url, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/facebook/posts | Get Facebook post or reel | url (query) | client.facebook.getPost({ url, includeComments?, includeTranscript? }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/facebook/posts/comments | List Facebook post or reel comments | url (query) | client.facebook.getPostComments({ url?, cursor?, feedbackId? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/facebook/posts/comments/replies | List Facebook comment replies | none documented | client.facebook.getPostCommentReplies({ cursor }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/facebook/posts/transcript | Get Facebook post transcript | url (query) | client.facebook.getPostTranscript({ url }) | none | data.lookupStatus: found, not_found, lookup_failed | 1 credit per successful request. | no |
GET /v1/facebook/groups/posts | List Facebook group posts | url (query) | client.facebook.listGroupPosts({ url, sortBy?, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: top, recentActivity, chronological, chronologicalListings | data.lookupStatus: found, not_found lookupStatus: not_found often means the group URL was wrong or unresolved. Each page bills separately, including not_found outcomes. Pass a full Facebook group URL (facebook.com/groups/{id-or-slug}/…), not a profile or page URL. Use sortBy: chronological for general feeds; use chronologicalListings for Buy/Sell marketplace groups. Upstream returns a small number of posts per page (often around three). No server-side keyword filter — filter client-side on text after fetching pages. | 1 credit per successful request. | no |
GET /v1/facebook/marketplace/items | Get Facebook Marketplace item | url (query) | client.facebook.getMarketplaceItem({ itemId?, url? }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/facebook/marketplace/locations/search | Search Facebook Marketplace locations | query (query) | client.facebook.searchMarketplaceLocations({ query }) | none | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/facebook/marketplace/search | Search Facebook Marketplace listings | query (query) | client.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, priceDescend | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/facebook/ad-library/ads | Get Facebook Ad Library ad | url (query) | client.facebook.getAdLibraryAd({ adId?, url?, includeTranscript?, trim? }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/facebook/ad-library/ads/search | Search Facebook Ad Library ads | query (query) | client.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-recent | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/facebook/ad-library/companies/ads | List Facebook company ads | none documented | client.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-recent | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/facebook/ad-library/companies/search | Search Facebook ad library companies | query (query) | client.facebook.searchAdLibraryCompanies({ query }) | none | standard HTTP / success envelope | 1 credit per successful request. | no |
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/instagram/profiles/{handle} | Get Instagram profile | handle (path) | client.instagram.getProfile({ handle }) | none | data.lookupStatus: found, private, not_found | 1 credit per successful request. | no |
GET /v1/instagram/profiles/{userId}/basic | Get Instagram basic profile | userId (path) | client.instagram.getBasicProfile({ userId }) | none | data.lookupStatus: found, private, not_found | 1 credit per successful request. | no |
GET /v1/instagram/profiles/{handle}/posts | List Instagram profile posts | handle (path) | client.instagram.getProfilePosts({ handle, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, private, not_found | 1 credit per successful request. | no |
GET /v1/instagram/profiles/{handle}/reels | List Instagram profile reels | handle (path) | client.instagram.getProfileReels({ handle, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/instagram/profiles/{handle}/highlights | List Instagram profile highlights | handle (path) | client.instagram.getProfileHighlights({ handle }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/instagram/highlights/{highlightId} | Get Instagram highlight | none documented | client.instagram.getHighlight({ highlightId }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/instagram/posts | Get Instagram post or reel | url (query) | client.instagram.getPost({ url, region?, trim?, downloadMedia? }) | none | data.lookupStatus: found, not_found, restricted | 1 credit base, +10 with downloadMedia. Up to 11 credits max. | downloadMedia=true |
GET /v1/instagram/posts/comments | List Instagram post or reel comments | url (query) | client.instagram.getPostComments({ url, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/instagram/posts/transcript | Get Instagram post transcript | url (query) | client.instagram.getPostTranscript({ url }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/instagram/search/profiles | Search Instagram profiles | query (query) | client.instagram.searchProfiles({ query, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/instagram/search/reels | Search Instagram Reels | query (query) | client.instagram.searchReels({ query, datePosted?, page? }) | page via page, has more: data.page.hasMore | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/instagram/search/hashtags | Search Instagram by hashtag | none documented | client.instagram.searchHashtags({ hashtag, datePosted?, mediaType?, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/instagram/reels/trending | List trending Instagram Reels | none documented | client.instagram.getTrendingReels() | none | standard HTTP / success envelope | 1 credit per successful request. | no |
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/linkedin/profiles | Get LinkedIn profiles | url (query) | client.linkedin.getProfiles({ urls }) or client.linkedin.getProfile({ url }) | none | standard HTTP / success envelope | 2 credits per profile URL requested. Up to 50 profiles per request (100 credits max). | no |
GET /v1/linkedin/profiles/posts | List LinkedIn profile posts | url (query) | client.linkedin.listProfilePosts({ url, startDate?, endDate?, onlyAuthoredPosts? }) | none | data.lookupStatus: found, not_found | 2 credits attempt fee plus 2 credits per returned record. Up to 200 per request (402 credits max). limit default: 10. | no |
GET /v1/linkedin/people/search | Search LinkedIn people | none documented | client.linkedin.searchPeople({ firstName?, lastName? }) | none | data.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 attempt fee plus 2 credits per returned record. Up to 50 per request (102 credits max). | no |
GET /v1/linkedin/organizations | Get LinkedIn organization page | url (query) | client.linkedin.getOrganizations({ urls }) or client.linkedin.getOrganization({ url }) | none | This 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/companies | Get LinkedIn company page | url (query) | client.linkedin.getCompany({ url }) | none | data.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/posts | List LinkedIn company posts | url (query) | client.linkedin.listCompanyPosts({ url, page? }) | page via page, has more: data.page.hasMore | data.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/posts | Get LinkedIn post or article | url (query) | client.linkedin.getPost({ url }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/linkedin/posts/transcript | Get LinkedIn post transcript | url (query) | client.linkedin.getPostTranscript({ url }) | none | data.lookupStatus: found, not_found, lookup_failed | 1 credit when a transcript is found; no charge when a transcript is unavailable. | no |
GET /v1/linkedin/posts/search | Search LinkedIn posts | query (query) | client.linkedin.searchPosts({ query, datePosted?, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | An empty posts array means no matching public posts were returned for this query and page. It is not an error. | 1 credit per successful request. | no |
GET /v1/linkedin/ad-library/ads | Get LinkedIn Ad Library ad | url (query) | client.linkedin.getAdLibraryAd({ adId?, url? }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/linkedin/ad-library/ads/search | Search LinkedIn Ad Library ads | none documented | client.linkedin.searchAdLibraryAds({ company?, keyword?, companyId?, countries?, startDate?, endDate?, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/linkedin/jobs | Get LinkedIn jobs | url (query) | client.linkedin.getJobs({ urls }) | none | standard HTTP / success envelope | 2 credits per job URL requested. Up to 50 jobs per request (100 credits max). | no |
GET /v1/linkedin/jobs/search | Search LinkedIn jobs | none documented | client.linkedin.searchJobs({ keyword, location, country?, timeRange?, jobType?, experienceLevel?, remote?, company?, locationRadius? }) | none | data.lookupStatus: found, not_found This search usually takes around one and a half minutes. | 2 credits attempt fee plus 2 credits per returned record. Up to 1000 per request (2002 credits max). limit default: 10. | no |
YouTube
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/youtube/channel | Get YouTube channel | handle (query), url (query) | client.youtube.getChannel({ channelId?, handle?, url? }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/youtube/channels/videos | List YouTube channel videos | handle (query) | client.youtube.getChannelVideos({ channelId?, handle?, sortBy?, cursor?, includeExtras? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: latest, popular | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/youtube/channels/shorts | List YouTube channel shorts | handle (query) | client.youtube.getChannelShorts({ channelId?, handle?, sortBy?, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: latest, popular | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/youtube/playlists | Get YouTube playlist | playlistId (query) | client.youtube.getPlaylist({ playlistId }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/youtube/community-posts | Get YouTube community post | url (query) | client.youtube.getCommunityPost({ url }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/youtube/search | Search YouTube | query (query) | client.youtube.search({ query, uploadDate?, sortBy?, type?, duration?, region?, cursor?, includeExtras? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: relevance, popular | Use 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/hashtags | Search YouTube by hashtag | none documented | client.youtube.searchHashtag({ hashtag, type?, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | Use 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/trending | List trending YouTube Shorts | none documented | client.youtube.getTrendingShorts() | none | 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/videos | Get YouTube video | url (query) | client.youtube.getVideo({ url, language? }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/youtube/videos/comments | List YouTube video comments | url (query) | client.youtube.getVideoComments({ url, cursor?, order? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/youtube/videos/comments/replies | List YouTube comment replies | none documented | client.youtube.getVideoCommentReplies({ cursor }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/youtube/videos/transcript | Get YouTube video transcript | url (query) | client.youtube.getVideoTranscript({ url, language? }) | none | data.lookupStatus: found, not_found, lookup_failed | 1 credit per successful request. | no |
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/twitter/profiles/{handle} | Get Twitter profile | handle (path) | client.twitter.getProfile({ handle }) | none | data.lookupStatus: found, private, not_found | 1 credit per successful request. | no |
GET /v1/twitter/profiles/{handle}/tweets | List Twitter profile tweets | handle (path) | client.twitter.getProfileTweets({ handle, limit?, cursor?, includeReplies?, includePinned? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 2 credits per successful request. | no |
GET /v1/twitter/tweets | Get Twitter tweet | url (query) | client.twitter.getTweet({ url, trim? }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/twitter/tweets/replies | List Twitter tweet replies | url (query) | client.twitter.listTweetReplies({ url, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | standard HTTP / success envelope | 2 credits per successful request. | no |
GET /v1/twitter/tweets/transcript | Get Twitter tweet transcript | url (query) | client.twitter.getTweetTranscript({ url }) | none | data.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/search | Search Twitter posts | query (query) | client.twitter.search({ query, section?, minRetweets?, minLikes?, minReplies?, limit?, startDate?, endDate?, language?, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | standard HTTP / success envelope | 2 credits per successful request. | no |
GET /v1/twitter/hashtags | Search Twitter by hashtag | none documented | client.twitter.searchHashtags({ hashtag, section?, limit?, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | standard HTTP / success envelope | 2 credits per successful request. | no |
GET /v1/twitter/communities | Get Twitter community | url (query) | client.twitter.getCommunity({ url }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/twitter/communities/tweets | List Twitter community tweets | url (query) | client.twitter.getCommunityTweets({ url }) | none | data.lookupStatus: found, not_found lookupStatus: found may still return an empty data.tweets array. | 1 credit per successful request. | no |
Auth
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/whoami | Whoami | none documented | client.auth.whoami() | none | standard HTTP / success envelope | see meta.creditsCharged | no |
GET /v1/balance | Get account balance | none documented | client.billing.getBalance() | none | standard HTTP / success envelope | see meta.creditsCharged | no |
System
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
POST /v1/ask | Ask in natural language | none documented | client.ask({ query: "How many TikTok followers does MrBeast have?" }) | none | standard HTTP / success envelope | Routing is free. The nested lookup bills at that endpoint's normal credit rate — see meta.creditsCharged. | no |
GET /health | Health check | none documented | client.health() | none | standard HTTP / success envelope | see meta.creditsCharged | no |
Telegram
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/telegram/channels/{handle} | Get Telegram channel | handle (path) | client.telegram.getChannel({ handle: "durov" }) | none | data.lookupStatus: found, not_found, restricted | 1 credit per successful request. | no |
GET /v1/telegram/channels/{handle}/posts | List Telegram channel posts | handle (path) | client.telegram.getChannelPosts({ handle: "durov", cursor? }) | cursor via cursor | data.lookupStatus: found, not_found, restricted | 1 credit per successful request. | no |
GET /v1/telegram/channels/{handle}/posts/{postId} | Get Telegram channel post | handle (path), postId (path) | client.telegram.getChannelPost({ handle: "Premiumoji", postId: "93" }) | none | data.lookupStatus: found, not_found, restricted | 1 credit per successful request. | no |
Linktree
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/linktree/profiles/{handle} | Get Linktree profile | handle (path) | client.linktree.getProfile({ handle: "miguelangeles" }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
Hacker News
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/hackernews/search | Search Hacker News | query (query), author (query), domain (query), url (query) | client.hackernews.search({ query: "Dropbox" }) | page via page, has more: data.page.hasMore | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/hackernews/feeds/{feed} | List a Hacker News feed | none documented | client.hackernews.listFeed({ feed: "top" }) | offset via offset, has more: data.page.hasMore | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/hackernews/stories/{id} | Get Hacker News story | id (path) | client.hackernews.getStory({ id: 8863 }) | none | data.lookupStatus: found, not_found, not_story | 1 credit per successful request. | no |
GET /v1/hackernews/stories/{id}/comments | Get Hacker News story comments | id (path) | client.hackernews.getStoryComments({ id: 8863 }) | cursor via cursor | data.lookupStatus: found, not_found, not_story | 3 credits per successful request. | no |
GET /v1/hackernews/items/{id} | Get Hacker News item | id (path) | client.hackernews.getItem({ id: 8863 }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/hackernews/comments/{id}/context | Get Hacker News comment context | id (path) | client.hackernews.getCommentContext({ id: 9224 }) | none | data.lookupStatus: found, not_found, not_comment | 2 credits per successful request. | no |
GET /v1/hackernews/users/{username} | Get Hacker News user profile | username (path) | client.hackernews.getUserProfile({ username: "jl" }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/hackernews/users/{username}/submissions | List Hacker News user submissions | username (path) | client.hackernews.getUserSubmissions({ username: "jl" }) | page via page, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/hackernews/users/{username}/comments | List Hacker News user comments | username (path) | client.hackernews.getUserComments({ username: "jl" }) | page via page, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/hackernews/users/{username}/favorites | List Hacker News user favorites | username (path) | client.hackernews.getUserFavorites({ username: "tptacek" }) | page via page, has more: data.page.hasMore | data.lookupStatus: found, not_found, private_or_unavailable | 1 credit per successful request. | no |
GET /v1/hackernews/jobs/who-is-hiring | List Who is Hiring jobs | none documented | client.hackernews.listWhoIsHiring() | page via page, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/hackernews/updates | Get Hacker News updates | none documented | client.hackernews.getUpdates() | none | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/hackernews/maxitem | Get Hacker News max item id | none documented | client.hackernews.getMaxItem() | none | standard HTTP / success envelope | 1 credit per successful request. | no |
Truth Social
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/truthsocial/profiles/{handle} | Get Truth Social profile | handle (path) | client.truthsocial.getProfile({ handle: "realDonaldTrump" }) | none | data.lookupStatus: found, not_found | 2 credits per successful request. | no |
GET /v1/truthsocial/profiles/{handle}/posts | List Truth Social profile posts | handle (path) | client.truthsocial.getProfilePosts({ handle: "realDonaldTrump", cursor?, limit? }) | cursor via cursor | data.lookupStatus: found, not_found | 2 credits base, +2 with includeReplies. Up to 4 credits max. | no |
GET /v1/truthsocial/posts | Get Truth Social post | url (query) | client.truthsocial.getPost({ url: "https://truthsocial.com/@justthenews/116972401572691045" }) | none | data.lookupStatus: found, not_found | 2 credits per successful request. | no |
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/google/ad-library/companies/ads | List Google company ads | domain (query) | client.google.listCompanyAds({ domain?, advertiserId?, topic?, region?, startDate?, endDate?, platform?, format?, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found Google Ad Transparency only includes public ads. | 25 credits per successful request. | no |
GET /v1/google/ad-library/ads | Get Google Ad Library ad | url (query) | client.google.getAdLibraryAd({ url }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/google/ad-library/advertisers/search | Search Google Ad Library advertisers | query (query) | client.google.searchAdLibraryAdvertisers({ query, region? }) | none | standard HTTP / success envelope | 1 credit per successful request. | no |
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/pinterest/search | Search Pinterest pins | query (query) | client.pinterest.searchPins({ query, cursor?, trim? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/pinterest/pins | Get Pinterest pin | url (query) | client.pinterest.getPin({ url, trim? }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/pinterest/profiles/{handle}/boards | List Pinterest profile boards | handle (path) | client.pinterest.listProfileBoards({ handle, cursor?, trim? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/pinterest/boards/pins | List Pinterest board pins | url (query) | client.pinterest.listBoardPins({ url, cursor?, trim? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
Threads
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/threads/profiles/{handle} | Get Threads profile | handle (path) | client.threads.getProfile({ handle }) | none | data.lookupStatus: found, private, not_found | 1 credit per successful request. | no |
Bluesky
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/bluesky/profiles/{handle} | Get Bluesky profile | handle (path) | client.bluesky.getProfile({ handle }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/bluesky/profiles/{handle}/posts | List Bluesky profile posts | handle (path), userId (query) | client.bluesky.getProfilePosts({ handle, cursor?, userId? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/bluesky/posts | Get Bluesky post | url (query) | client.bluesky.getPost({ url }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
Threads
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/threads/profiles/{handle}/posts | List Threads profile posts | handle (path) | client.threads.getProfilePosts({ handle, trim? }) | none | data.lookupStatus: found, not_found lookupStatus: found means the handle resolved; data.posts may still be empty. | 1 credit per successful request. | no |
GET /v1/threads/search | Search Threads posts | query (query) | client.threads.search({ query, startDate?, endDate?, trim? }) | none | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/threads/posts | Get Threads post | url (query) | client.threads.getPost({ url, trim? }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/threads/users/search | Search Threads users | query (query) | client.threads.searchUsers({ query }) | none | standard HTTP / success envelope | 1 credit per successful request. | no |
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/reddit/subreddits | Get Reddit subreddit | url (query) | client.reddit.getSubreddit({ subreddit } | { url }) — subreddit names are case-sensitive | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/reddit/subreddits/{subreddit}/posts | List Reddit subreddit posts | none documented | client.reddit.listSubredditPosts({ subreddit, sort?, timeframe?, cursor? }) — subreddit is case-sensitive | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/reddit/subreddits/search | Search Reddit subreddit | query (query) | client.reddit.searchSubreddit({ subreddit, query?, sort?, timeframe?, cursor? }) — subreddit is case-sensitive | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | Use 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/comments | List Reddit post comments | url (query) | client.reddit.listPostComments({ url, cursor?, trim? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/reddit/posts/transcript | Get Reddit post transcript | url (query) | client.reddit.getPostTranscript({ url, language? }) | none | data.lookupStatus: found, not_found, lookup_failed Accepts Reddit post permalinks and direct hosted video URLs. | 1 credit per successful request. | no |
GET /v1/reddit/search | Search Reddit posts | query (query) | client.reddit.search({ query, sortBy?, timeframe?, cursor?, trim? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore; sortBy: relevance, new, top | Use data.page.hasMore and data.page.nextCursor for pagination rather than inferring completion from data.totalResults alone. | 1 credit per successful request. | no |
Rumble
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/rumble/search | Search Rumble | query (query) | client.rumble.search({ query, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | Use 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/videos | List Rumble channel videos | url (query) | client.rumble.listChannelVideos({ url, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/rumble/videos | Get Rumble video | url (query) | client.rumble.getVideo({ url }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/rumble/videos/transcript | Get Rumble video transcript | url (query) | client.rumble.getVideoTranscript({ url }) | none | data.lookupStatus: found, not_found, lookup_failed | 1 credit when a transcript is found; no charge when captions are unavailable. | no |
GET /v1/rumble/videos/comments | List Rumble video comments | url (query) | client.rumble.listVideoComments({ url }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
Twitch
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/twitch/profiles/{handle} | Get Twitch profile | handle (path) | client.twitch.getProfile({ handle }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/twitch/profiles/{handle}/videos | List Twitch profile videos | handle (path) | client.twitch.listProfileVideos({ handle, filterBy?, sortBy? }) | sortBy: time, views | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/twitch/profiles/{handle}/schedule | Get Twitch profile schedule | handle (path) | client.twitch.getProfileSchedule({ handle }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/twitch/clips | Get Twitch clip | url (query) | client.twitch.getClip({ url }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GitHub
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/github/profiles/{handle} | Get GitHub profile | handle (path) | client.github.getProfile({ handle }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/github/profiles/{handle}/repositories | List GitHub profile repositories | handle (path) | client.github.listProfileRepositories({ handle, cursor?, type?, sort?, direction? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/github/repositories | Get GitHub repository | url (query) | client.github.getRepository({ url }) | none | data.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}/activity | List GitHub profile activity | handle (path) | client.github.listProfileActivity({ handle, year?, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.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}/followers | List GitHub profile followers | handle (path) | client.github.listProfileFollowers({ handle, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/github/profiles/{handle}/following | List GitHub profile following | handle (path) | client.github.listProfileFollowing({ handle, cursor? }) | cursor via cursor, next: data.page.nextCursor, has more: data.page.hasMore | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/github/profiles/{handle}/contributions | Get GitHub contribution graph | handle (path) | client.github.getProfileContributions({ handle, year? }) | none | data.lookupStatus: found, not_found year default: current calendar year. Contribution counts reflect public GitHub activity for that year. | 1 credit per successful request. | no |
GET /v1/github/trending/repositories | List trending GitHub repositories | none documented | client.github.listTrendingRepositories({ language?, since?, spokenLanguageCode? }) | none | 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/developers | List trending GitHub developers | none documented | client.github.listTrendingDevelopers({ language?, since? }) | none | 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
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/spotify/artist | Get Spotify artist | url (query) | client.spotify.getArtist({ artistId?, url? }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/spotify/album | Get Spotify album | url (query) | client.spotify.getAlbum({ albumId?, url? }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
GET /v1/spotify/track | Get Spotify track | url (query) | client.spotify.getTrack({ trackId?, url? }) | none | data.lookupStatus: found, not_found | 1 credit per successful request. | no |
Web
| Route | Summary | Identifiers | SDK | Pagination / ordering | Outcome / empty-result notes | Credits | Media |
|---|---|---|---|---|---|---|---|
GET /v1/web/search | Search the web | query (query) | client.web.search({ query: "Social media scraping API", region: "US" }) | page via page | standard HTTP / success envelope | 1 credit per successful request. | no |
GET /v1/web/markdown | Generate web page markdown | url (query), query (query) | client.web.getMarkdown({ url: "https://www.socialfetch.dev/" }) | none | data.lookupStatus: found, restricted lookupStatus: restricted means bot/access protection blocked the fetch; content fields are null. | 1 credit per successful request. | no |
GET /v1/web/ask | Ask a question about a web page | url (query) | client.web.ask({ url: "https://www.socialfetch.dev/", q: "What is this page about?" }) | none | data.lookupStatus: found, restricted lookupStatus: restricted means bot/access protection blocked the fetch; answer is null. | 1 credit per successful request. | no |
GET /v1/web/html | Generate web page HTML | url (query) | client.web.getHtml({ url: "https://www.socialfetch.dev/" }) | none | data.lookupStatus: found, restricted lookupStatus: restricted means bot/access protection blocked the fetch; html is null. | 1 credit per successful request. | no |
GET /v1/web/crawl | Crawl web pages | url (query) | client.web.crawl({ urls: ["https://www.socialfetch.dev/"] }) | none | standard HTTP / success envelope | 1 credit per URL requested. Up to 5 URLs per request (5 credits max). | no |