---
title: "Get Publisher Games"
method: GET
path: "/api/publishers/{slug}"
tags: ["catalog"]
---

# Get Publisher Games

`GET /api/publishers/{slug}`

## 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/publishers/{slug}`
- Auth: none declared

One publisher's games, a page at a time — and, in `X-Publisher`, the
publisher itself.

The page for a publisher needs its name, its logo and how many games it
has, and the only place it could get them was `/publishers` with no limit:
every publisher there is, 12,000 rows and 1.1 MB, to find one. They ride
on this response instead.

A header rather than a field, for the reason the paging facts are headers
(`_page`): the body is a plain list, and wrapping it to add one would
change its shape under every caller, the WebMCP tools included. The value
is `PublisherOut` as JSON, the same shape the index returns, ASCII-escaped
because a header must be — publisher names are written in every script.
Its `games` is the unfiltered count the index shows, not `X-Total`: it is
what decides whether the page may be indexed, and ticking a filter must not
change that.

## Path parameters

- `slug` string, required

## Query parameters

- `limit` integer
- `offset` 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

- 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

## 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)
