---
name: manifest-api
description: Use when writing code that reads One Piece Card Game cards, printings or sets from the Manifest API (api.manifestcards.app).
---

# Manifest API

Manifest is a free, read-only JSON API for every One Piece Card Game card and printing, in English and Japanese, with each printing linked across languages and given an ID that never changes.

- Base URL: https://api.manifestcards.app/v1
- Auth: send the key in the `X-API-Key` header. Keys are free: sign in at https://manifestcards.app/sign-in and create one on https://manifestcards.app/profile. Read it from an environment variable such as `MANIFEST_KEY`, keep it on the server, and never commit it.
- Docs index: https://manifestcards.app/llms.txt
- Every guide in one file: https://manifestcards.app/llms-full.txt
- Every endpoint, parameter and field: https://manifestcards.app/openapi.json (OpenAPI 3.1)

## Rules

- Every endpoint is a `GET` that answers with JSON. A record comes back in `data`; a list comes back in `data` with `meta`.
- Page lists with `meta.next_cursor`: pass it back as `?cursor=` with the same filters until it is `null`. `limit` is 1 to 200 (default 50). Cursors are opaque: never build or parse them.
- Each key gets 60 requests a minute and 10,000 a day. Read `X-RateLimit-Remaining` and `X-RateLimit-Reset`, request one page at a time, and on `429 rate_limited` wait `Retry-After` seconds before retrying.
- Cache responses. They are safe to reuse for 5 minutes (`Cache-Control: private, max-age=300`), and sending the `ETag` back in `If-None-Match` returns `304 Not Modified` until the data changes.
- IDs (`set_`, `crd_`, `prt_`, `pgr_` plus a ULID) never change and are never reused. Store them and key your data by them, but treat them as opaque.
- A card is the game object (cost, power, colors, text). A printing is one physical version of it in one language and product.
- The English and Japanese versions of a printing share a `group_id` (`null` when `single_language` is `true`). To pair them, list `/v1/printings?card={number}&lang=all` and match on `group_id`. Never pair by card number or suffix.
- `lang` is `en`, `ja` or `all` (the default).
- Show images with `image_url`. Browsers refuse `official_image_url` (Bandai's copy) on other sites.
- There is no price data. Don't look for price fields or make prices up.
- Errors look like `{ "error": { "code": "...", "message": "..." } }`: `400 bad_request`, `401 unauthorized`, `404 not_found`, `429 rate_limited`, `500 internal`.
