{
  "openapi": "3.1.0",
  "info": {
    "title": "MythicDeals Seller API",
    "version": "1.2.0",
    "summary": "Manage listings, stock, prices, deliveries, disputes, payouts and webhooks on MythicDeals.",
    "description": "The MythicDeals public API (v1) lets sellers and their tools manage listings, stock, prices, photos, instant-delivery units and gift card codes, orders, order chat, disputes, wallet and payouts, notifications, store availability and webhooks.\n\nAuthenticate with a personal token from Settings → API access: `Authorization: Bearer go_…`. Every operation lists the scopes it needs in `x-scopes`.\n\nGuides: http://localhost:8000/developers",
    "x-description-fr": "L’API publique MythicDeals (v1) permet aux vendeurs et à leurs outils de gérer annonces, stock, prix, photos, unités de livraison instantanée et codes de cartes cadeaux, commandes, messagerie, litiges, portefeuille et retraits, notifications, disponibilité de la boutique et webhooks.\n\nAuthentifiez-vous avec un jeton personnel créé dans Paramètres → Accès API : `Authorization: Bearer go_…`. Chaque opération indique les scopes requis dans `x-scopes`.\n\nGuides : http://localhost:8000/developers",
    "contact": {
      "name": "MythicDeals developers",
      "url": "http://localhost:8000/developers"
    }
  },
  "servers": [
    {
      "url": "http://localhost:8000/api/v1",
      "description": "Production"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "tags": [
    {
      "name": "Account",
      "description": "The token owner, your account status and restrictions, online/offline presence and breaks (vacation mode).",
      "x-description-fr": "Le propriétaire du jeton, l’état et les restrictions de votre compte, votre présence en ligne/hors ligne et vos pauses (mode vacances).",
      "x-name-fr": "Compte"
    },
    {
      "name": "Catalog",
      "description": "Games, categories and the attributes each category needs. Use it to build valid listings.",
      "x-description-fr": "Jeux, catégories et attributs requis par chaque catégorie. Servez-vous-en pour créer des annonces valides.",
      "x-name-fr": "Catalogue"
    },
    {
      "name": "Gift cards",
      "description": "Gift card brands and regions. A gift card offer is a normal listing of type `giftcard`; its codes are its instant-delivery units.",
      "x-description-fr": "Marques et régions de cartes cadeaux. Une offre de carte cadeau est une annonce normale de type `giftcard` ; ses codes sont ses unités de livraison instantanée.",
      "x-name-fr": "Cartes cadeaux"
    },
    {
      "name": "Listings",
      "description": "Create, read, update, duplicate, pause and delete your own listings, one by one, in bulk or by filter, and compare them with other sellers’ offers.",
      "x-description-fr": "Créez, lisez, modifiez, dupliquez, mettez en pause et supprimez vos propres annonces, une par une, en masse ou par filtre, et comparez-les aux offres des autres vendeurs.",
      "x-name-fr": "Annonces"
    },
    {
      "name": "Listing import",
      "description": "Create many listings at once from a CSV file, in two steps: preview, then confirm.",
      "x-description-fr": "Créez de nombreuses annonces d’un coup à partir d’un fichier CSV, en deux étapes : aperçu, puis confirmation.",
      "x-name-fr": "Import d’annonces"
    },
    {
      "name": "Listing images",
      "description": "Photos of a listing. The first image is the cover.",
      "x-description-fr": "Photos d’une annonce. La première image sert de couverture.",
      "x-name-fr": "Images des annonces"
    },
    {
      "name": "Instant delivery units",
      "description": "Accounts or codes delivered automatically the moment an order is paid. One unit = one item of stock.",
      "x-description-fr": "Comptes ou codes livrés automatiquement dès qu’une commande est payée. Une unité = un article en stock.",
      "x-name-fr": "Unités de livraison instantanée"
    },
    {
      "name": "Orders",
      "description": "Your sales (and, read-only, your purchases). Start, deliver, correct, cancel and invoice orders.",
      "x-description-fr": "Vos ventes (et, en lecture seule, vos achats). Démarrez, livrez, corrigez, annulez et facturez des commandes.",
      "x-name-fr": "Commandes"
    },
    {
      "name": "Order messages",
      "description": "The chat of one order, between its buyer and its seller.",
      "x-description-fr": "La messagerie d’une commande, entre son acheteur et son vendeur.",
      "x-name-fr": "Messages de commande"
    },
    {
      "name": "Disputes",
      "description": "Disputes and warranty claims on your orders: read the case, its offers, evidence and timeline, and answer as the seller. Money only moves when both sides agree or MythicDeals decides.",
      "x-description-fr": "Litiges et réclamations sous garantie sur vos commandes : consultez le dossier, ses offres, preuves et chronologie, et répondez en tant que vendeur. L’argent ne bouge que si les deux parties sont d’accord ou si MythicDeals tranche.",
      "x-name-fr": "Litiges"
    },
    {
      "name": "Wallet",
      "description": "Balances and ledger. Same numbers as the Wallet page.",
      "x-description-fr": "Soldes et historique. Les mêmes chiffres que la page Portefeuille.",
      "x-name-fr": "Portefeuille"
    },
    {
      "name": "Payouts",
      "description": "Withdrawals from your wallet to your bank or e-wallet. Read-only: request payouts on the website (two-factor and tax checks).",
      "x-description-fr": "Retraits de votre portefeuille vers votre banque ou portefeuille électronique. Lecture seule : demandez les retraits sur le site (double authentification et contrôles fiscaux).",
      "x-name-fr": "Retraits"
    },
    {
      "name": "Notifications",
      "description": "Your notification bell: order updates and support replies, the same list as on the website.",
      "x-description-fr": "Votre cloche de notifications : mises à jour des commandes et réponses du support, la même liste que sur le site.",
      "x-name-fr": "Notifications"
    },
    {
      "name": "Boosting",
      "description": "Boosting works by request: buyers post their current rank, target and options, boosters send a price and a time. Read open requests, send or withdraw offers, and post progress on the orders you win.",
      "x-description-fr": "Le boosting fonctionne sur demande : les acheteurs publient leur rang actuel, leur objectif et leurs options, les boosters envoient un prix et un délai. Lisez les demandes ouvertes, envoyez ou retirez des offres et publiez l’avancement des commandes remportées.",
      "x-name-fr": "Boosting"
    },
    {
      "name": "Webhooks",
      "description": "Manage the HTTPS endpoints that receive signed event notifications.",
      "x-description-fr": "Gérez les endpoints HTTPS qui reçoivent des notifications d’événements signées.",
      "x-name-fr": "Webhooks"
    }
  ],
  "paths": {
    "/account": {
      "get": {
        "tags": [
          "Account"
        ],
        "operationId": "accountShow",
        "summary": "Get your account",
        "x-summary-fr": "Obtenir votre compte",
        "description": "Your account in one call: email and seller verification, two-factor, seller level and fee, store, presence and current break, and `restrictions` — whether you can sell and withdraw right now, with `reasons` (`account_suspended`, `seller_not_verified`, `email_not_verified`, `tax_info_required`, `on_break`). `limits` repeats the API limits (prices, units, images, bulk sizes, CSV rows, requests per minute) so your tool does not have to hard-code them.",
        "x-description-fr": "Votre compte en un appel : vérification de l’e-mail et du vendeur, double authentification, niveau vendeur et commission, boutique, présence et pause en cours, et `restrictions` — si vous pouvez vendre et retirer maintenant, avec des `reasons` (`account_suspended`, `seller_not_verified`, `email_not_verified`, `tax_info_required`, `on_break`). `limits` reprend les limites de l’API (prix, unités, images, tailles des opérations en masse, lignes CSV, requêtes par minute) pour que votre outil n’ait pas à les coder en dur.",
        "x-scopes": [
          "account:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "account:read"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "Your account.",
            "x-description-fr": "Votre compte.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Account"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "name": "Budi",
                    "email": "s@test.local",
                    "email_verified": true,
                    "two_factor": {
                      "enabled": false,
                      "methods": []
                    },
                    "seller": {
                      "verified": true,
                      "verification_status": "approved",
                      "level": {
                        "name": "NEW",
                        "fee_percent": 10
                      }
                    },
                    "store": {
                      "name": "Budi Store",
                      "slug": "budi-store",
                      "url": "http://localhost:8000/store/budi-store"
                    },
                    "presence": {
                      "status": "online",
                      "appear_offline": false,
                      "shown_online": false,
                      "last_seen_at": null
                    },
                    "break": {
                      "active": false,
                      "until": null,
                      "message": null
                    },
                    "restrictions": {
                      "can_sell": true,
                      "can_withdraw": true,
                      "suspended": false,
                      "suspended_until": null,
                      "tax_info_required": false,
                      "tax_info_complete": false,
                      "reasons": []
                    },
                    "limits": {
                      "price_min_cents": 100,
                      "price_max_cents": 5000000,
                      "units_per_listing": 200,
                      "images_per_listing": 8,
                      "bulk_items": 100,
                      "bulk_update_listings": 1000,
                      "import_rows": 500,
                      "requests_per_minute": 120
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 1
      }
    },
    "/account/breaks": {
      "get": {
        "tags": [
          "Account"
        ],
        "operationId": "accountBreaksIndex",
        "summary": "List breaks",
        "x-summary-fr": "Lister les pauses",
        "description": "Your breaks (vacation mode), newest first, whether they were started on the website or with the API (`source`). Standard pagination (`data`, `links`, `meta`) like every other list; `meta.on_break` tells whether your store is closed right now.",
        "x-description-fr": "Vos pauses (mode vacances), les plus récentes en premier, qu’elles aient été démarrées sur le site ou via l’API (`source`). Pagination standard (`data`, `links`, `meta`) comme toutes les autres listes ; `meta.on_break` indique si votre boutique est fermée en ce moment.",
        "x-scopes": [
          "account:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "account:read"
            ]
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            },
            "description": "Items per page, 1–100.",
            "x-description-fr": "Éléments par page, de 1 à 100."
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Page number.",
            "x-description-fr": "Numéro de page."
          }
        ],
        "responses": {
          "200": {
            "description": "A page of breaks.",
            "x-description-fr": "Une page de pauses.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "type": "object",
                      "required": [
                        "data",
                        "links",
                        "meta"
                      ],
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/SellerBreak"
                          }
                        },
                        "links": {
                          "$ref": "#/components/schemas/PaginationLinks"
                        },
                        "meta": {
                          "$ref": "#/components/schemas/PaginationMeta"
                        }
                      }
                    },
                    {
                      "type": "object",
                      "properties": {
                        "meta": {
                          "type": "object",
                          "properties": {
                            "on_break": {
                              "type": "boolean",
                              "description": "true while your store is closed.",
                              "x-description-fr": "true tant que votre boutique est fermée."
                            }
                          }
                        }
                      }
                    }
                  ]
                },
                "example": {
                  "data": [
                    {
                      "id": 1,
                      "active": true,
                      "started_at": "2026-10-27T09:30:07Z",
                      "until": "2026-11-03T08:00:00Z",
                      "ended_at": null,
                      "message": "Back on November 3 — orders resume then.",
                      "source": "api"
                    }
                  ],
                  "links": {
                    "first": "http://localhost:8000/api/v1/account/breaks?page=1",
                    "last": "http://localhost:8000/api/v1/account/breaks?page=1",
                    "prev": null,
                    "next": null
                  },
                  "meta": {
                    "current_page": 1,
                    "from": 1,
                    "last_page": 1,
                    "links": [
                      {
                        "url": null,
                        "label": "&laquo; Previous",
                        "page": null,
                        "active": false
                      },
                      {
                        "url": "http://localhost:8000/api/v1/account/breaks?page=1",
                        "label": "1",
                        "page": 1,
                        "active": true
                      },
                      {
                        "url": null,
                        "label": "Next &raquo;",
                        "page": null,
                        "active": false
                      }
                    ],
                    "path": "http://localhost:8000/api/v1/account/breaks",
                    "per_page": 25,
                    "to": 1,
                    "total": 1,
                    "on_break": true
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 3
      },
      "post": {
        "tags": [
          "Account"
        ],
        "operationId": "accountBreaksStore",
        "summary": "Start a break",
        "x-summary-fr": "Démarrer une pause",
        "description": "Closes your store now (the “Store is closed” switch of the website): your listings are hidden and new purchases are refused. Orders already placed are not affected — keep delivering them. With `until` (in the future, less than a year away) the store reopens by itself; without it the break lasts until you end it. `message` is shown to buyers on your store. Already on a break → 409.\n\nRequires a verified seller account with a verified email address. Accepts an `Idempotency-Key` header: retrying with the same key returns the first response.",
        "x-description-fr": "Ferme votre boutique maintenant (l’interrupteur « Boutique fermée » du site) : vos annonces sont masquées et les nouveaux achats refusés. Les commandes déjà passées ne sont pas concernées — continuez à les livrer. Avec `until` (dans le futur, à moins d’un an), la boutique rouvre d’elle-même ; sans cette date, la pause dure jusqu’à ce que vous y mettiez fin. `message` est affiché aux acheteurs sur votre boutique. Déjà en pause → 409.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée. Accepte un en-tête `Idempotency-Key` : une nouvelle tentative avec la même clé renvoie la première réponse.",
        "x-scopes": [
          "account:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": true,
        "security": [
          {
            "bearerAuth": [
              "account:write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "until": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time",
                    "description": "When the store reopens by itself (ISO-8601). Empty = until you end the break.",
                    "x-description-fr": "Date de réouverture automatique (ISO-8601). Vide = jusqu’à ce que vous mettiez fin à la pause."
                  },
                  "message": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 280,
                    "description": "Note for buyers, shown on your store.",
                    "x-description-fr": "Note pour les acheteurs, affichée sur votre boutique."
                  }
                }
              },
              "example": {
                "until": "2026-11-03T08:00:00Z",
                "message": "Back on November 3 — orders resume then."
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The break that just started.",
            "x-description-fr": "La pause qui vient de commencer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SellerBreak"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "active": true,
                    "started_at": "2026-10-27T09:30:07Z",
                    "until": "2026-11-03T08:00:00Z",
                    "ended_at": null,
                    "message": "Back on November 3 — orders resume then.",
                    "source": "api"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 4
      }
    },
    "/account/breaks/current": {
      "delete": {
        "tags": [
          "Account"
        ],
        "operationId": "accountBreaksEnd",
        "summary": "End the current break",
        "x-summary-fr": "Terminer la pause en cours",
        "description": "Reopens your store now. Not on a break → 409.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Rouvre votre boutique maintenant. Pas de pause en cours → 409.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "account:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "account:write"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "The break that just ended.",
            "x-description-fr": "La pause qui vient de se terminer.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SellerBreak"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "active": false,
                    "started_at": "2026-10-27T09:30:07Z",
                    "until": "2026-11-03T08:00:00Z",
                    "ended_at": "2026-10-27T10:30:07Z",
                    "message": "Back on November 3 — orders resume then.",
                    "source": "api"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 5
      }
    },
    "/account/status": {
      "put": {
        "tags": [
          "Account"
        ],
        "operationId": "accountStatus",
        "summary": "Go online or offline",
        "x-summary-fr": "Passer en ligne ou hors ligne",
        "description": "`offline` = appear offline: buyers see you as offline even while you use the website or the API. `online` = normal: buyers see you online while you were active in the last few minutes (`shown_online`). This does not close your store or hide listings — start a break for that. Safe to repeat.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "`offline` = apparaître hors ligne : les acheteurs vous voient hors ligne même quand vous utilisez le site ou l’API. `online` = normal : les acheteurs vous voient en ligne si vous avez été actif ces dernières minutes (`shown_online`). Cela ne ferme pas votre boutique et ne masque pas vos annonces — démarrez une pause pour cela. Peut être répété sans risque.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "account:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "account:write"
            ]
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "status"
                ],
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "online",
                      "offline"
                    ],
                    "description": "online or offline (appear offline).",
                    "x-description-fr": "online ou offline (apparaître hors ligne)."
                  }
                }
              },
              "example": {
                "status": "offline"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Your presence now.",
            "x-description-fr": "Votre présence actuelle.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Presence"
                    }
                  }
                },
                "example": {
                  "data": {
                    "status": "offline",
                    "appear_offline": true,
                    "shown_online": false,
                    "last_seen_at": null
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 2
      }
    },
    "/boosting/offers": {
      "get": {
        "tags": [
          "Boosting"
        ],
        "operationId": "boostingOffers",
        "summary": "List your boosting offers",
        "x-summary-fr": "Lister vos offres de boosting",
        "description": "Your offers, last changed first. An `accepted` offer has the `order_id` of the order it became — deliver it like any other order.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Vos offres, les plus récemment modifiées en premier. Une offre `accepted` porte l’`order_id` de la commande créée — livrez-la comme toute autre commande.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "boosting:read"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "boosting:read"
            ]
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "pending",
                "accepted",
                "declined",
                "withdrawn",
                "expired"
              ]
            },
            "description": "Only this status.",
            "x-description-fr": "Uniquement ce statut."
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            },
            "description": "Items per page, 1–100.",
            "x-description-fr": "Éléments par page, de 1 à 100."
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Page number.",
            "x-description-fr": "Numéro de page."
          }
        ],
        "responses": {
          "200": {
            "description": "A page of offers.",
            "x-description-fr": "Une page d’offres.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "meta": {
                      "type": "object"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 31,
                      "price_cents": 3800,
                      "eta_hours": 48,
                      "message": "Immortal 3 EU, I can start tonight and stream every game.",
                      "status": "pending",
                      "revisions": 0,
                      "updated_at": "2026-10-30T12:05:00+00:00",
                      "request_id": 12,
                      "request_title": "Valorant — Rank boost: Silver → Diamond (EU, Solo)",
                      "order_id": null
                    }
                  ],
                  "meta": {
                    "current_page": 1,
                    "last_page": 1,
                    "total": 1
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 60
      }
    },
    "/boosting/offers/{id}/withdraw": {
      "post": {
        "tags": [
          "Boosting"
        ],
        "operationId": "boostingWithdraw",
        "summary": "Withdraw an offer",
        "x-summary-fr": "Retirer une offre",
        "description": "Withdraws a pending offer. While the request is open you can send a new one. Not pending → 409.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Retire une offre en attente. Tant que la demande est ouverte, vous pouvez en envoyer une nouvelle. Offre non en attente → 409.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "boosting:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "boosting:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Boosting offer id.",
            "x-description-fr": "Identifiant de l’offre de boosting.",
            "example": 31
          }
        ],
        "responses": {
          "200": {
            "description": "The withdrawn offer.",
            "x-description-fr": "L’offre retirée.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object"
                    }
                  }
                },
                "example": {
                  "data": {
                    "status": "withdrawn",
                    "id": 31,
                    "price_cents": 3800,
                    "eta_hours": 48,
                    "message": "Immortal 3 EU, I can start tonight and stream every game.",
                    "revisions": 0,
                    "updated_at": "2026-10-30T12:05:00+00:00"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 62
      }
    },
    "/boosting/orders/{id}/progress": {
      "post": {
        "tags": [
          "Boosting"
        ],
        "operationId": "boostingProgress",
        "summary": "Post boost progress",
        "x-summary-fr": "Publier l’avancement du boost",
        "description": "Shares progress on a boosting order you sell: `percent` done and the `current` rank or level. The buyer sees a progress bar and is notified. A paid order is started automatically. Only while the order is paid or in progress (otherwise 409).\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Partage l’avancement d’une commande de boosting que vous vendez : `percent` réalisé et le rang ou niveau `current`. L’acheteur voit une barre de progression et est prévenu. Une commande payée est démarrée automatiquement. Uniquement si la commande est payée ou en cours (sinon 409).\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "boosting:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "boosting:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Order id.",
            "x-description-fr": "Identifiant de la commande.",
            "example": 120
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "percent"
                ],
                "properties": {
                  "percent": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100
                  },
                  "current": {
                    "type": "string",
                    "maxLength": 80
                  },
                  "note": {
                    "type": "string",
                    "maxLength": 500
                  }
                }
              },
              "example": {
                "percent": 50,
                "current": "Platinum 2",
                "note": "Halfway there, 8 wins in a row."
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The progress update.",
            "x-description-fr": "La mise à jour d’avancement.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 4,
                    "order_id": 120,
                    "percent": 50,
                    "current": "Platinum 2",
                    "note": "Halfway there, 8 wins in a row.",
                    "created_at": "2026-10-31T19:20:00+00:00"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 63
      }
    },
    "/boosting/requests": {
      "get": {
        "tags": [
          "Boosting"
        ],
        "operationId": "boostingRequests",
        "summary": "List open boosting requests",
        "x-summary-fr": "Lister les demandes de boosting ouvertes",
        "description": "Open requests from buyers, newest first (never your own). `mine=1` keeps only the games you boost. `range` is the current → target rank or level with the number of steps; `my_offer` is your offer on it, if any.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Les demandes ouvertes des acheteurs, les plus récentes en premier (jamais les vôtres). `mine=1` ne garde que les jeux que vous boostez. `range` est le rang ou niveau actuel → visé avec le nombre d’étapes ; `my_offer` est votre offre, le cas échéant.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "boosting:read"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "boosting:read"
            ]
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "game_id",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Only this game.",
            "x-description-fr": "Uniquement ce jeu."
          },
          {
            "in": "query",
            "name": "service",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "boost",
                "coaching",
                "custom"
              ]
            },
            "description": "boost, coaching or custom.",
            "x-description-fr": "boost, coaching ou custom."
          },
          {
            "in": "query",
            "name": "mine",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Only the games you boost.",
            "x-description-fr": "Uniquement les jeux que vous boostez."
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            },
            "description": "Items per page, 1–100.",
            "x-description-fr": "Éléments par page, de 1 à 100."
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Page number.",
            "x-description-fr": "Numéro de page."
          }
        ],
        "responses": {
          "200": {
            "description": "A page of open requests.",
            "x-description-fr": "Une page de demandes ouvertes.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "meta": {
                      "type": "object"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 12,
                      "game": {
                        "id": 3,
                        "name": "Valorant",
                        "slug": "valorant"
                      },
                      "category_id": 9,
                      "service": "boost",
                      "title": "Valorant — Rank boost: Silver → Diamond (EU, Solo)",
                      "range": {
                        "from": "Silver",
                        "to": "Diamond",
                        "steps": 3
                      },
                      "details": {
                        "region": "EU",
                        "rank_from": "Silver",
                        "rank_to": "Diamond",
                        "queue": "Solo"
                      },
                      "options": {
                        "stream": true
                      },
                      "notes": "I mostly play Jett and Sova. Evenings CET work best.",
                      "budget_cents": 4500,
                      "deadline_hours": 72,
                      "offers_count": 2,
                      "my_offer": null,
                      "status": "open",
                      "expires_at": "2026-11-02T12:00:00+00:00",
                      "created_at": "2026-10-30T12:00:00+00:00",
                      "url": "https://mythicdeals.example/boosting/requests/12"
                    }
                  ],
                  "meta": {
                    "current_page": 1,
                    "last_page": 1,
                    "total": 1
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 58
      }
    },
    "/boosting/requests/{id}": {
      "get": {
        "tags": [
          "Boosting"
        ],
        "operationId": "boostingRequestsShow",
        "summary": "Get a boosting request",
        "x-summary-fr": "Obtenir une demande de boosting",
        "description": "One open request, or a closed one you made an offer on. Your own requests → 404.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Une demande ouverte, ou fermée si vous y avez fait une offre. Vos propres demandes → 404.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "boosting:read"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "boosting:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Boosting request id.",
            "x-description-fr": "Identifiant de la demande de boosting.",
            "example": 12
          }
        ],
        "responses": {
          "200": {
            "description": "The request.",
            "x-description-fr": "La demande.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 12,
                    "game": {
                      "id": 3,
                      "name": "Valorant",
                      "slug": "valorant"
                    },
                    "category_id": 9,
                    "service": "boost",
                    "title": "Valorant — Rank boost: Silver → Diamond (EU, Solo)",
                    "range": {
                      "from": "Silver",
                      "to": "Diamond",
                      "steps": 3
                    },
                    "details": {
                      "region": "EU",
                      "rank_from": "Silver",
                      "rank_to": "Diamond",
                      "queue": "Solo"
                    },
                    "options": {
                      "stream": true
                    },
                    "notes": "I mostly play Jett and Sova. Evenings CET work best.",
                    "budget_cents": 4500,
                    "deadline_hours": 72,
                    "offers_count": 2,
                    "my_offer": null,
                    "status": "open",
                    "expires_at": "2026-11-02T12:00:00+00:00",
                    "created_at": "2026-10-30T12:00:00+00:00",
                    "url": "https://mythicdeals.example/boosting/requests/12"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 59
      }
    },
    "/boosting/requests/{id}/offer": {
      "post": {
        "tags": [
          "Boosting"
        ],
        "operationId": "boostingOffer",
        "summary": "Send or update an offer",
        "x-summary-fr": "Envoyer ou modifier une offre",
        "description": "Your price (USD cents) and completion time for a request. Sending again updates your offer (201 the first time, 200 after) and the buyer is notified when the price or time changes. `eta_hours` must be one of the listed values. Closed request, your own request, store on a break → 409.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Votre prix (centimes USD) et votre délai pour une demande. Un nouvel envoi modifie votre offre (201 la première fois, 200 ensuite) et l’acheteur est prévenu si le prix ou le délai change. `eta_hours` doit être l’une des valeurs listées. Demande fermée, votre propre demande, boutique en pause → 409.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "boosting:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "boosting:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Boosting request id.",
            "x-description-fr": "Identifiant de la demande de boosting.",
            "example": 12
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "price_cents",
                  "eta_hours"
                ],
                "properties": {
                  "price_cents": {
                    "type": "integer",
                    "minimum": 100,
                    "maximum": 1000000
                  },
                  "eta_hours": {
                    "type": "integer",
                    "enum": [
                      1,
                      2,
                      3,
                      6,
                      12,
                      24,
                      48,
                      72,
                      96,
                      120,
                      168,
                      240,
                      336,
                      504,
                      720
                    ]
                  },
                  "message": {
                    "type": "string",
                    "maxLength": 1000
                  }
                }
              },
              "example": {
                "price_cents": 3800,
                "eta_hours": 48,
                "message": "Immortal 3 EU, I can start tonight and stream every game."
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Your offer.",
            "x-description-fr": "Votre offre.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 31,
                    "price_cents": 3800,
                    "eta_hours": 48,
                    "message": "Immortal 3 EU, I can start tonight and stream every game.",
                    "status": "pending",
                    "revisions": 0,
                    "updated_at": "2026-10-30T12:05:00+00:00"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 61
      }
    },
    "/categories/{id}/attributes": {
      "get": {
        "tags": [
          "Catalog"
        ],
        "operationId": "catalogAttributes",
        "summary": "Get a category’s attributes",
        "x-summary-fr": "Obtenir les attributs d’une catégorie",
        "description": "The attribute schema of one category: send these keys in `attributes` when you create a listing. `select` values must be one of `options`; `number` values must be within `min`–`max`; `boolean` takes true/false.",
        "x-description-fr": "Le schéma d’attributs d’une catégorie : envoyez ces clés dans `attributes` lors de la création d’une annonce. Les valeurs `select` doivent faire partie de `options` ; les valeurs `number` doivent être comprises entre `min` et `max` ; `boolean` accepte true/false.",
        "x-scopes": [
          "catalog:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "catalog:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Category id.",
            "x-description-fr": "Identifiant de la catégorie.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "Attributes of the category.",
            "x-description-fr": "Attributs de la catégorie.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "category"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CategoryAttribute"
                      }
                    },
                    "category": {
                      "$ref": "#/components/schemas/GameCategory"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "key": "region",
                      "label": "Region",
                      "type": "select",
                      "options": [
                        "EU",
                        "NA",
                        "AP",
                        "KR",
                        "BR",
                        "LATAM"
                      ],
                      "ordered": false,
                      "required": true,
                      "filterable": true,
                      "min": null,
                      "max": null,
                      "unit": null,
                      "show_on_card": true,
                      "sort_order": 0
                    },
                    {
                      "key": "rank",
                      "label": "Current rank",
                      "type": "select",
                      "options": [
                        "Iron",
                        "Bronze",
                        "Silver",
                        "Gold",
                        "Platinum",
                        "Diamond",
                        "Ascendant",
                        "Immortal",
                        "Radiant"
                      ],
                      "ordered": true,
                      "required": true,
                      "filterable": true,
                      "min": null,
                      "max": null,
                      "unit": null,
                      "show_on_card": true,
                      "sort_order": 1
                    },
                    {
                      "key": "agents_owned",
                      "label": "Agents owned",
                      "type": "number",
                      "options": null,
                      "ordered": false,
                      "required": true,
                      "filterable": true,
                      "min": 0,
                      "max": 30,
                      "unit": null,
                      "show_on_card": true,
                      "sort_order": 2
                    }
                  ],
                  "category": {
                    "id": 1,
                    "game_id": 1,
                    "name": "Accounts",
                    "slug": "accounts",
                    "type": "account",
                    "supports_instant_delivery": true,
                    "supports_topup_delivery": false
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 8
      }
    },
    "/disputes": {
      "get": {
        "tags": [
          "Disputes"
        ],
        "operationId": "disputesIndex",
        "summary": "List disputes",
        "x-summary-fr": "Lister les litiges",
        "description": "Disputes on your sales, newest first; `role=buyer` lists the disputes on your purchases instead. `awaiting` tells who has to act next: `seller`, `buyer`, `admin` (escalated to MythicDeals) or null (finished). Items are a summary with `offer_count`; get one dispute for its offers, evidence and timeline.",
        "x-description-fr": "Les litiges sur vos ventes, les plus récents en premier ; `role=buyer` liste plutôt les litiges sur vos achats. `awaiting` indique qui doit agir : `seller`, `buyer`, `admin` (transmis à MythicDeals) ou null (terminé). Les éléments sont un résumé avec `offer_count` ; obtenez un litige pour ses offres, preuves et sa chronologie.",
        "x-scopes": [
          "disputes:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "disputes:read"
            ]
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "role",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "seller",
                "buyer"
              ],
              "default": "seller"
            },
            "description": "Disputes on your sales (seller) or your purchases (buyer).",
            "x-description-fr": "Litiges sur vos ventes (seller) ou vos achats (buyer)."
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "One status or several separated by commas: open, awaiting_buyer, awaiting_seller, escalated, resolved, closed.",
            "x-description-fr": "Un statut ou plusieurs séparés par des virgules : open, awaiting_buyer, awaiting_seller, escalated, resolved, closed."
          },
          {
            "in": "query",
            "name": "created_since",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Only disputes opened at or after this time.",
            "x-description-fr": "Uniquement les litiges ouverts à partir de cette date."
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            },
            "description": "Items per page, 1–100.",
            "x-description-fr": "Éléments par page, de 1 à 100."
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Page number.",
            "x-description-fr": "Numéro de page."
          }
        ],
        "x-sample-query": {
          "status": "open,awaiting_seller"
        },
        "responses": {
          "200": {
            "description": "A page of disputes.",
            "x-description-fr": "Une page de litiges.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "links",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Dispute"
                      }
                    },
                    "links": {
                      "$ref": "#/components/schemas/PaginationLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 1,
                      "order": {
                        "id": 3,
                        "number": "48296203",
                        "status": "disputed",
                        "listing_title": "Immortal 2 account, 42 skins",
                        "total_paid_cents": 11999
                      },
                      "status": "awaiting_buyer",
                      "awaiting": "buyer",
                      "opener_role": "buyer",
                      "category": "not_as_described",
                      "category_label": "Not as described",
                      "reason": "The rank is Ascendant 3, not Immortal 2 as the listing said.",
                      "requested_outcome": "partial_refund",
                      "requested_amount_cents": 5000,
                      "pending_offer": {
                        "id": 1,
                        "from_role": "seller",
                        "type": "partial_refund",
                        "amount_cents": 3000,
                        "note": "The rank dropped after the last act; I can refund $30.",
                        "status": "pending",
                        "created_at": "2026-10-27T12:37:56Z",
                        "updated_at": "2026-10-27T12:37:56Z"
                      },
                      "resolution": null,
                      "resolved_amount_cents": null,
                      "resolution_note": null,
                      "currency": "USD",
                      "escalated_at": null,
                      "resolved_at": null,
                      "created_at": "2026-10-27T12:26:56Z",
                      "updated_at": "2026-10-27T12:37:56Z",
                      "offer_count": 1
                    }
                  ],
                  "links": {
                    "first": "http://localhost:8000/api/v1/disputes?page=1",
                    "last": "http://localhost:8000/api/v1/disputes?page=1",
                    "prev": null,
                    "next": null
                  },
                  "meta": {
                    "current_page": 1,
                    "from": 1,
                    "last_page": 1,
                    "links": [
                      {
                        "url": null,
                        "label": "&laquo; Previous",
                        "page": null,
                        "active": false
                      },
                      {
                        "url": "http://localhost:8000/api/v1/disputes?page=1",
                        "label": "1",
                        "page": 1,
                        "active": true
                      },
                      {
                        "url": null,
                        "label": "Next &raquo;",
                        "page": null,
                        "active": false
                      }
                    ],
                    "path": "http://localhost:8000/api/v1/disputes",
                    "per_page": 25,
                    "to": 1,
                    "total": 1
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 44
      }
    },
    "/disputes/{id}": {
      "get": {
        "tags": [
          "Disputes"
        ],
        "operationId": "disputesShow",
        "summary": "Get a dispute",
        "x-summary-fr": "Obtenir un litige",
        "description": "One dispute where you are the seller or the buyer, with every offer (newest state of each), the evidence files (details and `download_url`) and the full `timeline`. A counter-offer of type `redeliver` has `amount_cents: 0`: no money back, the seller fixes the delivery.",
        "x-description-fr": "Un litige dont vous êtes le vendeur ou l’acheteur, avec toutes les offres (dans leur dernier état), les fichiers de preuve (détails et `download_url`) et la `timeline` complète. Une contre-offre de type `redeliver` a `amount_cents: 0` : pas de remboursement, le vendeur corrige la livraison.",
        "x-scopes": [
          "disputes:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "disputes:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Dispute id.",
            "x-description-fr": "Identifiant du litige.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "The dispute.",
            "x-description-fr": "Le litige.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DisputeDetail"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "order": {
                      "id": 3,
                      "number": "48296203",
                      "status": "disputed",
                      "listing_title": "Immortal 2 account, 42 skins",
                      "total_paid_cents": 11999
                    },
                    "status": "awaiting_buyer",
                    "awaiting": "buyer",
                    "opener_role": "buyer",
                    "category": "not_as_described",
                    "category_label": "Not as described",
                    "reason": "The rank is Ascendant 3, not Immortal 2 as the listing said.",
                    "requested_outcome": "partial_refund",
                    "requested_amount_cents": 5000,
                    "pending_offer": {
                      "id": 1,
                      "from_role": "seller",
                      "type": "partial_refund",
                      "amount_cents": 3000,
                      "note": "The rank dropped after the last act; I can refund $30.",
                      "status": "pending",
                      "created_at": "2026-10-27T12:37:56Z",
                      "updated_at": "2026-10-27T12:37:56Z"
                    },
                    "resolution": null,
                    "resolved_amount_cents": null,
                    "resolution_note": null,
                    "currency": "USD",
                    "escalated_at": null,
                    "resolved_at": null,
                    "created_at": "2026-10-27T12:26:56Z",
                    "updated_at": "2026-10-27T12:37:56Z",
                    "offers": [
                      {
                        "id": 1,
                        "from_role": "seller",
                        "type": "partial_refund",
                        "amount_cents": 3000,
                        "note": "The rank dropped after the last act; I can refund $30.",
                        "status": "pending",
                        "created_at": "2026-10-27T12:37:56Z",
                        "updated_at": "2026-10-27T12:37:56Z"
                      }
                    ],
                    "evidence": [
                      {
                        "id": 1,
                        "name": "rank.png",
                        "mime": "image/png",
                        "size": 153,
                        "is_image": true,
                        "uploaded_by": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "from_chat": true,
                        "download_url": "http://localhost:8000/api/v1/disputes/1/evidence/1",
                        "created_at": "2026-10-27T12:27:56Z"
                      }
                    ],
                    "timeline": [
                      {
                        "type": "dispute.opened",
                        "at": "2026-10-27T12:26:56Z",
                        "actor": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "data": {
                          "category": "not_as_described",
                          "reason": "The rank is Ascendant 3, not Immortal 2 as the listing said.",
                          "requested_outcome": "partial_refund",
                          "requested_amount_cents": 5000
                        }
                      },
                      {
                        "type": "message.created",
                        "at": "2026-10-27T12:27:56Z",
                        "actor": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "data": {
                          "message_id": 12,
                          "body": "Screenshot of the rank right after login.",
                          "attachment_count": 1
                        }
                      },
                      {
                        "type": "evidence.added",
                        "at": "2026-10-27T12:27:56Z",
                        "actor": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "data": {
                          "evidence_id": 1,
                          "name": "rank.png",
                          "from_chat": true
                        }
                      },
                      {
                        "type": "offer.created",
                        "at": "2026-10-27T12:37:56Z",
                        "actor": {
                          "id": 1,
                          "role": "seller"
                        },
                        "data": {
                          "offer_id": 1,
                          "type": "partial_refund",
                          "amount_cents": 3000,
                          "note": "The rank dropped after the last act; I can refund $30."
                        }
                      },
                      {
                        "type": "message.created",
                        "at": "2026-10-27T12:39:56Z",
                        "actor": {
                          "id": 1,
                          "role": "seller"
                        },
                        "data": {
                          "message_id": 14,
                          "body": "The rank reset with the new act — see the patch notes. Offering $30 back.",
                          "attachment_count": 0
                        }
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 45
      }
    },
    "/disputes/{id}/accept": {
      "post": {
        "tags": [
          "Disputes"
        ],
        "operationId": "disputesAccept",
        "summary": "Accept the buyer’s request",
        "x-summary-fr": "Accepter la demande de l’acheteur",
        "description": "Accepts what the buyer is asking for: their pending offer if there is one; otherwise — when nobody has made an offer yet — the refund they asked for when they opened the dispute (`requested_outcome` `full_refund`, or `partial_refund` of `requested_amount_cents`). The dispute is settled at once through escrow: the refund goes back to the buyer, the rest is released to you, and the response shows `status: resolved`.\n\n409 when there is nothing to accept, when the pending offer is your own, when the dispute is escalated or finished, or when the buyer asked for delivery rather than money (`requested_outcome: deliver` — correct the delivery with PATCH /orders/{order}/delivery or counter with `redeliver`).\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Accepte ce que demande l’acheteur : son offre en attente s’il y en a une ; sinon — quand personne n’a encore fait d’offre — le remboursement demandé à l’ouverture du litige (`requested_outcome` `full_refund`, ou `partial_refund` de `requested_amount_cents`). Le litige est réglé immédiatement via le séquestre : le remboursement revient à l’acheteur, le reste vous est versé, et la réponse indique `status: resolved`.\n\n409 s’il n’y a rien à accepter, si l’offre en attente est la vôtre, si le litige est transmis à MythicDeals ou terminé, ou si l’acheteur a demandé une livraison plutôt que de l’argent (`requested_outcome: deliver` — corrigez la livraison avec PATCH /orders/{order}/delivery ou proposez `redeliver`).\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "disputes:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "disputes:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Dispute id.",
            "x-description-fr": "Identifiant du litige.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "The settled dispute.",
            "x-description-fr": "Le litige réglé.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DisputeDetail"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 2,
                    "order": {
                      "id": 4,
                      "number": "48298437",
                      "status": "refunded",
                      "listing_title": "Immortal 2 account, 42 skins",
                      "total_paid_cents": 11999
                    },
                    "status": "resolved",
                    "awaiting": null,
                    "opener_role": "buyer",
                    "category": "not_delivered",
                    "category_label": "Never delivered",
                    "reason": "The login does not work at all.",
                    "requested_outcome": "full_refund",
                    "requested_amount_cents": null,
                    "pending_offer": null,
                    "resolution": "refund_full",
                    "resolved_amount_cents": 11999,
                    "resolution_note": "Agreed between buyer and seller",
                    "currency": "USD",
                    "escalated_at": null,
                    "resolved_at": "2026-10-27T13:06:56Z",
                    "created_at": "2026-10-27T13:01:56Z",
                    "updated_at": "2026-10-27T13:06:56Z",
                    "offers": [
                      {
                        "id": 2,
                        "from_role": "seller",
                        "type": "full_refund",
                        "amount_cents": 11999,
                        "note": "Seller accepted the buyer's request",
                        "status": "accepted",
                        "created_at": "2026-10-27T13:06:56Z",
                        "updated_at": "2026-10-27T13:06:56Z"
                      }
                    ],
                    "evidence": [],
                    "timeline": [
                      {
                        "type": "dispute.opened",
                        "at": "2026-10-27T13:01:56Z",
                        "actor": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "data": {
                          "category": "not_delivered",
                          "reason": "The login does not work at all.",
                          "requested_outcome": "full_refund",
                          "requested_amount_cents": null
                        }
                      },
                      {
                        "type": "offer.created",
                        "at": "2026-10-27T13:06:56Z",
                        "actor": {
                          "id": 1,
                          "role": "seller"
                        },
                        "data": {
                          "offer_id": 2,
                          "type": "full_refund",
                          "amount_cents": 11999,
                          "note": "Seller accepted the buyer's request"
                        }
                      },
                      {
                        "type": "offer.accepted",
                        "at": "2026-10-27T13:06:56Z",
                        "actor": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "data": {
                          "offer_id": 2
                        }
                      },
                      {
                        "type": "dispute.resolved",
                        "at": "2026-10-27T13:06:56Z",
                        "actor": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "data": {
                          "resolution": "refund_full",
                          "refunded_amount_cents": 11999,
                          "note": "Agreed between buyer and seller"
                        }
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 48
      }
    },
    "/disputes/{id}/counter": {
      "post": {
        "tags": [
          "Disputes"
        ],
        "operationId": "disputesCounter",
        "summary": "Make a counter-offer",
        "x-summary-fr": "Faire une contre-offre",
        "description": "Proposes a settlement to the buyer: `full_refund` (the whole order total), `partial_refund` (`amount_cents`, more than 0 and less than the order total — otherwise 409), or `redeliver` (no refund: you fix the delivery; `note` is required, and with `delivery` the corrected details are delivered right away, exactly like PATCH /orders/{order}/delivery). A new offer replaces your earlier pending one (kept as `superseded`). The dispute then waits for the buyer (`awaiting: buyer`); if they accept a `redeliver`, the money is released to you. `meta.offer_id` is the new offer. Escalated or finished disputes → 409.\n\nRequires a verified seller account with a verified email address. Accepts an `Idempotency-Key` header: retrying with the same key returns the first response.",
        "x-description-fr": "Propose un règlement à l’acheteur : `full_refund` (le total de la commande), `partial_refund` (`amount_cents`, supérieur à 0 et inférieur au total de la commande — sinon 409), ou `redeliver` (pas de remboursement : vous corrigez la livraison ; `note` est obligatoire, et avec `delivery` les informations corrigées sont livrées immédiatement, exactement comme PATCH /orders/{order}/delivery). Une nouvelle offre remplace votre offre précédente en attente (conservée comme `superseded`). Le litige attend ensuite l’acheteur (`awaiting: buyer`) ; s’il accepte un `redeliver`, l’argent vous est versé. `meta.offer_id` est la nouvelle offre. Litige transmis à MythicDeals ou terminé → 409.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée. Accepte un en-tête `Idempotency-Key` : une nouvelle tentative avec la même clé renvoie la première réponse.",
        "x-scopes": [
          "disputes:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": true,
        "security": [
          {
            "bearerAuth": [
              "disputes:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Dispute id.",
            "x-description-fr": "Identifiant du litige.",
            "example": 1
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DisputeCounter"
              },
              "example": {
                "type": "partial_refund",
                "amount_cents": 3000,
                "note": "The rank dropped after the last act; I can refund $30."
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The dispute with your new offer.",
            "x-description-fr": "Le litige avec votre nouvelle offre.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DisputeDetail"
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "offer_id": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "order": {
                      "id": 3,
                      "number": "48296203",
                      "status": "disputed",
                      "listing_title": "Immortal 2 account, 42 skins",
                      "total_paid_cents": 11999
                    },
                    "status": "awaiting_buyer",
                    "awaiting": "buyer",
                    "opener_role": "buyer",
                    "category": "not_as_described",
                    "category_label": "Not as described",
                    "reason": "The rank is Ascendant 3, not Immortal 2 as the listing said.",
                    "requested_outcome": "partial_refund",
                    "requested_amount_cents": 5000,
                    "pending_offer": {
                      "id": 1,
                      "from_role": "seller",
                      "type": "partial_refund",
                      "amount_cents": 3000,
                      "note": "The rank dropped after the last act; I can refund $30.",
                      "status": "pending",
                      "created_at": "2026-10-27T12:37:56Z",
                      "updated_at": "2026-10-27T12:37:56Z"
                    },
                    "resolution": null,
                    "resolved_amount_cents": null,
                    "resolution_note": null,
                    "currency": "USD",
                    "escalated_at": null,
                    "resolved_at": null,
                    "created_at": "2026-10-27T12:26:56Z",
                    "updated_at": "2026-10-27T12:37:56Z",
                    "offers": [
                      {
                        "id": 1,
                        "from_role": "seller",
                        "type": "partial_refund",
                        "amount_cents": 3000,
                        "note": "The rank dropped after the last act; I can refund $30.",
                        "status": "pending",
                        "created_at": "2026-10-27T12:37:56Z",
                        "updated_at": "2026-10-27T12:37:56Z"
                      }
                    ],
                    "evidence": [
                      {
                        "id": 1,
                        "name": "rank.png",
                        "mime": "image/png",
                        "size": 153,
                        "is_image": true,
                        "uploaded_by": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "from_chat": true,
                        "download_url": "http://localhost:8000/api/v1/disputes/1/evidence/1",
                        "created_at": "2026-10-27T12:27:56Z"
                      }
                    ],
                    "timeline": [
                      {
                        "type": "dispute.opened",
                        "at": "2026-10-27T12:26:56Z",
                        "actor": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "data": {
                          "category": "not_as_described",
                          "reason": "The rank is Ascendant 3, not Immortal 2 as the listing said.",
                          "requested_outcome": "partial_refund",
                          "requested_amount_cents": 5000
                        }
                      },
                      {
                        "type": "message.created",
                        "at": "2026-10-27T12:27:56Z",
                        "actor": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "data": {
                          "message_id": 12,
                          "body": "Screenshot of the rank right after login.",
                          "attachment_count": 1
                        }
                      },
                      {
                        "type": "evidence.added",
                        "at": "2026-10-27T12:27:56Z",
                        "actor": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "data": {
                          "evidence_id": 1,
                          "name": "rank.png",
                          "from_chat": true
                        }
                      },
                      {
                        "type": "offer.created",
                        "at": "2026-10-27T12:37:56Z",
                        "actor": {
                          "id": 1,
                          "role": "seller"
                        },
                        "data": {
                          "offer_id": 1,
                          "type": "partial_refund",
                          "amount_cents": 3000,
                          "note": "The rank dropped after the last act; I can refund $30."
                        }
                      }
                    ]
                  },
                  "meta": {
                    "offer_id": 1
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 49
      }
    },
    "/disputes/{id}/escalate": {
      "post": {
        "tags": [
          "Disputes"
        ],
        "operationId": "disputesEscalate",
        "summary": "Escalate to MythicDeals",
        "x-summary-fr": "Transmettre à MythicDeals",
        "description": "Asks MythicDeals to review the case and decide. After that neither side can make or accept offers (409), but both can still send messages and evidence. Calling it again on an escalated dispute returns it unchanged. Finished disputes → 409.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Demande à MythicDeals d’examiner le dossier et de trancher. Ensuite, aucune des parties ne peut faire ou accepter d’offre (409), mais toutes deux peuvent encore envoyer messages et preuves. Un nouvel appel sur un litige déjà transmis le renvoie tel quel. Litige terminé → 409.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "disputes:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "disputes:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Dispute id.",
            "x-description-fr": "Identifiant du litige.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "The escalated dispute.",
            "x-description-fr": "Le litige transmis.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DisputeDetail"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "order": {
                      "id": 3,
                      "number": "48296203",
                      "status": "disputed",
                      "listing_title": "Immortal 2 account, 42 skins",
                      "total_paid_cents": 11999
                    },
                    "status": "escalated",
                    "awaiting": "admin",
                    "opener_role": "buyer",
                    "category": "not_as_described",
                    "category_label": "Not as described",
                    "reason": "The rank is Ascendant 3, not Immortal 2 as the listing said.",
                    "requested_outcome": "partial_refund",
                    "requested_amount_cents": 5000,
                    "pending_offer": {
                      "id": 1,
                      "from_role": "seller",
                      "type": "partial_refund",
                      "amount_cents": 3000,
                      "note": "The rank dropped after the last act; I can refund $30.",
                      "status": "pending",
                      "created_at": "2026-10-27T12:37:56Z",
                      "updated_at": "2026-10-27T12:37:56Z"
                    },
                    "resolution": null,
                    "resolved_amount_cents": null,
                    "resolution_note": null,
                    "currency": "USD",
                    "escalated_at": "2026-10-27T12:41:56Z",
                    "resolved_at": null,
                    "created_at": "2026-10-27T12:26:56Z",
                    "updated_at": "2026-10-27T12:41:56Z",
                    "offers": [
                      {
                        "id": 1,
                        "from_role": "seller",
                        "type": "partial_refund",
                        "amount_cents": 3000,
                        "note": "The rank dropped after the last act; I can refund $30.",
                        "status": "pending",
                        "created_at": "2026-10-27T12:37:56Z",
                        "updated_at": "2026-10-27T12:37:56Z"
                      }
                    ],
                    "evidence": [
                      {
                        "id": 1,
                        "name": "rank.png",
                        "mime": "image/png",
                        "size": 153,
                        "is_image": true,
                        "uploaded_by": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "from_chat": true,
                        "download_url": "http://localhost:8000/api/v1/disputes/1/evidence/1",
                        "created_at": "2026-10-27T12:27:56Z"
                      }
                    ],
                    "timeline": [
                      {
                        "type": "dispute.opened",
                        "at": "2026-10-27T12:26:56Z",
                        "actor": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "data": {
                          "category": "not_as_described",
                          "reason": "The rank is Ascendant 3, not Immortal 2 as the listing said.",
                          "requested_outcome": "partial_refund",
                          "requested_amount_cents": 5000
                        }
                      },
                      {
                        "type": "message.created",
                        "at": "2026-10-27T12:27:56Z",
                        "actor": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "data": {
                          "message_id": 12,
                          "body": "Screenshot of the rank right after login.",
                          "attachment_count": 1
                        }
                      },
                      {
                        "type": "evidence.added",
                        "at": "2026-10-27T12:27:56Z",
                        "actor": {
                          "id": 2,
                          "role": "buyer"
                        },
                        "data": {
                          "evidence_id": 1,
                          "name": "rank.png",
                          "from_chat": true
                        }
                      },
                      {
                        "type": "offer.created",
                        "at": "2026-10-27T12:37:56Z",
                        "actor": {
                          "id": 1,
                          "role": "seller"
                        },
                        "data": {
                          "offer_id": 1,
                          "type": "partial_refund",
                          "amount_cents": 3000,
                          "note": "The rank dropped after the last act; I can refund $30."
                        }
                      },
                      {
                        "type": "message.created",
                        "at": "2026-10-27T12:39:56Z",
                        "actor": {
                          "id": 1,
                          "role": "seller"
                        },
                        "data": {
                          "message_id": 14,
                          "body": "The rank reset with the new act — see the patch notes. Offering $30 back.",
                          "attachment_count": 0
                        }
                      },
                      {
                        "type": "dispute.escalated",
                        "at": "2026-10-27T12:41:56Z",
                        "actor": {
                          "id": 1,
                          "role": "seller"
                        },
                        "data": []
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 50
      }
    },
    "/disputes/{id}/events": {
      "get": {
        "tags": [
          "Disputes"
        ],
        "operationId": "disputesEvents",
        "summary": "List dispute events",
        "x-summary-fr": "Lister les événements d’un litige",
        "description": "The timeline of a dispute, oldest first — the same list as `timeline` in GET /disputes/{id}. Types: `dispute.opened`, `message.created` (order chat messages written since the dispute opened; system messages are left out), `evidence.added`, `offer.created`, `offer.accepted`, `offer.rejected`, `dispute.escalated`, `dispute.resolved`, `dispute.closed`. `actor.role` is buyer, seller, admin or system; an admin’s id is never shown.",
        "x-description-fr": "La chronologie d’un litige, du plus ancien au plus récent — la même liste que `timeline` dans GET /disputes/{id}. Types : `dispute.opened`, `message.created` (messages de la commande écrits depuis l’ouverture du litige ; les messages système sont exclus), `evidence.added`, `offer.created`, `offer.accepted`, `offer.rejected`, `dispute.escalated`, `dispute.resolved`, `dispute.closed`. `actor.role` vaut buyer, seller, admin ou system ; l’identifiant d’un administrateur n’est jamais affiché.",
        "x-scopes": [
          "disputes:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "disputes:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Dispute id.",
            "x-description-fr": "Identifiant du litige.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "The timeline.",
            "x-description-fr": "La chronologie.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DisputeEvent"
                      }
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "type": "dispute.opened",
                      "at": "2026-10-27T12:26:56Z",
                      "actor": {
                        "id": 2,
                        "role": "buyer"
                      },
                      "data": {
                        "category": "not_as_described",
                        "reason": "The rank is Ascendant 3, not Immortal 2 as the listing said.",
                        "requested_outcome": "partial_refund",
                        "requested_amount_cents": 5000
                      }
                    },
                    {
                      "type": "message.created",
                      "at": "2026-10-27T12:27:56Z",
                      "actor": {
                        "id": 2,
                        "role": "buyer"
                      },
                      "data": {
                        "message_id": 12,
                        "body": "Screenshot of the rank right after login.",
                        "attachment_count": 1
                      }
                    },
                    {
                      "type": "evidence.added",
                      "at": "2026-10-27T12:27:56Z",
                      "actor": {
                        "id": 2,
                        "role": "buyer"
                      },
                      "data": {
                        "evidence_id": 1,
                        "name": "rank.png",
                        "from_chat": true
                      }
                    },
                    {
                      "type": "offer.created",
                      "at": "2026-10-27T12:37:56Z",
                      "actor": {
                        "id": 1,
                        "role": "seller"
                      },
                      "data": {
                        "offer_id": 1,
                        "type": "partial_refund",
                        "amount_cents": 3000,
                        "note": "The rank dropped after the last act; I can refund $30."
                      }
                    },
                    {
                      "type": "message.created",
                      "at": "2026-10-27T12:39:56Z",
                      "actor": {
                        "id": 1,
                        "role": "seller"
                      },
                      "data": {
                        "message_id": 14,
                        "body": "The rank reset with the new act — see the patch notes. Offering $30 back.",
                        "attachment_count": 0
                      }
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 46
      }
    },
    "/disputes/{id}/evidence/{evidenceId}": {
      "get": {
        "tags": [
          "Disputes"
        ],
        "operationId": "disputesEvidence",
        "summary": "Download an evidence file",
        "x-summary-fr": "Télécharger une preuve",
        "description": "Downloads one evidence file with its original name (`Content-Disposition: attachment`). Use the `download_url` of the dispute; it needs your token like any other call. Files that the buyer or you attach in the order chat while the dispute is open become evidence automatically.",
        "x-description-fr": "Télécharge un fichier de preuve avec son nom d’origine (`Content-Disposition: attachment`). Utilisez le `download_url` du litige ; il nécessite votre jeton comme tout autre appel. Les fichiers joints par l’acheteur ou par vous dans la messagerie de la commande pendant le litige deviennent automatiquement des preuves.",
        "x-scopes": [
          "disputes:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "disputes:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Dispute id.",
            "x-description-fr": "Identifiant du litige.",
            "example": 1
          },
          {
            "name": "evidenceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Evidence id, from `evidence[].id` of the dispute.",
            "x-description-fr": "Identifiant de la preuve, issu de `evidence[].id` du litige.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "The file (its own content type, e.g. image/png or application/pdf).",
            "x-description-fr": "Le fichier (avec son propre type, par ex. image/png ou application/pdf).",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Content-Disposition": {
                "description": "attachment; filename=\"<original name>\"",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "contentMediaType": "application/octet-stream"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 47
      }
    },
    "/disputes/{id}/messages": {
      "post": {
        "tags": [
          "Disputes"
        ],
        "operationId": "disputesMessagesStore",
        "summary": "Send a dispute message",
        "x-summary-fr": "Envoyer un message de litige",
        "description": "Writes in the chat of the disputed order (the dispute room), as the seller. Text, files (multipart) or both — the same rules as POST /orders/{order}/messages. Files you attach become dispute evidence automatically. 409 `chat_closed` when the order chat is closed.\n\nRequires a verified seller account with a verified email address. Accepts an `Idempotency-Key` header: retrying with the same key returns the first response.",
        "x-description-fr": "Écrit dans la messagerie de la commande en litige (l’espace du litige), en tant que vendeur. Texte, fichiers (multipart) ou les deux — mêmes règles que POST /orders/{order}/messages. Les fichiers joints deviennent automatiquement des preuves du litige. 409 `chat_closed` quand la messagerie de la commande est fermée.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée. Accepte un en-tête `Idempotency-Key` : une nouvelle tentative avec la même clé renvoie la première réponse.",
        "x-scopes": [
          "disputes:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": true,
        "security": [
          {
            "bearerAuth": [
              "disputes:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Dispute id.",
            "x-description-fr": "Identifiant du litige.",
            "example": 1
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "body": {
                    "type": "string",
                    "maxLength": 2000,
                    "description": "Message text. Required unless you send files.",
                    "x-description-fr": "Texte du message. Obligatoire si vous n’envoyez pas de fichiers."
                  }
                }
              },
              "example": {
                "body": "The rank reset with the new act — see the patch notes. Offering $30 back."
              }
            },
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "body": {
                    "type": "string",
                    "maxLength": 2000
                  },
                  "files[]": {
                    "type": "array",
                    "maxItems": 5,
                    "items": {
                      "type": "string",
                      "contentMediaType": "application/octet-stream"
                    },
                    "description": "JPG, PNG, WebP or PDF, max 5 files, 4 MB each. They become evidence.",
                    "x-description-fr": "JPG, PNG, WebP ou PDF, 5 fichiers maximum, 4 Mo chacun. Ils deviennent des preuves."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The new message.",
            "x-description-fr": "Le nouveau message.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Message"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 14,
                    "order_id": 3,
                    "sender": {
                      "id": 1,
                      "name": "Budi",
                      "role": "seller"
                    },
                    "body": "The rank reset with the new act — see the patch notes. Offering $30 back.",
                    "is_system": false,
                    "attachments": [],
                    "read_at": null,
                    "created_at": "2026-10-27T12:39:56Z"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 51
      }
    },
    "/games": {
      "get": {
        "tags": [
          "Catalog"
        ],
        "operationId": "catalogGames",
        "summary": "List games",
        "x-summary-fr": "Lister les jeux",
        "description": "All active games, with the listing types sold in each one. Not paginated.",
        "x-description-fr": "Tous les jeux actifs, avec les types d’annonces vendus dans chacun. Non paginé.",
        "x-scopes": [
          "catalog:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "catalog:read"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "Active games.",
            "x-description-fr": "Jeux actifs.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Game"
                      }
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 2,
                      "slug": "mobile-legends",
                      "name": "Mobile Legends",
                      "icon_url": null,
                      "types": [
                        "account",
                        "currency",
                        "boosting"
                      ],
                      "categories_count": 3
                    },
                    {
                      "id": 5,
                      "slug": "free-fire",
                      "name": "Free Fire",
                      "icon_url": null,
                      "types": [
                        "account",
                        "currency",
                        "boosting"
                      ],
                      "categories_count": 3
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 6
      }
    },
    "/games/{slug}/categories": {
      "get": {
        "tags": [
          "Catalog"
        ],
        "operationId": "catalogCategories",
        "summary": "List a game’s categories",
        "x-summary-fr": "Lister les catégories d’un jeu",
        "description": "Active categories of a game. The category decides the listing `type` and which attributes a listing needs. Add `include=attributes` to embed each category’s attribute schema.",
        "x-description-fr": "Catégories actives d’un jeu. La catégorie détermine le `type` de l’annonce et les attributs requis. Ajoutez `include=attributes` pour inclure le schéma d’attributs de chaque catégorie.",
        "x-scopes": [
          "catalog:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "catalog:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Game slug, e.g. valorant.",
            "x-description-fr": "Slug du jeu, par ex. valorant.",
            "example": "valorant"
          },
          {
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "attributes"
              ]
            },
            "description": "Set to `attributes` to embed each category’s attributes.",
            "x-description-fr": "Indiquez `attributes` pour inclure les attributs de chaque catégorie."
          }
        ],
        "x-sample-query": {
          "include": "attributes"
        },
        "responses": {
          "200": {
            "description": "Categories of the game.",
            "x-description-fr": "Catégories du jeu.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "game"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/GameCategory"
                      }
                    },
                    "game": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "integer"
                        },
                        "slug": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        }
                      }
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 1,
                      "game_id": 1,
                      "name": "Accounts",
                      "slug": "accounts",
                      "type": "account",
                      "supports_instant_delivery": true,
                      "supports_topup_delivery": false,
                      "attributes": [
                        {
                          "key": "region",
                          "label": "Region",
                          "type": "select",
                          "options": [
                            "EU",
                            "NA",
                            "AP",
                            "KR",
                            "BR",
                            "LATAM"
                          ],
                          "ordered": false,
                          "required": true,
                          "filterable": true,
                          "min": null,
                          "max": null,
                          "unit": null,
                          "show_on_card": true,
                          "sort_order": 0
                        },
                        {
                          "key": "rank",
                          "label": "Current rank",
                          "type": "select",
                          "options": [
                            "Iron",
                            "Bronze",
                            "Silver",
                            "Gold",
                            "Platinum",
                            "Diamond",
                            "Ascendant",
                            "Immortal",
                            "Radiant"
                          ],
                          "ordered": true,
                          "required": true,
                          "filterable": true,
                          "min": null,
                          "max": null,
                          "unit": null,
                          "show_on_card": true,
                          "sort_order": 1
                        }
                      ]
                    },
                    {
                      "id": 2,
                      "game_id": 1,
                      "name": "Boosting",
                      "slug": "boosting",
                      "type": "boosting",
                      "supports_instant_delivery": false,
                      "supports_topup_delivery": false,
                      "attributes": [
                        {
                          "key": "region",
                          "label": "Region",
                          "type": "select",
                          "options": [
                            "EU",
                            "NA",
                            "AP",
                            "KR"
                          ],
                          "ordered": false,
                          "required": true,
                          "filterable": true,
                          "min": null,
                          "max": null,
                          "unit": null,
                          "show_on_card": true,
                          "sort_order": 0
                        },
                        {
                          "key": "rank_from",
                          "label": "Rank from",
                          "type": "select",
                          "options": [
                            "Iron",
                            "Bronze",
                            "Silver",
                            "Gold",
                            "Platinum",
                            "Diamond",
                            "Ascendant",
                            "Immortal"
                          ],
                          "ordered": true,
                          "required": true,
                          "filterable": true,
                          "min": null,
                          "max": null,
                          "unit": null,
                          "show_on_card": true,
                          "sort_order": 1
                        }
                      ]
                    }
                  ],
                  "game": {
                    "id": 1,
                    "slug": "valorant",
                    "name": "Valorant"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 7
      }
    },
    "/giftcards/brands": {
      "get": {
        "tags": [
          "Gift cards"
        ],
        "operationId": "giftcardsBrands",
        "summary": "List gift card brands",
        "x-summary-fr": "Lister les marques de cartes cadeaux",
        "description": "Brands that sell gift cards, with everything you need to create an offer: `game_id` + `game_category_id` for POST /listings, the accepted `regions`, `face_currencies` and face value range, plus how many offers are live and the lowest price. Filter with `q` (name or slug contains). Not paginated.",
        "x-description-fr": "Les marques qui vendent des cartes cadeaux, avec tout ce qu’il faut pour créer une offre : `game_id` + `game_category_id` pour POST /listings, les `regions`, `face_currencies` et la plage de valeurs faciales acceptées, ainsi que le nombre d’offres en ligne et le prix le plus bas. Filtrez avec `q` (le nom ou le slug contient). Non paginé.",
        "x-scopes": [
          "catalog:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "catalog:read"
            ]
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 100
            },
            "description": "Text the brand name or slug contains.",
            "x-description-fr": "Texte contenu dans le nom ou le slug de la marque."
          }
        ],
        "x-sample-query": {
          "q": "steam"
        },
        "responses": {
          "200": {
            "description": "Gift card brands.",
            "x-description-fr": "Marques de cartes cadeaux.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/GiftCardBrand"
                      }
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 9,
                      "slug": "steam",
                      "name": "Steam",
                      "icon_url": null,
                      "game_id": 9,
                      "game_category_id": 21,
                      "regions": [
                        "Global",
                        "US",
                        "EU",
                        "UK",
                        "DE",
                        "FR",
                        "ID",
                        "MY",
                        "PH",
                        "SG",
                        "TH",
                        "JP",
                        "BR",
                        "IN",
                        "TR",
                        "CA",
                        "AU",
                        "LATAM"
                      ],
                      "face_currencies": [
                        "USD",
                        "EUR",
                        "GBP",
                        "IDR",
                        "MYR",
                        "PHP",
                        "SGD",
                        "THB",
                        "JPY",
                        "BRL",
                        "INR",
                        "TRY",
                        "CAD",
                        "AUD"
                      ],
                      "face_value_min": 1,
                      "face_value_max": 10000000,
                      "offers_count": 0,
                      "lowest_price_cents": null,
                      "currency": "USD"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 9
      }
    },
    "/giftcards/regions": {
      "get": {
        "tags": [
          "Gift cards"
        ],
        "operationId": "giftcardsRegions",
        "summary": "List gift card regions",
        "x-summary-fr": "Lister les régions des cartes cadeaux",
        "description": "Every code accepted in the `region` attribute of a gift card listing, with its English name and whether it is a single country. `meta.face_currencies` lists the currencies accepted in `face_currency`.",
        "x-description-fr": "Tous les codes acceptés dans l’attribut `region` d’une annonce de carte cadeau, avec leur nom anglais et s’il s’agit d’un seul pays. `meta.face_currencies` liste les devises acceptées dans `face_currency`.",
        "x-scopes": [
          "catalog:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "catalog:read"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "Regions.",
            "x-description-fr": "Régions.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/GiftCardRegion"
                      }
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "face_currencies": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "USD",
                              "EUR",
                              "GBP",
                              "IDR",
                              "MYR",
                              "PHP",
                              "SGD",
                              "THB",
                              "JPY",
                              "BRL",
                              "INR",
                              "TRY",
                              "CAD",
                              "AUD"
                            ]
                          }
                        }
                      }
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "code": "Global",
                      "name": "Global",
                      "slug": "global",
                      "is_country": false
                    },
                    {
                      "code": "US",
                      "name": "United States",
                      "slug": "us",
                      "is_country": true
                    },
                    {
                      "code": "EU",
                      "name": "Europe",
                      "slug": "eu",
                      "is_country": false
                    },
                    {
                      "code": "UK",
                      "name": "United Kingdom",
                      "slug": "uk",
                      "is_country": true
                    },
                    {
                      "code": "DE",
                      "name": "Germany",
                      "slug": "de",
                      "is_country": true
                    },
                    {
                      "code": "FR",
                      "name": "France",
                      "slug": "fr",
                      "is_country": true
                    },
                    {
                      "code": "ID",
                      "name": "Indonesia",
                      "slug": "id",
                      "is_country": true
                    },
                    {
                      "code": "MY",
                      "name": "Malaysia",
                      "slug": "my",
                      "is_country": true
                    },
                    {
                      "code": "PH",
                      "name": "Philippines",
                      "slug": "ph",
                      "is_country": true
                    },
                    {
                      "code": "SG",
                      "name": "Singapore",
                      "slug": "sg",
                      "is_country": true
                    },
                    {
                      "code": "TH",
                      "name": "Thailand",
                      "slug": "th",
                      "is_country": true
                    },
                    {
                      "code": "JP",
                      "name": "Japan",
                      "slug": "jp",
                      "is_country": true
                    },
                    {
                      "code": "BR",
                      "name": "Brazil",
                      "slug": "br",
                      "is_country": true
                    },
                    {
                      "code": "IN",
                      "name": "India",
                      "slug": "in",
                      "is_country": true
                    },
                    {
                      "code": "TR",
                      "name": "Turkey",
                      "slug": "tr",
                      "is_country": true
                    },
                    {
                      "code": "CA",
                      "name": "Canada",
                      "slug": "ca",
                      "is_country": true
                    },
                    {
                      "code": "AU",
                      "name": "Australia",
                      "slug": "au",
                      "is_country": true
                    },
                    {
                      "code": "LATAM",
                      "name": "Latin America",
                      "slug": "latam",
                      "is_country": false
                    }
                  ],
                  "meta": {
                    "face_currencies": [
                      "USD",
                      "EUR",
                      "GBP",
                      "IDR",
                      "MYR",
                      "PHP",
                      "SGD",
                      "THB",
                      "JPY",
                      "BRL",
                      "INR",
                      "TRY",
                      "CAD",
                      "AUD"
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 10
      }
    },
    "/listings": {
      "get": {
        "tags": [
          "Listings"
        ],
        "operationId": "listingsIndex",
        "summary": "List your listings",
        "x-summary-fr": "Lister vos annonces",
        "description": "Your own listings, newest change first by default. Use `updated_since` to sync only what changed.",
        "x-description-fr": "Vos propres annonces, les plus récemment modifiées en premier par défaut. Utilisez `updated_since` pour ne synchroniser que les changements.",
        "x-scopes": [
          "listings:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:read"
            ]
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "draft",
                "active",
                "paused",
                "sold_out",
                "removed"
              ]
            },
            "description": "Only listings with this status.",
            "x-description-fr": "Uniquement les annonces ayant ce statut."
          },
          {
            "in": "query",
            "name": "type",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "account",
                "currency",
                "item",
                "boosting",
                "giftcard"
              ]
            },
            "description": "Only this listing type.",
            "x-description-fr": "Uniquement ce type d’annonce."
          },
          {
            "in": "query",
            "name": "game",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Game id or slug.",
            "x-description-fr": "Identifiant ou slug du jeu."
          },
          {
            "in": "query",
            "name": "category",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Category id.",
            "x-description-fr": "Identifiant de la catégorie."
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 100
            },
            "description": "Text the title contains.",
            "x-description-fr": "Texte contenu dans le titre."
          },
          {
            "in": "query",
            "name": "updated_since",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Only listings updated at or after this time (ISO-8601).",
            "x-description-fr": "Uniquement les annonces modifiées à partir de cette date (ISO-8601)."
          },
          {
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "id",
                "created_at",
                "updated_at",
                "price",
                "stock",
                "title",
                "-id",
                "-created_at",
                "-updated_at",
                "-price",
                "-stock",
                "-title"
              ],
              "default": "-updated_at"
            },
            "description": "Sort field; prefix with `-` for descending. `price` sorts by price_cents.",
            "x-description-fr": "Champ de tri ; préfixe `-` pour l’ordre décroissant. `price` trie selon price_cents."
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            },
            "description": "Items per page, 1–100.",
            "x-description-fr": "Éléments par page, de 1 à 100."
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Page number.",
            "x-description-fr": "Numéro de page."
          }
        ],
        "x-sample-query": {
          "status": "active",
          "per_page": 50
        },
        "responses": {
          "200": {
            "description": "A page of listings.",
            "x-description-fr": "Une page d’annonces.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "links",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Listing"
                      }
                    },
                    "links": {
                      "$ref": "#/components/schemas/PaginationLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "description": null,
                      "status": "active",
                      "type": "account",
                      "game": {
                        "id": 1,
                        "slug": "valorant",
                        "name": "Valorant"
                      },
                      "category": {
                        "id": 1,
                        "slug": "accounts",
                        "name": "Accounts"
                      },
                      "price_cents": 11999,
                      "currency": "USD",
                      "input_price": {
                        "amount": "119.99",
                        "currency": "USD"
                      },
                      "stock": 3,
                      "min_quantity": 1,
                      "delivery_eta_minutes": 30,
                      "warranty_days": 7,
                      "instant_delivery": {
                        "enabled": false,
                        "units": 0
                      },
                      "topup": null,
                      "attributes": {
                        "region": "EU",
                        "rank": "Immortal",
                        "agents_owned": 23,
                        "skin_count": 42,
                        "level": 212,
                        "email_change": true
                      },
                      "images": [],
                      "url": "http://localhost:8000/listing/1",
                      "created_at": "2026-10-26T15:54:50Z",
                      "updated_at": "2026-10-26T15:54:50Z"
                    }
                  ],
                  "links": {
                    "first": "http://localhost:8000/api/v1/listings?per_page=1&page=1",
                    "last": "http://localhost:8000/api/v1/listings?per_page=1&page=1",
                    "prev": null,
                    "next": null
                  },
                  "meta": {
                    "current_page": 1,
                    "from": 1,
                    "last_page": 1,
                    "links": [
                      {
                        "url": null,
                        "label": "&laquo; Previous",
                        "page": null,
                        "active": false
                      },
                      {
                        "url": "http://localhost:8000/api/v1/listings?per_page=1&page=1",
                        "label": "1",
                        "page": 1,
                        "active": true
                      },
                      {
                        "url": null,
                        "label": "Next &raquo;",
                        "page": null,
                        "active": false
                      }
                    ],
                    "path": "http://localhost:8000/api/v1/listings",
                    "per_page": 1,
                    "to": 1,
                    "total": 1
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 11
      },
      "post": {
        "tags": [
          "Listings"
        ],
        "operationId": "listingsStore",
        "summary": "Create a listing",
        "x-summary-fr": "Créer une annonce",
        "description": "Creates a listing with exactly the same rules as the website form. Send the price either as `price_cents` (USD cents) or as `price` + `currency` (converted to USD at the current rate). After conversion the price must be between $1.00 and $50,000.00. `attributes` are checked against the category schema (GET /categories/{id}/attributes).\n\n**Gift cards:** use the `game_id` + `game_category_id` of a brand (GET /giftcards/brands), `attributes` `region`, `face_value` and `face_currency`, and the codes in `delivery_units` as `{code, pin?, expires_at?}`. Gift cards are always delivered instantly, one code per sale: `stock` is the number of codes (whatever you send), warranty is 0, and `delivery_eta_minutes` defaults to 5. Without codes a gift card can only be saved as a `draft`. Add more codes later with POST /listings/{id}/units.\n\nRequires a verified seller account with a verified email address. Accepts an `Idempotency-Key` header: retrying with the same key returns the first response.",
        "x-description-fr": "Crée une annonce avec exactement les mêmes règles que le formulaire du site. Envoyez le prix soit en `price_cents` (centimes USD), soit en `price` + `currency` (converti en USD au taux du moment). Après conversion, le prix doit être compris entre $1.00 et $50,000.00. Les `attributes` sont vérifiés selon le schéma de la catégorie (GET /categories/{id}/attributes).\n\n**Cartes cadeaux :** utilisez le `game_id` + `game_category_id` d’une marque (GET /giftcards/brands), les `attributes` `region`, `face_value` et `face_currency`, et les codes dans `delivery_units` sous la forme `{code, pin?, expires_at?}`. Les cartes cadeaux sont toujours livrées instantanément, un code par vente : `stock` est le nombre de codes (quelle que soit la valeur envoyée), la garantie vaut 0 et `delivery_eta_minutes` vaut 5 par défaut. Sans code, une carte cadeau ne peut être enregistrée qu’en `draft`. Ajoutez d’autres codes plus tard avec POST /listings/{id}/units.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée. Accepte un en-tête `Idempotency-Key` : une nouvelle tentative avec la même clé renvoie la première réponse.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": true,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ListingCreate"
              },
              "example": {
                "game_id": 1,
                "game_category_id": 1,
                "status": "active",
                "title": "Immortal 2 account, 42 skins",
                "price_cents": 11999,
                "stock": 3,
                "delivery_eta_minutes": 30,
                "warranty_days": 7,
                "attributes": {
                  "region": "EU",
                  "rank": "Immortal",
                  "agents_owned": 23,
                  "skin_count": 42,
                  "level": 212,
                  "email_change": true
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The new listing.",
            "x-description-fr": "La nouvelle annonce.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Listing"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "title": "Immortal 2 account, 42 skins",
                    "description": null,
                    "status": "active",
                    "type": "account",
                    "game": {
                      "id": 1,
                      "slug": "valorant",
                      "name": "Valorant"
                    },
                    "category": {
                      "id": 1,
                      "slug": "accounts",
                      "name": "Accounts"
                    },
                    "price_cents": 11999,
                    "currency": "USD",
                    "input_price": {
                      "amount": "119.99",
                      "currency": "USD"
                    },
                    "stock": 3,
                    "min_quantity": 1,
                    "delivery_eta_minutes": 30,
                    "warranty_days": 7,
                    "instant_delivery": {
                      "enabled": false,
                      "units": 0
                    },
                    "topup": null,
                    "attributes": {
                      "region": "EU",
                      "rank": "Immortal",
                      "agents_owned": 23,
                      "skin_count": 42,
                      "level": 212,
                      "email_change": true
                    },
                    "images": [],
                    "url": "http://localhost:8000/listing/1",
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 12
      }
    },
    "/listings/bulk": {
      "patch": {
        "tags": [
          "Listings"
        ],
        "operationId": "listingsBulk",
        "summary": "Update many listings",
        "x-summary-fr": "Modifier plusieurs annonces",
        "description": "Changes `price_cents`, `stock` and/or `status` of up to 100 listings in one transaction. Each item gets its own result. With `atomic: true`, one failed item cancels everything (422 `bulk_failed`). Item error codes: `not_found`, `duplicate_item`, `conflict` (removed listing), `validation_failed`, `stock_managed_by_units`, `cannot_activate` (`status: active` on a listing that cannot be published yet — see POST /listings/{id}/activate; the message says why), `rolled_back`.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Modifie `price_cents`, `stock` et/ou `status` de 100 annonces maximum en une seule transaction. Chaque élément a son propre résultat. Avec `atomic: true`, un seul échec annule tout (422 `bulk_failed`). Codes d’erreur par élément : `not_found`, `duplicate_item`, `conflict` (annonce supprimée), `validation_failed`, `stock_managed_by_units`, `cannot_activate` (`status: active` sur une annonce qui ne peut pas encore être publiée — voir POST /listings/{id}/activate ; le message en donne la raison), `rolled_back`.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkUpdate"
              },
              "example": {
                "items": [
                  {
                    "id": 1,
                    "price_cents": 9999,
                    "stock": 4
                  },
                  {
                    "id": 2,
                    "status": "paused"
                  }
                ],
                "atomic": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Per-item results.",
            "x-description-fr": "Résultats par élément.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkResult"
                },
                "example": {
                  "data": [
                    {
                      "id": 1,
                      "ok": true,
                      "listing": {
                        "id": 1,
                        "status": "active",
                        "price_cents": 9999,
                        "currency": "USD",
                        "stock": 4,
                        "updated_at": "2026-10-26T15:54:50Z"
                      }
                    },
                    {
                      "id": 999999,
                      "ok": false,
                      "error": {
                        "code": "not_found",
                        "message": "Listing not found."
                      }
                    }
                  ],
                  "meta": {
                    "total": 2,
                    "updated": 1,
                    "failed": 1
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "description": "Validation failed, or `bulk_failed` when atomic and an item failed (body then also has `data` with per-item results).",
            "x-description-fr": "Échec de validation, ou `bulk_failed` en mode atomique quand un élément échoue (la réponse contient alors aussi `data` avec les résultats par élément).",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValidationError"
                    },
                    {
                      "$ref": "#/components/schemas/BulkFailed"
                    }
                  ]
                },
                "example": {
                  "error": {
                    "code": "bulk_failed",
                    "message": "1 item(s) failed; nothing was saved (atomic)."
                  },
                  "data": [
                    {
                      "id": 1,
                      "ok": false,
                      "error": {
                        "code": "rolled_back",
                        "message": "Not saved because another item failed."
                      }
                    },
                    {
                      "id": 999999,
                      "ok": false,
                      "error": {
                        "code": "not_found",
                        "message": "Listing not found."
                      }
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 13
      }
    },
    "/listings/bulk-update": {
      "post": {
        "tags": [
          "Listings"
        ],
        "operationId": "listingsBulkUpdate",
        "summary": "Update listings by filter",
        "x-summary-fr": "Modifier des annonces par filtre",
        "description": "Changes every listing that matches `filter`, in one transaction — e.g. “all my active Valorant listings −5 %”. Filters (at least one, combined): `game` (id or slug), `type`, `category` (id), `status` (one or a list, not `removed`) and `ids`. Removed listings never match. Changes (at least one): `price` with exactly one of `set_cents`, `percent` (−90 to 500) or `delta_cents`; `stock.set`; `status.set`; `delivery_eta_minutes`.\n\nNew prices are rounded to whole cents and kept between $1.00 and $50,000.00: a listing whose price had to be clamped gets a `price_clamped` note (a `set_cents` outside that range is refused with 422 instead). The stock of instant-delivery listings and gift cards follows their units and is never changed (`stock_managed_by_units` note). `status.set: active` follows the publish rules of POST /listings/{id}/activate (stock above 0 after this change, codes for gift cards, required attributes filled): a listing that does not pass keeps its status and gets a `cannot_activate` note with the reason; its other changes still apply. Changed prices are stored in USD (`input_price` becomes the USD amount).\n\n`dry_run: true` returns exactly the same `before` / `after` for each listing without saving anything — run it first. At most 1000 listings per call: more matches → 422 `too_many_matches`; narrow the filter.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Modifie toutes les annonces qui correspondent à `filter`, en une seule transaction — par ex. « toutes mes annonces Valorant actives −5 % ». Filtres (au moins un, combinés) : `game` (identifiant ou slug), `type`, `category` (identifiant), `status` (un ou une liste, sauf `removed`) et `ids`. Les annonces supprimées ne correspondent jamais. Modifications (au moins une) : `price` avec exactement un champ parmi `set_cents`, `percent` (de −90 à 500) ou `delta_cents` ; `stock.set` ; `status.set` ; `delivery_eta_minutes`.\n\nLes nouveaux prix sont arrondis au centime et maintenus entre $1.00 et $50,000.00 : une annonce dont le prix a dû être borné reçoit une note `price_clamped` (un `set_cents` hors de cette plage est refusé en 422). Le stock des annonces à livraison instantanée et des cartes cadeaux suit leurs unités et n’est jamais modifié (note `stock_managed_by_units`). `status.set: active` suit les règles de publication de POST /listings/{id}/activate (stock supérieur à 0 après cette modification, codes pour les cartes cadeaux, attributs obligatoires renseignés) : une annonce qui ne les respecte pas garde son statut et reçoit une note `cannot_activate` avec la raison ; ses autres modifications s’appliquent quand même. Les prix modifiés sont enregistrés en USD (`input_price` devient le montant en USD).\n\n`dry_run: true` renvoie exactement les mêmes `before` / `after` pour chaque annonce sans rien enregistrer — lancez-le d’abord. 1000 annonces maximum par appel : au-delà → 422 `too_many_matches` ; affinez le filtre.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkUpdateByFilter"
              },
              "example": {
                "filter": {
                  "game": "valorant",
                  "status": "active"
                },
                "change": {
                  "price": {
                    "percent": -5
                  },
                  "stock": {
                    "set": 10
                  }
                },
                "dry_run": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The plan (dry run) or what was changed.",
            "x-description-fr": "Le plan (dry run) ou ce qui a été modifié.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkUpdateByFilterResult"
                },
                "example": {
                  "data": [
                    {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "changed": true,
                      "before": {
                        "price_cents": 11999,
                        "stock": 3,
                        "status": "active",
                        "delivery_eta_minutes": 30
                      },
                      "after": {
                        "price_cents": 11399,
                        "stock": 10,
                        "status": "active",
                        "delivery_eta_minutes": 30
                      },
                      "notes": []
                    },
                    {
                      "id": 2,
                      "title": "Diamond 3 account, 18 skins",
                      "changed": true,
                      "before": {
                        "price_cents": 4500,
                        "stock": 2,
                        "status": "active",
                        "delivery_eta_minutes": 30
                      },
                      "after": {
                        "price_cents": 4275,
                        "stock": 2,
                        "status": "active",
                        "delivery_eta_minutes": 30
                      },
                      "notes": [
                        {
                          "field": "stock",
                          "code": "stock_managed_by_units",
                          "message": "Stock of an instant-delivery listing follows its units; not changed."
                        }
                      ]
                    }
                  ],
                  "meta": {
                    "dry_run": true,
                    "matched": 2,
                    "changed": 2,
                    "unchanged": 0,
                    "max": 1000
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "description": "Validation failed, or `too_many_matches` (with `max`) when more listings match than one call may change.",
            "x-description-fr": "Échec de validation, ou `too_many_matches` (avec `max`) quand plus d’annonces correspondent qu’un appel ne peut en modifier.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValidationError"
                    },
                    {
                      "$ref": "#/components/schemas/Error"
                    }
                  ]
                },
                "example": {
                  "error": {
                    "code": "too_many_matches",
                    "message": "1240 listings match this filter; at most 1000 can be changed per call. Narrow the filter (game, category, status or ids).",
                    "max": 1000
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 20
      }
    },
    "/listings/import/confirm": {
      "post": {
        "tags": [
          "Listing import"
        ],
        "operationId": "listingsImportConfirm",
        "summary": "Confirm a CSV import",
        "x-summary-fr": "Confirmer un import CSV",
        "description": "Step 2 of 2. Creates the valid rows of a preview. A token works once: used, expired or belonging to another account → 409 `preview_expired` (upload the file again).\n\nRequires a verified seller account with a verified email address. Accepts an `Idempotency-Key` header: retrying with the same key returns the first response.",
        "x-description-fr": "Étape 2 sur 2. Crée les lignes valides d’un aperçu. Un jeton ne sert qu’une fois : déjà utilisé, expiré ou appartenant à un autre compte → 409 `preview_expired` (renvoyez le fichier).\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée. Accepte un en-tête `Idempotency-Key` : une nouvelle tentative avec la même clé renvoie la première réponse.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": true,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "token"
                ],
                "properties": {
                  "token": {
                    "type": "string",
                    "maxLength": 64,
                    "description": "`token` from the preview.",
                    "x-description-fr": "`token` renvoyé par l’aperçu."
                  }
                }
              },
              "example": {
                "token": "wCuxHYgC8H1AzVoTxCioBGN9hGVwBHG5"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The new listings.",
            "x-description-fr": "Les nouvelles annonces.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "imported": {
                          "type": "integer"
                        },
                        "listing_ids": {
                          "type": "array",
                          "items": {
                            "type": "integer"
                          }
                        }
                      }
                    }
                  }
                },
                "example": {
                  "data": {
                    "imported": 2,
                    "listing_ids": [
                      6,
                      7
                    ]
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 24
      }
    },
    "/listings/import/preview": {
      "post": {
        "tags": [
          "Listing import"
        ],
        "operationId": "listingsImportPreview",
        "summary": "Preview a CSV import",
        "x-summary-fr": "Prévisualiser un import CSV",
        "description": "Step 1 of 2. Upload the filled-in CSV (multipart: `category` and `file`; .csv or .txt, at most 2 MB, comma- or semicolon-separated, one category per file, at most 500 rows). The columns `title`, `price` and `stock` are required. Nothing is saved: every row is checked with the same rules as the website form; valid rows come back in `rows`, the others in `errors` with their line number. If at least one row is valid you get a `token`, valid 30 minutes and only for your account, to confirm the import. Gift card categories cannot be imported (422 — they need codes; use POST /listings).\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Étape 1 sur 2. Envoyez le CSV rempli (multipart : `category` et `file` ; .csv ou .txt, 2 Mo maximum, séparé par des virgules ou des points-virgules, une catégorie par fichier, 500 lignes maximum). Les colonnes `title`, `price` et `stock` sont obligatoires. Rien n’est enregistré : chaque ligne est vérifiée avec les mêmes règles que le formulaire du site ; les lignes valides reviennent dans `rows`, les autres dans `errors` avec leur numéro de ligne. Si au moins une ligne est valide, vous recevez un `token`, valable 30 minutes et uniquement pour votre compte, pour confirmer l’import. Les catégories de cartes cadeaux ne peuvent pas être importées (422 — elles nécessitent des codes ; utilisez POST /listings).\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "category",
                  "file"
                ],
                "properties": {
                  "category": {
                    "type": "integer",
                    "description": "Category id of every row.",
                    "x-description-fr": "Identifiant de catégorie de toutes les lignes."
                  },
                  "file": {
                    "type": "string",
                    "contentMediaType": "text/csv",
                    "description": "The CSV file (.csv or .txt, max 2 MB).",
                    "x-description-fr": "Le fichier CSV (.csv ou .txt, 2 Mo maximum)."
                  }
                }
              }
            }
          },
          "x-sample-files": {
            "file": "listings.csv"
          },
          "x-sample-fields": {
            "category": 1
          }
        },
        "responses": {
          "200": {
            "description": "Checked rows, errors and the confirmation token.",
            "x-description-fr": "Lignes vérifiées, erreurs et jeton de confirmation.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ImportPreview"
                    }
                  }
                },
                "example": {
                  "data": {
                    "token": "ZNOq8GLdBWfObEHZSDTWRd3pw4vvBN6r",
                    "expires_at": "2026-10-27T11:00:42Z",
                    "category": {
                      "id": 1,
                      "slug": "accounts",
                      "name": "Accounts",
                      "game": {
                        "id": 1,
                        "slug": "valorant",
                        "name": "Valorant"
                      }
                    },
                    "total": 3,
                    "valid": 2,
                    "invalid": 1,
                    "rows": [
                      {
                        "line": 2,
                        "title": "Immortal 3 account EU, 40 skins",
                        "price_cents": 12000,
                        "currency": "USD",
                        "input_price": {
                          "amount": "120",
                          "currency": "USD"
                        },
                        "stock": 1,
                        "delivery_eta_minutes": 30,
                        "warranty_days": 7,
                        "status": "active"
                      },
                      {
                        "line": 4,
                        "title": "Diamond 2 account EU, 12 skins",
                        "price_cents": 4550,
                        "currency": "USD",
                        "input_price": {
                          "amount": "45.5",
                          "currency": "USD"
                        },
                        "stock": 1,
                        "delivery_eta_minutes": 30,
                        "warranty_days": 7,
                        "status": "active"
                      }
                    ],
                    "errors": [
                      {
                        "line": 3,
                        "messages": [
                          "The title field must be at least 10 characters."
                        ]
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 23
      }
    },
    "/listings/import/template": {
      "get": {
        "tags": [
          "Listing import"
        ],
        "operationId": "listingsImportTemplate",
        "summary": "Download the CSV template",
        "x-summary-fr": "Télécharger le modèle CSV",
        "description": "A CSV file for one category (`category` = category id): a header row with the base columns `title, description, price, currency, stock, delivery_minutes, warranty_days, status` followed by the category’s attribute keys, and one example row starting with `#` (rows starting with `#` are skipped on import). `currency` sets the currency of the example price (default: your account currency). The column list is also sent in the `X-Import-Columns` header. Gift card categories cannot be imported by CSV (they need codes): asking for their template returns 422 on `category`, like the preview.",
        "x-description-fr": "Un fichier CSV pour une catégorie (`category` = identifiant de catégorie) : une ligne d’en-tête avec les colonnes de base `title, description, price, currency, stock, delivery_minutes, warranty_days, status` suivies des clés d’attributs de la catégorie, et une ligne d’exemple commençant par `#` (les lignes commençant par `#` sont ignorées à l’import). `currency` fixe la devise du prix d’exemple (par défaut : la devise de votre compte). La liste des colonnes est aussi envoyée dans l’en-tête `X-Import-Columns`. Les catégories de cartes cadeaux ne peuvent pas être importées par CSV (elles nécessitent des codes) : demander leur modèle renvoie 422 sur `category`, comme la prévisualisation.",
        "x-scopes": [
          "listings:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:read"
            ]
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "category",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Category id.",
            "x-description-fr": "Identifiant de la catégorie."
          },
          {
            "in": "query",
            "name": "currency",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "USD",
                "IDR",
                "EUR",
                "GBP",
                "PHP",
                "BRL",
                "INR",
                "MYR"
              ]
            },
            "description": "Currency of the example price.",
            "x-description-fr": "Devise du prix d’exemple."
          }
        ],
        "x-sample-query": {
          "category": 1
        },
        "responses": {
          "200": {
            "description": "The CSV template (text/csv).",
            "x-description-fr": "Le modèle CSV (text/csv).",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Content-Disposition": {
                "description": "attachment; filename=\"<game>-<category>-template.csv\"",
                "schema": {
                  "type": "string"
                }
              },
              "X-Import-Columns": {
                "description": "The CSV columns, comma-separated.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string"
                },
                "example": "title,description,price,currency,stock,delivery_minutes,warranty_days,status,region,rank,agents_owned,skin_count,level,email_change,region_locked\n\"# Example: Valorant accounts (delete this row)\",\"What the buyer gets, in a sentence or two\",9.99,USD,1,30,0,active,EU,Iron,0,0,1,yes,yes\n"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 22
      }
    },
    "/listings/{id}": {
      "get": {
        "tags": [
          "Listings"
        ],
        "operationId": "listingsShow",
        "summary": "Get a listing",
        "x-summary-fr": "Obtenir une annonce",
        "description": "One of your listings. Another seller’s listing returns 404.",
        "x-description-fr": "Une de vos annonces. L’annonce d’un autre vendeur renvoie 404.",
        "x-scopes": [
          "listings:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "The listing.",
            "x-description-fr": "L’annonce.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Listing"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "title": "Immortal 2 account, 42 skins",
                    "description": null,
                    "status": "active",
                    "type": "account",
                    "game": {
                      "id": 1,
                      "slug": "valorant",
                      "name": "Valorant"
                    },
                    "category": {
                      "id": 1,
                      "slug": "accounts",
                      "name": "Accounts"
                    },
                    "price_cents": 11999,
                    "currency": "USD",
                    "input_price": {
                      "amount": "119.99",
                      "currency": "USD"
                    },
                    "stock": 3,
                    "min_quantity": 1,
                    "delivery_eta_minutes": 30,
                    "warranty_days": 7,
                    "instant_delivery": {
                      "enabled": false,
                      "units": 0
                    },
                    "topup": null,
                    "attributes": {
                      "region": "EU",
                      "rank": "Immortal",
                      "agents_owned": 23,
                      "skin_count": 42,
                      "level": 212,
                      "email_change": true
                    },
                    "images": [],
                    "url": "http://localhost:8000/listing/1",
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 14
      },
      "patch": {
        "tags": [
          "Listings"
        ],
        "operationId": "listingsUpdate",
        "summary": "Update a listing",
        "x-summary-fr": "Modifier une annonce",
        "description": "Changes only the fields you send; the result is validated with the same rules as creating. `attributes` are merged with the current ones (replaced if you change the category). `stock` of a listing with instant-delivery units follows its units — use the units endpoints instead. `delivery_units` are only applied together with `auto_delivery: true`, and then REPLACE all units (stock = units − units reserved by orders not delivered yet); this is also how you replace the codes of a gift card in one call. A removed listing returns 409.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Ne modifie que les champs envoyés ; le résultat est validé avec les mêmes règles que la création. Les `attributes` sont fusionnés avec les valeurs actuelles (remplacés si vous changez de catégorie). Le `stock` d’une annonce avec unités de livraison instantanée suit ses unités — utilisez plutôt les endpoints des unités. `delivery_units` n’est appliqué qu’avec `auto_delivery: true`, et REMPLACE alors toutes les unités (stock = unités − unités réservées par des commandes pas encore livrées) ; c’est aussi ainsi que l’on remplace d’un coup les codes d’une carte cadeau. Une annonce supprimée renvoie 409.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ListingUpdate"
              },
              "example": {
                "stock": 5,
                "price_cents": 10999
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated listing.",
            "x-description-fr": "L’annonce modifiée.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Listing"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "title": "Immortal 2 account, 42 skins",
                    "description": null,
                    "status": "active",
                    "type": "account",
                    "game": {
                      "id": 1,
                      "slug": "valorant",
                      "name": "Valorant"
                    },
                    "category": {
                      "id": 1,
                      "slug": "accounts",
                      "name": "Accounts"
                    },
                    "price_cents": 10999,
                    "currency": "USD",
                    "input_price": {
                      "amount": "109.99",
                      "currency": "USD"
                    },
                    "stock": 5,
                    "min_quantity": 1,
                    "delivery_eta_minutes": 30,
                    "warranty_days": 7,
                    "instant_delivery": {
                      "enabled": false,
                      "units": 0
                    },
                    "topup": null,
                    "attributes": {
                      "region": "EU",
                      "rank": "Immortal",
                      "agents_owned": 23,
                      "skin_count": 42,
                      "level": 212,
                      "email_change": true
                    },
                    "images": [],
                    "url": "http://localhost:8000/listing/1",
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 15
      },
      "delete": {
        "tags": [
          "Listings"
        ],
        "operationId": "listingsDestroy",
        "summary": "Delete a listing",
        "x-summary-fr": "Supprimer une annonce",
        "description": "A listing that was never ordered is deleted. A listing with orders is marked `removed` instead (hidden from the store, order history kept) and can no longer be changed.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Une annonce jamais commandée est supprimée. Une annonce ayant des commandes passe au statut `removed` (masquée de la boutique, historique des commandes conservé) et ne peut plus être modifiée.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "Deletion result.",
            "x-description-fr": "Résultat de la suppression.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "integer"
                        },
                        "deleted": {
                          "type": "boolean",
                          "description": "true when the row was deleted, false when it was marked removed."
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "deleted",
                            "removed"
                          ]
                        }
                      }
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "deleted": false,
                    "status": "removed"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 16
      }
    },
    "/listings/{id}/activate": {
      "post": {
        "tags": [
          "Listings"
        ],
        "operationId": "listingsActivate",
        "summary": "Activate a listing",
        "x-summary-fr": "Activer une annonce",
        "description": "Sets the status to `active` (visible to buyers). Safe to repeat. The same publish rules as the website apply to a listing that is not active yet: stock above 0, at least one code for a gift card, and every required attribute of its category filled. Otherwise → 409 `cannot_activate` with the reason in `message`. The same rules apply to `status: active` in PATCH /listings/bulk and POST /listings/bulk-update.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Passe le statut à `active` (visible des acheteurs). Peut être répété sans risque. Les mêmes règles de publication que sur le site s’appliquent à une annonce pas encore active : stock supérieur à 0, au moins un code pour une carte cadeau, et tous les attributs obligatoires de sa catégorie renseignés. Sinon → 409 `cannot_activate` avec la raison dans `message`. Les mêmes règles s’appliquent à `status: active` dans PATCH /listings/bulk et POST /listings/bulk-update.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "The active listing.",
            "x-description-fr": "L’annonce active.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Listing"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "title": "Immortal 2 account, 42 skins",
                    "description": null,
                    "status": "active",
                    "type": "account",
                    "game": {
                      "id": 1,
                      "slug": "valorant",
                      "name": "Valorant"
                    },
                    "category": {
                      "id": 1,
                      "slug": "accounts",
                      "name": "Accounts"
                    },
                    "price_cents": 10999,
                    "currency": "USD",
                    "input_price": {
                      "amount": "109.99",
                      "currency": "USD"
                    },
                    "stock": 5,
                    "min_quantity": 1,
                    "delivery_eta_minutes": 30,
                    "warranty_days": 7,
                    "instant_delivery": {
                      "enabled": false,
                      "units": 0
                    },
                    "topup": null,
                    "attributes": {
                      "region": "EU",
                      "rank": "Immortal",
                      "agents_owned": 23,
                      "skin_count": 42,
                      "level": 212,
                      "email_change": true
                    },
                    "images": [],
                    "url": "http://localhost:8000/listing/1",
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 18
      }
    },
    "/listings/{id}/competitors": {
      "get": {
        "tags": [
          "Listings"
        ],
        "operationId": "listingsCompetitors",
        "summary": "List competing offers",
        "x-summary-fr": "Lister les offres concurrentes",
        "description": "Offers from OTHER sellers for the same thing as one of your listings, cheapest first, with your position. “The same thing” = same game, type and category, and the same value for the key attributes your listing has (`region`, `server`, `platform`; for currency listings also `product`, `item_type`, `amount`, `amount_m`) — see `meta.matched_on`. Only offers a buyer can buy right now count: active, in stock, seller not on a break or suspended. Your own listings are never included.\n\n`meta.your_rank` (1 = cheapest) and `meta.lowest_price_cents` use your current price. The competitor list itself is cached for 60 seconds per listing (up to 100 offers); `limit` only shortens the response. Only public information is returned — the same as on listing and store pages.",
        "x-description-fr": "Les offres des AUTRES vendeurs pour le même produit que l’une de vos annonces, de la moins chère à la plus chère, avec votre position. « Le même produit » = même jeu, type et catégorie, et même valeur pour les attributs clés renseignés dans votre annonce (`region`, `server`, `platform` ; pour les devises aussi `product`, `item_type`, `amount`, `amount_m`) — voir `meta.matched_on`. Seules les offres achetables maintenant comptent : actives, en stock, vendeur ni en pause ni suspendu. Vos propres annonces ne sont jamais incluses.\n\n`meta.your_rank` (1 = la moins chère) et `meta.lowest_price_cents` utilisent votre prix actuel. La liste des concurrents est mise en cache 60 secondes par annonce (100 offres maximum) ; `limit` ne fait que raccourcir la réponse. Seules des informations publiques sont renvoyées — les mêmes que sur les pages d’annonce et de boutique.",
        "x-scopes": [
          "listings:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "description": "How many offers to return.",
            "x-description-fr": "Nombre d’offres à renvoyer."
          }
        ],
        "responses": {
          "200": {
            "description": "Competing offers and your rank.",
            "x-description-fr": "Offres concurrentes et votre position.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Competitor"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/CompetitorsMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "listing_id": 4,
                      "title": "Immortal 1 EU account, full access",
                      "price_cents": 10999,
                      "currency": "USD",
                      "stock": 2,
                      "delivery_eta_minutes": 15,
                      "instant_delivery": false,
                      "warranty_days": 3,
                      "url": "http://localhost:8000/listing/4",
                      "seller": {
                        "store_name": "Arif Games",
                        "store_slug": "arif-games",
                        "store_url": "http://localhost:8000/store/arif-games",
                        "rating": null,
                        "reviews": 0,
                        "completed_orders": 0,
                        "online": false
                      }
                    },
                    {
                      "listing_id": 5,
                      "title": "Radiant EU account, 120 skins, OG",
                      "price_cents": 24900,
                      "currency": "USD",
                      "stock": 1,
                      "delivery_eta_minutes": 60,
                      "instant_delivery": false,
                      "warranty_days": 14,
                      "url": "http://localhost:8000/listing/5",
                      "seller": {
                        "store_name": "Arif Games",
                        "store_slug": "arif-games",
                        "store_url": "http://localhost:8000/store/arif-games",
                        "rating": null,
                        "reviews": 0,
                        "completed_orders": 0,
                        "online": false
                      }
                    }
                  ],
                  "meta": {
                    "listing_id": 1,
                    "your_price_cents": 11999,
                    "currency": "USD",
                    "your_rank": 2,
                    "competitors": 2,
                    "lowest_price_cents": 10999,
                    "matched_on": {
                      "game_id": 1,
                      "type": "account",
                      "category_id": 1,
                      "attributes": {
                        "region": "EU"
                      }
                    },
                    "cached_for_seconds": 60
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 21
      }
    },
    "/listings/{id}/duplicate": {
      "post": {
        "tags": [
          "Listings"
        ],
        "operationId": "listingsDuplicate",
        "summary": "Duplicate a listing",
        "x-summary-fr": "Dupliquer une annonce",
        "description": "Creates a copy as a `draft`: same game, category, title, description, price, attributes, delivery time, warranty and top-up settings, with copies of the photos. Instant-delivery units are NOT copied (an account or a code can only be sold once): the copy of an instant-delivery listing starts with stock 0 and instant delivery off. Copies of `sold_out` or `removed` listings also start with stock 0. `meta.duplicated_from` is the source listing.\n\nRequires a verified seller account with a verified email address. Accepts an `Idempotency-Key` header: retrying with the same key returns the first response.",
        "x-description-fr": "Crée une copie en `draft` : même jeu, catégorie, titre, description, prix, attributs, délai de livraison, garantie et réglages de recharge, avec des copies des photos. Les unités de livraison instantanée ne sont PAS copiées (un compte ou un code ne se vend qu’une fois) : la copie d’une annonce à livraison instantanée commence avec un stock de 0 et la livraison instantanée désactivée. Les copies d’annonces `sold_out` ou `removed` commencent aussi avec un stock de 0. `meta.duplicated_from` est l’annonce d’origine.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée. Accepte un en-tête `Idempotency-Key` : une nouvelle tentative avec la même clé renvoie la première réponse.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": true,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "201": {
            "description": "The new draft.",
            "x-description-fr": "Le nouveau brouillon.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Listing"
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "duplicated_from": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 3,
                    "title": "Immortal 2 account, 42 skins",
                    "description": null,
                    "status": "draft",
                    "type": "account",
                    "game": {
                      "id": 1,
                      "slug": "valorant",
                      "name": "Valorant"
                    },
                    "category": {
                      "id": 1,
                      "slug": "accounts",
                      "name": "Accounts"
                    },
                    "price_cents": 11999,
                    "currency": "USD",
                    "input_price": {
                      "amount": "119.99",
                      "currency": "USD"
                    },
                    "stock": 3,
                    "min_quantity": 1,
                    "delivery_eta_minutes": 30,
                    "warranty_days": 7,
                    "instant_delivery": {
                      "enabled": false,
                      "units": 0
                    },
                    "topup": null,
                    "attributes": {
                      "region": "EU",
                      "rank": "Immortal",
                      "agents_owned": 23,
                      "skin_count": 42,
                      "level": 212,
                      "email_change": true
                    },
                    "images": [],
                    "url": "http://localhost:8000/listing/3",
                    "created_at": "2026-10-27T10:30:35Z",
                    "updated_at": "2026-10-27T10:30:35Z"
                  },
                  "meta": {
                    "duplicated_from": 1
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 19
      }
    },
    "/listings/{id}/images": {
      "get": {
        "tags": [
          "Listing images"
        ],
        "operationId": "listingsImagesIndex",
        "summary": "List a listing’s images",
        "x-summary-fr": "Lister les images d’une annonce",
        "description": "Images in display order; the first one is the cover.",
        "x-description-fr": "Images dans l’ordre d’affichage ; la première est la couverture.",
        "x-scopes": [
          "listings:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "The images.",
            "x-description-fr": "Les images.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ListingImage"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ImagesMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 2,
                      "url": "http://localhost:8000/storage/listings/1/9ku6x84XJkln4LqpWjX4rumxWai9zUeB.webp",
                      "thumb_url": "http://localhost:8000/storage/listings/1/9ku6x84XJkln4LqpWjX4rumxWai9zUeB.webp",
                      "width": 40,
                      "height": 40,
                      "position": 0
                    },
                    {
                      "id": 1,
                      "url": "http://localhost:8000/storage/listings/1/H6UsGnCLtB0acYwjwiGBiRKK6ZEy7a6D.webp",
                      "thumb_url": "http://localhost:8000/storage/listings/1/H6UsGnCLtB0acYwjwiGBiRKK6ZEy7a6D.webp",
                      "width": 40,
                      "height": 40,
                      "position": 1
                    }
                  ],
                  "meta": {
                    "max_images": 8,
                    "max_kb": 2048
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 25
      },
      "post": {
        "tags": [
          "Listing images"
        ],
        "operationId": "listingsImagesStore",
        "summary": "Upload images",
        "x-summary-fr": "Téléverser des images",
        "description": "Multipart upload of one or more files in `photos[]` (a single `photos` file also works). JPG, PNG or WebP, up to 8 images per listing, each at most `meta.max_kb` KB (5 MB, or less if the server’s upload limit is lower). Images are resized and metadata (EXIF) is removed. New images are added after the existing ones.\n\nRequires a verified seller account with a verified email address. Accepts an `Idempotency-Key` header: retrying with the same key returns the first response.",
        "x-description-fr": "Envoi multipart d’un ou plusieurs fichiers dans `photos[]` (un seul fichier `photos` fonctionne aussi). JPG, PNG ou WebP, 8 images maximum par annonce, chacune de `meta.max_kb` Ko au plus (5 Mo, ou moins si la limite du serveur est plus basse). Les images sont redimensionnées et leurs métadonnées (EXIF) supprimées. Les nouvelles images s’ajoutent après les existantes.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée. Accepte un en-tête `Idempotency-Key` : une nouvelle tentative avec la même clé renvoie la première réponse.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": true,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "photos[]"
                ],
                "properties": {
                  "photos[]": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "contentMediaType": "application/octet-stream"
                    },
                    "maxItems": 8,
                    "description": "Image files (JPG, PNG, WebP).",
                    "x-description-fr": "Fichiers image (JPG, PNG, WebP)."
                  }
                }
              }
            }
          },
          "x-sample-files": {
            "photos[]": "cover.jpg"
          }
        },
        "responses": {
          "201": {
            "description": "All images of the listing.",
            "x-description-fr": "Toutes les images de l’annonce.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ListingImage"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ImagesMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 1,
                      "url": "http://localhost:8000/storage/listings/1/H6UsGnCLtB0acYwjwiGBiRKK6ZEy7a6D.webp",
                      "thumb_url": "http://localhost:8000/storage/listings/1/H6UsGnCLtB0acYwjwiGBiRKK6ZEy7a6D.webp",
                      "width": 40,
                      "height": 40,
                      "position": 0
                    },
                    {
                      "id": 2,
                      "url": "http://localhost:8000/storage/listings/1/9ku6x84XJkln4LqpWjX4rumxWai9zUeB.webp",
                      "thumb_url": "http://localhost:8000/storage/listings/1/9ku6x84XJkln4LqpWjX4rumxWai9zUeB.webp",
                      "width": 40,
                      "height": 40,
                      "position": 1
                    }
                  ],
                  "meta": {
                    "max_images": 8,
                    "max_kb": 2048
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 26
      }
    },
    "/listings/{id}/images/order": {
      "put": {
        "tags": [
          "Listing images"
        ],
        "operationId": "listingsImagesOrder",
        "summary": "Reorder images",
        "x-summary-fr": "Réordonner les images",
        "description": "Send image ids in the order you want. The first becomes the cover.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Envoyez les identifiants des images dans l’ordre souhaité. La première devient la couverture.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "ids"
                ],
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "integer"
                    },
                    "minItems": 1,
                    "maxItems": 8,
                    "description": "Image ids of this listing, no duplicates. Unknown ids → 422.",
                    "x-description-fr": "Identifiants d’images de cette annonce, sans doublon. Identifiant inconnu → 422."
                  }
                }
              },
              "example": {
                "ids": [
                  2,
                  1
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The images in their new order.",
            "x-description-fr": "Les images dans leur nouvel ordre.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ListingImage"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ImagesMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 2,
                      "url": "http://localhost:8000/storage/listings/1/9ku6x84XJkln4LqpWjX4rumxWai9zUeB.webp",
                      "thumb_url": "http://localhost:8000/storage/listings/1/9ku6x84XJkln4LqpWjX4rumxWai9zUeB.webp",
                      "width": 40,
                      "height": 40,
                      "position": 0
                    },
                    {
                      "id": 1,
                      "url": "http://localhost:8000/storage/listings/1/H6UsGnCLtB0acYwjwiGBiRKK6ZEy7a6D.webp",
                      "thumb_url": "http://localhost:8000/storage/listings/1/H6UsGnCLtB0acYwjwiGBiRKK6ZEy7a6D.webp",
                      "width": 40,
                      "height": 40,
                      "position": 1
                    }
                  ],
                  "meta": {
                    "max_images": 8,
                    "max_kb": 2048
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 27
      }
    },
    "/listings/{id}/images/{imageId}": {
      "delete": {
        "tags": [
          "Listing images"
        ],
        "operationId": "listingsImagesDestroy",
        "summary": "Delete an image",
        "x-summary-fr": "Supprimer une image",
        "description": "Deletes one image and returns the remaining ones.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Supprime une image et renvoie les images restantes.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          },
          {
            "name": "imageId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Image id.",
            "x-description-fr": "Identifiant de l’image.",
            "example": 2
          }
        ],
        "responses": {
          "200": {
            "description": "The remaining images.",
            "x-description-fr": "Les images restantes.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ListingImage"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ImagesMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 2,
                      "url": "http://localhost:8000/storage/listings/1/9ku6x84XJkln4LqpWjX4rumxWai9zUeB.webp",
                      "thumb_url": "http://localhost:8000/storage/listings/1/9ku6x84XJkln4LqpWjX4rumxWai9zUeB.webp",
                      "width": 40,
                      "height": 40,
                      "position": 0
                    }
                  ],
                  "meta": {
                    "max_images": 8,
                    "max_kb": 2048
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 28
      }
    },
    "/listings/{id}/pause": {
      "post": {
        "tags": [
          "Listings"
        ],
        "operationId": "listingsPause",
        "summary": "Pause a listing",
        "x-summary-fr": "Mettre une annonce en pause",
        "description": "Sets the status to `paused` (hidden from buyers). Safe to repeat.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Passe le statut à `paused` (masquée aux acheteurs). Peut être répété sans risque.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "The paused listing.",
            "x-description-fr": "L’annonce en pause.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Listing"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "title": "Immortal 2 account, 42 skins",
                    "description": null,
                    "status": "paused",
                    "type": "account",
                    "game": {
                      "id": 1,
                      "slug": "valorant",
                      "name": "Valorant"
                    },
                    "category": {
                      "id": 1,
                      "slug": "accounts",
                      "name": "Accounts"
                    },
                    "price_cents": 10999,
                    "currency": "USD",
                    "input_price": {
                      "amount": "109.99",
                      "currency": "USD"
                    },
                    "stock": 5,
                    "min_quantity": 1,
                    "delivery_eta_minutes": 30,
                    "warranty_days": 7,
                    "instant_delivery": {
                      "enabled": false,
                      "units": 0
                    },
                    "topup": null,
                    "attributes": {
                      "region": "EU",
                      "rank": "Immortal",
                      "agents_owned": 23,
                      "skin_count": 42,
                      "level": 212,
                      "email_change": true
                    },
                    "images": [],
                    "url": "http://localhost:8000/listing/1",
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 17
      }
    },
    "/listings/{id}/units": {
      "get": {
        "tags": [
          "Instant delivery units"
        ],
        "operationId": "listingsUnitsIndex",
        "summary": "List delivery units",
        "x-summary-fr": "Lister les unités de livraison",
        "description": "Units are stored encrypted and never returned in full: you get a stable `id` and a masked `preview` (passwords always ••••••). `meta.reserved` = units held by orders that are not delivered yet.",
        "x-description-fr": "Les unités sont chiffrées et ne sont jamais renvoyées en entier : vous obtenez un `id` stable et un `preview` masqué (mots de passe toujours ••••••). `meta.reserved` = unités réservées par des commandes pas encore livrées.",
        "x-scopes": [
          "listings:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "The units.",
            "x-description-fr": "Les unités.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DeliveryUnit"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/UnitsMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "bc137614c70229ef",
                      "preview": {
                        "username": "ga•••ne",
                        "password": "••••••",
                        "email": "ga•••ne@mail.com"
                      }
                    },
                    {
                      "id": "89a8a8a11863054a",
                      "preview": {
                        "username": "pl•••wo",
                        "password": "••••••"
                      }
                    }
                  ],
                  "meta": {
                    "listing_id": 1,
                    "instant_delivery": true,
                    "count": 2,
                    "reserved": 0,
                    "stock": 2,
                    "max_units": 200
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 29
      },
      "post": {
        "tags": [
          "Instant delivery units"
        ],
        "operationId": "listingsUnitsStore",
        "summary": "Add delivery units",
        "x-summary-fr": "Ajouter des unités de livraison",
        "description": "Adds units and turns instant delivery on. Only for `account` and `item` listings. Account units need `username` and `password`; item units keep only `note` (e.g. a code). Identical units are skipped (`meta.skipped_duplicates`). At most 200 units per listing. Stock is recalculated: units − reserved. A listing delivered by a top-up supplier returns 409.\n\nRequires a verified seller account with a verified email address. Accepts an `Idempotency-Key` header: retrying with the same key returns the first response.",
        "x-description-fr": "Ajoute des unités et active la livraison instantanée. Uniquement pour les annonces `account` et `item`. Les unités de compte nécessitent `username` et `password` ; les unités d’objet ne conservent que `note` (par ex. un code). Les unités identiques sont ignorées (`meta.skipped_duplicates`). 200 unités maximum par annonce. Le stock est recalculé : unités − réservées. Une annonce livrée par un fournisseur de recharge renvoie 409.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée. Accepte un en-tête `Idempotency-Key` : une nouvelle tentative avec la même clé renvoie la première réponse.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": true,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "units"
                ],
                "properties": {
                  "units": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "$ref": "#/components/schemas/DeliveryUnitInput"
                    },
                    "description": "Units to add.",
                    "x-description-fr": "Unités à ajouter."
                  }
                }
              },
              "example": {
                "units": [
                  {
                    "username": "gamer_one",
                    "password": "hunter22",
                    "email": "gamer.one@mail.com"
                  },
                  {
                    "username": "player_two",
                    "password": "p4ssw0rd"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "All units, with `added` and `skipped_duplicates` in meta.",
            "x-description-fr": "Toutes les unités, avec `added` et `skipped_duplicates` dans meta.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DeliveryUnit"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/UnitsMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "bc137614c70229ef",
                      "preview": {
                        "username": "ga•••ne",
                        "password": "••••••",
                        "email": "ga•••ne@mail.com"
                      }
                    },
                    {
                      "id": "89a8a8a11863054a",
                      "preview": {
                        "username": "pl•••wo",
                        "password": "••••••"
                      }
                    }
                  ],
                  "meta": {
                    "listing_id": 1,
                    "instant_delivery": true,
                    "count": 2,
                    "reserved": 0,
                    "stock": 2,
                    "max_units": 200,
                    "added": 2,
                    "skipped_duplicates": 0
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 30
      },
      "delete": {
        "tags": [
          "Instant delivery units"
        ],
        "operationId": "listingsUnitsDestroy",
        "summary": "Remove delivery units",
        "x-summary-fr": "Retirer des unités de livraison",
        "description": "Removes the units in `ids`, or all of them with `{\"all\": true}`. You must keep at least as many units as are reserved by pending orders (409 otherwise). Removing every unit turns instant delivery off.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Retire les unités listées dans `ids`, ou toutes avec `{\"all\": true}`. Vous devez conserver au moins autant d’unités que celles réservées par des commandes en attente (sinon 409). Retirer toutes les unités désactive la livraison instantanée.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "maxLength": 64
                    },
                    "maxItems": 200,
                    "description": "Unit ids to remove (required unless `all`).",
                    "x-description-fr": "Identifiants des unités à retirer (obligatoire sauf avec `all`)."
                  },
                  "all": {
                    "type": "boolean",
                    "description": "true to remove every unit.",
                    "x-description-fr": "true pour retirer toutes les unités."
                  }
                }
              },
              "example": {
                "ids": [
                  "bc137614c70229ef"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The remaining units.",
            "x-description-fr": "Les unités restantes.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DeliveryUnit"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/UnitsMeta"
                    }
                  }
                },
                "example": {
                  "data": [],
                  "meta": {
                    "listing_id": 1,
                    "instant_delivery": false,
                    "count": 0,
                    "reserved": 0,
                    "stock": 0,
                    "max_units": 200
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 32
      }
    },
    "/listings/{id}/units/{unitId}": {
      "patch": {
        "tags": [
          "Instant delivery units"
        ],
        "operationId": "listingsUnitsUpdate",
        "summary": "Edit one delivery unit",
        "x-summary-fr": "Modifier une unité de livraison",
        "description": "Changes the fields you send of one unit and keeps the others: `username`, `password`, `email` and `note` for account listings, `note` for item listings, `code`, `pin` and `expires_at` for gift cards (same rules as adding: `expires_at` is YYYY-MM-DD and not in the past). `null` or \"\" clears an optional field. A field that does not apply to the listing’s type → 422 on that field (it is never silently ignored). A unit’s id is derived from its content, so it changes: the response has the full list plus `meta.unit` with `previous_id`, the new `id` and the masked preview (codes, PINs and passwords are never returned in clear). Same content as another unit of the listing, or a gift card code another unit already has (case-insensitive) → 409; a unit left empty or a gift card without `code` → 422 (delete it instead).\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Modifie les champs envoyés d’une unité et conserve les autres : `username`, `password`, `email` et `note` pour les annonces de compte, `note` pour les annonces d’objet, `code`, `pin` et `expires_at` pour les cartes cadeaux (mêmes règles qu’à l’ajout : `expires_at` au format AAAA-MM-JJ et pas dans le passé). `null` ou \"\" efface un champ facultatif. Un champ qui ne s’applique pas au type de l’annonce → 422 sur ce champ (il n’est jamais ignoré en silence). L’identifiant d’une unité dépend de son contenu, il change donc : la réponse contient la liste complète et `meta.unit` avec `previous_id`, le nouvel `id` et l’aperçu masqué (codes, PIN et mots de passe ne sont jamais renvoyés en clair). Même contenu qu’une autre unité de l’annonce, ou code de carte cadeau déjà présent dans une autre unité (sans tenir compte de la casse) → 409 ; unité vide ou carte cadeau sans `code` → 422 (supprimez-la plutôt).\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          },
          {
            "name": "unitId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Unit id from GET /listings/{id}/units (16 hex characters).",
            "x-description-fr": "Identifiant d’unité renvoyé par GET /listings/{id}/units (16 caractères hexadécimaux).",
            "example": "bc137614c70229ef"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeliveryUnitInput"
              },
              "example": {
                "password": "n3w-p4ss",
                "email": "player.two@mail.com"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "All units, with the edited one in meta.unit.",
            "x-description-fr": "Toutes les unités, avec l’unité modifiée dans meta.unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DeliveryUnit"
                      }
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/UnitsMeta"
                        },
                        {
                          "type": "object",
                          "properties": {
                            "unit": {
                              "type": "object",
                              "properties": {
                                "previous_id": {
                                  "type": "string"
                                },
                                "id": {
                                  "type": "string",
                                  "description": "New id of the edited unit.",
                                  "x-description-fr": "Nouvel identifiant de l’unité modifiée."
                                },
                                "preview": {
                                  "type": "object",
                                  "additionalProperties": {
                                    "type": "string"
                                  }
                                }
                              }
                            }
                          }
                        }
                      ]
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "bc137614c70229ef",
                      "preview": {
                        "username": "ga•••ne",
                        "password": "••••••",
                        "email": "ga•••ne@mail.com"
                      }
                    },
                    {
                      "id": "46be555ac7272e57",
                      "preview": {
                        "username": "pl•••wo",
                        "password": "••••••",
                        "email": "pl•••wo@mail.com"
                      }
                    }
                  ],
                  "meta": {
                    "listing_id": 2,
                    "instant_delivery": true,
                    "count": 2,
                    "reserved": 0,
                    "stock": 2,
                    "max_units": 200,
                    "unit": {
                      "previous_id": "89a8a8a11863054a",
                      "id": "46be555ac7272e57",
                      "preview": {
                        "username": "pl•••wo",
                        "password": "••••••",
                        "email": "pl•••wo@mail.com"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 31
      },
      "delete": {
        "tags": [
          "Instant delivery units"
        ],
        "operationId": "listingsUnitsDestroyOne",
        "summary": "Remove one delivery unit",
        "x-summary-fr": "Retirer une unité de livraison",
        "description": "Removes one unit by id. Same reservation rule as the bulk removal.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Retire une unité par son identifiant. Même règle de réservation que le retrait groupé.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "listings:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "listings:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Listing id.",
            "x-description-fr": "Identifiant de l’annonce.",
            "example": 1
          },
          {
            "name": "unitId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Unit id from GET /listings/{id}/units (16 hex characters).",
            "x-description-fr": "Identifiant d’unité renvoyé par GET /listings/{id}/units (16 caractères hexadécimaux).",
            "example": "bc137614c70229ef"
          }
        ],
        "responses": {
          "200": {
            "description": "The remaining units.",
            "x-description-fr": "Les unités restantes.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DeliveryUnit"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/UnitsMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "89a8a8a11863054a",
                      "preview": {
                        "username": "pl•••wo",
                        "password": "••••••"
                      }
                    }
                  ],
                  "meta": {
                    "listing_id": 1,
                    "instant_delivery": true,
                    "count": 1,
                    "reserved": 0,
                    "stock": 1,
                    "max_units": 200
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 33
      }
    },
    "/me": {
      "get": {
        "tags": [
          "Account"
        ],
        "operationId": "me",
        "summary": "Get the token owner",
        "x-summary-fr": "Obtenir le propriétaire du jeton",
        "description": "Who owns this token, whether they are a verified seller, and the token’s scopes and expiry. Works with any scope — use it to test a new token.",
        "x-description-fr": "Le propriétaire du jeton, s’il est vendeur vérifié, ainsi que les scopes et l’expiration du jeton. Fonctionne avec n’importe quel scope — idéal pour tester un nouveau jeton.",
        "x-scopes": [],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "The token owner.",
            "x-description-fr": "Le propriétaire du jeton.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Me"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "name": "Budi",
                    "is_seller": true,
                    "store": {
                      "name": "Budi Store",
                      "slug": "budi-store"
                    },
                    "token": {
                      "name": "Sync bot",
                      "prefix": "go_8fK2xQaZ",
                      "scopes": [
                        "catalog:read",
                        "listings:read",
                        "listings:write",
                        "orders:read",
                        "orders:write",
                        "messages:read",
                        "messages:write",
                        "wallet:read",
                        "webhooks:write",
                        "disputes:read",
                        "disputes:write",
                        "notifications:read",
                        "account:read",
                        "account:write"
                      ],
                      "expires_at": null
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 0
      }
    },
    "/notifications": {
      "get": {
        "tags": [
          "Notifications"
        ],
        "operationId": "notificationsIndex",
        "summary": "List notifications",
        "x-summary-fr": "Lister les notifications",
        "description": "Your notification bell, newest first: order events (`id` starting with `e`, `type` = the order’s new status, e.g. paid, delivered, disputed) and support ticket replies (`id` starting with `t`, `type: support`). `unread=1` returns only unread ones. `meta.unread_count` is the number on the bell. Not paginated: use `limit` (1–100, default 25) for the most recent items.",
        "x-description-fr": "Votre cloche de notifications, les plus récentes en premier : événements de commande (`id` commençant par `e`, `type` = le nouveau statut de la commande, par ex. paid, delivered, disputed) et réponses aux tickets de support (`id` commençant par `t`, `type: support`). `unread=1` ne renvoie que les non lues. `meta.unread_count` est le nombre affiché sur la cloche. Non paginé : utilisez `limit` (1 à 100, 25 par défaut) pour les éléments les plus récents.",
        "x-scopes": [
          "notifications:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "notifications:read"
            ]
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "unread",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            },
            "description": "Only unread notifications.",
            "x-description-fr": "Uniquement les notifications non lues."
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            },
            "description": "How many to return.",
            "x-description-fr": "Nombre d’éléments à renvoyer."
          }
        ],
        "x-sample-query": {
          "unread": 1
        },
        "responses": {
          "200": {
            "description": "Notifications.",
            "x-description-fr": "Notifications.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Notification"
                      }
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "limit": {
                          "type": "integer"
                        },
                        "unread_count": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "e25",
                      "type": "disputed",
                      "title": "Delivery details updated",
                      "body": "The seller corrected the delivery details — check them again.",
                      "item": "Immortal 2 account, 42 skins",
                      "counterparty": {
                        "role": "seller",
                        "name": "Budi Store"
                      },
                      "order_number": "48297320",
                      "ticket_number": null,
                      "amount_cents": 11999,
                      "currency": "USD",
                      "url": "http://localhost:8000/orders/5",
                      "unread": true,
                      "created_at": "2026-10-27T13:31:56Z"
                    },
                    {
                      "id": "e23",
                      "type": "delivered",
                      "title": "Order delivered",
                      "body": "Delivered — check it, then confirm.",
                      "item": "Immortal 2 account, 42 skins",
                      "counterparty": {
                        "role": "seller",
                        "name": "Budi Store"
                      },
                      "order_number": "48297320",
                      "ticket_number": null,
                      "amount_cents": 11999,
                      "currency": "USD",
                      "url": "http://localhost:8000/orders/5",
                      "unread": true,
                      "created_at": "2026-10-27T13:16:56Z"
                    },
                    {
                      "id": "e22",
                      "type": "processing",
                      "title": "Order in progress",
                      "body": "The seller started working on it.",
                      "item": "Immortal 2 account, 42 skins",
                      "counterparty": {
                        "role": "seller",
                        "name": "Budi Store"
                      },
                      "order_number": "48297320",
                      "ticket_number": null,
                      "amount_cents": 11999,
                      "currency": "USD",
                      "url": "http://localhost:8000/orders/5",
                      "unread": true,
                      "created_at": "2026-10-27T13:16:56Z"
                    }
                  ],
                  "meta": {
                    "limit": 3,
                    "unread_count": 17
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 56
      }
    },
    "/notifications/read": {
      "post": {
        "tags": [
          "Notifications"
        ],
        "operationId": "notificationsRead",
        "summary": "Mark notifications as read",
        "x-summary-fr": "Marquer des notifications comme lues",
        "description": "Without a body: marks everything as read, like “Mark all as read” on the website. With `ids` (up to 100 order-event ids, starting with `e`): marks only those; ids that are not yours are ignored and `marked` counts the ones that were. Support replies cannot be marked one by one. Returns the new `unread_count`.",
        "x-description-fr": "Sans contenu : marque tout comme lu, comme « Tout marquer comme lu » sur le site. Avec `ids` (100 identifiants d’événements de commande maximum, commençant par `e`) : ne marque que ceux-là ; les identifiants qui ne vous appartiennent pas sont ignorés et `marked` compte ceux qui vous appartenaient. Les réponses du support ne peuvent pas être marquées une par une. Renvoie le nouveau `unread_count`.",
        "x-scopes": [
          "notifications:write"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "notifications:write"
            ]
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "maxItems": 100,
                    "items": {
                      "type": "string",
                      "pattern": "^e\\d+$"
                    },
                    "description": "Order-event notification ids. Leave out to mark everything.",
                    "x-description-fr": "Identifiants de notifications d’événements de commande. Omettez-les pour tout marquer."
                  }
                }
              },
              "example": {
                "ids": [
                  "e22"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The new unread count.",
            "x-description-fr": "Le nouveau nombre de non lues.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "all": {
                          "type": "boolean",
                          "description": "true when everything was marked.",
                          "x-description-fr": "true quand tout a été marqué."
                        },
                        "marked": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many ids were marked (null when all).",
                          "x-description-fr": "Nombre d’identifiants marqués (null quand tout est marqué)."
                        },
                        "unread_count": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                },
                "example": {
                  "data": {
                    "all": false,
                    "marked": 1,
                    "unread_count": 16
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 57
      }
    },
    "/orders": {
      "get": {
        "tags": [
          "Orders"
        ],
        "operationId": "ordersIndex",
        "summary": "List orders",
        "x-summary-fr": "Lister les commandes",
        "description": "Your sales by default; `role=buyer` lists your purchases. Seller view includes `buyer`, `buyer_note` and `topup_fields`; buyer view includes `seller`. Lists never include delivered credentials.",
        "x-description-fr": "Vos ventes par défaut ; `role=buyer` liste vos achats. La vue vendeur inclut `buyer`, `buyer_note` et `topup_fields` ; la vue acheteur inclut `seller`. Les listes n’incluent jamais les identifiants livrés.",
        "x-scopes": [
          "orders:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "orders:read"
            ]
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "role",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "seller",
                "buyer"
              ],
              "default": "seller"
            },
            "description": "Whose side: your sales (seller) or your purchases (buyer).",
            "x-description-fr": "Quel côté : vos ventes (seller) ou vos achats (buyer)."
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "One status or several separated by commas: pending_payment, paid, processing, delivered, completed, disputed, refunded, expired, cancelled.",
            "x-description-fr": "Un statut ou plusieurs séparés par des virgules : pending_payment, paid, processing, delivered, completed, disputed, refunded, expired, cancelled."
          },
          {
            "in": "query",
            "name": "created_since",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Only orders created at or after this time.",
            "x-description-fr": "Uniquement les commandes créées à partir de cette date."
          },
          {
            "in": "query",
            "name": "updated_since",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Only orders updated at or after this time.",
            "x-description-fr": "Uniquement les commandes modifiées à partir de cette date."
          },
          {
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "created_at",
                "-created_at",
                "updated_at",
                "-updated_at"
              ],
              "default": "-created_at"
            },
            "description": "Sort order; `-` = descending.",
            "x-description-fr": "Ordre de tri ; `-` = décroissant."
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            },
            "description": "Items per page, 1–100.",
            "x-description-fr": "Éléments par page, de 1 à 100."
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Page number.",
            "x-description-fr": "Numéro de page."
          }
        ],
        "x-sample-query": {
          "status": "paid,processing"
        },
        "responses": {
          "200": {
            "description": "A page of orders.",
            "x-description-fr": "Une page de commandes.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "links",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Order"
                      }
                    },
                    "links": {
                      "$ref": "#/components/schemas/PaginationLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 1,
                      "number": "48291735",
                      "status": "paid",
                      "listing": {
                        "id": 1,
                        "title": "Immortal 2 account, 42 skins",
                        "type": "account",
                        "game": "Valorant"
                      },
                      "quantity": 1,
                      "unit_price_cents": 9999,
                      "subtotal_cents": 9999,
                      "buyer_fee_cents": 0,
                      "discount_cents": 0,
                      "total_paid_cents": 9999,
                      "platform_fee_cents": 999,
                      "fee_percent": 10,
                      "seller_amount_cents": 9000,
                      "currency": "USD",
                      "buyer": {
                        "id": 2,
                        "name": "Rina"
                      },
                      "buyer_note": null,
                      "topup_fields": null,
                      "delivery": null,
                      "dispute": null,
                      "payment_due_at": "2026-10-26T16:54:50Z",
                      "paid_at": "2026-10-26T15:54:50Z",
                      "delivery_due_at": "2026-10-26T16:24:50Z",
                      "delivered_at": null,
                      "auto_release_at": null,
                      "completed_at": null,
                      "warranty_ends_at": null,
                      "created_at": "2026-10-26T15:54:50Z",
                      "updated_at": "2026-10-26T15:54:50Z"
                    }
                  ],
                  "links": {
                    "first": "http://localhost:8000/api/v1/orders?status=paid&page=1",
                    "last": "http://localhost:8000/api/v1/orders?status=paid&page=1",
                    "prev": null,
                    "next": null
                  },
                  "meta": {
                    "current_page": 1,
                    "from": 1,
                    "last_page": 1,
                    "links": [
                      {
                        "url": null,
                        "label": "&laquo; Previous",
                        "page": null,
                        "active": false
                      },
                      {
                        "url": "http://localhost:8000/api/v1/orders?status=paid&page=1",
                        "label": "1",
                        "page": 1,
                        "active": true
                      },
                      {
                        "url": null,
                        "label": "Next &raquo;",
                        "page": null,
                        "active": false
                      }
                    ],
                    "path": "http://localhost:8000/api/v1/orders",
                    "per_page": 25,
                    "to": 1,
                    "total": 1
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 34
      }
    },
    "/orders/{order}": {
      "get": {
        "tags": [
          "Orders"
        ],
        "operationId": "ordersShow",
        "summary": "Get an order",
        "x-summary-fr": "Obtenir une commande",
        "description": "One order where you are the seller or the buyer. As the buyer, `delivery.credentials` contains what the seller delivered.",
        "x-description-fr": "Une commande dont vous êtes le vendeur ou l’acheteur. En tant qu’acheteur, `delivery.credentials` contient ce que le vendeur a livré.",
        "x-scopes": [
          "orders:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "orders:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "order",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Order id, or the 8-digit order number shown as #48291735 (the # is optional).",
            "x-description-fr": "Identifiant de la commande, ou numéro de commande à 8 chiffres affiché #48291735 (le # est facultatif).",
            "example": "48291735"
          }
        ],
        "responses": {
          "200": {
            "description": "The order.",
            "x-description-fr": "La commande.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Order"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "number": "48291735",
                    "status": "paid",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 9999,
                    "subtotal_cents": 9999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 9999,
                    "platform_fee_cents": 999,
                    "fee_percent": 10,
                    "seller_amount_cents": 9000,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": null,
                    "dispute": null,
                    "payment_due_at": "2026-10-26T16:54:50Z",
                    "paid_at": "2026-10-26T15:54:50Z",
                    "delivery_due_at": "2026-10-26T16:24:50Z",
                    "delivered_at": null,
                    "auto_release_at": null,
                    "completed_at": null,
                    "warranty_ends_at": null,
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 35
      }
    },
    "/orders/{order}/cancel": {
      "post": {
        "tags": [
          "Orders"
        ],
        "operationId": "ordersCancel",
        "summary": "Cancel and refund an order",
        "x-summary-fr": "Annuler et rembourser une commande",
        "description": "Cancels a `paid` or `processing` order that has not been delivered, with a full refund to the buyer through escrow: the order becomes `refunded`. `reason` (5–500 characters) is shown to the buyer. `restock: true` puts the quantity back into the listing’s stock (default false — useful when you cancel because the stock was wrong). Delivered, unpaid or finished orders, and orders whose automatic top-up is already running, return 409.\n\nRequires a verified seller account with a verified email address. Accepts an `Idempotency-Key` header: retrying with the same key returns the first response.",
        "x-description-fr": "Annule une commande `paid` ou `processing` pas encore livrée, avec remboursement intégral de l’acheteur via le séquestre : la commande passe à `refunded`. `reason` (5 à 500 caractères) est affiché à l’acheteur. `restock: true` remet la quantité dans le stock de l’annonce (false par défaut — utile quand vous annulez parce que le stock était faux). Les commandes livrées, non payées ou terminées, et celles dont la recharge automatique est déjà en cours, renvoient 409.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée. Accepte un en-tête `Idempotency-Key` : une nouvelle tentative avec la même clé renvoie la première réponse.",
        "x-scopes": [
          "orders:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": true,
        "security": [
          {
            "bearerAuth": [
              "orders:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "order",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Order id, or the 8-digit order number shown as #48291735 (the # is optional).",
            "x-description-fr": "Identifiant de la commande, ou numéro de commande à 8 chiffres affiché #48291735 (le # est facultatif).",
            "example": "48291735"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "reason"
                ],
                "properties": {
                  "reason": {
                    "type": "string",
                    "minLength": 5,
                    "maxLength": 500,
                    "description": "Why you cancel; the buyer sees it.",
                    "x-description-fr": "Pourquoi vous annulez ; l’acheteur le voit."
                  },
                  "restock": {
                    "type": "boolean",
                    "default": false,
                    "description": "Put the quantity back into stock.",
                    "x-description-fr": "Remettre la quantité en stock."
                  }
                }
              },
              "example": {
                "reason": "Out of stock, sorry — refunded in full.",
                "restock": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The refunded order.",
            "x-description-fr": "La commande remboursée.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Order"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "number": "48293969",
                    "status": "refunded",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 11999,
                    "subtotal_cents": 11999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 11999,
                    "platform_fee_cents": 1199,
                    "fee_percent": 10,
                    "seller_amount_cents": 10800,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": null,
                    "dispute": null,
                    "payment_due_at": "2026-10-27T11:31:56Z",
                    "paid_at": "2026-10-27T10:31:56Z",
                    "delivery_due_at": "2026-10-27T11:01:56Z",
                    "delivered_at": null,
                    "auto_release_at": null,
                    "completed_at": null,
                    "warranty_ends_at": null,
                    "created_at": "2026-10-27T10:31:56Z",
                    "updated_at": "2026-10-27T10:33:56Z"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 38
      }
    },
    "/orders/{order}/deliver": {
      "post": {
        "tags": [
          "Orders"
        ],
        "operationId": "ordersDeliver",
        "summary": "Deliver an order",
        "x-summary-fr": "Livrer une commande",
        "description": "Delivers a `paid` or `processing` order: credentials and/or a note go to the buyer (stored encrypted), plus optional proof screenshots (send multipart for those). A `paid` order is started automatically in the same transaction (two events, both by you: paid → processing → delivered), so calling POST /orders/{order}/start first is optional. An order held for a risk check cannot be delivered yet → 409. The buyer then has until `auto_release_at` to confirm or open a dispute. If the order is already delivered, nothing is delivered twice and `meta.already_delivered` is true. To fix details after delivery, use PATCH /orders/{order}/delivery.\n\nRequires a verified seller account with a verified email address. Accepts an `Idempotency-Key` header: retrying with the same key returns the first response.",
        "x-description-fr": "Livre une commande `paid` ou `processing` : les identifiants et/ou une note sont transmis à l’acheteur (stockés chiffrés), ainsi que des captures d’écran de preuve facultatives (envoyez-les en multipart). Une commande `paid` est démarrée automatiquement dans la même transaction (deux événements, tous deux à votre nom : paid → processing → delivered) ; appeler d’abord POST /orders/{order}/start est donc facultatif. Une commande retenue pour une vérification de risque ne peut pas encore être livrée → 409. L’acheteur a ensuite jusqu’à `auto_release_at` pour confirmer ou ouvrir un litige. Si la commande est déjà livrée, rien n’est livré deux fois et `meta.already_delivered` vaut true. Pour corriger les informations après la livraison, utilisez PATCH /orders/{order}/delivery.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée. Accepte un en-tête `Idempotency-Key` : une nouvelle tentative avec la même clé renvoie la première réponse.",
        "x-scopes": [
          "orders:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": true,
        "security": [
          {
            "bearerAuth": [
              "orders:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "order",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Order id, or the 8-digit order number shown as #48291735 (the # is optional).",
            "x-description-fr": "Identifiant de la commande, ou numéro de commande à 8 chiffres affiché #48291735 (le # est facultatif).",
            "example": "48291735"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeliveryInput"
              },
              "example": {
                "username": "gamer_one",
                "password": "hunter22",
                "note": "Change the password after login."
              }
            },
            "multipart/form-data": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/DeliveryInput"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "proofs[]": {
                        "type": "array",
                        "maxItems": 5,
                        "items": {
                          "type": "string",
                          "contentMediaType": "application/octet-stream"
                        },
                        "description": "Proof screenshots: JPG, PNG or WebP, max 5 files, 4 MB each.",
                        "x-description-fr": "Captures de preuve : JPG, PNG ou WebP, 5 fichiers maximum, 4 Mo chacun."
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The delivered order.",
            "x-description-fr": "La commande livrée.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Order"
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "already_delivered": {
                          "type": "boolean"
                        }
                      }
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "number": "48291735",
                    "status": "delivered",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 9999,
                    "subtotal_cents": 9999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 9999,
                    "platform_fee_cents": 999,
                    "fee_percent": 10,
                    "seller_amount_cents": 9000,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": {
                      "delivered_at": "2026-10-26T15:54:50Z",
                      "has_credentials": true,
                      "proof_count": 0
                    },
                    "dispute": null,
                    "payment_due_at": "2026-10-26T16:54:50Z",
                    "paid_at": "2026-10-26T15:54:50Z",
                    "delivery_due_at": "2026-10-26T16:24:50Z",
                    "delivered_at": "2026-10-26T15:54:50Z",
                    "auto_release_at": "2026-10-29T15:54:50Z",
                    "completed_at": null,
                    "warranty_ends_at": null,
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  },
                  "meta": {
                    "already_delivered": false
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 37
      }
    },
    "/orders/{order}/delivery": {
      "patch": {
        "tags": [
          "Orders"
        ],
        "operationId": "ordersDeliveryUpdate",
        "summary": "Correct the delivery",
        "x-summary-fr": "Corriger la livraison",
        "description": "Replaces the delivered details while the order is `delivered`, `disputed`, or completed and still under warranty. Send `reason` (5–500 characters, shown to the buyer) and the fields that change — fields you leave out keep their previous value; at least one field or one proof is required. Proof screenshots go in `proofs[]` (multipart; if your client cannot send a multipart PATCH, send a POST with `_method=PATCH`).\n\nThe previous delivery is kept as history (`meta.deliveries`, newest last), the buyer is notified and sees the new details, and `auto_release_at` starts again. Not delivered yet, or past the warranty → 409.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Remplace les informations livrées tant que la commande est `delivered`, `disputed`, ou terminée et encore sous garantie. Envoyez `reason` (5 à 500 caractères, affiché à l’acheteur) et les champs qui changent — les champs omis gardent leur valeur précédente ; au moins un champ ou une preuve est requis. Les captures de preuve vont dans `proofs[]` (multipart ; si votre client ne sait pas envoyer un PATCH multipart, envoyez un POST avec `_method=PATCH`).\n\nLa livraison précédente est conservée dans l’historique (`meta.deliveries`, la plus récente en dernier), l’acheteur est prévenu et voit les nouvelles informations, et `auto_release_at` repart de zéro. Pas encore livrée, ou garantie expirée → 409.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "orders:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "orders:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "order",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Order id, or the 8-digit order number shown as #48291735 (the # is optional).",
            "x-description-fr": "Identifiant de la commande, ou numéro de commande à 8 chiffres affiché #48291735 (le # est facultatif).",
            "example": "48291735"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "type": "object",
                    "required": [
                      "reason"
                    ],
                    "properties": {
                      "reason": {
                        "type": "string",
                        "minLength": 5,
                        "maxLength": 500,
                        "description": "What you corrected; the buyer sees it.",
                        "x-description-fr": "Ce que vous avez corrigé ; l’acheteur le voit."
                      }
                    }
                  },
                  {
                    "$ref": "#/components/schemas/DeliveryInput"
                  }
                ]
              },
              "example": {
                "password": "hunter23",
                "reason": "The password had a typo — fixed."
              }
            },
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "proofs[]": {
                    "type": "array",
                    "maxItems": 5,
                    "items": {
                      "type": "string",
                      "contentMediaType": "application/octet-stream"
                    },
                    "description": "Proof screenshots: JPG, PNG or WebP, max 5 files, 4 MB each.",
                    "x-description-fr": "Captures de preuve : JPG, PNG ou WebP, 5 fichiers maximum, 4 Mo chacun."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The order, with the delivery history in meta.",
            "x-description-fr": "La commande, avec l’historique des livraisons dans meta.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Order"
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "delivery_id": {
                          "type": "integer",
                          "description": "The new delivery.",
                          "x-description-fr": "La nouvelle livraison."
                        },
                        "deliveries": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/DeliveryHistoryItem"
                          }
                        }
                      }
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 2,
                    "number": "48295086",
                    "status": "delivered",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 11999,
                    "subtotal_cents": 11999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 11999,
                    "platform_fee_cents": 1199,
                    "fee_percent": 10,
                    "seller_amount_cents": 10800,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": {
                      "delivered_at": "2026-10-27T11:09:56Z",
                      "has_credentials": true,
                      "proof_count": 0
                    },
                    "dispute": null,
                    "payment_due_at": "2026-10-27T11:34:56Z",
                    "paid_at": "2026-10-27T10:34:56Z",
                    "delivery_due_at": "2026-10-27T11:04:56Z",
                    "delivered_at": "2026-10-27T10:39:56Z",
                    "auto_release_at": "2026-10-30T11:09:56Z",
                    "completed_at": null,
                    "warranty_ends_at": null,
                    "created_at": "2026-10-27T10:34:56Z",
                    "updated_at": "2026-10-27T11:09:56Z"
                  },
                  "meta": {
                    "delivery_id": 2,
                    "deliveries": [
                      {
                        "id": 1,
                        "delivered_at": "2026-10-27T10:39:56Z",
                        "amends_delivery_id": null,
                        "reason": null,
                        "has_credentials": true
                      },
                      {
                        "id": 2,
                        "delivered_at": "2026-10-27T11:09:56Z",
                        "amends_delivery_id": 1,
                        "reason": "The password had a typo — fixed.",
                        "has_credentials": true
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 39
      }
    },
    "/orders/{order}/invoice": {
      "get": {
        "tags": [
          "Orders"
        ],
        "operationId": "ordersInvoice",
        "summary": "Get the invoice",
        "x-summary-fr": "Obtenir la facture",
        "description": "The invoice of a paid order, for its buyer or its seller: lines, buyer fee, discount, taxes, refunds and total, in USD cents. The seller also gets `seller_summary` (platform fee and what you receive). `html_url` is a printable HTML version that opens without a token: a signed link valid for 24 hours (`html_url_expires_at`). An order that was never paid has no invoice → 409.",
        "x-description-fr": "La facture d’une commande payée, pour son acheteur ou son vendeur : lignes, frais acheteur, remise, taxes, remboursements et total, en centimes USD. Le vendeur reçoit aussi `seller_summary` (commission de la plateforme et ce que vous recevez). `html_url` est une version HTML imprimable qui s’ouvre sans jeton : un lien signé valable 24 heures (`html_url_expires_at`). Une commande jamais payée n’a pas de facture → 409.",
        "x-scopes": [
          "orders:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "orders:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "order",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Order id, or the 8-digit order number shown as #48291735 (the # is optional).",
            "x-description-fr": "Identifiant de la commande, ou numéro de commande à 8 chiffres affiché #48291735 (le # est facultatif).",
            "example": "48291735"
          }
        ],
        "responses": {
          "200": {
            "description": "The invoice.",
            "x-description-fr": "La facture.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Invoice"
                    }
                  }
                },
                "example": {
                  "data": {
                    "invoice_number": "48293969",
                    "order": {
                      "id": 1,
                      "number": "48293969",
                      "status": "paid"
                    },
                    "issued_at": "2026-10-27T10:31:56Z",
                    "currency": "USD",
                    "issuer": {
                      "name": "MythicDeals",
                      "role": "marketplace",
                      "note": "Payment collected by MythicDeals on behalf of the seller."
                    },
                    "seller": {
                      "id": 1,
                      "store_name": "Budi Store"
                    },
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "lines": [
                      {
                        "description": "Immortal 2 account, 42 skins",
                        "game": "Valorant",
                        "type": "account",
                        "quantity": 1,
                        "unit_price_cents": 11999,
                        "amount_cents": 11999
                      }
                    ],
                    "subtotal_cents": 11999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "coupon_code": null,
                    "tax_lines": [],
                    "tax_cents": 0,
                    "total_cents": 11999,
                    "refunded_cents": 0,
                    "payment_method": null,
                    "seller_summary": {
                      "platform_fee_cents": 1199,
                      "fee_percent": 10,
                      "seller_discount_cents": 0,
                      "seller_amount_cents": 10800
                    },
                    "html_url": "http://localhost:8000/api/v1/orders/1/invoice.html?expires=1793183636&viewer=seller&signature=9303ba180af5232dbc57e8ba077fb34e1955ec272ba84ab9d1c7852a556d2b50",
                    "html_url_expires_at": "2026-10-28T10:33:56Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 40
      }
    },
    "/orders/{order}/invoice.html": {
      "get": {
        "tags": [
          "Orders"
        ],
        "operationId": "ordersInvoiceHtml",
        "summary": "Open the printable invoice",
        "x-summary-fr": "Ouvrir la facture imprimable",
        "description": "The invoice as a printable HTML page. Do not build this URL yourself: open `html_url` from GET /orders/{order}/invoice. It needs no token — open it in a browser or send it to a printer — and is valid for 24 hours. It shows the view of whoever requested the link (`viewer`: the seller view includes what you receive). A changed or expired link → 403 `forbidden`. Limited to 60 requests per minute.",
        "x-description-fr": "La facture sous forme de page HTML imprimable. Ne construisez pas cette URL vous-même : ouvrez `html_url` renvoyé par GET /orders/{order}/invoice. Elle ne nécessite aucun jeton — ouvrez-la dans un navigateur ou envoyez-la à une imprimante — et reste valable 24 heures. Elle affiche la vue de la personne qui a demandé le lien (`viewer` : la vue vendeur inclut ce que vous recevez). Lien modifié ou expiré → 403 `forbidden`. Limitée à 60 requêtes par minute.",
        "x-scopes": [],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [],
        "x-auth": "signed-url",
        "parameters": [
          {
            "name": "order",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Order id (number only).",
            "x-description-fr": "Identifiant numérique de la commande.",
            "example": 1
          },
          {
            "in": "query",
            "name": "expires",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Expiry (Unix time), part of the signed link.",
            "x-description-fr": "Expiration (heure Unix), fait partie du lien signé."
          },
          {
            "in": "query",
            "name": "viewer",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "buyer",
                "seller"
              ]
            },
            "description": "Whose view, part of the signed link.",
            "x-description-fr": "La vue affichée, fait partie du lien signé."
          },
          {
            "in": "query",
            "name": "signature",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Signature of the link.",
            "x-description-fr": "Signature du lien."
          }
        ],
        "x-sample-query": {
          "expires": 1793183636,
          "viewer": "seller",
          "signature": "9303ba180af5232dbc57e8ba077fb34e1955ec272ba84ab9d1c7852a556d2b50"
        },
        "responses": {
          "200": {
            "description": "The printable invoice (text/html).",
            "x-description-fr": "La facture imprimable (text/html).",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                },
                "example": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"robots\" content=\"noindex\">\n    <title>Invoice 48293969 · MythicDeals</title>\n    <style>…</style>\n</head>\n<body>\n  …\n</body>\n</html>\n"
              }
            }
          },
          "403": {
            "description": "`forbidden`: the signature is invalid or the link expired. Get a new `html_url`.",
            "x-description-fr": "`forbidden` : signature invalide ou lien expiré. Demandez un nouveau `html_url`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": {
                    "code": "forbidden",
                    "message": "Invalid signature."
                  }
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 41
      }
    },
    "/orders/{order}/messages": {
      "get": {
        "tags": [
          "Order messages"
        ],
        "operationId": "ordersMessagesIndex",
        "summary": "List order messages",
        "x-summary-fr": "Lister les messages d’une commande",
        "description": "Messages oldest first, with a cursor: pass the last id you have as `since_id` and keep calling with `meta.next_since_id` while `meta.has_more` is true. Reading does NOT mark messages as read unless `mark_read=1`.",
        "x-description-fr": "Messages du plus ancien au plus récent, avec un curseur : passez le dernier identifiant reçu dans `since_id` et rappelez avec `meta.next_since_id` tant que `meta.has_more` vaut true. La lecture NE marque PAS les messages comme lus, sauf avec `mark_read=1`.",
        "x-scopes": [
          "messages:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "messages:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "order",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Order id, or the 8-digit order number shown as #48291735 (the # is optional).",
            "x-description-fr": "Identifiant de la commande, ou numéro de commande à 8 chiffres affiché #48291735 (le # est facultatif).",
            "example": "48291735"
          },
          {
            "in": "query",
            "name": "since_id",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            },
            "description": "Return messages with an id greater than this.",
            "x-description-fr": "Renvoie les messages dont l’identifiant est supérieur à cette valeur."
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            },
            "description": "Items per page, 1–100.",
            "x-description-fr": "Éléments par page, de 1 à 100."
          },
          {
            "in": "query",
            "name": "mark_read",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            },
            "description": "Also mark the other party’s messages as read.",
            "x-description-fr": "Marque aussi comme lus les messages de l’autre partie."
          }
        ],
        "x-sample-query": {
          "since_id": 0
        },
        "responses": {
          "200": {
            "description": "Messages after since_id.",
            "x-description-fr": "Messages après since_id.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Message"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/MessagesMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 1,
                      "order_id": 1,
                      "sender": {
                        "id": null,
                        "name": "MythicDeals",
                        "role": "system"
                      },
                      "body": "Payment received",
                      "is_system": true,
                      "attachments": [],
                      "read_at": "2026-10-26T15:54:50Z",
                      "created_at": "2026-10-26T15:54:50Z"
                    }
                  ],
                  "meta": {
                    "per_page": 1,
                    "has_more": true,
                    "next_since_id": 1
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 42
      },
      "post": {
        "tags": [
          "Order messages"
        ],
        "operationId": "ordersMessagesStore",
        "summary": "Send an order message",
        "x-summary-fr": "Envoyer un message de commande",
        "description": "Sends a message as the buyer or seller of the order. Text, files (multipart) or both. The chat opens once the order is paid (409 `chat_closed` before that, and for expired or cancelled orders).\n\nAccepts an `Idempotency-Key` header: retrying with the same key returns the first response.",
        "x-description-fr": "Envoie un message en tant qu’acheteur ou vendeur de la commande. Texte, fichiers (multipart) ou les deux. La messagerie s’ouvre une fois la commande payée (409 `chat_closed` avant cela, ainsi que pour les commandes expirées ou annulées).\n\nAccepte un en-tête `Idempotency-Key` : une nouvelle tentative avec la même clé renvoie la première réponse.",
        "x-scopes": [
          "messages:write"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": true,
        "security": [
          {
            "bearerAuth": [
              "messages:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "order",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Order id, or the 8-digit order number shown as #48291735 (the # is optional).",
            "x-description-fr": "Identifiant de la commande, ou numéro de commande à 8 chiffres affiché #48291735 (le # est facultatif).",
            "example": "48291735"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "body": {
                    "type": "string",
                    "maxLength": 2000,
                    "description": "Message text. Required unless you send files.",
                    "x-description-fr": "Texte du message. Obligatoire si vous n’envoyez pas de fichiers."
                  }
                }
              },
              "example": {
                "body": "Hello, delivering now."
              }
            },
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "body": {
                    "type": "string",
                    "maxLength": 2000
                  },
                  "files[]": {
                    "type": "array",
                    "maxItems": 5,
                    "items": {
                      "type": "string",
                      "contentMediaType": "application/octet-stream"
                    },
                    "description": "JPG, PNG, WebP or PDF, max 5 files, 4 MB each.",
                    "x-description-fr": "JPG, PNG, WebP ou PDF, 5 fichiers maximum, 4 Mo chacun."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The new message.",
            "x-description-fr": "Le nouveau message.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Message"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 4,
                    "order_id": 1,
                    "sender": {
                      "id": 1,
                      "name": "Budi",
                      "role": "seller"
                    },
                    "body": "Hello, delivering now.",
                    "is_system": false,
                    "attachments": [],
                    "read_at": null,
                    "created_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 43
      }
    },
    "/orders/{order}/start": {
      "post": {
        "tags": [
          "Orders"
        ],
        "operationId": "ordersStart",
        "summary": "Start an order",
        "x-summary-fr": "Démarrer une commande",
        "description": "Marks a paid order as `processing` (you are working on it). Calling it again on a processing order just returns the order. Other statuses return 409.\n\nRequires a verified seller account with a verified email address.",
        "x-description-fr": "Passe une commande payée en `processing` (vous la traitez). Un nouvel appel sur une commande déjà en cours renvoie simplement la commande. Les autres statuts renvoient 409.\n\nNécessite un compte vendeur vérifié et une adresse e-mail vérifiée.",
        "x-scopes": [
          "orders:write"
        ],
        "x-requires-verified-seller": true,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "orders:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "order",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Order id, or the 8-digit order number shown as #48291735 (the # is optional).",
            "x-description-fr": "Identifiant de la commande, ou numéro de commande à 8 chiffres affiché #48291735 (le # est facultatif).",
            "example": "48291735"
          }
        ],
        "responses": {
          "200": {
            "description": "The order.",
            "x-description-fr": "La commande.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Order"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "number": "48291735",
                    "status": "processing",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 9999,
                    "subtotal_cents": 9999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 9999,
                    "platform_fee_cents": 999,
                    "fee_percent": 10,
                    "seller_amount_cents": 9000,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": null,
                    "dispute": null,
                    "payment_due_at": "2026-10-26T16:54:50Z",
                    "paid_at": "2026-10-26T15:54:50Z",
                    "delivery_due_at": "2026-10-26T16:24:50Z",
                    "delivered_at": null,
                    "auto_release_at": null,
                    "completed_at": null,
                    "warranty_ends_at": null,
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 36
      }
    },
    "/payouts": {
      "get": {
        "tags": [
          "Payouts"
        ],
        "operationId": "payoutsIndex",
        "summary": "List payouts",
        "x-summary-fr": "Lister les retraits",
        "description": "Your withdrawals, newest first — the same list as on the Wallet page. A payout goes `requested` → `approved` → `completed` (money sent, `transfer_reference` set), or ends `rejected` / `failed` (`reject_reason` set; the amount returns to your balance). `method.label` is masked.",
        "x-description-fr": "Vos retraits, les plus récents en premier — la même liste que sur la page Portefeuille. Un retrait passe de `requested` à `approved` puis `completed` (argent envoyé, `transfer_reference` renseigné), ou se termine en `rejected` / `failed` (`reject_reason` renseigné ; le montant revient sur votre solde). `method.label` est masqué.",
        "x-scopes": [
          "wallet:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "wallet:read"
            ]
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "One status or several separated by commas: requested, approved, completed, rejected, failed.",
            "x-description-fr": "Un statut ou plusieurs séparés par des virgules : requested, approved, completed, rejected, failed."
          },
          {
            "in": "query",
            "name": "created_since",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Only payouts requested at or after this time.",
            "x-description-fr": "Uniquement les retraits demandés à partir de cette date."
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            },
            "description": "Items per page, 1–100.",
            "x-description-fr": "Éléments par page, de 1 à 100."
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Page number.",
            "x-description-fr": "Numéro de page."
          }
        ],
        "responses": {
          "200": {
            "description": "A page of payouts.",
            "x-description-fr": "Une page de retraits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "links",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Payout"
                      }
                    },
                    "links": {
                      "$ref": "#/components/schemas/PaginationLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 2,
                      "status": "requested",
                      "status_label": "Waiting for review",
                      "amount_cents": 12000,
                      "fee_cents": 120,
                      "net_amount_cents": 11880,
                      "currency": "USD",
                      "method": {
                        "type": "ewallet",
                        "label": "DANA ••••7781"
                      },
                      "transfer_reference": null,
                      "reject_reason": null,
                      "created_at": "2026-10-27T13:32:56Z",
                      "reviewed_at": null,
                      "paid_at": null,
                      "updated_at": "2026-10-27T13:32:56Z"
                    },
                    {
                      "id": 1,
                      "status": "completed",
                      "status_label": "Sent",
                      "amount_cents": 25000,
                      "fee_cents": 250,
                      "net_amount_cents": 24750,
                      "currency": "USD",
                      "method": {
                        "type": "bank",
                        "label": "BCA ••••1234"
                      },
                      "transfer_reference": "TRX-20261025-0042",
                      "reject_reason": null,
                      "created_at": "2026-10-24T13:32:56Z",
                      "reviewed_at": "2026-10-24T15:32:56Z",
                      "paid_at": "2026-10-25T13:32:56Z",
                      "updated_at": "2026-10-25T13:32:56Z"
                    }
                  ],
                  "links": {
                    "first": "http://localhost:8000/api/v1/payouts?page=1",
                    "last": "http://localhost:8000/api/v1/payouts?page=1",
                    "prev": null,
                    "next": null
                  },
                  "meta": {
                    "current_page": 1,
                    "from": 1,
                    "last_page": 1,
                    "links": [
                      {
                        "url": null,
                        "label": "&laquo; Previous",
                        "page": null,
                        "active": false
                      },
                      {
                        "url": "http://localhost:8000/api/v1/payouts?page=1",
                        "label": "1",
                        "page": 1,
                        "active": true
                      },
                      {
                        "url": null,
                        "label": "Next &raquo;",
                        "page": null,
                        "active": false
                      }
                    ],
                    "path": "http://localhost:8000/api/v1/payouts",
                    "per_page": 25,
                    "to": 2,
                    "total": 2
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 54
      }
    },
    "/payouts/{id}": {
      "get": {
        "tags": [
          "Payouts"
        ],
        "operationId": "payoutsShow",
        "summary": "Get a payout",
        "x-summary-fr": "Obtenir un retrait",
        "description": "",
        "x-description-fr": "",
        "x-scopes": [
          "wallet:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "wallet:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Payout id.",
            "x-description-fr": "Identifiant du retrait.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "The payout.",
            "x-description-fr": "Le retrait.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Payout"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "status": "completed",
                    "status_label": "Sent",
                    "amount_cents": 25000,
                    "fee_cents": 250,
                    "net_amount_cents": 24750,
                    "currency": "USD",
                    "method": {
                      "type": "bank",
                      "label": "BCA ••••1234"
                    },
                    "transfer_reference": "TRX-20261025-0042",
                    "reject_reason": null,
                    "created_at": "2026-10-24T13:32:56Z",
                    "reviewed_at": "2026-10-24T15:32:56Z",
                    "paid_at": "2026-10-25T13:32:56Z",
                    "updated_at": "2026-10-25T13:32:56Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 55
      }
    },
    "/wallet": {
      "get": {
        "tags": [
          "Wallet"
        ],
        "operationId": "walletShow",
        "summary": "Get balances",
        "x-summary-fr": "Obtenir les soldes",
        "description": "`available_cents` can be withdrawn. `pending_cents` is money from orders not released yet — it includes `warranty_held_cents` (completed orders still under warranty). `frozen_cents` is held by open disputes.",
        "x-description-fr": "`available_cents` peut être retiré. `pending_cents` correspond aux commandes pas encore libérées — il inclut `warranty_held_cents` (commandes terminées encore sous garantie). `frozen_cents` est bloqué par des litiges ouverts.",
        "x-scopes": [
          "wallet:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "wallet:read"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "Balances in USD cents.",
            "x-description-fr": "Soldes en centimes USD.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Wallet"
                    }
                  }
                },
                "example": {
                  "data": {
                    "available_cents": 25400,
                    "pending_cents": 18000,
                    "frozen_cents": 0,
                    "warranty_held_cents": 9000,
                    "currency": "USD"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 52
      }
    },
    "/wallet/ledger": {
      "get": {
        "tags": [
          "Wallet"
        ],
        "operationId": "walletLedger",
        "summary": "List ledger entries",
        "x-summary-fr": "Lister les mouvements",
        "description": "Every change to your available balance, newest first. Debits have a negative `amount_cents`.",
        "x-description-fr": "Chaque mouvement de votre solde disponible, du plus récent au plus ancien. Les débits ont un `amount_cents` négatif.",
        "x-scopes": [
          "wallet:read"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "wallet:read"
            ]
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "type",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "sale_credit",
                "refund_debit",
                "withdrawal_debit",
                "withdrawal_revert",
                "adjustment",
                "affiliate_commission"
              ]
            },
            "description": "Only entries of this type.",
            "x-description-fr": "Uniquement les mouvements de ce type."
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            },
            "description": "Items per page, 1–100.",
            "x-description-fr": "Éléments par page, de 1 à 100."
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Page number.",
            "x-description-fr": "Numéro de page."
          }
        ],
        "responses": {
          "200": {
            "description": "A page of entries.",
            "x-description-fr": "Une page de mouvements.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "links",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/LedgerEntry"
                      }
                    },
                    "links": {
                      "$ref": "#/components/schemas/PaginationLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 41,
                      "type": "sale_credit",
                      "amount_cents": 9000,
                      "balance_after_cents": 25400,
                      "currency": "USD",
                      "description": "Sale 48291735",
                      "order": {
                        "id": 1,
                        "number": "48291735"
                      },
                      "withdrawal_id": null,
                      "created_at": "2026-10-29T15:54:50Z"
                    }
                  ],
                  "links": {
                    "first": "http://localhost:8000/api/v1/wallet/ledger?page=1",
                    "last": "http://localhost:8000/api/v1/wallet/ledger?page=1",
                    "prev": null,
                    "next": null
                  },
                  "meta": {
                    "current_page": 1,
                    "from": 1,
                    "last_page": 1,
                    "links": [
                      {
                        "url": null,
                        "label": "&laquo; Previous",
                        "page": null,
                        "active": false
                      },
                      {
                        "url": "http://localhost:8000/api/v1/wallet/ledger?page=1",
                        "label": "1",
                        "page": 1,
                        "active": true
                      },
                      {
                        "url": null,
                        "label": "Next &raquo;",
                        "page": null,
                        "active": false
                      }
                    ],
                    "path": "http://localhost:8000/api/v1/wallet/ledger",
                    "per_page": 25,
                    "to": 1,
                    "total": 1
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 53
      }
    },
    "/webhooks": {
      "get": {
        "tags": [
          "Webhooks"
        ],
        "operationId": "webhooksIndex",
        "summary": "List webhook endpoints",
        "x-summary-fr": "Lister les endpoints webhook",
        "description": "All your endpoints (at most 10). Not paginated. Secrets are never returned here, only `secret_hint`.",
        "x-description-fr": "Tous vos endpoints (10 maximum). Non paginé. Les secrets ne sont jamais renvoyés ici, seulement `secret_hint`.",
        "x-scopes": [
          "webhooks:write"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "webhooks:write"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "Your endpoints.",
            "x-description-fr": "Vos endpoints.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/WebhookEndpoint"
                      }
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 1,
                      "url": "https://hooks.example.com/mythicdeals",
                      "description": "Sync bot",
                      "events": [
                        "order.paid",
                        "message.created"
                      ],
                      "is_active": true,
                      "failure_count": 0,
                      "disabled_at": null,
                      "last_success_at": null,
                      "last_failure_at": null,
                      "secret_hint": "whsec_3kT…",
                      "created_at": "2026-10-26T15:54:50Z",
                      "updated_at": "2026-10-26T15:54:50Z"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 64
      },
      "post": {
        "tags": [
          "Webhooks"
        ],
        "operationId": "webhooksStore",
        "summary": "Create a webhook endpoint",
        "x-summary-fr": "Créer un endpoint webhook",
        "description": "The URL must use HTTPS, must not contain a username or password, and must resolve to a public IP address. The response contains the signing `secret` — the only time it is shown. At most 10 endpoints per account.\n\nAccepts an `Idempotency-Key` header: retrying with the same key returns the first response.",
        "x-description-fr": "L’URL doit utiliser HTTPS, ne doit pas contenir d’identifiant ni de mot de passe et doit pointer vers une adresse IP publique. La réponse contient le `secret` de signature — la seule fois où il est affiché. 10 endpoints maximum par compte.\n\nAccepte un en-tête `Idempotency-Key` : une nouvelle tentative avec la même clé renvoie la première réponse.",
        "x-scopes": [
          "webhooks:write"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": true,
        "security": [
          {
            "bearerAuth": [
              "webhooks:write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEndpointCreate"
              },
              "example": {
                "url": "https://hooks.example.com/mythicdeals",
                "events": [
                  "order.paid",
                  "message.created"
                ],
                "description": "Sync bot"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The new endpoint, with its secret.",
            "x-description-fr": "Le nouvel endpoint, avec son secret.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/Idempotent-Replayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WebhookEndpoint"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "url": "https://hooks.example.com/mythicdeals",
                    "description": "Sync bot",
                    "events": [
                      "order.paid",
                      "message.created"
                    ],
                    "is_active": true,
                    "failure_count": 0,
                    "disabled_at": null,
                    "last_success_at": null,
                    "last_failure_at": null,
                    "secret_hint": "whsec_3kT…",
                    "secret": "whsec_3kTqL9vWm2YbX7pRz4NcF8hJd1GsA6eQ0uVoK5iE",
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 65
      }
    },
    "/webhooks/{webhook}": {
      "get": {
        "tags": [
          "Webhooks"
        ],
        "operationId": "webhooksShow",
        "summary": "Get a webhook endpoint",
        "x-summary-fr": "Obtenir un endpoint webhook",
        "description": "",
        "x-description-fr": "",
        "x-scopes": [
          "webhooks:write"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "webhooks:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "webhook",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Webhook endpoint id.",
            "x-description-fr": "Identifiant de l’endpoint webhook.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "The endpoint.",
            "x-description-fr": "L’endpoint.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WebhookEndpoint"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "url": "https://hooks.example.com/mythicdeals",
                    "description": "Sync bot",
                    "events": [
                      "order.paid",
                      "message.created"
                    ],
                    "is_active": true,
                    "failure_count": 0,
                    "disabled_at": null,
                    "last_success_at": null,
                    "last_failure_at": null,
                    "secret_hint": "whsec_3kT…",
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 66
      },
      "patch": {
        "tags": [
          "Webhooks"
        ],
        "operationId": "webhooksUpdate",
        "summary": "Update a webhook endpoint",
        "x-summary-fr": "Modifier un endpoint webhook",
        "description": "Change the URL, events, description or `is_active`. Turning an endpoint back on resets its failure count. `rotate_secret: true` issues a new secret (returned once in `secret`); the old one stops working immediately.",
        "x-description-fr": "Modifiez l’URL, les événements, la description ou `is_active`. Réactiver un endpoint remet son compteur d’échecs à zéro. `rotate_secret: true` génère un nouveau secret (renvoyé une seule fois dans `secret`) ; l’ancien cesse de fonctionner immédiatement.",
        "x-scopes": [
          "webhooks:write"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "webhooks:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "webhook",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Webhook endpoint id.",
            "x-description-fr": "Identifiant de l’endpoint webhook.",
            "example": 1
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEndpointUpdate"
              },
              "example": {
                "events": [
                  "order.paid"
                ],
                "rotate_secret": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated endpoint.",
            "x-description-fr": "L’endpoint modifié.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WebhookEndpoint"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "url": "https://hooks.example.com/mythicdeals",
                    "description": "Sync bot",
                    "events": [
                      "order.paid"
                    ],
                    "is_active": true,
                    "failure_count": 0,
                    "disabled_at": null,
                    "last_success_at": null,
                    "last_failure_at": null,
                    "secret_hint": "whsec_3kT…",
                    "secret": "whsec_3kTqL9vWm2YbX7pRz4NcF8hJd1GsA6eQ0uVoK5iE",
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 67
      },
      "delete": {
        "tags": [
          "Webhooks"
        ],
        "operationId": "webhooksDestroy",
        "summary": "Delete a webhook endpoint",
        "x-summary-fr": "Supprimer un endpoint webhook",
        "description": "Deletes the endpoint and its delivery history.",
        "x-description-fr": "Supprime l’endpoint et son historique d’envois.",
        "x-scopes": [
          "webhooks:write"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "webhooks:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "webhook",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Webhook endpoint id.",
            "x-description-fr": "Identifiant de l’endpoint webhook.",
            "example": 1
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted. No body.",
            "x-description-fr": "Supprimé. Pas de contenu.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 68
      }
    },
    "/webhooks/{webhook}/deliveries": {
      "get": {
        "tags": [
          "Webhooks"
        ],
        "operationId": "webhooksDeliveries",
        "summary": "List deliveries",
        "x-summary-fr": "Lister les envois",
        "description": "Delivery attempts of one endpoint, newest first, with the payload, last response code and next retry time.",
        "x-description-fr": "Les envois d’un endpoint, du plus récent au plus ancien, avec le contenu, le dernier code de réponse et la prochaine tentative.",
        "x-scopes": [
          "webhooks:write"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "webhooks:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "webhook",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Webhook endpoint id.",
            "x-description-fr": "Identifiant de l’endpoint webhook.",
            "example": 1
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "pending",
                "sending",
                "succeeded",
                "failed"
              ]
            },
            "description": "Only deliveries with this status.",
            "x-description-fr": "Uniquement les envois ayant ce statut."
          },
          {
            "in": "query",
            "name": "event",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 40
            },
            "description": "Only this event type, e.g. order.paid.",
            "x-description-fr": "Uniquement ce type d’événement, par ex. order.paid."
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            },
            "description": "Items per page, 1–100.",
            "x-description-fr": "Éléments par page, de 1 à 100."
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Page number.",
            "x-description-fr": "Numéro de page."
          }
        ],
        "x-sample-query": {
          "status": "failed"
        },
        "responses": {
          "200": {
            "description": "A page of deliveries.",
            "x-description-fr": "Une page d’envois.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "links",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/WebhookDelivery"
                      }
                    },
                    "links": {
                      "$ref": "#/components/schemas/PaginationLinks"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/PaginationMeta"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": 1,
                      "delivery_id": "dlv_01m5weqvzdvzns8870e41gv24h",
                      "event": "ping",
                      "status": "succeeded",
                      "attempts": 1,
                      "response_code": 200,
                      "response_excerpt": "ok",
                      "error": null,
                      "next_attempt_at": null,
                      "delivered_at": "2026-10-26T15:54:50Z",
                      "payload": {
                        "id": "evt_01m5weqvzcma48d9m8tfm3bjv9",
                        "type": "ping",
                        "created_at": "2026-10-26T15:54:50Z",
                        "data": {
                          "message": "Webhook test from MythicDeals.",
                          "endpoint_id": 1
                        }
                      },
                      "created_at": "2026-10-26T15:54:50Z"
                    }
                  ],
                  "links": {
                    "first": "http://localhost:8000/api/v1/webhooks/1/deliveries?page=1",
                    "last": "http://localhost:8000/api/v1/webhooks/1/deliveries?page=1",
                    "prev": null,
                    "next": null
                  },
                  "meta": {
                    "current_page": 1,
                    "from": 1,
                    "last_page": 1,
                    "links": [
                      {
                        "url": null,
                        "label": "&laquo; Previous",
                        "page": null,
                        "active": false
                      },
                      {
                        "url": "http://localhost:8000/api/v1/webhooks/1/deliveries?page=1",
                        "label": "1",
                        "page": 1,
                        "active": true
                      },
                      {
                        "url": null,
                        "label": "Next &raquo;",
                        "page": null,
                        "active": false
                      }
                    ],
                    "path": "http://localhost:8000/api/v1/webhooks/1/deliveries",
                    "per_page": 25,
                    "to": 1,
                    "total": 1
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 70
      }
    },
    "/webhooks/{webhook}/deliveries/{delivery}/retry": {
      "post": {
        "tags": [
          "Webhooks"
        ],
        "operationId": "webhooksRetry",
        "summary": "Retry a delivery",
        "x-summary-fr": "Renvoyer un envoi",
        "description": "Tries a failed or waiting delivery again right now. The endpoint must be turned on. Other statuses return 409.",
        "x-description-fr": "Retente immédiatement un envoi échoué ou en attente. L’endpoint doit être activé. Les autres statuts renvoient 409.",
        "x-scopes": [
          "webhooks:write"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "webhooks:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "webhook",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Webhook endpoint id.",
            "x-description-fr": "Identifiant de l’endpoint webhook.",
            "example": 1
          },
          {
            "name": "delivery",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Delivery id (number) or delivery_id (dlv_…).",
            "x-description-fr": "Identifiant numérique de l’envoi ou delivery_id (dlv_…).",
            "example": "dlv_01m5weqvzdvzns8870e41gv24h"
          }
        ],
        "responses": {
          "200": {
            "description": "The delivery after the new attempt.",
            "x-description-fr": "L’envoi après la nouvelle tentative.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WebhookDelivery"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "delivery_id": "dlv_01m5weqvzdvzns8870e41gv24h",
                    "event": "ping",
                    "status": "succeeded",
                    "attempts": 1,
                    "response_code": 200,
                    "response_excerpt": "ok",
                    "error": null,
                    "next_attempt_at": null,
                    "delivered_at": "2026-10-26T15:54:50Z",
                    "payload": {
                      "id": "evt_01m5weqvzcma48d9m8tfm3bjv9",
                      "type": "ping",
                      "created_at": "2026-10-26T15:54:50Z",
                      "data": {
                        "message": "Webhook test from MythicDeals.",
                        "endpoint_id": 1
                      }
                    },
                    "created_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 71
      }
    },
    "/webhooks/{webhook}/test": {
      "post": {
        "tags": [
          "Webhooks"
        ],
        "operationId": "webhooksTest",
        "summary": "Send a test event",
        "x-summary-fr": "Envoyer un événement de test",
        "description": "Sends a signed `ping` event right now and returns the delivery result. Works even when the endpoint is turned off. Pings are not retried and do not count as failures.",
        "x-description-fr": "Envoie immédiatement un événement `ping` signé et renvoie le résultat. Fonctionne même si l’endpoint est désactivé. Les pings ne sont pas renvoyés et ne comptent pas comme des échecs.",
        "x-scopes": [
          "webhooks:write"
        ],
        "x-requires-verified-seller": false,
        "x-idempotent": false,
        "security": [
          {
            "bearerAuth": [
              "webhooks:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "webhook",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Webhook endpoint id.",
            "x-description-fr": "Identifiant de l’endpoint webhook.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "The ping delivery.",
            "x-description-fr": "L’envoi du ping.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WebhookDelivery"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": 1,
                    "delivery_id": "dlv_01m5weqvzdvzns8870e41gv24h",
                    "event": "ping",
                    "status": "succeeded",
                    "attempts": 1,
                    "response_code": 200,
                    "response_excerpt": "ok",
                    "error": null,
                    "next_attempt_at": null,
                    "delivered_at": "2026-10-26T15:54:50Z",
                    "payload": {
                      "id": "evt_01m5weqvzcma48d9m8tfm3bjv9",
                      "type": "ping",
                      "created_at": "2026-10-26T15:54:50Z",
                      "data": {
                        "message": "Webhook test from MythicDeals.",
                        "endpoint_id": 1
                      }
                    },
                    "created_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "x-order": 69
      }
    }
  },
  "webhooks": {
    "order.created": {
      "post": {
        "summary": "order.created",
        "description": "A buyer placed an order for one of your listings. It is not paid yet — do not deliver.",
        "x-description-fr": "Un acheteur a commandé l’une de vos annonces. Elle n’est pas encore payée — ne livrez pas.",
        "operationId": "webhookOrderCreated",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "order.created"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "order.created"
                      },
                      "data": {
                        "$ref": "#/components/schemas/OrderEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5weqw0gxp9kz6h3hxcjf76s",
                "type": "order.created",
                "created_at": "2026-10-26T15:54:50Z",
                "data": {
                  "order": {
                    "id": 2,
                    "number": "48292852",
                    "status": "pending_payment",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 9999,
                    "subtotal_cents": 9999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 9999,
                    "platform_fee_cents": 999,
                    "fee_percent": 10,
                    "seller_amount_cents": 9000,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": null,
                    "dispute": null,
                    "payment_due_at": "2026-10-26T16:54:50Z",
                    "paid_at": null,
                    "delivery_due_at": null,
                    "delivered_at": null,
                    "auto_release_at": null,
                    "completed_at": null,
                    "warranty_ends_at": null,
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    },
    "order.paid": {
      "post": {
        "summary": "order.paid",
        "description": "Payment is confirmed and held in escrow. Deliver before delivery_due_at.",
        "x-description-fr": "Le paiement est confirmé et conservé en séquestre. Livrez avant delivery_due_at.",
        "operationId": "webhookOrderPaid",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "order.paid"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "order.paid"
                      },
                      "data": {
                        "$ref": "#/components/schemas/OrderEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5weqw10bhte2s9tvxk5kqzf",
                "type": "order.paid",
                "created_at": "2026-10-26T15:54:50Z",
                "data": {
                  "order": {
                    "id": 2,
                    "number": "48292852",
                    "status": "paid",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 9999,
                    "subtotal_cents": 9999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 9999,
                    "platform_fee_cents": 999,
                    "fee_percent": 10,
                    "seller_amount_cents": 9000,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": null,
                    "dispute": null,
                    "payment_due_at": "2026-10-26T16:54:50Z",
                    "paid_at": "2026-10-26T15:54:50Z",
                    "delivery_due_at": "2026-10-26T16:24:50Z",
                    "delivered_at": null,
                    "auto_release_at": null,
                    "completed_at": null,
                    "warranty_ends_at": null,
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  },
                  "previous_status": "pending_payment"
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    },
    "order.processing": {
      "post": {
        "summary": "order.processing",
        "description": "The order was marked as in progress (by you, on the website or via the API).",
        "x-description-fr": "La commande a été marquée en cours (par vous, sur le site ou via l’API).",
        "operationId": "webhookOrderProcessing",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "order.processing"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "order.processing"
                      },
                      "data": {
                        "$ref": "#/components/schemas/OrderEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5wf3fae3f86132407a1e735",
                "type": "order.processing",
                "created_at": "2026-10-26T15:54:50Z",
                "data": {
                  "order": {
                    "id": 2,
                    "number": "48292852",
                    "status": "processing",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 9999,
                    "subtotal_cents": 9999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 9999,
                    "platform_fee_cents": 999,
                    "fee_percent": 10,
                    "seller_amount_cents": 9000,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": null,
                    "dispute": null,
                    "payment_due_at": "2026-10-26T16:54:50Z",
                    "paid_at": "2026-10-26T15:54:50Z",
                    "delivery_due_at": "2026-10-26T16:24:50Z",
                    "delivered_at": null,
                    "auto_release_at": null,
                    "completed_at": null,
                    "warranty_ends_at": null,
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  },
                  "previous_status": "paid"
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    },
    "order.delivered": {
      "post": {
        "summary": "order.delivered",
        "description": "The order was delivered — manually, via the API or by instant delivery.",
        "x-description-fr": "La commande a été livrée — manuellement, via l’API ou par livraison instantanée.",
        "operationId": "webhookOrderDelivered",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "order.delivered"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "order.delivered"
                      },
                      "data": {
                        "$ref": "#/components/schemas/OrderEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5wfc4aa3a27c01f65f1a8ad",
                "type": "order.delivered",
                "created_at": "2026-10-26T15:54:50Z",
                "data": {
                  "order": {
                    "id": 2,
                    "number": "48292852",
                    "status": "delivered",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 9999,
                    "subtotal_cents": 9999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 9999,
                    "platform_fee_cents": 999,
                    "fee_percent": 10,
                    "seller_amount_cents": 9000,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": {
                      "delivered_at": "2026-10-26T16:02:10Z",
                      "has_credentials": true,
                      "proof_count": 0
                    },
                    "dispute": null,
                    "payment_due_at": "2026-10-26T16:54:50Z",
                    "paid_at": "2026-10-26T15:54:50Z",
                    "delivery_due_at": "2026-10-26T16:24:50Z",
                    "delivered_at": "2026-10-26T16:02:10Z",
                    "auto_release_at": "2026-10-29T16:02:10Z",
                    "completed_at": null,
                    "warranty_ends_at": null,
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  },
                  "previous_status": "processing"
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    },
    "order.completed": {
      "post": {
        "summary": "order.completed",
        "description": "The buyer confirmed, or the order completed automatically at auto_release_at.",
        "x-description-fr": "L’acheteur a confirmé, ou la commande s’est terminée automatiquement à auto_release_at.",
        "operationId": "webhookOrderCompleted",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "order.completed"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "order.completed"
                      },
                      "data": {
                        "$ref": "#/components/schemas/OrderEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5wf9dad7c7bae197a7b4b59",
                "type": "order.completed",
                "created_at": "2026-10-26T15:54:50Z",
                "data": {
                  "order": {
                    "id": 2,
                    "number": "48292852",
                    "status": "completed",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 9999,
                    "subtotal_cents": 9999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 9999,
                    "platform_fee_cents": 999,
                    "fee_percent": 10,
                    "seller_amount_cents": 9000,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": {
                      "delivered_at": "2026-10-26T16:02:10Z",
                      "has_credentials": true,
                      "proof_count": 0
                    },
                    "dispute": null,
                    "payment_due_at": "2026-10-26T16:54:50Z",
                    "paid_at": "2026-10-26T15:54:50Z",
                    "delivery_due_at": "2026-10-26T16:24:50Z",
                    "delivered_at": "2026-10-26T16:02:10Z",
                    "auto_release_at": "2026-10-29T16:02:10Z",
                    "completed_at": "2026-10-27T09:15:00Z",
                    "warranty_ends_at": null,
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  },
                  "previous_status": "delivered"
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    },
    "order.disputed": {
      "post": {
        "summary": "order.disputed",
        "description": "The buyer opened a dispute or a warranty claim. The money is frozen.",
        "x-description-fr": "L’acheteur a ouvert un litige ou une réclamation sous garantie. L’argent est bloqué.",
        "operationId": "webhookOrderDisputed",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "order.disputed"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "order.disputed"
                      },
                      "data": {
                        "$ref": "#/components/schemas/OrderEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5wfbfdbbc287846bfda92a7",
                "type": "order.disputed",
                "created_at": "2026-10-26T15:54:50Z",
                "data": {
                  "order": {
                    "id": 2,
                    "number": "48292852",
                    "status": "disputed",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 9999,
                    "subtotal_cents": 9999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 9999,
                    "platform_fee_cents": 999,
                    "fee_percent": 10,
                    "seller_amount_cents": 9000,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": {
                      "delivered_at": "2026-10-26T16:02:10Z",
                      "has_credentials": true,
                      "proof_count": 0
                    },
                    "dispute": null,
                    "payment_due_at": "2026-10-26T16:54:50Z",
                    "paid_at": "2026-10-26T15:54:50Z",
                    "delivery_due_at": "2026-10-26T16:24:50Z",
                    "delivered_at": "2026-10-26T16:02:10Z",
                    "auto_release_at": "2026-10-29T16:02:10Z",
                    "completed_at": null,
                    "warranty_ends_at": null,
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  },
                  "previous_status": "delivered"
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    },
    "order.refunded": {
      "post": {
        "summary": "order.refunded",
        "description": "The order was refunded to the buyer.",
        "x-description-fr": "La commande a été remboursée à l’acheteur.",
        "operationId": "webhookOrderRefunded",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "order.refunded"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "order.refunded"
                      },
                      "data": {
                        "$ref": "#/components/schemas/OrderEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5wf91cac38c8cc6e9aa140a",
                "type": "order.refunded",
                "created_at": "2026-10-26T15:54:50Z",
                "data": {
                  "order": {
                    "id": 2,
                    "number": "48292852",
                    "status": "refunded",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 9999,
                    "subtotal_cents": 9999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 9999,
                    "platform_fee_cents": 999,
                    "fee_percent": 10,
                    "seller_amount_cents": 9000,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": {
                      "delivered_at": "2026-10-26T16:02:10Z",
                      "has_credentials": true,
                      "proof_count": 0
                    },
                    "dispute": null,
                    "payment_due_at": "2026-10-26T16:54:50Z",
                    "paid_at": "2026-10-26T15:54:50Z",
                    "delivery_due_at": "2026-10-26T16:24:50Z",
                    "delivered_at": "2026-10-26T16:02:10Z",
                    "auto_release_at": "2026-10-29T16:02:10Z",
                    "completed_at": null,
                    "warranty_ends_at": null,
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  },
                  "previous_status": "disputed"
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    },
    "order.cancelled": {
      "post": {
        "summary": "order.cancelled",
        "description": "The order was cancelled.",
        "x-description-fr": "La commande a été annulée.",
        "operationId": "webhookOrderCancelled",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "order.cancelled"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "order.cancelled"
                      },
                      "data": {
                        "$ref": "#/components/schemas/OrderEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5wfdf1427b62eba3b29b55a",
                "type": "order.cancelled",
                "created_at": "2026-10-26T15:54:50Z",
                "data": {
                  "order": {
                    "id": 2,
                    "number": "48292852",
                    "status": "cancelled",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 9999,
                    "subtotal_cents": 9999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 9999,
                    "platform_fee_cents": 999,
                    "fee_percent": 10,
                    "seller_amount_cents": 9000,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": null,
                    "dispute": null,
                    "payment_due_at": "2026-10-26T16:54:50Z",
                    "paid_at": "2026-10-26T15:54:50Z",
                    "delivery_due_at": "2026-10-26T16:24:50Z",
                    "delivered_at": null,
                    "auto_release_at": null,
                    "completed_at": null,
                    "warranty_ends_at": null,
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  },
                  "previous_status": "paid"
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    },
    "order.expired": {
      "post": {
        "summary": "order.expired",
        "description": "The buyer did not pay in time; the order expired and the stock is released.",
        "x-description-fr": "L’acheteur n’a pas payé à temps ; la commande a expiré et le stock est libéré.",
        "operationId": "webhookOrderExpired",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "order.expired"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "order.expired"
                      },
                      "data": {
                        "$ref": "#/components/schemas/OrderEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5wf0ed2ee2e155ad487b276",
                "type": "order.expired",
                "created_at": "2026-10-26T15:54:50Z",
                "data": {
                  "order": {
                    "id": 2,
                    "number": "48292852",
                    "status": "expired",
                    "listing": {
                      "id": 1,
                      "title": "Immortal 2 account, 42 skins",
                      "type": "account",
                      "game": "Valorant"
                    },
                    "quantity": 1,
                    "unit_price_cents": 9999,
                    "subtotal_cents": 9999,
                    "buyer_fee_cents": 0,
                    "discount_cents": 0,
                    "total_paid_cents": 9999,
                    "platform_fee_cents": 999,
                    "fee_percent": 10,
                    "seller_amount_cents": 9000,
                    "currency": "USD",
                    "buyer": {
                      "id": 2,
                      "name": "Rina"
                    },
                    "buyer_note": null,
                    "topup_fields": null,
                    "delivery": null,
                    "dispute": null,
                    "payment_due_at": "2026-10-26T16:54:50Z",
                    "paid_at": "2026-10-26T15:54:50Z",
                    "delivery_due_at": "2026-10-26T16:24:50Z",
                    "delivered_at": null,
                    "auto_release_at": null,
                    "completed_at": null,
                    "warranty_ends_at": null,
                    "created_at": "2026-10-26T15:54:50Z",
                    "updated_at": "2026-10-26T15:54:50Z"
                  },
                  "previous_status": "pending_payment"
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    },
    "message.created": {
      "post": {
        "summary": "message.created",
        "description": "The buyer sent a message in an order chat. Your own messages and system messages are not sent.",
        "x-description-fr": "L’acheteur a envoyé un message dans la messagerie d’une commande. Vos propres messages et les messages système ne sont pas envoyés.",
        "operationId": "webhookMessageCreated",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "message.created"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "message.created"
                      },
                      "data": {
                        "$ref": "#/components/schemas/MessageEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5wf2a8c4k1x9t3hq7r0vz6n",
                "type": "message.created",
                "created_at": "2026-10-26T15:54:50Z",
                "data": {
                  "order": {
                    "id": 2,
                    "number": "48292852",
                    "status": "processing"
                  },
                  "message": {
                    "id": 3,
                    "order_id": 2,
                    "sender": {
                      "id": 2,
                      "name": "Rina",
                      "role": "buyer"
                    },
                    "body": "Hi! Is the account ready?",
                    "is_system": false,
                    "attachments": [],
                    "read_at": null,
                    "created_at": "2026-10-26T15:54:50Z"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    },
    "dispute.created": {
      "post": {
        "summary": "dispute.created",
        "description": "A dispute or a warranty claim was opened on one of your orders (usually by the buyer). Sent once per dispute, followed by a dispute.updated for the same change. Fetch the case with GET /disputes/{id}.",
        "x-description-fr": "Un litige ou une réclamation sous garantie a été ouvert sur l’une de vos commandes (généralement par l’acheteur). Envoyé une fois par litige, suivi d’un dispute.updated pour le même changement. Consultez le dossier avec GET /disputes/{id}.",
        "operationId": "webhookDisputeCreated",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "dispute.created"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "dispute.created"
                      },
                      "data": {
                        "$ref": "#/components/schemas/DisputeEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5xsx3ng8f7xxrrennrv9dtd",
                "type": "dispute.created",
                "created_at": "2026-10-27T12:26:56Z",
                "data": {
                  "dispute": {
                    "id": 1,
                    "order": {
                      "id": 3,
                      "number": "48296203",
                      "status": "disputed",
                      "listing_title": "Immortal 2 account, 42 skins",
                      "total_paid_cents": 11999
                    },
                    "status": "awaiting_seller",
                    "awaiting": "seller",
                    "opener_role": "buyer",
                    "category": "not_as_described",
                    "category_label": "Not as described",
                    "reason": "The rank is Ascendant 3, not Immortal 2 as the listing said.",
                    "requested_outcome": "partial_refund",
                    "requested_amount_cents": 5000,
                    "pending_offer": null,
                    "resolution": null,
                    "resolved_amount_cents": null,
                    "resolution_note": null,
                    "currency": "USD",
                    "escalated_at": null,
                    "resolved_at": null,
                    "created_at": "2026-10-27T12:26:56Z",
                    "updated_at": "2026-10-27T12:26:56Z",
                    "offer_count": 0
                  },
                  "order": {
                    "id": 3,
                    "number": "48296203",
                    "status": "disputed"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    },
    "dispute.updated": {
      "post": {
        "summary": "dispute.updated",
        "description": "A dispute on one of your orders was opened or changed status. One event per dispute change.",
        "x-description-fr": "Un litige sur l’une de vos commandes a été ouvert ou a changé de statut. Un événement par changement.",
        "operationId": "webhookDisputeUpdated",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "dispute.updated"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "dispute.updated"
                      },
                      "data": {
                        "$ref": "#/components/schemas/DisputeEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5wf3q1n7d2b5y8kx4c9t0re",
                "type": "dispute.updated",
                "created_at": "2026-10-26T15:54:50Z",
                "data": {
                  "dispute": {
                    "id": 1,
                    "order": {
                      "id": 3,
                      "number": "48296203",
                      "status": "disputed",
                      "listing_title": "Immortal 2 account, 42 skins",
                      "total_paid_cents": 11999
                    },
                    "status": "escalated",
                    "awaiting": "admin",
                    "opener_role": "buyer",
                    "category": "not_as_described",
                    "category_label": "Not as described",
                    "reason": "The rank is Ascendant 3, not Immortal 2 as the listing said.",
                    "requested_outcome": "partial_refund",
                    "requested_amount_cents": 5000,
                    "pending_offer": null,
                    "resolution": null,
                    "resolved_amount_cents": null,
                    "resolution_note": null,
                    "currency": "USD",
                    "escalated_at": "2026-10-27T13:05:12Z",
                    "resolved_at": null,
                    "created_at": "2026-10-27T12:26:56Z",
                    "updated_at": "2026-10-27T13:05:12Z",
                    "offer_count": 0
                  },
                  "order": {
                    "id": 3,
                    "number": "48296203",
                    "status": "disputed"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    },
    "listing.sold_out": {
      "post": {
        "summary": "listing.sold_out",
        "description": "An order took the last unit of stock of a listing; it is now sold_out.",
        "x-description-fr": "Une commande a pris la dernière unité en stock d’une annonce ; elle est maintenant sold_out.",
        "operationId": "webhookListingSoldOut",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "listing.sold_out"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "listing.sold_out"
                      },
                      "data": {
                        "$ref": "#/components/schemas/ListingSoldOutEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5wf4d6p2s8z1w5ja3n7k9qb",
                "type": "listing.sold_out",
                "created_at": "2026-10-26T15:54:50Z",
                "data": {
                  "listing": {
                    "id": 1,
                    "title": "Immortal 2 account, 42 skins",
                    "type": "account",
                    "status": "sold_out",
                    "stock": 0,
                    "price_cents": 9999,
                    "currency": "USD"
                  },
                  "order": {
                    "id": 2,
                    "number": "48292852"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    },
    "ping": {
      "post": {
        "summary": "ping",
        "description": "Sent only by the “Send test” button or POST /webhooks/{webhook}/test. Always delivered, whatever events you chose.",
        "x-description-fr": "Envoyé uniquement par le bouton « Envoyer un test » ou POST /webhooks/{webhook}/test. Toujours envoyé, quels que soient vos événements.",
        "operationId": "webhookPing",
        "tags": [
          "Webhooks"
        ],
        "security": [],
        "parameters": [
          {
            "name": "MythicDeals-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "t=1792857290,v1=5f1c…",
            "description": "`t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>`.",
            "x-description-fr": "`t=<heure unix>,v1=<HMAC-SHA256 hexadécimal de \"<t>.<corps brut>\" avec le secret de l’endpoint>`."
          },
          {
            "name": "MythicDeals-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "ping"
            },
            "description": "Event type.",
            "x-description-fr": "Type d’événement."
          },
          {
            "name": "MythicDeals-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "dlv_01m5weqvzdvzns8870e41gv24h",
            "description": "Unique per endpoint and event; the same on every retry. Use it to drop duplicates.",
            "x-description-fr": "Unique par endpoint et par événement ; identique à chaque nouvelle tentative. Servez-vous-en pour ignorer les doublons."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WebhookEvent"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "ping"
                      },
                      "data": {
                        "$ref": "#/components/schemas/PingEventData"
                      }
                    }
                  }
                ]
              },
              "example": {
                "id": "evt_01m5weqvzcma48d9m8tfm3bjv9",
                "type": "ping",
                "created_at": "2026-10-26T15:54:50Z",
                "data": {
                  "message": "Webhook test from MythicDeals.",
                  "endpoint_id": 1
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Any 2xx within 10 seconds = delivered.",
            "x-description-fr": "Tout code 2xx en moins de 10 secondes = livré."
          },
          "default": {
            "description": "Anything else (or a timeout) is retried with backoff.",
            "x-description-fr": "Toute autre réponse (ou un délai dépassé) est retentée avec un délai croissant."
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "go_<48 characters>",
        "description": "Personal API token created at http://localhost:8000/settings/api. Each operation lists the scopes it needs in `x-scopes` and in its security requirement.",
        "x-description-fr": "Jeton API personnel créé sur http://localhost:8000/settings/api. Chaque opération indique les scopes requis dans `x-scopes` et dans son exigence de sécurité."
      }
    },
    "parameters": {
      "IdempotencyKey": {
        "name": "Idempotency-Key",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string",
          "maxLength": 255
        },
        "description": "Any unique string (e.g. a UUID), max 255 characters. For 24 hours the same key on the same endpoint returns the stored response (header Idempotent-Replayed: true). Same key with a different body → 409 idempotency_conflict.",
        "x-description-fr": "Une chaîne unique (par ex. un UUID), 255 caractères maximum. Pendant 24 heures, la même clé sur le même endpoint renvoie la réponse enregistrée (en-tête Idempotent-Replayed: true). Même clé avec un autre contenu → 409 idempotency_conflict.",
        "example": "7f3c2a9e-1b4d-4c6a-9f00-2d8e5b1a7c41"
      }
    },
    "headers": {
      "X-RateLimit-Limit": {
        "description": "Requests allowed per minute.",
        "schema": {
          "type": "integer"
        },
        "example": 120
      },
      "X-RateLimit-Remaining": {
        "description": "Requests left in the current minute.",
        "schema": {
          "type": "integer"
        },
        "example": 119
      },
      "X-RateLimit-Reset": {
        "description": "Unix time when the limit resets (on 429).",
        "schema": {
          "type": "integer"
        }
      },
      "Retry-After": {
        "description": "Seconds to wait before retrying (on 429).",
        "schema": {
          "type": "integer"
        },
        "example": 42
      },
      "Idempotent-Replayed": {
        "description": "\"true\" when this response was replayed for a repeated Idempotency-Key.",
        "schema": {
          "type": "string",
          "enum": [
            "true"
          ]
        }
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Bad request, e.g. `invalid_idempotency_key` (key longer than 255 characters).",
        "x-description-fr": "Requête invalide, par ex. `invalid_idempotency_key` (clé de plus de 255 caractères).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "invalid_idempotency_key",
                "message": "Idempotency-Key must be at most 255 characters."
              }
            }
          }
        }
      },
      "Unauthenticated": {
        "description": "`unauthenticated`: the token is missing, invalid, expired or revoked.",
        "x-description-fr": "`unauthenticated` : jeton absent, invalide, expiré ou révoqué.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "unauthenticated",
                "message": "Missing, invalid, expired or revoked API token."
              }
            }
          }
        }
      },
      "Forbidden": {
        "description": "`insufficient_scope` (with `required_scope`), `seller_not_verified`, `email_not_verified` or `account_suspended`.",
        "x-description-fr": "`insufficient_scope` (avec `required_scope`), `seller_not_verified`, `email_not_verified` ou `account_suspended`.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "insufficient_scope",
                "message": "This token is missing the \"listings:read\" scope.",
                "required_scope": "listings:read"
              }
            }
          }
        }
      },
      "NotFound": {
        "description": "`not_found`: it does not exist or belongs to someone else.",
        "x-description-fr": "`not_found` : la ressource n’existe pas ou appartient à quelqu’un d’autre.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "not_found",
                "message": "Listing not found."
              }
            }
          }
        }
      },
      "Conflict": {
        "description": "`conflict` (the action is not possible in the current state), `chat_closed`, `preview_expired` (CSV import), `idempotency_conflict` or `idempotency_in_progress`.",
        "x-description-fr": "`conflict` (action impossible dans l’état actuel), `chat_closed`, `preview_expired` (import CSV), `idempotency_conflict` ou `idempotency_in_progress`.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "conflict",
                "message": "This listing was removed and can no longer be changed."
              }
            }
          }
        }
      },
      "ValidationFailed": {
        "description": "Validation failed. Laravel format: a message and errors per field.",
        "x-description-fr": "Échec de validation. Format Laravel : un message et les erreurs par champ.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ValidationError"
            },
            "example": {
              "message": "Title is too short — at least 10 characters.",
              "errors": {
                "title": [
                  "Title is too short — at least 10 characters."
                ]
              }
            }
          }
        }
      },
      "RateLimited": {
        "description": "`rate_limited`: too many requests. Wait `Retry-After` seconds.",
        "x-description-fr": "`rate_limited` : trop de requêtes. Attendez `Retry-After` secondes.",
        "headers": {
          "Retry-After": {
            "$ref": "#/components/headers/Retry-After"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/X-RateLimit-Reset"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/X-RateLimit-Limit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/X-RateLimit-Remaining"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "rate_limited",
                "message": "Too many requests. Slow down and retry after the Retry-After header."
              }
            }
          }
        }
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "Stable, snake_case. Branch on this, not on the message.",
                "x-description-fr": "Stable, en snake_case. Basez-vous sur ce code, pas sur le message."
              },
              "message": {
                "type": "string",
                "description": "Human-readable explanation (English).",
                "x-description-fr": "Explication lisible (en anglais)."
              },
              "required_scope": {
                "type": "string",
                "description": "Only for insufficient_scope.",
                "x-description-fr": "Uniquement pour insufficient_scope."
              }
            }
          }
        }
      },
      "ValidationError": {
        "type": "object",
        "required": [
          "message",
          "errors"
        ],
        "properties": {
          "message": {
            "type": "string"
          },
          "errors": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "PaginationLinks": {
        "type": "object",
        "properties": {
          "first": {
            "type": "string",
            "format": "uri"
          },
          "last": {
            "type": "string",
            "format": "uri"
          },
          "prev": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          }
        }
      },
      "PaginationMeta": {
        "type": "object",
        "required": [
          "current_page",
          "last_page",
          "per_page",
          "total"
        ],
        "properties": {
          "current_page": {
            "type": "integer"
          },
          "from": {
            "type": [
              "integer",
              "null"
            ]
          },
          "last_page": {
            "type": "integer"
          },
          "links": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "url": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "label": {
                  "type": "string"
                },
                "page": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "active": {
                  "type": "boolean"
                }
              }
            }
          },
          "path": {
            "type": "string",
            "format": "uri"
          },
          "per_page": {
            "type": "integer"
          },
          "to": {
            "type": [
              "integer",
              "null"
            ]
          },
          "total": {
            "type": "integer"
          }
        }
      },
      "Me": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "is_seller": {
            "type": "boolean",
            "description": "true for a verified seller.",
            "x-description-fr": "true pour un vendeur vérifié."
          },
          "store": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "name": {
                "type": "string"
              },
              "slug": {
                "type": "string"
              }
            }
          },
          "token": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "prefix": {
                "type": "string"
              },
              "scopes": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "catalog:read",
                    "listings:read",
                    "listings:write",
                    "orders:read",
                    "orders:write",
                    "messages:read",
                    "messages:write",
                    "wallet:read",
                    "webhooks:write",
                    "disputes:read",
                    "disputes:write",
                    "notifications:read",
                    "notifications:write",
                    "account:read",
                    "account:write",
                    "boosting:read",
                    "boosting:write"
                  ]
                }
              },
              "expires_at": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              }
            }
          }
        }
      },
      "Game": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "icon_url": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "types": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "account",
                "currency",
                "item",
                "boosting",
                "giftcard"
              ]
            }
          },
          "categories_count": {
            "type": "integer"
          }
        }
      },
      "GameCategory": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "game_id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "account",
              "currency",
              "item",
              "boosting",
              "giftcard"
            ],
            "description": "Type of listings created in this category.",
            "x-description-fr": "Type des annonces créées dans cette catégorie."
          },
          "supports_instant_delivery": {
            "type": "boolean"
          },
          "supports_topup_delivery": {
            "type": "boolean"
          },
          "attributes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CategoryAttribute"
            },
            "description": "Only with include=attributes.",
            "x-description-fr": "Uniquement avec include=attributes."
          }
        }
      },
      "CategoryAttribute": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "select",
              "multiselect",
              "number",
              "boolean",
              "text"
            ],
            "description": "multiselect: send an array of options; text: options are suggestions only.",
            "x-description-fr": "multiselect : envoyez un tableau d’options ; text : les options ne sont que des suggestions."
          },
          "options": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          },
          "ordered": {
            "type": "boolean"
          },
          "required": {
            "type": "boolean"
          },
          "filterable": {
            "type": "boolean"
          },
          "min": {
            "type": [
              "integer",
              "null"
            ]
          },
          "max": {
            "type": [
              "integer",
              "null"
            ]
          },
          "unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "show_on_card": {
            "type": "boolean"
          },
          "sort_order": {
            "type": "integer"
          }
        }
      },
      "Listing": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "active",
              "paused",
              "sold_out",
              "removed"
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "account",
              "currency",
              "item",
              "boosting",
              "giftcard"
            ]
          },
          "game": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "integer"
                  },
                  "slug": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "category": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "integer"
                  },
                  "slug": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "price_cents": {
            "type": "integer",
            "description": "Price per unit in USD cents.",
            "x-description-fr": "Prix unitaire en centimes USD."
          },
          "currency": {
            "type": "string",
            "const": "USD"
          },
          "input_price": {
            "type": "object",
            "description": "The price as the seller typed it, before conversion.",
            "x-description-fr": "Le prix tel que saisi par le vendeur, avant conversion.",
            "properties": {
              "amount": {
                "type": "string"
              },
              "currency": {
                "type": "string"
              }
            }
          },
          "stock": {
            "type": "integer"
          },
          "min_quantity": {
            "type": "integer"
          },
          "delivery_eta_minutes": {
            "type": "integer"
          },
          "warranty_days": {
            "type": "integer"
          },
          "instant_delivery": {
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "units": {
                "type": "integer"
              }
            }
          },
          "topup": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "provider": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sku": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "attributes": {
            "type": "object",
            "additionalProperties": {
              "type": [
                "string",
                "integer",
                "boolean",
                "null"
              ]
            }
          },
          "images": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ListingImage"
            }
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public page of the listing.",
            "x-description-fr": "Page publique de l’annonce."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ListingCreate": {
        "type": "object",
        "required": [
          "game_id",
          "game_category_id",
          "title"
        ],
        "properties": {
          "game_id": {
            "type": "integer",
            "description": "Game id (GET /games).",
            "x-description-fr": "Identifiant du jeu (GET /games)."
          },
          "game_category_id": {
            "type": "integer",
            "description": "Category id of that game. Decides the listing type.",
            "x-description-fr": "Identifiant de catégorie de ce jeu. Détermine le type de l’annonce."
          },
          "title": {
            "type": "string",
            "minLength": 10,
            "maxLength": 160,
            "description": "Title, 10–160 characters.",
            "x-description-fr": "Titre, de 10 à 160 caractères."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 5000,
            "description": "Description, up to 5000 characters.",
            "x-description-fr": "Description, 5000 caractères maximum."
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "active"
            ],
            "description": "Default draft.",
            "x-description-fr": "Par défaut draft."
          },
          "price_cents": {
            "type": "integer",
            "minimum": 100,
            "maximum": 5000000,
            "description": "Price in USD cents. Send this OR price + currency.",
            "x-description-fr": "Prix en centimes USD. Envoyez ceci OU price + currency."
          },
          "price": {
            "type": [
              "number",
              "string"
            ],
            "description": "Price as typed in `currency` (e.g. \"119.99\" or 166000). Converted to USD cents.",
            "x-description-fr": "Prix tel que saisi dans `currency` (par ex. \"119.99\" ou 166000). Converti en centimes USD."
          },
          "currency": {
            "type": "string",
            "enum": [
              "USD",
              "IDR",
              "EUR",
              "GBP",
              "PHP",
              "BRL",
              "INR",
              "MYR"
            ],
            "default": "USD",
            "description": "Currency of `price`.",
            "x-description-fr": "Devise de `price`."
          },
          "stock": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9999,
            "description": "Quantity for sale. Required, except with auto_delivery (= number of units) and for gift cards (always = number of codes).",
            "x-description-fr": "Quantité en vente. Obligatoire, sauf avec auto_delivery (= nombre d’unités) et pour les cartes cadeaux (toujours = nombre de codes)."
          },
          "delivery_eta_minutes": {
            "type": "integer",
            "minimum": 5,
            "maximum": 20160,
            "description": "Promised delivery time in minutes (5 min – 14 days). Required, except for gift cards (default 5).",
            "x-description-fr": "Délai de livraison promis en minutes (5 min – 14 jours). Obligatoire, sauf pour les cartes cadeaux (5 par défaut)."
          },
          "warranty_days": {
            "type": "integer",
            "enum": [
              0,
              3,
              7,
              30
            ],
            "default": 0,
            "description": "Warranty in days. Always 0 for gift cards.",
            "x-description-fr": "Garantie en jours. Toujours 0 pour les cartes cadeaux."
          },
          "attributes": {
            "type": "object",
            "additionalProperties": {
              "type": [
                "string",
                "integer",
                "boolean"
              ]
            },
            "description": "Category attributes {key: value}. See GET /categories/{id}/attributes.",
            "x-description-fr": "Attributs de la catégorie {clé: valeur}. Voir GET /categories/{id}/attributes."
          },
          "auto_delivery": {
            "type": "boolean",
            "description": "Turn instant delivery on (account and item listings). Requires delivery_units. Gift cards are always instant; the flag is ignored for them.",
            "x-description-fr": "Active la livraison instantanée (annonces de compte et d’objet). Nécessite delivery_units. Les cartes cadeaux sont toujours instantanées ; l’option est ignorée pour elles."
          },
          "delivery_units": {
            "type": "array",
            "maxItems": 200,
            "items": {
              "$ref": "#/components/schemas/DeliveryUnitInput"
            },
            "description": "Instant-delivery units; one unit = one item of stock. Accounts: username + password (+ email, note). Items: note. Gift cards: code (+ pin, expires_at YYYY-MM-DD) — at least one code unless the listing is a draft.",
            "x-description-fr": "Unités de livraison instantanée ; une unité = un article en stock. Comptes : username + password (+ email, note). Objets : note. Cartes cadeaux : code (+ pin, expires_at AAAA-MM-JJ) — au moins un code, sauf pour un brouillon."
          },
          "topup_provider": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "digiflazz",
              null
            ],
            "description": "Top-up supplier for automatic delivery (currency categories only; connect it on the website first).",
            "x-description-fr": "Fournisseur de recharge pour la livraison automatique (catégories de devises uniquement ; connectez-le d’abord sur le site)."
          },
          "topup_sku": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 80,
            "pattern": "^[A-Za-z0-9_\\-\\.]+$",
            "description": "Supplier SKU. Required with topup_provider.",
            "x-description-fr": "Référence (SKU) du fournisseur. Obligatoire avec topup_provider."
          }
        }
      },
      "ListingUpdate": {
        "type": "object",
        "properties": {
          "game_id": {
            "type": "integer",
            "description": "Game id. If you send only game_category_id, the game is taken from the category.",
            "x-description-fr": "Identifiant du jeu. Si vous n’envoyez que game_category_id, le jeu est déduit de la catégorie."
          },
          "game_category_id": {
            "type": "integer",
            "description": "Category id of that game. Decides the listing type.",
            "x-description-fr": "Identifiant de catégorie de ce jeu. Détermine le type de l’annonce."
          },
          "title": {
            "type": "string",
            "minLength": 10,
            "maxLength": 160,
            "description": "Title, 10–160 characters.",
            "x-description-fr": "Titre, de 10 à 160 caractères."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 5000,
            "description": "Description, up to 5000 characters.",
            "x-description-fr": "Description, 5000 caractères maximum."
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "active",
              "paused"
            ],
            "description": "New status.",
            "x-description-fr": "Nouveau statut."
          },
          "price_cents": {
            "type": "integer",
            "minimum": 100,
            "maximum": 5000000,
            "description": "Price in USD cents. Send this OR price + currency.",
            "x-description-fr": "Prix en centimes USD. Envoyez ceci OU price + currency."
          },
          "price": {
            "type": [
              "number",
              "string"
            ],
            "description": "Price as typed in `currency` (e.g. \"119.99\" or 166000). Converted to USD cents.",
            "x-description-fr": "Prix tel que saisi dans `currency` (par ex. \"119.99\" ou 166000). Converti en centimes USD."
          },
          "currency": {
            "type": "string",
            "enum": [
              "USD",
              "IDR",
              "EUR",
              "GBP",
              "PHP",
              "BRL",
              "INR",
              "MYR"
            ],
            "default": "USD",
            "description": "Currency of `price`.",
            "x-description-fr": "Devise de `price`."
          },
          "stock": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9999,
            "description": "Quantity for sale. Not for listings whose stock follows units (instant delivery, gift cards).",
            "x-description-fr": "Quantité en vente. Pas pour les annonces dont le stock suit les unités (livraison instantanée, cartes cadeaux)."
          },
          "delivery_eta_minutes": {
            "type": "integer",
            "minimum": 5,
            "maximum": 20160,
            "description": "Promised delivery time in minutes (5 min – 14 days).",
            "x-description-fr": "Délai de livraison promis en minutes (5 min – 14 jours)."
          },
          "warranty_days": {
            "type": "integer",
            "enum": [
              0,
              3,
              7,
              30
            ],
            "default": 0,
            "description": "Warranty in days. Always 0 for gift cards.",
            "x-description-fr": "Garantie en jours. Toujours 0 pour les cartes cadeaux."
          },
          "attributes": {
            "type": "object",
            "additionalProperties": {
              "type": [
                "string",
                "integer",
                "boolean"
              ]
            },
            "description": "Category attributes {key: value}. See GET /categories/{id}/attributes.",
            "x-description-fr": "Attributs de la catégorie {clé: valeur}. Voir GET /categories/{id}/attributes."
          },
          "auto_delivery": {
            "type": "boolean",
            "description": "true + delivery_units replaces all units; false turns instant delivery off and deletes the units. delivery_units are only read when auto_delivery is sent — for gift cards send auto_delivery: true with the new codes.",
            "x-description-fr": "true + delivery_units remplace toutes les unités ; false désactive la livraison instantanée et supprime les unités. delivery_units n’est lu que si auto_delivery est envoyé — pour les cartes cadeaux, envoyez auto_delivery: true avec les nouveaux codes."
          },
          "delivery_units": {
            "type": "array",
            "maxItems": 200,
            "items": {
              "$ref": "#/components/schemas/DeliveryUnitInput"
            },
            "description": "Instant-delivery units; one unit = one item of stock. Accounts: username + password (+ email, note). Items: note. Gift cards: code (+ pin, expires_at YYYY-MM-DD) — at least one code unless the listing is a draft.",
            "x-description-fr": "Unités de livraison instantanée ; une unité = un article en stock. Comptes : username + password (+ email, note). Objets : note. Cartes cadeaux : code (+ pin, expires_at AAAA-MM-JJ) — au moins un code, sauf pour un brouillon."
          },
          "topup_provider": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "digiflazz",
              null
            ],
            "description": "Top-up supplier for automatic delivery (currency categories only; connect it on the website first).",
            "x-description-fr": "Fournisseur de recharge pour la livraison automatique (catégories de devises uniquement ; connectez-le d’abord sur le site)."
          },
          "topup_sku": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 80,
            "pattern": "^[A-Za-z0-9_\\-\\.]+$",
            "description": "Supplier SKU. Required with topup_provider.",
            "x-description-fr": "Référence (SKU) du fournisseur. Obligatoire avec topup_provider."
          }
        }
      },
      "ListingImage": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "thumb_url": {
            "type": "string",
            "format": "uri"
          },
          "width": {
            "type": [
              "integer",
              "null"
            ]
          },
          "height": {
            "type": [
              "integer",
              "null"
            ]
          },
          "position": {
            "type": "integer",
            "description": "0 = cover.",
            "x-description-fr": "0 = couverture."
          }
        }
      },
      "ImagesMeta": {
        "type": "object",
        "properties": {
          "max_images": {
            "type": "integer"
          },
          "max_kb": {
            "type": "integer",
            "description": "Max size per file in KB.",
            "x-description-fr": "Taille maximale par fichier en Ko."
          }
        }
      },
      "DeliveryUnitInput": {
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "maxLength": 160,
            "description": "Login (accounts).",
            "x-description-fr": "Identifiant (comptes)."
          },
          "password": {
            "type": "string",
            "maxLength": 160,
            "description": "Password (accounts).",
            "x-description-fr": "Mot de passe (comptes)."
          },
          "email": {
            "type": "string",
            "maxLength": 160,
            "description": "Email of the account (optional).",
            "x-description-fr": "E-mail du compte (facultatif)."
          },
          "note": {
            "type": "string",
            "maxLength": 1000,
            "description": "Free text, e.g. a code or instructions.",
            "x-description-fr": "Texte libre, par ex. un code ou des instructions."
          },
          "code": {
            "type": "string",
            "maxLength": 255,
            "description": "Gift card code (gift cards only, required for them).",
            "x-description-fr": "Code de la carte cadeau (cartes cadeaux uniquement, obligatoire pour elles)."
          },
          "pin": {
            "type": "string",
            "maxLength": 64,
            "description": "Gift card PIN, if any.",
            "x-description-fr": "Code PIN de la carte cadeau, le cas échéant."
          },
          "expires_at": {
            "type": "string",
            "format": "date",
            "description": "Gift card expiry, YYYY-MM-DD, not in the past.",
            "x-description-fr": "Expiration de la carte cadeau, AAAA-MM-JJ, pas dans le passé."
          }
        }
      },
      "DeliveryUnit": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable id of the unit.",
            "x-description-fr": "Identifiant stable de l’unité."
          },
          "preview": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Masked values, e.g. \"ga•••ne\".",
            "x-description-fr": "Valeurs masquées, par ex. \"ga•••ne\"."
          }
        }
      },
      "UnitsMeta": {
        "type": "object",
        "properties": {
          "listing_id": {
            "type": "integer"
          },
          "instant_delivery": {
            "type": "boolean"
          },
          "count": {
            "type": "integer"
          },
          "reserved": {
            "type": "integer",
            "description": "Units held by orders not delivered yet.",
            "x-description-fr": "Unités réservées par des commandes pas encore livrées."
          },
          "stock": {
            "type": "integer"
          },
          "max_units": {
            "type": "integer"
          },
          "added": {
            "type": "integer",
            "description": "POST only.",
            "x-description-fr": "POST uniquement."
          },
          "skipped_duplicates": {
            "type": "integer",
            "description": "POST only.",
            "x-description-fr": "POST uniquement."
          }
        }
      },
      "BulkUpdate": {
        "type": "object",
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 100,
            "description": "Up to 100 changes; each needs `id` and at least one of price_cents, stock, status.",
            "x-description-fr": "100 modifications maximum ; chacune nécessite `id` et au moins un champ parmi price_cents, stock, status.",
            "items": {
              "type": "object",
              "required": [
                "id"
              ],
              "properties": {
                "id": {
                  "type": "integer"
                },
                "price_cents": {
                  "type": "integer",
                  "minimum": 100,
                  "maximum": 5000000
                },
                "stock": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9999
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "draft",
                    "active",
                    "paused"
                  ]
                }
              }
            }
          },
          "atomic": {
            "type": "boolean",
            "default": false,
            "description": "true: save nothing if any item fails.",
            "x-description-fr": "true : rien n’est enregistré si un élément échoue."
          }
        }
      },
      "BulkItemResult": {
        "type": "object",
        "required": [
          "id",
          "ok"
        ],
        "properties": {
          "id": {
            "type": "integer"
          },
          "ok": {
            "type": "boolean"
          },
          "listing": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              },
              "status": {
                "type": "string"
              },
              "price_cents": {
                "type": "integer"
              },
              "currency": {
                "type": "string",
                "const": "USD"
              },
              "stock": {
                "type": "integer"
              },
              "updated_at": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "not_found",
                  "duplicate_item",
                  "conflict",
                  "validation_failed",
                  "stock_managed_by_units",
                  "rolled_back"
                ]
              },
              "message": {
                "type": "string"
              },
              "fields": {
                "type": "object",
                "additionalProperties": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "BulkResult": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BulkItemResult"
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "total": {
                "type": "integer"
              },
              "updated": {
                "type": "integer"
              },
              "failed": {
                "type": "integer"
              }
            }
          }
        }
      },
      "BulkFailed": {
        "type": "object",
        "required": [
          "error",
          "data"
        ],
        "properties": {
          "error": {
            "$ref": "#/components/schemas/Error/properties/error"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BulkItemResult"
            }
          }
        }
      },
      "Order": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "number": {
            "type": "string",
            "description": "Order number, 8 digits (shown as #48291735).",
            "x-description-fr": "Numéro de commande, 8 chiffres (affiché #48291735)."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending_payment",
              "paid",
              "processing",
              "delivered",
              "completed",
              "disputed",
              "refunded",
              "expired",
              "cancelled"
            ]
          },
          "listing": {
            "type": "object",
            "description": "Snapshot taken when the order was placed.",
            "x-description-fr": "Instantané pris au moment de la commande.",
            "properties": {
              "id": {
                "type": "integer"
              },
              "title": {
                "type": "string"
              },
              "type": {
                "type": "string"
              },
              "game": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "quantity": {
            "type": "integer"
          },
          "unit_price_cents": {
            "type": "integer"
          },
          "subtotal_cents": {
            "type": "integer"
          },
          "buyer_fee_cents": {
            "type": "integer"
          },
          "discount_cents": {
            "type": "integer"
          },
          "total_paid_cents": {
            "type": "integer",
            "description": "What the buyer paid.",
            "x-description-fr": "Ce que l’acheteur a payé."
          },
          "platform_fee_cents": {
            "type": "integer"
          },
          "fee_percent": {
            "type": [
              "number",
              "null"
            ]
          },
          "seller_amount_cents": {
            "type": "integer",
            "description": "What you receive when the order completes.",
            "x-description-fr": "Ce que vous recevez quand la commande est terminée."
          },
          "currency": {
            "type": "string",
            "const": "USD"
          },
          "buyer": {
            "type": "object",
            "description": "Seller view only.",
            "x-description-fr": "Vue vendeur uniquement.",
            "properties": {
              "id": {
                "type": "integer"
              },
              "name": {
                "type": "string"
              }
            }
          },
          "buyer_note": {
            "type": [
              "string",
              "null"
            ],
            "description": "Seller view only.",
            "x-description-fr": "Vue vendeur uniquement."
          },
          "topup_fields": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {
              "type": "string"
            },
            "description": "Seller view only: details the buyer entered (e.g. player_id) for top-ups.",
            "x-description-fr": "Vue vendeur uniquement : informations saisies par l’acheteur (par ex. player_id) pour les recharges."
          },
          "delivery_fields": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "roblox_username": {
                "type": "string"
              },
              "roblox_user_id": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "roblox_display_name": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "description": "Seller view only: where to deliver (e.g. the buyer's Roblox username for Roblox games), checked on Roblox at checkout.",
            "x-description-fr": "Vue vendeur uniquement : où livrer (par ex. le nom d’utilisateur Roblox de l’acheteur), vérifié sur Roblox au paiement."
          },
          "correction_requested_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Seller view only: you asked the buyer to fix their delivery details.",
            "x-description-fr": "Vue vendeur uniquement : vous avez demandé à l’acheteur de corriger ses informations."
          },
          "seller": {
            "type": "object",
            "description": "Buyer view only.",
            "x-description-fr": "Vue acheteur uniquement.",
            "properties": {
              "id": {
                "type": "integer"
              },
              "store_name": {
                "type": "string"
              }
            }
          },
          "delivery": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/OrderDelivery"
              },
              {
                "type": "null"
              }
            ]
          },
          "dispute": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "id": {
                "type": "integer"
              },
              "status": {
                "type": "string"
              }
            }
          },
          "payment_due_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "paid_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "delivery_due_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "delivered_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "auto_release_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "When the order completes automatically if the buyer does nothing.",
            "x-description-fr": "Date à laquelle la commande se termine automatiquement si l’acheteur ne fait rien."
          },
          "completed_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "warranty_ends_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "OrderDelivery": {
        "type": "object",
        "properties": {
          "delivered_at": {
            "type": "string",
            "format": "date-time"
          },
          "has_credentials": {
            "type": "boolean"
          },
          "proof_count": {
            "type": "integer"
          },
          "credentials": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Only for the buyer, on GET /orders/{order}.",
            "x-description-fr": "Uniquement pour l’acheteur, sur GET /orders/{order}."
          }
        }
      },
      "DeliveryInput": {
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "maxLength": 160,
            "description": "Login (accounts).",
            "x-description-fr": "Identifiant (comptes)."
          },
          "password": {
            "type": "string",
            "maxLength": 160,
            "description": "Password (accounts).",
            "x-description-fr": "Mot de passe (comptes)."
          },
          "email": {
            "type": "string",
            "maxLength": 160,
            "description": "Email of the account (optional).",
            "x-description-fr": "E-mail du compte (facultatif)."
          },
          "note": {
            "type": "string",
            "maxLength": 1000,
            "description": "Free text, e.g. a code or instructions.",
            "x-description-fr": "Texte libre, par ex. un code ou des instructions."
          }
        }
      },
      "Message": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "order_id": {
            "type": "integer"
          },
          "sender": {
            "type": "object",
            "properties": {
              "id": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "name": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "role": {
                "type": "string",
                "enum": [
                  "buyer",
                  "seller",
                  "system"
                ]
              }
            }
          },
          "body": {
            "type": [
              "string",
              "null"
            ]
          },
          "is_system": {
            "type": "boolean"
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer"
                },
                "name": {
                  "type": "string"
                },
                "mime": {
                  "type": "string"
                },
                "size": {
                  "type": "integer"
                },
                "is_image": {
                  "type": "boolean"
                },
                "width": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "height": {
                  "type": [
                    "integer",
                    "null"
                  ]
                }
              }
            }
          },
          "read_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "MessagesMeta": {
        "type": "object",
        "properties": {
          "per_page": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "next_since_id": {
            "type": "integer"
          }
        }
      },
      "Wallet": {
        "type": "object",
        "properties": {
          "available_cents": {
            "type": "integer",
            "description": "Withdrawable now.",
            "x-description-fr": "Retirable maintenant."
          },
          "pending_cents": {
            "type": "integer",
            "description": "Not released yet (includes warranty_held_cents).",
            "x-description-fr": "Pas encore libéré (inclut warranty_held_cents)."
          },
          "frozen_cents": {
            "type": "integer",
            "description": "Held by open disputes.",
            "x-description-fr": "Bloqué par des litiges ouverts."
          },
          "warranty_held_cents": {
            "type": "integer",
            "description": "Completed orders still under warranty.",
            "x-description-fr": "Commandes terminées encore sous garantie."
          },
          "currency": {
            "type": "string",
            "const": "USD"
          }
        }
      },
      "LedgerEntry": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "type": {
            "type": "string",
            "enum": [
              "sale_credit",
              "refund_debit",
              "withdrawal_debit",
              "withdrawal_revert",
              "adjustment",
              "affiliate_commission"
            ]
          },
          "amount_cents": {
            "type": "integer",
            "description": "Positive = credit, negative = debit.",
            "x-description-fr": "Positif = crédit, négatif = débit."
          },
          "balance_after_cents": {
            "type": "integer"
          },
          "currency": {
            "type": "string",
            "const": "USD"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "order": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "id": {
                "type": "integer"
              },
              "number": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "withdrawal_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "WebhookEndpoint": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "order.created",
                "order.paid",
                "order.processing",
                "order.delivered",
                "order.completed",
                "order.disputed",
                "order.refunded",
                "order.cancelled",
                "order.expired",
                "message.created",
                "dispute.created",
                "dispute.updated",
                "listing.sold_out"
              ]
            }
          },
          "is_active": {
            "type": "boolean"
          },
          "failure_count": {
            "type": "integer",
            "description": "Failed attempts in a row. At 20 the endpoint is turned off.",
            "x-description-fr": "Tentatives échouées consécutives. À 20, l’endpoint est désactivé."
          },
          "disabled_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "last_success_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "last_failure_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "secret_hint": {
            "type": "string",
            "description": "First characters of the secret.",
            "x-description-fr": "Premiers caractères du secret."
          },
          "secret": {
            "type": "string",
            "description": "Only when created or rotated.",
            "x-description-fr": "Uniquement à la création ou à la rotation."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "WebhookEndpointCreate": {
        "type": "object",
        "required": [
          "url",
          "events"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "maxLength": 500,
            "description": "HTTPS URL that resolves to a public IP.",
            "x-description-fr": "URL HTTPS pointant vers une IP publique."
          },
          "events": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string",
              "enum": [
                "order.created",
                "order.paid",
                "order.processing",
                "order.delivered",
                "order.completed",
                "order.disputed",
                "order.refunded",
                "order.cancelled",
                "order.expired",
                "message.created",
                "dispute.created",
                "dispute.updated",
                "listing.sold_out"
              ]
            },
            "description": "Events to receive.",
            "x-description-fr": "Événements à recevoir."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 120,
            "description": "A note for yourself.",
            "x-description-fr": "Une note pour vous."
          }
        }
      },
      "WebhookEndpointUpdate": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "maxLength": 500,
            "description": "HTTPS URL that resolves to a public IP.",
            "x-description-fr": "URL HTTPS pointant vers une IP publique."
          },
          "events": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string",
              "enum": [
                "order.created",
                "order.paid",
                "order.processing",
                "order.delivered",
                "order.completed",
                "order.disputed",
                "order.refunded",
                "order.cancelled",
                "order.expired",
                "message.created",
                "dispute.created",
                "dispute.updated",
                "listing.sold_out"
              ]
            },
            "description": "Replaces the event list.",
            "x-description-fr": "Remplace la liste des événements."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 120,
            "description": "A note for yourself.",
            "x-description-fr": "Une note pour vous."
          },
          "is_active": {
            "type": "boolean",
            "description": "Turn on/off. Turning on resets failure_count.",
            "x-description-fr": "Activer/désactiver. L’activation remet failure_count à zéro."
          },
          "rotate_secret": {
            "type": "boolean",
            "description": "true: issue a new secret (old one stops working).",
            "x-description-fr": "true : génère un nouveau secret (l’ancien cesse de fonctionner)."
          }
        }
      },
      "WebhookDelivery": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "delivery_id": {
            "type": "string",
            "description": "Same value as the MythicDeals-Delivery header (dlv_…).",
            "x-description-fr": "Même valeur que l’en-tête MythicDeals-Delivery (dlv_…)."
          },
          "event": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "sending",
              "succeeded",
              "failed"
            ]
          },
          "attempts": {
            "type": "integer"
          },
          "response_code": {
            "type": [
              "integer",
              "null"
            ]
          },
          "response_excerpt": {
            "type": [
              "string",
              "null"
            ],
            "description": "First 500 characters of your response.",
            "x-description-fr": "Les 500 premiers caractères de votre réponse."
          },
          "error": {
            "type": [
              "string",
              "null"
            ]
          },
          "next_attempt_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "delivered_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "payload": {
            "$ref": "#/components/schemas/WebhookEvent"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "WebhookEvent": {
        "type": "object",
        "required": [
          "id",
          "type",
          "created_at",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Event id (evt_…). The same event sent to several endpoints keeps its id.",
            "x-description-fr": "Identifiant d’événement (evt_…). Le même événement envoyé à plusieurs endpoints garde son identifiant."
          },
          "type": {
            "type": "string",
            "enum": [
              "ping",
              "order.created",
              "order.paid",
              "order.processing",
              "order.delivered",
              "order.completed",
              "order.disputed",
              "order.refunded",
              "order.cancelled",
              "order.expired",
              "message.created",
              "dispute.created",
              "dispute.updated",
              "listing.sold_out"
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "data": {
            "type": "object"
          }
        }
      },
      "OrderEventData": {
        "type": "object",
        "required": [
          "order"
        ],
        "properties": {
          "order": {
            "$ref": "#/components/schemas/Order"
          },
          "previous_status": {
            "type": "string",
            "description": "Status before the change (not on order.created).",
            "x-description-fr": "Statut avant le changement (absent pour order.created)."
          }
        }
      },
      "MessageEventData": {
        "type": "object",
        "required": [
          "order",
          "message"
        ],
        "properties": {
          "order": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              },
              "number": {
                "type": "string"
              },
              "status": {
                "type": "string"
              }
            }
          },
          "message": {
            "$ref": "#/components/schemas/Message"
          }
        }
      },
      "DisputeEventData": {
        "type": "object",
        "required": [
          "dispute",
          "order"
        ],
        "properties": {
          "dispute": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Dispute"
              }
            ],
            "description": "The dispute exactly as GET /disputes returns it (list shape: requested_outcome, requested_amount_cents only for partial_refund, awaiting, pending_offer, offer_count).",
            "x-description-fr": "Le litige exactement comme GET /disputes le renvoie (forme liste : requested_outcome, requested_amount_cents uniquement pour partial_refund, awaiting, pending_offer, offer_count)."
          },
          "order": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              },
              "number": {
                "type": "string"
              },
              "status": {
                "type": "string"
              }
            }
          }
        }
      },
      "ListingSoldOutEventData": {
        "type": "object",
        "required": [
          "listing",
          "order"
        ],
        "properties": {
          "listing": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              },
              "title": {
                "type": "string"
              },
              "type": {
                "type": "string"
              },
              "status": {
                "type": "string"
              },
              "stock": {
                "type": "integer"
              },
              "price_cents": {
                "type": "integer"
              },
              "currency": {
                "type": "string",
                "const": "USD"
              }
            }
          },
          "order": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              },
              "number": {
                "type": "string"
              }
            }
          }
        }
      },
      "PingEventData": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          },
          "endpoint_id": {
            "type": "integer"
          }
        }
      },
      "Account": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "email_verified": {
            "type": "boolean"
          },
          "two_factor": {
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "methods": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          },
          "seller": {
            "type": "object",
            "properties": {
              "verified": {
                "type": "boolean"
              },
              "verification_status": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Status of your seller verification, null if never started.",
                "x-description-fr": "Statut de votre vérification vendeur, null si jamais commencée."
              },
              "level": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "fee_percent": {
                    "type": "integer",
                    "description": "Platform fee on your sales.",
                    "x-description-fr": "Commission de la plateforme sur vos ventes."
                  }
                }
              }
            }
          },
          "store": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "name": {
                "type": "string"
              },
              "slug": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "url": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "uri"
              }
            }
          },
          "presence": {
            "$ref": "#/components/schemas/Presence"
          },
          "break": {
            "type": "object",
            "properties": {
              "active": {
                "type": "boolean"
              },
              "until": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              },
              "message": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "restrictions": {
            "type": "object",
            "properties": {
              "can_sell": {
                "type": "boolean"
              },
              "can_withdraw": {
                "type": "boolean"
              },
              "suspended": {
                "type": "boolean"
              },
              "suspended_until": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              },
              "tax_info_required": {
                "type": "boolean"
              },
              "tax_info_complete": {
                "type": "boolean"
              },
              "reasons": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string",
                      "enum": [
                        "account_suspended",
                        "seller_not_verified",
                        "email_not_verified",
                        "tax_info_required",
                        "on_break"
                      ]
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "limits": {
            "type": "object",
            "properties": {
              "price_min_cents": {
                "type": "integer"
              },
              "price_max_cents": {
                "type": "integer"
              },
              "units_per_listing": {
                "type": "integer"
              },
              "images_per_listing": {
                "type": "integer"
              },
              "bulk_items": {
                "type": "integer",
                "description": "Items per PATCH /listings/bulk.",
                "x-description-fr": "Éléments par PATCH /listings/bulk."
              },
              "bulk_update_listings": {
                "type": "integer",
                "description": "Listings per POST /listings/bulk-update.",
                "x-description-fr": "Annonces par POST /listings/bulk-update."
              },
              "import_rows": {
                "type": "integer",
                "description": "Rows per CSV import.",
                "x-description-fr": "Lignes par import CSV."
              },
              "requests_per_minute": {
                "type": "integer"
              }
            }
          }
        }
      },
      "Presence": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "online",
              "offline"
            ],
            "description": "What you chose with PUT /account/status.",
            "x-description-fr": "Ce que vous avez choisi avec PUT /account/status."
          },
          "appear_offline": {
            "type": "boolean"
          },
          "shown_online": {
            "type": "boolean",
            "description": "What buyers see now: active in the last few minutes and not appearing offline.",
            "x-description-fr": "Ce que voient les acheteurs maintenant : actif ces dernières minutes et pas en mode hors ligne."
          },
          "last_seen_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "SellerBreak": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "active": {
            "type": "boolean",
            "description": "true for the break going on now.",
            "x-description-fr": "true pour la pause en cours."
          },
          "started_at": {
            "type": "string",
            "format": "date-time"
          },
          "until": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Planned reopening, null = until ended by hand.",
            "x-description-fr": "Réouverture prévue, null = jusqu’à une fin manuelle."
          },
          "ended_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "message": {
            "type": [
              "string",
              "null"
            ]
          },
          "source": {
            "type": "string",
            "enum": [
              "api",
              "web"
            ],
            "description": "Where the break was started.",
            "x-description-fr": "Où la pause a été démarrée."
          }
        }
      },
      "GiftCardBrand": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "icon_url": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "game_id": {
            "type": "integer",
            "description": "Use as game_id in POST /listings.",
            "x-description-fr": "À utiliser comme game_id dans POST /listings."
          },
          "game_category_id": {
            "type": "integer",
            "description": "Use as game_category_id in POST /listings.",
            "x-description-fr": "À utiliser comme game_category_id dans POST /listings."
          },
          "regions": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "Global",
                "US",
                "EU",
                "UK",
                "DE",
                "FR",
                "ID",
                "MY",
                "PH",
                "SG",
                "TH",
                "JP",
                "BR",
                "IN",
                "TR",
                "CA",
                "AU",
                "LATAM"
              ]
            },
            "description": "Accepted values of the region attribute.",
            "x-description-fr": "Valeurs acceptées pour l’attribut region."
          },
          "face_currencies": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "face_value_min": {
            "type": [
              "integer",
              "null"
            ]
          },
          "face_value_max": {
            "type": [
              "integer",
              "null"
            ]
          },
          "offers_count": {
            "type": "integer",
            "description": "Offers buyers can buy now.",
            "x-description-fr": "Offres achetables maintenant."
          },
          "lowest_price_cents": {
            "type": [
              "integer",
              "null"
            ]
          },
          "currency": {
            "type": "string",
            "const": "USD"
          }
        }
      },
      "GiftCardRegion": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "Global",
              "US",
              "EU",
              "UK",
              "DE",
              "FR",
              "ID",
              "MY",
              "PH",
              "SG",
              "TH",
              "JP",
              "BR",
              "IN",
              "TR",
              "CA",
              "AU",
              "LATAM"
            ]
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "is_country": {
            "type": "boolean",
            "description": "false for Global, EU, LATAM …",
            "x-description-fr": "false pour Global, EU, LATAM …"
          }
        }
      },
      "BulkUpdateByFilter": {
        "type": "object",
        "required": [
          "filter",
          "change"
        ],
        "properties": {
          "filter": {
            "type": "object",
            "description": "Which listings: at least one filter, all must match.",
            "x-description-fr": "Quelles annonces : au moins un filtre, tous doivent correspondre.",
            "properties": {
              "game": {
                "type": [
                  "integer",
                  "string"
                ],
                "description": "Game id or slug.",
                "x-description-fr": "Identifiant ou slug du jeu."
              },
              "type": {
                "type": "string",
                "enum": [
                  "account",
                  "currency",
                  "item",
                  "boosting",
                  "giftcard"
                ]
              },
              "category": {
                "type": "integer",
                "description": "Category id.",
                "x-description-fr": "Identifiant de catégorie."
              },
              "status": {
                "type": [
                  "string",
                  "array"
                ],
                "items": {
                  "type": "string"
                },
                "description": "One status or a list: draft, active, paused, sold_out.",
                "x-description-fr": "Un statut ou une liste : draft, active, paused, sold_out."
              },
              "ids": {
                "type": "array",
                "items": {
                  "type": "integer"
                },
                "maxItems": 1000
              }
            }
          },
          "change": {
            "type": "object",
            "description": "What to change: at least one.",
            "x-description-fr": "Ce qu’il faut modifier : au moins un champ.",
            "properties": {
              "price": {
                "type": "object",
                "description": "Exactly one of set_cents, percent, delta_cents.",
                "x-description-fr": "Exactement un champ parmi set_cents, percent, delta_cents.",
                "properties": {
                  "set_cents": {
                    "type": "integer",
                    "minimum": 100,
                    "maximum": 5000000,
                    "description": "New price in USD cents.",
                    "x-description-fr": "Nouveau prix en centimes USD."
                  },
                  "percent": {
                    "type": "number",
                    "minimum": -90,
                    "maximum": 500,
                    "description": "Change in percent, e.g. -5.",
                    "x-description-fr": "Variation en pourcentage, par ex. -5."
                  },
                  "delta_cents": {
                    "type": "integer",
                    "description": "Amount to add (negative = lower).",
                    "x-description-fr": "Montant à ajouter (négatif = baisser)."
                  }
                }
              },
              "stock": {
                "type": "object",
                "required": [
                  "set"
                ],
                "properties": {
                  "set": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9999
                  }
                }
              },
              "status": {
                "type": "object",
                "required": [
                  "set"
                ],
                "properties": {
                  "set": {
                    "type": "string",
                    "enum": [
                      "draft",
                      "active",
                      "paused"
                    ]
                  }
                }
              },
              "delivery_eta_minutes": {
                "type": "integer",
                "minimum": 5,
                "maximum": 20160
              }
            }
          },
          "dry_run": {
            "type": "boolean",
            "default": false,
            "description": "true: show the plan, save nothing.",
            "x-description-fr": "true : affiche le plan, n’enregistre rien."
          }
        }
      },
      "BulkUpdateByFilterResult": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer"
                },
                "title": {
                  "type": "string"
                },
                "changed": {
                  "type": "boolean"
                },
                "before": {
                  "$ref": "#/components/schemas/ListingSnapshot"
                },
                "after": {
                  "$ref": "#/components/schemas/ListingSnapshot"
                },
                "notes": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "field": {
                        "type": "string"
                      },
                      "code": {
                        "type": "string",
                        "enum": [
                          "price_clamped",
                          "stock_managed_by_units"
                        ]
                      },
                      "message": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "dry_run": {
                "type": "boolean"
              },
              "matched": {
                "type": "integer"
              },
              "changed": {
                "type": "integer"
              },
              "unchanged": {
                "type": "integer"
              },
              "max": {
                "type": "integer"
              }
            }
          }
        }
      },
      "ListingSnapshot": {
        "type": "object",
        "properties": {
          "price_cents": {
            "type": "integer"
          },
          "stock": {
            "type": "integer"
          },
          "status": {
            "type": "string"
          },
          "delivery_eta_minutes": {
            "type": "integer"
          }
        }
      },
      "Competitor": {
        "type": "object",
        "properties": {
          "listing_id": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "price_cents": {
            "type": "integer"
          },
          "currency": {
            "type": "string",
            "const": "USD"
          },
          "stock": {
            "type": "integer"
          },
          "delivery_eta_minutes": {
            "type": "integer"
          },
          "instant_delivery": {
            "type": "boolean"
          },
          "warranty_days": {
            "type": "integer"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "seller": {
            "type": "object",
            "properties": {
              "store_name": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "store_slug": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "store_url": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "uri"
              },
              "rating": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Average review rating (1–5).",
                "x-description-fr": "Note moyenne des avis (1 à 5)."
              },
              "reviews": {
                "type": "integer"
              },
              "completed_orders": {
                "type": "integer"
              },
              "online": {
                "type": "boolean"
              }
            }
          }
        }
      },
      "CompetitorsMeta": {
        "type": "object",
        "properties": {
          "listing_id": {
            "type": "integer"
          },
          "your_price_cents": {
            "type": "integer"
          },
          "currency": {
            "type": "string",
            "const": "USD"
          },
          "your_rank": {
            "type": "integer",
            "description": "1 = cheapest offer.",
            "x-description-fr": "1 = l’offre la moins chère."
          },
          "competitors": {
            "type": "integer",
            "description": "Number of competing offers (max 100).",
            "x-description-fr": "Nombre d’offres concurrentes (100 maximum)."
          },
          "lowest_price_cents": {
            "type": [
              "integer",
              "null"
            ]
          },
          "matched_on": {
            "type": "object",
            "properties": {
              "game_id": {
                "type": "integer"
              },
              "type": {
                "type": "string"
              },
              "category_id": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "attributes": {
                "type": "object"
              }
            }
          },
          "cached_for_seconds": {
            "type": "integer"
          }
        }
      },
      "ImportPreview": {
        "type": "object",
        "properties": {
          "token": {
            "type": [
              "string",
              "null"
            ],
            "description": "Send to POST /listings/import/confirm. null when no row is valid.",
            "x-description-fr": "À envoyer à POST /listings/import/confirm. null si aucune ligne n’est valide."
          },
          "expires_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "category": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              },
              "slug": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "game": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "integer"
                  },
                  "slug": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "total": {
            "type": "integer"
          },
          "valid": {
            "type": "integer"
          },
          "invalid": {
            "type": "integer"
          },
          "rows": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "line": {
                  "type": "integer"
                },
                "title": {
                  "type": "string"
                },
                "price_cents": {
                  "type": "integer"
                },
                "currency": {
                  "type": "string",
                  "const": "USD"
                },
                "input_price": {
                  "type": "object",
                  "properties": {
                    "amount": {
                      "type": "string"
                    },
                    "currency": {
                      "type": "string"
                    }
                  }
                },
                "stock": {
                  "type": "integer"
                },
                "delivery_eta_minutes": {
                  "type": "integer"
                },
                "warranty_days": {
                  "type": "integer"
                },
                "status": {
                  "type": "string"
                }
              }
            }
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "line": {
                  "type": "integer"
                },
                "messages": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "DeliveryHistoryItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "delivered_at": {
            "type": "string",
            "format": "date-time"
          },
          "amends_delivery_id": {
            "type": [
              "integer",
              "null"
            ],
            "description": "The delivery this one corrected.",
            "x-description-fr": "La livraison corrigée par celle-ci."
          },
          "reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "has_credentials": {
            "type": "boolean"
          }
        }
      },
      "Invoice": {
        "type": "object",
        "properties": {
          "invoice_number": {
            "type": "string"
          },
          "order": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              },
              "number": {
                "type": "string"
              },
              "status": {
                "type": "string"
              }
            }
          },
          "issued_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "currency": {
            "type": "string",
            "const": "USD"
          },
          "issuer": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "role": {
                "type": "string"
              },
              "note": {
                "type": "string"
              }
            }
          },
          "seller": {
            "type": "object",
            "description": "business_name, vat_number and country only for sellers registered as a business.",
            "x-description-fr": "business_name, vat_number et country uniquement pour les vendeurs enregistrés comme entreprise.",
            "properties": {
              "id": {
                "type": "integer"
              },
              "store_name": {
                "type": "string"
              },
              "business_name": {
                "type": "string"
              },
              "vat_number": {
                "type": "string"
              },
              "country": {
                "type": "string"
              }
            }
          },
          "buyer": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              },
              "name": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "lines": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "description": {
                  "type": "string"
                },
                "game": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "type": {
                  "type": "string"
                },
                "quantity": {
                  "type": "integer"
                },
                "unit_price_cents": {
                  "type": "integer"
                },
                "amount_cents": {
                  "type": "integer"
                }
              }
            }
          },
          "subtotal_cents": {
            "type": "integer"
          },
          "buyer_fee_cents": {
            "type": "integer"
          },
          "discount_cents": {
            "type": "integer"
          },
          "coupon_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "tax_lines": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "tax_cents": {
            "type": "integer"
          },
          "total_cents": {
            "type": "integer",
            "description": "subtotal + buyer fee − discount + tax.",
            "x-description-fr": "sous-total + frais acheteur − remise + taxes."
          },
          "refunded_cents": {
            "type": "integer"
          },
          "payment_method": {
            "type": [
              "string",
              "null"
            ]
          },
          "seller_summary": {
            "type": "object",
            "description": "Seller only: what the platform keeps and what you receive.",
            "x-description-fr": "Vendeur uniquement : ce que garde la plateforme et ce que vous recevez.",
            "properties": {
              "platform_fee_cents": {
                "type": "integer"
              },
              "fee_percent": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "seller_discount_cents": {
                "type": "integer"
              },
              "seller_amount_cents": {
                "type": "integer"
              }
            }
          },
          "html_url": {
            "type": "string",
            "format": "uri",
            "description": "Printable HTML, signed, no token needed, valid 24 h.",
            "x-description-fr": "HTML imprimable, signé, sans jeton, valable 24 h."
          },
          "html_url_expires_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "Dispute": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "order": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              },
              "number": {
                "type": "string"
              },
              "status": {
                "type": "string"
              },
              "listing_title": {
                "type": "string"
              },
              "total_paid_cents": {
                "type": "integer"
              }
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "open",
              "awaiting_buyer",
              "awaiting_seller",
              "escalated",
              "resolved",
              "closed"
            ]
          },
          "awaiting": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "seller",
              "buyer",
              "admin",
              null
            ],
            "description": "Who has to act next; null when nobody (open or finished).",
            "x-description-fr": "Qui doit agir ; null si personne (ouvert ou terminé)."
          },
          "opener_role": {
            "type": "string",
            "enum": [
              "buyer",
              "seller"
            ]
          },
          "category": {
            "type": "string",
            "enum": [
              "not_delivered",
              "not_as_described",
              "stopped_working",
              "partial",
              "wrong_item",
              "other"
            ]
          },
          "category_label": {
            "type": "string"
          },
          "reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "requested_outcome": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "full_refund",
              "partial_refund",
              "deliver",
              null
            ],
            "description": "What the opener asked for.",
            "x-description-fr": "Ce que la personne qui a ouvert le litige demande."
          },
          "requested_amount_cents": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Only for partial_refund.",
            "x-description-fr": "Uniquement pour partial_refund."
          },
          "pending_offer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/DisputeOffer"
              },
              {
                "type": "null"
              }
            ]
          },
          "resolution": {
            "type": [
              "string",
              "null"
            ],
            "description": "How it ended, e.g. refund_full, refund_partial, release.",
            "x-description-fr": "Comment il s’est terminé, par ex. refund_full, refund_partial, release."
          },
          "resolved_amount_cents": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Amount refunded to the buyer.",
            "x-description-fr": "Montant remboursé à l’acheteur."
          },
          "resolution_note": {
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "type": "string",
            "const": "USD"
          },
          "escalated_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "resolved_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "offer_count": {
            "type": "integer",
            "description": "Lists only.",
            "x-description-fr": "Listes uniquement."
          }
        }
      },
      "DisputeDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Dispute"
          },
          {
            "type": "object",
            "properties": {
              "offers": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/DisputeOffer"
                }
              },
              "evidence": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/DisputeEvidence"
                }
              },
              "timeline": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/DisputeEvent"
                }
              }
            }
          }
        ]
      },
      "DisputeOffer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "from_role": {
            "type": "string",
            "enum": [
              "buyer",
              "seller"
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "full_refund",
              "partial_refund",
              "no_refund",
              "redeliver"
            ]
          },
          "amount_cents": {
            "type": "integer",
            "description": "Refund to the buyer (0 for redeliver / no_refund).",
            "x-description-fr": "Remboursement à l’acheteur (0 pour redeliver / no_refund)."
          },
          "note": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "accepted",
              "rejected",
              "superseded"
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "DisputeEvidence": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "mime": {
            "type": "string"
          },
          "size": {
            "type": "integer",
            "description": "Bytes.",
            "x-description-fr": "Octets."
          },
          "is_image": {
            "type": "boolean"
          },
          "uploaded_by": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              },
              "role": {
                "type": "string",
                "enum": [
                  "buyer",
                  "seller",
                  "admin"
                ]
              }
            }
          },
          "from_chat": {
            "type": "boolean",
            "description": "true when it was attached in the order chat.",
            "x-description-fr": "true quand le fichier a été joint dans la messagerie."
          },
          "download_url": {
            "type": "string",
            "format": "uri",
            "description": "GET with your token.",
            "x-description-fr": "GET avec votre jeton."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "DisputeEvent": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "dispute.opened",
              "message.created",
              "evidence.added",
              "offer.created",
              "offer.accepted",
              "offer.rejected",
              "dispute.escalated",
              "dispute.resolved",
              "dispute.closed"
            ]
          },
          "at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "actor": {
            "type": "object",
            "properties": {
              "id": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "role": {
                "type": "string",
                "enum": [
                  "buyer",
                  "seller",
                  "admin",
                  "system"
                ]
              }
            }
          },
          "data": {
            "type": "object",
            "description": "Depends on the type: e.g. offer_id, type, amount_cents, note for offer.created; message_id, body, attachment_count for message.created.",
            "x-description-fr": "Dépend du type : par ex. offer_id, type, amount_cents, note pour offer.created ; message_id, body, attachment_count pour message.created."
          }
        }
      },
      "DisputeCounter": {
        "type": "object",
        "required": [
          "type"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "full_refund",
              "partial_refund",
              "redeliver"
            ]
          },
          "amount_cents": {
            "type": "integer",
            "minimum": 1,
            "description": "Required for partial_refund; less than the order total.",
            "x-description-fr": "Obligatoire pour partial_refund ; inférieur au total de la commande."
          },
          "note": {
            "type": "string",
            "maxLength": 450,
            "description": "Message to the buyer. Required for redeliver.",
            "x-description-fr": "Message à l’acheteur. Obligatoire pour redeliver."
          },
          "delivery": {
            "type": "object",
            "description": "redeliver only: the corrected details, delivered right away.",
            "x-description-fr": "redeliver uniquement : les informations corrigées, livrées immédiatement.",
            "properties": {
              "username": {
                "type": "string",
                "maxLength": 160,
                "description": "Login (accounts).",
                "x-description-fr": "Identifiant (comptes)."
              },
              "password": {
                "type": "string",
                "maxLength": 160,
                "description": "Password (accounts).",
                "x-description-fr": "Mot de passe (comptes)."
              },
              "email": {
                "type": "string",
                "maxLength": 160,
                "description": "Email of the account (optional).",
                "x-description-fr": "E-mail du compte (facultatif)."
              },
              "note": {
                "type": "string",
                "maxLength": 1000,
                "description": "Free text, e.g. a code or instructions.",
                "x-description-fr": "Texte libre, par ex. un code ou des instructions."
              }
            }
          }
        }
      },
      "Payout": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "status": {
            "type": "string",
            "enum": [
              "requested",
              "approved",
              "completed",
              "rejected",
              "failed"
            ]
          },
          "status_label": {
            "type": "string"
          },
          "amount_cents": {
            "type": "integer",
            "description": "Taken from your balance.",
            "x-description-fr": "Débité de votre solde."
          },
          "fee_cents": {
            "type": "integer"
          },
          "net_amount_cents": {
            "type": "integer",
            "description": "What you receive (amount − fee).",
            "x-description-fr": "Ce que vous recevez (montant − frais)."
          },
          "currency": {
            "type": "string",
            "const": "USD"
          },
          "method": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string"
              },
              "label": {
                "type": "string",
                "description": "Masked, e.g. \"BCA ••••1234\".",
                "x-description-fr": "Masqué, par ex. \"BCA ••••1234\"."
              }
            }
          },
          "transfer_reference": {
            "type": [
              "string",
              "null"
            ],
            "description": "Only when completed.",
            "x-description-fr": "Uniquement quand completed."
          },
          "reject_reason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Only when rejected or failed.",
            "x-description-fr": "Uniquement quand rejected ou failed."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "reviewed_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "paid_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "Notification": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "e<id> = order event, t<id> = support reply.",
            "x-description-fr": "e<id> = événement de commande, t<id> = réponse du support."
          },
          "type": {
            "type": "string",
            "description": "The order’s new status (paid, processing, delivered, completed, disputed, refunded …) or support.",
            "x-description-fr": "Le nouveau statut de la commande (paid, processing, delivered, completed, disputed, refunded …) ou support."
          },
          "title": {
            "type": "string"
          },
          "body": {
            "type": "string"
          },
          "item": {
            "type": [
              "string",
              "null"
            ]
          },
          "counterparty": {
            "type": "object",
            "properties": {
              "role": {
                "type": "string",
                "enum": [
                  "buyer",
                  "seller",
                  "support"
                ]
              },
              "name": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "order_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "ticket_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "amount_cents": {
            "type": [
              "integer",
              "null"
            ]
          },
          "currency": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Page on the website.",
            "x-description-fr": "Page sur le site."
          },
          "unread": {
            "type": "boolean"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      }
    }
  },
  "x-scopes": {
    "catalog:read": "Read games, categories and attributes",
    "listings:read": "Read your listings",
    "listings:write": "Create, edit, pause and delete your listings (price, stock, photos)",
    "orders:read": "Read your sales and order details",
    "orders:write": "Start and deliver orders",
    "messages:read": "Read order chat messages",
    "messages:write": "Send order chat messages",
    "wallet:read": "Read your balance and ledger",
    "webhooks:write": "Manage your webhook endpoints",
    "disputes:read": "Read disputes on your orders (offers, evidence, timeline)",
    "disputes:write": "Answer disputes: accept, counter-offer, escalate and reply",
    "notifications:read": "Read your notifications",
    "notifications:write": "Mark your notifications as read",
    "account:read": "Read your account status, restrictions and break history",
    "account:write": "Go online/offline and start or end a break (vacation mode)",
    "boosting:read": "Read open boosting requests and your boosting offers",
    "boosting:write": "Send, update and withdraw boosting offers; post boost progress on orders"
  },
  "x-rate-limit": {
    "requests": 120,
    "per": "minute"
  },
  "x-changelog": [
    {
      "version": "1.2.0",
      "date": "2026-10-30",
      "summary": "Boosting by request: read open boosting requests, send, update and withdraw offers, and post boost progress on orders (scopes boosting:read and boosting:write).",
      "x-summary-fr": "Boosting sur demande : lisez les demandes de boosting ouvertes, envoyez, modifiez et retirez des offres, et publiez l’avancement du boost sur les commandes (scopes boosting:read et boosting:write)."
    },
    {
      "version": "1.1.1",
      "date": "2026-10-27",
      "summary": "Deliver paid orders directly, edit gift card units, notifications:write scope, publish rules for bulk activation, dispute webhooks in the API shape, standard pagination for breaks.",
      "x-summary-fr": "Livraison directe des commandes payées, modification des unités de cartes cadeaux, scope notifications:write, règles de publication pour l’activation en masse, webhooks de litige au format de l’API, pagination standard des pauses."
    },
    {
      "version": "1.1.0",
      "date": "2026-10-27",
      "summary": "Disputes, payouts, notifications, account status and breaks, gift cards, order cancel/correct/invoice, and new listing tools (duplicate, edit one unit, update by filter, competitors, CSV import).",
      "x-summary-fr": "Litiges, retraits, notifications, état du compte et pauses, cartes cadeaux, annulation/correction/facture des commandes, et nouveaux outils d’annonces (duplication, modification d’une unité, modification par filtre, concurrents, import CSV)."
    },
    {
      "version": "1.0.0",
      "date": "2026-10-26",
      "summary": "First public release of API v1.",
      "x-summary-fr": "Première version publique de l’API v1."
    }
  ]
}
