Saltar al contenido

Para desarrolladores

Si tienes tu propia web (hecha a mano, con WordPress, Wix o lo que sea) y no quieres usar la plantilla de Kustom, puedes seguir usando el motor de reservas por detrás: catálogo, disponibilidad, reservas y reseñas, con una simple clave.

1. Actívala en tu panel

Ve a Ajustes → Integraciones → API pública en tu panel de Kustom. Activa el interruptor y copia la clave que aparece (empieza por pk_live_) — es una clave publicable, como la de Stripe: viaja en el JavaScript de tu web, no hace falta esconderla.

Después, añade el dominio exacto desde el que vas a llamar (por ejemplo https://tudominio.com) a la lista de dominios permitidos. Es el único sitio desde el que un navegador podrá usar la clave — sin ningún dominio dado de alta, solo funcionará desde tu propio servidor, nunca desde el navegador de una visitante.

2. Dos cabeceras en cada petición

Toda petición a la API pública necesita estas dos cabeceras:

X-Client: api
X-Kustom-Key: pk_live_TU_CLAVE

X-Client: api le dice a Kustom que la petición viene de la web propia de un negocio, no de la web de Kustom ni de la app móvil. X-Kustom-Key identifica DE QUÉ negocio se trata — no hace falta ningún subdominio ni cabecera Host especial, la clave ya lo dice todo.

Si llamas desde el navegador (fetch/XHR), el navegador añade la cabecera Origin él solo — no tienes que hacer nada más, pero recuerda que ese origen tiene que estar en tu lista de dominios permitidos (paso 1) o la petición se rechaza con un 403.

3. Un ejemplo real

Pedir el catálogo de servicios y productos:

curl "https://api.tudominio.com/api/v1/catalog" \
  -H "X-Client: api" \
  -H "X-Kustom-Key: pk_live_TU_CLAVE"

O desde JavaScript, en la propia web:

fetch("https://api.tudominio.com/api/v1/catalog", {
  headers: {
    "X-Client": "api",
    "X-Kustom-Key": "pk_live_TU_CLAVE",
  },
})
  .then((r) => r.json())
  .then((catalogo) => console.log(catalogo));

Comprobar huecos libres de un servicio concreto (los próximos 7 días desde una fecha):

curl "https://api.tudominio.com/api/v1/availability?item_id=EL_ID_DEL_SERVICIO&date_from=2026-09-10&days=7" \
  -H "X-Client: api" \
  -H "X-Kustom-Key: pk_live_TU_CLAVE"

Y crear una reserva (como invitada, sin cuenta):

fetch("https://api.tudominio.com/api/v1/bookings", {
  method: "POST",
  headers: {
    "X-Client": "api",
    "X-Kustom-Key": "pk_live_TU_CLAVE",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    item_id: "EL_ID_DEL_SERVICIO",
    staff_id: "EL_ID_DE_LA_PROFESIONAL",
    starts_at: "2026-09-10T10:00:00+02:00",
    customer_name: "Elena Vidal",
    customer_email: "elena@example.com",
    accepted_privacy_policy: true,
  }),
})
  .then((r) => r.json())
  .then((reserva) => console.log(reserva));

4. Todos los endpoints disponibles

MétodoRutaPara qué sirve
GET/api/v1/storeFicha del negocio: nombre, tema, colores, horario.
GET/api/v1/locationsSedes del negocio, si tiene más de una.
GET/api/v1/categoriesCategorías del catálogo.
GET/api/v1/catalogServicios y productos (filtra por ?kind=service|product).
GET/api/v1/catalog/{slug}Ficha de un servicio o producto.
GET/api/v1/staffEl equipo — quién atiende qué.
GET/api/v1/availabilityHuecos libres de un servicio (y, si quieres, de una profesional) en un rango de fechas.
POST/api/v1/bookingsCrear una reserva — con cuenta o como invitada.
GET/api/v1/reviewsReseñas publicadas (de un servicio, de una profesional, o todas).
POST/api/v1/reviewsDejar una reseña sobre una cita o un pedido ya completado.

El catálogo y las sedes admiten el filtro ?location=slug-de-la-sede si tu negocio tiene más de una (ver GET /api/v1/locations para la lista). Las respuestas son exactamente las mismas que usa la propia web de Kustom — no hay una versión “recortada” para la API pública.

5. WordPress, Wix o HTML plano

Para plantar el catálogo (o cualquier otra llamada) en una plataforma que solo te deja pegar un bloque de código HTML — un bloque “HTML personalizado” en WordPress (Gutenberg → bloque HTML personalizado, o el widget “HTML” clásico), o el elemento “Insertar código HTML/Embed” de Wix — este bloque autocontenido sirve tal cual, sin ningún framework:

<div id="kustom-catalogo">Cargando…</div>
<script>
  fetch("https://api.tudominio.com/api/v1/catalog", {
    headers: {
      "X-Client": "api",
      "X-Kustom-Key": "pk_live_TU_CLAVE",
    },
  })
    .then(function (r) { return r.json(); })
    .then(function (catalogo) {
      var contenedor = document.getElementById("kustom-catalogo");
      contenedor.innerHTML = catalogo
        .map(function (item) {
          return (
            '<div style="padding:12px 0;border-bottom:1px solid #eee">' +
            '<strong>' + item.name + '</strong> — ' +
            (item.price_cents / 100).toFixed(2) + ' €' +
            '</div>'
          );
        })
        .join("");
    })
    .catch(function () {
      document.getElementById("kustom-catalogo").textContent =
        "No se pudo cargar el catálogo ahora mismo.";
    });
</script>

En WordPress con Elementor, el widget se llama “HTML” (bajo “General”); en Divi, “Código”. En Wix, busca “Insertar HTML” o “Embed” al añadir un elemento. En cualquiera de los tres, pega el bloque de arriba entero — el <script> incluido — y cambia pk_live_TU_CLAVE por tu clave real. Recuerda dar de alta el dominio de esa página (paso 1) o la petición se rechazará.

Reseñas

Pedir las reseñas publicadas de un servicio:

curl "https://api.tudominio.com/api/v1/reviews?item_id=EL_ID_DEL_SERVICIO" \
  -H "X-Client: api" \
  -H "X-Kustom-Key: pk_live_TU_CLAVE"

¿Dudas o algo no funciona? Escríbenos desde kustom.dev o desde el soporte de tu propio panel.