Documentación · Plan Negocio y Equipo
API de datos
Conecta tu página web, un CMS, Zapier u otro sistema a tu espacio de Blank101. Cada llave abre solo las vistas que tú eliges: lee sus registros y, si lo permites, crea o actualiza. Nunca cambia la estructura de tu sistema ni borra información.
Empezar
Introducción
Tu sistema en Blank101 tiene tres puertas, y cada una hace una sola cosa:
La app
Tú y tu equipo capturan y consultan, cada quien con su rol.
Tu agente (MCP)
Construye la estructura en un borrador que tú apruebas. Solo lee datos si su token tiene ese permiso, y queda en el historial.
El API
Otros sistemas leen y escriben registros de las vistas que expones. Nunca toca la estructura.
Todas las rutas cuelgan de esta URL base:
https://blank101.app/api/v1
Casos típicos: mostrar tu catálogo o tus propiedades disponibles en tu página web, recibir pedidos o prospectos desde otra herramienta, sincronizar con Zapier, o alimentar un reporte en otro sistema.
Empezar
Inicio rápido
Crea una llave
En tu espacio, entra a Ajustes → API y ponle un nombre que diga quién la usa (“Página web”).
Elige vistas
Marca qué vistas abre y cómo: leer, solo crear o leer y escribir. Cópiala: se muestra una sola vez.
Haz tu primera petición
Guarda la llave en una variable de entorno y lista los registros de una vista.
curl "https://blank101.app/api/v1/views/catalogo_web/records?limit=5" \ -H "Authorization: Bearer $BLANK101_KEY"
Empezar
Autenticación
Cada petición lleva la llave en el encabezado Authorization. Las llaves del API empiezan con b101d_; las del agente (b101_) no sirven aquí, ni al revés.
Authorization: Bearer b101d_tu_llave
- Guárdala en el servidor (variables de entorno, el almacén de secretos de Zapier). Nunca en un repositorio.
- Una llave de solo lectura sobre una vista pública de tu catálogo puede vivir en tu web; una que escribe, nunca en código que ve el navegador.
- Si se filtra, revócala en Ajustes → API: deja de funcionar al instante. Crea otra y reemplázala.
- Una llave por integración: así sabes quién hizo qué (el historial de cada registro dice “API · nombre de la llave”).
Empezar
Alcance por vista
Una llave no abre tablas: abre vistas. La vista decide exactamente qué sale. Si tu vista “Catálogo web” muestra nombre, precio y foto y solo los productos activos, eso es lo único que la llave alcanza, aunque la tabla tenga costo, proveedor y notas internas.
| Acceso | Leer | Crear | Actualizar | Para qué |
|---|---|---|---|---|
| Leer | Sí | — | — | Mostrar datos en tu web o en otro sistema. |
| Solo crear | — | Sí | — | Recibir pedidos o prospectos, como un formulario. |
| Leer y escribir | Sí | Sí | Sí | Sincronizar en ambos sentidos (Zapier, otro sistema). |
- Solo se leen y escriben los campos visibles de la vista. Las fórmulas y los archivos son de solo lectura.
- Los filtros de la vista siempre aplican. Un registro que no los cumple no existe para la llave (
404), también al actualizar. - Si tu agente cambia la vista (agrega un campo, cambia un filtro), el API lo refleja al publicar. Si la vista se quita, la llave pierde ese acceso.
- Borrar no existe en v1. Un sistema externo con un error no puede vaciar tu información. Desde la app, los registros van a la papelera.
Endpoints
Endpoints
Las vistas se identifican por su clave (por ejemplo catalogo_web), que aparece en Ajustes → API junto a su nombre. Los registros, por su id.
Vistas de la llave
Requiere: cualquier llave válida
Lo que esta llave puede ver: cada vista con su acceso y sus campos. Útil para descubrir el esquema desde otra herramienta.
curl "https://blank101.app/api/v1/views" \ -H "Authorization: Bearer $BLANK101_KEY"
{
"space": "Abarrotes Don Luis",
"key": "Página web",
"views": [
{
"key": "catalogo_web",
"name": "Catálogo web",
"type": "cards",
"table": "productos",
"access": "read",
"fields": [ … ]
}
]
}Esquema de una vista
Requiere: cualquier acceso a la vista
Campos visibles en orden, con su tipo, si son obligatorios y si se pueden escribir. En los de selección vienen las opciones válidas (value es lo que se envía); en las relaciones, la tabla destino.
curl "https://blank101.app/api/v1/views/catalogo_web" \ -H "Authorization: Bearer $BLANK101_KEY"
{
"key": "catalogo_web",
"name": "Catálogo web",
"type": "cards",
"table": "productos",
"access": "read",
"fields": [
{ "key": "nombre", "name": "Nombre", "type": "text",
"required": true, "writable": true },
{ "key": "precio", "name": "Precio", "type": "money",
"required": true, "writable": true, "currency": "MXN" },
{ "key": "categoria", "name": "Categoría", "type": "select",
"required": false, "writable": true, "multiple": false,
"options": [ { "value": "abarrotes", "label": "Abarrotes" } ] },
{ "key": "foto", "name": "Foto", "type": "file",
"required": false, "writable": false }
]
}Listar registros
Requiere: leer, o leer y escribir
Registros que cumplen los filtros de la vista, más los que agregues en la URL.
| Parámetro | Descripción |
|---|---|
campo=valor | Filtro por igualdad sobre un campo visible. Ver filtros. |
campo[op]=valor | Otros operadores: neq, gt, gte, lt, lte, in, contains, is_empty, not_empty. |
sort | Campo visible, created_at o updated_at; con - al inicio, descendente. Por omisión, el orden de la vista o los más nuevos primero. |
limit | De 1 a 100. Por omisión 50. |
cursor | El next_cursor de la respuesta anterior. null = no hay más. |
curl "https://blank101.app/api/v1/views/catalogo_web/records?categoria=abarrotes&precio[lte]=100&sort=-precio&limit=20" \ -H "Authorization: Bearer $BLANK101_KEY"
{
"data": [
{
"id": "6f1c2a0e-8d4b-4c1e-9a77-2f0b5e1d9c33",
"created_at": "2026-10-02T17:21:09.412Z",
"updated_at": "2026-10-04T15:02:51.120Z",
"fields": {
"nombre": "Café de olla 500 g",
"precio": 95,
"categoria": "abarrotes",
"foto": [ { "name": "cafe.jpg", "type": "image/jpeg", "size": 184220 } ]
}
}
],
"next_cursor": "bzoyMA"
}Obtener un registro
Requiere: leer, o leer y escribir
Un registro por su id, con la misma forma que en la lista. Si no aparece en la vista, responde 404.
curl "https://blank101.app/api/v1/views/catalogo_web/records/6f1c2a0e-8d4b-4c1e-9a77-2f0b5e1d9c33" \ -H "Authorization: Bearer $BLANK101_KEY"
{
"id": "6f1c2a0e-8d4b-4c1e-9a77-2f0b5e1d9c33",
"created_at": "2026-10-02T17:21:09.412Z",
"updated_at": "2026-10-04T15:02:51.120Z",
"fields": { "nombre": "Café de olla 500 g", "precio": 95, … }
}Crear un registro
Requiere: solo crear, o leer y escribir
El cuerpo es { "fields": { … } } con los campos visibles que quieras llenar. Se valida igual que en la app: tipos, obligatorios, opciones y que las relaciones existan. Los campos con valor por defecto se llenan solos.
Al guardar corren tus automatizaciones como si alguien hubiera capturado el registro: avisos, tareas en la agenda, lo que tengas configurado.
curl -X POST "https://blank101.app/api/v1/views/pedidos_web/records" \
-H "Authorization: Bearer $BLANK101_KEY" \
-H "Content-Type: application/json" \
-d '{"fields":{"cliente":"María López","telefono":"+52 686 123 4567","total":450,"entrega":"2026-10-08"}}'HTTP/1.1 201 Created
{
"id": "a3d0c9b2-41f7-4b6e-8a2c-7f5e3b1d0e98",
"created_at": "2026-10-05T18:40:12.004Z",
"updated_at": "2026-10-05T18:40:12.004Z",
"fields": {
"cliente": "María López",
"telefono": "+52 686 123 4567",
"total": 450,
"entrega": "2026-10-08",
"estado": "nuevo"
}
}Actualizar un registro
Requiere: leer y escribir
Actualización parcial: solo cambian los campos que envías; el resto queda igual. Envía null para vaciar un campo que no sea obligatorio. El registro debe aparecer en la vista.
curl -X PATCH "https://blank101.app/api/v1/views/pedidos_web/records/a3d0c9b2-41f7-4b6e-8a2c-7f5e3b1d0e98" \
-H "Authorization: Bearer $BLANK101_KEY" \
-H "Content-Type: application/json" \
-d '{"fields":{"estado":"entregado"}}'{
"id": "a3d0c9b2-41f7-4b6e-8a2c-7f5e3b1d0e98",
"updated_at": "2026-10-06T10:12:44.871Z",
"fields": { …, "estado": "entregado" }
}Referencia
Filtros, orden y páginas
Tus filtros se suman a los de la vista, nunca los reemplazan, y solo aplican a campos visibles. Varios filtros = todos deben cumplirse.
| Operador | Ejemplo | Significa |
|---|---|---|
eq (omisión) | estado=pagado | Igual a. En selección múltiple: la contiene. |
neq | estado[neq]=cancelado | Distinto de (incluye vacíos). |
gt gte lt lte | total[gte]=1000 | Mayor / menor. Números, dinero y fechas. |
in | zona[in]=centro,norte | Alguno de la lista (separados por coma). |
contains | nombre[contains]=café | Contiene el texto, sin importar mayúsculas. |
is_empty · not_empty | correo[is_empty]=1 | Sin valor / con valor. |
Fechas relativas. En campos de fecha puedes usar today, tomorrow, yesterday, this_week, last_7_days, next_7_days, this_month, last_month, next_month, this_year, past, future o un mes 2026-10. Se calculan en la zona horaria de tu espacio: entrega=today son las entregas de hoy.
Páginas. Pide hasta 100 registros por vez y sigue el next_cursor hasta que sea null. El cursor es opaco: no lo construyas a mano.
let cursor = null;
const todos = [];
do {
const url = new URL("https://blank101.app/api/v1/views/catalogo_web/records");
url.searchParams.set("limit", "100");
if (cursor) url.searchParams.set("cursor", cursor);
const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.BLANK101_KEY}` } });
const page = await res.json();
todos.push(...page.data);
cursor = page.next_cursor;
} while (cursor);Referencia
Tipos de campo
Cómo viaja cada tipo en JSON, al leer y al escribir.
| Tipo | JSON | Ejemplo | Notas |
|---|---|---|---|
text · long_text · address | texto | "Calle 5 #120" | Respeta el largo máximo del campo. |
phone | texto | "+52 686 123 4567" | Dígitos, espacios, +, guiones y paréntesis. |
email | texto | "ana@correo.mx" | Se valida el formato. |
number · money | número | 450.5 | Respeta mínimo y máximo. El dinero va sin símbolo; la moneda está en el esquema. |
date | texto | "2026-10-08" | AAAA-MM-DD. |
datetime | texto | "2026-10-08T14:30" | Hora local del espacio, sin zona. |
checkbox | booleano | true | |
select | texto · lista | "pagado" · ["a","b"] | El value de una opción. Lista si es múltiple. |
relation | id · lista de ids | "6f1c…9c33" | Id de un registro de la tabla destino. Debe existir. |
user | id | "0b7e…41aa" | Id de un miembro del espacio. |
formula | según el resultado | 1250 | Solo lectura: se calcula sola. |
file | lista de objetos | [{ "name", "type", "size" }] | Solo lectura. Descarga y subida por API: próximamente. |
Referencia
Errores
Los errores responden con un código HTTP y un cuerpo que explica qué pasó en español llano.
{
"error": {
"code": "invalid_fields",
"message": "Hay campos con errores.",
"fields": {
"telefono": "Escribe un teléfono válido.",
"estado": "Elige una opción válida."
}
}
}| HTTP | code | Cuándo |
|---|---|---|
| 400 | invalid_body · invalid_filter · invalid_sort · invalid_limit · invalid_cursor | La petición está mal formada. |
| 401 | unauthorized | Falta la llave, no existe o fue revocada. |
| 403 | forbidden · plan | La llave no tiene ese acceso a la vista, o el plan no incluye el API. |
| 404 | view_not_found · record_not_found · not_found | La vista no existe para esta llave, el registro no aparece en la vista, o la ruta no existe. |
| 405 | method_not_allowed | Por ejemplo, DELETE: el API no borra. |
| 422 | invalid_fields | Algún campo no pasó la validación. Detalle en fields. |
| 429 | rate_limited | Más de 120 peticiones en un minuto. Espera lo que diga Retry-After. |
| 500 | internal | Error nuestro. Reintenta; si sigue, escríbenos. |
Referencia
Límites
| Peticiones | 120 por minuto por llave. Al pasarte: 429 con Retry-After. |
| Registros por página | 100 como máximo. |
| Planes | Negocio y Equipo (y durante tu prueba de 30 días). |
| Registros creados | Cuentan para el límite de registros de tu plan, igual que los capturados en la app. |
| No disponible en v1 | Borrar registros, subir o descargar archivos, crear o cambiar tablas, campos y vistas. |
Referencia
Seguridad
- La garantía vive en la base de datos. Qué vista, qué campos y qué registros alcanza una llave lo decide la base, no el código de la página: aunque hubiera un error en la capa web, la base no entrega de más.
- Las llaves se guardan cifradas (solo su huella sha256). Ni nosotros podemos mostrártela otra vez.
- Nada sale sin que lo decidas. Solo el dueño crea llaves y elige vistas. Tu agente de IA nunca ve ni crea llaves.
- Rastro completo. Cada registro creado o cambiado por el API queda en su historial con el nombre de la llave.
- Sin borrar y sin estructura. El peor caso de una llave filtrada con escritura es que alguien cree o edite registros de esas vistas; lo ves en el historial y la revocas en un clic.
Referencia
Zapier, Make y n8n
Hoy puedes conectar cualquier herramienta que haga peticiones HTTP: el módulo HTTP de Make, el nodo HTTP Request de n8n o Webhooks by Zapier. Usa la URL base, el encabezado Authorization y los ejemplos de esta página.
Próximamente: eventos salientes (avisar a otro sistema cuando se crea o cambia un registro) y la app oficial de Blank101 en Zapier, con disparadores y acciones listos.
Referencia
Cambios
| Fecha | Versión | Cambio |
|---|---|---|
| 2026-10-05 | v1 | Primera versión: llaves por vista, leer, crear y actualizar registros, filtros, orden y páginas. |