LEGIORECOVERY AI

Documentación

API de Legio Recovery

JSON sobre HTTPS. Base: https://app.legioagencia.es. Integraciones de servidor: cabecera Authorization: Bearer sk_… (créala en Ajustes → Tracker e integraciones). Errores: { "error": { "code", "message", "ref" } }.

Ejemplo: registrar un presupuesto enviado desde tu CRM

curl -X POST https://app.legioagencia.es/api/events \
  -H "Authorization: Bearer sk_xxx" -H "content-type: application/json" \
  -d '{ "email": "carlos@example.com", "type": "quote_sent",
        "properties": { "amount": 4850, "service": "reforma de cocina" } }'

Autenticación

MétodoRutaDescripciónAutenticaciónCuerpo
POST/api/auth/registerCrear cuenta (opcional: empresa demo o aceptar invitación)Pública{ name, email, password, demo?, invite_token? }
POST/api/auth/loginIniciar sesiónPública{ email, password, next? }
PATCH/api/accountCambiar mi nombreSesión (cookie + X-CSRF-Token){ name }
POST/api/account/passwordCambiar mi contraseña (cierra las demás sesiones)Sesión (cookie + X-CSRF-Token){ current_password, new_password }
POST/api/auth/logoutCerrar sesiónSesión (cookie + X-CSRF-Token)
POST/api/auth/forgotSolicitar enlace para restablecer contraseñaPública{ email }
POST/api/auth/resetRestablecer contraseña con tokenPública{ token, password }
POST/api/auth/verify/resendReenviar el email de verificación (máx. 3/hora y 6/día)Sesión (cookie + X-CSRF-Token)
POST/api/auth/verifyConfirmar email con el token recibidoPública{ token }

Empresa

MétodoRutaDescripciónAutenticaciónCuerpo
POST/api/orgsCrear empresa (tenant)Sesión (cookie + X-CSRF-Token){ name, website?, sector? }
POST/api/orgs/demoCrear/abrir la empresa demo «Clínica Nova»Sesión (cookie + X-CSRF-Token)
POST/api/orgs/switchCambiar de empresa activaSesión (cookie + X-CSRF-Token){ org_id }
DELETE/api/orgs/currentEliminar la empresa activa y todos sus datos (irreversible)Sesión (cookie + X-CSRF-Token)
permiso: settings.update
{ confirm: "<nombre de la empresa>" }
POST/api/onboardingGuardar un paso del onboarding (paso 7 lanza el primer análisis)Sesión (cookie + X-CSRF-Token)
permiso: settings.update
{ step, name?, website?, sector?, primary_goal? }
POST/api/platform/planCambiar el plan de la empresa activa (solo SUPER_ADMIN, mientras no hay pagos)Sesión (cookie + X-CSRF-Token){ plan }
POST/api/billing/checkoutSolicitar un plan (manual hoy: devuelve instrucciones; Stripe en el futuro: URL de pago)Sesión (cookie + X-CSRF-Token)
permiso: settings.update
{ plan }

Equipo

MétodoRutaDescripciónAutenticaciónCuerpo
POST/api/invitations/:token/acceptAceptar invitaciónSesión (cookie + X-CSRF-Token)
POST/api/members/inviteInvitar a un miembro (devuelve el enlace de invitación)Sesión (cookie + X-CSRF-Token)
permiso: members.manage
{ email, role: admin|member }
PATCH/api/members/:userIdCambiar rolSesión (cookie + X-CSRF-Token)
permiso: members.manage
DELETE/api/members/:userIdQuitar miembroSesión (cookie + X-CSRF-Token)
permiso: members.manage
DELETE/api/invitations/:idCancelar invitaciónSesión (cookie + X-CSRF-Token)
permiso: members.manage

Tracker

MétodoRutaDescripciónAutenticaciónCuerpo
GET/api/onboarding/tracker-status¿Ha llegado algún evento del tracker?Sesión (cookie + X-CSRF-Token)
POST/api/trackRegistrar un evento desde la web (Legio.track)Clave pública pk_… (en el cuerpo){ pk, anonymous_id, event, properties?, url?, ts? }
POST/api/identifyIdentificar al visitante tras un mecanismo legítimo (formulario, login…) — Legio.identifyClave pública pk_… (en el cuerpo){ pk, anonymous_id, email, name?, phone?, consent?, signature? }
POST/api/formFormulario enviado por un visitante en cualquier web (legio.js). Crea el lead; solo enlaza el historial con consentimientoClave pública pk_… (en el cuerpo){ pk, email, name?, phone?, form?, service?, consent?: {marketing, text}, anonymous_id? (solo con consentimiento), url? }
GET/api/settings/tracking/check¿Está conectada mi web? (tracker, plugin de WordPress o formularios)Sesión (cookie + X-CSRF-Token)
PATCH/api/settings/trackingActivar/desactivar tracking, verificación de identidad y orígenes permitidosSesión (cookie + X-CSRF-Token)
permiso: settings.update
POST/api/settings/tracking/rotate-keyRegenerar la clave pública del trackerSesión (cookie + X-CSRF-Token)
permiso: settings.update
POST/api/settings/tracking/identity-secretMostrar el secreto para firmar identify() (HMAC-SHA256)Sesión (cookie + X-CSRF-Token)
permiso: apikeys.manage

Formularios

MétodoRutaDescripciónAutenticaciónCuerpo
POST/api/forms/:tokenRecibir un formulario de cualquier web o plataforma (Webflow, Wix, Zapier, Make, Shopify Flow, HTML). Token fk_ en la URL: solo crea leadsToken fk_… en la URL (solo crea leads de formularios)JSON o form-urlencoded: email, nombre|name, telefono|phone, servicio?, consentimiento?, _form?, _redirect?
POST/api/settings/forms/endpointCrear una URL para recibir formularios (fk_…, se muestra una vez)Sesión (cookie + X-CSRF-Token)
permiso: apikeys.manage

Leads

MétodoRutaDescripciónAutenticaciónCuerpo
GET/api/leadsListar leads (q, status, consent, sort, limit, offset)Sesión o Bearer sk_…
permiso: lead.view
POST/api/leadsCrear o actualizar (por email / external_id) un leadSesión o Bearer sk_…
permiso: lead.write
{ email?, name?, phone?, external_id?, source?, estimated_value?, customer_status?, consent_status?, consent_note? }
GET/api/leads/:idDetalle de un lead con timeline y oportunidadesSesión o Bearer sk_…
permiso: lead.view
PATCH/api/leads/:idActualizar datos de un leadSesión o Bearer sk_…
permiso: lead.write
POST/api/leads/:id/summaryResumen del historial del lead (IA con respaldo determinista)Sesión (cookie + X-CSRF-Token)
permiso: lead.view

Privacidad

MétodoRutaDescripciónAutenticaciónCuerpo
POST/api/leads/:id/consentRegistrar la base legal / consentimiento de un leadSesión o Bearer sk_…
permiso: lead.write
{ status: granted|legitimate_interest|unknown|denied|withdrawn, note? }
POST/api/leads/:id/do-not-contactMarcar lead como «no contactar» (añade a la lista de supresión y cierra sus oportunidades)Sesión (cookie + X-CSRF-Token)
permiso: lead.write
GET/api/leads/:id/exportExportar todos los datos de un lead (derecho de acceso/portabilidad)Sesión (cookie + X-CSRF-Token)
permiso: privacy.manage
DELETE/api/leads/:idEliminar un lead y todos sus datos (derecho de supresión)Sesión (cookie + X-CSRF-Token)
permiso: privacy.manage
{ keep_suppression?: boolean }
GET/api/privacy/suppressionLista de supresión (solo se guarda un hash y una pista del email)Sesión (cookie + X-CSRF-Token)
permiso: privacy.manage
POST/api/privacy/suppressionAñadir email a la lista de no contactarSesión (cookie + X-CSRF-Token)
permiso: privacy.manage
{ email }
DELETE/api/privacy/suppression/:idQuitar de la lista (solo si la persona lo pide expresamente)Sesión (cookie + X-CSRF-Token)
permiso: privacy.manage
POST/api/privacy/retention/runAplicar ahora la política de retenciónSesión (cookie + X-CSRF-Token)
permiso: privacy.manage
GET/api/orgs/current/exportExportar TODOS los datos de la empresa (NDJSON por tablas; auditado)Sesión (cookie + X-CSRF-Token)
permiso: data.export

Eventos

MétodoRutaDescripciónAutenticaciónCuerpo
POST/api/leads/:id/eventsRegistrar un evento de negocio para un lead (p. ej. quote_sent con amount)Sesión o Bearer sk_…
permiso: event.create
{ type, properties?, occurred_at?, page_url? }
POST/api/eventsRegistrar un evento de servidor (identifica al lead por lead_id, email o external_id; usado por el plugin de WordPress)Sesión o Bearer sk_…
permiso: event.create
{ lead_id? | email? | external_id?, name?, phone?, type, properties?, occurred_at?, page_url?, anonymous_id?, consent_status?, consent_text? }

Oportunidades

MétodoRutaDescripciónAutenticaciónCuerpo
GET/api/opportunitiesListar oportunidades (status=open|closed|all|<estado>, type, min_score, q, sort)Sesión o Bearer sk_…
permiso: opportunity.view
GET/api/opportunities/:idDetalle de una oportunidad (lead, emails, respuestas, historial)Sesión o Bearer sk_…
permiso: opportunity.view
POST/api/opportunities/:id/generate-emailGenerar un borrador de email personalizado (IA o plantilla) — nunca se envía soloSesión (cookie + X-CSRF-Token)
permiso: email.generate
PATCH/api/emails/:idEditar un borrador (vuelve a pasar las comprobaciones)Sesión (cookie + X-CSRF-Token)
permiso: email.approve
{ subject, body }
POST/api/opportunities/:id/approveAprobar un borrador (requiere persona; MEMBER o ADMIN)Sesión (cookie + X-CSRF-Token)
permiso: email.approve
{ email_id, subject?, body?, acknowledge_flags? }
POST/api/opportunities/:id/sendEnviar un email aprobado (ADMIN). Con approve=true aprueba y envía en un pasoSesión (cookie + X-CSRF-Token)
permiso: email.send
{ email_id, approve?, subject?, body?, acknowledge_flags? }
POST/api/emails/:id/cancelCancelar un email que espera en la cola de envío (ADMIN)Sesión (cookie + X-CSRF-Token)
permiso: email.send
GET/api/emailsEnvíos de la empresa con su estado de entrega (cola, enviados, simulados, fallidos, rebotes…)Sesión o Bearer sk_…
POST/api/emails/:id/discardDescartar un borradorSesión (cookie + X-CSRF-Token)
permiso: email.approve
POST/api/opportunities/:id/dismissDescartar (estado Ignorada)Sesión (cookie + X-CSRF-Token)
permiso: opportunity.update
{ note? }
POST/api/opportunities/:id/do-not-contactNo contactar: bloquea al contacto en todas las campañas futurasSesión (cookie + X-CSRF-Token)
permiso: opportunity.update
POST/api/opportunities/:id/statusCambiar estado manualmente (Nueva, Revisar, Contactada, Respondió, Perdida, Ignorada)Sesión (cookie + X-CSRF-Token)
permiso: opportunity.update
{ status, note? }
POST/api/opportunities/:id/recoverMarcar como recuperada con valor, fecha y fuente (atribución)Sesión (cookie + X-CSRF-Token)
permiso: opportunity.update
{ value, date?, source?, note? }
POST/api/analysis/runAnalizar ahora todos los leads (Opportunity Engine)Sesión o Bearer sk_…
permiso: analysis.run

Ajustes

MétodoRutaDescripciónAutenticaciónCuerpo
GET/api/sender-domainsDominios de envío propios de la empresa y sus registros DNSSesión (cookie + X-CSRF-Token)
permiso: settings.update
POST/api/sender-domainsAñadir un dominio de envío propio (devuelve los registros DNS)Sesión (cookie + X-CSRF-Token)
permiso: settings.update
{ domain }
POST/api/sender-domains/:id/checkComprobar los registros DNS de un dominio de envíoSesión (cookie + X-CSRF-Token)
permiso: settings.update
DELETE/api/sender-domains/:idQuitar un dominio de envío (vuelve el remitente de la plataforma)Sesión (cookie + X-CSRF-Token)
permiso: settings.update
PATCH/api/settings/senderElegir remitente: plataforma o dominio verificadoSesión (cookie + X-CSRF-Token)
permiso: settings.update
{ mode: platform|domain, domain_id?, local_part? }
PATCH/api/settings/businessPerfil de negocio, tono y comunicaciónSesión (cookie + X-CSRF-Token)
permiso: settings.update
PATCH/api/settings/organizationDatos de la empresaSesión (cookie + X-CSRF-Token)
permiso: settings.update
POST/api/settings/test-emailEnviar un email de prueba al usuario actualSesión (cookie + X-CSRF-Token)
permiso: settings.update

Respuestas

MétodoRutaDescripciónAutenticaciónCuerpo
POST/api/opportunities/:id/repliesRegistrar la respuesta de un cliente; se clasifica y se notificaSesión (cookie + X-CSRF-Token)
permiso: reply.create
{ text }
POST/api/replies/:id/classificationCorregir la clasificación de una respuestaSesión (cookie + X-CSRF-Token)
permiso: reply.create
{ classification }

Estadísticas

MétodoRutaDescripciónAutenticaciónCuerpo
GET/api/statsMétricas del dashboard (days=30|90|0)Sesión o Bearer sk_…
permiso: opportunity.view

Alertas

MétodoRutaDescripciónAutenticaciónCuerpo
GET/api/notificationsListar alertasSesión (cookie + X-CSRF-Token)
permiso: notification.view
POST/api/notifications/readMarcar alertas como leídasSesión (cookie + X-CSRF-Token)
permiso: notification.view
{ id? }

Base de conocimiento

MétodoRutaDescripciónAutenticaciónCuerpo
POST/api/knowledgeCrear entradaSesión (cookie + X-CSRF-Token)
permiso: settings.update
PATCH/api/knowledge/:idEditar entradaSesión (cookie + X-CSRF-Token)
permiso: settings.update
DELETE/api/knowledge/:idEliminar entradaSesión (cookie + X-CSRF-Token)
permiso: settings.update

Reglas

MétodoRutaDescripciónAutenticaciónCuerpo
PATCH/api/rules/scoring/:idEditar una regla de puntuaciónSesión (cookie + X-CSRF-Token)
permiso: rules.update
PATCH/api/rules/detectors/:idActivar/configurar un detector integradoSesión (cookie + X-CSRF-Token)
permiso: rules.update
{ active?, params?: { … } }
POST/api/rules/customCrear regla personalizada (SI condiciones ENTONCES acciones)Sesión (cookie + X-CSRF-Token)
permiso: rules.update
{ name, conditions: [{field, op, value}], actions: { create_opportunity?, score_delta?, recommended_action? } }
PATCH/api/rules/custom/:idEditar regla personalizadaSesión (cookie + X-CSRF-Token)
permiso: rules.update
DELETE/api/rules/custom/:idEliminar regla personalizadaSesión (cookie + X-CSRF-Token)
permiso: rules.update

API keys

MétodoRutaDescripciónAutenticaciónCuerpo
POST/api/api-keysCrear clave secreta (sk_…). Se muestra UNA vez; solo se guarda su hashSesión (cookie + X-CSRF-Token)
permiso: apikeys.manage
{ name, kind?: api|wordpress, scopes?: [ingest, read], expires_in_days? }
POST/api/api-keys/:id/regenerateRegenerar una clave (revoca la anterior y devuelve la nueva una sola vez)Sesión (cookie + X-CSRF-Token)
permiso: apikeys.manage
GET/api/integrations/pingComprobar una clave sk_ (usado por «Probar conexión» del plugin de WordPress)Sesión o Bearer sk_…
permiso: event.create
DELETE/api/api-keys/:idRevocar claveSesión (cookie + X-CSRF-Token)
permiso: apikeys.manage

Webhooks

MétodoRutaDescripciónAutenticaciónCuerpo
POST/api/webhooks/inbound-emailEmail entrante (respuestas). Compatible con JSON genérico, Mailgun routes y Postmark inboundSecreto de webhook{ to, text }
POST/api/webhooks/email/resendEventos de Resend: entregas, rebotes, quejas, fallos, aperturas, clics y dominios (firmados con Svix, idempotentes)Secreto de webhook

Operación

MétodoRutaDescripciónAutenticaciónCuerpo
POST/api/cron/runEjecutar tareas programadas (análisis, retención, salud de integraciones)Bearer CRON_SECRET / METRICS_TOKEN
GET/healthLiveness: el proceso está vivoPública
GET/readyReadiness: base de datos accesible y migraciones aplicadasPública
GET/api/healthAlias de /ready (compatibilidad con v0.2 y health check de Railway)Pública
GET/api/wp-plugin/latestÚltima versión del plugin de WordPress (comprobación de actualizaciones)Pública
GET/api/metricsMétricas PrometheusBearer CRON_SECRET / METRICS_TOKEN

Email tracking

MétodoRutaDescripciónAutenticaciónCuerpo
GET/t/o/:tokenPíxel de apertura (opcional, desactivado por defecto)Token firmado en la URL
GET/t/c/:tokenRedirección de clic firmadaToken firmado en la URL

Tipos de evento

page_view Visitó una página
service_view Visitó un servicio
pricing_view Visitó precios
contact_view Visitó contacto
product_view Vio un producto
form_start Inició un formulario
form_submit Envió un formulario
quote_request Solicitó presupuesto
quote_sent Presupuesto enviado
quote_accepted Aceptó el presupuesto
quote_rejected Rechazó el presupuesto
add_to_cart Añadió al carrito
checkout_start Inició el pago
checkout_abandon Abandonó el pago
purchase Compró
booking_start Inició una reserva
booking_complete Completó una reserva
custom_event Evento personalizado

Eventos propios: usa el prefijo custom_ (p. ej. custom_demo_requested). Los importes se leen de amount, value o total.

¿Confirmas?