formbasedocs
Ir a la appApp

Desarrolladores

Métodos de la API

Referencia completa de todos los métodos expuestos por la API REST de formbase. Cada método muestra sus parámetros, ejemplos de solicitud y la forma de las respuestas.


Un único endpoint, muchos métodos

Todos los métodos son POST https://api.formbase.so/api/v1 con un cuerpo JSON {"method": "...", "params": {...}} y una cabecera Authorization: Bearer fb_…. Consulta Descripción general de la API para autenticación y manejo de errores, y tokens de API para el token en sí.

Convenciones

  • params puede omitirse; su valor por defecto es {}. Un método desconocido es 404 METHOD_NOT_FOUND.

  • Un token está vinculado a un espacio de trabajo. Nombrar otro espacio de trabajo, o un formulario de otro, es 403 FORBIDDEN incluso si perteneces a ambos.

  • Paginación. Los métodos de listado devuelven { items, nextCursor, hasMore }; la mayoría también devuelve canPaginate, que es false cuando hasMore es true pero ningún cursor puede continuar (búsqueda aproximada). Pasa nextCursor de vuelta como cursor. limit va de 1 a 100, con 20 por defecto — salvo requests.list, cuyo valor por defecto es 25.

  • Límites de velocidad. 120 llamadas por minuto por token, compartidas con el servidor MCP; requests.create tiene su propio límite de 60 por minuto. La autenticación fallida se limita por separado, 30 cada 15 minutos por IP, tras lo cual los tokens incorrectos ven RATE_LIMITED en lugar de UNAUTHORIZED.

  • Tamaño del cuerpo. 1 MiB. Los cuerpos más grandes se rechazan con VALIDATION_ERROR.

  • Versionado. La ruta lleva la versión. Los cambios que rompen compatibilidad se publican como /api/v2; los métodos nuevos y los campos de respuesta nuevos no.

Formularios

forms.list

Lista los formularios de un espacio de trabajo. Admite paginación por cursor y búsqueda difusa opcional por nombre.

POSThttps://api.formbase.so/api/v1
Parámetros5
workspaceIdstringrequired

ID del espacio de trabajo.

folderIdstring | nulloptional

Filtrar por carpeta. Pasa null para obtener solo los formularios en la raíz. Omite para listar todos.

querystringoptional

Búsqueda difusa por nombre. Los resultados están limitados por limit; no se pagina por cursor.

limitnumberoptionaldefault: 20

Tamaño de página (1–100).

cursorstringoptional

Cursor de paginación de una respuesta anterior.

bash
curl -X POST https://api.formbase.so/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "forms.list",
    "params": { "workspaceId": "ws_abc123" }
  }'
200Éxito
json
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "frm_abc123",
        "name": "Contact Form",
        "folderId": null,
        "workspaceId": "ws_abc123",
        "isPublished": true,
        "publishedAt": 1714041851000,
        "unpublishedAt": null,
        "createdAt": 1714041800000,
        "lastEditedAt": 1714042000000,
        "emoji": null
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}
400Falta workspaceId
401Token de API inválido o ausente
429Límite de solicitudes superado

forms.get

Obtiene los detalles completos de un formulario, incluidas las preguntas, la portada, el logotipo y una URL de vista previa.

POSThttps://api.formbase.so/api/v1
Parámetros1
formIdstringrequired

ID del formulario.

bash
curl -X POST https://api.formbase.so/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "forms.get",
    "params": { "formId": "frm_abc123" }
  }'
200Éxito
json
{
  "ok": true,
  "data": {
    "id": "frm_abc123",
    "name": "Event Feedback",
    "folderId": null,
    "workspaceId": "ws_abc123",
    "isPublished": true,
    "publishedAt": 1714041851000,
    "unpublishedAt": null,
    "createdAt": 1714041800000,
    "lastEditedAt": 1714042000000,
    "emoji": null,
    "questions": [
      {
        "id": "q_1",
        "type": "email-input",
        "inputType": "email",
        "title": "Your email",
        "metadata": null
      },
      {
        "id": "q_2",
        "type": "rating-input",
        "inputType": "rating",
        "title": "Overall experience",
        "metadata": { "kind": "rating", "maxStars": 5 }
      }
    ],
    "hasContent": true,
    "cover": null,
    "logo": null,
    "isDeleted": false,
    "trashedAt": null,
    "previewUrl": "https://formbase.so/preview/abc..."
  }
}
400Falta formId
404Formulario no encontrado

forms.create

Crea un nuevo formulario vacío. Devuelve el formulario y una URL de vista previa.

POSThttps://api.formbase.so/api/v1
Parámetros3
namestringrequired

Nombre del formulario (1–255 caracteres).

workspaceIdstringrequired

ID del espacio de trabajo.

folderIdstringoptional

Coloca el formulario en una carpeta. Omite para crearlo en la raíz del espacio de trabajo.

200Formulario creado
json
{
  "ok": true,
  "data": {
    "id": "frm_new123",
    "name": "Contact",
    "workspaceId": "ws_abc123",
    "folderId": null,
    "isPublished": false,
    "createdAt": 1714041851000,
    "previewUrl": "https://formbase.so/preview/abc..."
  }
}
400Falta name o workspaceId
401Token de API inválido o ausente

forms.update

Actualiza los metadatos del formulario: nombre, carpeta, emoji, portada o logotipo. No actualiza el contenido del formulario (usa las herramientas del editor para eso).

POSThttps://api.formbase.so/api/v1
Parámetros6
formIdstringrequired

ID del formulario.

namestringoptional

Nuevo nombre del formulario (1–255 caracteres).

folderIdstring | nulloptional

Mueve el formulario a una carpeta. Pasa null para moverlo a la raíz del espacio de trabajo.

emojistring | nulloptional

Emoji del formulario (máx. 10 caracteres). Pasa null para eliminarlo.

coverobjectoptional

Portada. {"type": "color", "color": "#ffffff"}, {"type": "image", "url": "https://...", "offsetY": 50} (offsetY 0–100, 50 por defecto), o {"type": "none"} para eliminarla. Las URLs de imagen deben ser http(s) o una URI data:image.

logoobjectoptional

Logotipo. {"type": "icon", "name": "HeartIcon"}, {"type": "image", "url": "https://..."}, o {"type": "none"} para eliminarlo. Los nombres de icono son fijos: QuestionMarkIcon, ListBulletsIcon, ChartBarIcon, ClockCountdownIcon, HeartIcon, LightbulbIcon, CheckCircleIcon, MagnifyingGlassIcon, TrendUpIcon, EnvelopeIcon, PhoneIcon, CalendarIcon, LinkIcon, UsersIcon.

Pasa al menos uno de los cinco campos actualizables. No cambia el contenido del formulario — usa las herramientas del editor de MCP para eso.

bash
curl -X POST https://api.formbase.so/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "forms.update",
    "params": {
      "formId": "frm_abc123",
      "name": "Updated Name",
      "emoji": "📋"
    }
  }'
200Formulario actualizado
json
{
  "ok": true,
  "data": {
    "id": "frm_abc123",
    "name": "Updated Name",
    "folderId": null,
    "emoji": "📋"
  }
}

cover y logo solo vuelven cuando los enviaste. Un payload que coincidía con el estado actual en todos los campos escalares añade noChange: true.

forms.publish

Publica un formulario para que pueda recibir respuestas, y congela sus claves de campo en una nueva instantánea. Idempotente: un formulario ya publicado devuelve éxito con alreadyPublished: true, y un formulario despublicado se vuelve a publicar desde su última instantánea.

POSThttps://api.formbase.so/api/v1
Parámetros1
formIdstringrequired

ID del formulario.

Un formulario con bloques de contenido pero sin preguntas se publica con una advertencia. Un formulario sin ningún contenido no se puede publicar. Publicar no crea una URL pública — llama a shareLinks.create para eso.

forms.unpublish

Pone un formulario fuera de línea. Los respondentes ya no pueden abrirlo. Idempotente — un formulario que no está publicado devuelve alreadyUnpublished: true. Reversible con forms.publish.

POSThttps://api.formbase.so/api/v1
Parámetros1
formIdstringrequired

ID del formulario.

forms.delete

Mueve un formulario a la papelera. Sus enlaces para compartir activos se revocan, así que sus URLs públicas dejan de funcionar.

POSThttps://api.formbase.so/api/v1
Parámetros1
formIdstringrequired

ID del formulario.

forms.restore

Restaura un formulario desde la papelera.

POSThttps://api.formbase.so/api/v1
Parámetros2
formIdstringrequired

ID del formulario.

folderIdstring | nulloptional

Dónde restaurarlo. Omite para su carpeta original, null para la raíz del espacio de trabajo, o un ID de carpeta.

Un formulario que no está en la papelera devuelve alreadyRestored: true.

formSettings.get

Lee los ajustes de comportamiento de un formulario.

POSThttps://api.formbase.so/api/v1
Parámetros1
formIdstringrequired

ID del formulario.

Devuelve { settings, isDefault, availableEmailDomains, defaultFromAddress, payment }. isDefault es true cuando el formulario aún no tiene una fila de ajustes guardada y estás viendo los valores por defecto. availableEmailDomains contiene los ids de dominio verificados que puedes pasar como emailDomainId, y payment indica si Stripe está conectado (conectarlo es un paso desde el panel).

formSettings.update

Actualiza los ajustes de comportamiento de un formulario. Una actualización parcial: solo se escriben los campos que envías.

POSThttps://api.formbase.so/api/v1
Parámetros8
formIdstringrequired

ID del formulario.

Accessgroupoptional

language (BCP-47, por defecto “en”), requireAuthentication, showBranding, captchaEnabled, passwordEnabled, password (4 caracteres o más; una cadena implica passwordEnabled: true, null elimina el bloqueo).

Owner notificationsgroupoptional

notifyOnSubmission, notificationEmails (array), selfNotificationSubject, selfNotificationEmailBody, pdfGenerationEnabled, showViewSubmissionButton. Los correos del propietario no son traducibles — escríbelos en el idioma que quieras.

Respondent notificationsgroupoptional

respondentNotificationEnabled, respondentNotificationTo (el id de campo de una pregunta de correo, o null), respondentNotificationSubject, respondentNotificationBody, respondentNotificationPdfEnabled.

Remindersgroupoptional

respondentReminderEnabled, respondentReminderTo, respondentReminderSubject, respondentReminderBody, respondentReminderRequiredFieldIds, y reminderSteps — desfases de inactividad como [“1d”,“3d”,“1w”], como máximo 5, ordenados y deduplicados al guardar, [] para ninguno. El calendario se aplica tanto a respuestas de enlace público abandonadas como a solicitudes. Pro.

After submitgroupoptional

redirectUrl (http(s); null o “” lo elimina), redirectQueryParams ( [{ paramName, fieldId }]), allowAnotherResponse (mutuamente excluyente con una redirección), maxSubmissionsPerRespondent (0 = sin límite, máx. 1000), editAfterSubmit, maxEdits (máx. 3; 0 significa sin límite en Pro y Business, 3 en Free).

Retentiongroupoptional

draftRetentionDays y submissionRetentionDays (0–36500, null vuelve al valor por defecto). La retención de respuestas es Business, y establecerla elimina cualquier fecha de eliminación fija configurada en el editor.

emailDomainIdstring | nulloptional

Un id de dominio de correo verificado de formSettings.get, para una dirección De personalizada. null restablece el remitente por defecto.

Los asuntos y cuerpos son texto plano y aceptan marcadores {{variable}}; los saltos de línea se convierten en párrafos. Personalizar un asunto o cuerpo de respondente lo hace traducible, así que sus claves aparecen de inmediato en translations.listEntries.

Respuestas

submissions.list

Lista las respuestas de un formulario, la página más reciente primero, con paginación por cursor.

POSThttps://api.formbase.so/api/v1
Parámetros5
formIdstringrequired

ID del formulario.

includeDraftsbooleanoptionaldefault: true

Incluye respuestas que se empezaron pero nunca se enviaron. Los borradores son una función Pro: en Free solo se listan los envíos completados.

translationLanguagestringoptional

Adjunta las traducciones de IA guardadas de las respuestas bajo items[].translation.display, con las mismas claves que display. items[].answers y items[].display siempre conservan el original.

limitnumberoptionaldefault: 20

Tamaño de página (1–100).

cursorstringoptional

Cursor de paginación de una respuesta anterior.

200Success
json
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "formName": "Event Feedback",
    "items": [
      {
        "id": "sub_xyz789",
        "submittedAt": "2026-05-18 18:02:28",
        "isCompleted": true,
        "createdAt": "2026-05-18 18:02:19",
        "answers": {
          "email": "user@example.com",
          "plan": "pro",
          "contacts": [{ "name": "Ada" }, { "name": "Grace" }]
        },
        "display": {
          "email": "user@example.com",
          "plan": "Pro",
          "contacts": "Ada, Grace"
        }
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}

Las mismas respuestas que webhooks y callbacks

Cada elemento lleva answers indexado por clave de campo y display con las mismas claves, en texto legible — la forma que llevan un payload de webhook, un callback de solicitud y requests.get. Una respuesta de elección es su clave de opción, un grupo repetitivo un array de instancias. Llama a fields.list para el título y las etiquetas de opción de cada clave. Este método no devuelve totales.

submissions.pdf

Obtiene un enlace al PDF de una respuesta. Construido para el conector de Zapier: solo devuelve un resultado cuando el formulario tiene una integración de Zapier activa configurada para incluir el PDF, y el PDF se conservó.

POSThttps://api.formbase.so/api/v1
Parámetros2
formIdstringrequired

ID del formulario.

submissionIdstringrequired

ID de la respuesta. Debe pertenecer a ese formulario y estar completada.

200Success
json
{
  "ok": true,
  "data": {
    "url": "https://api.formbase.so/api/storage/...",
    "filename": "formbase-submission-sub_xyz789.pdf",
    "contentType": "application/pdf",
    "byteLength": 148213
  }
}
404Sin PDF conservado para una integración de Zapier en esta respuesta

submissions.sample

Construye un payload de respuesta de muestra para un formulario, sin ningún dato real. Es exactamente la forma que lleva una entrega de respuesta de enlace público, así que los conectores lo usan para descubrir campos; una respuesta nacida de una solicitud llega a una suscripción como request.completed en su lugar, muestreada por

requests.sample. data.form.snapshotId es la versión publicada actual del formulario, el mismo id que llevan los eventos en vivo, o null mientras el formulario no esté publicado.

POSThttps://api.formbase.so/api/v1
Parámetros1
formIdstringrequired

ID del formulario.

200Muestra generada
json
{
  "ok": true,
  "data": {
    "id": "evt_example000000000000",
    "type": "submission.completed",
    "createdAt": "2026-05-18T19:00:00.000Z",
    "apiVersion": "2026-09-24",
    "test": true,
    "data": {
      "form": { "id": "frm_abc123", "name": "Event Feedback", "snapshotId": "js7abc123" },
      "submission": {
        "id": "sub_example000000000000",
        "respondentEmail": "respondent@example.com",
        "submittedAt": "2026-05-18T19:00:00.000Z",
        "updatedAt": null,
        "editCount": 0,
        "pdfUrl": null,
        "language": "en"
      },
      "answers": { "your_email": "john@example.com" },
      "display": { "your_email": "john@example.com" }
    }
  }
}

La semántica de los campos y del payload está documentada una sola vez, en la referencia de webhooks.

Campos

fields.list

Lista todos los campos de la versión publicada actual de un formulario, con la clave para dirigirte a cada uno. Llama a esto antes de requests.create en lugar de codificar las claves a mano. Consulta Claves de campo.

POSThttps://api.formbase.so/api/v1
Parámetros1
formIdstringrequired

ID del formulario. Un formulario que nunca se ha publicado todavía no tiene claves de campo y responde con published: false sin elementos.

bash
curl -X POST https://api.formbase.so/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "fields.list",
    "params": { "formId": "j57..." }
  }'
200Éxito
json
{
  "ok": true,
  "data": {
    "published": true,
    "items": [
      { "key": "company_name", "type": "text", "title": "Company", "required": true, "prefillable": true },
      {
        "key": "company_size", "type": "select", "title": "Company size", "required": false, "prefillable": true,
        "options": [
          { "key": "1_50", "label": "1–50" },
          { "key": "51_200", "label": "51–200" }
        ]
      },
      {
        "key": "satisfaction", "type": "matrix", "title": "How did we do?", "required": false, "prefillable": true,
        "rows": [{ "key": "delivery_speed", "label": "Delivery speed" }],
        "columns": [{ "key": "very_good", "label": "Very good" }, { "key": "poor", "label": "Poor" }]
      },
      { "key": "case_id", "type": "hidden", "title": "Case", "required": false, "prefillable": false, "context": true },
      { "key": "total", "type": "number", "title": "Total", "required": false, "prefillable": false, "calculated": true }
    ],
    "hasMore": false
  }
}

Cómo leer los indicadores

context: true es un campo oculto — su valor va en context, nunca en prefill. prefillable: false marca un campo al que nadie puede darle un valor (archivo, firma, pago, cita, documentos). Para una pregunta de elección, envía la clave de la opción, no su etiqueta; una matriz lista sus rows y columns del mismo modo y toma { "row_key": "column_key" }. calculated: true es un campo calculado: el formulario calcula su valor, lo vuelves a leer en answers, y nada puede enviarlo.

Un grupo repetitivo es type: “group” con repeating: true y un array members. Un bloque de Documentos es type: “documents” y lleva documents: [{ name }], los archivos de autor que todo respondente ya ve.

400Falta formId
404Formulario no encontrado

Solicitudes

Una solicitud asigna un formulario publicado a una persona y te llama de vuelta cuando termina. La guía conceptual está en Crear una solicitud; esta es la lista de parámetros.

requests.create

Crea una solicitud. Gasta una unidad del cupo mensual del espacio de trabajo, responda o no el destinatario.

POSThttps://api.formbase.so/api/v1
Parámetros16
formIdstringrequired

El formulario publicado a asignar.

recipientobjectoptional

{ email?, name? }. Un correo es obligatorio cuando delivery es “email”; en caso contrario solo identifica a la persona en la página de Solicitudes y en sus respuestas.

prefillobjectoptional

Respuestas iniciales por clave de campo. El destinatario las ve y puede cambiarlas.

readonlystring[]optional

Claves precompletadas que el destinatario no puede cambiar. Cada clave aquí también debe aparecer en prefill, y un campo obligatorio bloqueado debe estar precompletado con un valor no vacío.

contextobjectoptional

Valores para los campos ocultos del formulario, por clave de campo. De confianza, inmutables, y devueltos en el callback. Una clave desconocida se rechaza con UNKNOWN_FIELD_KEY.

metadataobjectoptional

Tu propia contabilidad. Nunca llega al formulario; vuelve en los callbacks y las lecturas.

languagestringoptional

Uno de los idiomas publicados del formulario. Por defecto, el idioma predeterminado del formulario.

deliverystringoptionaldefault: none

“email” para que formbase envíe la invitación (necesita un correo del destinatario, y Pro o Business o una de las 10 invitaciones gratis de una cuenta Free), o “none” para entregar tú mismo el enlace.

remindersstring[]optional

Anula el calendario de recordatorios del formulario para esta solicitud. Un array vacío desactiva los recordatorios.

expiresAtnumberoptional

Milisegundos desde epoch. Por defecto, 30 días; 365 días es el máximo.

callbackUrlstringoptional

Adónde envía formbase el callback en POST cuando la solicitud termina. Solo HTTPS, y el host debe resolver a una dirección pública.

externalIdstringoptional

Tu propio id para esta solicitud. Filtrable en requests.list.

idempotencyKeystringoptional

Repetirla con el mismo cuerpo devuelve la solicitud original con deduplicated: true. Un cuerpo distinto se rechaza. Las claves viven 30 días.

domainIdstringoptional

Genera el enlace en uno de tus dominios personalizados. Solo en la API REST.

documentsobject[]optional

[{ documentId, field?, name? }] — archivos entregados a este destinatario, subidos antes con documents.create.

testbooleanoptionaldefault: false

Un ensayo: no se envía nada por correo, el callback lleva “test”: true, y el envío no cuenta en ningún sitio. El enlace se cierra en un plazo de 24 horas, y en Free un workspace puede crear 10 solicitudes de prueba al día.

bash
curl -X POST https://api.formbase.so/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "requests.create",
    "params": {
      "formId": "j57...",
      "recipient": { "email": "ada@acme.com", "name": "Ada" },
      "prefill": { "company_name": "Acme" },
      "readonly": ["company_name"],
      "context": { "case_id": "CASE-9" },
      "delivery": "email",
      "externalId": "run-42",
      "callbackUrl": "https://automation.example/webhook/resume-abc",
      "idempotencyKey": "run-42"
    }
  }'
200Éxito
json
{
  "ok": true,
  "data": {
    "id": "kd7...",
    "status": "pending",
    "url": "https://form.formbase.so/r/rq_...",
    "deliveryStatus": "queued",
    "expiresAt": 1794787200000,
    "createdAt": 1789379200000,
    "externalId": "run-42",
    "deduplicated": false
  }
}

deliveryStatus es not_requested hasta que se pone en cola una invitación, luego queued → sent o failed, y bounced en cuanto el proveedor de correo reporta un rebote definitivo o una queja.

400Clave de campo desconocida, forma de valor incorrecta, o una clave bloqueada sin precompletar
400Formulario no publicado (FORM_NOT_PUBLISHED), o callbackUrl no permitida (CALLBACK_URL_NOT_ALLOWED)
402Cupo mensual agotado (MONTHLY_ALLOWANCE_REACHED), invitaciones gratis agotadas (FREE_INVITATIONS_USED), o recordatorios por debajo de Pro
404Formulario no encontrado
409Clave de idempotencia reutilizada con un cuerpo distinto (IDEMPOTENCY_CONFLICT)
429Más de 60 llamadas a requests.create en un minuto con este token, o la solicitud de prueba número 11 del día de un workspace Free (TEST_REQUEST_LIMIT_REACHED)

requests.get

Obtén una solicitud completa: estado, resultado, lo que se precompletó, su cronología y — una vez completada — answers y

display indexados por clave de campo, los mismos dos mapas que lleva el callback.

POSThttps://api.formbase.so/api/v1
Parámetros1
requestIdstringrequired

ID de la solicitud.

200Éxito
json
{
  "ok": true,
  "data": {
    "id": "kd7...",
    "formId": "j57...",
    "status": "completed",
    "outcome": "approve",
    "isTest": false,
    "recipient": { "email": "ada@acme.com", "name": "Ada" },
    "language": "en",
    "externalId": "run-42",
    "metadata": null,
    "context": { "case_id": "CASE-9" },
    "prefill": { "company_name": "Acme" },
    "readonlyKeys": ["company_name"],
    "delivery": "email",
    "deliveryStatus": "sent",
    "hasCallback": true,
    "callbackFailedAt": null,
    "submissionId": "kp2...",
    "url": "https://form.formbase.so/r/rq_...",
    "answers": { "company_name": "Acme", "decision": "approve" },
    "display": { "company_name": "Acme", "decision": "Approve" },
    "timeline": [
      { "id": "kd7...:created", "type": "created", "at": 1789379200000 },
      { "id": "kd7...:completed", "type": "completed", "at": 1789465600000 }
    ],
    "expiresAt": 1794787200000,
    "completedAt": 1789465600000
  }
}

outcome frente a status

status dice si la solicitud terminó; outcome dice qué decidió el destinatario — approve, decline, changes, o null en cualquier caso que no sea una solicitud completada cuyo destinatario eligió una de las tres — incluido un formulario sin pregunta de decisión. La URL del callback nunca se devuelve; hasCallback solo dice si hay una configurada.

El ejemplo anterior está recortado. Una respuesta completa también lleva workspaceId, formSnapshotId, createdVia, documents, reminderStep, remindersSent, reminderDueAt, dataPurgedAt, y el resto de las marcas de tiempo (updatedAt, openedAt, startedAt, lastActivityAt, expiredAt, canceledAt, canceledBy, cancelReason).

Dos campos te dicen cuándo la copia que tienes delante es la única copia. callbackFailedAt está establecido mientras el callback de esta solicitud se ha quedado sin intentos, y se limpia en cuanto uno llega o lo repites. dataPurgedAt se establece una vez que la retención elimina la solicitud: context, prefill y metadata vuelven vacíos, readonlyKeys y documents son [], y submissionId, answers y display son null.

timeline se deriva, del más antiguo al más reciente. Cada entrada tiene un id, un at, y un type — created, invitation, reminder, opened, started, completed, expired, canceled, callback. Las entradas de entrega añaden deliveryStatus y attemptCount, y los callbacks añaden eventType. Las filas de entrega se conservan 30 días, así que las cronologías más antiguas se reducen a las marcas de tiempo.

404Solicitud no encontrada (REQUEST_NOT_FOUND)

requests.list

Lista las solicitudes de un espacio de trabajo o de un formulario, las más recientes primero. Las solicitudes de prueba se omiten a menos que las pidas.

POSThttps://api.formbase.so/api/v1
Parámetros8
workspaceIdstringoptional

Limita a un espacio de trabajo. Da esto o formId.

formIdstringoptional

Limita a un formulario.

statusstringoptional

pending, completed, expired, o canceled.

outcomestringoptional

approve, decline, o changes. Implica solo solicitudes completadas.

externalIdstringoptional

Tu propio id, para encontrar la solicitud que creó una ejecución.

includeTestbooleanoptionaldefault: false

Incluye las solicitudes creadas con test: true.

limitnumberoptionaldefault: 25

Tamaño de página (1–100).

cursorstringoptional

Cursor de paginación de una respuesta anterior.

200Éxito
json
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "kd7...",
        "formId": "j57...",
        "status": "pending",
        "outcome": null,
        "recipient": { "email": "ada@acme.com", "name": "Ada" },
        "externalId": "run-42",
        "deliveryStatus": "sent",
        "expiresAt": 1794787200000,
        "createdAt": 1789379200000
      }
    ],
    "nextCursor": null,
    "hasMore": false
  }
}

Los elementos de la lista llevan los mismos campos que requests.get salvo url, answers, display y timeline, y cada uno lleva isTest. Da workspaceId o formId — no dar ninguno es 400 VALIDATION_ERROR con motivo SCOPE_REQUIRED. outcome tiene prioridad sobre status, ya que solo una solicitud completada tiene un veredicto.

requests.cancel

Retira una solicitud pendiente. El enlace deja de funcionar, el destinatario ve un aviso de retirada, y se dispara un callback request.canceled.

POSThttps://api.formbase.so/api/v1
Parámetros2
requestIdstringrequired

ID de la solicitud.

reasonstringoptional

Tu nota sobre el motivo, guardada en la solicitud y enviada en el callback.

200La solicitud cancelada
409Ya completada, expirada o cancelada (REQUEST_NOT_PENDING)

requests.remind

Envía un correo al destinatario ahora, sin tocar el calendario de recordatorios. Necesita un correo del destinatario y un plan Pro o Business.

POSThttps://api.formbase.so/api/v1
Parámetros1
requestIdstringrequired

ID de la solicitud. Debe seguir pendiente, y no ser una solicitud de prueba.

Se aplican dos límites: al menos 10 minutos entre recordatorios manuales, y como máximo 8 recordatorios por solicitud en total, manuales y programados juntos. El calendario automático no se toca — reminderStep y reminderDueAt quedan como estaban.

200La solicitud, con remindersSent incrementado
400La solicitud no tiene correo del destinatario (RECIPIENT_EMAIL_REQUIRED)
402Los recordatorios de solicitud requieren Pro o Business (UPGRADE_REQUIRED)
409No está pendiente (REQUEST_NOT_PENDING), demasiado pronto (REMINDER_TOO_SOON, con details.retryAfterMs), límite alcanzado (REMINDER_CAP_REACHED), o es una solicitud de prueba (TEST_REQUEST)

requests.replayCallback

Reenvía el callback que disparó una solicitud al terminar — mismo payload, mismo id de evento, para que un receptor que ya lo procesó pueda deduplicarlo. Úsalo tras arreglar un endpoint que fallaba.

POSThttps://api.formbase.so/api/v1
Parámetros1
requestIdstringrequired

ID de la solicitud. Debe estar completada, expirada o cancelada.

200Éxito
json
{
  "ok": true,
  "data": { "dispatchId": "kf9...", "eventId": "evt_kf9..." }
}
409Todavía pendiente, así que no hay callback terminal que reenviar (REQUEST_NOT_TERMINAL)
409La solicitud se creó sin callbackUrl (NO_CALLBACK_TO_REPLAY)

requests.sample

Construye un evento de solicitud de muestra para un formulario, sin ninguna solicitud real. Es exactamente el envoltorio que recibe una suscripción a request_* creada con webhooks.create, así que los conectores lo usan para descubrir campos. Una muestra completada lleva las mismas respuestas de ejemplo que muestra

submissions.sample; una muestra expirada o cancelada lleva solo el bloque request.

POSThttps://api.formbase.so/api/v1
Parámetros2
formIdstringrequired

ID del formulario.

eventTypestringrequired

Qué final muestrear, en la grafía de webhooks.create. El type del envoltorio es la forma con puntos.

request_completedrequest_expiredrequest_canceled
200Muestra generada
json
{
  "ok": true,
  "data": {
    "id": "evt_example000000000000",
    "type": "request.completed",
    "createdAt": "2026-05-18T19:00:00.000Z",
    "apiVersion": "2026-09-24",
    "test": true,
    "data": {
      "request": {
        "id": "req_example000000000000",
        "externalId": "order-1234",
        "status": "completed",
        "language": "en",
        "recipient": { "email": "recipient@example.com", "name": "Sample Recipient" },
        "metadata": { "source": "sample" },
        "context": {},
        "createdAt": "2026-05-18T18:00:00.000Z",
        "completedAt": "2026-05-18T19:00:00.000Z"
      },
      "form": { "id": "frm_abc123", "name": "Event Feedback", "snapshotId": "js7abc123" },
      "submission": {
        "id": "sub_example000000000000",
        "respondentEmail": "respondent@example.com",
        "submittedAt": "2026-05-18T19:00:00.000Z",
        "updatedAt": null,
        "editCount": 0,
        "pdfUrl": null,
        "language": "en"
      },
      "answers": { "your_email": "john@example.com" },
      "display": { "your_email": "john@example.com" }
    }
  }
}

El bloque request y el resultado están documentados en la página de callbacks; la mitad de la respuesta en la referencia de webhooks. Los ids de muestra son los marcadores fijos que se muestran arriba y test es true, así que un receptor puede distinguir una muestra de un evento real.

documents.create

Reserva una subida para un archivo que entregarás a un destinatario a través del bloque de Documentos del formulario. Los bytes nunca pasan por esta API: obtienes un PUT prefirmado, subes el archivo, y requests.create verifica el objeto antes de que la solicitud exista.

POSThttps://api.formbase.so/api/v1
Parámetros5
formIdstringrequired

El formulario cuyo bloque de Documentos mostrará el archivo. Limita la subida a ese espacio de trabajo.

namestringrequired

Nombre visible que ve el destinatario (1–200 caracteres). Se puede anular por solicitud.

contentTypestringrequired

application/pdf o un tipo de imagen: image/png, image/jpeg, image/webp, image/gif, image/svg+xml, image/avif, image/bmp, image/tiff. No se aceptan documentos de Office.

sizenumberrequired

Longitud exacta en bytes. Máximo 25 MB (26.214.400).

sha256stringoptional

Digest hexadecimal de los bytes. Se verifica después de subir el archivo, cuando se proporciona.

200Subida reservada
json
{
  "ok": true,
  "data": {
    "id": "kn7...",
    "name": "Lease contract draft",
    "contentType": "application/pdf",
    "size": 412000,
    "uploadUrl": "https://...",
    "expiresAt": 1792198800000
  }
}

Haz un PUT de los bytes en bruto a uploadUrl antes de que pase una hora, con Content-Type ajustado al tipo que declaraste, y luego referencia el id desde requests.create:

json
{
  "method": "requests.create",
  "params": {
    "formId": "j57...",
    "documents": [
      { "documentId": "kn7...", "name": "Your lease contract" },
      { "documentId": "kn8...", "field": "attachments" }
    ]
  }
}
  • field es la clave de campo del bloque de Documentos. Opcional cuando el formulario tiene exactamente un bloque; obligatorio con dos o más.

  • Los documentos de autor del bloque permanecen; los tuyos aparecen debajo de ellos, solo para este destinatario.
  • Límites: 25 MB por documento, 100 MB de documentos por solicitud, 20 documentos mostrados por bloque incluyendo los de autor.
  • Una subida puede ser referenciada por cualquier número de solicitudes. Una subida que nadie referencia caduca. Los bytes cuentan contra el almacenamiento del propietario del espacio de trabajo hasta que la retención elimina la última solicitud que los referencia.

Todo fallo aquí es 400 VALIDATION_ERROR con un details.reason: DOCUMENT_TYPE_NOT_ALLOWED, DOCUMENT_TOO_LARGE, INVALID_DOCUMENT_NAME o INVALID_DOCUMENT_SHA256 de este método, y DOCUMENT_NOT_FOUND, DOCUMENT_NOT_UPLOADED (te saltaste el PUT), DOCUMENT_INVALID, INVALID_DOCUMENT_TARGET, DOCUMENTS_TOO_LARGE o DOCUMENTS_TOO_MANY de requests.create.

Webhooks

webhooks.list

Lista las suscripciones de webhook de un formulario.

POSThttps://api.formbase.so/api/v1
Parámetros1
formIdstringrequired

ID del formulario.

200Éxito
json
{
  "ok": true,
  "data": {
    "items": [
      {
        "subscriptionId": "int_abc123",
        "formId": "frm_abc123",
        "provider": "zapier",
        "targetUrl": "https://hooks.zapier.com/...",
        "eventType": "submission_created",
        "status": "active",
        "createdAt": 1714041851000
      }
    ],
    "hasMore": false
  }
}

webhooks.create

Suscribe una URL a eventos del formulario: respuestas nuevas o abandonadas, o solicitudes del formulario al terminar. La URL debe usar HTTPS.

POSThttps://api.formbase.so/api/v1
Parámetros6
formIdstringrequired

ID del formulario.

targetUrlstringrequired

URL HTTPS para recibir los payloads del webhook.

providerstringrequired

A qué herramienta pertenece la suscripción. Es una etiqueta para tu propia contabilidad — no hay ninguna app de marketplace que instalar, y todos los proveedores se comportan igual.

zapiermaken8n
eventTypestringoptionaldefault: submission_created

Tipo de evento al que suscribirse. Los tres tipos submission_ entregan el payload de la respuesta: submission_created una primera respuesta, submission_updated una edición del respondente, y submission_abandoned un borrador inactivo. Los tres tipos request_ entregan el evento de solicitud correspondiente cada vez que una solicitud del formulario termina de ese modo, firmado con el secreto de esta suscripción; las solicitudes de prueba no llegan a ninguna suscripción.

submission_createdsubmission_updatedsubmission_abandonedrequest_completedrequest_expiredrequest_canceled
idleWindowstringoptional

Obligatorio cuando eventType es submission_abandoned; rechazado para cualquier otro tipo.

12h1d3d1w
signingSecretstringoptional

Secreto de firma HMAC opcional, 32–255 caracteres. Cuando se proporciona, las entregas incluyen X-formbase-Signature. El secreto se guarda pero la API nunca lo devuelve.

bash
curl -X POST https://api.formbase.so/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "webhooks.create",
    "params": {
      "formId": "frm_abc123",
      "targetUrl": "https://hooks.zapier.com/hooks/catch/...",
      "provider": "zapier",
      "eventType": "submission_created",
      "signingSecret": "whsec_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
    }
  }'
200Webhook creado
json
{
  "ok": true,
  "data": {
    "subscriptionId": "int_new123",
    "formId": "frm_abc123",
    "provider": "zapier",
    "targetUrl": "https://hooks.zapier.com/hooks/catch/...",
    "eventType": "submission_created"
  }
}

Las suscripciones de respuestas abandonadas devuelven el idleWindow elegido tanto en webhooks.create como en webhooks.list. Cualquier otra suscripción lo omite.

Una suscripción de solicitudes escucha los mismos eventos que un callback, pero como su propia entrega: su propio id de evento, su propia firma y su propio presupuesto de cinco reintentos, tras el cual la suscripción se pausa. Una solicitud creada con callbackUrl en un formulario con una suscripción request_completed se dispara entonces dos veces, una a cada receptor. requests.replayCallback reenvía solo el callback. Usa requests.sample para ver el payload antes de que ninguna solicitud haya terminado.

webhooks.delete

Elimina una suscripción de webhook.

POSThttps://api.formbase.so/api/v1
Parámetros1
subscriptionIdstringrequired

ID de suscripción de webhooks.list o webhooks.create.

200Webhook eliminado
json
{
  "ok": true,
  "data": {
    "subscriptionId": "int_abc123",
    "deleted": true
  }
}

Analíticas

analytics.get

Obtiene métricas de analíticas agregadas de un formulario. Admite filtros por rango de fechas, dispositivo, fuente de tráfico y país.

Las analíticas son una función Pro, y la regla sigue el plan del propietario del espacio de trabajo, igual que la pestaña Analíticas del panel. Si el propietario no tiene Pro, la llamada devuelve UPGRADE_REQUIRED — también para el historial registrado cuando sí lo tenía. Un miembro Free en el espacio de un propietario Pro sí recibe los datos.

POSThttps://api.formbase.so/api/v1
Parámetros7
formIdstringrequired

ID del formulario.

fromnumberoptional

Inicio del rango de fechas como marca de tiempo Unix en milisegundos. Debe ser menor o igual que to cuando ambos están establecidos.

tonumberoptional

Fin del rango de fechas como marca de tiempo Unix en milisegundos. Omite ambos para todo el historial — period vuelve entonces como { "from": null, "to": null }.

devicestringoptionaldefault: all

Filtrar por tipo de dispositivo.

alldesktopmobiletablet
trafficSourcestringoptional

Filtrar por fuente de tráfico (p. ej. “Direct”, “Google”).

countrystringoptional

Filtrar por código de país de 2 letras (p. ej. “US”, “DE”).

includeEventsbooleanoptionaldefault: false

Devuelve también los eventos de analíticas anonimizados detrás de las métricas, para tu propio análisis. Sin ids de visitante.

Las tasas son números de 0 a 100, los recuentos son enteros, y totalEvents es el número de filas de eventos en bruto antes de la deduplicación en visitantes únicos.

200Éxito
json
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "period": { "from": null, "to": null },
    "totalEvents": 17,
    "metrics": {
      "views": 7,
      "uniqueVisitors": 7,
      "engaged": 6,
      "submissions": 4,
      "engagementRate": 86,
      "completionRate": 57,
      "bounceRate": 14
    },
    "breakdown": {
      "byBrowser": { "Chrome": 17 },
      "byCountry": { "US": 10, "DE": 7 },
      "byDevice": { "desktop": 14, "mobile": 3 },
      "bySource": { "Direct": 12, "Google": 5 }
    }
  }
}

Espacios de trabajo

workspaces.list

Lista los espacios de trabajo a los que puede acceder tu token. Sin parámetros.

Un token de API está vinculado a un espacio de trabajo, así que esto devuelve exactamente ese — incluso si tu cuenta pertenece a varios.

POSThttps://api.formbase.so/api/v1
Parámetros0
200Éxito
json
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "ws_abc123",
        "name": "Acme Inc",
        "createdAt": 1714041800000,
        "role": "owner"
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}

workspaces.createInvite

Crea un enlace de invitación para un espacio de trabajo.

POSThttps://api.formbase.so/api/v1
Parámetros3
workspaceIdstringrequired

ID del espacio de trabajo.

expiresAtnumberoptional

Vencimiento como marca de tiempo Unix futura en milisegundos.

maxUsesnumberoptional

Número máximo de veces que se puede usar la invitación.

200Invitación creada
json
{
  "ok": true,
  "data": {
    "id": "inv_abc123",
    "workspaceId": "ws_abc123",
    "code": "aBcDeFgH",
    "expiresAt": null,
    "maxUses": null,
    "uses": 0,
    "createdAt": 1714041851000
  }
}

workspaces.getInvite

Obtiene una invitación a un espacio de trabajo. Devuelve la misma forma que workspaces.createInvite.

POSThttps://api.formbase.so/api/v1
Parámetros1
inviteIdstringrequired

ID de la invitación.

404Invitación no encontrada

workspaces.updateInvite

Actualiza una invitación existente a un espacio de trabajo. Proporciona al menos uno de expiresAt o maxUses, o la llamada se rechaza. Devuelve la invitación actualizada.

POSThttps://api.formbase.so/api/v1
Parámetros3
inviteIdstringrequired

ID de la invitación.

expiresAtnumberoptional

Nueva marca de tiempo de vencimiento en milisegundos.

maxUsesnumberoptional

Nuevo límite de usos máximos.

workspaces.revokeInvite

Revoca permanentemente una invitación a un espacio de trabajo.

POSThttps://api.formbase.so/api/v1
Parámetros1
inviteIdstringrequired

ID de la invitación.

200Invitación revocada
json
{
  "ok": true,
  "data": {
    "inviteId": "inv_abc123",
    "revoked": true
  }
}

Carpetas

folders.list

Lista las carpetas de un espacio de trabajo.

POSThttps://api.formbase.so/api/v1
Parámetros3
workspaceIdstringrequired

ID del espacio de trabajo.

limitnumberoptionaldefault: 20

Tamaño de página (1–100).

cursorstringoptional

Cursor de paginación.

200Éxito
json
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "fld_abc123",
        "name": "Customer Feedback",
        "workspaceId": "ws_abc123",
        "parentId": null,
        "createdAt": 1714041800000
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}

folders.create

Crea una carpeta en un espacio de trabajo. Es idempotente: devuelve la carpeta existente si ya existe una con el mismo nombre.

POSThttps://api.formbase.so/api/v1
Parámetros3
workspaceIdstringrequired

ID del espacio de trabajo.

namestringrequired

Nombre de la carpeta (1–255 caracteres).

parentIdstring | nulloptional

ID de la carpeta padre para anidar. Omite para el nivel raíz.

200Carpeta creada
json
{
  "ok": true,
  "data": {
    "id": "fld_new123",
    "name": "Customer Feedback",
    "workspaceId": "ws_abc123",
    "parentId": null,
    "createdAt": 1714041851000,
    "alreadyExisted": false
  }
}

folders.update

Renombra una carpeta o la mueve a un padre diferente.

POSThttps://api.formbase.so/api/v1
Parámetros3
folderIdstringrequired

ID de la carpeta.

namestringoptional

Nuevo nombre de la carpeta (1–255 caracteres).

parentIdstring | nulloptional

Nueva carpeta padre. Pasa null para moverla a la raíz.

folders.delete

Elimina permanentemente una carpeta y todo su contenido (subcarpetas y formularios).

POSThttps://api.formbase.so/api/v1
Parámetros1
folderIdstringrequired

ID de la carpeta.

200Carpeta eliminada
json
{
  "ok": true,
  "data": {
    "folderId": "fld_abc123",
    "deletedFolderIds": ["fld_abc123"],
    "deletedFormIds": ["frm_in_folder"],
    "message": "Folder and 1 form deleted."
  }
}

Traducciones

translations.listLanguages

Lista todos los idiomas configurados en un formulario.

POSThttps://api.formbase.so/api/v1
Parámetros1
formIdstringrequired

ID del formulario.

200Éxito
json
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "items": [
      {
        "language": "es",
        "completion": { "total": 15, "current": 12, "outdated": 2, "missing": 1, "suggested": 0 },
        "lastUpdatedAt": 1714041851000
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}

translations.addLanguage

Registra un idioma en un formulario. Cualquier otro método de traducción falla con 404 NOT_FOUND hasta que lo hagas.

POSThttps://api.formbase.so/api/v1
Parámetros2
formIdstringrequired

ID del formulario.

languagestringrequired

Etiqueta de idioma BCP-47 (p. ej. “es”, “pt-BR”).

200Idioma agregado
json
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "language": "es",
    "rowId": "tl_new123"
  }
}

translations.removeLanguage

Elimina un idioma y todas sus traducciones de un formulario.

POSThttps://api.formbase.so/api/v1
Parámetros2
formIdstringrequired

ID del formulario.

languagestringrequired

Etiqueta de idioma BCP-47.

translations.listEntries

Lista cada clave de origen para un idioma en un formulario, con su estado actual. Así es como descubres los valores de key que acepta translations.setEntry.

POSThttps://api.formbase.so/api/v1
Parámetros2
formIdstringrequired

ID del formulario.

languagestringrequired

Etiqueta de idioma BCP-47. Debe estar ya en el formulario.

200Success
json
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "language": "es",
    "completion": { "total": 15, "current": 12, "outdated": 2, "missing": 1, "suggested": 0 },
    "items": [
      {
        "key": "block_q_1.title",
        "status": "current",
        "value": "[{\"text\":\"Tu correo electrónico\"}]",
        "sourceFragment": "[{\"text\":\"Your email\"}]",
        "updatedAt": 1714041851000,
        "block": { "id": "q_1", "type": "email-input", "label": "Your email" }
      }
    ],
    "hasMore": false
  }
}

status es missing (nada guardado), current, outdated (el origen cambió desde entonces), o suggested (una sugerencia de IA preparada pero no aceptada). Las claves cubren el contenido del formulario ( block_<id>.) y, una vez que un autor las ha personalizado, los correos de confirmación y recordatorio del respondente (email.confirmation., email.reminder.*).

translations.setEntry

Establece una entrada de traducción individual. El idioma debe haberse agregado previamente con translations.addLanguage.

POSThttps://api.formbase.so/api/v1
Parámetros4
formIdstringrequired

ID del formulario.

languagestringrequired

Etiqueta de idioma BCP-47.

keystringrequired

Una clave de translations.listEntries. No la construyas a mano.

valuestringrequired

El fragmento traducido, en formato JSON-string. Su estructura de marcas debe coincidir con la del fragmento de origen.

bash
curl -X POST https://api.formbase.so/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "translations.setEntry",
    "params": {
      "formId": "frm_abc123",
      "language": "es",
      "key": "block_q_1.title",
      "value": "[{\"text\":\"Tu correo electrónico\"}]"
    }
  }'

Devuelve { formId, language, key }.

translations.deleteEntry

Elimina una entrada de traducción individual, revirtiendo esa clave al idioma predeterminado del formulario. Idempotente. Cuando desaparece la última entrada de un idioma, ese idioma deja de figurar entre los idiomas publicados del formulario.

POSThttps://api.formbase.so/api/v1
Parámetros3
formIdstringrequired

ID del formulario.

languagestringrequired

Etiqueta de idioma BCP-47.

keystringrequired

Clave de traducción a eliminar.

Cuenta

me.get

Obtiene información sobre el usuario autenticado.

POSThttps://api.formbase.so/api/v1
Parámetros0
200Éxito
json
{
  "ok": true,
  "data": {
    "id": "usr_abc123",
    "email": "you@example.com",
    "name": "Jane Doe"
  }
}

Meta

methods.list

Lista, ordenados, todos los nombres de métodos que sirve este despliegue. La respuesta autorizada cuando esta página y el servidor no coinciden.

POSThttps://api.formbase.so/api/v1
Parámetros0
200Éxito
json
{
  "ok": true,
  "data": {
    "methods": [
      "methods.list",
      "analytics.get",
      "folders.create",
      "folders.delete",
      "folders.list",
      "folders.update",
      "formSettings.get",
      "formSettings.update",
      "forms.create",
      "forms.delete",
      "forms.get",
      "forms.list",
      "..."
    ]
  }
}

Referencia de errores

Cada respuesta de error tiene la misma forma. El conjunto de code de nivel superior es cerrado a propósito: un nuevo modo de fallo nunca añade un código, añade un reason. Decide según code para el resultado a nivel HTTP y según details.reason para la solución.

error response
json
{
  "ok": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "No field with key \"company\" on this form.",
    "details": { "reason": "UNKNOWN_FIELD_KEY", "field": "prefill.company", "validKeys": ["company_name", "contacts"] }
  }
}

details está presente siempre que el servidor pueda nombrar la causa. Además de reason, puede llevar field (el parámetro causante, con puntos para el anidamiento), validKeys, validValues (los values de opción que acepta una pregunta de elección), expectedType, feature (en UPGRADE_REQUIRED), y retryAfterMs (en una llamada limitada). Los motivos de la superficie de solicitudes se listan junto a cada método más arriba.

Estos son todos los códigos:

Códigos de error
VALIDATION_ERROR400optional

Parámetros inválidos o ausentes en la solicitud.

UNAUTHORIZED401optional

Token de API ausente o inválido.

FORBIDDEN403optional

El token no tiene acceso al recurso solicitado.

NOT_FOUND404optional

El recurso no existe.

METHOD_NOT_FOUND404optional

Nombre de método desconocido. Usa methods.list para ver los métodos disponibles.

CONFLICT409optional

El recurso no está en un estado que permita esta llamada — una solicitud que ya no está pendiente, una clave de idempotencia reutilizada con un cuerpo distinto.

RATE_LIMITED429optional

Más de 120 llamadas por minuto con este token, más de 60 llamadas a requests.create por minuto, o demasiadas autenticaciones fallidas desde esta IP.

UPGRADE_REQUIRED402optional

La función requiere un nivel de suscripción superior, el espacio de trabajo ha gastado su asignación mensual (motivo MONTHLY_ALLOWANCE_REACHED), o una cuenta Free ha gastado sus 10 invitaciones gratis (motivo FREE_INVITATIONS_USED).

INTERNAL_ERROR500optional

Error inesperado del servidor. Inténtalo de nuevo más tarde.

Próximos pasos