Business API
Developer PortalIntegra el Agente Virtual de Phylax en tu CRM inmobiliario. Gestiona sucursales, propiedades, leads y créditos desde tu propia plataforma.
REST / JSON Webhooks firmados 300 req/min HTTPS
Quickstart Estás a 3 pasos de tener el agente virtual funcionando en tu primera sucursal.
1
Obtener las API Keys
Tu Enterprise API Key y los Org Keys por sucursal los recibís al activar el Plan Business. Si no los tenés, contactá a hola@phylax-ia.com.
2
Crear una sucursal
Con tu Enterprise Key, hacé un POST /orgs para crear la sucursal. Recibirás el branchId y la Org Key.
3
Cargar propiedades
Usá la Org Key de la sucursal para sincronizar propiedades vía POST /properties. El agente virtual las conoce al instante.
Ejemplo rápido bash copiar
# 1. Crear una sucursal
curl -X POST https://api.phylax-ia.com/api/v1/orgs \
-H "Authorization: Bearer <ENTERPRISE_KEY>" \
-H "Content-Type: application/json" \
-d '{"name":"Sucursal Centro","slug":"sucursal-centro","branchId":"SCENTRO"}'
# 2. Cargar una propiedad
curl -X POST https://api.phylax-ia.com/api/v1/properties \
-H "Authorization: Bearer <ORG_KEY>" \
-H "Content-Type: application/json" \
-d '{
"externalId": "prop-001",
"title": "Apartamento 2 dorm en Pocitos",
"type": "apartment",
"operation": "rent",
"price": 900,
"currency": "USD",
"bedrooms": 2,
"bathrooms": 1,
"area": 72,
"address": "Pocitos, Montevideo",
"description": "Luminoso, piso 5, con terraza."
}'
Autenticación La Business API usa dos tipos de API Keys con distintos niveles de acceso.
Enterprise API Key
Scope: Empresa
→ Crear y listar sucursales→ Asignar créditos entre sucursales→ Ver métricas consolidadasOrg API Key
Scope: Sucursal
→ Gestionar propiedades→ Ver leads y conversaciones→ Gestionar créditos propios→ Ver y gestionar escalacionesNunca expongas las API Keys en el frontend o en repositorios públicos. Usá siempre variables de entorno del lado del servidor.
Header requerido http copiar
Authorization: Bearer <API_KEY>Base URL text copiar
https://api.phylax-ia.com/api/v1
Organizaciones Una organización representa una sucursal. Cada sucursal tiene su propio número de WhatsApp y agente virtual.
POST /orgsEnterprise Key
Crea una nueva sucursal con agente virtual. Requiere Enterprise Key.
Body Parámetro Tipo Descripción namestring req Nombre visible de la sucursal. slugstring req Identificador único, solo minúsculas y guiones. branchIdstring req ID de la sucursal en tu CRM. Se incluye en todos los webhooks.
bash copiar
curl -X POST https://api.phylax-ia.com/api/v1/orgs \
-H "Authorization: Bearer <ENTERPRISE_KEY>" \
-H "Content-Type: application/json" \
-d '{
"name": "Sucursal Carrasco",
"slug": "sucursal-carrasco",
"branchId": "CARR001"
}'json copiar
{
"ok": true,
"org": {
"_id": "6631a2b3c4d5e6f7a8b9c0d1",
"name": "Sucursal Carrasco",
"slug": "sucursal-carrasco",
"branchId": "CARR001",
"status": "active",
"credits": { "balance": 15, "reserved": 0 }
},
"apiKey": "pk_org_xxxxxxxxxxxxxxxxxxxxxxxx"
}Guardá el campo apiKey de la respuesta — es la Org Key de la sucursal y no se puede recuperar después.
GET /orgs/:branchIdEnterprise Key / Org Key
Devuelve los datos actuales de la sucursal: estado, créditos y metadata.
bash copiar
curl https://api.phylax-ia.com/api/v1/orgs/CARR001 \
-H "Authorization: Bearer <ORG_KEY>"
Propiedades El agente virtual solo atiende las propiedades que estén activas. Sincronizá tu inventario en tiempo real.
POST /propertiesOrg Key
Crea o actualiza una propiedad (upsert por externalId). Consume 1 crédito/mes.
GET /propertiesOrg Key
Lista todas las propiedades activas de la sucursal.
DELETE /properties/:idOrg Key
Desactiva una propiedad. Libera el crédito en el próximo ciclo.
Body — POST /properties Parámetro Tipo Descripción externalIdstring req ID único en tu CRM. Permite hacer upsert sin duplicados. titlestring req Título de la publicación. typestring req apartment · house · office · land · garage · other operationstring req sale · rent pricenumber req Precio numérico sin símbolo. currencystring opt USD (default) · UYU bedroomsnumber opt Cantidad de dormitorios. bathroomsnumber opt Cantidad de baños. areanumber opt Superficie en m². addressstring opt Dirección o zona (ej: Pocitos, Montevideo). descriptionstring opt Descripción libre para el agente virtual. imageUrlstring opt URL de imagen principal. listingUrlstring opt URL de la publicación en tu portal. featuresstring[] opt Amenidades: ["piscina","garage","parrilla"]
bash copiar
curl -X POST https://api.phylax-ia.com/api/v1/properties \
-H "Authorization: Bearer <ORG_KEY>" \
-H "Content-Type: application/json" \
-d '{
"externalId": "apt-pocitos-001",
"title": "Apartamento 2 dormitorios en Pocitos",
"type": "apartment",
"operation": "rent",
"price": 900,
"currency": "USD",
"bedrooms": 2,
"bathrooms": 1,
"area": 72,
"address": "Pocitos, Montevideo",
"description": "Luminoso, piso 5 con terraza y vista al mar.",
"features": ["terraza","amoblado","luminoso"]
}'
Clientes (Leads) Los leads son generados automáticamente cuando un usuario interactúa con el agente virtual por primera vez.
GET /customersOrg Key
Lista leads de la sucursal. Soporta paginación y filtro por fecha.
GET /customers/:idOrg Key
Detalle de un lead: datos de contacto, historial de propiedades consultadas.
Query params — GET /customers Parámetro Tipo Descripción pagenumber opt Página (default: 1). limitnumber opt Registros por página (default: 50, max: 200). fromdate opt Filtrar desde fecha ISO 8601. todate opt Filtrar hasta fecha ISO 8601.
bash copiar
curl "https://api.phylax-ia.com/api/v1/customers?page=1&limit=50&from=2026-05-01" \
-H "Authorization: Bearer <ORG_KEY>"json copiar
{
"ok": true,
"total": 142,
"page": 1,
"customers": [
{
"_id": "6631a2b3c4d5e6f7a8b9c0d2",
"firstName": "Martín",
"lastName": "García",
"phone": "+59899123456",
"email": "martin@email.com",
"botMode": "auto",
"createdAt": "2026-05-01T14:22:10.000Z"
}
]
}
Conversaciones Accedé al historial completo de mensajes entre clientes y el agente virtual.
GET /conversationsOrg Key
Lista conversaciones con filtros por cliente, fecha y estado del bot.
Query params Parámetro Tipo Descripción customer_idstring opt Filtrar por ID de cliente. bot_modestring opt auto · manual — filtra por modo del agente. pagenumber opt Página (default: 1). limitnumber opt Registros por página (default: 50).
bash copiar
curl "https://api.phylax-ia.com/api/v1/conversations?limit=20" \
-H "Authorization: Bearer <ORG_KEY>"
Escalaciones Cuando el agente virtual no puede resolver una consulta, escala a un agente humano. Podés gestionar el handoff desde tu CRM.
GET /escalationsOrg Key
Lista escalaciones activas o históricas.
POST /escalations/:id/acceptOrg Key
Toma una escalación — el agente entra en modo manual.
POST /escalations/:id/releaseOrg Key
Libera la escalación — el agente retoma el modo automático.
Query params — GET /escalations Parámetro Tipo Descripción statusstring opt pending · accepted · released · expired limitnumber opt Máximo de registros (default: 50).
bash copiar
# Tomar una escalación
curl -X POST https://api.phylax-ia.com/api/v1/escalations/6631a2b3.../accept \
-H "Authorization: Bearer <ORG_KEY>"
# Liberar y devolver control al agente virtual
curl -X POST https://api.phylax-ia.com/api/v1/escalations/6631a2b3.../release \
-H "Authorization: Bearer <ORG_KEY>"
Créditos Cada sucursal tiene un balance de créditos. 1 crédito = 1 propiedad activa durante 1 mes. El ciclo se renueva el 1° de cada mes.
GET /creditsOrg Key
Consulta el balance y reservas de crédito de la sucursal.
POST /credits/rechargeOrg Key
Recarga créditos con un pack de pago verificado vía Culqi.
POST /credits/assignEnterprise Key
Transfiere créditos desde la cuenta empresa a una sucursal.
GET /credits — Respuesta json copiar
{
"ok": true,
"credits": {
"balance": 12,
"reserved": 8,
"available": 4,
"cycle_ends": "2026-06-01T00:00:00.000Z"
}
}POST /credits/recharge Parámetro Tipo Descripción packstring req "S" · "M" · "L" — pack de recarga a acreditar. payment_refstring req ID del cargo en Culqi (charge_id). Se valida contra la API de Culqi.
bash copiar
curl -X POST https://api.phylax-ia.com/api/v1/credits/recharge \
-H "Authorization: Bearer <ORG_KEY>" \
-H "Content-Type: application/json" \
-d '{"pack":"M","payment_ref":"ch_test_xxxxxxxxxxxxxxxx"}'El sistema verifica el cargo contra Culqi antes de acreditar. Si el cargo no es exitoso, la recarga se rechaza con un error 402.
Webhooks Phylax envía eventos en tiempo real a tu endpoint cuando ocurren acciones en cualquier sucursal. Todos los payloads incluyen el branch_id para que los enrutes en tu CRM.
Configuración Configurá tu webhook URL desde el panel de administración o contactando a soporte. Tu endpoint debe responder 200 OK en menos de 5 segundos.
Cada entrega incluye el header X-Phylax-Signature con un HMAC-SHA256 firmado con tu Webhook Secret. Verificá siempre la firma antes de procesar.
Verificar firma (Node.js) javascript copiar
const crypto = require('crypto');
function verifyWebhook(rawBody, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// En Express:
app.post('/webhook/phylax', express.raw({ type: 'application/json' }), (req, res) => {
const sig = req.headers['x-phylax-signature'];
if (!verifyWebhook(req.body, sig, process.env.PHYLAX_WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}
const event = JSON.parse(req.body);
// Procesar event.type y event.data...
res.sendStatus(200);
});Eventos disponibles Evento Cuándo Datos principales customer.createdNuevo lead registrado por el agente customer_id, phone, nombre, branch_id message.receivedCliente envía un mensaje por WhatsApp phone, text, timestamp, branch_id message.sentEl agente virtual responde text, timestamp, propiedades mencionadas escalation.triggeredEl agente escala a un humano reason, customer_id, historial, branch_id escalation.releasedEl agente retoma el control tras handoff escalation_id, agent, branch_id visit.createdSe agenda una visita desde el chat customer_id, property_id, fecha, branch_id visit.updatedCambio de estado de una visita status: confirmed · cancelled · completed property.searchedCliente busca por criterios tipo, zona, precio_max, habitaciones credit.lowSaldo menor a 2 propiedades disponibles balance, reserved, branch_id payment.failedUn cargo de recarga fue rechazado por Culqi charge_id, amount, reason, branch_id conversation.closedConversación cerrada sin resolución en 24h customer_id, last_message, branch_id
Ejemplo de payload json copiar
{
"event": "customer.created",
"branch_id": "CARR001",
"timestamp": "2026-05-01T15:30:00.000Z",
"data": {
"customer_id": "6631a2b3c4d5e6f7a8b9c0d2",
"firstName": "Martín",
"lastName": "García",
"phone": "+59899123456",
"source": "whatsapp"
}
}Reintentos Si tu endpoint no responde 200, Phylax reintenta con backoff exponencial: 1 min → 5 min → 15 min → 1h. Después de 4 intentos fallidos, la entrega queda marcada como failed y aparece en el panel de administración para reintento manual.
Rate Limits La API aplica límites por API Key para garantizar estabilidad del servicio.
Business API
300 req/min
Por Org Key o Enterprise Key
Webhook deliveries
Sin límite
Recibís todos los eventos
Cuando superás el límite, la respuesta es 429 Too Many Requests. El header Retry-After indica cuántos segundos esperar.
Errores Todos los errores devuelven JSON con el campo ok: false y un campo error descriptivo.
json copiar
{
"ok": false,
"error": "Crédito insuficiente para activar la propiedad"
}Códigos de estado Código Significado Causa común 200 OK Solicitud exitosa. 201 Created Recurso creado correctamente. 400 Bad Request Body inválido o parámetros faltantes. 401 Unauthorized API Key inválida, expirada o ausente. 402 Payment Required Cargo de Culqi inválido o no exitoso. 403 Forbidden Key sin permisos o sucursal suspendida. 404 Not Found Recurso no encontrado. 409 Conflict Slug o externalId ya existe. 422 Unprocessable Entity Crédito insuficiente para la operación. 429 Too Many Requests Límite de 300 req/min superado. 500 Internal Server Error Error inesperado — contactar soporte.