{
 "openapi": "3.1.0",
 "info": {
  "title": "ONTOGOB · API pública",
  "version": "0.3.3",
  "description": "Acceso de sólo lectura a la ontología, el grafo, las observaciones, los hallazgos y el registro criptográfico. Autenticación opcional con JWT de Supabase Auth; sin sesión se aplica el rol ciudadano. Todas las respuestas provienen de PostgreSQL bajo políticas de seguridad por filas.",
  "contact": {
   "url": "https://ontogob.vercel.app"
  }
 },
 "servers": [
  {
   "url": "https://rpehvytoidnzggcopkdw.supabase.co/rest/v1",
   "description": "PostgREST (cabecera apikey obligatoria: clave publishable)"
  },
  {
   "url": "https://rpehvytoidnzggcopkdw.supabase.co/functions/v1",
   "description": "Funciones de borde (Deno)"
  }
 ],
 "components": {
  "securitySchemes": {
   "apikey": {
    "type": "apiKey",
    "in": "header",
    "name": "apikey",
    "description": "Clave publishable pública del proyecto"
   },
   "jwt": {
    "type": "http",
    "scheme": "bearer",
    "bearerFormat": "JWT",
    "description": "Token de sesión de Supabase Auth (opcional; define el rol)"
   }
  }
 },
 "security": [
  {
   "apikey": []
  }
 ],
 "paths": {
  "/panorama": {
   "post": {
    "summary": "Indicadores del panorama con su procedencia (captura, hash, asiento)",
    "tags": [
     "Funciones (RPC)"
    ],
    "responses": {
     "200": {
      "description": "Resultado JSON"
     }
    }
   }
  },
  "/estado_sistema": {
   "post": {
    "summary": "Conteos y estado del sistema (nodos, aristas, asientos, anclas, fuentes, hallazgos)",
    "tags": [
     "Funciones (RPC)"
    ],
    "responses": {
     "200": {
      "description": "Resultado JSON"
     }
    }
   }
  },
  "/serie": {
   "post": {
    "summary": "Serie temporal de una variable",
    "tags": [
     "Funciones (RPC)"
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "p_variable": {
          "type": "string",
          "example": "xm.PorcVoluUtilDiar"
         },
         "p_sujeto": {
          "type": "string",
          "example": "SIN"
         },
         "p_desde": {
          "type": "string",
          "format": "date-time"
         },
         "p_limite": {
          "type": "integer",
          "example": 200
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Resultado JSON"
     }
    }
   }
  },
  "/ultimas_observaciones": {
   "post": {
    "summary": "Últimas observaciones de una variable",
    "tags": [
     "Funciones (RPC)"
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "p_variable": {
          "type": "string"
         },
         "p_limite": {
          "type": "integer"
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Resultado JSON"
     }
    }
   }
  },
  "/verificar_cadena": {
   "post": {
    "summary": "Recorre la cadena de asientos y recalcula cada enlace",
    "tags": [
     "Funciones (RPC)"
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "p_desde": {
          "type": "integer"
         },
         "p_hasta": {
          "type": "integer"
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Resultado JSON"
     }
    }
   }
  },
  "/vecindad": {
   "post": {
    "summary": "Vecindad de un nodo del grafo hasta N saltos",
    "tags": [
     "Funciones (RPC)"
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "p_nodo": {
          "type": "string",
          "format": "uuid"
         },
         "p_profundidad": {
          "type": "integer",
          "example": 2
         },
         "p_limite": {
          "type": "integer",
          "example": 300
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Resultado JSON"
     }
    }
   }
  },
  "/trazabilidad_entidad": {
   "post": {
    "summary": "Entidad estatal → contratos → proveedores → hallazgos → presupuesto",
    "tags": [
     "Funciones (RPC)"
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "p_nit": {
          "type": "string",
          "example": "899999055"
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Resultado JSON"
     }
    }
   }
  },
  "/programacion": {
   "post": {
    "summary": "Tareas programadas (pg_cron) y su última ejecución",
    "tags": [
     "Funciones (RPC)"
    ],
    "responses": {
     "200": {
      "description": "Resultado JSON"
     }
    }
   }
  },
  "/atlas": {
   "post": {
    "summary": "Atlas por escalas: hijos con agregados, actores por capa (público, control, conocimiento, privado: sociedades, consorcios y uniones temporales; personas naturales sólo agregadas), flujos de dinero, contratos ubicados en el municipio de la unidad contratante, hallazgos y ambiente del marco",
    "tags": [
     "Funciones (RPC)"
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "p_nivel": {
          "type": "string",
          "enum": [
           "pais",
           "departamento",
           "municipio"
          ],
          "example": "departamento"
         },
         "p_codigo": {
          "type": "string",
          "example": "05",
          "description": "COL, código DANE de 2 dígitos o de 5 dígitos"
         },
         "p_max": {
          "type": "integer",
          "example": 300
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Resultado JSON"
     }
    }
   }
  },
  "/geometria": {
   "post": {
    "summary": "Límites oficiales del Marco Geoestadístico Nacional (DANE) del marco pedido: departamentos y municipios con sus anillos en EPSG:4326, la procedencia de la captura y los municipios DIVIPOLA sin polígono",
    "tags": [
     "Funciones (RPC)"
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "p_nivel": {
          "type": "string",
          "enum": [
           "pais",
           "departamento",
           "municipio"
          ],
          "example": "departamento"
         },
         "p_codigo": {
          "type": "string",
          "example": "05"
         },
         "p_municipios": {
          "type": "boolean",
          "example": false,
          "description": "en la escala país, incluir además los 1.121 municipios"
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Resultado JSON"
     }
    }
   }
  },
  "/conteo_por_clase": {
   "post": {
    "summary": "Nodos visibles para el rol, agrupados por clase, en una sola consulta",
    "tags": [
     "Funciones (RPC)"
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {}
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Resultado JSON"
     }
    }
   }
  },
  "/conteo_hallazgos_abiertos": {
   "post": {
    "summary": "Hallazgos abiertos visibles para el rol, agrupados por regla, en una sola consulta",
    "tags": [
     "Funciones (RPC)"
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {}
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Resultado JSON"
     }
    }
   }
  },
  "/grafo_consolidado": {
   "post": {
    "summary": "Dos capas del grafo para el orbe: clases con conteos reales y muestra determinista de instancias con sus aristas. Con los parámetros por defecto devuelve el precálculo por nivel de visibilidad (ana.orbe); con otros, calcula en vivo",
    "tags": [
     "Funciones (RPC)"
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "p_por_clase": {
          "type": "integer",
          "example": 40
         },
         "p_aristas_valor": {
          "type": "integer",
          "example": 300
         },
         "p_max_aristas": {
          "type": "integer",
          "example": 4000
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Resultado JSON"
     }
    }
   }
  },
  "/territorios": {
   "get": {
    "summary": "Departamentos y municipios DIVIPOLA con centroide (base del mapa teselado)",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `territorios` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/nodos": {
   "get": {
    "summary": "Nodos del grafo (filtros PostgREST: `clase=eq.Contrato`, `etiqueta=ilike.*TRANSPORTE*`)",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `nodos` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/aristas": {
   "get": {
    "summary": "Relaciones del grafo",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `aristas` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/observaciones": {
   "get": {
    "summary": "Observaciones con procedencia",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `observaciones` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/capturas": {
   "get": {
    "summary": "Capturas de fuentes: URL, hash SHA-256, estado, asiento",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `capturas` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/hallazgos": {
   "get": {
    "summary": "Hallazgos de reglas de riesgo con evidencia",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `hallazgos` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/asientos": {
   "get": {
    "summary": "Registro criptográfico: asientos firmados",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `asientos` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/anclas": {
   "get": {
    "summary": "Anclas Merkle selladas y su publicación",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `anclas` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/asiento_anclas": {
   "get": {
    "summary": "Pruebas de inclusión de cada asiento en su ancla",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `asiento_anclas` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/llavero": {
   "get": {
    "summary": "Llaves públicas (ML-DSA-65, Ed25519, SLH-DSA, ML-KEM)",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `llavero` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/fuentes": {
   "get": {
    "summary": "Catálogo de fuentes oficiales con estado de conexión",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `fuentes` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/clases": {
   "get": {
    "summary": "Clases de la ontología",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `clases` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/propiedades_objeto": {
   "get": {
    "summary": "Relaciones de la ontología",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `propiedades_objeto` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/propiedades_dato": {
   "get": {
    "summary": "Propiedades de dato",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `propiedades_dato` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/indicadores": {
   "get": {
    "summary": "Catálogo de indicadores",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `indicadores` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/reglas": {
   "get": {
    "summary": "Reglas de banderas rojas",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `reglas` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/normas": {
   "get": {
    "summary": "Marco normativo",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `normas` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/politicas": {
   "get": {
    "summary": "Políticas de acceso (ODRL)",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `politicas` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/vocabularios": {
   "get": {
    "summary": "Vocabularios reutilizados",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `vocabularios` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/modulos": {
   "get": {
    "summary": "Módulos de la ontología",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `modulos` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/entidades_observadas": {
   "get": {
    "summary": "Entidades con seguimiento de contratación",
    "tags": [
     "Vistas (PostgREST, RLS)"
    ],
    "parameters": [
     {
      "name": "select",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Columnas, p. ej. `select=seq,hash`"
     },
     {
      "name": "order",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "example": "seq.desc"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "example": 50
     }
    ],
    "responses": {
     "200": {
      "description": "Filas de `entidades_observadas` visibles para el rol del JWT (anon = ciudadano)."
     }
    }
   }
  },
  "/verificar": {
   "get": {
    "servers": [
     {
      "url": "https://rpehvytoidnzggcopkdw.supabase.co/functions/v1"
     }
    ],
    "summary": "Verificación pública del registro (sin apikey)",
    "tags": [
     "Funciones de borde"
    ],
    "parameters": [
     {
      "name": "seq",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Asiento: recalcula hash, verifica ML-DSA-65 y Ed25519, enlace e inclusión Merkle"
     },
     {
      "name": "ancla",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Ancla: verifica sello SLH-DSA, firmas y contrasta con la copia en GitHub"
     }
    ],
    "responses": {
     "200": {
      "description": "Resultado de verificación con cada comprobación"
     }
    }
   }
  }
 }
}