{
  "openapi": "3.0.0",
  "paths": {
    "/api/v1/health": {
      "get": {
        "description": "Verifica que el gateway está activo y listo para recibir tráfico. Usado por el load balancer y Docker health checks.\n\n> No requiere autenticación.",
        "operationId": "HealthController_check",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The Health Check is successful",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "example": "ok"
                    },
                    "info": {
                      "type": "object",
                      "example": {
                        "database": {
                          "status": "up"
                        }
                      },
                      "additionalProperties": {
                        "type": "object",
                        "required": [
                          "status"
                        ],
                        "properties": {
                          "status": {
                            "type": "string"
                          }
                        },
                        "additionalProperties": true
                      },
                      "nullable": true
                    },
                    "error": {
                      "type": "object",
                      "example": {},
                      "additionalProperties": {
                        "type": "object",
                        "required": [
                          "status"
                        ],
                        "properties": {
                          "status": {
                            "type": "string"
                          }
                        },
                        "additionalProperties": true
                      },
                      "nullable": true
                    },
                    "details": {
                      "type": "object",
                      "example": {
                        "database": {
                          "status": "up"
                        }
                      },
                      "additionalProperties": {
                        "type": "object",
                        "required": [
                          "status"
                        ],
                        "properties": {
                          "status": {
                            "type": "string"
                          }
                        },
                        "additionalProperties": true
                      }
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The Health Check is not successful",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "example": "error"
                    },
                    "info": {
                      "type": "object",
                      "example": {
                        "database": {
                          "status": "up"
                        }
                      },
                      "additionalProperties": {
                        "type": "object",
                        "required": [
                          "status"
                        ],
                        "properties": {
                          "status": {
                            "type": "string"
                          }
                        },
                        "additionalProperties": true
                      },
                      "nullable": true
                    },
                    "error": {
                      "type": "object",
                      "example": {
                        "redis": {
                          "status": "down",
                          "message": "Could not connect"
                        }
                      },
                      "additionalProperties": {
                        "type": "object",
                        "required": [
                          "status"
                        ],
                        "properties": {
                          "status": {
                            "type": "string"
                          }
                        },
                        "additionalProperties": true
                      },
                      "nullable": true
                    },
                    "details": {
                      "type": "object",
                      "example": {
                        "database": {
                          "status": "up"
                        },
                        "redis": {
                          "status": "down",
                          "message": "Could not connect"
                        }
                      },
                      "additionalProperties": {
                        "type": "object",
                        "required": [
                          "status"
                        ],
                        "properties": {
                          "status": {
                            "type": "string"
                          }
                        },
                        "additionalProperties": true
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Health check del API Gateway",
        "tags": [
          "Sistema"
        ]
      }
    },
    "/api/v1/auth/{splat}": {
      "get": {
        "description": "Proxy hacia **fc-auth-service**. Cubre todos los endpoints de autenticación:\n\n- `POST auth/login` — Iniciar sesión, retorna `access_token` y `refresh_token`\n- `POST auth/register` — Registrar nuevo tenant y usuario administrador\n- `POST auth/refresh` — Renovar access token con refresh token\n- `POST auth/logout` — Invalidar refresh token\n\n> No requiere JWT. El token se obtiene aquí.",
        "operationId": "ProxyController_proxyAuth_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "Credenciales incorrectas"
          },
          "422": {
            "description": "Datos de entrada inválidos"
          }
        },
        "summary": "Login, registro y refresh de tokens",
        "tags": [
          "Proxy",
          "Autenticación"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-auth-service**. Cubre todos los endpoints de autenticación:\n\n- `POST auth/login` — Iniciar sesión, retorna `access_token` y `refresh_token`\n- `POST auth/register` — Registrar nuevo tenant y usuario administrador\n- `POST auth/refresh` — Renovar access token con refresh token\n- `POST auth/logout` — Invalidar refresh token\n\n> No requiere JWT. El token se obtiene aquí.",
        "operationId": "ProxyController_proxyAuth_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "Credenciales incorrectas"
          },
          "422": {
            "description": "Datos de entrada inválidos"
          }
        },
        "summary": "Login, registro y refresh de tokens",
        "tags": [
          "Proxy",
          "Autenticación"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-auth-service**. Cubre todos los endpoints de autenticación:\n\n- `POST auth/login` — Iniciar sesión, retorna `access_token` y `refresh_token`\n- `POST auth/register` — Registrar nuevo tenant y usuario administrador\n- `POST auth/refresh` — Renovar access token con refresh token\n- `POST auth/logout` — Invalidar refresh token\n\n> No requiere JWT. El token se obtiene aquí.",
        "operationId": "ProxyController_proxyAuth_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "Credenciales incorrectas"
          },
          "422": {
            "description": "Datos de entrada inválidos"
          }
        },
        "summary": "Login, registro y refresh de tokens",
        "tags": [
          "Proxy",
          "Autenticación"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-auth-service**. Cubre todos los endpoints de autenticación:\n\n- `POST auth/login` — Iniciar sesión, retorna `access_token` y `refresh_token`\n- `POST auth/register` — Registrar nuevo tenant y usuario administrador\n- `POST auth/refresh` — Renovar access token con refresh token\n- `POST auth/logout` — Invalidar refresh token\n\n> No requiere JWT. El token se obtiene aquí.",
        "operationId": "ProxyController_proxyAuth_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "Credenciales incorrectas"
          },
          "422": {
            "description": "Datos de entrada inválidos"
          }
        },
        "summary": "Login, registro y refresh de tokens",
        "tags": [
          "Proxy",
          "Autenticación"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-auth-service**. Cubre todos los endpoints de autenticación:\n\n- `POST auth/login` — Iniciar sesión, retorna `access_token` y `refresh_token`\n- `POST auth/register` — Registrar nuevo tenant y usuario administrador\n- `POST auth/refresh` — Renovar access token con refresh token\n- `POST auth/logout` — Invalidar refresh token\n\n> No requiere JWT. El token se obtiene aquí.",
        "operationId": "ProxyController_proxyAuth_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "Credenciales incorrectas"
          },
          "422": {
            "description": "Datos de entrada inválidos"
          }
        },
        "summary": "Login, registro y refresh de tokens",
        "tags": [
          "Proxy",
          "Autenticación"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-auth-service**. Cubre todos los endpoints de autenticación:\n\n- `POST auth/login` — Iniciar sesión, retorna `access_token` y `refresh_token`\n- `POST auth/register` — Registrar nuevo tenant y usuario administrador\n- `POST auth/refresh` — Renovar access token con refresh token\n- `POST auth/logout` — Invalidar refresh token\n\n> No requiere JWT. El token se obtiene aquí.",
        "operationId": "ProxyController_proxyAuth_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "Credenciales incorrectas"
          },
          "422": {
            "description": "Datos de entrada inválidos"
          }
        },
        "summary": "Login, registro y refresh de tokens",
        "tags": [
          "Proxy",
          "Autenticación"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-auth-service**. Cubre todos los endpoints de autenticación:\n\n- `POST auth/login` — Iniciar sesión, retorna `access_token` y `refresh_token`\n- `POST auth/register` — Registrar nuevo tenant y usuario administrador\n- `POST auth/refresh` — Renovar access token con refresh token\n- `POST auth/logout` — Invalidar refresh token\n\n> No requiere JWT. El token se obtiene aquí.",
        "operationId": "ProxyController_proxyAuth_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "Credenciales incorrectas"
          },
          "422": {
            "description": "Datos de entrada inválidos"
          }
        },
        "summary": "Login, registro y refresh de tokens",
        "tags": [
          "Proxy",
          "Autenticación"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-auth-service**. Cubre todos los endpoints de autenticación:\n\n- `POST auth/login` — Iniciar sesión, retorna `access_token` y `refresh_token`\n- `POST auth/register` — Registrar nuevo tenant y usuario administrador\n- `POST auth/refresh` — Renovar access token con refresh token\n- `POST auth/logout` — Invalidar refresh token\n\n> No requiere JWT. El token se obtiene aquí.",
        "operationId": "ProxyController_proxyAuth_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "Credenciales incorrectas"
          },
          "422": {
            "description": "Datos de entrada inválidos"
          }
        },
        "summary": "Login, registro y refresh de tokens",
        "tags": [
          "Proxy",
          "Autenticación"
        ]
      }
    },
    "/api/v1/users": {
      "get": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST users` — Crear nuevo usuario en el tenant (rol: ADMIN)",
        "operationId": "ProxyController_proxyUsersBase_get",
        "parameters": [],
        "responses": {
          "201": {
            "description": "Usuario creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear usuario",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST users` — Crear nuevo usuario en el tenant (rol: ADMIN)",
        "operationId": "ProxyController_proxyUsersBase_post",
        "parameters": [],
        "responses": {
          "201": {
            "description": "Usuario creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear usuario",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST users` — Crear nuevo usuario en el tenant (rol: ADMIN)",
        "operationId": "ProxyController_proxyUsersBase_put",
        "parameters": [],
        "responses": {
          "201": {
            "description": "Usuario creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear usuario",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST users` — Crear nuevo usuario en el tenant (rol: ADMIN)",
        "operationId": "ProxyController_proxyUsersBase_delete",
        "parameters": [],
        "responses": {
          "201": {
            "description": "Usuario creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear usuario",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST users` — Crear nuevo usuario en el tenant (rol: ADMIN)",
        "operationId": "ProxyController_proxyUsersBase_patch",
        "parameters": [],
        "responses": {
          "201": {
            "description": "Usuario creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear usuario",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST users` — Crear nuevo usuario en el tenant (rol: ADMIN)",
        "operationId": "ProxyController_proxyUsersBase_options",
        "parameters": [],
        "responses": {
          "201": {
            "description": "Usuario creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear usuario",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST users` — Crear nuevo usuario en el tenant (rol: ADMIN)",
        "operationId": "ProxyController_proxyUsersBase_head",
        "parameters": [],
        "responses": {
          "201": {
            "description": "Usuario creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear usuario",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST users` — Crear nuevo usuario en el tenant (rol: ADMIN)",
        "operationId": "ProxyController_proxyUsersBase_search",
        "parameters": [],
        "responses": {
          "201": {
            "description": "Usuario creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear usuario",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      }
    },
    "/api/v1/users/{splat}": {
      "get": {
        "description": "Proxy hacia **fc-auth-service**. Operaciones sobre usuarios del tenant autenticado:\n\n- `GET users` — Listar usuarios\n- `GET users/:id` — Obtener usuario por ID\n- `PATCH users/:id` — Actualizar datos o rol\n- `DELETE users/:id` — Eliminar usuario\n- `POST users/:id/change-password` — Cambiar contraseña",
        "operationId": "ProxyController_proxyUsers_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Usuario no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de usuarios del tenant",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-auth-service**. Operaciones sobre usuarios del tenant autenticado:\n\n- `GET users` — Listar usuarios\n- `GET users/:id` — Obtener usuario por ID\n- `PATCH users/:id` — Actualizar datos o rol\n- `DELETE users/:id` — Eliminar usuario\n- `POST users/:id/change-password` — Cambiar contraseña",
        "operationId": "ProxyController_proxyUsers_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Usuario no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de usuarios del tenant",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-auth-service**. Operaciones sobre usuarios del tenant autenticado:\n\n- `GET users` — Listar usuarios\n- `GET users/:id` — Obtener usuario por ID\n- `PATCH users/:id` — Actualizar datos o rol\n- `DELETE users/:id` — Eliminar usuario\n- `POST users/:id/change-password` — Cambiar contraseña",
        "operationId": "ProxyController_proxyUsers_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Usuario no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de usuarios del tenant",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-auth-service**. Operaciones sobre usuarios del tenant autenticado:\n\n- `GET users` — Listar usuarios\n- `GET users/:id` — Obtener usuario por ID\n- `PATCH users/:id` — Actualizar datos o rol\n- `DELETE users/:id` — Eliminar usuario\n- `POST users/:id/change-password` — Cambiar contraseña",
        "operationId": "ProxyController_proxyUsers_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Usuario no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de usuarios del tenant",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-auth-service**. Operaciones sobre usuarios del tenant autenticado:\n\n- `GET users` — Listar usuarios\n- `GET users/:id` — Obtener usuario por ID\n- `PATCH users/:id` — Actualizar datos o rol\n- `DELETE users/:id` — Eliminar usuario\n- `POST users/:id/change-password` — Cambiar contraseña",
        "operationId": "ProxyController_proxyUsers_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Usuario no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de usuarios del tenant",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-auth-service**. Operaciones sobre usuarios del tenant autenticado:\n\n- `GET users` — Listar usuarios\n- `GET users/:id` — Obtener usuario por ID\n- `PATCH users/:id` — Actualizar datos o rol\n- `DELETE users/:id` — Eliminar usuario\n- `POST users/:id/change-password` — Cambiar contraseña",
        "operationId": "ProxyController_proxyUsers_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Usuario no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de usuarios del tenant",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-auth-service**. Operaciones sobre usuarios del tenant autenticado:\n\n- `GET users` — Listar usuarios\n- `GET users/:id` — Obtener usuario por ID\n- `PATCH users/:id` — Actualizar datos o rol\n- `DELETE users/:id` — Eliminar usuario\n- `POST users/:id/change-password` — Cambiar contraseña",
        "operationId": "ProxyController_proxyUsers_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Usuario no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de usuarios del tenant",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-auth-service**. Operaciones sobre usuarios del tenant autenticado:\n\n- `GET users` — Listar usuarios\n- `GET users/:id` — Obtener usuario por ID\n- `PATCH users/:id` — Actualizar datos o rol\n- `DELETE users/:id` — Eliminar usuario\n- `POST users/:id/change-password` — Cambiar contraseña",
        "operationId": "ProxyController_proxyUsers_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Usuario no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de usuarios del tenant",
        "tags": [
          "Proxy",
          "Usuarios"
        ]
      }
    },
    "/api/v1/api-keys": {
      "get": {
        "description": "Proxy hacia **fc-auth-service**. Gestión de API Keys del tenant:\n\n- `POST api-keys` — Crear nueva API Key (solo ADMIN)\n- `GET api-keys` — Listar API Keys del tenant",
        "operationId": "ProxyController_proxyApiKeysBase_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de API Keys"
          },
          "201": {
            "description": "API Key creada"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear API Key / Listar API Keys",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-auth-service**. Gestión de API Keys del tenant:\n\n- `POST api-keys` — Crear nueva API Key (solo ADMIN)\n- `GET api-keys` — Listar API Keys del tenant",
        "operationId": "ProxyController_proxyApiKeysBase_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de API Keys"
          },
          "201": {
            "description": "API Key creada"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear API Key / Listar API Keys",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-auth-service**. Gestión de API Keys del tenant:\n\n- `POST api-keys` — Crear nueva API Key (solo ADMIN)\n- `GET api-keys` — Listar API Keys del tenant",
        "operationId": "ProxyController_proxyApiKeysBase_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de API Keys"
          },
          "201": {
            "description": "API Key creada"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear API Key / Listar API Keys",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-auth-service**. Gestión de API Keys del tenant:\n\n- `POST api-keys` — Crear nueva API Key (solo ADMIN)\n- `GET api-keys` — Listar API Keys del tenant",
        "operationId": "ProxyController_proxyApiKeysBase_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de API Keys"
          },
          "201": {
            "description": "API Key creada"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear API Key / Listar API Keys",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-auth-service**. Gestión de API Keys del tenant:\n\n- `POST api-keys` — Crear nueva API Key (solo ADMIN)\n- `GET api-keys` — Listar API Keys del tenant",
        "operationId": "ProxyController_proxyApiKeysBase_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de API Keys"
          },
          "201": {
            "description": "API Key creada"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear API Key / Listar API Keys",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-auth-service**. Gestión de API Keys del tenant:\n\n- `POST api-keys` — Crear nueva API Key (solo ADMIN)\n- `GET api-keys` — Listar API Keys del tenant",
        "operationId": "ProxyController_proxyApiKeysBase_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de API Keys"
          },
          "201": {
            "description": "API Key creada"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear API Key / Listar API Keys",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-auth-service**. Gestión de API Keys del tenant:\n\n- `POST api-keys` — Crear nueva API Key (solo ADMIN)\n- `GET api-keys` — Listar API Keys del tenant",
        "operationId": "ProxyController_proxyApiKeysBase_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de API Keys"
          },
          "201": {
            "description": "API Key creada"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear API Key / Listar API Keys",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-auth-service**. Gestión de API Keys del tenant:\n\n- `POST api-keys` — Crear nueva API Key (solo ADMIN)\n- `GET api-keys` — Listar API Keys del tenant",
        "operationId": "ProxyController_proxyApiKeysBase_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de API Keys"
          },
          "201": {
            "description": "API Key creada"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear API Key / Listar API Keys",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      }
    },
    "/api/v1/api-keys/{splat}": {
      "get": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `DELETE api-keys/:id` — Revocar y eliminar API Key",
        "operationId": "ProxyController_proxyApiKeys_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "API Key no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de API Key específica",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `DELETE api-keys/:id` — Revocar y eliminar API Key",
        "operationId": "ProxyController_proxyApiKeys_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "API Key no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de API Key específica",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `DELETE api-keys/:id` — Revocar y eliminar API Key",
        "operationId": "ProxyController_proxyApiKeys_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "API Key no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de API Key específica",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `DELETE api-keys/:id` — Revocar y eliminar API Key",
        "operationId": "ProxyController_proxyApiKeys_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "API Key no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de API Key específica",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `DELETE api-keys/:id` — Revocar y eliminar API Key",
        "operationId": "ProxyController_proxyApiKeys_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "API Key no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de API Key específica",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `DELETE api-keys/:id` — Revocar y eliminar API Key",
        "operationId": "ProxyController_proxyApiKeys_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "API Key no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de API Key específica",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `DELETE api-keys/:id` — Revocar y eliminar API Key",
        "operationId": "ProxyController_proxyApiKeys_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "API Key no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de API Key específica",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `DELETE api-keys/:id` — Revocar y eliminar API Key",
        "operationId": "ProxyController_proxyApiKeys_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "API Key no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de API Key específica",
        "tags": [
          "Proxy",
          "API Keys"
        ]
      }
    },
    "/api/v1/tenants/{splat}": {
      "get": {
        "description": "Proxy hacia **fc-auth-service**. Gestión del tenant propietario del token JWT:\n\n- `GET tenants/me` — Obtener perfil del tenant\n- `PATCH tenants/me` — Actualizar razón social, domicilio, régimen fiscal\n\n> Solo administradores pueden modificar datos del tenant.",
        "operationId": "ProxyController_proxyTenants_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Perfil y configuración del tenant",
        "tags": [
          "Proxy",
          "Tenant"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-auth-service**. Gestión del tenant propietario del token JWT:\n\n- `GET tenants/me` — Obtener perfil del tenant\n- `PATCH tenants/me` — Actualizar razón social, domicilio, régimen fiscal\n\n> Solo administradores pueden modificar datos del tenant.",
        "operationId": "ProxyController_proxyTenants_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Perfil y configuración del tenant",
        "tags": [
          "Proxy",
          "Tenant"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-auth-service**. Gestión del tenant propietario del token JWT:\n\n- `GET tenants/me` — Obtener perfil del tenant\n- `PATCH tenants/me` — Actualizar razón social, domicilio, régimen fiscal\n\n> Solo administradores pueden modificar datos del tenant.",
        "operationId": "ProxyController_proxyTenants_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Perfil y configuración del tenant",
        "tags": [
          "Proxy",
          "Tenant"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-auth-service**. Gestión del tenant propietario del token JWT:\n\n- `GET tenants/me` — Obtener perfil del tenant\n- `PATCH tenants/me` — Actualizar razón social, domicilio, régimen fiscal\n\n> Solo administradores pueden modificar datos del tenant.",
        "operationId": "ProxyController_proxyTenants_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Perfil y configuración del tenant",
        "tags": [
          "Proxy",
          "Tenant"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-auth-service**. Gestión del tenant propietario del token JWT:\n\n- `GET tenants/me` — Obtener perfil del tenant\n- `PATCH tenants/me` — Actualizar razón social, domicilio, régimen fiscal\n\n> Solo administradores pueden modificar datos del tenant.",
        "operationId": "ProxyController_proxyTenants_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Perfil y configuración del tenant",
        "tags": [
          "Proxy",
          "Tenant"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-auth-service**. Gestión del tenant propietario del token JWT:\n\n- `GET tenants/me` — Obtener perfil del tenant\n- `PATCH tenants/me` — Actualizar razón social, domicilio, régimen fiscal\n\n> Solo administradores pueden modificar datos del tenant.",
        "operationId": "ProxyController_proxyTenants_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Perfil y configuración del tenant",
        "tags": [
          "Proxy",
          "Tenant"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-auth-service**. Gestión del tenant propietario del token JWT:\n\n- `GET tenants/me` — Obtener perfil del tenant\n- `PATCH tenants/me` — Actualizar razón social, domicilio, régimen fiscal\n\n> Solo administradores pueden modificar datos del tenant.",
        "operationId": "ProxyController_proxyTenants_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Perfil y configuración del tenant",
        "tags": [
          "Proxy",
          "Tenant"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-auth-service**. Gestión del tenant propietario del token JWT:\n\n- `GET tenants/me` — Obtener perfil del tenant\n- `PATCH tenants/me` — Actualizar razón social, domicilio, régimen fiscal\n\n> Solo administradores pueden modificar datos del tenant.",
        "operationId": "ProxyController_proxyTenants_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Perfil y configuración del tenant",
        "tags": [
          "Proxy",
          "Tenant"
        ]
      }
    },
    "/api/v1/cfdis": {
      "get": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `POST cfdis` — Emitir un nuevo CFDI (Ingreso, Egreso, Pago, Nómina, Traslado). Sella y timbra vía PAC.\n- `GET cfdis` — Listar CFDIs del tenant con paginación cursor-based (`?limit=20&cursor=...`)\n\n> El gateway inyecta `x-tenant-id` en cada petición a partir del JWT.",
        "operationId": "ProxyController_proxyCfdiBase_get",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista de CFDIs"
          },
          "201": {
            "description": "CFDI emitido y timbrado exitosamente"
          },
          "400": {
            "description": "Datos inválidos o CFDI no cumple validaciones SAT"
          },
          "401": {
            "description": "No autenticado"
          },
          "422": {
            "description": "CFDI rechazado por el PAC"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Emitir CFDI / Listar CFDIs",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `POST cfdis` — Emitir un nuevo CFDI (Ingreso, Egreso, Pago, Nómina, Traslado). Sella y timbra vía PAC.\n- `GET cfdis` — Listar CFDIs del tenant con paginación cursor-based (`?limit=20&cursor=...`)\n\n> El gateway inyecta `x-tenant-id` en cada petición a partir del JWT.",
        "operationId": "ProxyController_proxyCfdiBase_post",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista de CFDIs"
          },
          "201": {
            "description": "CFDI emitido y timbrado exitosamente"
          },
          "400": {
            "description": "Datos inválidos o CFDI no cumple validaciones SAT"
          },
          "401": {
            "description": "No autenticado"
          },
          "422": {
            "description": "CFDI rechazado por el PAC"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Emitir CFDI / Listar CFDIs",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `POST cfdis` — Emitir un nuevo CFDI (Ingreso, Egreso, Pago, Nómina, Traslado). Sella y timbra vía PAC.\n- `GET cfdis` — Listar CFDIs del tenant con paginación cursor-based (`?limit=20&cursor=...`)\n\n> El gateway inyecta `x-tenant-id` en cada petición a partir del JWT.",
        "operationId": "ProxyController_proxyCfdiBase_put",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista de CFDIs"
          },
          "201": {
            "description": "CFDI emitido y timbrado exitosamente"
          },
          "400": {
            "description": "Datos inválidos o CFDI no cumple validaciones SAT"
          },
          "401": {
            "description": "No autenticado"
          },
          "422": {
            "description": "CFDI rechazado por el PAC"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Emitir CFDI / Listar CFDIs",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `POST cfdis` — Emitir un nuevo CFDI (Ingreso, Egreso, Pago, Nómina, Traslado). Sella y timbra vía PAC.\n- `GET cfdis` — Listar CFDIs del tenant con paginación cursor-based (`?limit=20&cursor=...`)\n\n> El gateway inyecta `x-tenant-id` en cada petición a partir del JWT.",
        "operationId": "ProxyController_proxyCfdiBase_delete",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista de CFDIs"
          },
          "201": {
            "description": "CFDI emitido y timbrado exitosamente"
          },
          "400": {
            "description": "Datos inválidos o CFDI no cumple validaciones SAT"
          },
          "401": {
            "description": "No autenticado"
          },
          "422": {
            "description": "CFDI rechazado por el PAC"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Emitir CFDI / Listar CFDIs",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `POST cfdis` — Emitir un nuevo CFDI (Ingreso, Egreso, Pago, Nómina, Traslado). Sella y timbra vía PAC.\n- `GET cfdis` — Listar CFDIs del tenant con paginación cursor-based (`?limit=20&cursor=...`)\n\n> El gateway inyecta `x-tenant-id` en cada petición a partir del JWT.",
        "operationId": "ProxyController_proxyCfdiBase_patch",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista de CFDIs"
          },
          "201": {
            "description": "CFDI emitido y timbrado exitosamente"
          },
          "400": {
            "description": "Datos inválidos o CFDI no cumple validaciones SAT"
          },
          "401": {
            "description": "No autenticado"
          },
          "422": {
            "description": "CFDI rechazado por el PAC"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Emitir CFDI / Listar CFDIs",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `POST cfdis` — Emitir un nuevo CFDI (Ingreso, Egreso, Pago, Nómina, Traslado). Sella y timbra vía PAC.\n- `GET cfdis` — Listar CFDIs del tenant con paginación cursor-based (`?limit=20&cursor=...`)\n\n> El gateway inyecta `x-tenant-id` en cada petición a partir del JWT.",
        "operationId": "ProxyController_proxyCfdiBase_options",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista de CFDIs"
          },
          "201": {
            "description": "CFDI emitido y timbrado exitosamente"
          },
          "400": {
            "description": "Datos inválidos o CFDI no cumple validaciones SAT"
          },
          "401": {
            "description": "No autenticado"
          },
          "422": {
            "description": "CFDI rechazado por el PAC"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Emitir CFDI / Listar CFDIs",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `POST cfdis` — Emitir un nuevo CFDI (Ingreso, Egreso, Pago, Nómina, Traslado). Sella y timbra vía PAC.\n- `GET cfdis` — Listar CFDIs del tenant con paginación cursor-based (`?limit=20&cursor=...`)\n\n> El gateway inyecta `x-tenant-id` en cada petición a partir del JWT.",
        "operationId": "ProxyController_proxyCfdiBase_head",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista de CFDIs"
          },
          "201": {
            "description": "CFDI emitido y timbrado exitosamente"
          },
          "400": {
            "description": "Datos inválidos o CFDI no cumple validaciones SAT"
          },
          "401": {
            "description": "No autenticado"
          },
          "422": {
            "description": "CFDI rechazado por el PAC"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Emitir CFDI / Listar CFDIs",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `POST cfdis` — Emitir un nuevo CFDI (Ingreso, Egreso, Pago, Nómina, Traslado). Sella y timbra vía PAC.\n- `GET cfdis` — Listar CFDIs del tenant con paginación cursor-based (`?limit=20&cursor=...`)\n\n> El gateway inyecta `x-tenant-id` en cada petición a partir del JWT.",
        "operationId": "ProxyController_proxyCfdiBase_search",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista de CFDIs"
          },
          "201": {
            "description": "CFDI emitido y timbrado exitosamente"
          },
          "400": {
            "description": "Datos inválidos o CFDI no cumple validaciones SAT"
          },
          "401": {
            "description": "No autenticado"
          },
          "422": {
            "description": "CFDI rechazado por el PAC"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Emitir CFDI / Listar CFDIs",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      }
    },
    "/api/v1/cfdis/{splat}": {
      "get": {
        "description": "Proxy hacia **fc-cfdi-service**. Operaciones disponibles por UUID/folio fiscal:\n\n- `GET cfdis/:uuid` — Detalle completo con conceptos, impuestos y relacionados\n- `POST cfdis/:uuid/cancel` — Cancelar con motivo SAT (01–04)\n- `GET cfdis/:uuid/xml` — Descargar XML timbrado (CFDI 4.0)\n- `GET cfdis/:uuid/pdf` — Descargar representación impresa PDF con QR SAT\n- `GET cfdis/:uuid/sat-status` — Consultar estado directamente en el WebService SAT\n- `POST cfdis/validate` — Pre-validar datos sin timbrar ni guardar",
        "operationId": "ProxyController_proxyCfdi_get",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "400": {
            "description": "Operación no permitida en el estado actual del CFDI"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "CFDI no encontrado"
          },
          "503": {
            "description": "PAC o SAT no disponible (circuit breaker abierto)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Operaciones sobre un CFDI específico",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-cfdi-service**. Operaciones disponibles por UUID/folio fiscal:\n\n- `GET cfdis/:uuid` — Detalle completo con conceptos, impuestos y relacionados\n- `POST cfdis/:uuid/cancel` — Cancelar con motivo SAT (01–04)\n- `GET cfdis/:uuid/xml` — Descargar XML timbrado (CFDI 4.0)\n- `GET cfdis/:uuid/pdf` — Descargar representación impresa PDF con QR SAT\n- `GET cfdis/:uuid/sat-status` — Consultar estado directamente en el WebService SAT\n- `POST cfdis/validate` — Pre-validar datos sin timbrar ni guardar",
        "operationId": "ProxyController_proxyCfdi_post",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "400": {
            "description": "Operación no permitida en el estado actual del CFDI"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "CFDI no encontrado"
          },
          "503": {
            "description": "PAC o SAT no disponible (circuit breaker abierto)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Operaciones sobre un CFDI específico",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-cfdi-service**. Operaciones disponibles por UUID/folio fiscal:\n\n- `GET cfdis/:uuid` — Detalle completo con conceptos, impuestos y relacionados\n- `POST cfdis/:uuid/cancel` — Cancelar con motivo SAT (01–04)\n- `GET cfdis/:uuid/xml` — Descargar XML timbrado (CFDI 4.0)\n- `GET cfdis/:uuid/pdf` — Descargar representación impresa PDF con QR SAT\n- `GET cfdis/:uuid/sat-status` — Consultar estado directamente en el WebService SAT\n- `POST cfdis/validate` — Pre-validar datos sin timbrar ni guardar",
        "operationId": "ProxyController_proxyCfdi_put",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "400": {
            "description": "Operación no permitida en el estado actual del CFDI"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "CFDI no encontrado"
          },
          "503": {
            "description": "PAC o SAT no disponible (circuit breaker abierto)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Operaciones sobre un CFDI específico",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-cfdi-service**. Operaciones disponibles por UUID/folio fiscal:\n\n- `GET cfdis/:uuid` — Detalle completo con conceptos, impuestos y relacionados\n- `POST cfdis/:uuid/cancel` — Cancelar con motivo SAT (01–04)\n- `GET cfdis/:uuid/xml` — Descargar XML timbrado (CFDI 4.0)\n- `GET cfdis/:uuid/pdf` — Descargar representación impresa PDF con QR SAT\n- `GET cfdis/:uuid/sat-status` — Consultar estado directamente en el WebService SAT\n- `POST cfdis/validate` — Pre-validar datos sin timbrar ni guardar",
        "operationId": "ProxyController_proxyCfdi_delete",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "400": {
            "description": "Operación no permitida en el estado actual del CFDI"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "CFDI no encontrado"
          },
          "503": {
            "description": "PAC o SAT no disponible (circuit breaker abierto)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Operaciones sobre un CFDI específico",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-cfdi-service**. Operaciones disponibles por UUID/folio fiscal:\n\n- `GET cfdis/:uuid` — Detalle completo con conceptos, impuestos y relacionados\n- `POST cfdis/:uuid/cancel` — Cancelar con motivo SAT (01–04)\n- `GET cfdis/:uuid/xml` — Descargar XML timbrado (CFDI 4.0)\n- `GET cfdis/:uuid/pdf` — Descargar representación impresa PDF con QR SAT\n- `GET cfdis/:uuid/sat-status` — Consultar estado directamente en el WebService SAT\n- `POST cfdis/validate` — Pre-validar datos sin timbrar ni guardar",
        "operationId": "ProxyController_proxyCfdi_patch",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "400": {
            "description": "Operación no permitida en el estado actual del CFDI"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "CFDI no encontrado"
          },
          "503": {
            "description": "PAC o SAT no disponible (circuit breaker abierto)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Operaciones sobre un CFDI específico",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-cfdi-service**. Operaciones disponibles por UUID/folio fiscal:\n\n- `GET cfdis/:uuid` — Detalle completo con conceptos, impuestos y relacionados\n- `POST cfdis/:uuid/cancel` — Cancelar con motivo SAT (01–04)\n- `GET cfdis/:uuid/xml` — Descargar XML timbrado (CFDI 4.0)\n- `GET cfdis/:uuid/pdf` — Descargar representación impresa PDF con QR SAT\n- `GET cfdis/:uuid/sat-status` — Consultar estado directamente en el WebService SAT\n- `POST cfdis/validate` — Pre-validar datos sin timbrar ni guardar",
        "operationId": "ProxyController_proxyCfdi_options",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "400": {
            "description": "Operación no permitida en el estado actual del CFDI"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "CFDI no encontrado"
          },
          "503": {
            "description": "PAC o SAT no disponible (circuit breaker abierto)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Operaciones sobre un CFDI específico",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-cfdi-service**. Operaciones disponibles por UUID/folio fiscal:\n\n- `GET cfdis/:uuid` — Detalle completo con conceptos, impuestos y relacionados\n- `POST cfdis/:uuid/cancel` — Cancelar con motivo SAT (01–04)\n- `GET cfdis/:uuid/xml` — Descargar XML timbrado (CFDI 4.0)\n- `GET cfdis/:uuid/pdf` — Descargar representación impresa PDF con QR SAT\n- `GET cfdis/:uuid/sat-status` — Consultar estado directamente en el WebService SAT\n- `POST cfdis/validate` — Pre-validar datos sin timbrar ni guardar",
        "operationId": "ProxyController_proxyCfdi_head",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "400": {
            "description": "Operación no permitida en el estado actual del CFDI"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "CFDI no encontrado"
          },
          "503": {
            "description": "PAC o SAT no disponible (circuit breaker abierto)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Operaciones sobre un CFDI específico",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-cfdi-service**. Operaciones disponibles por UUID/folio fiscal:\n\n- `GET cfdis/:uuid` — Detalle completo con conceptos, impuestos y relacionados\n- `POST cfdis/:uuid/cancel` — Cancelar con motivo SAT (01–04)\n- `GET cfdis/:uuid/xml` — Descargar XML timbrado (CFDI 4.0)\n- `GET cfdis/:uuid/pdf` — Descargar representación impresa PDF con QR SAT\n- `GET cfdis/:uuid/sat-status` — Consultar estado directamente en el WebService SAT\n- `POST cfdis/validate` — Pre-validar datos sin timbrar ni guardar",
        "operationId": "ProxyController_proxyCfdi_search",
        "parameters": [
          {
            "name": "x-tenant-id",
            "in": "header",
            "description": "Inyectado automáticamente por el gateway",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "400": {
            "description": "Operación no permitida en el estado actual del CFDI"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "CFDI no encontrado"
          },
          "503": {
            "description": "PAC o SAT no disponible (circuit breaker abierto)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Operaciones sobre un CFDI específico",
        "tags": [
          "Proxy",
          "CFDIs"
        ]
      }
    },
    "/api/v1/clients": {
      "get": {
        "description": "Proxy hacia **fc-cfdi-service**. Directorio de receptores frecuentes del tenant:\n\n- `POST clients` — Registrar nuevo cliente (RFC, nombre, régimen, uso CFDI)\n- `GET clients` — Listar clientes con búsqueda por RFC o nombre",
        "operationId": "ProxyController_proxyClientsBase_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de clientes"
          },
          "201": {
            "description": "Cliente creado"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear cliente / Listar clientes",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-cfdi-service**. Directorio de receptores frecuentes del tenant:\n\n- `POST clients` — Registrar nuevo cliente (RFC, nombre, régimen, uso CFDI)\n- `GET clients` — Listar clientes con búsqueda por RFC o nombre",
        "operationId": "ProxyController_proxyClientsBase_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de clientes"
          },
          "201": {
            "description": "Cliente creado"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear cliente / Listar clientes",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-cfdi-service**. Directorio de receptores frecuentes del tenant:\n\n- `POST clients` — Registrar nuevo cliente (RFC, nombre, régimen, uso CFDI)\n- `GET clients` — Listar clientes con búsqueda por RFC o nombre",
        "operationId": "ProxyController_proxyClientsBase_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de clientes"
          },
          "201": {
            "description": "Cliente creado"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear cliente / Listar clientes",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-cfdi-service**. Directorio de receptores frecuentes del tenant:\n\n- `POST clients` — Registrar nuevo cliente (RFC, nombre, régimen, uso CFDI)\n- `GET clients` — Listar clientes con búsqueda por RFC o nombre",
        "operationId": "ProxyController_proxyClientsBase_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de clientes"
          },
          "201": {
            "description": "Cliente creado"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear cliente / Listar clientes",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-cfdi-service**. Directorio de receptores frecuentes del tenant:\n\n- `POST clients` — Registrar nuevo cliente (RFC, nombre, régimen, uso CFDI)\n- `GET clients` — Listar clientes con búsqueda por RFC o nombre",
        "operationId": "ProxyController_proxyClientsBase_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de clientes"
          },
          "201": {
            "description": "Cliente creado"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear cliente / Listar clientes",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-cfdi-service**. Directorio de receptores frecuentes del tenant:\n\n- `POST clients` — Registrar nuevo cliente (RFC, nombre, régimen, uso CFDI)\n- `GET clients` — Listar clientes con búsqueda por RFC o nombre",
        "operationId": "ProxyController_proxyClientsBase_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de clientes"
          },
          "201": {
            "description": "Cliente creado"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear cliente / Listar clientes",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-cfdi-service**. Directorio de receptores frecuentes del tenant:\n\n- `POST clients` — Registrar nuevo cliente (RFC, nombre, régimen, uso CFDI)\n- `GET clients` — Listar clientes con búsqueda por RFC o nombre",
        "operationId": "ProxyController_proxyClientsBase_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de clientes"
          },
          "201": {
            "description": "Cliente creado"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear cliente / Listar clientes",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-cfdi-service**. Directorio de receptores frecuentes del tenant:\n\n- `POST clients` — Registrar nuevo cliente (RFC, nombre, régimen, uso CFDI)\n- `GET clients` — Listar clientes con búsqueda por RFC o nombre",
        "operationId": "ProxyController_proxyClientsBase_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de clientes"
          },
          "201": {
            "description": "Cliente creado"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear cliente / Listar clientes",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      }
    },
    "/api/v1/clients/{splat}": {
      "get": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET clients/:id` — Obtener datos del cliente\n- `PATCH clients/:id` — Actualizar RFC, nombre, régimen o uso CFDI\n- `DELETE clients/:id` — Eliminar cliente del directorio",
        "operationId": "ProxyController_proxyClients_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Cliente no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de cliente específico",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET clients/:id` — Obtener datos del cliente\n- `PATCH clients/:id` — Actualizar RFC, nombre, régimen o uso CFDI\n- `DELETE clients/:id` — Eliminar cliente del directorio",
        "operationId": "ProxyController_proxyClients_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Cliente no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de cliente específico",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET clients/:id` — Obtener datos del cliente\n- `PATCH clients/:id` — Actualizar RFC, nombre, régimen o uso CFDI\n- `DELETE clients/:id` — Eliminar cliente del directorio",
        "operationId": "ProxyController_proxyClients_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Cliente no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de cliente específico",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET clients/:id` — Obtener datos del cliente\n- `PATCH clients/:id` — Actualizar RFC, nombre, régimen o uso CFDI\n- `DELETE clients/:id` — Eliminar cliente del directorio",
        "operationId": "ProxyController_proxyClients_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Cliente no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de cliente específico",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET clients/:id` — Obtener datos del cliente\n- `PATCH clients/:id` — Actualizar RFC, nombre, régimen o uso CFDI\n- `DELETE clients/:id` — Eliminar cliente del directorio",
        "operationId": "ProxyController_proxyClients_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Cliente no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de cliente específico",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET clients/:id` — Obtener datos del cliente\n- `PATCH clients/:id` — Actualizar RFC, nombre, régimen o uso CFDI\n- `DELETE clients/:id` — Eliminar cliente del directorio",
        "operationId": "ProxyController_proxyClients_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Cliente no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de cliente específico",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET clients/:id` — Obtener datos del cliente\n- `PATCH clients/:id` — Actualizar RFC, nombre, régimen o uso CFDI\n- `DELETE clients/:id` — Eliminar cliente del directorio",
        "operationId": "ProxyController_proxyClients_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Cliente no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de cliente específico",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET clients/:id` — Obtener datos del cliente\n- `PATCH clients/:id` — Actualizar RFC, nombre, régimen o uso CFDI\n- `DELETE clients/:id` — Eliminar cliente del directorio",
        "operationId": "ProxyController_proxyClients_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Cliente no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de cliente específico",
        "tags": [
          "Proxy",
          "Clientes"
        ]
      }
    },
    "/api/v1/series": {
      "get": {
        "description": "Proxy hacia **fc-cfdi-service**. Series de folios para organizar CFDIs por sucursal o tipo:\n\n- `POST series` — Crear nueva serie (ej. \"A\", \"FAC\", \"NC\")\n- `GET series` — Listar series del tenant con folio actual",
        "operationId": "ProxyController_proxySeriesBase_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de series"
          },
          "201": {
            "description": "Serie creada"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear serie / Listar series",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-cfdi-service**. Series de folios para organizar CFDIs por sucursal o tipo:\n\n- `POST series` — Crear nueva serie (ej. \"A\", \"FAC\", \"NC\")\n- `GET series` — Listar series del tenant con folio actual",
        "operationId": "ProxyController_proxySeriesBase_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de series"
          },
          "201": {
            "description": "Serie creada"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear serie / Listar series",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-cfdi-service**. Series de folios para organizar CFDIs por sucursal o tipo:\n\n- `POST series` — Crear nueva serie (ej. \"A\", \"FAC\", \"NC\")\n- `GET series` — Listar series del tenant con folio actual",
        "operationId": "ProxyController_proxySeriesBase_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de series"
          },
          "201": {
            "description": "Serie creada"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear serie / Listar series",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-cfdi-service**. Series de folios para organizar CFDIs por sucursal o tipo:\n\n- `POST series` — Crear nueva serie (ej. \"A\", \"FAC\", \"NC\")\n- `GET series` — Listar series del tenant con folio actual",
        "operationId": "ProxyController_proxySeriesBase_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de series"
          },
          "201": {
            "description": "Serie creada"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear serie / Listar series",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-cfdi-service**. Series de folios para organizar CFDIs por sucursal o tipo:\n\n- `POST series` — Crear nueva serie (ej. \"A\", \"FAC\", \"NC\")\n- `GET series` — Listar series del tenant con folio actual",
        "operationId": "ProxyController_proxySeriesBase_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de series"
          },
          "201": {
            "description": "Serie creada"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear serie / Listar series",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-cfdi-service**. Series de folios para organizar CFDIs por sucursal o tipo:\n\n- `POST series` — Crear nueva serie (ej. \"A\", \"FAC\", \"NC\")\n- `GET series` — Listar series del tenant con folio actual",
        "operationId": "ProxyController_proxySeriesBase_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de series"
          },
          "201": {
            "description": "Serie creada"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear serie / Listar series",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-cfdi-service**. Series de folios para organizar CFDIs por sucursal o tipo:\n\n- `POST series` — Crear nueva serie (ej. \"A\", \"FAC\", \"NC\")\n- `GET series` — Listar series del tenant con folio actual",
        "operationId": "ProxyController_proxySeriesBase_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de series"
          },
          "201": {
            "description": "Serie creada"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear serie / Listar series",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-cfdi-service**. Series de folios para organizar CFDIs por sucursal o tipo:\n\n- `POST series` — Crear nueva serie (ej. \"A\", \"FAC\", \"NC\")\n- `GET series` — Listar series del tenant con folio actual",
        "operationId": "ProxyController_proxySeriesBase_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de series"
          },
          "201": {
            "description": "Serie creada"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear serie / Listar series",
        "tags": [
          "Proxy",
          "Series"
        ]
      }
    },
    "/api/v1/series/{splat}": {
      "get": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET series/:id` — Obtener detalle y folio actual\n- `PATCH series/:id` — Modificar nombre o folio inicial\n- `DELETE series/:id` — Eliminar serie (solo si no tiene CFDIs)",
        "operationId": "ProxyController_proxySeries_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Serie no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de serie específica",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET series/:id` — Obtener detalle y folio actual\n- `PATCH series/:id` — Modificar nombre o folio inicial\n- `DELETE series/:id` — Eliminar serie (solo si no tiene CFDIs)",
        "operationId": "ProxyController_proxySeries_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Serie no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de serie específica",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET series/:id` — Obtener detalle y folio actual\n- `PATCH series/:id` — Modificar nombre o folio inicial\n- `DELETE series/:id` — Eliminar serie (solo si no tiene CFDIs)",
        "operationId": "ProxyController_proxySeries_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Serie no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de serie específica",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET series/:id` — Obtener detalle y folio actual\n- `PATCH series/:id` — Modificar nombre o folio inicial\n- `DELETE series/:id` — Eliminar serie (solo si no tiene CFDIs)",
        "operationId": "ProxyController_proxySeries_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Serie no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de serie específica",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET series/:id` — Obtener detalle y folio actual\n- `PATCH series/:id` — Modificar nombre o folio inicial\n- `DELETE series/:id` — Eliminar serie (solo si no tiene CFDIs)",
        "operationId": "ProxyController_proxySeries_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Serie no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de serie específica",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET series/:id` — Obtener detalle y folio actual\n- `PATCH series/:id` — Modificar nombre o folio inicial\n- `DELETE series/:id` — Eliminar serie (solo si no tiene CFDIs)",
        "operationId": "ProxyController_proxySeries_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Serie no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de serie específica",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET series/:id` — Obtener detalle y folio actual\n- `PATCH series/:id` — Modificar nombre o folio inicial\n- `DELETE series/:id` — Eliminar serie (solo si no tiene CFDIs)",
        "operationId": "ProxyController_proxySeries_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Serie no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de serie específica",
        "tags": [
          "Proxy",
          "Series"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-cfdi-service**.\n\n- `GET series/:id` — Obtener detalle y folio actual\n- `PATCH series/:id` — Modificar nombre o folio inicial\n- `DELETE series/:id` — Eliminar serie (solo si no tiene CFDIs)",
        "operationId": "ProxyController_proxySeries_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Serie no encontrada"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de serie específica",
        "tags": [
          "Proxy",
          "Series"
        ]
      }
    },
    "/api/v1/csds/{id}/decrypt": {
      "get": {
        "description": "**Este endpoint está bloqueado intencionalmente en el API Gateway.**\n\nEl descifrado de llaves privadas CSD se realiza exclusivamente dentro de la red Docker interna entre `fc-cfdi-service` y `fc-csd-service`. Nunca se expone externamente por razones de seguridad.",
        "operationId": "ProxyController_blockDecrypt_get",
        "parameters": [],
        "responses": {
          "404": {
            "description": "Endpoint bloqueado — acceso denegado externamente"
          }
        },
        "summary": "[BLOQUEADO] Descifrado de llave privada",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "post": {
        "description": "**Este endpoint está bloqueado intencionalmente en el API Gateway.**\n\nEl descifrado de llaves privadas CSD se realiza exclusivamente dentro de la red Docker interna entre `fc-cfdi-service` y `fc-csd-service`. Nunca se expone externamente por razones de seguridad.",
        "operationId": "ProxyController_blockDecrypt_post",
        "parameters": [],
        "responses": {
          "404": {
            "description": "Endpoint bloqueado — acceso denegado externamente"
          }
        },
        "summary": "[BLOQUEADO] Descifrado de llave privada",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "put": {
        "description": "**Este endpoint está bloqueado intencionalmente en el API Gateway.**\n\nEl descifrado de llaves privadas CSD se realiza exclusivamente dentro de la red Docker interna entre `fc-cfdi-service` y `fc-csd-service`. Nunca se expone externamente por razones de seguridad.",
        "operationId": "ProxyController_blockDecrypt_put",
        "parameters": [],
        "responses": {
          "404": {
            "description": "Endpoint bloqueado — acceso denegado externamente"
          }
        },
        "summary": "[BLOQUEADO] Descifrado de llave privada",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "delete": {
        "description": "**Este endpoint está bloqueado intencionalmente en el API Gateway.**\n\nEl descifrado de llaves privadas CSD se realiza exclusivamente dentro de la red Docker interna entre `fc-cfdi-service` y `fc-csd-service`. Nunca se expone externamente por razones de seguridad.",
        "operationId": "ProxyController_blockDecrypt_delete",
        "parameters": [],
        "responses": {
          "404": {
            "description": "Endpoint bloqueado — acceso denegado externamente"
          }
        },
        "summary": "[BLOQUEADO] Descifrado de llave privada",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "patch": {
        "description": "**Este endpoint está bloqueado intencionalmente en el API Gateway.**\n\nEl descifrado de llaves privadas CSD se realiza exclusivamente dentro de la red Docker interna entre `fc-cfdi-service` y `fc-csd-service`. Nunca se expone externamente por razones de seguridad.",
        "operationId": "ProxyController_blockDecrypt_patch",
        "parameters": [],
        "responses": {
          "404": {
            "description": "Endpoint bloqueado — acceso denegado externamente"
          }
        },
        "summary": "[BLOQUEADO] Descifrado de llave privada",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "options": {
        "description": "**Este endpoint está bloqueado intencionalmente en el API Gateway.**\n\nEl descifrado de llaves privadas CSD se realiza exclusivamente dentro de la red Docker interna entre `fc-cfdi-service` y `fc-csd-service`. Nunca se expone externamente por razones de seguridad.",
        "operationId": "ProxyController_blockDecrypt_options",
        "parameters": [],
        "responses": {
          "404": {
            "description": "Endpoint bloqueado — acceso denegado externamente"
          }
        },
        "summary": "[BLOQUEADO] Descifrado de llave privada",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "head": {
        "description": "**Este endpoint está bloqueado intencionalmente en el API Gateway.**\n\nEl descifrado de llaves privadas CSD se realiza exclusivamente dentro de la red Docker interna entre `fc-cfdi-service` y `fc-csd-service`. Nunca se expone externamente por razones de seguridad.",
        "operationId": "ProxyController_blockDecrypt_head",
        "parameters": [],
        "responses": {
          "404": {
            "description": "Endpoint bloqueado — acceso denegado externamente"
          }
        },
        "summary": "[BLOQUEADO] Descifrado de llave privada",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "search": {
        "description": "**Este endpoint está bloqueado intencionalmente en el API Gateway.**\n\nEl descifrado de llaves privadas CSD se realiza exclusivamente dentro de la red Docker interna entre `fc-cfdi-service` y `fc-csd-service`. Nunca se expone externamente por razones de seguridad.",
        "operationId": "ProxyController_blockDecrypt_search",
        "parameters": [],
        "responses": {
          "404": {
            "description": "Endpoint bloqueado — acceso denegado externamente"
          }
        },
        "summary": "[BLOQUEADO] Descifrado de llave privada",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      }
    },
    "/api/v1/csds": {
      "get": {
        "description": "Proxy hacia **fc-csd-service**. Gestión de Certificados de Sello Digital (CSD):\n\n- `POST csds` — Cargar nuevo CSD (`multipart/form-data` con archivos `.cer` y `.key`). La llave privada se cifra con AWS KMS antes de persistirse — nunca se almacena en texto plano.\n- `GET csds` — Listar CSDs activos del tenant con vigencia y sucursal",
        "operationId": "ProxyController_proxyCsdBase_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de certificados"
          },
          "201": {
            "description": "CSD cargado y cifrado exitosamente"
          },
          "400": {
            "description": "Archivo inválido, CSD vencido o RFC no coincide con el tenant"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Cargar CSD / Listar certificados",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-csd-service**. Gestión de Certificados de Sello Digital (CSD):\n\n- `POST csds` — Cargar nuevo CSD (`multipart/form-data` con archivos `.cer` y `.key`). La llave privada se cifra con AWS KMS antes de persistirse — nunca se almacena en texto plano.\n- `GET csds` — Listar CSDs activos del tenant con vigencia y sucursal",
        "operationId": "ProxyController_proxyCsdBase_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de certificados"
          },
          "201": {
            "description": "CSD cargado y cifrado exitosamente"
          },
          "400": {
            "description": "Archivo inválido, CSD vencido o RFC no coincide con el tenant"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Cargar CSD / Listar certificados",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-csd-service**. Gestión de Certificados de Sello Digital (CSD):\n\n- `POST csds` — Cargar nuevo CSD (`multipart/form-data` con archivos `.cer` y `.key`). La llave privada se cifra con AWS KMS antes de persistirse — nunca se almacena en texto plano.\n- `GET csds` — Listar CSDs activos del tenant con vigencia y sucursal",
        "operationId": "ProxyController_proxyCsdBase_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de certificados"
          },
          "201": {
            "description": "CSD cargado y cifrado exitosamente"
          },
          "400": {
            "description": "Archivo inválido, CSD vencido o RFC no coincide con el tenant"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Cargar CSD / Listar certificados",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-csd-service**. Gestión de Certificados de Sello Digital (CSD):\n\n- `POST csds` — Cargar nuevo CSD (`multipart/form-data` con archivos `.cer` y `.key`). La llave privada se cifra con AWS KMS antes de persistirse — nunca se almacena en texto plano.\n- `GET csds` — Listar CSDs activos del tenant con vigencia y sucursal",
        "operationId": "ProxyController_proxyCsdBase_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de certificados"
          },
          "201": {
            "description": "CSD cargado y cifrado exitosamente"
          },
          "400": {
            "description": "Archivo inválido, CSD vencido o RFC no coincide con el tenant"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Cargar CSD / Listar certificados",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-csd-service**. Gestión de Certificados de Sello Digital (CSD):\n\n- `POST csds` — Cargar nuevo CSD (`multipart/form-data` con archivos `.cer` y `.key`). La llave privada se cifra con AWS KMS antes de persistirse — nunca se almacena en texto plano.\n- `GET csds` — Listar CSDs activos del tenant con vigencia y sucursal",
        "operationId": "ProxyController_proxyCsdBase_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de certificados"
          },
          "201": {
            "description": "CSD cargado y cifrado exitosamente"
          },
          "400": {
            "description": "Archivo inválido, CSD vencido o RFC no coincide con el tenant"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Cargar CSD / Listar certificados",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-csd-service**. Gestión de Certificados de Sello Digital (CSD):\n\n- `POST csds` — Cargar nuevo CSD (`multipart/form-data` con archivos `.cer` y `.key`). La llave privada se cifra con AWS KMS antes de persistirse — nunca se almacena en texto plano.\n- `GET csds` — Listar CSDs activos del tenant con vigencia y sucursal",
        "operationId": "ProxyController_proxyCsdBase_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de certificados"
          },
          "201": {
            "description": "CSD cargado y cifrado exitosamente"
          },
          "400": {
            "description": "Archivo inválido, CSD vencido o RFC no coincide con el tenant"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Cargar CSD / Listar certificados",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-csd-service**. Gestión de Certificados de Sello Digital (CSD):\n\n- `POST csds` — Cargar nuevo CSD (`multipart/form-data` con archivos `.cer` y `.key`). La llave privada se cifra con AWS KMS antes de persistirse — nunca se almacena en texto plano.\n- `GET csds` — Listar CSDs activos del tenant con vigencia y sucursal",
        "operationId": "ProxyController_proxyCsdBase_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de certificados"
          },
          "201": {
            "description": "CSD cargado y cifrado exitosamente"
          },
          "400": {
            "description": "Archivo inválido, CSD vencido o RFC no coincide con el tenant"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Cargar CSD / Listar certificados",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-csd-service**. Gestión de Certificados de Sello Digital (CSD):\n\n- `POST csds` — Cargar nuevo CSD (`multipart/form-data` con archivos `.cer` y `.key`). La llave privada se cifra con AWS KMS antes de persistirse — nunca se almacena en texto plano.\n- `GET csds` — Listar CSDs activos del tenant con vigencia y sucursal",
        "operationId": "ProxyController_proxyCsdBase_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de certificados"
          },
          "201": {
            "description": "CSD cargado y cifrado exitosamente"
          },
          "400": {
            "description": "Archivo inválido, CSD vencido o RFC no coincide con el tenant"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Cargar CSD / Listar certificados",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      }
    },
    "/api/v1/csds/{splat}": {
      "get": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- `GET csds/:id` — Obtener detalle del CSD (sin exponer llave privada)\n- `PATCH csds/:id` — Activar/desactivar CSD o asignar como default\n- `DELETE csds/:id` — Revocar y eliminar CSD\n\n> El endpoint `csds/:id/decrypt` está bloqueado en el gateway — es de uso interno únicamente.",
        "operationId": "ProxyController_proxyCsd_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Certificado no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de certificado específico",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- `GET csds/:id` — Obtener detalle del CSD (sin exponer llave privada)\n- `PATCH csds/:id` — Activar/desactivar CSD o asignar como default\n- `DELETE csds/:id` — Revocar y eliminar CSD\n\n> El endpoint `csds/:id/decrypt` está bloqueado en el gateway — es de uso interno únicamente.",
        "operationId": "ProxyController_proxyCsd_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Certificado no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de certificado específico",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- `GET csds/:id` — Obtener detalle del CSD (sin exponer llave privada)\n- `PATCH csds/:id` — Activar/desactivar CSD o asignar como default\n- `DELETE csds/:id` — Revocar y eliminar CSD\n\n> El endpoint `csds/:id/decrypt` está bloqueado en el gateway — es de uso interno únicamente.",
        "operationId": "ProxyController_proxyCsd_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Certificado no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de certificado específico",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- `GET csds/:id` — Obtener detalle del CSD (sin exponer llave privada)\n- `PATCH csds/:id` — Activar/desactivar CSD o asignar como default\n- `DELETE csds/:id` — Revocar y eliminar CSD\n\n> El endpoint `csds/:id/decrypt` está bloqueado en el gateway — es de uso interno únicamente.",
        "operationId": "ProxyController_proxyCsd_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Certificado no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de certificado específico",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- `GET csds/:id` — Obtener detalle del CSD (sin exponer llave privada)\n- `PATCH csds/:id` — Activar/desactivar CSD o asignar como default\n- `DELETE csds/:id` — Revocar y eliminar CSD\n\n> El endpoint `csds/:id/decrypt` está bloqueado en el gateway — es de uso interno únicamente.",
        "operationId": "ProxyController_proxyCsd_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Certificado no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de certificado específico",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- `GET csds/:id` — Obtener detalle del CSD (sin exponer llave privada)\n- `PATCH csds/:id` — Activar/desactivar CSD o asignar como default\n- `DELETE csds/:id` — Revocar y eliminar CSD\n\n> El endpoint `csds/:id/decrypt` está bloqueado en el gateway — es de uso interno únicamente.",
        "operationId": "ProxyController_proxyCsd_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Certificado no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de certificado específico",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- `GET csds/:id` — Obtener detalle del CSD (sin exponer llave privada)\n- `PATCH csds/:id` — Activar/desactivar CSD o asignar como default\n- `DELETE csds/:id` — Revocar y eliminar CSD\n\n> El endpoint `csds/:id/decrypt` está bloqueado en el gateway — es de uso interno únicamente.",
        "operationId": "ProxyController_proxyCsd_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Certificado no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de certificado específico",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- `GET csds/:id` — Obtener detalle del CSD (sin exponer llave privada)\n- `PATCH csds/:id` — Activar/desactivar CSD o asignar como default\n- `DELETE csds/:id` — Revocar y eliminar CSD\n\n> El endpoint `csds/:id/decrypt` está bloqueado en el gateway — es de uso interno únicamente.",
        "operationId": "ProxyController_proxyCsd_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "404": {
            "description": "Certificado no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de certificado específico",
        "tags": [
          "Proxy",
          "Certificados (CSD)"
        ]
      }
    },
    "/api/v1/catalogs/{splat}": {
      "get": {
        "description": "Proxy hacia **fc-catalog-service**. Catálogos del Anexo 20 CFDI 4.0 (55,000+ registros):\n\n- `GET catalogs/productos` — Buscar claves de productos y servicios (`c_ClaveProdServ`) con búsqueda de texto completo\n- `GET catalogs/unidades` — Claves de unidad de medida (`c_ClaveUnidad`)\n- `GET catalogs/regimenes` — Regímenes fiscales (`c_RegimenFiscal`)\n- `GET catalogs/usos-cfdi` — Usos CFDI del receptor (`c_UsoCFDI`)\n- `GET catalogs/formas-pago` — Formas de pago (`c_FormaPago`)\n- `GET catalogs/metodos-pago` — Métodos de pago (`c_MetodoPago`)\n- `GET catalogs/monedas` — Monedas (`c_Moneda`)\n- `GET catalogs/paises` — Países (`c_Pais`)",
        "operationId": "ProxyController_proxyCatalog_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Resultados del catálogo"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Consulta de catálogos oficiales del SAT",
        "tags": [
          "Proxy",
          "Catálogos SAT"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-catalog-service**. Catálogos del Anexo 20 CFDI 4.0 (55,000+ registros):\n\n- `GET catalogs/productos` — Buscar claves de productos y servicios (`c_ClaveProdServ`) con búsqueda de texto completo\n- `GET catalogs/unidades` — Claves de unidad de medida (`c_ClaveUnidad`)\n- `GET catalogs/regimenes` — Regímenes fiscales (`c_RegimenFiscal`)\n- `GET catalogs/usos-cfdi` — Usos CFDI del receptor (`c_UsoCFDI`)\n- `GET catalogs/formas-pago` — Formas de pago (`c_FormaPago`)\n- `GET catalogs/metodos-pago` — Métodos de pago (`c_MetodoPago`)\n- `GET catalogs/monedas` — Monedas (`c_Moneda`)\n- `GET catalogs/paises` — Países (`c_Pais`)",
        "operationId": "ProxyController_proxyCatalog_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Resultados del catálogo"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Consulta de catálogos oficiales del SAT",
        "tags": [
          "Proxy",
          "Catálogos SAT"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-catalog-service**. Catálogos del Anexo 20 CFDI 4.0 (55,000+ registros):\n\n- `GET catalogs/productos` — Buscar claves de productos y servicios (`c_ClaveProdServ`) con búsqueda de texto completo\n- `GET catalogs/unidades` — Claves de unidad de medida (`c_ClaveUnidad`)\n- `GET catalogs/regimenes` — Regímenes fiscales (`c_RegimenFiscal`)\n- `GET catalogs/usos-cfdi` — Usos CFDI del receptor (`c_UsoCFDI`)\n- `GET catalogs/formas-pago` — Formas de pago (`c_FormaPago`)\n- `GET catalogs/metodos-pago` — Métodos de pago (`c_MetodoPago`)\n- `GET catalogs/monedas` — Monedas (`c_Moneda`)\n- `GET catalogs/paises` — Países (`c_Pais`)",
        "operationId": "ProxyController_proxyCatalog_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Resultados del catálogo"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Consulta de catálogos oficiales del SAT",
        "tags": [
          "Proxy",
          "Catálogos SAT"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-catalog-service**. Catálogos del Anexo 20 CFDI 4.0 (55,000+ registros):\n\n- `GET catalogs/productos` — Buscar claves de productos y servicios (`c_ClaveProdServ`) con búsqueda de texto completo\n- `GET catalogs/unidades` — Claves de unidad de medida (`c_ClaveUnidad`)\n- `GET catalogs/regimenes` — Regímenes fiscales (`c_RegimenFiscal`)\n- `GET catalogs/usos-cfdi` — Usos CFDI del receptor (`c_UsoCFDI`)\n- `GET catalogs/formas-pago` — Formas de pago (`c_FormaPago`)\n- `GET catalogs/metodos-pago` — Métodos de pago (`c_MetodoPago`)\n- `GET catalogs/monedas` — Monedas (`c_Moneda`)\n- `GET catalogs/paises` — Países (`c_Pais`)",
        "operationId": "ProxyController_proxyCatalog_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Resultados del catálogo"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Consulta de catálogos oficiales del SAT",
        "tags": [
          "Proxy",
          "Catálogos SAT"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-catalog-service**. Catálogos del Anexo 20 CFDI 4.0 (55,000+ registros):\n\n- `GET catalogs/productos` — Buscar claves de productos y servicios (`c_ClaveProdServ`) con búsqueda de texto completo\n- `GET catalogs/unidades` — Claves de unidad de medida (`c_ClaveUnidad`)\n- `GET catalogs/regimenes` — Regímenes fiscales (`c_RegimenFiscal`)\n- `GET catalogs/usos-cfdi` — Usos CFDI del receptor (`c_UsoCFDI`)\n- `GET catalogs/formas-pago` — Formas de pago (`c_FormaPago`)\n- `GET catalogs/metodos-pago` — Métodos de pago (`c_MetodoPago`)\n- `GET catalogs/monedas` — Monedas (`c_Moneda`)\n- `GET catalogs/paises` — Países (`c_Pais`)",
        "operationId": "ProxyController_proxyCatalog_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Resultados del catálogo"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Consulta de catálogos oficiales del SAT",
        "tags": [
          "Proxy",
          "Catálogos SAT"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-catalog-service**. Catálogos del Anexo 20 CFDI 4.0 (55,000+ registros):\n\n- `GET catalogs/productos` — Buscar claves de productos y servicios (`c_ClaveProdServ`) con búsqueda de texto completo\n- `GET catalogs/unidades` — Claves de unidad de medida (`c_ClaveUnidad`)\n- `GET catalogs/regimenes` — Regímenes fiscales (`c_RegimenFiscal`)\n- `GET catalogs/usos-cfdi` — Usos CFDI del receptor (`c_UsoCFDI`)\n- `GET catalogs/formas-pago` — Formas de pago (`c_FormaPago`)\n- `GET catalogs/metodos-pago` — Métodos de pago (`c_MetodoPago`)\n- `GET catalogs/monedas` — Monedas (`c_Moneda`)\n- `GET catalogs/paises` — Países (`c_Pais`)",
        "operationId": "ProxyController_proxyCatalog_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Resultados del catálogo"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Consulta de catálogos oficiales del SAT",
        "tags": [
          "Proxy",
          "Catálogos SAT"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-catalog-service**. Catálogos del Anexo 20 CFDI 4.0 (55,000+ registros):\n\n- `GET catalogs/productos` — Buscar claves de productos y servicios (`c_ClaveProdServ`) con búsqueda de texto completo\n- `GET catalogs/unidades` — Claves de unidad de medida (`c_ClaveUnidad`)\n- `GET catalogs/regimenes` — Regímenes fiscales (`c_RegimenFiscal`)\n- `GET catalogs/usos-cfdi` — Usos CFDI del receptor (`c_UsoCFDI`)\n- `GET catalogs/formas-pago` — Formas de pago (`c_FormaPago`)\n- `GET catalogs/metodos-pago` — Métodos de pago (`c_MetodoPago`)\n- `GET catalogs/monedas` — Monedas (`c_Moneda`)\n- `GET catalogs/paises` — Países (`c_Pais`)",
        "operationId": "ProxyController_proxyCatalog_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Resultados del catálogo"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Consulta de catálogos oficiales del SAT",
        "tags": [
          "Proxy",
          "Catálogos SAT"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-catalog-service**. Catálogos del Anexo 20 CFDI 4.0 (55,000+ registros):\n\n- `GET catalogs/productos` — Buscar claves de productos y servicios (`c_ClaveProdServ`) con búsqueda de texto completo\n- `GET catalogs/unidades` — Claves de unidad de medida (`c_ClaveUnidad`)\n- `GET catalogs/regimenes` — Regímenes fiscales (`c_RegimenFiscal`)\n- `GET catalogs/usos-cfdi` — Usos CFDI del receptor (`c_UsoCFDI`)\n- `GET catalogs/formas-pago` — Formas de pago (`c_FormaPago`)\n- `GET catalogs/metodos-pago` — Métodos de pago (`c_MetodoPago`)\n- `GET catalogs/monedas` — Monedas (`c_Moneda`)\n- `GET catalogs/paises` — Países (`c_Pais`)",
        "operationId": "ProxyController_proxyCatalog_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Resultados del catálogo"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Consulta de catálogos oficiales del SAT",
        "tags": [
          "Proxy",
          "Catálogos SAT"
        ]
      }
    },
    "/api/v1/stats/cfdi": {
      "get": {
        "description": "Proxy hacia **fc-cfdi-service**. Resumen del período activo:\n\n- Total de CFDIs emitidos, cancelados y pendientes\n- Monto total facturado (subtotal, impuestos, total)\n- Distribución por tipo de comprobante (I, E, P, N, T)",
        "operationId": "ProxyController_proxyStatsCfdi_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas del período"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de CFDIs del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-cfdi-service**. Resumen del período activo:\n\n- Total de CFDIs emitidos, cancelados y pendientes\n- Monto total facturado (subtotal, impuestos, total)\n- Distribución por tipo de comprobante (I, E, P, N, T)",
        "operationId": "ProxyController_proxyStatsCfdi_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas del período"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de CFDIs del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-cfdi-service**. Resumen del período activo:\n\n- Total de CFDIs emitidos, cancelados y pendientes\n- Monto total facturado (subtotal, impuestos, total)\n- Distribución por tipo de comprobante (I, E, P, N, T)",
        "operationId": "ProxyController_proxyStatsCfdi_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas del período"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de CFDIs del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-cfdi-service**. Resumen del período activo:\n\n- Total de CFDIs emitidos, cancelados y pendientes\n- Monto total facturado (subtotal, impuestos, total)\n- Distribución por tipo de comprobante (I, E, P, N, T)",
        "operationId": "ProxyController_proxyStatsCfdi_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas del período"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de CFDIs del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-cfdi-service**. Resumen del período activo:\n\n- Total de CFDIs emitidos, cancelados y pendientes\n- Monto total facturado (subtotal, impuestos, total)\n- Distribución por tipo de comprobante (I, E, P, N, T)",
        "operationId": "ProxyController_proxyStatsCfdi_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas del período"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de CFDIs del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-cfdi-service**. Resumen del período activo:\n\n- Total de CFDIs emitidos, cancelados y pendientes\n- Monto total facturado (subtotal, impuestos, total)\n- Distribución por tipo de comprobante (I, E, P, N, T)",
        "operationId": "ProxyController_proxyStatsCfdi_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas del período"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de CFDIs del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-cfdi-service**. Resumen del período activo:\n\n- Total de CFDIs emitidos, cancelados y pendientes\n- Monto total facturado (subtotal, impuestos, total)\n- Distribución por tipo de comprobante (I, E, P, N, T)",
        "operationId": "ProxyController_proxyStatsCfdi_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas del período"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de CFDIs del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-cfdi-service**. Resumen del período activo:\n\n- Total de CFDIs emitidos, cancelados y pendientes\n- Monto total facturado (subtotal, impuestos, total)\n- Distribución por tipo de comprobante (I, E, P, N, T)",
        "operationId": "ProxyController_proxyStatsCfdi_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas del período"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de CFDIs del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      }
    },
    "/api/v1/stats/csd": {
      "get": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- Cantidad de CSDs activos y por vencer\n- Próximas fechas de vencimiento\n- Alertas de renovación (< 30 días de vigencia)",
        "operationId": "ProxyController_proxyStatsCsd_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de certificados"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de certificados CSD",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- Cantidad de CSDs activos y por vencer\n- Próximas fechas de vencimiento\n- Alertas de renovación (< 30 días de vigencia)",
        "operationId": "ProxyController_proxyStatsCsd_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de certificados"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de certificados CSD",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- Cantidad de CSDs activos y por vencer\n- Próximas fechas de vencimiento\n- Alertas de renovación (< 30 días de vigencia)",
        "operationId": "ProxyController_proxyStatsCsd_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de certificados"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de certificados CSD",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- Cantidad de CSDs activos y por vencer\n- Próximas fechas de vencimiento\n- Alertas de renovación (< 30 días de vigencia)",
        "operationId": "ProxyController_proxyStatsCsd_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de certificados"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de certificados CSD",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- Cantidad de CSDs activos y por vencer\n- Próximas fechas de vencimiento\n- Alertas de renovación (< 30 días de vigencia)",
        "operationId": "ProxyController_proxyStatsCsd_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de certificados"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de certificados CSD",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- Cantidad de CSDs activos y por vencer\n- Próximas fechas de vencimiento\n- Alertas de renovación (< 30 días de vigencia)",
        "operationId": "ProxyController_proxyStatsCsd_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de certificados"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de certificados CSD",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- Cantidad de CSDs activos y por vencer\n- Próximas fechas de vencimiento\n- Alertas de renovación (< 30 días de vigencia)",
        "operationId": "ProxyController_proxyStatsCsd_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de certificados"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de certificados CSD",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-csd-service**.\n\n- Cantidad de CSDs activos y por vencer\n- Próximas fechas de vencimiento\n- Alertas de renovación (< 30 días de vigencia)",
        "operationId": "ProxyController_proxyStatsCsd_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de certificados"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de certificados CSD",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      }
    },
    "/api/v1/stats/users": {
      "get": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- Total de usuarios por rol (ADMIN, OPERADOR, CONSULTOR)\n- Usuarios activos vs. inactivos\n- Último acceso por usuario",
        "operationId": "ProxyController_proxyStatsUsers_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de usuarios"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de usuarios del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- Total de usuarios por rol (ADMIN, OPERADOR, CONSULTOR)\n- Usuarios activos vs. inactivos\n- Último acceso por usuario",
        "operationId": "ProxyController_proxyStatsUsers_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de usuarios"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de usuarios del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- Total de usuarios por rol (ADMIN, OPERADOR, CONSULTOR)\n- Usuarios activos vs. inactivos\n- Último acceso por usuario",
        "operationId": "ProxyController_proxyStatsUsers_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de usuarios"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de usuarios del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- Total de usuarios por rol (ADMIN, OPERADOR, CONSULTOR)\n- Usuarios activos vs. inactivos\n- Último acceso por usuario",
        "operationId": "ProxyController_proxyStatsUsers_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de usuarios"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de usuarios del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- Total de usuarios por rol (ADMIN, OPERADOR, CONSULTOR)\n- Usuarios activos vs. inactivos\n- Último acceso por usuario",
        "operationId": "ProxyController_proxyStatsUsers_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de usuarios"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de usuarios del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- Total de usuarios por rol (ADMIN, OPERADOR, CONSULTOR)\n- Usuarios activos vs. inactivos\n- Último acceso por usuario",
        "operationId": "ProxyController_proxyStatsUsers_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de usuarios"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de usuarios del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- Total de usuarios por rol (ADMIN, OPERADOR, CONSULTOR)\n- Usuarios activos vs. inactivos\n- Último acceso por usuario",
        "operationId": "ProxyController_proxyStatsUsers_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de usuarios"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de usuarios del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- Total de usuarios por rol (ADMIN, OPERADOR, CONSULTOR)\n- Usuarios activos vs. inactivos\n- Último acceso por usuario",
        "operationId": "ProxyController_proxyStatsUsers_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Estadísticas de usuarios"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Estadísticas de usuarios del tenant",
        "tags": [
          "Proxy",
          "Estadísticas"
        ]
      }
    },
    "/api/v1/webhooks": {
      "get": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST webhooks` — Registrar nuevo webhook (devuelve secret una sola vez)\n- `GET webhooks` — Listar webhooks del tenant (sin secret)",
        "operationId": "ProxyController_proxyWebhooksBase_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de webhooks"
          },
          "201": {
            "description": "Webhook creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear / Listar webhooks",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST webhooks` — Registrar nuevo webhook (devuelve secret una sola vez)\n- `GET webhooks` — Listar webhooks del tenant (sin secret)",
        "operationId": "ProxyController_proxyWebhooksBase_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de webhooks"
          },
          "201": {
            "description": "Webhook creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear / Listar webhooks",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST webhooks` — Registrar nuevo webhook (devuelve secret una sola vez)\n- `GET webhooks` — Listar webhooks del tenant (sin secret)",
        "operationId": "ProxyController_proxyWebhooksBase_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de webhooks"
          },
          "201": {
            "description": "Webhook creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear / Listar webhooks",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST webhooks` — Registrar nuevo webhook (devuelve secret una sola vez)\n- `GET webhooks` — Listar webhooks del tenant (sin secret)",
        "operationId": "ProxyController_proxyWebhooksBase_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de webhooks"
          },
          "201": {
            "description": "Webhook creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear / Listar webhooks",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST webhooks` — Registrar nuevo webhook (devuelve secret una sola vez)\n- `GET webhooks` — Listar webhooks del tenant (sin secret)",
        "operationId": "ProxyController_proxyWebhooksBase_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de webhooks"
          },
          "201": {
            "description": "Webhook creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear / Listar webhooks",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST webhooks` — Registrar nuevo webhook (devuelve secret una sola vez)\n- `GET webhooks` — Listar webhooks del tenant (sin secret)",
        "operationId": "ProxyController_proxyWebhooksBase_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de webhooks"
          },
          "201": {
            "description": "Webhook creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear / Listar webhooks",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST webhooks` — Registrar nuevo webhook (devuelve secret una sola vez)\n- `GET webhooks` — Listar webhooks del tenant (sin secret)",
        "operationId": "ProxyController_proxyWebhooksBase_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de webhooks"
          },
          "201": {
            "description": "Webhook creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear / Listar webhooks",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `POST webhooks` — Registrar nuevo webhook (devuelve secret una sola vez)\n- `GET webhooks` — Listar webhooks del tenant (sin secret)",
        "operationId": "ProxyController_proxyWebhooksBase_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Lista de webhooks"
          },
          "201": {
            "description": "Webhook creado"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Crear / Listar webhooks",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      }
    },
    "/api/v1/webhooks/{splat}": {
      "get": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `PATCH webhooks/:id` — Actualizar URL, eventos o estado\n- `DELETE webhooks/:id` — Eliminar webhook\n- `GET webhooks/:id/deliveries` — Historial de entregas\n- `POST webhooks/:id/test` — Enviar evento de prueba",
        "operationId": "ProxyController_proxyWebhooks_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "Webhook no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de webhook específico",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `PATCH webhooks/:id` — Actualizar URL, eventos o estado\n- `DELETE webhooks/:id` — Eliminar webhook\n- `GET webhooks/:id/deliveries` — Historial de entregas\n- `POST webhooks/:id/test` — Enviar evento de prueba",
        "operationId": "ProxyController_proxyWebhooks_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "Webhook no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de webhook específico",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `PATCH webhooks/:id` — Actualizar URL, eventos o estado\n- `DELETE webhooks/:id` — Eliminar webhook\n- `GET webhooks/:id/deliveries` — Historial de entregas\n- `POST webhooks/:id/test` — Enviar evento de prueba",
        "operationId": "ProxyController_proxyWebhooks_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "Webhook no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de webhook específico",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `PATCH webhooks/:id` — Actualizar URL, eventos o estado\n- `DELETE webhooks/:id` — Eliminar webhook\n- `GET webhooks/:id/deliveries` — Historial de entregas\n- `POST webhooks/:id/test` — Enviar evento de prueba",
        "operationId": "ProxyController_proxyWebhooks_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "Webhook no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de webhook específico",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `PATCH webhooks/:id` — Actualizar URL, eventos o estado\n- `DELETE webhooks/:id` — Eliminar webhook\n- `GET webhooks/:id/deliveries` — Historial de entregas\n- `POST webhooks/:id/test` — Enviar evento de prueba",
        "operationId": "ProxyController_proxyWebhooks_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "Webhook no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de webhook específico",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `PATCH webhooks/:id` — Actualizar URL, eventos o estado\n- `DELETE webhooks/:id` — Eliminar webhook\n- `GET webhooks/:id/deliveries` — Historial de entregas\n- `POST webhooks/:id/test` — Enviar evento de prueba",
        "operationId": "ProxyController_proxyWebhooks_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "Webhook no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de webhook específico",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `PATCH webhooks/:id` — Actualizar URL, eventos o estado\n- `DELETE webhooks/:id` — Eliminar webhook\n- `GET webhooks/:id/deliveries` — Historial de entregas\n- `POST webhooks/:id/test` — Enviar evento de prueba",
        "operationId": "ProxyController_proxyWebhooks_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "Webhook no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de webhook específico",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-auth-service**.\n\n- `PATCH webhooks/:id` — Actualizar URL, eventos o estado\n- `DELETE webhooks/:id` — Eliminar webhook\n- `GET webhooks/:id/deliveries` — Historial de entregas\n- `POST webhooks/:id/test` — Enviar evento de prueba",
        "operationId": "ProxyController_proxyWebhooks_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          },
          "403": {
            "description": "Sin permisos (requiere ADMIN)"
          },
          "404": {
            "description": "Webhook no encontrado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Gestión de webhook específico",
        "tags": [
          "Proxy",
          "Webhooks"
        ]
      }
    },
    "/api/v1/billing/plans": {
      "get": {
        "operationId": "ProxyController_proxyBillingPlans_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Planes de suscripción disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "post": {
        "operationId": "ProxyController_proxyBillingPlans_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Planes de suscripción disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "put": {
        "operationId": "ProxyController_proxyBillingPlans_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Planes de suscripción disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "delete": {
        "operationId": "ProxyController_proxyBillingPlans_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Planes de suscripción disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "patch": {
        "operationId": "ProxyController_proxyBillingPlans_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Planes de suscripción disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "options": {
        "operationId": "ProxyController_proxyBillingPlans_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Planes de suscripción disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "head": {
        "operationId": "ProxyController_proxyBillingPlans_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Planes de suscripción disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "search": {
        "operationId": "ProxyController_proxyBillingPlans_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Planes de suscripción disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      }
    },
    "/api/v1/billing/subscription": {
      "get": {
        "operationId": "ProxyController_proxyBillingSubscription_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Ver suscripción actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "post": {
        "operationId": "ProxyController_proxyBillingSubscription_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Ver suscripción actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "put": {
        "operationId": "ProxyController_proxyBillingSubscription_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Ver suscripción actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "delete": {
        "operationId": "ProxyController_proxyBillingSubscription_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Ver suscripción actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "patch": {
        "operationId": "ProxyController_proxyBillingSubscription_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Ver suscripción actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "options": {
        "operationId": "ProxyController_proxyBillingSubscription_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Ver suscripción actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "head": {
        "operationId": "ProxyController_proxyBillingSubscription_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Ver suscripción actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "search": {
        "operationId": "ProxyController_proxyBillingSubscription_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Ver suscripción actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      }
    },
    "/api/v1/billing/subscription/{splat}": {
      "get": {
        "operationId": "ProxyController_proxyBillingSubscriptionActions_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Acciones de suscripción (checkout, cancel)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "post": {
        "operationId": "ProxyController_proxyBillingSubscriptionActions_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Acciones de suscripción (checkout, cancel)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "put": {
        "operationId": "ProxyController_proxyBillingSubscriptionActions_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Acciones de suscripción (checkout, cancel)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "delete": {
        "operationId": "ProxyController_proxyBillingSubscriptionActions_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Acciones de suscripción (checkout, cancel)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "patch": {
        "operationId": "ProxyController_proxyBillingSubscriptionActions_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Acciones de suscripción (checkout, cancel)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "options": {
        "operationId": "ProxyController_proxyBillingSubscriptionActions_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Acciones de suscripción (checkout, cancel)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "head": {
        "operationId": "ProxyController_proxyBillingSubscriptionActions_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Acciones de suscripción (checkout, cancel)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "search": {
        "operationId": "ProxyController_proxyBillingSubscriptionActions_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Acciones de suscripción (checkout, cancel)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      }
    },
    "/api/v1/billing/usage": {
      "get": {
        "operationId": "ProxyController_proxyBillingUsage_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Uso de CFDIs del período actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "post": {
        "operationId": "ProxyController_proxyBillingUsage_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Uso de CFDIs del período actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "put": {
        "operationId": "ProxyController_proxyBillingUsage_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Uso de CFDIs del período actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "delete": {
        "operationId": "ProxyController_proxyBillingUsage_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Uso de CFDIs del período actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "patch": {
        "operationId": "ProxyController_proxyBillingUsage_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Uso de CFDIs del período actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "options": {
        "operationId": "ProxyController_proxyBillingUsage_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Uso de CFDIs del período actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "head": {
        "operationId": "ProxyController_proxyBillingUsage_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Uso de CFDIs del período actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "search": {
        "operationId": "ProxyController_proxyBillingUsage_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Uso de CFDIs del período actual",
        "tags": [
          "Proxy",
          "Billing"
        ]
      }
    },
    "/api/v1/billing/overage/packs": {
      "get": {
        "operationId": "ProxyController_proxyBillingOveragePacks_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Paquetes de CFDIs extra disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "post": {
        "operationId": "ProxyController_proxyBillingOveragePacks_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Paquetes de CFDIs extra disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "put": {
        "operationId": "ProxyController_proxyBillingOveragePacks_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Paquetes de CFDIs extra disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "delete": {
        "operationId": "ProxyController_proxyBillingOveragePacks_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Paquetes de CFDIs extra disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "patch": {
        "operationId": "ProxyController_proxyBillingOveragePacks_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Paquetes de CFDIs extra disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "options": {
        "operationId": "ProxyController_proxyBillingOveragePacks_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Paquetes de CFDIs extra disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "head": {
        "operationId": "ProxyController_proxyBillingOveragePacks_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Paquetes de CFDIs extra disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "search": {
        "operationId": "ProxyController_proxyBillingOveragePacks_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Paquetes de CFDIs extra disponibles",
        "tags": [
          "Proxy",
          "Billing"
        ]
      }
    },
    "/api/v1/billing/overage/checkout": {
      "get": {
        "operationId": "ProxyController_proxyBillingOverageCheckout_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Checkout de paquete de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "post": {
        "operationId": "ProxyController_proxyBillingOverageCheckout_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Checkout de paquete de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "put": {
        "operationId": "ProxyController_proxyBillingOverageCheckout_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Checkout de paquete de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "delete": {
        "operationId": "ProxyController_proxyBillingOverageCheckout_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Checkout de paquete de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "patch": {
        "operationId": "ProxyController_proxyBillingOverageCheckout_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Checkout de paquete de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "options": {
        "operationId": "ProxyController_proxyBillingOverageCheckout_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Checkout de paquete de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "head": {
        "operationId": "ProxyController_proxyBillingOverageCheckout_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Checkout de paquete de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "search": {
        "operationId": "ProxyController_proxyBillingOverageCheckout_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Checkout de paquete de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      }
    },
    "/api/v1/billing/overage/history": {
      "get": {
        "operationId": "ProxyController_proxyBillingOverageHistory_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Historial de compras de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "post": {
        "operationId": "ProxyController_proxyBillingOverageHistory_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Historial de compras de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "put": {
        "operationId": "ProxyController_proxyBillingOverageHistory_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Historial de compras de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "delete": {
        "operationId": "ProxyController_proxyBillingOverageHistory_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Historial de compras de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "patch": {
        "operationId": "ProxyController_proxyBillingOverageHistory_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Historial de compras de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "options": {
        "operationId": "ProxyController_proxyBillingOverageHistory_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Historial de compras de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "head": {
        "operationId": "ProxyController_proxyBillingOverageHistory_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Historial de compras de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "search": {
        "operationId": "ProxyController_proxyBillingOverageHistory_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Historial de compras de CFDIs extra",
        "tags": [
          "Proxy",
          "Billing"
        ]
      }
    },
    "/api/v1/billing/webhooks/{splat}": {
      "get": {
        "operationId": "ProxyController_proxyBillingWebhooks_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Webhooks de proveedores de pago (sin JWT)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "post": {
        "operationId": "ProxyController_proxyBillingWebhooks_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Webhooks de proveedores de pago (sin JWT)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "put": {
        "operationId": "ProxyController_proxyBillingWebhooks_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Webhooks de proveedores de pago (sin JWT)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "delete": {
        "operationId": "ProxyController_proxyBillingWebhooks_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Webhooks de proveedores de pago (sin JWT)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "patch": {
        "operationId": "ProxyController_proxyBillingWebhooks_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Webhooks de proveedores de pago (sin JWT)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "options": {
        "operationId": "ProxyController_proxyBillingWebhooks_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Webhooks de proveedores de pago (sin JWT)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "head": {
        "operationId": "ProxyController_proxyBillingWebhooks_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Webhooks de proveedores de pago (sin JWT)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      },
      "search": {
        "operationId": "ProxyController_proxyBillingWebhooks_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Webhooks de proveedores de pago (sin JWT)",
        "tags": [
          "Proxy",
          "Billing"
        ]
      }
    },
    "/api/v1/ai/{splat}": {
      "get": {
        "description": "Proxy hacia **fc-ai-service**. Endpoints de IA:\n\n- `POST ai/invoice-from-text` — Generar preview de factura desde texto\n- `POST ai/invoice-from-text/confirm` — Confirmar y emitir CFDI\n",
        "operationId": "ProxyController_proxyAi_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "AI operations (natural language invoicing)",
        "tags": [
          "Proxy",
          "AI"
        ]
      },
      "post": {
        "description": "Proxy hacia **fc-ai-service**. Endpoints de IA:\n\n- `POST ai/invoice-from-text` — Generar preview de factura desde texto\n- `POST ai/invoice-from-text/confirm` — Confirmar y emitir CFDI\n",
        "operationId": "ProxyController_proxyAi_post",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "AI operations (natural language invoicing)",
        "tags": [
          "Proxy",
          "AI"
        ]
      },
      "put": {
        "description": "Proxy hacia **fc-ai-service**. Endpoints de IA:\n\n- `POST ai/invoice-from-text` — Generar preview de factura desde texto\n- `POST ai/invoice-from-text/confirm` — Confirmar y emitir CFDI\n",
        "operationId": "ProxyController_proxyAi_put",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "AI operations (natural language invoicing)",
        "tags": [
          "Proxy",
          "AI"
        ]
      },
      "delete": {
        "description": "Proxy hacia **fc-ai-service**. Endpoints de IA:\n\n- `POST ai/invoice-from-text` — Generar preview de factura desde texto\n- `POST ai/invoice-from-text/confirm` — Confirmar y emitir CFDI\n",
        "operationId": "ProxyController_proxyAi_delete",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "AI operations (natural language invoicing)",
        "tags": [
          "Proxy",
          "AI"
        ]
      },
      "patch": {
        "description": "Proxy hacia **fc-ai-service**. Endpoints de IA:\n\n- `POST ai/invoice-from-text` — Generar preview de factura desde texto\n- `POST ai/invoice-from-text/confirm` — Confirmar y emitir CFDI\n",
        "operationId": "ProxyController_proxyAi_patch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "AI operations (natural language invoicing)",
        "tags": [
          "Proxy",
          "AI"
        ]
      },
      "options": {
        "description": "Proxy hacia **fc-ai-service**. Endpoints de IA:\n\n- `POST ai/invoice-from-text` — Generar preview de factura desde texto\n- `POST ai/invoice-from-text/confirm` — Confirmar y emitir CFDI\n",
        "operationId": "ProxyController_proxyAi_options",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "AI operations (natural language invoicing)",
        "tags": [
          "Proxy",
          "AI"
        ]
      },
      "head": {
        "description": "Proxy hacia **fc-ai-service**. Endpoints de IA:\n\n- `POST ai/invoice-from-text` — Generar preview de factura desde texto\n- `POST ai/invoice-from-text/confirm` — Confirmar y emitir CFDI\n",
        "operationId": "ProxyController_proxyAi_head",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "AI operations (natural language invoicing)",
        "tags": [
          "Proxy",
          "AI"
        ]
      },
      "search": {
        "description": "Proxy hacia **fc-ai-service**. Endpoints de IA:\n\n- `POST ai/invoice-from-text` — Generar preview de factura desde texto\n- `POST ai/invoice-from-text/confirm` — Confirmar y emitir CFDI\n",
        "operationId": "ProxyController_proxyAi_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Operación exitosa"
          },
          "401": {
            "description": "No autenticado"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "AI operations (natural language invoicing)",
        "tags": [
          "Proxy",
          "AI"
        ]
      }
    }
  },
  "info": {
    "title": "FactuLink API",
    "description": "API REST para la emisión, consulta y administración de Comprobantes Fiscales Digitales por Internet (CFDI 4.0) conforme al Anexo 20 del SAT.\n\n## Autenticación\n\nLa mayoría de endpoints requieren un **Bearer Token** (JWT RS256) en el header `Authorization`.\nObtén tu token en `POST /api/v1/auth/login`.\n\nAlgunos endpoints de integración aceptan autenticación vía **API Key** en el header `X-API-Key`.\n\n## Errores\n\nTodas las respuestas de error siguen el formato `{ statusCode, message, error }` con códigos HTTP estándar.",
    "version": "1.0.0",
    "contact": {}
  },
  "tags": [
    {
      "name": "Autenticación",
      "description": "Login, registro y renovación de tokens."
    },
    {
      "name": "Usuarios",
      "description": "Gestión de usuarios del tenant (ADMIN, OPERADOR, CONSULTOR)."
    },
    {
      "name": "Tenant",
      "description": "Perfil y configuración fiscal del tenant."
    },
    {
      "name": "CFDIs",
      "description": "Emisión, consulta, cancelación y descarga de CFDI 4.0."
    },
    {
      "name": "Clientes",
      "description": "Directorio de receptores frecuentes."
    },
    {
      "name": "Series",
      "description": "Administración de series y folios de comprobantes."
    },
    {
      "name": "Certificados (CSD)",
      "description": "Carga y gestión de Certificados de Sello Digital."
    },
    {
      "name": "Catálogos SAT",
      "description": "Búsqueda en catálogos oficiales del Anexo 20."
    },
    {
      "name": "Estadísticas",
      "description": "Resúmenes y métricas agregadas."
    },
    {
      "name": "Sistema",
      "description": "Health check y estado operativo."
    }
  ],
  "servers": [
    {
      "url": "https://api.factulink.com.mx",
      "description": "Producción (sk_live_*)"
    },
    {
      "url": "https://api.factulink.com.mx",
      "description": "Sandbox (sk_test_*)"
    }
  ],
  "components": {
    "securitySchemes": {
      "JWT": {
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "type": "http",
        "description": "JWT obtenido en POST /api/v1/auth/login"
      },
      "ApiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key",
        "description": "API Key para integraciones externas"
      }
    },
    "schemas": {}
  }
}