Empezar
Autenticación
Cada solicitud lleva una API key del workspace. La key decide a qué workspace hablas y qué puedes hacer en él.
El header Authorization#
Manda la key como token Bearer en cada solicitud:
Authorization: Bearer sk_live_...Las keys tienen el formato sk_live_ seguido de 43 caracteres. heysteff guarda solo un hash: si pierdes el secreto, no se puede recuperar; crea otra key o rota la que tienes.
Crear una key#
- Entra al panel en app.heysteff.com.
- Ve a Configuración → Desarrolladores → API Keys y toca Nueva API key.
- Elige los scopes mínimos que necesita tu integración y, si quieres, las IPs desde las que se puede usar.
- Copia el secreto y guárdalo en tu gestor de secretos o en una variable de entorno.
Scopes#
Cada operación exige un scope. Una key sin el scope recibe 403 forbidden. Dale a cada integración solo lo que usa: una tienda que avisa envíos no necesita refunds:write.
| Scope | Permite | Endpoints |
|---|---|---|
messages:write | Enviar mensajes (texto, archivos, plantillas, botones, listas, ubicaciones y reacciones) y marcar como leído. | POST /v1/messagesPOST /v1/messages/{id}/read |
conversations:read | Leer conversaciones y sus mensajes. | GET /v1/conversationsGET /v1/conversations/{id}GET /v1/conversations/{id}/messagesGET /v1/messages/{id} |
conversations:write | Pasar una conversación a una persona, pausar o reanudar el bot y resolverla. | POST /v1/conversations/{id}/escalatePOST /v1/conversations/{id}/botPOST /v1/conversations/{id}/resolve |
contacts:read | Leer contactos y listas. | GET /v1/contactsGET /v1/contact-lists |
contacts:write | Crear contactos y agregarlos a listas. | POST /v1/contactsPOST /v1/contact-lists/{id}/members |
campaigns:read | Leer el estado de una campaña. | GET /v1/campaigns/{id} |
campaigns:write | Crear y disparar campañas. | POST /v1/campaigns |
events:read | Leer el stream de eventos. | GET /v1/events |
events:write | Registrar eventos de tu sistema. | POST /v1/events |
conversions:write | Reportar conversiones para atribuirlas. | POST /v1/conversions |
charges:write | Cobrar con un link de pago. | POST /v1/charges |
refunds:write | Reembolsar pagos. | POST /v1/refunds |
sales:read | Leer el embudo de ventas. | GET /v1/sales/funnel |
reviews:read | Leer reseñas. | GET /v1/reviews |
reviews:write | Pedir reseñas. | POST /v1/reviews |
automations:trigger | Disparar flujos. | POST /v1/automation-flows/{id}/trigger |
owner:write | Modo sueño de un espacio personal. | GET /v1/owner/sleepPOST /v1/owner/sleep |
webhooks:read | Leer los webhooks y su registro de entregas. | GET /v1/webhooksGET /v1/webhooks/{id}/deliveries |
webhooks:write | Crear, editar y borrar webhooks y reintentar una entrega. | POST /v1/webhooksPATCH /v1/webhooks/{id}DELETE /v1/webhooks/{id}POST /v1/webhook-deliveries/{id}/retry |
numbers:read | Ver tus números de WhatsApp de heysteff y el cupo del plan. | GET /v1/numbersGET /v1/numbers/{id}GET /v1/whatsapp-numbers/{id}GET /v1/whatsapp-numbers/{id}/business-profile |
numbers:write | Reservar un número (con su link de conexión), soltar una reserva y pedir el nombre visible. | POST /v1/numbersDELETE /v1/numbers/{id}POST /v1/numbers/{id}/display-namePATCH /v1/whatsapp-numbers/{id}/business-profile |
flows:read | Ver tus WhatsApp Flows, su Flow JSON, la vista previa y las respuestas de los clientes. | GET /v1/whatsapp-flowsGET /v1/whatsapp-flows/{id}GET /v1/whatsapp-flows/{id}/jsonGET /v1/whatsapp-flows/{id}/previewGET /v1/whatsapp-flows/responses |
flows:write | Crear, cambiar, publicar, deprecar y borrar WhatsApp Flows, subir su Flow JSON y sincronizarlos con Meta. | POST /v1/whatsapp-flowsPOST /v1/whatsapp-flows/syncPATCH /v1/whatsapp-flows/{id}DELETE /v1/whatsapp-flows/{id}PUT /v1/whatsapp-flows/{id}/jsonPOST /v1/whatsapp-flows/{id}/publishPOST /v1/whatsapp-flows/{id}/deprecate |
calls:read | Ver el registro de llamadas de WhatsApp y los ajustes de llamadas de un número. | GET /v1/callsGET /v1/whatsapp-numbers/{id}/calling |
calls:write | Encender o apagar las llamadas de un número y cambiar su horario. | PATCH /v1/whatsapp-numbers/{id}/calling |
inbox:embed | Crear, ver, cambiar y revocar los tokens de la bandeja embebible. | POST /v1/inbox-embedsGET /v1/inbox-embedsPATCH/DELETE /v1/inbox-embeds/{id} |
logs:read | Leer los logs unificados: llamadas a la API, entregas de webhooks y mensajes fallidos (GET /v1/logs). | |
templates:write | Crear plantillas de WhatsApp (van a revisión de Meta) y borrarlas. | POST /v1/templatesDELETE /v1/templates/{name} |
customers:read | Ver tus clientes y los canales que conectaron. | GET /v1/customersGET /v1/customers/{id}GET /v1/customers/{id}/channels |
customers:write | Crear, cambiar y borrar clientes, y generar sus links de conexión. | POST /v1/customersPATCH /v1/customers/{id}DELETE /v1/customers/{id}POST /v1/customers/{id}/setup-links |
agent:read | Ver el agente de IA (encendido, modelo, cupo de prueba, keys guardadas solo por sus últimos 4) y sus custom tools. | GET /v1/agentGET /v1/agent/toolsGET /v1/agent/tools/{id} |
agent:write | Configurar el agente, guardar o borrar tu key del proveedor y administrar custom tools. | PATCH /v1/agentPUT /v1/agent/keysDELETE /v1/agent/keys/{provider}POST /v1/agent/toolsPATCH /v1/agent/tools/{id}DELETE /v1/agent/tools/{id} |
insights:read | Leer los hallazgos de tus conversaciones. | GET /v1/insights |
Rotar una key sin cortar el servicio#
Desde la lista de keys, Rotar crea un secreto nuevo y deja el anterior funcionando durante un período de gracia (24 horas por defecto). Despliega el secreto nuevo en ese tiempo; al terminar la gracia, el anterior deja de funcionar solo.
IPs permitidas#
Puedes restringir una key a una lista de IPs o rangos CIDR (por ejemplo, 203.0.113.0/24). Una solicitud desde otra IP recibe 403 aunque la key sea válida.
Revocar#
Revocar corta la key en el momento. Hazlo apenas sospeches que se filtró y crea una nueva para la integración.
Errores de autenticación#
| Status | Código | Qué pasó |
|---|---|---|
| 401 | unauthorized | Falta el header, la key es inválida, venció o fue revocada. |
| 403 | forbidden | La key no tiene el scope de la operación o la IP no está permitida. |
| 403 | workspace_disabled | El workspace está deshabilitado. |
| 429 | rate_limited | Superaste el límite de solicitudes de la key. |
Buenas prácticas#
- Una key por integración, con un nombre que diga dónde se usa.
- Guárdala en variables de entorno o en un gestor de secretos, nunca en el código.
- Nunca la uses desde el navegador ni desde una app móvil: pasa siempre por tu servidor.
- Rota las keys de producción de forma periódica.