> **For coding agents and LLMs:** This is one page from the Social Fetch docs (markdown export). The sections below mirror the orientation block in [`/llms.txt`](https://www.socialfetch.dev/llms.txt); use [`/llms.json`](https://www.socialfetch.dev/llms.json) when you need a structured operation inventory. The catalog covers documented operations with on-site reference pages.

## This page

- **On-site (HTML):** [https://www.socialfetch.dev/docs/capability-matrix](https://www.socialfetch.dev/docs/capability-matrix)
- **Markdown (.mdx) URL:** [https://www.socialfetch.dev/docs/capability-matrix.mdx](https://www.socialfetch.dev/docs/capability-matrix.mdx)

## API base URL and authentication

- **API origin (from OpenAPI `servers`):** `https://api.socialfetch.dev`
- **Authentication:** send `x-api-key: sfk_...` on `/v1/**` routes unless the operation is explicitly anonymous (check OpenAPI `security`, the [API reference hub](https://www.socialfetch.dev/docs/api.mdx), [`/llms.txt`](https://www.socialfetch.dev/llms.txt), or [`/llms.json`](https://www.socialfetch.dev/llms.json) for each route).
- **OpenAPI JSON:** [https://www.socialfetch.dev/openapi.json](https://www.socialfetch.dev/openapi.json)

## Recommended docs entrypoints (this site)

- [Documentation overview](https://www.socialfetch.dev/docs.mdx) — top-level orientation (markdown).
- [Quickstart](https://www.socialfetch.dev/docs/quickstart.mdx) — authenticate with `x-api-key`, validate auth with `whoami`, and understand the JSON envelope.
- [SDK](https://www.socialfetch.dev/docs/sdk.mdx) — official TypeScript SDK guide, including `SocialFetchClient`, `Result`, and `unwrap()`.
- [SDK reference](https://www.socialfetch.dev/docs/sdk-reference.mdx) — exhaustive SDK method inventory and route mapping for agents, tooling, and power users.
- [Choose the right endpoint](https://www.socialfetch.dev/docs/choose-endpoint.mdx) — task-oriented route selection for smoke tests, profiles, list endpoints, and single-item lookups.
- [Capability matrix](https://www.socialfetch.dev/docs/capability-matrix.mdx) — fast comparison of identifiers, pagination, outcomes, media download, and SDK coverage.
- [`/llms.json`](https://www.socialfetch.dev/llms.json) — structured machine-readable operation inventory with parameter names, pagination, outcomes, credits, and SDK mapping.
- [API reference hub](https://www.socialfetch.dev/docs/api.mdx) — human-friendly index of operations with links into generated pages.
- [Errors](https://www.socialfetch.dev/docs/errors.mdx) — shared error envelope and HTTP status guidance.
- [Credits](https://www.socialfetch.dev/docs/credits.mdx) — metering, `402`, and planning batch jobs.
- Outcome semantics such as `found`, `not_found`, and `private` are documented in [Errors](https://www.socialfetch.dev/docs/errors.mdx) and on operation pages when present in the OpenAPI contract.

## Markdown docs convention

- Every docs page has a markdown twin: append **`.mdx`** to the docs pathname (for example `/docs/quickstart` → `/docs/quickstart.mdx`).
- Agents that send `Accept: text/markdown` on `/docs/**` HTML URLs may receive markdown directly (same URL, `Vary: Accept`).

---
# Capability matrix (https://www.socialfetch.dev/docs/capability-matrix)

{/* AUTO-GENERATED by scripts/generate-capability-appendix.mts; do not edit by hand. */}

This page is generated from the same OpenAPI-derived data used by [`/llms.json`](/llms.json).

TikTok [#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`                   | see `meta.creditsCharged`                                                                                                                           | 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 | empty results may be ambiguous check the profile route if that matters | see `meta.creditsCharged`                                                                                                                           | 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 when `downloadMedia=true` (up to 11 credits on success). See `meta.creditsCharged`. Normalization failures are charged 1 credit. | `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`                              | 1 credit base (up to 1 credits on success). See `meta.creditsCharged`.                                                                              | 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 when `useAiFallback=true` (up to 11 credits on success). See `meta.creditsCharged`. Normalization failures are charged 1 credit. | no                   |
| `GET /v1/tiktok/profiles/{handle}/live`              | Get TikTok live stream                | `handle` (path)                   | `client.tiktok.getProfileLive({ handle })`                                              | none                                                                                                      | `data.lookupStatus`: `found`, `not_found`                              | see `meta.creditsCharged`                                                                                                                           | no                   |
| `GET /v1/tiktok/shop/products/search`                | Search TikTok Shop products           | none documented                   | `client.tiktok.searchShopProducts({ query, page?, region? })`                           | none                                                                                                      | standard HTTP / success envelope                                       | 1 credit base (up to 1 credits on success). See `meta.creditsCharged`.                                                                              | 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 base (up to 1 credits on success). See `meta.creditsCharged`.                                                                              | no                   |
| `GET /v1/tiktok/products`                            | Get TikTok Shop product               | `url` (query)                     | `client.tiktok.getProduct({ url, region? })`                                            | none                                                                                                      | standard HTTP / success envelope                                       | 1 credit base (up to 1 credits on success). See `meta.creditsCharged`.                                                                              | no                   |
| `GET /v1/tiktok/products/reviews`                    | List TikTok Shop product reviews      | `url` (query)                     | `client.tiktok.getProductReviews({ url?, productId?, region?, page? })`                 | none                                                                                                      | `data.lookupStatus`: `found`, `not_found`                              | 1 credit base (up to 1 credits on success). See `meta.creditsCharged`.                                                                              | 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`                          | empty results may be ambiguous check the profile route if that matters | see `meta.creditsCharged`                                                                                                                           | no                   |

Facebook [#facebook]

| 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`                   | see `meta.creditsCharged`                                              | 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`                                                                    | empty results may be ambiguous check the profile route if that matters | see `meta.creditsCharged`                                              | 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`                              | see `meta.creditsCharged`                                              | 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`                              | see `meta.creditsCharged`                                              | 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 base (up to 1 credits on success). See `meta.creditsCharged`. | 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 base (up to 1 credits on success). See `meta.creditsCharged`. | 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 base (up to 1 credits on success). See `meta.creditsCharged`. | 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`                              | 1 credit base (up to 1 credits on success). See `meta.creditsCharged`. | no    |

Instagram [#instagram]

| 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`                   | see `meta.creditsCharged`                                                                                                                           | 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` | empty results may be ambiguous check the profile route if that matters | see `meta.creditsCharged`                                                                                                                           | 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`                              | 1 credit base; +10 when `downloadMedia=true` (up to 11 credits on success). See `meta.creditsCharged`. Normalization failures are charged 1 credit. | `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 base (up to 1 credits on success). See `meta.creditsCharged`.                                                                              | no                   |

LinkedIn [#linkedin]

| Route                              | Summary                      | Identifiers   | SDK                                                | Pagination / ordering | Outcome / empty-result notes              | Credits                                                                | Media |
| ---------------------------------- | ---------------------------- | ------------- | -------------------------------------------------- | --------------------- | ----------------------------------------- | ---------------------------------------------------------------------- | ----- |
| `GET /v1/linkedin/profiles`        | Get LinkedIn profile         | `url` (query) | `client.linkedin.getProfile({ url })`              | none                  | `data.lookupStatus`: `found`, `not_found` | see `meta.creditsCharged`                                              | no    |
| `GET /v1/linkedin/companies`       | Get LinkedIn company page    | `url` (query) | `client.linkedin.getCompany({ url })`              | none                  | `data.lookupStatus`: `found`, `not_found` | 1 credit base (up to 1 credits on success). See `meta.creditsCharged`. | no    |
| `GET /v1/linkedin/companies/posts` | List LinkedIn company posts  | `url` (query) | `client.linkedin.listCompanyPosts({ url, page? })` | none                  | `data.lookupStatus`: `found`, `not_found` | see `meta.creditsCharged`                                              | no    |
| `GET /v1/linkedin/posts`           | Get LinkedIn post or article | `url` (query) | `client.linkedin.getPost({ url })`                 | none                  | `data.lookupStatus`: `found`, `not_found` | 1 credit base (up to 1 credits on success). See `meta.creditsCharged`. | no    |

YouTube [#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`                                                                        | see `meta.creditsCharged`                                              | 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` empty results may be ambiguous check the profile route if that matters | see `meta.creditsCharged`                                              | 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` empty results may be ambiguous check the profile route if that matters | see `meta.creditsCharged`                                              | no    |
| `GET /v1/youtube/videos`            | Get YouTube video            | `url` (query)                   | `client.youtube.getVideo({ url, language? })`                                                | none                                                                                                      | `data.lookupStatus`: `found`, `not_found`                                                                        | 1 credit base (up to 1 credits on success). See `meta.creditsCharged`. | 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 base (up to 1 credits on success). See `meta.creditsCharged`. | no    |

Twitter [#twitter]

| 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`                                                             | see `meta.creditsCharged`                                              | no    |
| `GET /v1/twitter/profiles/{handle}/tweets` | List Twitter profile tweets   | `handle` (path) | `client.twitter.getProfileTweets({ handle, trim? })`                                                                                 | popular                                                                          | `data.lookupStatus`: `found`, `not_found` empty results may be ambiguous check the profile route if that matters | see `meta.creditsCharged`                                              | no    |
| `GET /v1/twitter/search`                   | Search Twitter posts          | none documented | `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 credit base (up to 2 credits on success). See `meta.creditsCharged`. | no    |
| `GET /v1/twitter/tweets`                   | Get Twitter tweet             | `url` (query)   | `client.twitter.getTweet({ url, trim? })`                                                                                            | none                                                                             | `data.lookupStatus`: `found`, `not_found`                                                                        | 1 credit base (up to 1 credits on success). See `meta.creditsCharged`. | no    |
| `GET /v1/twitter/communities`              | Get Twitter community         | `url` (query)   | `client.twitter.getCommunity({ url })`                                                                                               | none                                                                             | `data.lookupStatus`: `found`, `not_found`                                                                        | 1 credit base (up to 1 credits on success). See `meta.creditsCharged`. | no    |
| `GET /v1/twitter/communities/tweets`       | List Twitter community tweets | `url` (query)   | `client.twitter.getCommunityTweets({ url })`                                                                                         | none                                                                             | `data.lookupStatus`: `found`, `not_found`                                                                        | 1 credit base (up to 1 credits on success). See `meta.creditsCharged`. | no    |

Auth [#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 [#system]

| Route         | Summary      | Identifiers     | SDK               | Pagination / ordering | Outcome / empty-result notes     | Credits                   | Media |
| ------------- | ------------ | --------------- | ----------------- | --------------------- | -------------------------------- | ------------------------- | ----- |
| `GET /health` | Health check | none documented | `client.health()` | none                  | standard HTTP / success envelope | see `meta.creditsCharged` | no    |