Sin SDK que instalar (aún), sin dependencias. Un endpoint REST sobre HTTPS, autenticación por API key y respuesta JSON tipada. Funciona desde cualquier stack.
Autenticación: header x-mati-api-key
Límites por IP y por ruta (reservar: 10 por minuto). Pasado el límite, respuesta 429; no hay cabeceras X-RateLimit-*
Webhooks firmados HMAC-SHA256, con hasta 5 intentos por evento
Errores con un code estable (SLOT_UNAVAILABLE, BOOKING_TOO_SOON…)
Para Insomnia, importa el archivo Postman — es compatible.
# 1. Pide los huecos libres de un día (de hoy en adelante; en macOS: date -v+2d +%F)
curl "https://app.mati-ia.com/api/v1/workspaces/mi-agenda-mati/slots?serviceId=srv_consulta_general&date=$(date -d '+2 days' +%F)" \
-H "x-mati-api-key: mat_sk_TU_API_KEY"
# => { "success": true,
# "timezone": "Europe/Madrid",
# "slots": ["10:00", "10:30"],
# "slotsIso": ["2027-01-12T10:00:00+01:00", "2027-01-12T10:30:00+01:00"] }
# 2. Reserva uno de esos huecos: pasa su slotsIso TAL CUAL, sin convertirlo
curl -X POST https://app.mati-ia.com/api/v1/workspaces/mi-agenda-mati/bookings \
-H "x-mati-api-key: mat_sk_TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"serviceId": "srv_consulta_general",
"name": "María García",
"email": "[email protected]",
"date": "2027-01-12T10:00:00+01:00"
}'
# => { "success": true,
# "checkoutUrl": null,
# "booking": { "id": "cm...", "status": "CONFIRMED",
# "startTime": "2027-01-12T09:00:00.000Z", "endTime": "...", ... } }
#
# Servicio de pago: status "PENDING" y checkoutUrl con la URL de pago de Stripe.
# El id del servicio sale de GET .../services. Un error trae un "code" estable:
# SLOT_UNAVAILABLE, BOOKING_TOO_SOON, DATE_IN_PAST...
Quickstart
Priorizá WordPress y Shopify, pero cualquier sitio con HTML funciona. Todas las opciones se conectan al mismo workspace y dashboard de Mati.
WordPress
Instalación
1. Descargá wp-mati-ia.zip desde tu dashboard
2. Plugins → Añadir nuevo → Subir plugin
3. Activá Mati y seguí el wizard de configuración
Shopify Shopify
Liquid snippet
{% comment %}
Copiá esto en theme.liquid antes de </body>
{% endcomment %}
<script
src="https://mati-ia.com/mati-widget.min.js"
data-slug="tu-workspace"
data-position="bottom-right"
data-theme="auto"
></script>
# Próximamente: @mati/react todavía no está publicado en npm. Usa el script tag de arriba.
Componente
import Script from "next/script";
// El widget se identifica con el slug y valida el dominio en el
// servidor. NO lleva clave de API: esa clave da acceso de ESCRITURA
// al workspace (catalogo, reservas, cancelaciones) y en el navegador
// la ve cualquiera. Usala solo desde tu backend.
export default function Page() {
return (
<Script
src="https://mati-ia.com/mati-widget.min.js"
data-slug="tu-workspace"
data-position="bottom-right"
data-theme="auto"
strategy="afterInteractive"
/>
);
}
REST API
cURL
# date: un valor de slotsIso de GET .../slots (hoy o futuro), tal cual
curl -X POST https://app.mati-ia.com/api/v1/workspaces/tu-workspace/bookings \
-H "Content-Type: application/json" \
-H "x-mati-api-key: mat_sk_TU_API_KEY" \
-d '{
"serviceId": "srv_123",
"providerId": "pro_456",
"date": "2027-01-12T10:00:00+01:00",
"email": "[email protected]",
"name": "Jane Doe"
}'
Probá en vivo
Sin crear cuenta. Pegá este snippet en cualquier archivo HTML, tema Shopify o plantilla WordPress y el widget cargará con datos de demo.