Blank101
API de datos · v1
EntrarCrea tu espacio

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.

FormatoREST + JSON
AlcancePor vista
OperacionesLeer · crear · editar
Límite120 / min

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:

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.

Encabezado
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.

AccesoLeerCrearActualizarPara qué
LeerSí——Mostrar datos en tu web o en otro sistema.
Solo crear—Sí—Recibir pedidos o prospectos, como un formulario.
Leer y escribirSí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

GET/views

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"
Respuesta
{
  "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

GET/views/{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"
Respuesta
{
  "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

GET/views/{vista}/records

Requiere: leer, o leer y escribir

Registros que cumplen los filtros de la vista, más los que agregues en la URL.

ParámetroDescripción
campo=valorFiltro por igualdad sobre un campo visible. Ver filtros.
campo[op]=valorOtros operadores: neq, gt, gte, lt, lte, in, contains, is_empty, not_empty.
sortCampo visible, created_at o updated_at; con - al inicio, descendente. Por omisión, el orden de la vista o los más nuevos primero.
limitDe 1 a 100. Por omisión 50.
cursorEl 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"
Respuesta
{
  "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

GET/views/{vista}/records/{id}

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"
Respuesta
{
  "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

POST/views/{vista}/records

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"}}'
Respuesta
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

PATCH/views/{vista}/records/{id}

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"}}'
Respuesta
{
  "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.

OperadorEjemploSignifica
eq (omisión)estado=pagadoIgual a. En selección múltiple: la contiene.
neqestado[neq]=canceladoDistinto de (incluye vacíos).
gt gte lt ltetotal[gte]=1000Mayor / menor. Números, dinero y fechas.
inzona[in]=centro,norteAlguno de la lista (separados por coma).
containsnombre[contains]=caféContiene el texto, sin importar mayúsculas.
is_empty · not_emptycorreo[is_empty]=1Sin 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.

JavaScript · todas las páginas
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.

TipoJSONEjemploNotas
text · long_text · addresstexto"Calle 5 #120"Respeta el largo máximo del campo.
phonetexto"+52 686 123 4567"Dígitos, espacios, +, guiones y paréntesis.
emailtexto"ana@correo.mx"Se valida el formato.
number · moneynúmero450.5Respeta mínimo y máximo. El dinero va sin símbolo; la moneda está en el esquema.
datetexto"2026-10-08"AAAA-MM-DD.
datetimetexto"2026-10-08T14:30"Hora local del espacio, sin zona.
checkboxbooleanotrue
selecttexto · lista"pagado" · ["a","b"]El value de una opción. Lista si es múltiple.
relationid · lista de ids"6f1c…9c33"Id de un registro de la tabla destino. Debe existir.
userid"0b7e…41aa"Id de un miembro del espacio.
formulasegún el resultado1250Solo lectura: se calcula sola.
filelista 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.

422 · campos con errores
{
  "error": {
    "code": "invalid_fields",
    "message": "Hay campos con errores.",
    "fields": {
      "telefono": "Escribe un teléfono válido.",
      "estado": "Elige una opción válida."
    }
  }
}
HTTPcodeCuándo
400invalid_body · invalid_filter · invalid_sort · invalid_limit · invalid_cursorLa petición está mal formada.
401unauthorizedFalta la llave, no existe o fue revocada.
403forbidden · planLa llave no tiene ese acceso a la vista, o el plan no incluye el API.
404view_not_found · record_not_found · not_foundLa vista no existe para esta llave, el registro no aparece en la vista, o la ruta no existe.
405method_not_allowedPor ejemplo, DELETE: el API no borra.
422invalid_fieldsAlgún campo no pasó la validación. Detalle en fields.
429rate_limitedMás de 120 peticiones en un minuto. Espera lo que diga Retry-After.
500internalError nuestro. Reintenta; si sigue, escríbenos.

Referencia

Límites

Peticiones120 por minuto por llave. Al pasarte: 429 con Retry-After.
Registros por página100 como máximo.
PlanesNegocio y Equipo (y durante tu prueba de 30 días).
Registros creadosCuentan para el límite de registros de tu plan, igual que los capturados en la app.
No disponible en v1Borrar 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

FechaVersiónCambio
2026-10-05v1Primera versión: llaves por vista, leer, crear y actualizar registros, filtros, orden y páginas.