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. O conectá Phylax a Claude y ChatGPT con el conector MCP.

REST / JSONWebhooks firmadosMCP + OAuth 2.1300 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."
  }'

Conector MCP

Phylax tiene un servidor MCP (Model Context Protocol) remoto. Lo conectás a Claude o ChatGPT y el modelo trabaja dentro de tu cuenta: carga el catálogo, entrena al Agente Virtual, arma el sitio y lee métricas y charlas. No usa API Keys: cada persona entra con su usuario de Phylax por OAuth 2.1 y elige qué permisos le da a la conexión.

Servidor
api.phylax-ia.com/mcp
Transporte
Streamable HTTP
Autenticación
OAuth 2.1 + PKCE
Disponible en
Pro y Personalizado

Conectarlo

Claude (web y Desktop)
Configuración → Conectores → Agregar conector personalizado. Pegá https://api.phylax-ia.com/mcp y tocá Conectar: se abre Phylax para que inicies sesión y aceptes los permisos.
Claude Code
Agregalo con el comando de abajo y después corré /mcp → Authenticate.
ChatGPT
Con el modo desarrollador activado: Configuración → Conectores → Crear. Usá la misma URL y autenticación OAuth.
bash
claude mcp add --transport http phylax https://api.phylax-ia.com/mcp
Las conexiones activas se ven y se revocan desde el CRM, en Administración → Conexiones. Revocar corta el acceso al instante.

Permisos

Se eligen en la pantalla de autorización. Un administrador puede darlos todos; un asesor, solo leer y operar.

ParámetroTipoDescripción
leerscopeoptVer el CRM, el conocimiento del Agente, las métricas y las charlas.
operarscopeoptTrabajar el CRM: clientes, notas, visitas y consultas. Los mensajes a clientes siempre piden confirmación.
entrenarscopeoptProponer cambios al Agente Virtual: reglas, conocimiento, catálogo y sitio. Quedan como borrador.
publicarscopeoptAplicar los borradores al Agente y al sitio, con confirmación. Se puede deshacer.
adminscopeoptVer el estado de los canales y las conexiones.

Borradores: nada cambia sin tu OK

1 · Propone
Reglas, datos críticos, tono o secciones del sitio quedan como borrador.
2 · Prueba
probar_agente responde como lo haría el Agente con el borrador aplicado.
3 · Publica
publicar_borrador con confirmar=true. Queda en la bitácora.
4 · Deshace
deshacer_publicacion vuelve exactamente a la versión anterior.

Lo que le podés pedir

Se le habla en lenguaje natural; el modelo elige qué herramientas usar. Algunos ejemplos:

“Cargá estos 120 productos del Excel al catálogo”
“Leé las charlas de la semana y proponé reglas nuevas”
“¿Cuántas consultas entraron hoy y cuáles quedaron sin respuesta?”
“Armame el sitio con la info de nuestra web vieja”
“Probá cómo responde el Agente si le preguntan por financiación”
“Pasame los negocios que se están enfriando y prepará un mensaje para cada uno”

Herramientas

Cada herramienta pide un permiso. La conexión solo ve las que su permiso habilita.

Conocer la cuenta
perfil_organizacionRubro, plan, canal y cómo está configurado el Agente Virtual, el sitio y los límites.leer
estado_onboardingChecklist del alta: qué está, qué falta y cuál es el próximo paso.leer
metricas_agenteLeads, visitas o citas agendadas, embudo y negocios en riesgo de un período.leer
escalacionesConsultas que el Agente derivó al equipo porque no pudo resolverlas.leer
evidencia_insightsObjeciones, quejas y elogios de las charlas reales, con frases textuales.leer
estado_canalesEstado de WhatsApp, chat web e Instagram/Facebook.admin
Entrenar al Agente Virtual
buscar_conocimientoQué sabe el Agente sobre un tema (búsqueda semántica).leer
ver_conocimientoFuentes de conocimiento cargadas, con su estado y errores.leer
cargar_conocimientoCarga texto o preguntas y respuestas como conocimiento.entrenar
rastrear_webLee el sitio web de la empresa y lo carga como conocimiento.entrenar
auditar_conocimientoQué le falta saber: categorías sin fuente y preguntas que hoy no puede responder.entrenar
guardar_dato_criticoHechos que responde siempre: horarios, zonas, formas de pago, políticas.entrenar
ver_reglas · ver_datos_criticosReglas y datos críticos, publicados y en borrador.leer
proponer_reglaConvierte un pedido en lenguaje natural en una regla, sin guardarla.entrenar
guardar_regla · editar_regla · quitar_reglaAltas, cambios y bajas de reglas, en borrador.entrenar
ajustar_comportamientoNombre, tono, idioma, zona horaria, horario de atención y aviso de escalaciones.entrenar
ver_prompt_resueltoEl prompt final que recibe el Agente, para entender cómo se comporta.leer
Probar antes de publicar
probar_agenteSimula el mensaje de un cliente y devuelve la respuesta del Agente con los borradores aplicados.entrenar
evaluar_casosCorre hasta 10 casos de prueba y marca alertas: dice "bot", da precios cuando no debe, se extiende de más.entrenar
Catálogo
ver_catalogoLista y busca el catálogo por código, título, zona, familia o categoría.leer
cargar_catalogoCarga o actualiza hasta 500 ítems por llamada (por ejemplo, desde un Excel).entrenar
editar_item_catalogoCambia precio, estado o datos de un ítem.entrenar
quitar_item_catalogoQuita un ítem, siempre con confirmación. No hay borrado masivo.entrenar
Sitio web
ver_sitioURL, secciones, chat web, SEO y el borrador pendiente.leer
generar_sitioGenera inicio, quiénes somos y preguntas frecuentes a partir del conocimiento.entrenar
editar_seccion_sitioEdita, agrega o quita secciones del sitio.entrenar
ajustar_sitioPrende o apaga el sitio, SEO, chat web y botón de WhatsApp.entrenar
Borradores y versiones
ver_borradoresCambios pendientes y últimas publicaciones.leer
publicar_borradorAplica los borradores en vivo. Sin confirmar=true solo muestra qué se publicaría.publicar
descartar_borradorDescarta borradores pendientes.entrenar
deshacer_publicacionVuelve a la versión anterior a la última publicación.publicar
Trabajar el CRM (herramientas del Copiloto)
pendientes_del_diaConsultas sin responder, visitas de hoy y visitas sin resultado.leer
buscar_clientes · ver_cliente · leer_charlaEncuentra clientes, abre su ficha y lee la charla con el Agente.leer
agenda · visitas_sin_resultadoVisitas por rango de fechas y las que quedaron sin cargar resultado.leer
negocios_en_riesgo · oportunidadesClientes que se enfrían y clientes con ítems nuevos que les sirven.leer
consultas · formularios_pendientes · preguntas_portalesConsultas derivadas, formularios de la web y preguntas de Mercado Libre.leer
buscar_propiedades · equipoCatálogo con filtros y el equipo, para asignar o derivar.leer
crear_cliente · editar_cliente · crear_notaAltas y cambios en la ficha del cliente.operar
agendar_visita · actualizar_visitaAgenda, reprograma, confirma, cancela o carga el resultado de una visita.operar
gestionar_consulta · pausar_agente_virtualToma, cierra o asigna consultas; pausa al Agente en una charla.operar
escribir_al_cliente · enviar_propiedades · responder_pregunta_portalPrepara mensajes por WhatsApp o respuestas en Mercado Libre. No se manda nada sin confirmar.operar
confirmar_envio · cancelar_envioManda o descarta lo que quedó esperando confirmación.operar
Conexiones
conexionesQuién conectó Claude o ChatGPT, con qué permisos y cuándo lo usó.admin
revocar_conexionCorta una conexión, con confirmación.admin

Prompts y recursos

Prompts
Guías paso a paso listas para usar: phylax:onboarding (alta completa) · phylax:revision-semanal (mejorar al Agente con las charlas de la semana) · phylax:cargar-catalogo · phylax:armar-sitio · phylax:resumen-del-dia
Recursos
phylax://org/perfil · phylax://onboarding/estado · phylax://agente/reglas · phylax://agente/datos-criticos · phylax://conocimiento/fuentes · phylax://metricas/mes

Para clientes MCP propios

Claude y ChatGPT descubren todo solos. Si armás tu propio cliente: registro dinámico (RFC 7591, clientes públicos), PKCE S256 obligatorio, access token de 1 hora y refresh de 30 días que rota en cada uso.

GET/.well-known/oauth-authorization-serverPública
Metadata del servidor de autorización.
GET/.well-known/oauth-protected-resourcePública
Metadata del recurso protegido (/mcp).
POST/oauth/registerPública
Registro dinámico de clientes.
GET/oauth/authorizeUsuario
Inicia la autorización: lleva al usuario a iniciar sesión y aceptar los permisos.
POST/oauth/tokenPKCE
Canje del código (authorization_code) y renovación (refresh_token).
POST/oauth/revokeToken
Revoca un access o refresh token.
POST/mcpBearer
Servidor MCP (JSON-RPC sobre HTTP, sin sesión). Sin token responde 401 con WWW-Authenticate.

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"]
  }'

Pedidos (tienda online)

Los pedidos de la tienda del sitio y los que arma el Agente Virtual por WhatsApp. Cambiar el estado le avisa al comprador.

GET/ordersOrg Key
Lista pedidos. Filtros: status (pendiente_pago, confirmado, preparando, listo_retiro, enviado, entregado, cancelado, vencido), payment (pendiente, aprobado, rechazado, reembolsado), created_after, page, limit.
GET/orders/:idOrg Key
Detalle de un pedido por id o por número (N-0042): ítems con variante, entrega, totales y pago.
PATCH/orders/:idOrg Key
Cambia el estado ({ "status": "enviado", "note": "…" }) o marca cobrado un pedido por transferencia, contra entrega o al retirar ({ "paid": true }).

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
order.createdNuevo pedido en la tienda o por el Agenteid, numero, items, entrega, totales, pago
order.paidSe acreditó el pago de un pedidoid, numero, totales, pago.pagadoAt
order.status_changedUn pedido cambió de estadoid, numero, estado, entrega

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
Conector MCP
120 req/min
Por conexión (token OAuth)

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 · MCP