/api/auth/request-magic-linkPúblicaEnvía un enlace de acceso al email indicado.
{ "email": "tu@negocio.com" }{ "success": true, "message": "Te hemos enviado un enlace de acceso a tu email." }Todos los endpoints usados por el dashboard y el widget embebido son una API REST pública. Base URL:https://api.presupuestapp.com. Las rutas marcadas "Sesión" requieren la cookie de sesión del dashboard (credentials: 'include'); el resto son públicas y las llama el propio widget.js.
Login sin contraseña por enlace mágico. La sesión viaja en una cookie httpOnly — todas las rutas del dashboard la requieren.
/api/auth/request-magic-linkPúblicaEnvía un enlace de acceso al email indicado.
{ "email": "tu@negocio.com" }{ "success": true, "message": "Te hemos enviado un enlace de acceso a tu email." }/api/auth/verify?token=…PúblicaCanjea el token del enlace mágico por una sesión (cookie).
{ "success": true, "email": "tu@negocio.com" }/api/auth/meSesiónDevuelve el usuario autenticado.
{ "success": true, "user": { "email": "tu@negocio.com" } }/api/auth/logoutSesiónCierra la sesión actual.
{ "success": true, "message": "Sesión cerrada." }Configuración de tus calculadoras: preguntas, precios, apariencia. El límite de widgets depende de tu plan (Free: 1 · Starter: 3 · Pro/Agency: ilimitados).
/api/widgetsSesiónCrea un widget.
{ "name": "Pintura", "mode": "bubble", "appearance": { "primaryColor": "#0c7a6a" }, "questions": [...], "pricing": { "basePrice": 0, "modifiers": [...] } }{ "success": true, "widget": { "id": "widget_…", "name": "Pintura", … } }/api/widgetsSesiónLista tus widgets.
{ "success": true, "widgets": [ { "id": "widget_…", … } ] }/api/widgets/:idPúblicaConfiguración de un widget (usada por widget.js).
{ "success": true, "widget": { … } }/api/widgets/:idSesiónActualiza un widget. Acepta cualquier subconjunto de los campos de creación, incluido "workspaceId".
{ "success": true, "widget": { … } }/api/widgets/:idSesiónElimina un widget.
{ "success": true, "message": "Widget eliminado." }Captura de leads (llamada por el widget embebido) y panel de leads del negocio.
/api/leadsPúblicaRegistra un lead al enviar el formulario del widget.
{ "widgetId": "widget_…", "serviceType": "pintura", "answers": { … }, "priceEstimate": { "min": 300, "max": 450 }, "contactInfo": { "name": "Ana", "phone": "600111222" } }{ "success": true, "leadId": "lead_…", "message": "Presupuesto solicitado correctamente. Te contactaremos en breve." }/api/leads?status=new&search=ana&page=1&pageSize=20SesiónLista tus leads con filtros (status, service, search, from, to, sort) y paginación.
{ "success": true, "leads": [ … ], "total": 42, "page": 1, "pageSize": 20, "services": ["pintura"] }/api/leads/:id/statusSesiónCambia el estado (new/contacted/won/lost).
{ "status": "contacted" }{ "success": true, "lead": { … } }/api/leads/:idSesiónElimina un lead.
{ "success": true, "message": "Lead eliminado." }Plantillas prediseñadas por sector (pintura, reforma de baño, mudanza, limpieza) para arrancar un widget nuevo.
/api/templatesPúblicaLista las plantillas disponibles.
{ "success": true, "templates": [ { "id": "pintura", "name": "Pintura", "icon": "🎨", "description": "…" } ] }/api/templates/:idPúblicaConfiguración completa de una plantilla.
{ "success": true, "template": { "id": "pintura", "questions": [...], "pricing": { … } } }Embudo de conversión, ROI por widget, y tracking externo (pixel + conversiones de Google Ads/Facebook).
/api/analytics/trackPúblicaRegistra un evento (visit / calculator_started / calculator_completed).
{ "widgetId": "widget_…", "type": "visit" }{ "success": true }/api/analytics/pixel?widgetId=…&type=visitPúblicaIgual que /track pero como GIF 1x1 — para plataformas que solo permiten insertar una imagen.
Content-Type: image/gif (43 bytes)/api/analytics/track-conversionPúblicaAtribuye una conversión externa (Google Ads, Facebook…) a un widget.
{ "widgetId": "widget_…", "source": "google_ads", "value": 450, "conversionId": "gclid_abc" }{ "success": true }/api/analytics/overview?from=2026-08-01&to=2026-08-31SesiónVisitas, calculadoras completadas, leads y facturación del rango.
{ "success": true, "overview": { "visits": 320, "leads": 41, "totalRevenue": 8200 } }/api/analytics/funnelSesiónEmbudo paso a paso con % de abandono.
{ "success": true, "funnel": [ { "key": "visits", "count": 320, "dropOffRate": 0 }, … ] }/api/analytics/per-widgetSesiónDesglose de métricas por widget.
{ "success": true, "widgets": [ { "widgetId": "widget_…", "leads": 12, "totalRevenue": 3100 } ] }/api/analytics/leads/:id/convertSesiónMarca un lead como ganado con su valor (€).
{ "value": 450 }{ "success": true, "lead": { "status": "won", "wonValue": 450 } }Notifica a Zapier/CRM propio cuando entra o se cierra un lead.
/api/webhooksSesiónLista tus webhooks.
{ "success": true, "webhooks": [ { "id": "webhook_…", "url": "…", "events": ["lead.new"] } ] }/api/webhooksSesiónRegistra un webhook.
{ "url": "https://hooks.zapier.com/…", "events": ["lead.new", "lead.won"] }{ "success": true, "webhook": { … } }/api/webhooks/:idSesiónElimina un webhook.
{ "success": true, "message": "Webhook eliminado." }/api/webhooks/:id/testSesiónEnvía un payload de prueba.
{ "success": true, "delivered": true, "statusCode": 200 }Envío del presupuesto al cliente y aviso al negocio por WhatsApp (Starter+). Sin credenciales reales configuradas todavía, las respuestas son simuladas (mock).
/api/whatsapp/settingsSesiónEstado de la conexión y si el plan la permite.
{ "success": true, "settings": { "enabled": false, "connected": false }, "planAllowsWhatsApp": true }/api/whatsapp/settingsSesiónActiva/desactiva y define el número del negocio.
{ "enabled": true, "phoneNumber": "+34600111222" }{ "success": true, "settings": { … } }/api/whatsapp/sendSesiónEnvía un mensaje (mock).
{ "to": "+34600111222", "message": "Hola…" }{ "success": true, "mock": true, "id": "wamock_…" }Genera un presupuesto imprimible en HTML (base para el PDF real) a partir de un lead.
/api/pdf/generateSesiónGenera el presupuesto de un lead.
{ "leadId": "lead_…" }{ "success": true, "quoteId": "quote_…", "previewUrl": "…/api/pdf/quote_…/preview" }/api/pdf/:id/previewPúblicaRenderiza el presupuesto generado (compartible).
HTML del presupuestoVisitantes que empezaron la calculadora pero no la enviaron.
/api/abandons/recordPúblicaEl widget registra el progreso en cada paso (upsert por sessionId).
{ "sessionId": "sess_…", "widgetId": "widget_…", "stepsCompleted": 2 }{ "success": true }/api/abandonsSesiónLista los abandonos de tus widgets.
{ "success": true, "abandons": [ { "sessionId": "sess_…", "stepsCompleted": 2 } ] }/api/abandons/statsSesiónRecuento de hoy / esta semana / este mes.
{ "success": true, "stats": { "today": 3, "week": 9, "month": 22 } }/api/abandons/:sessionIdSesiónDescarta un abandono.
{ "success": true, "message": "Abandono descartado." }Suscripciones vía Stripe. Sin claves configuradas todavía, devuelve datos simulados (mock: true).
/api/billing/create-checkout-sessionSesiónInicia el checkout de un plan.
{ "plan": "starter", "billing": "monthly" }{ "success": true, "mock": true, "checkoutUrl": "…" }/api/billing/portalSesiónURL del portal de facturación.
{ "success": true, "mock": true, "portalUrl": "…" }/api/billing/invoicesSesiónHistorial de facturas.
{ "success": true, "mock": true, "invoices": [] }Límites y uso del plan actual.
/api/plansPúblicaDefinición de todos los planes.
{ "success": true, "plans": { "free": { "widgets": 1, "estimates": 20 }, "agency": { "widgets": null, "workspaces": true } } }/api/plans/my-planSesiónPlan y uso actual del usuario.
{ "success": true, "plan": "starter", "usage": { "widgetsUsed": 2, "widgetsAllowance": 3 } }Agrupa widgets y leads por cliente final, con marca blanca propia. Solo disponible en el plan Agency.
/api/workspacesSesión · AgencyLista tus workspaces.
{ "success": true, "workspaces": [ { "id": "workspace_…", "name": "…", "clientName": "…" } ] }/api/workspacesSesión · AgencyCrea un workspace.
{ "name": "Reformas García", "clientName": "Reformas García S.L." }{ "success": true, "workspace": { … } }/api/workspaces/:idSesiónDetalle con widgets, leads y estadísticas.
{ "success": true, "workspace": { … }, "widgets": [...], "leads": [...], "stats": { "leads": 12, "totalRevenue": 3100 } }/api/workspaces/:idSesiónActualiza nombre, cliente o marca blanca.
{ "brand": { "name": "García Presupuestos", "logoUrl": "https://…" } }{ "success": true, "workspace": { … } }/api/workspaces/:idSesiónElimina el workspace (los widgets no se borran, solo se desvinculan).
{ "success": true, "message": "Workspace eliminado." }Sirve el widget desde un subdominio propio en lugar de api.presupuestapp.com. La verificación DNS está simulada por ahora.
/api/domainsSesión · AgencyLista tus dominios.
{ "success": true, "domains": [ { "id": "domain_…", "subdomain": "presupuesto.tuagencia.com", "status": "pending" } ] }/api/domainsSesión · AgencyRegistra un subdominio (queda en estado "pending").
{ "subdomain": "presupuesto.tuagencia.com" }{ "success": true, "domain": { "status": "pending" } }/api/domains/:id/verifySesión · AgencyComprueba el DNS (mock) y pasa a "verified".
{ "success": true, "domain": { "status": "verified" } }/api/domains/:idSesiónElimina un dominio.
{ "success": true, "message": "Dominio eliminado." }Cada cuenta tiene un código de referido (ref-XXXXXX). Cuando el referido paga, ambos reciben 1 mes gratis.
/api/referralsSesiónTu enlace de referido y estadísticas.
{ "success": true, "code": "ref-7K2F9Q", "link": "…/dashboard/login?ref=ref-7K2F9Q", "stats": { "totalReferred": 3, "rewarded": 1 } }/api/referrals/applyPúblicaAplica un código al darse de alta.
{ "code": "ref-7K2F9Q", "email": "nuevo@negocio.com" }{ "success": true, "message": "Código de referido aplicado. Cuando tu cuenta pase a un plan de pago, ambos recibiréis 1 mes gratis." }Escríbenos y te ayudamos a conectar Presupuestapp con tu CRM, Zapier o web.
Ir al dashboard