REST + JSON, webhooks firmados y servidor MCP. Incluida en todos los planes.
kal_live_…).start devueltos.curl https://kalendaria.kisasotest.com/api/v1/services -H "Authorization: Bearer kal_live_XXXX"
curl "https://kalendaria.kisasotest.com/api/v1/availability?service_id=svc_…&from=2026-11-02&to=2026-11-08" \
-H "Authorization: Bearer kal_live_XXXX"
curl -X POST https://kalendaria.kisasotest.com/api/v1/bookings \
-H "Authorization: Bearer kal_live_XXXX" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f1c…" \
-d '{"service_id":"svc_…","start":"2026-11-03T13:00:00.000Z",
"customer":{"name":"Ana Pérez","email":"ana@ejemplo.com","phone":"+56912345678"}}'https://kalendaria.kisasotest.com/api/v1 · versión 2026-10-21 (cabecera KalendarIA-Version).Authorization: Bearer kal_live_…. Claves de lectura o de lectura+escritura.svc_, stf_, res_, bkg_, cus_, evt_, whe_.25000 = $25.000), EUR en céntimos (2900 = 29,00 €).Idempotency-Key en cualquier POST (24 h). La misma clave con otro cuerpo devuelve 409.limit (≤ 100) y cursor = next_cursor de la respuesta anterior.RateLimit-*).code estable: slot_unavailable, hold_expired, validation_error, invalid_state, cancel_window_passed, rate_limited…409 slot_unavailable./accountDatos del negocio/servicesListar servicios/servicesCrear servicio/services/{id}Ver servicio/services/{id}Actualizar servicio/staffListar profesionales (con horario semanal)/resourcesListar recursos (boxes, sillones, salas, equipos)/availabilityHoras libres de un servicio/holdsRetener una hora (10 minutos)/bookingsListar reservas/bookingsCrear reserva/bookings/{id}Ver reserva/bookings/{id}/cancelCancelar/bookings/{id}/rescheduleCambiar hora/bookings/{id}/confirmAprobar (pending_approval → confirmed)/bookings/{id}/completeMarcar como atendida/bookings/{id}/no_showMarcar como no asistió/customersListar o buscar clientes/customersCrear o actualizar cliente (por email/teléfono)/customers/{id}Ver cliente/customers/{id}Actualizar cliente/customers/{id}Suprimir datos personales (RGPD / Ley 21.719)/webhook_endpointsListar webhooks/webhook_endpointsSuscribir un webhook (REST hook)/webhook_endpoints/{id}Eliminar webhook/webhook_endpoints/{id}/deliveriesÚltimas entregas de un webhook/eventsRegistro de eventos (reconciliación)/events/{id}Ver eventoEsquemas completos en openapi.json (impórtalo en Postman, Insomnia o un generador de SDK).
Retén la hora 10 minutos mientras el cliente termina y confírmala después: nadie más puede tomarla mientras tanto.
POST /api/v1/holds {"service_id":"svc_…","start":"2026-11-03T13:00:00.000Z"}
→ {"id":"bkg_…","object":"hold","status":"held","hold_expires_at":"…"}
POST /api/v1/bookings {"hold_id":"bkg_…","customer":{"name":"Ana","phone":"+34612345678"}}
→ {"id":"bkg_…","status":"confirmed","manage_url":"…"}Formato Standard Webhooks: cabeceras webhook-id, webhook-timestamp y webhook-signature (v1,<base64>). Firma HMAC-SHA256 de id.timestamp.cuerpo con el secreto (whsec_…, se decodifica en base64). Reintentos durante ~42 h; responde 2xx en menos de 10 s.
// Node.js
import crypto from "node:crypto";
function verify(secret, headers, rawBody) {
const key = Buffer.from(secret.replace(/^whsec_/, ""), "base64");
const msg = `${headers["webhook-id"]}.${headers["webhook-timestamp"]}.${rawBody}`;
const sig = crypto.createHmac("sha256", key).update(msg).digest("base64");
const fresh = Math.abs(Date.now() / 1000 - Number(headers["webhook-timestamp"])) < 300;
return fresh && headers["webhook-signature"].split(" ").includes(`v1,${sig}`);
}Eventos:
booking.heldbooking.createdbooking.confirmedbooking.pending_approvalbooking.pending_paymentbooking.rescheduledbooking.canceledbooking.completedbooking.no_showbooking.expiredpayment.succeededpayment.failedcustomer.createdcustomer.updatedwaitlist.joinedwaitlist.notifiedSi se pierde alguno, GET /api/v1/events devuelve el registro completo para reconciliar.
Streamable HTTP en https://kalendaria.kisasotest.com/api/mcp, autenticado con una clave de API. Herramientas: datos del negocio, servicios, horas libres, crear, mover, cancelar y aprobar reservas, marcar asistencia, buscar clientes y resumen del día.
claude mcp add --transport http kalendaria https://kalendaria.kisasotest.com/api/mcp \ --header "Authorization: Bearer kal_live_XXXX"
<div data-kalendaria="tu-negocio"></div> <script src="https://kalendaria.kisasotest.com/embed.js" async></script> <!-- o un botón flotante --> <script src="https://kalendaria.kisasotest.com/embed.js" data-kalendaria-button="tu-negocio" data-label="Reservar" async></script>
Pasa los UTM, fbclid, gclid y las cookies _fbp/_fbc/_ga a la reserva y, al reservar, lanza dataLayer.push({event: "booking_created"}) y el evento Schedule del píxel de Meta con eventID = id de la reserva.