P4 Software / anota

Desarrolladores y API

Desarrolladores y API

Descripción general

Esta página es para quienes quieren conectar anota con otras herramientas o crear formularios sin usar el editor visual. anota expone dos formas de hacerlo con las mismas claves de acceso: una API REST para integraciones tradicionales, y un conector MCP (Model Context Protocol) que le permite a un agente de IA como Claude crear y editar formularios en tu cuenta a partir de instrucciones en lenguaje natural. Ambas cubren el ciclo completo: crear, editar, clonar, publicar y eliminar formularios (incluida su lógica condicional), leer y gestionar respuestas, e incluso registrar webhooks que envían cada respuesta nueva a tu propio sistema. anota además publica bibliotecas cliente oficiales para 10 lenguajes de programación (ver SDKs oficiales más abajo), para quienes prefieren integrar sin llamar a la API REST directamente. La usan equipos técnicos, integradores y cualquier usuario que prefiera pedirle a Claude "créame un formulario de..." en lugar de armarlo campo por campo.

Cómo llegar

  • Administrar claves de API: página Claves de API (ruta /api-keys). [POR VERIFICAR: la entrada exacta del menú principal que enlaza a esta página no se confirmó en esta investigación].
  • Referencia completa de la API REST: /developers.
  • Guía para conectar Claude a tu cuenta: página /claude.

Conceptos clave

  • Clave de API (API key): token que autentica todas las solicitudes hacia tu workspace, con el formato anota_sk_ seguido de una cadena de caracteres.
  • Bearer token: forma en la que se envía la clave en cada solicitud, dentro del encabezado Authorization.
  • MCP (Model Context Protocol): el protocolo que usa Claude (u otro agente compatible) para invocar acciones concretas dentro de anota, llamadas "herramientas".
  • Herramienta (tool): una acción específica disponible por MCP o por la API REST, por ejemplo create_form.
  • Formulario en Borrador / Publicado: un formulario nace en Borrador. Al publicarlo por primera vez queda visible al público; publicarlo de nuevo envía los cambios del borrador a la versión pública sin afectar las respuestas ya recibidas. Ver la sección Regla importante más abajo para lo que esto implica al editar campos por API o MCP.

Administrar tus claves de API

Requisitos previos

Necesitas el rol Admin o superior en el workspace (consulta Roles y permisos para ver qué incluye cada rol). Con un rol inferior, la página Claves de API muestra un mensaje de acceso denegado y no puedes crear ni revocar claves.

Crear una clave

  1. Ve a Claves de API (/api-keys).
  2. En el panel Crear una clave nueva, escribe un nombre que te ayude a identificar para qué usarás la clave, en el campo con el marcador de posición Nombre, p. ej. Claude. Obligatorio, máximo 200 caracteres.
  3. Haz clic en Crear clave (el botón muestra Creando... mientras se procesa).
  4. anota muestra el panel Tu nueva clave con el valor completo de la clave y un botón Copiar (cambia a Copiada! al hacer clic). anota advierte que guardes la clave en un lugar seguro en ese momento, porque por seguridad no volverá a mostrarla completa.
  5. Copia la clave y guárdala en tu gestor de contraseñas o en la configuración de la integración antes de salir de esta pantalla.

Resultado: la clave nueva aparece en la tabla de claves con su Nombre, la columna Clave (que siempre muestra el valor genérico enmascarado anota_sk_... y no un fragmento real de tu clave — usa el nombre para distinguir una clave de otra), la fecha de Creada y Último uso en Nunca hasta que se use por primera vez.

Revocar una clave

  1. Ve a Claves de API (/api-keys).
  2. En la fila de la clave que quieres eliminar, haz clic en Revocar.
  3. anota pide confirmación en línea: ¿Revocar? Las integraciones que la usan dejarán de funcionar.
  4. Haz clic en Sí, revocar para confirmar, o en Cancelar para no revocarla.

Resultado: la clave se elimina de inmediato y de forma permanente. No existe una acción de "regenerar" ni un período de gracia: cualquier integración que la use (Claude, un script, otra herramienta) deja de poder autenticarse al instante. Si no encontrabas la clave (por ejemplo, otra persona ya la había revocado), anota informa que no pudo encontrarla.

Si aún no tienes ninguna clave, la página muestra el mensaje Aún no tienes claves de API en vez de la tabla.

Autenticar solicitudes (REST y MCP)

La misma clave de API sirve tanto para la API REST como para el conector MCP: no hay claves separadas por tipo de integración. En cada solicitud, envía el encabezado:

Authorization: Bearer anota_sk_...

Todas las claves de un workspace tienen el mismo nivel de acceso: pueden usar cualquier herramienta disponible sobre los formularios, respuestas y Plantillas de ese workspace. Hoy no existe una forma de crear una clave con permisos limitados a solo algunas acciones.

Tu clave completa solo se muestra una vez, en el momento de crearla. anota no la guarda en texto plano ni puede volver a mostrártela — si la pierdes, crea una clave nueva y revoca la anterior.

Referencia completa de la API REST

El detalle de cada endpoint de la API REST (parámetros, cuerpos de solicitud y respuestas) está en la página anota API (/developers), un explorador interactivo que se genera automáticamente a partir de la especificación de la API. Esta página de Desarrolladores y API es solo una introducción; usa /developers como referencia técnica completa.

SDKs oficiales

anota publica bibliotecas cliente oficiales de código abierto para 10 lenguajes de programación, cada una con cobertura completa de las 25 operaciones de la API REST (formularios, campos, Lógica condicional, respuestas y webhooks). Todas están en github.com/anotacloud, con licencia MIT.

Lenguaje Repositorio Descarga
Android (Kotlin) anota-api-android ZIP · Tarball
C# / .NET anota-api-csharp ZIP · Tarball
Go anota-api-go ZIP · Tarball
iOS (Swift) anota-api-ios ZIP · Tarball
Java anota-api-java ZIP · Tarball
NodeJS (TypeScript) anota-api-nodejs ZIP · Tarball
PHP anota-api-php ZIP · Tarball
Python anota-api-python ZIP · Tarball
Ruby anota-api-ruby ZIP · Tarball
Scala anota-api-scala ZIP · Tarball

Cada repositorio incluye su propio README (en inglés, con enlace a una versión en español) con instrucciones de instalación, un ejemplo funcional de extremo a extremo y la lista completa de métodos disponibles.

Conectar Claude a anota (MCP)

Para que Claude pueda crear y editar formularios en tu cuenta:

  1. Crea una clave de API siguiendo los pasos de Crear una clave (el botón en la página de marketing dice Crear una llave de API).
  2. En Claude, ve a Settings (Configuración) > Connectors (Conectores) y agrega un conector personalizado (custom connector).
  3. Usa https://anota.cloud/mcp como URL del conector.
  4. Usa la clave de API que copiaste como el token Bearer.

A partir de ahí, puedes pedirle a Claude en lenguaje natural que liste, cree o edite tus formularios, y Claude invoca las herramientas MCP correspondientes.

Ejemplo: le escribes a Claude "Créame un formulario de registro para un evento, con nombre, correo electrónico y un campo de selección para el tipo de entrada (General o VIP)". Claude llama a create_form para crear el formulario en Borrador y luego a add_fields para agregar los tres campos que pediste. El formulario queda listo para revisarlo en el editor de formularios y publicarlo cuando estés conforme.

Herramientas MCP disponibles

Estas son las herramientas para trabajar con formularios expuestas por el conector MCP (y equivalentes en la API REST):

Herramienta Qué hace
list_forms Lista los formularios del workspace.
get_form Obtiene el detalle completo de un formulario, incluidos sus campos y sus reglas de lógica condicional: el id de cada regla (necesario para usarla con edit_logic_rule o delete_logic_rule), si está pausada (disabled), el copyFrom de cada acción copyValue, y el value de cada acción setThankYou/redirectTo.
create_form Crea un formulario nuevo, en estado Borrador.
add_fields Agrega uno o más campos nuevos a un formulario.
edit_field Edita un campo existente. Solo funciona si el formulario nunca se ha publicado.
delete_field Elimina un campo existente. Solo funciona si el formulario nunca se ha publicado. Si el campo estaba referenciado por una regla de lógica condicional, esa referencia se quita automáticamente de la regla (y la regla se elimina por completo si no le queda ninguna condición ni ninguna acción) en lugar de bloquear la eliminación.
publish_form Publica el formulario por primera vez, o envía los cambios del borrador a la versión pública si ya estaba publicado.
rename_form Cambia el nombre del formulario.
delete_form Mueve el formulario a la Papelera (eliminación suave): desaparece de las listas y su URL pública deja de aceptar respuestas, pero las respuestas se conservan y puedes restaurarlo desde la app.
clone_form Duplica un formulario como un Borrador nuevo con URL propia, copiando campos, reglas de lógica y plantilla PDF (las respuestas y versiones no se copian). Como el clon nunca se ha publicado, todos sus campos son editables — es la vía para "editar" los campos bloqueados de un formulario publicado.
set_pdf_template Define la plantilla usada para exportar el formulario a PDF.
add_logic_rules Agrega una o más reglas de lógica condicional al borrador de un formulario. Cada regla trae su grupo de condiciones (SI, con coincidencia "all"/"any"), sus acciones (ENTONCES — ver "Acciones disponibles" más abajo) y opcionalmente disabled para agregarla ya pausada. Las reglas nuevas se ejecutan después de las que ya tenía el formulario.
edit_logic_rule Reemplaza por completo las condiciones, acciones y el estado disabled de una regla existente, identificada por su id (obtenido con get_form), conservando su posición entre las demás reglas.
delete_logic_rule Elimina una regla de Lógica condicional por su id.

Además de estas, el conector también expone herramientas para trabajar con respuestas — de lectura (list_submissions, get_submission, submission_stats) y de escritura (create_submission para crear una respuesta por API en un formulario publicado, validada igual que la de un respondiente; set_submission_status para marcarla como New/Read/Flagged/Spam; y delete_submission, que la elimina de forma permanente junto con sus archivos) —, para plantillas de formulario (list_templates, create_form_from_template), y para webhooks (list_webhooks, add_webhook, delete_webhook; ver la sección siguiente).

Webhooks: recibe cada respuesta en tu sistema

Un webhook envía cada respuesta nueva de un formulario a una URL tuya, para que otros sistemas reaccionen sin estar consultando la API. Se administran por API o MCP (add_webhook, list_webhooks, delete_webhook) y funcionan así:

  • Al agregar un webhook indicas una URL HTTPS (se rechazan URLs que apunten a direcciones internas o privadas). anota te devuelve un secreto de firma (whsec_...).
  • Cada respuesta nueva se envía como un POST JSON a tu URL con el evento submission.created: id del formulario, título, id de la respuesta, fecha y las respuestas como pares etiqueta/valor.
  • Cada entrega incluye el encabezado X-Anota-Signature: sha256=<HMAC-SHA256 del cuerpo, con tu secreto> para que verifiques que el envío viene de anota, además de X-Anota-Event y X-Anota-Webhook-Id.
  • Si tu servidor no responde o devuelve error, anota reintenta la entrega hasta 5 veces. La entrega nunca bloquea ni afecta al respondiente.
  • Máximo 10 webhooks por formulario.

Acciones disponibles en add_logic_rules / edit_logic_rule

Cada acción del arreglo then de una regla trae un campo action con uno de estos doce valores, y usa distintos campos adicionales según cuál sea:

action Campos adicionales Qué hace
show targetId (id de campo) Muestra el campo.
hide targetId (id de campo) Oculta el campo.
require targetId (id de campo) Hace obligatoria la respuesta del campo mientras la regla se cumple.
unrequire targetId (id de campo) Quita la obligatoriedad del campo mientras la regla se cumple.
enable targetId (id de campo) Habilita el campo, revirtiendo un disable anterior.
disable targetId (id de campo) Deshabilita el campo; su respuesta nunca se incluye en el envío.
copyValue targetId (campo destino), copyFrom (campo origen) Copia, en el navegador de quien llena el formulario y en vivo (igual que calculate), la respuesta de copyFrom hacia targetId. Requiere JavaScript; no tiene efecto si el respondiente lo tiene deshabilitado.
skipToPage targetId (id de página) Salta directamente a esa página.
calculate targetId (campo numérico), formula Calcula el valor de targetId a partir de la fórmula (puede referenciar otros campos entre llaves, p. ej. {f_qty} * 25).
routeEmail emailTo Envía una copia de la notificación de esa respuesta a esa dirección.
setThankYou value (texto) Reemplaza el mensaje de agradecimiento por value mientras la regla se cumple. Si varias reglas con esta acción se cumplen a la vez, gana la primera que aparece en then de las reglas del formulario (no la última) — la única excepción al orden normal de evaluación. No admite variantes por idioma.
redirectTo value (URL) Redirige a value en vez de mostrar la pantalla de agradecimiento, mientras la regla se cumple. Mismo criterio de "gana la primera regla" que setThankYou, y tiene prioridad sobre setThankYou si ambas se cumplen.

value en setThankYou/redirectTo es obligatorio y no puede estar vacío — una llamada con ese campo vacío o ausente se rechaza igual que cualquier otro campo requerido de una acción (todo o nada: si una acción de la llamada falla su validación, no se guarda ninguna).

Cada regla, además de if y then, admite un campo opcional disabled (booleano, por defecto false). Una regla con disabled: true queda guardada en el formulario, pero anota nunca la evalúa en la página pública — el mismo efecto que pausarla con el botón ⏸ del panel Condiciones del constructor (ver Lógica condicional).

Regla importante: los campos se bloquean después de publicar

Un formulario empieza en Borrador, sin restricciones. En cuanto se publica por primera vez, sus campos existentes quedan bloqueados para proteger la integridad de las respuestas ya recibidas: a partir de ese momento solo puedes agregar campos nuevos (add_fields); ya no puedes editar (edit_field) ni eliminar (delete_field) los campos que existían al publicar. Esta regla aplica igual si trabajas desde el editor de formularios visual que si trabajas por la API o por Claude/MCP — no hay una vía alterna para saltarla.

Si necesitas modificar o eliminar un campo existente después de publicar, hazlo antes de la primera publicación, o crea un formulario nuevo.

Las reglas de lógica no se bloquean al publicar

A diferencia de los campos, las reglas de lógica condicional no quedan bloqueadas cuando el formulario se publica: add_logic_rules, edit_logic_rule y delete_logic_rule funcionan igual sobre el borrador de un formulario publicado que sobre uno que nunca se ha publicado (llama a publish_form después para que el cambio se refleje en la página pública). Es intencional — a diferencia de un campo, una regla no cambia la forma en que quedaron guardadas las respuestas ya recibidas, así que se trata como cualquier otro contenido editable en cualquier momento (por ejemplo, el mensaje de agradecimiento). Una excepción a tener en cuenta: si editas una regla cuya acción es Enviar copia por correo, el cambio afecta desde ese momento a las notificaciones de las respuestas nuevas; no reenvía ni corrige las notificaciones que ya se enviaron.

Referencia de campos

Campo del formulario Crear una clave nueva:

Campo Tipo Obligatorio Descripción
Nombre (marcador: Nombre, p. ej. Claude) Texto Obligatorio Nombre libre para identificar la clave en la tabla. Máximo 200 caracteres.

Roles y permisos

Rol Ver la página Claves de API Crear clave Revocar clave
Admin o superior
Roles inferiores a Admin No (acceso denegado) No No

Preguntas frecuentes / Solución de problemas

Síntoma Causa probable Solución
No encuentras el valor completo de una clave que ya creaste anota solo muestra el valor completo una vez, al crearla; después solo se ve el valor enmascarado genérico anota_sk_... Crea una clave nueva con Crear clave y revoca la anterior con Revocar.
Recibes un error de autenticación al llamar a /mcp o a la API REST Falta el encabezado Authorization, no tiene el prefijo anota_sk_, o la clave fue revocada Verifica que envíes Authorization: Bearer anota_sk_... y que la clave siga activa en Claves de API.
Claude no puede editar ni eliminar un campo con edit_field o delete_field El formulario ya se publicó al menos una vez; sus campos existentes quedan bloqueados Solo puedes agregar campos nuevos con add_fields en un formulario publicado. Para modificar o eliminar campos existentes, hazlo antes de publicar, o usa clone_form: el clon es un borrador nuevo con todos los campos editables.
edit_logic_rule o delete_logic_rule devuelven un error de id no encontrado El id de regla no existe en el borrador actual del formulario (por ejemplo, ya se eliminó, o se copió de otro formulario) Llama a get_form para obtener los ids de regla vigentes y vuelve a intentarlo con el id correcto.
No aparece el botón Crear clave, o ves un mensaje de acceso denegado en Claves de API Tu rol en el workspace es inferior a Admin Pide a un Admin o superior del workspace que cree la clave, o que te asigne el rol Admin.
La creación o revocación de una clave falla sin motivo claro Error temporal al procesar la solicitud Intenta de nuevo; si el problema persiste, contacta soporte.

Funciones relacionadas

¿Te resultó útil esta página?