1. Actívala en tu panel
Ve a Settings → Integrations → Public API 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
Every request to the public API needs these two headers:
X-Client: api
X-Kustom-Key: pk_live_TU_CLAVEX-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
Request the catalogue of services and products:
curl "https://api.tudominio.com/api/v1/catalog" \
-H "X-Client: api" \
-H "X-Kustom-Key: pk_live_TU_CLAVE"Or from JavaScript, on the site itself:
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));Check the free slots for a given service (the next 7 days from a date):
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"And create a booking (as a guest, without an account):
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
| Method | Ruta | What it's for |
|---|---|---|
| GET | /api/v1/store | Ficha del negocio: nombre, tema, colores, horario. |
| GET | /api/v1/locations | Sedes del negocio, si tiene más de una. |
| GET | /api/v1/categories | Categorías del catálogo. |
| GET | /api/v1/catalog | Servicios y productos (filtra por ?kind=service|product). |
| GET | /api/v1/catalog/{slug} | Ficha de un servicio o producto. |
| GET | /api/v1/staff | El equipo — quién atiende qué. |
| GET | /api/v1/availability | Huecos libres de un servicio (y, si quieres, de una profesional) en un rango de fechas. |
| POST | /api/v1/bookings | Crear una reserva — con cuenta o como invitada. |
| GET | /api/v1/reviews | Reseñas publicadas (de un servicio, de una profesional, o todas). |
| POST | /api/v1/reviews | Dejar 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
Request the published reviews of a service:
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"