API para desarrolladores
Versión 1 · openapi.json (OpenAPI 3.1)
Con la API, n8n, Make, Zapier o un agente de IA pueden crear leads, mover negocios, programar tareas y actividades, consultar el inventario y la disponibilidad de unidades, y responder en la Bandeja. Importa el documento OpenAPI en tu herramienta (Postman, Make, el nodo HTTP de n8n…) para tener todas las rutas.
Tokens
- Un administrador crea el token en Configuración → Integraciones → n8n y API, con un nombre, los permisos que necesita y, si quieres, un vencimiento. El token se muestra una sola vez.
- Cada llamada lleva la cabecera
Authorization: Bearer np_…y envía y recibe JSON. URL base:https://app.novoprospect.io/api/v1 - El token es de una empresa: solo ve y cambia los datos de esa empresa. Lo que hace queda en el historial con el nombre del token.
curl "https://app.novoprospect.io/api/v1/contactos?q=ana" \ -H "Authorization: Bearer np_…"
Permisos
contacts:read | Ver contactos y leads |
contacts:write | Crear y editar contactos, notas y etiquetas |
deals:read | Ver negocios y embudos |
deals:write | Crear negocios, moverlos de etapa, marcarlos perdidos y agregar notas |
properties:read | Ver propiedades, proyectos y disponibilidad de unidades |
tasks:read | Ver tareas |
tasks:write | Crear, completar y reasignar tareas |
activities:read | Ver actividades (llamadas, visitas, reuniones) |
activities:write | Crear y completar actividades |
inbox:read | Ver canales, conversaciones y mensajes de la empresa |
inbox:write | Responder, asignar y cambiar el estado de conversaciones |
users:read | Ver los usuarios de la empresa |
webhooks:manage | Crear y borrar suscripciones a eventos (Zapier, Make) |
Límites, listas y errores
- Hasta 120 peticiones por minuto por token. Las respuestas traen
RateLimit-Limit,RateLimit-RemainingyRateLimit-Reset; al pasarte, 429 conRetry-After. - Las listas usan
?limit=y?offset=y responden{ data, total, limit, offset, hasMore }. - Los errores responden
{ "error": "texto", "code": "not_found", "requestId": "…" }. Elcodeno cambia; el texto puede cambiar. Códigos:invalid_request,unauthorized,token_expired,forbidden,insufficient_scope,api_paused,not_found,conflict,unprocessable,rate_limited,internal_error. - Fechas de tareas y actividades en hora de República Dominicana:
YYYY-MM-DDyHH:MM.
Privacidad
Solo se exponen los canales de la empresa: las conversaciones de los canales personales de los agentes nunca salen de NovoProspect. Las propiedades no incluyen comisiones, notas privadas ni datos del propietario, y un negocio no se puede marcar Ganado desde la API (eso abre el cierre y la comisión en el CRM).
Webhooks
NovoProspect avisa a tu URL cuando pasa algo: un POST JSON con { id, event, createdAt, data }. En data llega el registro con los mismos campos que la API (en el OpenAPI, sección webhooks, está el cuerpo de cada evento).
- Se crean en Integraciones → n8n y API o por la API (
POST /webhooks, permisowebhooks:manage), que es lo que usan Zapier y Make: la suscripción se crea al activar el flujo y se borra al apagarlo o si tu URL responde410. - Cabeceras:
X-NovoProspect-Event,X-NovoProspect-Delivery(id de la entrega, el mismo en cada reintento: úsalo para no procesarla dos veces),X-NovoProspect-TimestampyX-NovoProspect-Signature=sha256=HMAC-SHA256 con el secreto del webhook detimestamp + "." + cuerpo. - Responde 2xx en menos de 10 segundos. Si no, se reintenta a los 1 min, 5 min, 30 min, 2 h, 12 h. Tras 15 entregas fallidas seguidas el webhook se pausa y se avisa al administrador. Cada entrega queda 30 días en el registro, con su botón «Reenviar».
- Solo salen datos de la empresa: nada de los canales personales de los agentes ni de comisiones.
lead.created | Lead nuevo (formularios, Meta, API, Bandeja o a mano) | Contactos |
contact.updated | Contacto editado | Contactos |
deal.created | Negocio nuevo | Negocios y ventas |
deal.stage_changed | Negocio cambió de etapa | Negocios y ventas |
deal.won | Negocio ganado | Negocios y ventas |
deal.lost | Negocio perdido | Negocios y ventas |
sale.confirmed | Venta confirmada | Negocios y ventas |
invoice.paid | Factura cobrada por completo | Finanzas |
task.created | Tarea nueva | Tareas y actividades |
task.completed | Tarea completada | Tareas y actividades |
task.due | Tarea llegó a su fecha y hora | Tareas y actividades |
activity.created | Actividad programada | Tareas y actividades |
message.received | Mensaje del cliente | Bandeja |
message.created | Mensaje nuevo (recibido, enviado o nota) | Bandeja |
conversation.created | Conversación nueva | Bandeja |
conversation.status_changed | Cambio de estado (abierta, con bot, pospuesta, resuelta) | Bandeja |
conversation.assigned | Asignación de agente | Bandeja |
Servidor MCP
Para Claude, ChatGPT, Cursor, n8n y cualquier cliente MCP: https://app.novoprospect.io/mcp (Streamable HTTP, sin estado). Se entra con OAuth 2.1 (registro dinámico y PKCE: así lo hacen los conectores de Claude.ai y ChatGPT; lo aprueba un administrador) o con un token de la API en Authorization: Bearer np_…. En los dos casos, con los mismos permisos, límites y privacidad que la API: tools/list muestra solo las herramientas que el token puede usar, y cada herramienta llama a la ruta de la API del mismo nombre.
Claude.ai y ChatGPT (conector personalizado)
Claude.ai: Configuración → Conectores → Agregar conector personalizado ChatGPT: Configuración → Conectores (modo desarrollador) → Crear URL: https://app.novoprospect.io/mcp Sin token: se abre NovoProspect para iniciar sesión como administrador y elegir los permisos.
Claude Code
claude mcp add --transport http novoprospect https://app.novoprospect.io/mcp \ --header "Authorization: Bearer np_…"
Cursor, Windsurf y otros (mcp.json)
{
"mcpServers": {
"novoprospect": {
"url": "https://app.novoprospect.io/mcp",
"headers": {
"Authorization": "Bearer np_…"
}
}
}
}n8n (nodo MCP Client Tool)
Endpoint: https://app.novoprospect.io/mcp Server Transport: HTTP Streamable Authentication: Bearer Auth → el token np_…
quien_soy | Empresa y token conectados | cualquier token |
listar_usuarios | Usuarios de la empresa | users:read |
buscar_contactos | Buscar contactos y leads | contacts:read |
ver_contacto | Ver un contacto | contacts:read |
crear_lead | Crear un lead | contacts:write |
editar_contacto | Editar un contacto | contacts:write |
nota_contacto | Nota en el historial del contacto | contacts:write |
etiquetar_contacto | Agregar o quitar etiquetas | contacts:write |
ver_embudos | Embudos y etapas | deals:read |
buscar_negocios | Buscar negocios | deals:read |
ver_negocio | Ver un negocio | deals:read |
crear_negocio | Crear un negocio | deals:write |
mover_negocio | Mover un negocio de etapa | deals:write |
estado_negocio | Marcar perdido o reabrir | deals:write |
nota_negocio | Nota en el historial del negocio | deals:write |
buscar_propiedades | Buscar propiedades y proyectos | properties:read |
ver_propiedad | Ficha de una propiedad o proyecto | properties:read |
unidades_proyecto | Unidades de un proyecto | properties:read |
ver_unidad | Ver una unidad | properties:read |
listar_tareas | Listar tareas | tasks:read |
ver_tarea | Ver una tarea | tasks:read |
crear_tarea | Crear una tarea | tasks:write |
editar_tarea | Editar, completar o reasignar una tarea | tasks:write |
listar_actividades | Listar actividades | activities:read |
ver_actividad | Ver una actividad | activities:read |
programar_actividad | Programar una llamada, visita o reunión | activities:write |
editar_actividad | Reprogramar o completar una actividad | activities:write |
listar_canales | Canales de la Bandeja | inbox:read |
listar_conversaciones | Conversaciones de la Bandeja | inbox:read |
ver_conversacion | Ver una conversación | inbox:read |
historial_mensajes | Historial de mensajes | inbox:read |
responder_conversacion | Responder al cliente o dejar nota privada | inbox:write |
asignar_conversacion | Asignar una conversación | inbox:write |
estado_conversacion | Cambiar el estado de una conversación | inbox:write |
Referencia
Cuenta
GET | /me — Probar el tokenDevuelve la empresa y el nombre del token. | cualquier token |
GET | /usuarios — Usuarios de la empresaPara asignar por id o por correo. | users:read |
Contactos
GET | /contactos — Buscar contactosParámetros: q, phone, email, type, ownerEmail, limit, offset | contacts:read |
POST | /contactos — Crear un leadSi ya existe (mismo teléfono o correo) no se duplica: devuelve 200 con isNew false. Con "deal" crea también el negocio (necesita deals:write). | contacts:write |
GET | /contactos/{id} — Ver un contactoCon su agente y sus negocios. | contacts:read |
PATCH | /contactos/{id} — Editar un contacto | contacts:write |
POST | /contactos/{id}/notas — Nota en el historial | contacts:write |
POST | /contactos/{id}/etiquetas — Agregar o quitar etiquetas | contacts:write |
Negocios
GET | /embudos — Embudos y etapasLas etapas con confirmsSale confirman la venta: la API no mueve negocios a ellas. | deals:read |
GET | /negocios — Buscar negociosParámetros: contactId, pipelineId, stageId, status, q, ownerEmail, limit, offset | deals:read |
POST | /negocios — Crear un negocio | deals:write |
GET | /negocios/{id} — Ver un negocioCon contacto, etapa, agente e historial reciente. | deals:read |
POST | /negocios/{id}/mover — Mover de etapa | deals:write |
POST | /negocios/{id}/estado — Perdido o reabrirGanado solo desde el CRM (abre el cierre y la comisión). | deals:write |
POST | /negocios/{id}/notas — Nota en el historial | deals:write |
Propiedades
GET | /propiedades — Buscar inventarioEn los proyectos, precio y habitaciones se comparan con sus unidades disponibles. Parámetros: q, kind, category, operation, city, sector, province, minPrice, maxPrice, currency, bedrooms, status, limit, offset | properties:read |
GET | /propiedades/{id} — Ficha para el clientePor id o por código. Sin comisiones, notas privadas ni datos del propietario. Parámetros: unidades | properties:read |
GET | /propiedades/{id}/unidades — Disponibilidad de un proyectoParámetros: status, bedrooms, maxPrice, limit, offset | properties:read |
GET | /unidades/{id} — Ver una unidadPara confirmar que sigue disponible antes de ofrecerla. | properties:read |
Tareas y actividades
GET | /tareas — Listar tareasParámetros: done, ownerEmail, contactId, dealId, dueFrom, dueTo, limit, offset | tasks:read |
POST | /tareas — Crear una tareaSi se asigna, al agente le llega a la campana. | tasks:write |
GET | /tareas/{id} — Ver una tarea | tasks:read |
PATCH | /tareas/{id} — Editar, completar o reasignarAl completar una tarea que se repite se crea la siguiente (nextTaskId). | tasks:write |
GET | /actividades — Listar actividadesParámetros: from, to, done, type, ownerEmail, contactId, dealId, limit, offset | activities:read |
POST | /actividades — Programar una actividadQueda en el historial del negocio y del contacto y en el Google Calendar del agente si lo tiene conectado. | activities:write |
GET | /actividades/{id} — Ver una actividad | activities:read |
PATCH | /actividades/{id} — Reprogramar o completar | activities:write |
Bandeja
GET | /canales — Canales de la empresaLos canales personales de los agentes nunca se exponen. | inbox:read |
GET | /conversaciones — Listar conversacionesMás recientes primero. Solo canales de la empresa. Parámetros: status, channelId, contactId, lastMessageBefore, lastMessageAfter, lastIncomingBefore, limit, offset | inbox:read |
GET | /conversaciones/{id} — Ver una conversaciónCon contacto, agente y últimos 50 mensajes. | inbox:read |
GET | /conversaciones/{id}/mensajes — Historial de mensajesMás antiguos primero. Para ir hacia atrás, pasa nextBefore en ?before=. Parámetros: before, limit | inbox:read |
POST | /conversaciones/{id}/mensajes — Responder o dejar nota privadaattachments: direcciones públicas https (hasta 10, 16 MB c/u). También acepta multipart/form-data con content, private y los archivos en attachments. Responder no saca la conversación del bot: usa /estado con open. | inbox:write |
POST | /conversaciones/{id}/asignar — Asignar a un agente | inbox:write |
POST | /conversaciones/{id}/estado — Cambiar estadoDe bot a open pasa la conversación a un humano. | inbox:write |
POST | /conversaciones/{id}/escribiendo — Mostrar «escribiendo…»En los canales que lo permiten. | inbox:write |
Webhooks
GET | /eventos — Eventos disponiblesLos cuerpos de cada evento están en la sección webhooks de este documento. | cualquier token |
GET | /eventos/{evento}/ejemplo — Ejemplos de un eventoLos últimos 3 envíos reales de la empresa o, si aún no hay, uno con datos inventados (sample: true). Para mapear campos en Zapier o Make. | webhooks:manage |
GET | /webhooks — Suscripciones creadas por la APILas creadas en Integraciones no aparecen aquí. | webhooks:manage |
POST | /webhooks — Suscribirse a eventos (REST Hooks)Devuelve el secreto de firma una sola vez. Si la URL responde 410, la suscripción se borra sola. Al revocar el token se borran sus suscripciones. | webhooks:manage |
DELETE | /webhooks/{id} — Borrar una suscripción | webhooks:manage |