Business API

Developer Portal

Integra el Agente Virtual de Phylax en tu CRM inmobiliario. Gestiona sucursales, propiedades, leads y créditos desde tu propia plataforma.

REST / JSONWebhooks firmados300 req/minHTTPS

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
# 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 consolidadas
Org API Key
Scope: Sucursal
  • Gestionar propiedades
  • Ver leads y conversaciones
  • Gestionar créditos propios
  • Ver y gestionar escalaciones
Nunca expongas las API Keys en el frontend o en repositorios públicos. Usá siempre variables de entorno del lado del servidor.

Header requerido

http
Authorization: Bearer <API_KEY>

Base URL

text
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ámetroTipoDescripción
namestringreqNombre visible de la sucursal.
slugstringreqIdentificador único, solo minúsculas y guiones.
branchIdstringreqID de la sucursal en tu CRM. Se incluye en todos los webhooks.
bash
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
{
  "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
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ámetroTipoDescripción
externalIdstringreqID único en tu CRM. Permite hacer upsert sin duplicados.
titlestringreqTítulo de la publicación.
typestringreqapartment · house · office · land · garage · other
operationstringreqsale · rent
pricenumberreqPrecio numérico sin símbolo.
currencystringoptUSD (default) · UYU
bedroomsnumberoptCantidad de dormitorios.
bathroomsnumberoptCantidad de baños.
areanumberoptSuperficie en m².
addressstringoptDirección o zona (ej: Pocitos, Montevideo).
descriptionstringoptDescripción libre para el agente virtual.
imageUrlstringoptURL de imagen principal.
listingUrlstringoptURL de la publicación en tu portal.
featuresstring[]optAmenidades: ["piscina","garage","parrilla"]
bash
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ámetroTipoDescripción
pagenumberoptPágina (default: 1).
limitnumberoptRegistros por página (default: 50, max: 200).
fromdateoptFiltrar desde fecha ISO 8601.
todateoptFiltrar hasta fecha ISO 8601.
bash
curl "https://api.phylax-ia.com/api/v1/customers?page=1&limit=50&from=2026-05-01" \
  -H "Authorization: Bearer <ORG_KEY>"
json
{
  "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ámetroTipoDescripción
customer_idstringoptFiltrar por ID de cliente.
bot_modestringoptauto · manual — filtra por modo del agente.
pagenumberoptPágina (default: 1).
limitnumberoptRegistros por página (default: 50).
bash
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ámetroTipoDescripción
statusstringoptpending · accepted · released · expired
limitnumberoptMáximo de registros (default: 50).
bash
# 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
{
  "ok": true,
  "credits": {
    "balance":  12,
    "reserved":  8,
    "available": 4,
    "cycle_ends": "2026-06-01T00:00:00.000Z"
  }
}

POST /credits/recharge

ParámetroTipoDescripción
packstringreq"S" · "M" · "L" — pack de recarga a acreditar.
payment_refstringreqID del cargo en Culqi (charge_id). Se valida contra la API de Culqi.
bash
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
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

EventoCuándoDatos principales
customer.createdNuevo lead registrado por el agentecustomer_id, phone, nombre, branch_id
message.receivedCliente envía un mensaje por WhatsAppphone, text, timestamp, branch_id
message.sentEl agente virtual respondetext, timestamp, propiedades mencionadas
escalation.triggeredEl agente escala a un humanoreason, customer_id, historial, branch_id
escalation.releasedEl agente retoma el control tras handoffescalation_id, agent, branch_id
visit.createdSe agenda una visita desde el chatcustomer_id, property_id, fecha, branch_id
visit.updatedCambio de estado de una visitastatus: confirmed · cancelled · completed
property.searchedCliente busca por criteriostipo, zona, precio_max, habitaciones
credit.lowSaldo menor a 2 propiedades disponiblesbalance, reserved, branch_id
payment.failedUn cargo de recarga fue rechazado por Culqicharge_id, amount, reason, branch_id
conversation.closedConversación cerrada sin resolución en 24hcustomer_id, last_message, branch_id

Ejemplo de payload

json
{
  "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
{
  "ok":    false,
  "error": "Crédito insuficiente para activar la propiedad"
}

Códigos de estado

CódigoSignificadoCausa común
200OKSolicitud exitosa.
201CreatedRecurso creado correctamente.
400Bad RequestBody inválido o parámetros faltantes.
401UnauthorizedAPI Key inválida, expirada o ausente.
402Payment RequiredCargo de Culqi inválido o no exitoso.
403ForbiddenKey sin permisos o sucursal suspendida.
404Not FoundRecurso no encontrado.
409ConflictSlug o externalId ya existe.
422Unprocessable EntityCrédito insuficiente para la operación.
429Too Many RequestsLímite de 300 req/min superado.
500Internal Server ErrorError inesperado — contactar soporte.
Phylax — Agentes Virtuales para Inmobiliarias
Developer Portal · Business API v1