> **For coding agents and LLMs:** This is one page from the Social Fetch docs (markdown export). For curated orientation and workflow guidance, start with [`/llms.txt`](https://www.socialfetch.dev/llms.txt); for agent onboarding and crawl rules, use [`/agents.txt`](https://www.socialfetch.dev/agents.txt); for the full endpoint list with links to pages like this one, use [`/llms-endpoints.txt`](https://www.socialfetch.dev/llms-endpoints.txt); for one platform's parameters and curls, use [`/llms-{platform}.txt`](https://www.socialfetch.dev/llms-tiktok.txt); use [`/llms.json`](https://www.socialfetch.dev/llms.json) when you need structured JSON for tool registration.

## This page

- **On-site (HTML):** [https://www.socialfetch.dev/docs/recipes/competitor-profile-tracking](https://www.socialfetch.dev/docs/recipes/competitor-profile-tracking)
- **Markdown (.mdx) URL:** [https://www.socialfetch.dev/docs/recipes/competitor-profile-tracking.mdx](https://www.socialfetch.dev/docs/recipes/competitor-profile-tracking.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.
- [Recipes](https://www.socialfetch.dev/docs/recipes.mdx) — copyable workflows (brand monitoring, transcripts, Ad Library, creator scoring, Reddit research) with credit callouts and SDK examples.
- [Integrations](https://www.socialfetch.dev/docs/integrations.mdx) — MCP for AI clients, n8n verified node, Apify Store Actors, SDK, and REST API connection paths.
- [MCP product page](https://www.socialfetch.dev/mcp) — hosted MCP overview, OAuth, Skills install.
- [MCP integration](https://www.socialfetch.dev/docs/integrations/mcp.mdx) — hosted `/mcp` server, OAuth, Cursor/VS Code/Claude install snippets, 137 endpoint tools, plus docs_search/docs_read for implementation help.
- [n8n integration](https://www.socialfetch.dev/docs/integrations/n8n.mdx) — install `n8n-nodes-socialfetch`, credentials, and workflow examples.
- [Apify integration](https://www.socialfetch.dev/docs/integrations/apify.mdx) — Store Actors under @social-fetch, PPE billing, dataset export, and quick start.
- [`/llms-endpoints.txt`](https://www.socialfetch.dev/llms-endpoints.txt) — every documented operation with a direct link to that route's agent-readable markdown page (prefer this over parsing OpenAPI).
- [`/llms-{platform}.txt`](https://www.socialfetch.dev/llms-tiktok.txt) — per-platform endpoint files generated from OpenAPI (parameters, credits, curls).
- [`/agents.txt`](https://www.socialfetch.dev/agents.txt) — agent crawl/onboarding file with capabilities, auth rules, and allowlist.
- [`/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`).

---
# Competitor profile tracking (https://www.socialfetch.dev/docs/recipes/competitor-profile-tracking)

Track competitor accounts across networks with one API key. Each platform is an independent lookup: a missing YouTube channel does not fail Instagram. Same handle is not the same person — treat each row as a candidate until you link them.

**You'll need** an [API key](https://app.socialfetch.dev/api-keys) and the [TypeScript SDK](/docs/sdk). Agents can explore with MCP `nl_ask_post`, then pin profile tools like `tiktok_profile_get`.

Credit budget

  Profile lookups are typically **1 credit** each when the request completes — including `not_found` and `private&#x60;. Four platforms × one competitor = **\~4 credits** per snapshot. Re-poll on your cadence; failed infrastructure (`lookup_failed`, `503`) is not charged.

Check [`GET /v1/balance`](/docs/api/v1/balance) before batching a large roster.

Routes

| Platform                          | Route                                                                               | SDK                                       |
| --------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------- |
| [TikTok](/platforms/tiktok)       | [`GET /v1/tiktok/profiles/{handle}`](/docs/api/v1/tiktok/profiles/handle/get)       | `client.tiktok.getProfile({ handle })`    |
| [Instagram](/platforms/instagram) | [`GET /v1/instagram/profiles/{handle}`](/docs/api/v1/instagram/profiles/handle/get) | `client.instagram.getProfile({ handle })` |
| [YouTube](/platforms/youtube)     | [`GET /v1/youtube/channel`](/docs/api/v1/youtube/channel/get)                       | `client.youtube.getChannel({ handle })`   |
| [X/Twitter](/platforms/twitter)   | [`GET /v1/twitter/profiles/{handle}`](/docs/api/v1/twitter/profiles/handle/get)     | `client.twitter.getProfile({ handle })`   |

Optional: [Facebook profile](/docs/api/v1/facebook/profiles/get) (URL or page id), [LinkedIn company](/docs/api/v1/linkedin/companies/get), [Threads profile](/docs/api/v1/threads/profiles/handle/get).

Fan-out example

```ts
import { SocialFetchClient } from "@socialfetch/sdk";

const client = new SocialFetchClient({
  apiKey: process.env.SOCIALFETCH_API_KEY!,
});

type PlatformRow = {
  platform: string;
  handle: string;
  lookupStatus: string | undefined;
  followers: number | null;
  requestId: string;
  creditsCharged: number;
};

async function trackCompetitor(handle: string): Promise<PlatformRow[]> {
  const [tiktok, instagram, youtube, twitter] = await Promise.all([
    client.tiktok.getProfile({ handle }),
    client.instagram.getProfile({ handle }),
    client.youtube.getChannel({ handle }),
    client.twitter.getProfile({ handle }),
  ]);

  const rows: PlatformRow[] = [];

  for (const [platform, result] of [
    ["tiktok", tiktok],
    ["instagram", instagram],
    ["youtube", youtube],
    ["twitter", twitter],
  ] as const) {
    if (!result.ok) {
      console.error(platform, result.error.code, result.error.requestId);
      continue;
    }

    const data = result.value.data as {
      lookupStatus?: string;
      metrics?: { followers?: number; subscribers?: number };
    };

    rows.push({
      platform,
      handle,
      lookupStatus: data.lookupStatus,
      followers: data.metrics?.followers ?? data.metrics?.subscribers ?? null,
      requestId: result.value.meta.requestId,
      creditsCharged: result.value.meta.creditsCharged,
    });
  }

  return rows;
}
```

Always branch on `data.lookupStatus` when the route exposes it. HTTP `200` alone is not "found."

What to store

Persist `capturedAt`, per-platform `lookupStatus`, follower/subscriber metrics, and `meta.requestId`. Diff follower counts across snapshots in your warehouse — the API does not compute deltas.

For identity linking when handles diverge (bio URLs, display-name checks): [Cross-platform creator profiles](/guides/cross-platform-creator-profiles).

Related

* [Errors](/docs/errors) · [Credits](/docs/credits) · [SDK](/docs/sdk) · [MCP](/docs/integrations/mcp)
* Next recipe: [Creator engagement scoring](/docs/recipes/creator-engagement-scoring)