{
  "openapi": "3.0.3",
  "info": {
    "title": "iaLicitaciones API",
    "version": "1.0.0",
    "description": "API de licitación pública multi-país. Autenticación por clave: `Authorization: Bearer ilk_live_...`. Cada llamada consume créditos del saldo del periodo."
  },
  "servers": [
    {
      "url": "https://api.ialicitaciones.com/v1"
    }
  ],
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer"
      }
    }
  },
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "paths": {
    "/health": {
      "get": {
        "summary": "Estado del servicio (0 créditos)",
        "security": []
      }
    },
    "/me": {
      "get": {
        "summary": "Saldo, límites y ámbitos de la clave (0 créditos)"
      }
    },
    "/countries": {
      "get": {
        "summary": "Países disponibles: ES, IT, GB, MX, DO, CO, UY, CR, EC, PE, CL (0 créditos)"
      }
    },
    "/countries/{code}/schema": {
      "get": {
        "summary": "Filtros válidos y clasificación del país (0 créditos)"
      }
    },
    "/search": {
      "post": {
        "summary": "Búsqueda de licitaciones (1 crédito)"
      }
    },
    "/tenders/{id}": {
      "get": {
        "summary": "Ficha completa de una licitación (1 crédito)"
      }
    },
    "/tenders/{id}/documents": {
      "get": {
        "summary": "Documentos con texto extraído (3 créditos)"
      }
    },
    "/tenders/{id}/awards": {
      "get": {
        "summary": "Adjudicaciones y adjudicatarios (1 crédito)"
      }
    },
    "/tenders/{id}/documents:post": {
      "post": {
        "summary": "Registrar un documento externo por URL (1 crédito). Cuerpo: {url, tipo?}"
      }
    },
    "/tenders/{id}/documents/extract": {
      "post": {
        "summary": "Lanzar la extracción de texto de los documentos (5 créditos)"
      }
    },
    "/ai/{task}": {
      "post": {
        "summary": "Lanza una tarea de IA en segundo plano. Devuelve 202 con job_id. resumen=25 cr · requisitos=25 cr · analisis=40 cr · estrategia=40 cr · anexos=40 cr · mercado=40 cr. Cuerpo: {licitacion_id, expediente_id?, lote_id?, payload?}"
      }
    },
    "/jobs/{id}": {
      "get": {
        "summary": "Estado y resultado de una tarea de IA (0 créditos)"
      }
    },
    "/alerts": {
      "get": {
        "summary": "Lista los avisos del workspace (0 créditos)"
      },
      "post": {
        "summary": "Crea un aviso (1 crédito). Cuerpo: {nombre, paises[], keywords[], negative_keywords?, cpv_codes?, provincias?, min_presupuesto?, max_presupuesto?, frecuencia?, hora_envio?, zona_horaria?, notificar_email?, notificar_push?}"
      }
    },
    "/alerts/{id}": {
      "get": {
        "summary": "Detalle de un aviso (0 créditos)"
      },
      "patch": {
        "summary": "Actualiza un aviso (1 crédito)"
      },
      "delete": {
        "summary": "Borra un aviso (0 créditos)"
      }
    },
    "/webhooks": {
      "get": {
        "summary": "Lista los webhooks del workspace (0 créditos)"
      },
      "post": {
        "summary": "Crea un webhook (1 crédito). Cuerpo: {url, events[], description?}. Eventos: tender.matched, tender.award_published, test.ping. La clave de firma se muestra una sola vez."
      }
    },
    "/webhooks/{id}": {
      "delete": {
        "summary": "Desactiva y borra un webhook (0 créditos)"
      }
    },
    "/webhooks/{id}/deliveries": {
      "get": {
        "summary": "Últimos envíos del webhook (0 créditos)"
      }
    },
    "/webhooks/{id}/test": {
      "post": {
        "summary": "Encola un evento test.ping (0 créditos)"
      }
    }
  }
}