> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cromos.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Get a card

> One card, with every printing and its current prices.

Ids are `<expansion>-<number>`, so `base1-4` is Charizard from Base Set. If you have a name and
not an id, pass it as `q` to [List cards](/cards/list) first.

You get [the card object](/cards/object), including every printing and the current price of
each. For price history rather than the latest figure, use [Get card prices](/cards/prices).

Pass `include=change` to attach price-change data for the card's headline printing. See
[Change](/cards/object#change) on the card object.


## OpenAPI

````yaml openapi.json GET /v1/cards/{id}
openapi: 3.0.0
info:
  title: Cromos API
  version: 1.0.0
servers:
  - url: https://api.cromos.so
security:
  - bearerAuth: []
paths:
  /v1/cards/{id}:
    get:
      tags:
        - Cards
      summary: Get a card
      description: >-
        One card with its full metadata and every printing it exists in, each
        carrying its own current prices. `include=change` additionally attaches
        every computed window of price change for the card's headline printing,
        absent if the card has no computed mover row. Returns 404 if no card
        carries the id.
      operationId: getCard
      parameters:
        - schema:
            type: string
          required: true
          name: id
          in: path
        - schema:
            type: string
            description: >-
              Comma-separated extras to attach: `change`. A value that is not
              recognised is dropped rather than rejected.
          required: false
          description: >-
            Comma-separated extras to attach: `change`. A value that is not
            recognised is dropped rather than rejected.
          name: include
          in: query
      responses:
        '200':
          description: Card detail with current prices
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Card'
                  error:
                    type: object
                    nullable: true
                required:
                  - data
                  - error
              example:
                data:
                  id: base1-4
                  expansion_id: base1
                  number: '4'
                  name: Charizard
                  rarity: Rare
                  illustrator: Mitsuhiro Arita
                  image:
                    low: https://assets.cromos.so/cards/base1-4/low.webp
                    high: https://assets.cromos.so/cards/base1-4/high.webp
                  palette:
                    - '#eeca41'
                    - '#e4ada3'
                    - '#5c1315'
                    - '#b47a73'
                  category: Pokemon
                  metadata:
                    hp: 120
                    types:
                      - Fire
                    pokedex_numbers:
                      - 6
                    stage: Stage2
                    evolve_from: Charmeleon
                    description: >-
                      Spits fire that is hot enough to melt boulders. Known to
                      unintentionally cause forest fires.
                    effect: null
                    trainer_type: null
                    energy_type: null
                    retreat: 3
                    abilities:
                      - kind: pokemon-power
                        name: Energy Burn
                        text: >-
                          As often as you like during your turn (before your
                          attack), you may turn all Energy attached to Charizard
                          into Fire Energy for the rest of the turn. This power
                          can't be used if Charizard is Asleep, Confused, or
                          Paralyzed.
                    attacks:
                      - cost:
                          - Fire
                          - Fire
                          - Fire
                          - Fire
                        name: Fire Spin
                        text: >-
                          Discard 2 Energy cards attached to Charizard in order
                          to use this attack.
                        damage: '100'
                    weaknesses:
                      - type: Water
                        modifier: x2
                    resistances:
                      - type: Fighting
                        modifier: '-30'
                    legality:
                      expanded: false
                      standard: false
                  variants:
                    - id: 14
                      type: holo
                      subtype: unlimited
                      size: standard
                      stamps: []
                      foil: null
                      tcgplayer:
                        - condition: NM
                          currency: USD
                          market: 85242
                          low: 42650
                          high: 149965
                          listing_count: 12
                          observed_on: '2026-08-17'
                        - condition: LP
                          currency: USD
                          market: 50972
                          low: 35593
                          high: 67838
                          listing_count: 25
                          observed_on: '2026-08-17'
                        - condition: MP
                          currency: USD
                          market: 38656
                          low: 34500
                          high: 46472
                          listing_count: 25
                          observed_on: '2026-08-17'
                        - condition: HP
                          currency: USD
                          market: 28147
                          low: 26900
                          high: 30000
                          listing_count: 25
                          observed_on: '2026-08-17'
                        - condition: DMG
                          currency: USD
                          market: 19690
                          low: 11877
                          high: 24800
                          listing_count: 25
                          observed_on: '2026-08-17'
                    - id: 15
                      type: holo
                      subtype: shadowless
                      size: standard
                      stamps:
                        - 1st-edition
                      foil: null
                      tcgplayer: []
                    - id: 16
                      type: holo
                      subtype: shadowless
                      size: standard
                      stamps: []
                      foil: null
                      tcgplayer: []
                    - id: 17
                      type: holo
                      subtype: 1999-2000-copyright
                      size: standard
                      stamps: []
                      foil: null
                      tcgplayer: []
                  change:
                    - window: 1d
                      card_variant_id: 14
                      printing: holo
                      start_cents: 82538
                      end_cents: 85242
                      change_cents: 2704
                      change_bp: 328
                      start_as_of: '2026-08-10'
                      observed_on: '2026-08-17'
                    - window: 7d
                      card_variant_id: 14
                      printing: holo
                      start_cents: 82538
                      end_cents: 85242
                      change_cents: 2704
                      change_bp: 328
                      start_as_of: '2026-08-10'
                      observed_on: '2026-08-17'
                error: null
        '304':
          description: >-
            Not modified. The `If-None-Match` you sent still matches, and there
            is no body.
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
        '400':
          description: Bad request
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not found
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate limited
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal error
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    Card:
      type: object
      properties:
        id:
          type: string
        expansion_id:
          type: string
        number:
          type: string
          nullable: true
          description: The printed collector number, e.g. `TG01`.
        name:
          type: string
        rarity:
          type: string
          nullable: true
        illustrator:
          type: string
          nullable: true
        image:
          $ref: '#/components/schemas/ImageUrls'
        palette:
          type: array
          nullable: true
          items:
            type: string
          description: >-
            Up to four dominant colours from the card art, most prominent first,
            as `#rrggbb`. Colours that appear only around the edge of the card,
            such as the printed border, are left out. Where the art carries a
            strong colour, the first entry is that colour rather than a grey or
            a white the card has more of; art with no strong colour leads with a
            neutral instead. Null when no image is available or it yields no
            colour, and may contain fewer than four: the list is never padded
            with colours the art does not contain.
        category:
          type: string
          nullable: true
        metadata:
          $ref: '#/components/schemas/CardMetadata'
        variants:
          type: array
          items:
            $ref: '#/components/schemas/CardVariant'
        change:
          type: array
          items:
            type: object
            properties:
              window:
                type: string
                enum:
                  - 1d
                  - 7d
                  - 30d
                description: The window this change was measured over.
              card_variant_id:
                type: integer
                description: >-
                  The stable id of the printing this row is about, the same id
                  `variants[].id` carries on the card. Use it to match the row
                  to a printing: it is exact, where `printing` is not.
              printing:
                type: string
                description: >-
                  Which printing of the card moved. This is the printing `type`
                  alone (`normal`, `holo`, `reverse` and so on), and it is not
                  unique on its own: a card can have two printings of the same
                  `type`, differing on `subtype`, `size`, `stamps` or `foil`.
                  Read `card_variant_id` to tell which one this is.
              start_cents:
                type: integer
                description: Market price at the start of the window, in cents.
              end_cents:
                type: integer
                description: Market price now, in cents.
              change_cents:
                type: integer
                description: '`end_cents - start_cents`.'
              change_bp:
                type: integer
                description: >-
                  Change in basis points. +34.20% is `3420`. Integer, never a
                  float.
              start_as_of:
                type: string
                description: >-
                  The day `start_cents` was actually observed. Earlier than the
                  window start whenever the value was carried forward -- prices
                  are stored as a change log, so a flat card has no row on most
                  days. Use this to tell a held price from a stale one.
              observed_on:
                type: string
                description: The day `end_cents` was observed.
            required:
              - window
              - card_variant_id
              - printing
              - start_cents
              - end_cents
              - change_cents
              - change_bp
              - start_as_of
              - observed_on
          description: >-
            Present only with `?include=change`, and only when this card has a
            computed mover row. Every window computed for the card's HEADLINE
            printing -- the one its displayed price is read from, not
            necessarily the one that moved the most -- so a client can switch
            window without a refetch. Without the parameter, or when no printing
            qualifies, the key is absent entirely.
      required:
        - id
        - expansion_id
        - number
        - name
        - rarity
        - illustrator
        - image
        - palette
        - category
        - metadata
        - variants
    ErrorResponse:
      type: object
      properties:
        data:
          type: object
          nullable: true
        error:
          $ref: '#/components/schemas/ApiError'
      required:
        - data
        - error
    ImageUrls:
      type: object
      nullable: true
      properties:
        low:
          type: string
          format: uri
          description: Thumbnail-sized rendition. May be the same URL as `high`.
        high:
          type: string
          format: uri
          description: Full-sized rendition. May be the same URL as `low`.
      required:
        - low
        - high
    CardMetadata:
      type: object
      nullable: true
      properties:
        hp:
          type: number
          nullable: true
        types:
          type: array
          nullable: true
          items:
            type: string
        pokedex_numbers:
          type: array
          nullable: true
          items:
            type: number
        stage:
          type: string
          nullable: true
        evolve_from:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        effect:
          type: string
          nullable: true
        trainer_type:
          type: string
          nullable: true
        energy_type:
          type: string
          nullable: true
        retreat:
          type: number
          nullable: true
        abilities:
          type: array
          nullable: true
          items:
            type: object
            properties:
              kind:
                type: string
                description: >-
                  The rule box kind: `ability`, `pokemon-power`, `poke-body` and
                  so on.
              name:
                type: string
              text:
                type: string
                nullable: true
            required:
              - kind
              - name
              - text
        attacks:
          type: array
          nullable: true
          items:
            type: object
            properties:
              name:
                type: string
              cost:
                type: array
                nullable: true
                items:
                  type: string
                description: Energy symbols in printed order.
              damage:
                type: string
                nullable: true
                description: 'As printed: `80`, `80+`, `30x`.'
              text:
                type: string
                nullable: true
            required:
              - name
              - cost
              - damage
              - text
        weaknesses:
          type: array
          nullable: true
          items:
            type: object
            properties:
              type:
                type: string
              modifier:
                type: string
                nullable: true
                description: 'As printed, ascii: `x2`, `-30`, `+10`.'
            required:
              - type
              - modifier
        resistances:
          type: array
          nullable: true
          items:
            type: object
            properties:
              type:
                type: string
              modifier:
                type: string
                nullable: true
                description: 'As printed, ascii: `x2`, `-30`, `+10`.'
            required:
              - type
              - modifier
        legality:
          type: object
          nullable: true
          properties:
            standard:
              type: boolean
            expanded:
              type: boolean
          required:
            - standard
            - expanded
      required:
        - hp
        - types
        - pokedex_numbers
        - stage
        - evolve_from
        - description
        - effect
        - trainer_type
        - energy_type
        - retreat
        - abilities
        - attacks
        - weaknesses
        - resistances
        - legality
    CardVariant:
      type: object
      properties:
        id:
          type: integer
          description: >-
            Stable identifier for this printing. Use it to key stored prices,
            and to resolve a `pokemon.card_variants.deleted` event. Lasts as
            long as the printing it names: when a printing is reclassified, the
            old id is deleted and a new one takes its place.
        type:
          type: string
          description: >-
            The printing: `normal`, `holo`, `reverse` and so on. A printing, not
            a physical dimension. See `size`.
        subtype:
          type: string
          nullable: true
          description: A narrower printing within `type`, where one exists.
        size:
          type: string
          nullable: true
          description: >-
            The physical card size, such as `standard` or `jumbo`. A different
            axis from `type`: a jumbo card and a holo card are not alternatives.
        stamps:
          type: array
          items:
            type: string
          description: >-
            Promotional stamps printed on this variant, such as a prerelease or
            staff stamp.
        foil:
          type: string
          nullable: true
          description: The foil treatment, where the printing carries one.
        tcgplayer:
          type: array
          items:
            $ref: '#/components/schemas/TcgplayerPrice'
      required:
        - id
        - type
        - subtype
        - size
        - stamps
        - foil
        - tcgplayer
    ApiError:
      type: object
      properties:
        code:
          type: string
          description: A stable machine-readable token. Switch on this, not on `message`.
        message:
          type: string
          description: A human-readable sentence. Always present, never empty.
      required:
        - code
        - message
    TcgplayerPrice:
      type: object
      properties:
        condition:
          type: string
        currency:
          type: string
          enum:
            - USD
        market:
          type: integer
          nullable: true
          description: An integer amount in cents (minor units).
        low:
          type: integer
          nullable: true
          description: An integer amount in cents (minor units).
        high:
          type: integer
          nullable: true
          description: An integer amount in cents (minor units).
        listing_count:
          type: integer
          nullable: true
          description: >-
            How many active listings this price is computed from. 1 means the
            price is a single seller's asking price, not a market consensus. The
            value caps at 25, so 25 means 25 or more. Null where no count is
            available.
        observed_on:
          type: string
          description: The date this price was observed, as YYYY-MM-DD.
      required:
        - condition
        - currency
        - market
        - low
        - high
        - listing_count
        - observed_on
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````