Estas son recetas para el puñado de problemas con los que se topa la mayoría de las integraciones, construidas sobre las formas reales de solicitud y respuesta de la introducción a la API. Adapta el endpoint, los campos y los alcances al recurso con el que estés trabajando — lo que vale la pena reutilizar son los patrones en sí, no los payloads exactos.
Mantén la clave de API fuera del cliente
Nunca llames a la API directamente desde código de navegador o de una app móvil — eso expone tu clave a cualquiera que abra las herramientas de desarrollo. En su lugar, pon un proxy ligero delante: tu frontend llama a tu propio backend, y solo tu backend guarda la clave de Famulor.
El frontend nunca ve FAMULOR_API_KEY — solo habla con /api/trigger-call en tu propio dominio.
Reintentos con espera progresiva
Un 429 o un 5xx normalmente vale la pena reintentarlo, no fallar de inmediato. Espera cada vez más entre intentos en lugar de machacar la API:
Cada intento fallido aproximadamente duplica la espera (500 ms, 1 s, 2 s…) con un poco de aleatoriedad (jitter) para que las llamadas en paralelo no reintenten todas al mismo tiempo.
Recibir webhooks
Los webhooks de reserva van firmados: define una URL en un tipo de evento de reserva, y cada envío incluye X-Famulor-Signature: sha256=<hex digest> — un HMAC-SHA256 del cuerpo sin procesar de la solicitud, con el secreto que se muestra una sola vez al guardar la URL. Los webhooks de variables usan el mismo esquema con su propio secreto, mientras que los webhooks posteriores a la llamada a nivel de asistente no van firmados. Verifica la firma antes de confiar en el payload:
Verifica contra los bytes sin procesar, antes de cualquier análisis JSON. Volver a serializar el cuerpo primero puede cambiar los espacios en blanco o el orden de las claves y romper la verificación de la firma sin previo aviso.
Llamar en lote desde un CSV
Para marcar una lista en lugar de un único número, limita cuántas llamadas lanzas a la vez — la API rechaza las solicitudes en cuanto se alcanza tu retención de crédito o el límite de concurrencia, así que un bucle sin límite solo produce un muro de errores en lugar de terminar antes.
famulorRequest aquí es el ayudante de reintentos con espera progresiva de arriba — el procesamiento por lotes te da concurrencia controlada, y el ayudante absorbe el 429 ocasional sin que falle toda la ejecución. Para un volumen que supere un script puntual, una campaña o una automatización activada por datos del CRM suele necesitar menos código propio que mantener que un script por lotes que tienes que seguir ejecutando.