stripe.com/v1/subscriptions al registrarse/webhook/stripe recibe invoice.paid / customer.subscription.deletedusers.plan y subscriptions.statusAuthorization: Bearer re_xxx · from: hola@leadspark.ioPOST /webhook/calendly como endpoint públicoinvitee.email → buscar lead por emailactivity tipo meeting + actualizar last_activitycontactado0 9 * * * (Europa/Madrid)last_activity < NOW()-7days AND status != cerrado// LeadSpark CRM — Cliente para Xano Backend // Instancia: https://leadspark.xano.io const BASE = "https://leadspark.xano.io"; // ── AUTH ────────────────────────────────────────── export const authLogin = async (email: string, password: string) => { const res = await fetch(`${BASE}/api:auth/auth/login`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ email, password }), }); const { authToken, user } = await res.json(); localStorage.setItem("ls_token", authToken); return { authToken, user }; }; // ── LEADS ────────────────────────────────────────── interface LeadsQuery { page?: number; per_page?: number; status?: "nuevo" | "contactado" | "calificado" | "propuesta" | "cerrado"; pipeline_id?: number; } export const getLeads = async (token: string, query: LeadsQuery = {}) => { const params = new URLSearchParams({ page: String(query.page ?? 1), per_page: String(query.per_page ?? 20), ...(query.status && { status: query.status }), ...(query.pipeline_id && { pipeline_id: String(query.pipeline_id) }), }); const res = await fetch(`${BASE}/api:leads/leads?${params}`, { headers: { Authorization: `Bearer ${token}` }, }); return res.json(); // { items: Lead[], total, page, pages } }; export const createLead = async (token: string, data: { name: string; email: string; company: string; pipeline_id: number; value_eur: number; }) => { const res = await fetch(`${BASE}/api:leads/leads`, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}`, }, body: JSON.stringify(data), }); return res.json(); // { id, name, status, assigned_to, created_at } };
page y per_page. Máximo 50 registros por página. Las queries sin límite degradan el rendimiento./auth/signup, /auth/login y webhooks entrantes: máx 20 req/min por IP.auth, leads, pipelines, activities y webhooks en grupos distintos. Facilita versioning y control de acceso.