{
  "openapi": "3.1.0",
  "info": {
    "title": "BoostCore SMM API",
    "version": "1.0.0",
    "summary": "API compatible avec le format SMM classique.",
    "description": "Endpoint POST unique pour le catalogue, le solde, les commandes, les annulations et les refills. Tous les montants et debits de l'API sont en credits BoostCore. Le catalogue tarifaire avec les prix en credits et leurs equivalents USD est disponible apres connexion dans l'onglet Developpeur de l'espace client : https://www.boostcore.tech/connexion. Les paiements ne sont pas exposes."
  },
  "servers": [
    { "url": "https://www.boostcore.tech", "description": "Production" }
  ],
  "paths": {
    "/api/v2": {
      "post": {
        "summary": "Executer une action SMM",
        "operationId": "executeSmmAction",
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "oneOf": [
                  { "$ref": "#/components/schemas/ServicesRequest" },
                  { "$ref": "#/components/schemas/BalanceRequest" },
                  { "$ref": "#/components/schemas/AddOrderRequest" },
                  { "$ref": "#/components/schemas/OrderStatusRequest" },
                  { "$ref": "#/components/schemas/CancelRequest" },
                  { "$ref": "#/components/schemas/RefillRequest" },
                  { "$ref": "#/components/schemas/RefillStatusRequest" }
                ]
              },
              "examples": {
                "services": { "value": { "key": "bc_live_EXAMPLE", "action": "services" } },
                "add": { "value": { "key": "bc_live_EXAMPLE", "action": "add", "service": 12, "link": "https://www.facebook.com/example", "quantity": 100, "idempotency_key": "order-000001" } },
                "status": { "value": { "key": "bc_live_EXAMPLE", "action": "status", "order": 23501 } }
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Action executee ou rejouee sans nouvel effet metier" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "422": { "$ref": "#/components/responses/ValidationError" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "BaseRequest": {
        "type": "object",
        "required": ["key", "action"],
        "properties": {
          "key": { "type": "string", "description": "Cle API BoostCore commencant par bc_live_.", "writeOnly": true },
          "action": { "type": "string" }
        }
      },
      "ServicesRequest": {
        "allOf": [
          { "$ref": "#/components/schemas/BaseRequest" },
          { "type": "object", "properties": { "action": { "const": "services" } } }
        ],
        "unevaluatedProperties": false
      },
      "BalanceRequest": {
        "allOf": [
          { "$ref": "#/components/schemas/BaseRequest" },
          { "type": "object", "properties": { "action": { "const": "balance" } } }
        ],
        "unevaluatedProperties": false
      },
      "AddOrderRequest": {
        "allOf": [
          { "$ref": "#/components/schemas/BaseRequest" },
          {
            "type": "object",
            "required": ["service", "link", "quantity", "idempotency_key"],
            "properties": {
              "action": { "const": "add" },
              "service": { "type": "integer", "minimum": 1, "description": "ID numerique retourne par action=services." },
              "link": { "type": "string", "format": "uri", "description": "URL publique de la cible." },
              "quantity": { "type": "integer", "minimum": 1, "description": "Quantite respectant min, max et quantity_step du service." },
              "idempotency_key": { "$ref": "#/components/schemas/IdempotencyKey" }
            }
          }
        ],
        "unevaluatedProperties": false
      },
      "OrderStatusRequest": {
        "allOf": [
          { "$ref": "#/components/schemas/BaseRequest" },
          {
            "type": "object",
            "properties": {
              "action": { "const": "status" },
              "order": { "type": "integer", "minimum": 1 },
              "orders": { "$ref": "#/components/schemas/IdList" }
            },
            "anyOf": [{ "required": ["order"] }, { "required": ["orders"] }]
          }
        ],
        "unevaluatedProperties": false
      },
      "CancelRequest": {
        "allOf": [
          { "$ref": "#/components/schemas/BaseRequest" },
          {
            "type": "object",
            "required": ["idempotency_key"],
            "properties": {
              "action": { "const": "cancel" },
              "order": { "type": "integer", "minimum": 1 },
              "orders": { "$ref": "#/components/schemas/IdList" },
              "idempotency_key": { "$ref": "#/components/schemas/IdempotencyKey" }
            },
            "anyOf": [{ "required": ["order"] }, { "required": ["orders"] }]
          }
        ],
        "unevaluatedProperties": false
      },
      "RefillRequest": {
        "allOf": [
          { "$ref": "#/components/schemas/BaseRequest" },
          {
            "type": "object",
            "required": ["idempotency_key"],
            "properties": {
              "action": { "const": "refill" },
              "order": { "type": "integer", "minimum": 1 },
              "orders": { "$ref": "#/components/schemas/IdList" },
              "idempotency_key": { "$ref": "#/components/schemas/IdempotencyKey" }
            },
            "anyOf": [{ "required": ["order"] }, { "required": ["orders"] }]
          }
        ],
        "unevaluatedProperties": false
      },
      "RefillStatusRequest": {
        "allOf": [
          { "$ref": "#/components/schemas/BaseRequest" },
          {
            "type": "object",
            "properties": {
              "action": { "const": "refill_status" },
              "refill": { "type": "integer", "minimum": 1 },
              "refills": { "$ref": "#/components/schemas/IdList" }
            },
            "anyOf": [{ "required": ["refill"] }, { "required": ["refills"] }]
          }
        ],
        "unevaluatedProperties": false
      },
      "IdempotencyKey": { "type": "string", "minLength": 1, "maxLength": 128, "description": "Identifiant stable de l'intention metier, identique lors d'un retry." },
      "IdList": { "type": "string", "pattern": "^[1-9][0-9]*(,[1-9][0-9]*){0,99}$", "description": "Un a 100 IDs numeriques separes par des virgules." },
      "Error": { "type": "object", "required": ["error"], "properties": { "error": { "type": "string" } } }
    },
    "responses": {
      "BadRequest": { "description": "Action ou parametre invalide", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } },
      "Unauthorized": { "description": "Cle API absente ou invalide", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } },
      "Forbidden": { "description": "Scope insuffisant", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } },
      "Conflict": { "description": "Operation non disponible ou conflit d'idempotence", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } },
      "ValidationError": { "description": "Donnees refusees", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } },
      "RateLimited": { "description": "Quota temporairement depasse", "headers": { "Retry-After": { "schema": { "type": "integer" } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }
    }
  }
}
