> **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/api/v1/steam/apps/appid/get>
- **Markdown (.mdx) URL:** <https://www.socialfetch.dev/docs/api/v1/steam/apps/appid/get.mdx>

## API base URL and authentication

- **API origin (from OpenAPI `servers`):** `https://api.socialfetch.dev`
- **Authentication:** send `x-api-key: sfk_...` on `/v1/**` and `/v2/**` 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>

## 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()`.
- [Capability matrix](https://www.socialfetch.dev/docs/capability-matrix.mdx) — every operation with identifiers, pagination, outcomes, media download, credits, and its SDK method. Generated from OpenAPI, so use it for route selection instead of scanning individual pages.
- [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, Make custom app, 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, 910 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.
- [Make integration](https://www.socialfetch.dev/docs/integrations/make.mdx) — custom app modules for Make scenarios, API key credentials, and module catalog.
- [`/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`).
- Published blog posts use the same convention: `/blog/{slug}` → `/blog/{slug}.mdx`, or `Accept: text/markdown` on the HTML URL (`Vary: Accept`).

---
# Get Steam app (https://www.socialfetch.dev/docs/api/v1/steam/apps/appid/get)

## Summary

Get a Steam app's store details: prices, tags, languages, requirements, media and review scores.

**Tags:** `Steam`

## HTTP

- **Method:** GET
- **Path:** `/v1/steam/apps/{appId}`
- **Base URL:** `https://api.socialfetch.dev`

## Capability summary

- **SDK mapping:** `client.steam.getApp({ appId: 620, country: "US" })`
- **Accepted identifiers:** `appId` (path)
- **Pagination:** none
- **Business outcome field:** `data.lookupStatus` with values `found`, `not_found`

## Credits

- 1 credit
- Failed requests are free
- A not-found answer is still charged

## Authentication

- **`x-api-key`**: API key (`sfk_...`)

## Parameters

### `appId` (path)

- **Required:** yes
- **Constraints:** type `integer`; minimum: 1; maximum: 2147483647
- **Description:** Steam app id, the number in the store URL, e.g. `570` for Dota 2. A store app URL is also accepted.

### `country` (query)

- **Required:** no
- **Constraints:** type `string`; pattern: `^[A-Za-z]{2}$`
- **Description:** Country the prices are shown for, as an ISO 3166-1 alpha-2 code. Default: `US`. An app not sold in this country returns `lookupStatus` `not_found` with `unavailableInCountry` true.

### `language` (query)

- **Required:** no
- **Constraints:** type `string`
- **Description:** Language of the text: a Steam language name or short code such as `german` or `de`. Default: `en`.

## Responses (status codes)

- **200**: App details.
- **400**: Invalid request
- **401**: Missing or invalid API key
- **402**: Insufficient credits
- **500**: Unexpected or billing error
- **502**: Lookup could not be completed.
- **503**: Service temporarily unavailable; safe to retry with backoff.

## Response body (200)

App details.

### Field outline

- **data** (required) — type `object`. Endpoint-specific response payload.
  - **lookupStatus** (required) — type `string`; enum: found, not_found. Whether the app was found.
  - **appId** (required) — type `integer`; minimum: 1; maximum: 2147483647. Steam app id, the number in the store URL, e.g. `570` for Dota 2. A store app URL is also accepted.
  - **country** (required) — type `string`. Country the prices are for, e.g. `US`.
  - **app** (required) — type `object`; nullable. The app when lookupStatus is `found`; otherwise null.
    - **id** (required) — type `integer`. Steam app id.
    - **type** (required) — type `string`; enum: game, dlc, demo, software, video, music, hardware, mod, series, advertising, unknown. What kind of store item the app id is.
    - **name** (required) — type `string`; nullable. Name of the app; null when there is no name.
    - **url** (required) — type `string`. Store page URL.
    - **isFree** (required) — type `boolean`; nullable. Whether the app is free to play or free to download.
    - **releaseDate** (required) — type `string`; nullable. Release date as an ISO 8601 UTC timestamp, or null when unknown or not announced.
    - **comingSoon** (required) — type `boolean`; nullable. Whether the app has not been released yet.
    - **developers** (required) — type `array`. Developer names.
      - _items:_
        - type `string`
    - **publishers** (required) — type `array`. Publisher names.
      - _items:_
        - type `string`
    - **tagIds** (required) — type `array`. User tag ids, most voted first. Names are in the tags endpoint.
      - _items:_
        - type `integer`
    - **reviews** (required) — type `object`; nullable. User review summary; null when there is none. Counts Steam purchases only.
      - **count** (required) — type `integer`. Number of reviews this summary counts. App and batch records count Steam purchases only; search rows count reviews in the requested language. Use the review summary endpoint with `purchase=all` for every purchase type.
      - **percentPositive** (required) — type `integer`; nullable. Share of reviews that recommend the app, 0 to 100.
      - **score** (required) — type `integer`; nullable. Steam's review score, 0 (none) to 9 (overwhelmingly positive).
      - **label** (required) — type `string`; nullable. Steam's label for the score, e.g. `Very Positive`.
    - **price** (required) — type `object`; nullable. Price in the requested country; null for free apps and apps without a price.
      - **currency** (required) — type `string`; nullable. ISO currency code, e.g. `USD`, when known; otherwise null.
      - **initial** (required) — type `integer`; nullable. Price before any discount, in hundredths of the currency unit (divide by 100, also for yen and won). Null when only the discounted price is available and the currency could not be determined.
      - **final** (required) — type `integer`; nullable. Price to pay now, in hundredths of the currency unit (divide by 100, also for yen and won).
      - **discountPercent** (required) — type `integer`. Current discount, 0 to 100.
      - **initialFormatted** (required) — type `string`; nullable. Price before discount as text, e.g. `$19.99`; null when there is no discount or no formatted price is available, as on suggestions and featured items.
      - **finalFormatted** (required) — type `string`; nullable. Price now as text, e.g. `$9.99`; null when no formatted price is available, as on suggestions and featured items.
    - **imageUrl** (required) — type `string`; nullable. Header image URL.
    - **shortDescription** (required) — type `string`; nullable. One-paragraph description as plain text.
    - **description** (required) — type `string`; nullable. Full description as HTML.
    - **descriptionText** (required) — type `string`; nullable. Full description as plain text.
    - **requiredAge** (required) — type `integer`; nullable. Minimum age Steam asks for, 0 when none.
    - **website** (required) — type `string`; nullable. The developer's website.
    - **support** (required) — type `object`; nullable. Where to get support.
      - **url** (required) — type `string`; nullable. Support URL.
      - **email** (required) — type `string`; nullable. Support email.
    - **franchises** (required) — type `array`. Franchise names.
      - _items:_
        - type `string`
    - **parentAppId** (required) — type `integer`; nullable. For DLC and demos: the app id of the full game.
    - **dlcIds** (required) — type `array`. App ids of the app's DLC.
      - _items:_
        - type `integer`
    - **demoIds** (required) — type `array`. App ids of the app's demos.
      - _items:_
        - type `integer`
    - **packageIds** (required) — type `array`. Package ids the app is sold in.
      - _items:_
        - type `integer`
    - **releaseDateText** (required) — type `string`; nullable. Release date in words, e.g. `Apr 18, 2011` or `Coming soon`.
    - **earlyAccess** (required) — type `boolean`; nullable. Whether the app is in Early Access.
    - **platforms** (required) — type `object`. Operating systems and Valve device compatibility.
      - **windows** (required) — type `boolean`. Whether the app runs on Windows.
      - **mac** (required) — type `boolean`. Whether the app runs on macOS.
      - **linux** (required) — type `boolean`. Whether the app runs on Linux.
      - **vr** (required) — type `boolean`. Whether the app supports VR headsets.
      - **steamDeck** (required) — type `string`; enum: unknown, unsupported, playable, verified, null; nullable. Valve's compatibility rating; null when not reported.
      - **steamOs** (required) — type `string`; enum: unknown, unsupported, playable, verified, null; nullable. Valve's compatibility rating; null when not reported.
      - **steamMachine** (required) — type `string`; enum: unknown, unsupported, playable, verified, null; nullable. Valve's compatibility rating; null when not reported.
      - **steamFrame** (required) — type `string`; enum: unknown, unsupported, playable, verified, null; nullable. Valve's compatibility rating; null when not reported.
    - **categories** (required) — type `array`. Store categories such as player modes and features.
      - _items:_
    - **genres** (required) — type `array`. Genres.
      - _items:_
    - **tags** (required) — type `array`. User tags, most voted first.
      - _items:_
    - **languages** (required) — type `array`. Supported languages.
      - _items:_
    - **controllerSupport** (required) — type `string`; nullable. `full` or `partial`; null when none.
    - **contentDescriptors** (required) — type `object`. Mature-content descriptors.
      - **ids** (required) — type `array`. Steam content descriptor ids.
        - _items:_
          - type `integer`
      - **notes** (required) — type `string`; nullable. The developer's content notes.
    - **ratings** (required) — type `array`. Age ratings by agency.
      - _items:_
    - **metacritic** (required) — type `object`; nullable. Metacritic score; null when none.
      - **score** (required) — type `integer`. Metacritic score, 0 to 100.
      - **url** (required) — type `string`; nullable. Metacritic page.
    - **recommendationCount** (required) — type `integer`; nullable. Total user reviews for the app.
    - **achievementCount** (required) — type `integer`; nullable. Number of achievements.
    - **requirements** (required) — type `object`. System requirements per operating system.
      - **windows** (required) — type `object`; nullable. Requirements on Windows.
      - **mac** (required) — type `object`; nullable. Requirements on macOS.
      - **linux** (required) — type `object`; nullable. Requirements on Linux.
    - **legal** (required) — type `object`. Legal text for the app.
      - **notice** (required) — type `string`; nullable. Legal notice.
      - **drm** (required) — type `string`; nullable. DRM notice.
      - **thirdPartyAccount** (required) — type `string`; nullable. Notice that a third-party account is required.
    - **images** (required) — type `object`. Key art URLs on Valve's image servers.
      - **header** (required) — type `string`; nullable. Wide header image shown at the top of the store page.
      - **capsule** (required) — type `string`; nullable. Small capsule image used in store lists.
      - **background** (required) — type `string`; nullable. Background image of the store page.
      - **library** (required) — type `string`; nullable. Portrait library capsule.
      - **libraryHero** (required) — type `string`; nullable. Wide library hero.
    - **screenshots** (required) — type `array`. Screenshots.
      - _items:_
    - **trailers** (required) — type `array`. Trailers and videos.
      - _items:_
    - **purchaseOptions** (required) — type `array`. Ways to buy the app: packages and bundles, with prices.
      - _items:_
    - **reviewSummary** (required) — type `object`. Review summaries. For every purchase type, use the review summary endpoint with `purchase=all`.
      - **allLanguages** (required) — type `object`; nullable. All languages, Steam purchases only.
      - **requestedLanguage** (required) — type `object`; nullable. Reviews written in the requested `language`, Steam purchases only.
    - **antiCheat** (required) — type `object`; nullable. The anti-cheat the developer declares; null when none.
      - **name** (required) — type `string`; nullable. Anti-cheat product, e.g. `Easy Anti-Cheat`, `BattlEye` or `VAC (Valve Anti-Cheat)`; null when the developer gives no name.
      - **kernelMode** (required) — type `boolean`. Whether it runs with kernel-level access to the system.
      - **bootProtection** (required) — type `string`; nullable. Boot protection the app asks for, e.g. `secureboot_tpm2`; null when none.
    - **aiDisclosure** (required) — type `string`; nullable. The developer's statement about AI-generated content; null when there is none.
    - **links** (required) — type `array`. The developer's social and community links.
      - _items:_
  - **unavailableInCountry** (optional) — type `boolean`. True when the app exists but is not sold in the requested country; `lookupStatus` is then `not_found` and `app` is null. Omitted otherwise.
  - **name** (optional) — type `string`; nullable. The app's name when `unavailableInCountry` is true; omitted otherwise.
  - **incomplete** (required) — type `array`. Parts of `app` that are temporarily unavailable and are empty or null in it. `store_item`: tags, languages, trailers, screenshots, compatibility ratings, purchase options, review summaries, anti-cheat, AI disclosure and links. `tag_names`: the tags' names. Empty when the record is complete.
    - _items:_
      - type `string`; enum: store_item, tag_names
- **meta** (required) — type `object`. Metadata describing the request and billing outcome.
  - **requestId** (required) — type `string`; minLength: 1. Unique request identifier for tracing this API call.
  - **creditsCharged** (required) — type `integer`; minimum: 0. Credits charged for this request.
  - **version** (required) — type `string`; enum: v1. Public API version that served the response.

### Example JSON (found)

```json
{
  "data": {
    "lookupStatus": "found",
    "appId": 620,
    "country": "US",
    "app": {
      "id": 620,
      "type": "game",
      "name": "Portal 2",
      "url": "https://store.steampowered.com/app/620/Portal_2/",
      "isFree": false,
      "releaseDate": "2011-04-19T04:20:00.000Z",
      "comingSoon": false,
      "developers": [
        "Valve"
      ],
      "publishers": [
        "Valve"
      ],
      "tagIds": [
        4182
      ],
      "reviews": {
        "count": 392746,
        "percentPositive": 98,
        "score": 9,
        "label": "Overwhelmingly Positive"
      },
      "price": {
        "currency": "USD",
        "initial": 999,
        "final": 999,
        "discountPercent": 0,
        "initialFormatted": null,
        "finalFormatted": "$9.99"
      },
      "imageUrl": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/620/faffc0f560786e2f05104a8d2fac837c6969bf13/header.…",
      "shortDescription": "The \"Perpetual Testing Initiative\" has been expanded to allow you to design co-op puzzles for you and your friends!",
      "description": "Portal 2 draws from the award-winning formula of innovative gameplay, story, and music that earned the original Portal …",
      "descriptionText": "Portal 2 draws from the award-winning formula of innovative gameplay, story, and music that earned the original Portal …",
      "requiredAge": 0,
      "website": "http://www.thinkwithportals.com/",
      "support": {
        "url": "http://steamcommunity.com/app/620",
        "email": null
      },
      "franchises": [
        "Portal"
      ],
      "parentAppId": null,
      "dlcIds": [
        323180
      ],
      "demoIds": [],
      "packageIds": [
        7877
      ],
      "releaseDateText": "Apr 18, 2011",
      "earlyAccess": false,
      "platforms": {
        "windows": true,
        "mac": false,
        "linux": true,
        "vr": false,
        "steamDeck": "verified",
        "steamOs": "playable",
        "steamMachine": "verified",
        "steamFrame": "verified"
      },
      "categories": [
        {
          "id": 2,
          "name": "Single-player"
        }
      ],
      "genres": [
        {
          "id": 1,
          "name": "Action"
        }
      ],
      "tags": [
        {
          "id": 4182,
          "name": "Singleplayer",
          "votes": 604
        }
      ],
      "languages": [
        {
          "language": "English",
          "code": "english",
          "interface": true,
          "fullAudio": true,
          "subtitles": true
        }
      ],
      "controllerSupport": "full",
      "contentDescriptors": {
        "ids": [],
        "notes": null
      },
      "ratings": [
        {
          "agency": "dejus",
          "rating": "12",
          "descriptors": "Linguagem imprópria",
          "requiredAge": 12,
          "generated": true,
          "banned": false,
          "interactiveElements": null
        }
      ],
      "metacritic": {
        "score": 95,
        "url": "https://www.metacritic.com/game/pc/portal-2?ftag=MCD-06-10aaa1f"
      },
      "recommendationCount": 392814,
      "achievementCount": 51,
      "requirements": {
        "windows": {
          "minimum": "OS *: Windows 7 / Vista / XP\nProcessor: 3.0 GHz P4, Dual Core 2.0 (or higher) or AMD64X2 (or higher)\nMemory: 2 GB RAM\nG…",
          "recommended": null
        },
        "mac": {
          "minimum": "OS: MAC OS X 10.6.7 or higher\nProcessor: Intel Core Duo Processor (2GHz or better)\nMemory: 2 GB RAM\nGraphics: ATI Radeo…",
          "recommended": null
        },
        "linux": {
          "minimum": "OS: Ubuntu 12.04\nProcessor: Dual core from Intel or AMD at 2.8 GHz\nMemory: 2 GB RAM\nGraphics: nVidia GeForce 8600/9600G…",
          "recommended": null
        }
      },
      "legal": {
        "notice": null,
        "drm": null,
        "thirdPartyAccount": null
      },
      "images": {
        "header": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/620/faffc0f560786e2f05104a8d2fac837c6969bf13/header.…",
        "capsule": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/620/bd23943dcd0280aa2cdc066e2f86d2185cfd4cce/capsule…",
        "background": "https://store.akamai.steamstatic.com/images/storepagebackground/app/620?t=1790187113",
        "library": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/620/library_600x900.jpg?t=1790187113",
        "libraryHero": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/620/a58588d857b8683f8065e55f97ab82ad8a945c51/library…"
      },
      "screenshots": [
        {
          "thumbnailUrl": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/620/ss_f3f6787d74739d3b2ec8a484b5c994b3d31ef325.600x…",
          "url": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/620/ss_f3f6787d74739d3b2ec8a484b5c994b3d31ef325.1920…",
          "mature": false
        }
      ],
      "trailers": [
        {
          "name": "Portal 2 E3 Demo (Excursion Funnels)",
          "thumbnailUrl": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/5787/movie.293x165.jpg?t=1682715616",
          "mp4Url": "https://video.akamai.steamstatic.com/store_trailers/620/3746/0f4bee66d490b637707ac4fca3e850f2cc2d3b2a/1750108721/microt…",
          "webmUrl": "https://video.akamai.steamstatic.com/store_trailers/620/3746/0f4bee66d490b637707ac4fca3e850f2cc2d3b2a/1750108721/microt…",
          "hlsUrl": "https://video.akamai.steamstatic.com/store_trailers/620/3746/0f4bee66d490b637707ac4fca3e850f2cc2d3b2a/1750108721/hls_26…",
          "dashUrl": "https://video.akamai.steamstatic.com/store_trailers/620/3746/0f4bee66d490b637707ac4fca3e850f2cc2d3b2a/1750108721/dash_h…",
          "dashAv1Url": "https://video.akamai.steamstatic.com/store_trailers/620/3746/0f4bee66d490b637707ac4fca3e850f2cc2d3b2a/1750108721/dash_a…",
          "highlight": true
        }
      ],
      "purchaseOptions": [
        {
          "packageId": 7877,
          "bundleId": null,
          "name": "Portal 2",
          "price": {
            "currency": "USD",
            "initial": 999,
            "final": 999,
            "discountPercent": 0,
            "initialFormatted": null,
            "finalFormatted": "$9.99"
          },
          "canGift": true
        }
      ],
      "reviewSummary": {
        "allLanguages": {
          "count": 392746,
          "percentPositive": 98,
          "score": 9,
          "label": "Overwhelmingly Positive"
        },
        "requestedLanguage": {
          "count": 174846,
          "percentPositive": 98,
          "score": 9,
          "label": "Overwhelmingly Positive"
        }
      },
      "antiCheat": null,
      "aiDisclosure": null,
      "links": []
    },
    "incomplete": []
  },
  "meta": {
    "requestId": "req_031f70c7-3908-4291-982c-d9b9e2d4d46a",
    "creditsCharged": 1,
    "version": "v1"
  }
}
```

### Machine-readable error codes

When an error JSON body is returned, it may include one of these `error.code` values (derived from the OpenAPI schemas for this operation; additional codes may exist at runtime):

- `bad_request`

## Error handling & retries

Interpret HTTP status codes using the descriptions below. Do not assume a JSON body unless the OpenAPI schema defines one for that status.

- **400**: Invalid request **Retry:** Fix the request; retrying the same invalid payload will not help.
- **401**: Missing or invalid API key **Retry:** Fix the API key first; retrying without changes will not help.
- **402**: Insufficient credits **Retry:** Do not retry without resolving billing/credits (retrying the same request will not help).
- **500**: Unexpected or billing error
- **502**: Lookup could not be completed. **Retry:** May be transient; a few retries with backoff are reasonable.
- **503**: Service temporarily unavailable; safe to retry with backoff. **Retry:** Usually safe to retry with exponential backoff and jitter.

### Suggested client defaults

- Send the API key using the `x-api-key` header on every request.
- On `503` (and sometimes `502`), retry with backoff; cap retries and surface a clear error to the user.
- On `402`, surface an actionable billing message rather than blind retries.

## Examples

### TypeScript SDK

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

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

const result = await client.steam.getApp({
  appId: 620,
  country: "US",
});

if (!result.ok) {
  console.error(result.error);
} else {
  console.log(result.value.data);
}
```

### Node.js

```javascript
const response = await fetch(
  "https://api.socialfetch.dev/v1/steam/apps/620?country=US",
  {
    headers: {
      "x-api-key": "YOUR_API_KEY"
    }
  }
);

const data = await response.json();
console.log(data);
```

### cURL

```bash
curl "https://api.socialfetch.dev/v1/steam/apps/620?country=US" \
  -H "x-api-key: YOUR_API_KEY"
```

### Python

```python
import requests

response = requests.get(
    "https://api.socialfetch.dev/v1/steam/apps/620?country=US",
    headers={"x-api-key": "YOUR_API_KEY"},
)
data = response.json()
print(data)
```