Query
Vincent Depassier · 17 de septiembre de 2026
POST /{workspaceId}/queryEl único endpoint de datos. Las lecturas y las escrituras pasan las dos por aquí, y cuál te toca lo decide el cuerpo, no la ruta ni el método.
Auth: API key (sk_live_ o pk_live_), o un JWT de usuario final.
Pedido
POST https://gateway.praxsuite.com/{workspaceId}/query
Authorization: Bearer sk_live_...
Content-Type: application/json{
"refs": { "Clientes": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" },
"query": {
"from": "Clientes",
"select": ["Nombre", "Email"],
"where": [{ "field": "Estado", "op": "eq", "value": "Activo" }],
"orderBy": [{ "field": "Nombre", "dir": "asc" }],
"limit": 50
},
"includeTotalCount": false
}Campo | Tipo | Notas |
| objeto | Tus alias → GUIDs de tabla. Obligatorio, de 1 a 20 entradas |
| objeto | Una lectura. Mutuamente excluyente con |
| objeto | Una escritura. Mutuamente excluyente con |
| booleano | Llena |
refs es además la lista completa de lo que el pedido puede tocar, y eso es lo que le permite al gateway contrastarlo con tus permisos antes de hacer ningún trabajo.
query
Campo | Tipo | Notas | |
| string | Un alias de | |
| array | Nombres de columna, objetos de relación u objetos de agregación. Omítelo para todas las columnas legibles | |
| array | Condiciones, unidas con AND en el mismo nivel | |
| array | `{ "field": …, "dir": "asc" \ | "desc" }` |
| array | Nombres de columna, para consultas agregadas | |
| array | Condiciones aplicadas después de agrupar | |
| número | Por defecto 50, techo 1000, y un permiso de tabla puede bajarlo | |
| número | Filas a saltear |
Un item de agregación es { "field": "Total", "fn": "sum", "alias": "Facturado" }.
select: "*" no es un error cuando tus permisos de columna son angostos: devuelve las columnas que puedes leer, y nada te avisa de que las otras existen. Nombrar una tabla para la que no tienes permiso sí es un error: 403 SCOPE_VIOLATION.
mutation
Campo | Tipo | Notas |
| string |
|
| string | Un alias de |
| array | Para |
| objeto | Para |
| array | Obligatorio en |
| bool o array | Para |
| objeto | Anunciar la escritura en un bus del Event Bus una vez confirmada |
notify no lleva payload propio: { "bus": "{topic}:{instance}" }. El cuerpo del evento se arma con lo que devolvió la base, nunca con lo que mandó el pedido, así que una escritura no sirve para retransmitir contenido arbitrario. El topic tiene que estar declarado, habilitado y publicable por quien llama — todo se verifica antes de ejecutar la mutación, así que una escritura nunca se confirma y después falla al anunciar. Si la verificación falla, recibes 403 NOTIFY_DENIED y no se escribe nada.
Cómo se verifica un pedido
Tus permisos aplican en las dos direcciones, tanto en lecturas como en escrituras. Nada de lo que mande tu cliente puede quitar ninguna de las dos — por eso un delete nunca alcanza filas que la credencial no hubiera podido leer.
Respuesta — lectura
{
"data": [
{ "Nombre": "Acme Corp", "Email": "hola@acme.com" }
],
"meta": {
"count": 1,
"limit": 50,
"offset": 0,
"total": null,
"durationMs": 4
}
}meta.total es null salvo que hayas pedido includeTotalCount. Lee meta.limit en vez de asumir que respetaron el tuyo.
Respuesta — escritura
{
"affectedRows": 1,
"data": [{ "Id": "…", "Nombre": "Acme Corp" }],
"meta": { "type": "insert", "table": "Clientes", "durationMs": 7 }
}data aparece sólo en un insert que pidió returning.
Cabeceras de respuesta
Cabecera | Cuándo |
| La credencial tiene caché habilitada |
| El workspace pasó sus llamadas incluidas, con pago por uso |
Con la caché activa, devuelve un ETag anterior como If-None-Match para recibir 304 Not Modified en vez del cuerpo.
Errores
El sobre estructurado, con code. La tabla completa está en Errores y límites — los específicos de este endpoint son INVALID_REQUEST, INVALID_REFS, INVALID_QUERY, INVALID_MUTATION, SCOPE_VIOLATION, NOTIFY_DENIED, QUERY_TIMEOUT y MUTATION_TIMEOUT.
Toda llamada —incluidas las que fallan— se escribe en el log de consultas, con el cuerpo, quién llamó, la IP de origen y la duración. API Gateway → Logs.
Más a fondo
La gramática en sí —operadores, relaciones, agregaciones, semántica de mutaciones, el modelo de seguridad— está documentada completa en API Gateway → PraxQL, y se puede probar sin escribir código en el Playground.