API pública del CRM: personas, empresas, negocios, tareas y actividades
La API pública del CRM permite que tu propio sistema lea y cambie el CRM de tu organización de QrX: personas, empresas, negocios, embudos, tareas, la cronología de actividad y las notas. Este artículo es para desarrolladores. La URL base es https://api.qr-x.net. Cada llamada necesita Authorization: Bearer <accessToken>. Para el token de acceso, consulta "Inicio rápido para desarrolladores: API pública y webhooks de QrX".
Qué necesitas
Un plan de CRM de QrX que incluya la API pública. La API pública forma parte de Business y Enterprise. Sin ella, una llamada cuya clave tiene los scopes de CRM se rechaza con 402, y una clave sin los scopes de CRM recibe primero 403
CRM_SCOPE_MISSING.Una clave de API (clave de canal de venta) con los ámbitos de CRM marcados; consulta "Crea una clave de API con ámbitos" más abajo.
Los endpoints de tareas también necesitan la función Tareas, y los endpoints de negocios y embudos necesitan la función Negocios en tu plan.
Crea una clave de API con ámbitos
El acceso al CRM nunca se concede de forma predeterminada. Una clave sin restricción (Acceso completo) no tiene acceso al CRM. Debes restringir la clave y marcar tú mismo los ámbitos de CRM.
Ve a Configuración > Negocios > Canales para comerciantes y abre el canal de venta cuya clave quieres usar.
Abre la pestaña Ajustes. El bloque Acceso a la API está bajo el campo Clave API. Necesitas el permiso Gestionar canales para cambiarlo.
Activa Restringir esta clave.
En CRM, marca Leer personas, empresas, negocios y embudos del CRM (ámbito
crm.read) y, si tu sistema debe escribir, Crear y modificar personas, empresas, negocios y notas del CRM (ámbitocrm.write).Haz clic en Guardar acceso a la API, revisa la lista de Deja de funcionar y haz clic en Restringir la clave. Un cambio puede tardar hasta 30 segundos en aplicarse.
Ten cuidado: restringir una clave también desactiva todas las partes que no marques, para las integraciones que funcionan hoy. Si esta clave también crea transacciones, esas siguen funcionando, pero los ámbitos de devoluciones, entrada, stock, compras, logística y tareas deben marcarse de nuevo si la clave los usa. Consulta "Restringe una clave de API (Acceso a la API)".
Ámbitos
crm.read: todas las llamadas GET (embudos, personas, empresas, negocios, tareas, actividades).crm.write: todas las llamadas POST y PUT (crear y cambiar personas, empresas, negocios, tareas y notas, mover un negocio, completar una tarea). Un ámbito de escritura no incluye la lectura: marca ambos cuando necesites ambos.
Un ámbito que falta responde 403 CRM_SCOPE_MISSING.
Obtén un token de acceso
Envía POST /api/v1/auth/token con la cabecera QrX-MerchantChannel-API-Key fijada a tu clave. Usa el token de acceso de la respuesta como token bearer en cada llamada al CRM. Nunca envíes la propia clave de API a los endpoints del CRM.
Endpoints
Todas las rutas empiezan por /api/v1/crm.
Embudos:
GET /pipelines(embudos con sus etapas: id, nombre, tipo y probabilidad).Personas:
GET /people,GET /people/{id},POST /people,PUT /people/{id}.Empresas:
GET /companies,GET /companies/{id},POST /companies,PUT /companies/{id}.Negocios:
GET /deals,GET /deals/{id},POST /deals,PUT /deals/{id},POST /deals/{id}/move.Tareas:
GET /tasks,GET /tasks/{id},POST /tasks,PUT /tasks/{id},POST /tasks/{id}/complete.Actividades:
GET /activities?recordType=person&recordId={id}. recordType esperson,companyodeal.Notas:
POST /notes.
No hay ninguna llamada para eliminar. Eliminar, combinar y borrar registros se hace en PortalX.
Lee listas
Las listas devuelven items, nextCursor y hasMore. Pasa nextCursor como cursor para obtener la página siguiente y detente cuando hasMore sea false. limit va de 1 a 100 y por defecto es 40.
Personas: primero las de actividad más reciente.
qbusca en nombres, direcciones de correo electrónico y números de teléfono. La lista muestra solo el correo electrónico y el teléfono principales;GET /people/{id}devuelve todos los puntos de contacto, etiquetas y campos personalizados.Empresas: primero las de actividad más reciente.
qbusca en nombres y dominios.Negocios: primero los actualizados más recientemente. Filtros:
pipelineId,stageId,status(open,wonolost) yq.Tareas: primero las más nuevas. Filtros:
state(openodone),assigneeUserId,personId,companyIdydealId.
Crea y cambia registros
Idempotency-Key: cada llamada de creación (
POSTde personas, empresas, negocios, tareas y notas) necesita la cabeceraIdempotency-Keycon 8 a 80 caracteres: letras, dígitos y. _ : -. Envía de nuevo la misma clave para reintentar y recibes el primer resultado en lugar de un segundo registro. Usa una clave nueva para cada registro nuevo. Sin una clave válida, la llamada responde 400IDEMPOTENCY_KEY_REQUIRED.version: cada registro lleva una
version. UnPUT, un movimiento de negocio y una finalización de tarea deben enviar la versión que leíste. Si alguien cambió el registro mientras tanto, recibes 409CRM_CONFLICT: lee el registro de nuevo y reintenta con la versión nueva.Persona: los campos incluyen
firstName,lastName,jobTitle,companyId,lifecycleStageId,ownerUserId,language,country,emails,phones,tagIdsycustomFields. Una persona cuya dirección de correo electrónico o número de teléfono ya existe responde 409. Crear personas cuenta para el límite de personas de tu plan.Empresa:
name,domains,vatNumber,chamberNumber, campos de dirección,industry,sizeBand,website,ownerUserId,lifecycleStageId,tagIdsycustomFields.Negocio:
title,pipelineId,stageId,value,currency,expectedCloseOn,probability,ownerUserId,primaryPersonId,personIds,companyId,source,tagIdsycustomFields. Sin embudo ni etapa, el negocio va al embudo predeterminado. UnPUTno puede cambiar la etapa: usaPOST /deals/{id}/movecontoStageId,versiony, para una etapa de pérdida,lostReasonId(y opcionalmentelostNote) cuando el embudo tiene motivos de pérdida.Nota:
POST /notesconrecordType(person, company o deal),recordIdytext. El texto es texto sin formato y se guarda como un párrafo.
Tareas
Crea una tarea con un title y un assigneeUserId de un usuario de tu organización que pueda usar el CRM. Sin asignado, la llamada falla. Otros campos: description, type, priority, dueAt, timeZoneId, reminderAt, recurrence, y los vínculos personId, companyId y dealId. Completar una tarea que se repite devuelve la tarea terminada en task y la siguiente en next.
Actividades y lo que nunca se devuelve
La lista de actividades muestra la cronología de un registro. Las notas incluyen su HTML depurado. Las llamadas, conversaciones, pedidos y devoluciones aparecen solo como metadatos y están marcados como restricted. El contenido de los mensajes privados, los datos de pago y los enlaces de las grabaciones de llamadas nunca están en la API. La API tampoco devuelve nunca negocios de comerciantes, estadísticas de pedidos, datos de consentimiento ni motivos de la puntuación de leads.
Los registros que creas con la API no tienen responsable hasta que fijas ownerUserId.
Límites de frecuencia
Las lecturas (GET) están limitadas a 1200 solicitudes por minuto y las escrituras (POST y PUT) a 300 solicitudes por minuto. Cuando te pasas, la API responde 429 con una cabecera Retry-After. Espera esa cantidad de segundos antes de reintentar.
Errores
Los errores usan el mismo formato de problema que el resto de la API pública: code, detail y un requestId.
400
IDEMPOTENCY_KEY_REQUIRED: falta la cabecera Idempotency-Key o tiene un formato incorrecto.401
UNAUTHORIZED: no hay un token de acceso válido.402: tu plan no incluye la API pública o la función, o
CRM_PLAN_LIMIT_REACHED: se alcanzó un límite del plan, como el número de personas. Mejora el plan en PortalX.403
CRM_SCOPE_MISSING: la clave no tienecrm.readnicrm.write. Marca el ámbito y espera 30 segundos.404
CRM_NOT_FOUND: el registro no existe en tu organización.409
CRM_CONFLICT: la versión está desactualizada (record_changed) o la persona ya existe (duplicate). Lee el registro de nuevo.422
VALIDATION_FAILED: un campo no es válido, por ejemplo una versión que falta, un cursor no válido o una tarea sin asignado. Eldetailindica cuál.
Eventos de webhook para el CRM
QrX también puede avisar a tu sistema cuando algo cambia en el CRM. Crea un webhook en Configuración > Avanzado > Webhooks (consulta "Webhooks y claves de API en PortalX") y marca los eventos de CRM que quieras:
crm/person_createdcrm/deal_createdcrm/deal_movedcrm/deal_woncrm/deal_lostcrm/task_completedcrm/automation_triggered: lo envía la acción de automatización Enviar un evento webhook.
Los eventos del CRM van a todos los webhooks activos de tu organización que marcaron el evento, sea cual sea el canal de venta. La carga solo lleva ids y datos de negocio (por ejemplo personId, dealId, title, pipelineId, stageId, value, currency, ownerUserId), nunca direcciones de correo electrónico, números de teléfono, notas ni texto de mensajes. Cada evento tiene un eventId que se mantiene igual cuando QrX lo entrega de nuevo, así que descarta un evento cuyo eventId ya procesaste. No se envían los eventos de más de 24 horas. Un negocio que se gana o se pierde también envía crm/deal_moved. Las entregas se firman con X-QrX-Signature, consulta el artículo de webhooks.
Postman y OpenAPI
La colección de Postman de la API pública de QrX tiene las carpetas CRM Tasks y CRM Activities. La documentación de la API está en qrx.eu/api.
Problemas frecuentes
403 en cada llamada al CRM. La clave tiene acceso completo o le falta el ámbito. Restringe la clave y marca los ámbitos de CRM.
402 en cada llamada al CRM. Tu plan no incluye la API pública del CRM. Forma parte de Business y Enterprise.
409 al actualizar. Lee el registro de nuevo y envía su
versionactual.Creación de tarea rechazada. Comprueba que
assigneeUserIdpertenezca a tu organización y que el usuario pueda usar el CRM.Registros duplicados tras un reintento. Reutiliza la misma Idempotency-Key para reintentar el mismo registro.
Cuándo contactar con nuestro equipo de soporte
Contacta con el soporte de QrX en [email protected] cuando un ámbito marcado siga rechazándose más de un minuto después de guardar, o para incidencias en producción. Incluye el ID de la solicitud, el endpoint y la hora, nunca tu clave de API ni tu token de acceso.
