Skip to content

Endpoints — API de Zelta Forms

Base URL: https://api.zelta.dev/v1/forms

Todos los endpoints requieren autenticación mediante token Bearer. Consulta la para obtener tu token.

Formularios

Listar formularios

http
GET /forms

Parámetros de consulta:

ParámetroTipoDescripción
pageintegerNúmero de página (default: 1)
per_pageintegerResultados por página (default: 25, max: 100)
statusstringdraft, published, closed
searchstringBuscar por nombre del formulario
sort_bystringcreated_at, name, responses_count

Ejemplo:

bash
curl -X GET "https://api.zelta.dev/v1/forms?status=published&per_page=10" \
  -H "Authorization: Bearer {token}"

Respuesta:

json
{
  "data": [
    {
      "id": "form_abc123",
      "name": "Encuesta de satisfacción Q1",
      "status": "published",
      "responses_count": 142,
      "fields_count": 8,
      "created_at": "2026-01-10T09:00:00Z",
      "published_at": "2026-01-12T10:30:00Z",
      "url": "https://forms.zelta.dev/f/abc123"
    }
  ],
  "meta": {
    "current_page": 1,
    "total_pages": 3,
    "total_count": 27
  }
}

Crear formulario

http
POST /forms

Cuerpo de la petición:

json
{
  "name": "Formulario de contacto",
  "description": "Formulario para recibir consultas de clientes",
  "status": "draft",
  "theme": "moderno",
  "settings": {
    "show_progress": true,
    "allow_save_draft": false,
    "limit_responses": null,
    "close_date": null
  }
}

Scope requerido: forms:write

Obtener formulario

http
GET /forms/{form_id}

Actualizar formulario

http
PATCH /forms/{form_id}

Eliminar formulario

http
DELETE /forms/{form_id}

Scope requerido: forms:admin

Atención

Eliminar un formulario también elimina todas sus respuestas de forma permanente. Considera cerrar el formulario en lugar de eliminarlo para conservar los datos.

Publicar formulario

http
POST /forms/{form_id}/publish

Cerrar formulario

http
POST /forms/{form_id}/close

Respuestas (Submissions)

Listar respuestas de un formulario

http
GET /forms/{form_id}/submissions

Parámetros de consulta:

ParámetroTipoDescripción
pageintegerNúmero de página
per_pageintegerResultados por página
statusstringcomplete, partial, in_progress
fromdateFecha de inicio (ISO 8601)
todateFecha de fin (ISO 8601)
sort_bystringsubmitted_at, completion_time

Ejemplo:

bash
curl -X GET "https://api.zelta.dev/v1/forms/form_abc123/submissions?status=complete" \
  -H "Authorization: Bearer {token}"

Respuesta:

json
{
  "data": [
    {
      "id": "sub_xyz789",
      "form_id": "form_abc123",
      "status": "complete",
      "data": {
        "nombre": "María García",
        "email": "maria@empresa.com",
        "calificacion": 5,
        "comentarios": "Muy buen servicio."
      },
      "metadata": {
        "submitted_at": "2026-03-10T14:30:00Z",
        "completion_time_seconds": 180,
        "device": "mobile",
        "source": "direct_link"
      }
    }
  ],
  "meta": {
    "current_page": 1,
    "total_pages": 15,
    "total_count": 142
  }
}

Obtener una respuesta

http
GET /forms/{form_id}/submissions/{submission_id}

Crear una respuesta (programática)

http
POST /forms/{form_id}/submissions
json
{
  "data": {
    "nombre": "Carlos López",
    "email": "carlos@ejemplo.com",
    "calificacion": 4,
    "comentarios": "Buen producto, con margen de mejora."
  }
}

Eliminar una respuesta

http
DELETE /forms/{form_id}/submissions/{submission_id}

Scope requerido: forms:admin


Campos (Fields)

Listar campos de un formulario

http
GET /forms/{form_id}/fields

Respuesta:

json
{
  "data": [
    {
      "id": "field_001",
      "type": "text_short",
      "label": "Nombre completo",
      "required": true,
      "position": 1,
      "validations": {
        "min_length": 2,
        "max_length": 100
      }
    },
    {
      "id": "field_002",
      "type": "email",
      "label": "Correo electrónico",
      "required": true,
      "position": 2,
      "validations": {}
    },
    {
      "id": "field_003",
      "type": "rating",
      "label": "Calificación del servicio",
      "required": true,
      "position": 3,
      "validations": {
        "min": 1,
        "max": 5
      }
    }
  ]
}

Agregar campo

http
POST /forms/{form_id}/fields
json
{
  "type": "select",
  "label": "¿Cómo nos conociste?",
  "required": false,
  "position": 4,
  "options": [
    "Redes sociales",
    "Recomendación",
    "Búsqueda en Google",
    "Otro"
  ]
}

Actualizar campo

http
PATCH /forms/{form_id}/fields/{field_id}

Eliminar campo

http
DELETE /forms/{form_id}/fields/{field_id}

Códigos de respuesta

CódigoDescripción
200Solicitud exitosa
201Recurso creado exitosamente
204Recurso eliminado exitosamente
400Solicitud mal formada
401No autenticado
403Sin permisos suficientes
404Recurso no encontrado
422Error de validación
429Límite de tasa excedido
500Error interno del servidor

Paginación

Todos los endpoints de listado soportan paginación. Usa los campos meta.current_page y meta.total_pages para navegar entre páginas.

Documentación oficial de Zelta