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.
/api-keys). [POR VERIFICAR: la entrada exacta del menú principal que enlaza a esta página no se confirmó en esta investigación]./developers./claude.anota_sk_ seguido de una cadena de caracteres.Authorization.create_form.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.
/api-keys).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.
/api-keys).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.
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.
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.
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.
Para que Claude pueda crear y editar formularios en tu cuenta:
https://anota.cloud/mcp como URL del conector.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.
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).
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í:
whsec_...).submission.created: id del formulario, título, id de la respuesta, fecha y las respuestas como pares etiqueta/valor.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.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).
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.
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.
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. |
| Rol | Ver la página Claves de API | Crear clave | Revocar clave |
|---|---|---|---|
| Admin o superior | Sí | Sí | Sí |
| Roles inferiores a Admin | No (acceso denegado) | No | No |
| 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. |
¿Te resultó útil esta página?