Ir al contenido

Introducción a la API ​

Novodat expone tu base de datos a través de una API REST y una API GraphQL. Las dos se generan a partir del esquema: no hay nada que declarar, y una tabla o un campo nuevos están disponibles en cuanto existen.

Dirección base ​

Todas las rutas cuelgan de PUBLIC_URL, por ejemplo https://datos.ejemplo.com/items/articles. Peticiones y respuestas son JSON (application/json), salvo la subida de archivos (multipart/form-data) y los assets.

Colecciones, ítems y campos ​

TérminoEn la base de datos
ColecciónUna tabla o una vista. En PostgreSQL con varios schemas, las tablas fuera del schema por defecto se llaman schema.tabla.
ÍtemUna fila.
CampoUna columna, o una relación sin columna propia (el lado "muchos" de una relación).

Tus tablas se leen y escriben en /items/<colección>. Las tablas propias de Novodat (novodat_*) tienen sus propias rutas: /users, /files, /collections… y nunca se alcanzan desde /items.

Respuestas ​

Una respuesta correcta envuelve su resultado en data, con meta cuando se piden recuentos:

json
{
  "data": [{ "id": 1, "title": "Hola" }],
  "meta": { "filter_count": 1 }
}

Los borrados, y las escrituras cuyo resultado no puedes leer, responden 204 sin cuerpo.

Errores ​

Los errores siempre llegan como una lista, cada uno con un code estable:

json
{
  "errors": [
    {
      "message": "Value for field \"slug\" of collection \"articles\" has to be unique.",
      "extensions": { "code": "RECORD_NOT_UNIQUE", "collection": "articles", "field": "slug" }
    }
  ]
}

Los mensajes están en inglés y pueden cambiar; los programas deben basarse en extensions.code, y traducir a partir de él cuando muestran el error a las personas.

CódigoEstadoSignificadoDatos extra
FORBIDDEN403Sin permiso, o el recurso no existe. Novodat nunca revela si existe algo que no puedes ver.
INVALID_CREDENTIALS401Correo o contraseña incorrectos.
INVALID_OTP401Falta el código de dos pasos o es incorrecto.
INVALID_TOKEN401El token no es válido, su sesión se cerró o su usuario ya no está activo.
TOKEN_EXPIRED401El token de acceso caducó: renuévalo.
TFA_REQUIRED403Una política exige la autenticación en dos pasos y el usuario no la ha configurado.
INVALID_PAYLOAD400El cuerpo no es válido.path
INVALID_QUERY400Un parámetro de consulta no es válido.parameter
RECORD_NOT_UNIQUE400Ya existe un valor único igual.collection, field
VALUE_TOO_LONG400Un valor es más largo de lo que permite su campo.collection, field, maxLength
CONTAINS_NULL_VALUES400Un campo no puede pasar a obligatorio: algunas filas no tienen valor.collection, field
VECTOR_DIMENSION_MISMATCH400Un vector tiene un número de dimensiones incorrecto.field, expected, received
UNSUPPORTED_FEATURE400El motor de base de datos no ofrece esta funcionalidad.feature, engine
ROUTE_NOT_FOUND404No existe esa ruta.path
CONTENT_TOO_LARGE413La subida es demasiado grande.limit
RANGE_NOT_SATISFIABLE416El rango de bytes pedido está fuera del archivo.size
REQUESTS_EXCEEDED429Demasiadas peticiones o intentos fallidos. La cabecera Retry-After dice cuándo volver a intentarlo.limit, retryAfter
EXTENSION_MISSING500Hace falta una extensión de PostgreSQL y no se pudo instalar. El mensaje incluye el comando para un administrador.extension, command
SERVICE_UNAVAILABLE503Un servicio que Novodat necesita (la base de datos, un proveedor de IA, un directorio…) no respondió.service
INTERNAL500Error inesperado. Los detalles quedan en el log del servidor.

Identificador de la petición ​

Cada respuesta lleva una cabecera X-Request-Id. Novodat conserva la que envía el cliente o un proxy cuando es segura (hasta 128 letras, dígitos, ., _, : o -), o genera una nueva. Los logs usan el mismo identificador, así que es lo mejor que puedes citar al informar de un problema.

Capacidades del motor ​

Algunas funcionalidades dependen del motor de base de datos (consulta las funcionalidades exclusivas de PostgreSQL). GET /database/capabilities indica lo que ofrece la base de datos actual:

json
{
  "data": {
    "engine": "postgres",
    "capabilities": {
      "vector": true, "customTypes": true, "arrays": true, "jsonb": true,
      "multiSchema": true, "fullTextSearch": "tsvector", "geometry": "postgis", "…": "…"
    }
  }
}

Las funcionalidades que el motor no tiene no aparecen en GraphQL ni en OpenAPI, y usarlas de todos modos responde UNSUPPORTED_FEATURE.

OpenAPI ​

GET /server/specs/oas devuelve un documento OpenAPI 3.1 de lo que puede hacer quien llama: solo las colecciones, campos, operaciones y operadores de filtro disponibles para ese usuario en este motor. Cárgalo en Postman, Insomnia, Swagger UI o un generador de clientes, con el token del usuario con el que actuará el cliente.

bash
curl -s https://datos.ejemplo.com/server/specs/oas -H "Authorization: Bearer $TOKEN" > novodat.openapi.json

Rutas del servidor ​

No necesitan autenticación, salvo donde se indica.

RutaRespuesta
GET /server/health{ data: { status: "ok", checks: { database: { status, responseTimeMs } } } }, o 503 cuando la base de datos no responde. No cuenta para los límites de peticiones.
GET /server/info{ data: { name: "Novodat", version } }
GET /server/specs/oasEl documento OpenAPI de quien llama.
GET /server/specs/graphql, GET /server/specs/graphql/systemEl esquema GraphQL de quien llama, en SDL.
GET /server/mapEl mapa base en uso y cómo se dibujan los campos de mapa. Solo usuarios con sesión.
GET /database/capabilitiesEl motor y sus capacidades.
GET /database/extensionsExtensiones de PostgreSQL disponibles e instaladas. Solo administradores.

Siguientes pasos ​