API / versión 1

Evidencia en JSON estable.

La API pública expone las mismas observaciones con marca de tiempo que el sitio web. Es de solo lectura y no necesita clave ni cuenta.

Solicitudes y almacenamiento en caché

Toda respuesta es application/json y lleva Cache-Control: public, s-maxage=60, stale-while-revalidate=300. Respetar ese encabezado no te cuesta nada y mantiene el índice económico de servir, así que lee desde tu caché en lugar de sondear. Solo se sirven GET y HEAD; cualquier otro método devuelve 405 con un encabezado Allow.

Los errores nunca devuelven un estado sin cuerpo. El cuerpo siempre es un objeto con un código en el que es seguro ramificar y un mensaje escrito para una persona:

{ "error": { "code": "invalid_limit", "message": "limit must be an integer from 1 to 100" } }

Listar servidores

GET /api/v1/servers
q
Texto libre que se compara con el título, el nombre del registro y la descripción.
state
Uno de verified, stale, broken, auth_required o unverifiable.
package
El tipo de registro del paquete: npm, pypi u oci.
transport
El transporte declarado por el registro del Registry, por ejemplo stdio.
client
Un slug de cliente, como se enumera en Clientes — por ejemplo claude-code. API pública
limit
Un entero de 1 a 100. El valor predeterminado es 25. Un valor fuera de ese rango se rechaza en lugar de ajustarse, así que a un cliente nunca se le entregan una cantidad de filas distinta de la que pidió sin avisarle.
cursor
El nextCursor de la respuesta anterior. Omítelo para la primera página; es null en la última.
GET /api/v1/servers?state=verified&package=npm&limit=2

{
  "data": [
    {
      "id": "srv_01J…",
      "registryName": "example/one",
      "title": "Example Server",
      "description": "What the server says it does.",
      "state": "verified",
      "observedAt": "2026-09-15T00:00:00.000Z",
      "toolCount": 3,
      "url": "/servers/example/one"
    }
  ],
  "nextCursor": null
}

Detalle del servidor

GET /api/v1/servers/:namespace/:name

Devuelve los metadatos del Registry, los paquetes ejecutables y el historial público de observaciones de un servidor, dentro de data. Cada ejecución de ese historial nombra la versión exacta del paquete que probó, que por lo general no es la versión publicada hoy. Un par desconocido devuelve 404 con el código not_found.

Ejecución de verificación

GET /api/v1/verification-runs/:id

Una observación, por su identificador. Una ejecución que no ha superado la regla de confirmación está ausente aquí y devuelve 404 con el código not_found — la misma respuesta que una ejecución que nunca existió, porque cualquier diferencia entre ambas revelaría una falla que la regla existe para ocultar.

Estadísticas del conjunto de datos

GET /api/v1/stats
{ "data": { "indexedServers": 979, "verifiedServers": 0, "observedAt": null } }

Códigos de error

invalid_limit
400 — el límite no era un entero de 1 a 100.
invalid_cursor
400 — el cursor está mal formado o se creó con un orden distinto. Empieza de nuevo desde la primera página.
not_found
404 — no existe ese servidor, o no hay una ejecución publicable con ese identificador.
method_not_allowed
405 — la API es de solo lectura. La respuesta indica los métodos que se sirven.

Lo que no se expone

El stderr interno, los arrendamientos de los workers y los detalles de confirmación pendientes nunca se publican, y un estado siempre lleva la marca de tiempo de la observación que describe, no la hora en que la solicitaste.