Última actualización: 2 de octubre de 2026
Hay tres formas de trabajar con Layer desde fuera:
- Conectar una app de IA mediante MCP, como Claude o ChatGPT. Inicias sesión en Layer y eliges qué puede hacer la app.
- La API REST para tu propio software, con una clave que creas tú.
- Webhooks: Layer avisa a tu dirección de que ha pasado algo, como una factura pagada.
1. Así sigue siendo seguro
- Nunca más que quien la creó. Una clave o app conectada nunca puede hacer más que la persona que la creó. Si cambia su rol, la clave cambia con él. Si alguien deja el equipo, su clave deja de funcionar.
- Escribir siempre es una propuesta. Nada de fuera cambia nada por sí solo en tu espacio de trabajo. Cada cambio llega a Aprobaciones y solo ocurre cuando alguien con ese permiso lo aprueba.
- El texto de fuera sigue marcado. Lo que entra por la API o MCP cuenta como texto de fuera. Una propuesta con ese texto nunca se ejecuta sola, aunque dejes que otras propuestas se ejecuten automáticamente.
- Visible y revocable. En Ajustes, Dispositivos ves cada clave y app, cuándo se usó por última vez y qué hizo. Revocarla tiene efecto inmediato.
- Un freno. Cada clave y app puede hacer 120 solicitudes por minuto. Por encima recibes un 429 con un Retry-After.
2. Crear una clave
En Layer: Ajustes, Desarrolladores, Clave de API. Ponle un nombre a la clave, elige cuánto tiempo es válida (30 días, 90 días o un año) y marca lo que puede hacer. Ves la clave una sola vez. Solo guardamos un hash, así que si la pierdes, no se recupera: revócala y crea una nueva.
Las claves pertenecen a tu propio espacio de trabajo, no a la demo. La dirección exacta de tu API y servidor MCP está en la misma página; en los ejemplos de abajo aparece https://jouw-werkplek.example.
| Permiso | Qué da |
|---|---|
relaties.lezen | Clientes, leads, proveedores y sus personas de contacto. |
offertes.lezen | Presupuestos con sus líneas y estado. |
facturen.lezen | Facturas con importes, estado y fecha de pago. |
leads.lezen | Leads con fase, valor y siguiente acción. Con Crear propuestas también crear y actualizar leads. |
communicatie.lezen | La cronología de llamadas, correos, conversaciones y notas por contacto. Con Crear propuestas también registrar. |
mail.lezen | Buscar y leer en los buzones que ves en el propio Layer, con, por conversación, quién escribió por última vez y si ya hay respuesta. Solo lectura, sin adjuntos. Lo que lee la app va a la IA que conectas. |
agenda.lezen | Tus propias citas. Con Crear propuestas también programar una cita, sin invitación. |
facturen.concept | Crear una factura en borrador (de horas abiertas o con líneas propias) o una factura abierta con un enlace para el cliente, modificarla y ver el PDF. Enviar es siempre una propuesta en Aprobaciones; el enlace lo compartes tú. |
offertes.concept | Un nuevo presupuesto en borrador. Enviarlo lo haces siempre tú en Layer. |
bedrijf.vragen | Busca en actas de conversaciones, la base de conocimiento, clientes, tareas y registros los fragmentos que encajan con una pregunta, con la fuente. |
projecten.lezen | Proyectos con estado, fecha límite y tareas. |
taken.lezen | Tareas con estado, fecha límite y prioridad. |
uren.lezen | Horas registradas. Importes solo si tu rol puede ver dinero. |
producten.lezen | Productos y servicios con precio y stock. |
tickets.lezen | Tickets de soporte con estado y prioridad. |
content.lezen | Posts del calendario de contenido con canal, fecha y estado. |
series.lezen | Formatos, series y episodios con su paso y valoración. |
radar.lezen | Ideas con puntuación y señales del radar: picos, crecimiento de canales, búsquedas. |
social.lezen | Seguidores y cifras fijas por cuenta social propia y por día. |
analytics.lezen | Visitantes y tráfico de búsqueda de Google Analytics y Search Console. |
radar.sturen | Activar o desactivar el descubrimiento, dirigir términos de búsqueda y canales e iniciar el analista de tendencias. Solo para quien gestiona el radar en el espacio de trabajo. |
radar.feedback | Valorar ideas del radar como buenas o no. Eso solo orienta dónde busca el radar y qué crea el analista de tendencias; no sale nada fuera. |
content.voorstellen | Proponer un post como idea en el calendario de contenido. Junto con Crear propuestas; espera en Aprobaciones. |
verslagen.insturen | Poner actas de TrompTech Notulen en Reuniones. Qué se hace con ellas (tareas, contacto, correo) lo eliges tú después. |
verslagen.verwerken | De un acta que enviaste tú, crear tareas, un contacto y un borrador de correo, como el botón Procesar en Reuniones. Solo lo que tu rol permite; un correo nunca se envía. |
opnames.insturen | Poner inspecciones, entregas y levantamientos de daños de TrompTech Opname en el PC en Levantamientos, con las fotos y el informe. |
opnames.lezen | Tus levantamientos con sus puntos y fotos, para terminar en el PC un levantamiento que empezó en el teléfono. |
uren.schrijven | Poner como borrador en tu propio parte semanal lo que TrompTech Uren vio en tu PC y tú revisaste, y leer tus propias horas para no registrar nada dos veces. Enviarlo lo haces tú; los títulos de ventana no se incluyen. |
gids.lezen | Qué páginas y artículos de ayuda puedes abrir en este espacio de trabajo, para TrompTech Gids en tu PC: responde preguntas sobre Layer y te lleva al sitio adecuado. Sin datos de clientes ni compañeros. |
content.insturen | Poner carruseles de TrompTech Slides y vídeos y shorts de TrompTech Studio como post en el calendario de contenido, con las imágenes o el vídeo. Esperan tu aprobación; publicar lo haces tú. |
dictaat.insturen | Poner lo que dictas en TrompTech Voice como tarea, como nota interna de un cliente o como borrador de correo en la Bandeja de salida. Solo lo que tu rol permite; un correo nunca se envía. |
documenten.delen | Compartir propuestas e informes de TrompTech Documenten como página web con un cliente, ver cuándo los abre y poner el PDF junto al cliente y el proyecto. |
kennis.insturen | Poner vídeos de instrucciones con pasos de TrompTech Uitleg en la base de conocimiento. |
afletteren.transacties.schrijven | Poner los ingresos de una cuenta en la conciliación, para una cuenta privada que también es de empresa. Con este permiso no se puede leer. |
huishouden.lezen | Tu libro de cuentas del hogar (ingresos, gastos fijos, presupuestos y deudas), tu lista de la compra y tus tareas. Solo lectura, sin consejos. |
huishouden.schrijven | Añadir, marcar y quitar productos de la lista de la compra, y añadir y marcar tareas del hogar: directamente, con Deshacer. Una deuda o presupuesto siempre es una propuesta en Aprobaciones. También lee tu hogar. |
aanbiedingen.lezen | Las ofertas de supermercado de esta semana y la siguiente desde tu app de ofertas, y comparar precios por tienda para tu compra. Solo lectura. |
voorstellen.maken | Proponer cambios. Esperan en Aprobaciones hasta que alguien los aprueba; nada ocurre solo. |
Un permiso solo funciona si el módulo está en tu suscripción y tu rol lo permite. Los importes, como una tarifa por hora, solo los ves si tu rol puede ver dinero.
3. La API REST
Todo está bajo /api/v1. Envía la clave como Authorization: Bearer. GET /api/v1 muestra qué recursos puede leer tu clave. La descripción completa está en /api/v1/openapi.json (OpenAPI 3.1), que también se puede obtener sin clave.
Leer y paginar
curl "https://jouw-werkplek.example/api/v1/taken?status=open&per_pagina=20" \
-H "Authorization: Bearer $LAYER_SLEUTEL"Cada lista llega en páginas, lo más reciente primero. Con per_pagina (de 1 a 100, por defecto 50) y pagina pasas de página; volgende da la dirección de la página siguiente, o null. Filtra con status, o con sinds (una fecha u hora en ISO 8601) para obtener solo lo que ha cambiado desde entonces.
{
"data": [ { "id": "...", "titel": "...", "status": "open", "deadline": "2026-10-03T07:00:00.000Z" } ],
"pagina": 1,
"per_pagina": 20,
"totaal": 1,
"volgende": null
}| Recurso | Permiso | Propuestas |
|---|---|---|
/api/v1/relatiesClientes, leads y (con el módulo Proveedores) proveedores. | relaties.lezen | nuevo (POST): soort, naam, bedrijf, email, telefoon, adres, postcode, plaats, kvk, btw, branche, rechtsvorm, notities, bron; modificar (PATCH): telefoon, branche, rechtsvorm, plaats, website, bron |
/api/v1/contactpersonenPersonas de contacto de un cliente, lead o proveedor. | relaties.lezen | nuevo (POST): naam, bedrijf, email, telefoon, notities, bron |
/api/v1/offertesPresupuestos con líneas, importe y estado. | offertes.lezen | modificar (PATCH): status |
/api/v1/facturenFacturas con líneas, importe, estado y fecha de pago. | facturen.lezen | modificar (PATCH): status, betaald_op |
/api/v1/projectenProyectos con estado, fecha límite, tareas y progreso. | projecten.lezen | modificar (PATCH): status, deadline |
/api/v1/takenTareas con estado, fecha límite y prioridad. | taken.lezen | nuevo (POST): titel, omschrijving, deadline, prioriteit, klant_id, project_id; modificar (PATCH): status, deadline, prioriteit |
/api/v1/urenHoras registradas: las tuyas, o las de todo el equipo si tu rol puede verlas. Tarifa y factura solo si tu rol puede verlas. | uren.lezen | solo lectura |
/api/v1/productenProductos y servicios con precio y stock. El precio de compra solo si tu rol puede ver dinero. | producten.lezen | solo lectura |
/api/v1/ticketsTickets de soporte con estado, prioridad y categoría. | tickets.lezen | modificar (PATCH): status |
/api/v1/contentPosts del calendario de contenido: fecha, canal, tema, estado y la serie a la que pertenecen. | content.lezen | solo lectura |
/api/v1/formatsFormatos: la estructura fija de un episodio, por plataforma la forma y la duración, y la checklist. | series.lezen | solo lectura |
/api/v1/seriesSeries: un formato con cadencia, cuenta y estado. | series.lezen | solo lectura |
/api/v1/afleveringenEpisodios de todas las series, con fecha, paso, guion y valoración. | series.lezen | solo lectura |
/api/v1/radar-ideeenIdeas con puntuación del radar de contenido. La puntuación es una franja con componentes, nunca una probabilidad de hacerse viral. | radar.lezen | solo lectura |
/api/v1/radar-serievoorstellenSugerencias de series del analista de tendencias: un programa recurrente sobre un tema que vuelve en varios picos. Crear una serie lo haces en el propio Layer. | radar.lezen | solo lectura |
/api/v1/radar-signalenSeñales de los últimos 90 días: picos, picos tempranos, crecimiento de canales, búsquedas y noticias, con la explicación de cómo se calculan. | radar.lezen | solo lectura |
/api/v1/social-metingenPor cuenta social propia y por día, los seguidores y las cifras fijas que informa el canal (últimos 120 días). Una cifra que falta es null, nunca cero. | social.lezen | solo lectura |
Proponer un cambio
Con el permiso voorstellen.maken propones un registro nuevo o un cambio. La respuesta es un 202: la propuesta está lista, todavía no ha cambiado nada. Indica en waarom el motivo, y quien revisa lo verá junto a ella.
curl -X POST "https://jouw-werkplek.example/api/v1/taken" \
-H "Authorization: Bearer $LAYER_SLEUTEL" \
-H "Content-Type: application/json" \
-d '{"titel": "Llamar por el presupuesto", "deadline": "2026-10-03", "waarom": "Acordado en la reunión"}'HTTP/1.1 202 Accepted
{
"voorstel": { "id": "...", "actie": "taak.nieuw", "titel": "...", "status": "wacht", "link": "https://jouw-werkplek.example/app/ai/goedkeuringen?id=..." },
"uitleg": "Dit is een voorstel. Er is nog niets veranderd: het wacht in Goedkeuringen tot iemand het goedkeurt."
}Sigue el estado con GET /api/v1/voorstellen o GET /api/v1/voorstellen/{id}; solo ves las propuestas de tu propia clave. Si prefieres un webhook, suscríbete a voorstel.goedgekeurd. Otras acciones que conoce la IA de Layer las propones con POST /api/v1/voorstellen y {"actie": "...", "gegevens": { ... }}. Si una acción no es posible, o falta algo, recibes un 422 con el motivo. Eliminar no es posible a través de la API.
Errores
Un error siempre es JSON: {"fout": {"code": "...", "melding": "..."}}, con un mensaje en lenguaje claro.
| Código | Significado |
|---|---|
| 400 | La solicitud no es correcta, por ejemplo una fecha no válida o un campo que falta. |
| 401 | Sin clave, o una clave caducada o revocada. |
| 403 | A la clave le falta un permiso. La cabecera WWW-Authenticate indica qué permiso. |
| 404 | Esta dirección o registro no existe, o no puedes verlo. |
| 405 | Este método no es posible aquí. La cabecera Allow indica lo que sí se puede. |
| 422 | La propuesta ha sido rechazada, con el motivo. |
| 429 | Demasiadas solicitudes. Espera el número de segundos de Retry-After. |
4. Webhooks
Quien gestiona las integraciones en Layer configura los webhooks en Ajustes, Desarrolladores, Webhooks: una dirección y los eventos de los que quieres recibir aviso. El secreto para comprobar la firma lo ves una sola vez.
| Evento | Cuándo |
|---|---|
factuur.verstuurd | Una factura pasa a enviada. |
factuur.betaald | Una factura pasa a pagada. |
offerte.geaccepteerd | Un cliente aceptó un presupuesto. |
ticket.nieuw | Se ha añadido un ticket de soporte, también desde un correo. |
taak.afgerond | Alguien completó una tarea. |
voorstel.goedgekeurd | Se ha aprobado una propuesta en Aprobaciones. |
Un mensaje es deliberadamente escueto: qué ocurrió y dónde lo lees, sin importes ni datos de clientes. El contenido lo obtienes con una clave, mediante href. El id se mantiene igual si reenviamos un mensaje, así que con él reconoces un mensaje duplicado.
POST /jouw-webhook HTTP/1.1
Content-Type: application/json
TrompTech-Event: factuur.betaald
TrompTech-Delivery: ...
TrompTech-Signature: t=1790931600,v1=...
{
"id": "evt_...",
"type": "factuur.betaald",
"aangemaakt": "2026-10-02T09:00:00.000Z",
"data": { "object": "factuur", "id": "...", "nummer": "...", "href": "/api/v1/facturen/..." }
}Comprobar la firma
La cabecera TrompTech-Signature contiene un tiempo t (en segundos) y v1: un HMAC-SHA256 con tu secreto sobre t, un punto y el body tal como llegó. Calcúlalo tú mismo, compara en tiempo constante y rechaza los mensajes de más de cinco minutos.
import { createHmac, timingSafeEqual } from "node:crypto";
// geheim: el secreto completo del webhook, con el prefijo whsec_.
// inhoud: el cuerpo tal como llegó, como texto (no lo leas antes como JSON).
export function handtekeningKlopt(geheim, kop, inhoud) {
const delen = new Map((kop ?? "").split(",").map(d => d.trim().split("=", 2)));
const t = Number(delen.get("t")), v1 = delen.get("v1") ?? "";
// Más de cinco minutos: rechazar, para que nadie pueda reproducir un mensaje antiguo.
if (!Number.isInteger(t) || Math.abs(Date.now() / 1000 - t) > 300 || !/^[0-9a-f]{64}$/.test(v1)) return false;
const verwacht = createHmac("sha256", geheim).update(`${t}.${inhoud}`).digest();
return timingSafeEqual(verwacht, Buffer.from(v1, "hex"));
}import hashlib, hmac, re, time
def handtekening_klopt(geheim: str, kop: str, inhoud: bytes) -> bool:
delen = dict(d.strip().split("=", 1) for d in (kop or "").split(",") if "=" in d)
t, v1 = delen.get("t", ""), delen.get("v1", "")
if not t.isdigit() or abs(time.time() - int(t)) > 300 or not re.fullmatch(r"[0-9a-f]{64}", v1):
return False
verwacht = hmac.new(geheim.encode(), t.encode() + b"." + inhoud, hashlib.sha256).hexdigest()
return hmac.compare_digest(verwacht, v1)Entrega y reintentos
- Responde en 10 segundos con un 2xx. No seguimos redirecciones (3xx).
- Si no funciona, lo volvemos a intentar tras 1 minuto, 5 minutos, 30 minutos, 2 horas, 6 horas y 24 horas. Después el mensaje se considera fallido; puedes reenviarlo desde Layer.
- Si fallan diez mensajes seguidos, el webhook se desactiva. Lo vuelves a activar tú.
- Solo https a una dirección pública con nombre, en el puerto estándar. Una dirección que apunta a una red interna no recibe nada; lo comprobamos de nuevo en cada entrega.
5. Conectar una app de IA mediante MCP
Layer es un servidor MCP en https://jouw-werkplek.example/api/mcp (Streamable HTTP). El inicio de sesión usa OAuth 2.1 con PKCE: la app te envía a Layer, inicias sesión como siempre (con tu segundo factor si lo tienes) y eliges en la pantalla de consentimiento qué puede hacer la app.
- Claude: abre Configuración, Conectores, y añade un conector personalizado con la dirección de tu servidor MCP.
- ChatGPT: abre Configuración, Aplicaciones y conectores. En Avanzado activa el modo de desarrollador y crea un conector con la dirección, con OAuth como inicio de sesión.
- Otras apps: funciona cualquier cliente MCP con OAuth. Layer admite el registro dinámico (RFC 7591) y Client ID Metadata Documents, y publica sus datos en
/.well-known/oauth-authorization-servery/.well-known/oauth-protected-resource.
Los nombres de los menús en Claude y ChatGPT a veces cambian según la versión. La app solo ve las herramientas que corresponden a los permisos elegidos. Leer es directo. Versiones del protocolo compatibles: 2026-07-28, 2025-11-25, 2025-06-18 y 2025-03-26.
Primero un plan. Un cambio suelto lo hace la app enseguida. Varios cambios a la vez, o algo que crea estructura como un proyecto con tareas, primero lo registra como plan: exactamente las acciones con sus datos. Ese plan lo ves en tu chat, y solo después de tu sí expreso Layer ejecuta exactamente esas acciones, una vez. Los cambios internos (un lead, contacto, nota, tarea, cita sin invitación, proyecto o documento) Layer los ejecuta entonces enseguida, si tu espacio de trabajo lo permite. Los vuelves a ver en Aprobaciones y ahí los deshaces. Todo lo que sale fuera o tiene que ver con dinero, como un correo, una invitación, enviar un presupuesto o una factura, sigue siendo siempre una propuesta que apruebas tú. Una sesión por MCP siempre cuenta como texto de fuera.
Una app conectada sigue funcionando hasta que la revocas en Ajustes, Dispositivos, o hasta que lleva 30 días sin usarse.
6. ¿Preguntas o has encontrado un problema?
Escribe a info@tromptech.nl. Si encuentras un problema de seguridad, comunícalo mejor de forma confidencial, como se describe en Informar de un problema de seguridad.