API de escritura
¿Solo necesitas enviar leads?
La API de leads (/webhooks/custom) sigue igual y es lo más simple. Esta API es para lo demás: actualizar, mover, anotar y agendar.Permisos#
Un administrador los activa en Configuración → Integraciones → API Key → Permisos. Sin el permiso, la respuesta es 403 y dice cuál falta.
leads:write: crear y actualizar leads, moverlos de etapa y agregarles notas.tasks:write: crear tareas.appointments:write: agendar citas.
Reintentos seguros: Idempotency-Key#
Si una petición se corta (timeout, red), no sabes si alcanzó a crear el registro. Manda un encabezado Idempotency-Key con un valor único por operación (un UUID o tu propio id): si reintentas con la misma clave en las siguientes 24 horas, YAVE responde lo mismo que la primera vez, con el encabezado Idempotent-Replayed: true, y no vuelve a crear nada.
- La misma clave con un cuerpo distinto responde
422. - Si la primera todavía se está procesando,
409: espera y reintenta. - Si la primera falló, la clave queda libre y el reintento se procesa.
Leads#
Crear
/external/leadsleads:writeIgual que la API de leads: si el teléfono ya existe en la organización no crea un duplicado y responde "created": false con el lead existente. Responde el lead completo, igual que GET /external/leads/{id}.
namestringrequeridophonestringemailstringsource · sourceIdstringbudgetnumberutmSource · utmMedium · utmCampaign · utmContent · utmTermstringtagsstring[]customFieldsobjectcurl -X POST https://api.yavehome.com/api/v1/external/leads \
-H "X-API-Key: yave_3f9a…c21e" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: erp-cliente-88121" \
-d '{ "name": "Laura Gómez", "phone": "+57 300 123 4567", "source": "ERP" }'Actualizar
/external/leads/{id}leads:writeSolo cambia los campos que envíes: name, phone, email, budget, assignedToId (un usuario de la organización), los utm* y tags (se agregan, no reemplazan las existentes). Para la etapa usa el endpoint de abajo.
Mover de etapa
/external/leads/{id}/stageleads:writestageIdstringrequeridolostReasonCode · lostReasonstring- Se respetan las reglas de entrada que el equipo configuró en el embudo (por ejemplo, “no pasa a Visita sin una cita agendada”). Si el lead no las cumple, responde
422con"code": "STAGE_TRIGGER_BLOCKED"y el motivo. Una integración no puede forzarlas. - Reservado y Ganado no se pueden poner por API (
422,STAGE_CRM_ONLY): abren una reserva o una venta, con unidad, valores y plan de pagos, y eso se hace desde el CRM. - El movimiento queda en el historial del lead como hecho por la integración, y dispara las automatizaciones y conversiones igual que en el CRM.
Notas
/external/leads/{id}/notesleads:writeCuerpo: { "content": "Pagó la separación" } (hasta 5.000 caracteres). En el CRM aparece con el nombre de la API key al inicio para que se sepa de dónde vino.
Tareas#
/external/taskstasks:writetitlestringrequeridodescriptionstringleadIdstringassigneeIdstringdueAtISO 8601priorityLOW | MEDIUM | HIGH | URGENTCitas#
/external/appointmentsappointments:writetitlestringrequeridostartAtISO 8601requeridoendAtISO 8601leadIdstringagentIdstringtypeVISIT | CALL | VIDEO_CALL | FOLLOWUP | OTHERlocation · descriptionstringErrores frecuentes#
400: un campo que no existe o con formato inválido; el mensaje dice cuál.404: el lead no existe o es de otra organización.422: la regla del embudo no se cumple, o la etapa es solo del CRM.
Los límites son los mismos de la API de consulta: 120 peticiones por minuto por clave.