{
  "openapi": "3.0.3",
  "info": {
    "title": "We are forger — API v1",
    "version": "1.0.0",
    "description": "Fabriquer des assets de jeu depuis vos propres outils : images, modèles 3D, sons. Clé créée dans Mon compte (Authorization: Bearer wafk_…). 120 appels par heure et par clé."
  },
  "servers": [{ "url": "https://weareforger.data-space.world" }],
  "components": {
    "securitySchemes": { "cle": { "type": "http", "scheme": "bearer", "bearerFormat": "wafk_…" } },
    "schemas": {
      "Erreur": { "type": "object", "properties": { "error": { "type": "string" } } },
      "Asset": { "type": "object", "properties": { "id": { "type": "string" }, "type": { "type": "string", "enum": ["image", "model3d", "audio", "video"] }, "url": { "type": "string", "format": "uri" }, "prompt": { "type": "string" } } },
      "Job": { "type": "object", "properties": { "id": { "type": "string" }, "status": { "type": "string", "enum": ["queued", "running", "done", "error", "canceled", "paused"] }, "step": { "type": "string" }, "resultAssetId": { "type": "string", "nullable": true } } }
    }
  },
  "security": [{ "cle": [] }],
  "paths": {
    "/api/v1/generate": {
      "post": {
        "summary": "Générer une ou plusieurs images",
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["prompt"], "properties": { "prompt": { "type": "string" }, "style": { "type": "string", "default": "aucun" }, "count": { "type": "integer", "minimum": 1, "maximum": 4, "default": 1 }, "ratio": { "type": "string", "default": "1:1" }, "ready3d": { "type": "boolean", "default": true } } } } } },
        "responses": { "200": { "description": "Les images créées", "content": { "application/json": { "schema": { "type": "object", "properties": { "assets": { "type": "array", "items": { "$ref": "#/components/schemas/Asset" } } } } } } }, "401": { "description": "Clé manquante ou invalide", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Erreur" } } } }, "429": { "description": "Limite horaire atteinte" } }
      }
    },
    "/api/v1/model3d": {
      "post": {
        "summary": "Transformer une image en modèle 3D (GLB) — travail asynchrone",
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["assetId"], "properties": { "assetId": { "type": "string", "description": "identifiant d'une image créée par /api/v1/generate" }, "express": { "type": "boolean", "default": false, "description": "quelques secondes, qualité moindre" } } } } } },
        "responses": { "200": { "description": "Le travail lancé — suivre /api/v1/jobs/{id}", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Job" } } } }, "401": { "description": "Clé manquante ou invalide" }, "503": { "description": "3D indisponible (serveurs publics épuisés et aucune station souveraine)" } }
      }
    },
    "/api/v1/jobs/{id}": {
      "get": {
        "summary": "État d'un travail",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }],
        "responses": { "200": { "description": "Le travail", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Job" } } } }, "404": { "description": "Inconnu" } }
      }
    },
    "/api/v1/sfx": {
      "post": {
        "summary": "Générer un effet sonore",
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["prompt"], "properties": { "prompt": { "type": "string" }, "duration": { "type": "integer", "minimum": 1, "maximum": 45, "default": 5 } } } } } },
        "responses": { "200": { "description": "Le son créé", "content": { "application/json": { "schema": { "type": "object", "properties": { "assets": { "type": "array", "items": { "$ref": "#/components/schemas/Asset" } } } } } } }, "401": { "description": "Clé manquante ou invalide" } }
      }
    },
    "/api/assets/{id}/file": {
      "get": { "summary": "Le fichier d'une création (image, GLB, son) — public", "security": [], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Le fichier" }, "404": { "description": "Inconnu" } } }
    }
  }
}
