---
title: "Search Everything"
method: GET
path: "/api/search"
tags: ["catalog"]
---

# Search Everything

`GET /api/search`

## Request

- Base URL: `https://api.getcheapgames.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.getcheapgames.com/api/search`
- Auth: none declared

One term, three kinds of answer.

"team" is a game word, a franchise word and a publisher name at once, and a
visitor typing it means any of them. Splitting the answer lets the page say
which is which instead of ranking incomparable things against each other.

## Query parameters

- `q` string, required: Search term
- `limit` integer
- `on_sale` boolean: Only offers marked down by their store
- `stores` string[], nullable: Store codes
- `platforms` string[], nullable: Canonical platforms
- `genres` string[], nullable: Steam genre descriptions
- `regions` string[], nullable: Offer regions
- `types` string[], nullable: game, dlc, pass, soundtrack or free; anything else is ignored
- `country` string, nullable: ISO country code; decides which keys are region-locked FOR YOU
- `currency` string, nullable: One of EUR, GBP, USD, CAD, CHF, DKK, SEK, NOK, PLN, CZK, HUF, BRL, MXN, CLP, COP, PEN, CRC, UYU, GTQ

## Response `200`

Successful Response

- SearchOut: Everything a term matched, split by what kind of thing it is. Three lists rather than one ranked blend: a franchise and a game are not comparable by price, and interleaving them would force an ordering that means nothing. The client shows a column per non-empty list.
  - `games` GameCardOut[]
    - `slug` string, required
    - `title` string, required
    - `releaseYear` integer, nullable, required
    - `releaseDate` string, date, nullable
    - `publisher` string, required
    - `genres` string[], required
    - `steamAppId` integer, nullable
    - `coverBase` string, nullable
    - `priceHistory` integer[]
    - `kind` string
    - `isFree` boolean
    - `freeToKeep` boolean
    - `giveaway` GcgSchemasGiveawayOut: A giveaway on another store than Steam: what the claim button says and where it goes (`catalog.GIVEAWAY_ELSEWHERE`). Steam's own is the game's `free_to_keep`, whose link the client builds from the appid.
      - `platform` string, required
      - `claimUrl` string, nullable
      - `endsAt` string, date-time, nullable
    - `playUrl` string, nullable
    - `edition` string, nullable
    - `franchise` string, nullable
    - `offers` OfferCardOut[]
      - `store` StoreRefOut, required: The store fields a client needs to render an offer. Embedded in each offer rather than referenced by id: it removes a client-side join and a second request, and six short records across a response is nothing next to the round trip it saves.
        - `code` string, required
        - `name` string, required
        - `accent` string, required
        - `kind` string, required
      - `currency` string, required
      - `listPriceCents` integer, nullable, required
      - `feeCents` integer, required
      - `totalCents` integer, required
      - `platform` string, required
      - `inStock` boolean, required
  - `franchises` FranchiseOut[]
    - `name` string, required
    - `games` integer, required
    - `coverBase` string, nullable
    - `publisher` string, nullable
  - `publishers` PublisherOut[]
    - `slug` string, required
    - `name` string, required
    - `games` integer, required
    - `logo` string, nullable
    - `logoDark` boolean

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/getcheapgames/apis/getcheapgames-api.md) · [All operations](https://skmtc.dev/getcheapgames/apis/getcheapgames-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getcheapgames/apis/getcheapgames-api/revisions/57333a690301?raw)
