openapi: 3.0.3
info:
  title: One Piece Card Game API
  description: |
    A powerful and comprehensive API for accessing One Piece Card Game data.
    Get real-time prices, card information, product details, inventory management, and market trends.
    Prices from Cardmarket (EU) and TCGPlayer (US, EUR-converted). Country-specific pricing (FR).
    
    **Authentication:** Pass your RapidAPI key in the `x-rapidapi-key` header.
    
    **Inventory API:** Requires separate Inventory API Key from tcggo.com (API Key page)
  version: 1.0.0
  contact:
    name: TCGGO
    url: https://www.tcggo.com
servers:
  - url: https://one-piece-tcg-prices.p.rapidapi.com
tags:
  - name: Cards
    description: One Piece cards with pricing data
  - name: Products
    description: "Sealed products (booster boxes, starter decks, etc.)"
  - name: Episodes
    description: Expansions/sets
  - name: Artists
    description: Card artists
  - name: History Prices
    description: Historical pricing data
  - name: Inventory
    description: Manage your card collection inventory
  - name: Health
    description: API health status
  - name: Deprecated
    description: Legacy endpoints kept for backward compatibility. Use the newer endpoints instead.
components:
  schemas:
    Paging:
      type: object
      properties:
        current: { type: integer, example: 1 }
        total: { type: integer, example: 10 }
        per_page: { type: integer, example: 20 }
    CardPrices:
      type: object
      properties:
        cardmarket:
          type: object
          properties:
            currency: { type: string, example: "EUR" }
            lowest_near_mint: { type: number, example: 750.00 }
            lowest_near_mint_FR: { type: number, example: 900.00 }
            graded:
              type: array
              items:
                type: object
                properties:
                  grade: { type: string, example: "PSA 10" }
                  price: { type: number, example: 2500.00 }
        tcgplayer:
          type: object
          nullable: true
          properties:
            currency: { type: string, example: "EUR" }
            market_price: { type: number, nullable: true, example: 720.00 }
    Card:
      type: object
      properties:
        id: { type: integer, example: 28839 }
        name: { type: string, example: "Marshall.D.Teach" }
        name_numbered: { type: string, example: "Marshall.D.Teach OP09-093" }
        slug: { type: string, example: "marshalldteach" }
        type: { type: string, example: "singles" }
        card_number: { type: string, example: "OP09-093" }
        rarity: { type: string, example: "LEADER", description: "Values: Common, R, Rare, SUPER RARE, LEADER" }
        color: { type: string, nullable: true, example: "Black", description: "Values: Red, Green, Black, Blue, Purple, Yellow" }
        version: { type: string, nullable: true, example: "v5", description: "Card variant (v1, v2, v3, etc.)" }
        cardmarket_id: { type: integer, example: 843038 }
        tcgplayer_id: { type: integer, nullable: true, example: 646572 }
        flavor_text: { type: string, nullable: true }
        prices: { $ref: '#/components/schemas/CardPrices' }
        episode:
          type: object
          properties:
            id: { type: integer, example: 366 }
            name: { type: string, example: "Emperors in the New World" }
            slug: { type: string, example: "emperors-in-the-new-world" }
            released_at: { type: string, example: "2024-12-13" }
            logo: { type: string, example: "https://images.tcggo.com/tcggo/storage/28381/one-piece.png" }
            code: { type: string, example: "OP09" }
        artist:
          type: object
          nullable: true
          description: "Artist may be null for some cards"
        image: { type: string, example: "https://images.tcggo.com/tcggo/storage/29155/marshalldteach.webp" }
        tcggo_url: { type: string, example: "https://www.tcggo.com/one-piece/emperors-in-the-new-world/marshalldteach" }
        links:
          type: object
          properties:
            cardmarket: { type: string, example: "https://www.tcggo.com/external/cm/28839" }
            tcgplayer: { type: string, example: "https://www.tcggo.com/external/tcgplayer/28839" }
    Episode:
      type: object
      properties:
        id: { type: integer, example: 366 }
        name: { type: string, example: "Emperors in the New World" }
        slug: { type: string, example: "emperors-in-the-new-world" }
        released_at: { type: string, format: date, example: "2024-12-13" }
        logo: { type: string, example: "https://images.tcggo.com/tcggo/storage/28381/one-piece.png" }
        code: { type: string, example: "OP09" }
        cards_total: { type: integer, example: 127 }
        cards_printed_total: { type: integer, example: 127 }
        prices:
          type: object
          properties:
            cardmarket:
              type: object
              properties:
                total: { type: number, example: 10738.81 }
                currency: { type: string, example: "EUR" }
            tcgplayer:
              type: object
              properties:
                total: { type: number, example: 4166.77 }
                currency: { type: string, example: "EUR" }
        game:
          type: object
          properties:
            name: { type: string, example: "One Piece" }
            slug: { type: string, example: "one-piece" }
        series:
          type: object
          nullable: true
          description: "Series grouping (null for One Piece)"
    Product:
      type: object
      properties:
        id: { type: integer, example: 31434 }
        name: { type: string, example: "The Azure Sea's Seven Booster Box" }
        slug: { type: string, example: "the-azure-seas-seven-booster-box" }
        cardmarket_id: { type: integer, example: 864452 }
        tcgplayer_id: { type: integer, nullable: true }
        prices:
          type: object
          properties:
            cardmarket:
              type: object
              properties:
                currency: { type: string, example: "EUR" }
                lowest: { type: number, example: 89.99 }
                lowest_FR: { type: number, example: 92.50 }
        episode:
          type: object
          properties:
            id: { type: integer, example: 366 }
            name: { type: string, example: "Emperors in the New World" }
            slug: { type: string, example: "emperors-in-the-new-world" }
            released_at: { type: string, format: date, example: "2024-12-13" }
            logo: { type: string, example: "https://images.tcggo.com/tcggo/storage/28381/one-piece.png" }
            code: { type: string, example: "OP09" }
        image: { type: string, example: "https://images.tcggo.com/tcggo/storage/28500/product.png" }
        tcggo_url: { type: string, example: "https://www.tcggo.com/one-piece/product/emperors-booster-box" }
        links:
          type: object
          properties:
            cardmarket: { type: string, example: "https://www.tcggo.com/external/cm/31434" }
    Artist:
      type: object
      properties:
        id: { type: integer, example: 906 }
        name: { type: string, example: "Hashimoto Q" }
        slug: { type: string, example: "hashimoto-q" }
        cards_count: { type: integer, example: 50, description: "Number of cards illustrated by this artist" }
    HistoryPrice:
      type: object
      properties:
        date: { type: string, format: date, example: "2026-02-06" }
        cm_low: { type: number, example: 24.00, description: "Cardmarket lowest price" }
        tcg_player_market: { type: number, nullable: true, example: null, description: "TCGPlayer market price (null if unavailable)" }
paths:
  # ==================== EPISODES (for RapidAPI ordering) ====================
  /episodes:
    get:
      summary: List Episodes (Expansions)
      operationId: List Episodes
      description: Get all One Piece TCG expansions/sets.
      tags: [Episodes]
      parameters:
        - name: search
          in: query
          description: "Search by name (partial match). Example: Romance Dawn"
          schema: { type: string }
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: List of episodes
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/Episode' }
                  paging: { $ref: '#/components/schemas/Paging' }
                  results: { type: integer }
  # ==================== CARDS ====================
  /episodes/{episodeId}/cards:
    get:
      summary: List Cards by Expansion
      operationId: List Cards by Expansion
      description: Get all cards from a specific expansion/episode.
      tags: [Cards]
      parameters:
        - name: episodeId
          in: path
          required: true
          description: "Episode/Expansion ID (e.g., 348 for The Azure Sea's Seven - OP14)"
          schema: { type: integer }
          example: 348
        - name: sort
          in: query
          schema:
            type: string
            enum: [card_number_highest, card_number_lowest, price_highest, price_lowest]
            default: card_number_lowest
        - name: per_page
          in: query
          description: "Items per page (up to 100)"
          schema: { type: integer, default: 20, maximum: 100 }
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: Cards in episode
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/Card' }
                  paging: { $ref: '#/components/schemas/Paging' }
                  results: { type: integer }
  /cards:
    get:
      summary: List Cards
      operationId: List Cards
      description: |
        Get a paginated list of One Piece cards with powerful filtering options.
        
        **Quick Examples:**
        - Find by CardMarket ID: `/cards?cardmarket_id=695825`
        - Find by card number: `/cards?card_number=OP01-003`
        - **Powerful combo**: `/cards?name=Luffy&card_number=003`
      tags: [Cards]
      parameters:
        - name: search
          in: query
          description: "Search by name or card number (partial match)"
          schema: { type: string }
        - name: name
          in: query
          description: Filter by card name only
          schema: { type: string }
        - name: ids
          in: query
          description: "Batch filter by internal IDs (comma-separated, up to 20). Example: 28839,28840"
          schema: { type: string }
        - name: cardmarket_ids
          in: query
          description: "Batch filter by CardMarket IDs (comma-separated, up to 20). Example: 695825,695826"
          schema: { type: string }
        - name: cardmarket_id
          in: query
          description: "Exact match by CardMarket ID. Example: 695825"
          schema: { type: integer }
        - name: tcgplayer_id
          in: query
          description: "Exact match by TCGPlayer ID. Example: 632494"
          schema: { type: integer }
        - name: tcgplayer_ids
          in: query
          description: "Batch filter by TCGPlayer IDs (comma-separated, up to 20). Example: 632494,632495"
          schema: { type: string }
        - name: card_number
          in: query
          description: "Filter by card number. Example: OP01-003"
          schema: { type: string }
        - name: episode_id
          in: query
          description: Filter by expansion ID
          schema: { type: integer }
        - name: artist_id
          in: query
          description: Filter by artist ID
          schema: { type: integer }
        - name: sort
          in: query
          description: Sort order
          schema:
            type: string
            enum: [relevance, price_highest, price_lowest, card_number_highest, card_number_lowest, episode_newest, episode_oldest]
            default: relevance
        - name: per_page
          in: query
          description: "Items per page (up to 100 when filtering by episode_id)"
          schema: { type: integer, default: 20, maximum: 100 }
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: List of cards
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/Card' }
                  paging: { $ref: '#/components/schemas/Paging' }
                  results: { type: integer }
  /cards/{cardId}:
    get:
      summary: View Card Detail
      operationId: View Card Detail
      description: Get detailed information for a specific card including prices and attributes.
      tags: [Cards]
      parameters:
        - name: cardId
          in: path
          required: true
          description: Card ID (e.g., 28839 for Marshall.D.Teach OP09-093)
          schema: { type: integer }
          example: 28839
      responses:
        '200':
          description: Card details
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { $ref: '#/components/schemas/Card' }
  # ==================== PRODUCTS ====================
  /episodes/{episodeId}/products:
    get:
      summary: List Products by Expansion
      operationId: List Products by Expansion
      description: Get all sealed products from a specific expansion/episode.
      tags: [Products]
      parameters:
        - name: episodeId
          in: path
          required: true
          description: "Episode/Expansion ID (e.g., 348 for The Azure Sea's Seven - OP14)"
          schema: { type: integer }
          example: 348
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: Products in episode
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/Product' }
                  paging: { $ref: '#/components/schemas/Paging' }
                  results: { type: integer }
  /products:
    get:
      summary: List Products
      operationId: List Products
      description: |
        Get a paginated list of sealed products (booster boxes, starter decks, etc).
        
        **Quick Example:** Find by CardMarket ID: `/products?cardmarket_id=864452`
      tags: [Products]
      parameters:
        - name: search
          in: query
          description: "Search by name (partial match). Example: romance dawn booster"
          schema: { type: string }
        - name: ids
          in: query
          description: "Batch filter by internal IDs (comma-separated, up to 20). Example: 31434,31435,31436"
          schema: { type: string }
        - name: cardmarket_ids
          in: query
          description: "Batch filter by CardMarket IDs (comma-separated, up to 20). Example: 864452,864453"
          schema: { type: string }
        - name: cardmarket_id
          in: query
          description: Exact match by CardMarket ID
          schema: { type: integer }
        - name: tcgplayer_id
          in: query
          description: "Exact match by TCGPlayer ID. Example: 632494"
          schema: { type: integer }
        - name: tcgplayer_ids
          in: query
          description: "Batch filter by TCGPlayer IDs (comma-separated, up to 20). Example: 632494,632495"
          schema: { type: string }
        - name: episode_id
          in: query
          description: Filter by expansion ID
          schema: { type: integer }
        - name: sort
          in: query
          schema:
            type: string
            enum: [relevance, price_highest, price_lowest, episode_newest, episode_oldest]
            default: relevance
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: List of products
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/Product' }
                  paging: { $ref: '#/components/schemas/Paging' }
                  results: { type: integer }
  /products/{productId}:
    get:
      summary: View Product Detail
      operationId: View Product Detail
      description: Get detailed information for a specific product.
      tags: [Products]
      parameters:
        - name: productId
          in: path
          required: true
          description: "Product ID (e.g., 31434 for The Azure Sea's Seven Booster Box)"
          schema: { type: integer }
          example: 31434
      responses:
        '200':
          description: Product details
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { $ref: '#/components/schemas/Product' }
  # ==================== ARTISTS ====================
  /artists:
    get:
      summary: List Artists
      operationId: List Artists
      description: Get all card artists.
      tags: [Artists]
      parameters:
        - name: search
          in: query
          description: "Search by name (partial match)"
          schema: { type: string }
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: List of artists
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/Artist' }
                  paging: { $ref: '#/components/schemas/Paging' }
                  results: { type: integer }
  /artists/{artistId}/cards:
    get:
      summary: List Cards by Artist
      operationId: List Cards by Artist
      description: Get all cards by a specific artist.
      tags: [Cards]
      parameters:
        - name: artistId
          in: path
          required: true
          description: "Artist ID (e.g., 906 for Hashimoto Q)"
          schema: { type: integer }
          example: 906
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: Artist's cards
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/Card' }
                  paging: { $ref: '#/components/schemas/Paging' }
                  results: { type: integer }
  # ==================== HISTORY PRICES ====================
  /history-prices:
    get:
      summary: Get Historical Prices
      operationId: Get Historical Prices
      description: |
        Get historical prices for a card or product by ID or Cardmarket ID.
        Returns daily price data with Cardmarket Low prices.
      tags: [History Prices]
      parameters:
        - name: id
          in: query
          description: "Internal item ID"
          schema: { type: integer }
          example: 31382
        - name: cardmarket_id
          in: query
          description: "Cardmarket product ID"
          schema: { type: integer }
        - name: date_from
          in: query
          description: "Start date (YYYY-MM-DD). Example: 2024-01-01"
          schema: { type: string, format: date }
        - name: date_to
          in: query
          description: "End date (YYYY-MM-DD). Example: 2024-12-31"
          schema: { type: string, format: date }
        - name: sort
          in: query
          description: Sort order for dates
          schema:
            type: string
            enum: [asc, desc]
            default: desc
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: Price history grouped by date
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    description: "Price history grouped by date"
                  paging: { $ref: '#/components/schemas/Paging' }
                  results: { type: integer }
  # ==================== INVENTORY ====================
  /inventories:
    get:
      summary: List Inventories
      operationId: List Inventories
      description: |
        Get a paginated list of your inventories with financial summary.
        
        **Authentication:** Requires Inventory API Key (pass in `rapidapi_tcggo_key` parameter)
      tags: [Inventory]
      parameters:
        - name: rapidapi_tcggo_key
          in: query
          required: true
          description: "Your Inventory API Key from tcggo.com (API Key page)"
          schema: { type: string }
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: List of inventories
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id: { type: integer }
                        name: { type: string }
                        is_public: { type: boolean }
                        is_primary: { type: boolean }
                        total_items: { type: integer }
                        total_value: { type: number }
                        actual_value: { type: number }
                        profit_loss: { type: number }
                        profit_loss_percentage: { type: number }
                  paging: { $ref: '#/components/schemas/Paging' }
                  results: { type: integer }
  /inventories/{id}:
    get:
      summary: View Inventory Detail
      operationId: View Inventory Detail
      description: Get detailed information for a specific inventory with paginated items.
      tags: [Inventory]
      parameters:
        - name: id
          in: path
          required: true
          schema: { type: integer }
        - name: rapidapi_tcggo_key
          in: query
          required: true
          schema: { type: string }
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: Inventory details with items
  /inventories/{id}/stats:
    get:
      summary: Get Inventory Stats
      operationId: Get Inventory Stats
      description: Get comprehensive statistics and chart data for the inventory.
      tags: [Inventory]
      parameters:
        - name: id
          in: path
          required: true
          schema: { type: integer }
        - name: rapidapi_tcggo_key
          in: query
          required: true
          schema: { type: string }
        - name: days
          in: query
          description: Number of days for chart data
          schema: { type: integer, default: 30 }
      responses:
        '200':
          description: Inventory statistics
  /inventories/{id}/items:
    post:
      summary: Add Item to Inventory
      operationId: Add Item to Inventory
      description: Add a card or product to your inventory.
      tags: [Inventory]
      parameters:
        - name: id
          in: path
          required: true
          schema: { type: integer }
        - name: rapidapi_tcggo_key
          in: query
          required: true
          schema: { type: string }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [item_id]
              properties:
                item_id: { type: integer, description: "Card or product ID", example: 28839 }
                count: { type: integer, description: "Quantity (default 1)", example: 2 }
                price: { type: number, description: "Purchase price per unit", example: 12.50 }
                language: { type: string, description: "Language: en, de, fr, es, it", example: "en" }
      responses:
        '200':
          description: Item added
          content:
            application/json:
              schema:
                type: object
                properties:
                  message: { type: string, example: "Item added successfully" }
  /inventories/{inventoryId}/items/{itemId}:
    put:
      summary: Update Inventory Item
      operationId: Update Inventory Item
      description: Update quantity, price, or language of an inventory item.
      tags: [Inventory]
      parameters:
        - name: inventoryId
          in: path
          required: true
          schema: { type: integer }
        - name: itemId
          in: path
          required: true
          description: "Inventory item entry ID (not card ID)"
          schema: { type: integer }
        - name: rapidapi_tcggo_key
          in: query
          required: true
          schema: { type: string }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [count, language]
              properties:
                count: { type: integer, example: 5 }
                price: { type: number, example: 20.00 }
                language: { type: string, example: "en" }
      responses:
        '200':
          description: Item updated
    delete:
      summary: Remove Item from Inventory
      operationId: Remove Item from Inventory
      description: Remove an item entry from the inventory.
      tags: [Inventory]
      parameters:
        - name: inventoryId
          in: path
          required: true
          schema: { type: integer }
        - name: itemId
          in: path
          required: true
          schema: { type: integer }
        - name: rapidapi_tcggo_key
          in: query
          required: true
          schema: { type: string }
      responses:
        '200':
          description: Item removed
  # ==================== DEPRECATED ====================
  /cards/search:
    get:
      summary: Search Cards
      operationId: Search Cards
      description: Search for cards by name or card number.
      tags: [Cards]
      parameters:
        - name: search
          in: query
          required: true
          description: "Search query (e.g., luffy)"
          schema: { type: string }
          example: luffy
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: List of matching cards
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/Card' }
                  paging: { $ref: '#/components/schemas/Paging' }
  /cards/{cardId}/history-prices:
    get:
      deprecated: true
      summary: "[Deprecated] Card History Prices"
      operationId: Card History Prices (Deprecated)
      description: "**DEPRECATED** - Use /history-prices with id parameter instead. Legacy endpoint for backward compatibility."
      tags: [Deprecated]
      parameters:
        - name: cardId
          in: path
          required: true
          schema: { type: integer }
          example: 31382
      responses:
        '200':
          description: Historical prices for the card
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/HistoryPrice' }
  /products/{productId}/history-prices:
    get:
      deprecated: true
      summary: "[Deprecated] Product History Prices"
      operationId: Product History Prices (Deprecated)
      description: "**DEPRECATED** - Use /history-prices with product_id parameter instead. Legacy endpoint for backward compatibility."
      tags: [Deprecated]
      parameters:
        - name: productId
          in: path
          required: true
          schema: { type: integer }
          example: 31434
      responses:
        '200':
          description: Historical prices for the product
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/HistoryPrice' }
  /products/search:
    get:
      summary: Search Products
      operationId: Search Products
      description: Search for sealed products by name.
      tags: [Products]
      parameters:
        - name: search
          in: query
          required: true
          description: "Search query (e.g., booster)"
          schema: { type: string }
          example: booster
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: List of matching products
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/Product' }
                  paging: { $ref: '#/components/schemas/Paging' }
  /episodes/search:
    get:
      summary: Search Expansions
      operationId: Search Expansions
      description: Search for expansions/sets by name.
      tags: [Episodes]
      parameters:
        - name: search
          in: query
          required: true
          description: "Search query (e.g., romance)"
          schema: { type: string }
          example: romance
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: List of matching episodes
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/Episode' }
                  paging: { $ref: '#/components/schemas/Paging' }
  /artists/search:
    get:
      summary: Search Artists
      operationId: Search Artists
      description: Search for card artists by name.
      tags: [Artists]
      parameters:
        - name: search
          in: query
          required: true
          description: "Search query (e.g., oda)"
          schema: { type: string }
          example: oda
        - name: page
          in: query
          schema: { type: integer, default: 1 }
      responses:
        '200':
          description: List of matching artists
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/Artist' }
                  paging: { $ref: '#/components/schemas/Paging' }
  # ==================== HEALTH ====================
  /healthcheck:
    get:
      summary: Health Check
      operationId: Health Check
      description: Check API availability.
      tags: [Health]
      responses:
        '200':
          description: API is healthy
          content:
            application/json:
              schema:
                type: object
                properties:
                  status: { type: string, example: ok }
                  timestamp: { type: string, format: date-time }
