{
  "openapi": "3.1.0",
  "info": {
    "title": "LootLoom demo catalog API",
    "version": "1.0.0",
    "summary": "Read-only API over the demo catalog of the LootLoom marketplace preview.",
    "description": "LootLoom is a preview: every game offer, seller, price, rating, sale and review is generated demo data. Nothing can be bought, sold or delivered. The API only reads the fixed demo catalog (32 games, 420 offers, 56 fictional sellers). There are no accounts, orders, payments or write operations. No authentication; CORS is open (`Access-Control-Allow-Origin: *`). Rate limit: 120 requests per 60 seconds per client IP, reported with IETF RateLimit headers. Prices are in EUR. Versioning: The API is versioned in the path: the current major version is v1 (`/api/v1/`, OpenAPI `info.version` 1.0.0, semantic versioning). Within v1 changes are only additive (new optional fields, parameters or operations). Breaking changes get a new major version under a new path (/api/v2/), and the previous version keeps working in parallel. A deprecated operation is marked `deprecated: true` in the OpenAPI description and announced in these docs and in /llms.txt, its responses carry the `Deprecation` (RFC 9745) and `Sunset` (RFC 8594) headers with a `Link` rel=\"deprecation\" to the notice, and it stays available for at least 90 days after the deprecation is announced.",
    "contact": {
      "name": "AdScaled",
      "email": "contact@adscaled.media",
      "url": "https://gameshop.adscaled.media/en/contact"
    },
    "license": {
      "name": "Demo data, no warranty",
      "url": "https://gameshop.adscaled.media/en/about"
    }
  },
  "servers": [
    {
      "url": "https://gameshop.adscaled.media",
      "description": "Production (preview)"
    }
  ],
  "externalDocs": {
    "description": "Human-readable documentation",
    "url": "https://gameshop.adscaled.media/docs"
  },
  "tags": [
    {
      "name": "Catalog",
      "description": "Demo games and offers."
    },
    {
      "name": "Status",
      "description": "Service status."
    }
  ],
  "paths": {
    "/api/v1/health": {
      "get": {
        "operationId": "getHealth",
        "tags": [
          "Status"
        ],
        "summary": "Service status",
        "description": "Always reports preview mode with payments disabled.",
        "responses": {
          "200": {
            "description": "Service is up.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Health"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/games": {
      "get": {
        "operationId": "listGames",
        "tags": [
          "Catalog"
        ],
        "summary": "List the 32 demo games",
        "parameters": [
          {
            "$ref": "#/components/parameters/lang"
          }
        ],
        "responses": {
          "200": {
            "description": "All games with their categories and offer counts.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Game"
                      }
                    },
                    "meta": {
                      "type": "object",
                      "required": [
                        "lang",
                        "currency",
                        "demo",
                        "notice"
                      ],
                      "properties": {
                        "lang": {
                          "type": "string",
                          "enum": [
                            "cs",
                            "en",
                            "ru",
                            "de",
                            "fr"
                          ]
                        },
                        "currency": {
                          "type": "string",
                          "const": "EUR"
                        },
                        "demo": {
                          "type": "boolean",
                          "const": true,
                          "description": "Always true: all data is demonstration data."
                        },
                        "notice": {
                          "type": "string"
                        },
                        "total": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "Number of matching items before paging."
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 100
                        },
                        "offset": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "sort": {
                          "type": "string",
                          "enum": [
                            "popular",
                            "price-asc",
                            "price-desc",
                            "newest",
                            "rating",
                            "sales"
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid query parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/games/{slug}": {
      "get": {
        "operationId": "getGame",
        "tags": [
          "Catalog"
        ],
        "summary": "One demo game",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Game slug, e.g. minecraft.",
            "schema": {
              "type": "string",
              "enum": [
                "counter-strike-2",
                "dota-2",
                "fortnite",
                "minecraft",
                "gta-v",
                "gta-online",
                "roblox",
                "valorant",
                "league-of-legends",
                "world-of-warcraft",
                "rust",
                "escape-from-tarkov",
                "ea-sports-fc",
                "call-of-duty",
                "pubg",
                "apex-legends",
                "war-thunder",
                "world-of-tanks",
                "genshin-impact",
                "honkai-star-rail",
                "path-of-exile-2",
                "diablo-iv",
                "overwatch-2",
                "rocket-league",
                "rainbow-six-siege",
                "dead-by-daylight",
                "ark",
                "terraria",
                "brawl-stars",
                "clash-of-clans",
                "clash-royale",
                "helldivers-2"
              ]
            }
          },
          {
            "$ref": "#/components/parameters/lang"
          }
        ],
        "responses": {
          "200": {
            "description": "The game.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Game"
                    },
                    "meta": {
                      "type": "object",
                      "required": [
                        "lang",
                        "currency",
                        "demo",
                        "notice"
                      ],
                      "properties": {
                        "lang": {
                          "type": "string",
                          "enum": [
                            "cs",
                            "en",
                            "ru",
                            "de",
                            "fr"
                          ]
                        },
                        "currency": {
                          "type": "string",
                          "const": "EUR"
                        },
                        "demo": {
                          "type": "boolean",
                          "const": true,
                          "description": "Always true: all data is demonstration data."
                        },
                        "notice": {
                          "type": "string"
                        },
                        "total": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "Number of matching items before paging."
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 100
                        },
                        "offset": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "sort": {
                          "type": "string",
                          "enum": [
                            "popular",
                            "price-asc",
                            "price-desc",
                            "newest",
                            "rating",
                            "sales"
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid query parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown game slug.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/offers": {
      "get": {
        "operationId": "listOffers",
        "tags": [
          "Catalog"
        ],
        "summary": "Search and page through the demo offers",
        "parameters": [
          {
            "$ref": "#/components/parameters/lang"
          },
          {
            "name": "game",
            "in": "query",
            "description": "Only offers of this game (slug from listGames).",
            "schema": {
              "type": "string",
              "enum": [
                "counter-strike-2",
                "dota-2",
                "fortnite",
                "minecraft",
                "gta-v",
                "gta-online",
                "roblox",
                "valorant",
                "league-of-legends",
                "world-of-warcraft",
                "rust",
                "escape-from-tarkov",
                "ea-sports-fc",
                "call-of-duty",
                "pubg",
                "apex-legends",
                "war-thunder",
                "world-of-tanks",
                "genshin-impact",
                "honkai-star-rail",
                "path-of-exile-2",
                "diablo-iv",
                "overwatch-2",
                "rocket-league",
                "rainbow-six-siege",
                "dead-by-daylight",
                "ark",
                "terraria",
                "brawl-stars",
                "clash-of-clans",
                "clash-royale",
                "helldivers-2"
              ]
            }
          },
          {
            "name": "category",
            "in": "query",
            "description": "Only offers of this category id (see Game.categories).",
            "schema": {
              "type": "string",
              "enum": [
                "skins",
                "accounts",
                "cases",
                "items",
                "sets",
                "arcanas",
                "services",
                "v-bucks",
                "bundles",
                "gift-cards",
                "server-services",
                "resources",
                "keys",
                "dlc",
                "game-money",
                "robux",
                "game-passes",
                "valorant-points",
                "boosting",
                "codes",
                "riot-points",
                "gold",
                "subscriptions",
                "raids",
                "roubles",
                "gear",
                "coins",
                "squads",
                "cod-points",
                "uc",
                "apex-coins",
                "golden-eagles",
                "vehicles",
                "crystals",
                "oneiric-shards",
                "currency",
                "builds",
                "credits",
                "blueprints",
                "r6-credits",
                "auric-cells",
                "dinosaurs",
                "worlds",
                "gems",
                "passes",
                "clans",
                "super-credits",
                "warbonds"
              ]
            }
          },
          {
            "name": "seller",
            "in": "query",
            "description": "Only offers of this demo seller.",
            "schema": {
              "type": "string",
              "pattern": "^seller-\\d{2}$"
            }
          },
          {
            "name": "inStock",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "minPrice",
            "in": "query",
            "description": "Minimum price in EUR.",
            "schema": {
              "type": "number",
              "minimum": 0
            }
          },
          {
            "name": "maxPrice",
            "in": "query",
            "description": "Maximum price in EUR.",
            "schema": {
              "type": "number",
              "minimum": 0
            }
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "popular",
                "price-asc",
                "price-desc",
                "newest",
                "rating",
                "sales"
              ],
              "default": "popular"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "One page of matching offers.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Offer"
                      }
                    },
                    "meta": {
                      "type": "object",
                      "required": [
                        "lang",
                        "currency",
                        "demo",
                        "notice"
                      ],
                      "properties": {
                        "lang": {
                          "type": "string",
                          "enum": [
                            "cs",
                            "en",
                            "ru",
                            "de",
                            "fr"
                          ]
                        },
                        "currency": {
                          "type": "string",
                          "const": "EUR"
                        },
                        "demo": {
                          "type": "boolean",
                          "const": true,
                          "description": "Always true: all data is demonstration data."
                        },
                        "notice": {
                          "type": "string"
                        },
                        "total": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "Number of matching items before paging."
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 100
                        },
                        "offset": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "sort": {
                          "type": "string",
                          "enum": [
                            "popular",
                            "price-asc",
                            "price-desc",
                            "newest",
                            "rating",
                            "sales"
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid query parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/offers/{id}": {
      "get": {
        "operationId": "getOffer",
        "tags": [
          "Catalog"
        ],
        "summary": "One demo offer",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Offer id, e.g. offer-0001.",
            "schema": {
              "type": "string",
              "pattern": "^offer-\\d{4}$"
            }
          },
          {
            "$ref": "#/components/parameters/lang"
          }
        ],
        "responses": {
          "200": {
            "description": "The offer.",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Offer"
                    },
                    "meta": {
                      "type": "object",
                      "required": [
                        "lang",
                        "currency",
                        "demo",
                        "notice"
                      ],
                      "properties": {
                        "lang": {
                          "type": "string",
                          "enum": [
                            "cs",
                            "en",
                            "ru",
                            "de",
                            "fr"
                          ]
                        },
                        "currency": {
                          "type": "string",
                          "const": "EUR"
                        },
                        "demo": {
                          "type": "boolean",
                          "const": true,
                          "description": "Always true: all data is demonstration data."
                        },
                        "notice": {
                          "type": "string"
                        },
                        "total": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "Number of matching items before paging."
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 100
                        },
                        "offset": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "sort": {
                          "type": "string",
                          "enum": [
                            "popular",
                            "price-asc",
                            "price-desc",
                            "newest",
                            "rating",
                            "sales"
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid query parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown offer id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "lang": {
        "name": "lang",
        "in": "query",
        "description": "Language of the texts (default en).",
        "schema": {
          "type": "string",
          "enum": [
            "cs",
            "en",
            "ru",
            "de",
            "fr"
          ],
          "default": "en"
        }
      }
    },
    "headers": {
      "RateLimit": {
        "description": "Remaining quota and seconds to reset (draft-ietf-httpapi-ratelimit-headers).",
        "schema": {
          "type": "string",
          "examples": [
            "\"api\";r=119;t=60"
          ]
        }
      },
      "RateLimitPolicy": {
        "description": "Quota policy.",
        "schema": {
          "type": "string",
          "examples": [
            "\"api\";q=120;w=60"
          ]
        }
      },
      "RetryAfter": {
        "description": "Seconds until a new request is allowed.",
        "schema": {
          "type": "integer"
        }
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "invalid_parameter",
                  "not_found",
                  "method_not_allowed",
                  "rate_limited",
                  "server_error"
                ]
              },
              "message": {
                "type": "string"
              },
              "field": {
                "type": "string",
                "description": "The query parameter that was invalid."
              }
            }
          }
        }
      },
      "Health": {
        "type": "object",
        "required": [
          "ok",
          "mode",
          "paymentsEnabled",
          "version"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "mode": {
            "type": "string",
            "const": "preview"
          },
          "paymentsEnabled": {
            "type": "boolean",
            "const": false
          },
          "version": {
            "type": "string"
          }
        }
      },
      "Category": {
        "type": "object",
        "required": [
          "id",
          "label"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          }
        }
      },
      "Game": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "description",
          "categories",
          "offerCount",
          "image",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "categories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Category"
            }
          },
          "offerCount": {
            "type": "integer",
            "minimum": 0
          },
          "image": {
            "type": "string",
            "format": "uri"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Game page in the requested language."
          }
        }
      },
      "SellerSummary": {
        "type": "object",
        "required": [
          "id",
          "nickname",
          "rating",
          "verified",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "nickname": {
            "type": "string"
          },
          "rating": {
            "type": "number"
          },
          "verified": {
            "type": "boolean"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Offer": {
        "type": "object",
        "required": [
          "id",
          "title",
          "gameSlug",
          "categoryId",
          "category",
          "description",
          "price",
          "oldPrice",
          "currency",
          "inStock",
          "quantity",
          "deliveryId",
          "delivery",
          "attributes",
          "rating",
          "reviewCount",
          "sales",
          "publishedAt",
          "seller",
          "image",
          "url",
          "demo"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "gameSlug": {
            "type": "string"
          },
          "categoryId": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "price": {
            "type": "number",
            "description": "Demo price in EUR, not a market price."
          },
          "oldPrice": {
            "type": [
              "number",
              "null"
            ]
          },
          "currency": {
            "type": "string",
            "const": "EUR"
          },
          "inStock": {
            "type": "boolean"
          },
          "quantity": {
            "type": "integer"
          },
          "deliveryId": {
            "type": "string",
            "enum": [
              "instant",
              "min5",
              "min15",
              "min30",
              "hour1",
              "day"
            ]
          },
          "delivery": {
            "type": "string"
          },
          "attributes": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "rating": {
            "type": "number"
          },
          "reviewCount": {
            "type": "integer"
          },
          "sales": {
            "type": "integer",
            "description": "Fictional."
          },
          "publishedAt": {
            "type": "string",
            "format": "date"
          },
          "seller": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/SellerSummary"
              },
              {
                "type": "null"
              }
            ]
          },
          "image": {
            "type": "string",
            "format": "uri"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "demo": {
            "type": "boolean",
            "const": true
          }
        }
      }
    }
  }
}