Formularios
Formularios públicos personalizables con respuestas y datos de contacto
curl https://app.getplea.com/api/forms \
-H "Authorization: Bearer TOKEN" \
-H "x-organization-id: ORG_ID"
const forms = await fetch('/api/forms', {
headers: {
'Authorization': 'Bearer TOKEN',
'x-organization-id': 'ORG_ID'
}
}).then(r => r.json());
[
{
"id": "form-uuid-1",
"title": "Formulario de contacto",
"slug": "contacto",
"isActive": true,
"responsesCount": 28,
"publicUrl": "https://app.getplea.com/f/contacto",
"createdAt": "2026-01-10T09:00:00Z"
},
{
"id": "form-uuid-2",
"title": "Consulta laboral",
"slug": "consulta-laboral",
"isActive": true,
"responsesCount": 12,
"publicUrl": "https://app.getplea.com/f/consulta-laboral",
"createdAt": "2026-02-01T10:00:00Z"
}
]
curl https://app.getplea.com/api/forms/form-uuid-1 \
-H "Authorization: Bearer TOKEN" \
-H "x-organization-id: ORG_ID"
const form = await fetch('/api/forms/form-uuid-1', {
headers: {
'Authorization': 'Bearer TOKEN',
'x-organization-id': 'ORG_ID'
}
}).then(r => r.json());
{
"id": "form-uuid-1",
"title": "Formulario de contacto",
"description": "Complete el formulario y nos pondremos en contacto en 24h",
"slug": "contacto",
"isActive": true,
"fields": [
{"id": "f1", "type": "text", "label": "Nombre completo", "required": true},
{"id": "f2", "type": "email", "label": "Email", "required": true},
{"id": "f3", "type": "phone", "label": "Teléfono", "required": false},
{"id": "f4", "type": "select", "label": "Tipo de consulta", "required": true, "options": ["Civil", "Laboral", "Penal", "Mercantil", "Otro"]},
{"id": "f5", "type": "textarea", "label": "Descripción del caso", "required": true}
],
"settings": {
"submitButtonText": "Enviar consulta",
"successMessage": "Gracias por su consulta. Le contactaremos en breve.",
"notifyEmail": "info@despacho.com",
"createClient": true
}
}
curl -X POST https://app.getplea.com/api/forms \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-H "x-organization-id: ORG_ID" \
-d '{
"title": "Solicitud de presupuesto",
"slug": "presupuesto",
"fields": [
{"type": "text", "label": "Nombre", "required": true},
{"type": "email", "label": "Email", "required": true},
{"type": "textarea", "label": "Describa su caso", "required": true}
],
"settings": {
"submitButtonText": "Solicitar presupuesto",
"successMessage": "Recibirá su presupuesto en 48 horas",
"createClient": true
}
}'
const form = await fetch('/api/forms', {
method: 'POST',
headers: {
'Authorization': 'Bearer TOKEN',
'Content-Type': 'application/json',
'x-organization-id': 'ORG_ID'
},
body: JSON.stringify({
title: 'Solicitud de presupuesto',
slug: 'presupuesto',
fields: [
{ type: 'text', label: 'Nombre', required: true },
{ type: 'email', label: 'Email', required: true },
{ type: 'textarea', label: 'Describa su caso', required: true }
],
settings: {
submitButtonText: 'Solicitar presupuesto',
successMessage: 'Recibirá su presupuesto en 48 horas',
createClient: true
}
})
}).then(r => r.json());
{
"id": "form-uuid-new",
"title": "Solicitud de presupuesto",
"slug": "presupuesto",
"isActive": true,
"publicUrl": "https://app.getplea.com/f/presupuesto",
"createdAt": "2026-03-07T12:00:00Z"
}
curl https://app.getplea.com/api/forms/form-uuid-1/responses \
-H "Authorization: Bearer TOKEN" \
-H "x-organization-id: ORG_ID"
const responses = await fetch('/api/forms/form-uuid-1/responses', {
headers: {
'Authorization': 'Bearer TOKEN',
'x-organization-id': 'ORG_ID'
}
}).then(r => r.json());
[
{
"id": "resp-uuid-1",
"formId": "form-uuid-1",
"data": {
"Nombre completo": "Laura Sánchez Pérez",
"Email": "laura.sanchez@email.com",
"Teléfono": "+34 633 444 555",
"Tipo de consulta": "Laboral",
"Descripción del caso": "Necesito asesoramiento sobre un despido improcedente..."
},
"createdClientId": "client-uuid-auto",
"submittedAt": "2026-03-06T15:30:00Z"
}
]
curl https://app.getplea.com/api/public/forms/contacto
const form = await fetch('/api/public/forms/contacto').then(r => r.json());
{
"title": "Formulario de contacto",
"description": "Complete el formulario y nos pondremos en contacto en 24h",
"fields": [
{"id": "f1", "type": "text", "label": "Nombre completo", "required": true},
{"id": "f2", "type": "email", "label": "Email", "required": true},
{"id": "f3", "type": "phone", "label": "Teléfono", "required": false},
{"id": "f4", "type": "select", "label": "Tipo de consulta", "required": true, "options": ["Civil", "Laboral", "Penal", "Mercantil", "Otro"]},
{"id": "f5", "type": "textarea", "label": "Descripción del caso", "required": true}
],
"settings": {
"submitButtonText": "Enviar consulta"
}
}
{
"error": "Not Found",
"message": "Formulario no encontrado o no activo"
}
curl -X POST https://app.getplea.com/api/public/forms/contacto/responses \
-H "Content-Type: application/json" \
-d '{
"data": {
"Nombre completo": "Miguel Torres García",
"Email": "miguel@email.com",
"Tipo de consulta": "Civil",
"Descripción del caso": "Necesito reclamar una deuda de 5.000€"
}
}'
await fetch('/api/public/forms/contacto/responses', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
data: {
'Nombre completo': 'Miguel Torres García',
'Email': 'miguel@email.com',
'Tipo de consulta': 'Civil',
'Descripción del caso': 'Necesito reclamar una deuda de 5.000€'
}
})
});
{
"message": "Gracias por su consulta. Le contactaremos en breve.",
"responseId": "resp-uuid-new"
}
Endpoints para crear formularios públicos embebibles en páginas web, recoger respuestas de potenciales clientes y gestionar los datos recibidos.
GET /api/forms
Lista los formularios de la organización.
GET /api/forms/:id
Obtiene la configuración completa de un formulario con sus campos.
UUID del formulario.
POST /api/forms
Crea un nuevo formulario.
Título del formulario.
Descripción para el usuario.
URL amigable (debe ser única).
Array de campos con type, label, required, y opcionales options, placeholder.
Configuración: submitButtonText, successMessage, notifyEmail, createClient.
GET /api/forms/:id/responses
Lista las respuestas recibidas en un formulario.
UUID del formulario.
Endpoints públicos
Estos endpoints no requieren autenticación y están diseñados para ser usados desde formularios embebidos en páginas web.
GET /api/public/forms/:slug
Obtiene la configuración del formulario para renderizarlo públicamente.
Slug del formulario.
POST /api/public/forms/:slug/responses
Envía una respuesta a un formulario público.
Slug del formulario.
Objeto con las respuestas (clave = label del campo, valor = respuesta).
Last updated today