Crear o Resolver Tercero [BETA]
Funcionalidad en desarrollo y pruebas: este servicio está disponible en el ambiente de pruebas y todavía no debe usarse en producción. El funcionamiento, los campos y los mensajes de error pueden cambiar antes del despliegue definitivo.
Este servicio registra un tercero en nuby —es decir, una persona natural o jurídica con la que tu inmobiliaria se relaciona: un cliente, un propietario, un proveedor, un arrendatario— y le asigna sus tipos o roles dentro del sistema. Si el documento ya existe en nuby, no se crea un duplicado: el servicio devuelve el tercero que ya estaba registrado. Si no existe, lo crea en ese mismo momento.
Es el servicio que necesitas cuando tu plataforma maneja sus propios clientes y quiere que nuby tenga la misma información, sin pedirle al usuario que vuelva a digitar los datos en dos sistemas.
¿Para qué sirve este servicio?
Los casos de uso más frecuentes de este servicio son:
- Sincronizar los clientes de tu plataforma con nuby, sin pedirle al usuario que vuelva a digitar los datos en dos sistemas.
- Crear una factura cuando solo conoces el documento del tercero, no su identificador interno.
- Garantizar que un tercero exista antes de usarlo en otro proceso, sin arriesgarte a duplicarlo.
¿Ya tienes el tercero_id? Si tu sistema ya guardó el identificador interno de nuby, puedes seguir usándolo directamente en los demás servicios. Si solo tienes el documento, este es el servicio que lo resuelve.
1. El Endpoint (La dirección web)
Método y dirección
| Dato | Valor |
|---|---|
| Método | POST |
| Recurso | /third-parties |
| Cuerpo de la petición | Obligatorio: objeto JSON con los datos del tercero (sección 2) |
Apunta tu sistema a la siguiente dirección de petición POST:
POST https://{{instancia}}/service/v2/public/third-parties
¿Qué debes colocar en {{instancia}}? La dirección web principal con la que ingresas a tu plataforma, incluyendo la terminación .nuby.app o .arrendasoft.co. Por ejemplo, si entras en inmobiliaria.nuby.app, esa es tu instancia. No incluyas https:// ni barras diagonales al final.
Encabezados requeridos
| Encabezado | Valor |
|---|---|
Content-Type |
application/json |
Authorization |
Bearer <token>, con el token obtenido en el servicio Login. |
Permiso requerido (scope)
El cliente OAuth con el que se genera el token debe tener habilitado el permiso third-parties:create. Si el token es válido pero al cliente le falta ese permiso, la respuesta es 403 con el código RECURSO_NO_AUTORIZADO.
Si aún no tienes un token, consulta la página Login del libro API nuby V2. Allí se explica cómo identificarte y cómo se construye el encabezado Authorization.
2. La Petición (¿Qué debes enviarnos?)
El cuerpo debe ser un objeto JSON. La raíz del JSON lleva la referencia de idempotencia y, al mismo nivel, los datos del tercero.
Campos obligatorios
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
referencia_externa |
texto | Sí | Identificador único de tu operación. Es la llave de idempotencia: sirve para que un reintento no cree un segundo tercero. No puede venir vacío. |
documento |
texto | Sí | Número de documento o NIT del tercero. Es la llave con la que nuby decide si el tercero ya existe. Solo admite letras y números (sin puntos, guiones ni espacios). |
tipo_doc_id |
entero | Sí | Identificador del tipo de documento en la maestra de nuby (por ejemplo, NIT o cédula). Debe ser un número mayor que cero y existir en el sistema. |
nombre1 |
texto | Sí | Primer nombre, o la razón social completa si es una empresa. nuby lo guarda en mayúsculas. |
direccion1 |
texto | Sí | Dirección principal del tercero. |
municipio_id |
entero | Sí | Identificador del municipio. Debe ser un número mayor que cero y existir en la maestra de municipios. |
tipo_tercero_id o tipos[] |
entero / arreglo | Sí (al menos uno) | Rol o roles del tercero. Debes enviar al menos uno de los dos campos (ver el apartado "Cómo se envían los tipos de tercero", más abajo en esta sección). |
Importante: los datos obligatorios se exigen cuando el tercero no existe. Si el documento ya está registrado, nuby lo resuelve y no valida ni actualiza el resto de los campos.
Campos opcionales
| Grupo | Campos |
|---|---|
| Identidad | nombre2, apellido1, apellido2, persona, sexo, fecha_nacimiento, dv, tratamiento_id |
| Contacto | direccion2, telefono1, telefono2, fax, email, email_cumpleanos, codigo_postal |
| Información tributaria | tipo_persona_id, regimen_id, resp_fiscal_id, autoretenedor, autore_res, gran_contribuyente, gran_contr_res, aplica_documento_soporte |
| Información bancaria | banco_id, intTipoCuentaB, no_cuenta |
| Representación legal | representante, representante_legal, certificado |
| Tipos adicionales | tipos[] |
Campos opcionales: tipo y descripción
Los campos opcionales se guardan si vienen, pero ninguno reemplaza a un obligatorio. Los identificadores se validan contra las maestras y, si no existen, la respuesta es 422.
| Campo | Tipo | Efecto |
|---|---|---|
nombre2 |
texto | Segundo nombre. Se almacena en mayúsculas. |
apellido1 |
texto | Primer apellido. Se almacena en mayúsculas. |
apellido2 |
texto | Segundo apellido. Se almacena en mayúsculas. |
persona |
entero | 1 persona natural; 2 persona jurídica. Activa la validación de coherencia con el tipo de documento. |
sexo |
texto | Se acepta al crear, pero no se devuelve en el detalle del tercero. |
fecha_nacimiento |
fecha | Se acepta al crear, pero no se devuelve en el detalle. |
dv |
texto | Dígito de verificación del documento. Se devuelve en el detalle. |
tratamiento_id |
entero | Identificador de la maestra de tratamiento. Se valida contra el catálogo. |
direccion2 |
texto | Dirección secundaria. Se devuelve en el detalle. |
telefono1, telefono2 |
texto | Teléfonos del tercero. Se devuelven en el detalle. |
fax |
texto | Fax del tercero. Se devuelve en el detalle. |
email |
texto | Correo principal. No se valida su formato; se devuelve en el detalle. |
email_cumpleanos |
texto | Correo alterno para cumpleaños. Se devuelve en el detalle. |
codigo_postal |
texto | Código postal. Se devuelve en el detalle. |
tipo_persona_id |
entero | Identificador de la maestra de tipo de persona. Se valida contra el catálogo. |
regimen_id |
entero | Régimen tributario. Se valida contra el catálogo. |
resp_fiscal_id |
entero | Responsabilidad fiscal. Se valida contra el catálogo. |
autoretenedor |
indicador | Marca de autorretenedor. Se devuelve en el detalle. |
autore_res |
indicador | Se acepta al crear; el detalle no lo devuelve. |
gran_contribuyente |
indicador | Marca de gran contribuyente. Se devuelve en el detalle. |
gran_contr_res |
indicador | Se acepta al crear; el detalle no lo devuelve. |
aplica_documento_soporte |
indicador | Marca de documento soporte. Se devuelve en el detalle. |
banco_id |
entero | Banco del tercero. Se valida contra el catálogo y se devuelve en el detalle. |
intTipoCuentaB |
entero | Tipo de cuenta bancaria. Se devuelve en el detalle. |
no_cuenta |
texto | Número de cuenta bancaria. Se devuelve en el detalle. |
representante |
texto | Se acepta al crear; el detalle no lo devuelve. |
representante_legal |
texto | Se acepta al crear; el detalle no lo devuelve. |
certificado |
texto / indicador | Se acepta al crear; el detalle no lo devuelve. |
tipos[] |
arreglo o cadena | Se fusiona con tipo_tercero_id, se deduplica y se ordena. Si no queda ningún tipo válido, la respuesta es 422. |
Sobre persona: 1 indica persona natural y 2 persona jurídica. Si lo envías, nuby valida que el tipo de documento sea coherente: una persona natural no puede registrarse con NIT, y una persona jurídica debe registrarse con NIT. Si no lo envías, esa coherencia no se valida.
Campos que se ignoran: si envías campos que no están en las listas anteriores (por ejemplo tercero_id, creadopor o password_hash), el servicio los descarta en silencio y nunca los escribe. No se responde error por ese motivo.
Cómo se envían los tipos de tercero
Puedes enviar el rol del tercero de dos formas, y también combinarlas:
tipo_tercero_id→ un solo identificador, como número o como texto.tipos[]→ un arreglo con varios identificadores.
Si envías ambos, nuby los une en una sola lista, elimina los repetidos y conserva el orden. Los valores deben ser números enteros mayores que cero; los valores inválidos se descartan y, si al final no queda ningún tipo, la respuesta es 422.
Ejemplo: persona natural
Para una persona natural envía persona: 1 y un tipo de documento que no sea NIT. El identificador 2 del ejemplo es ilustrativo: usa el que corresponda a cédula en la maestra de tu instancia.
{
"referencia_externa": "TP-000124",
"documento": "1020304050",
"tipo_doc_id": 2,
"persona": 1,
"nombre1": "María",
"apellido1": "Gómez",
"direccion1": "CL 10 #5-20",
"municipio_id": 1,
"tipo_tercero_id": 2,
"email": "maria.gomez@example.co",
"telefono1": "3001234567"
}
nuby almacena los nombres y apellidos en mayúsculas: este envío queda como MARÍA GÓMEZ.
Ejemplo: persona jurídica
Para una persona jurídica envía persona: 2 y un documento de tipo NIT. Si además necesitas asignarle varios roles, combina tipo_tercero_id con tipos[].
{
"referencia_externa": "TP-000125",
"documento": "901234567",
"tipo_doc_id": 1,
"persona": 2,
"nombre1": "Inversiones Andinas SAS",
"direccion1": "CR 43A #1-50",
"municipio_id": 1,
"tipo_tercero_id": 1,
"tipos": [2],
"email": "contacto@andinas.co",
"telefono1": "6044445555"
}
El ejemplo usa tipo_doc_id: 1 para NIT, igual que el contrato. La coherencia con persona: 2 se valida antes de crear el tercero.
Ejemplo completo de la petición
{
"referencia_externa": "TP-000123",
"documento": "900123456",
"tipo_doc_id": 1,
"nombre1": "Acme SAS",
"tipo_tercero_id": 1,
"tipos": [2],
"direccion1": "CL 1 #2-3",
"municipio_id": 1,
"email": "cuenta@acme.co",
"telefono1": "6040000000"
}
3. La Respuesta (¿Qué te entregaremos?)
El servicio tiene dos resultados posibles, y ambos son exitosos:
| Resultado | Código HTTP | Qué significa |
|---|---|---|
| Tercero creado | 201 |
El documento no existía en nuby. Se creó el tercero y se le asignaron sus tipos. |
| Tercero resuelto | 200 |
El documento ya existía. Se devuelve el mismo tercero_id y no se modifica nada. |
Tercero creado (201 Created)
{
"success": true,
"status": 201,
"message": "Tercero creado.",
"body": {
"tercero_id": 123,
"created": true,
"documento": "900123456"
}
}
Tercero existente (200 OK)
{
"success": true,
"status": 200,
"message": "Tercero existente resuelto.",
"body": {
"tercero_id": 123,
"created": false,
"documento": "900123456"
}
}
Reintento de una solicitud ya completada (replay)
Si repites la petición con la misma referencia_externa y el mismo contenido, nuby devuelve la respuesta original —con el mismo código HTTP— y le agrega la marca idempotent_replay: true:
{
"success": true,
"status": 201,
"message": "Tercero creado.",
"body": {
"tercero_id": 123,
"created": true,
"documento": "900123456"
},
"idempotent_replay": true
}
Estructura del envelope de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
success |
booleano | true cuando la operación se completó; false en un error. |
status |
entero | Replica el código HTTP de la respuesta: 201 si el tercero se creó y 200 si ya existía. |
message |
texto | Mensaje legible de la operación: Tercero creado. o Tercero existente resuelto. |
body |
objeto | Resultado de la operación: tercero_id, created y documento. |
idempotent_replay |
booleano | Solo aparece cuando la respuesta se recuperó de una solicitud anterior. |
Una escritura no devuelve pagination ni filters_applied: la respuesta es el resultado de la operación.
Qué contiene el cuerpo de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
tercero_id |
entero | Identificador interno del tercero en nuby. Guárdalo: es la llave para consultarlo después. |
created |
booleano | true si el tercero se creó en esta petición; false si ya existía. |
documento |
texto | El documento que enviaste, ya normalizado (sin espacios). |
idempotent_replay |
booleano | Solo aparece en un replay. Indica que la respuesta se recuperó de una solicitud anterior y que no se ejecutó nada nuevo. |
La respuesta de este servicio es corta a propósito. Si necesitas el detalle completo del tercero (nombres, apellidos, ubicación, tipos, información tributaria), consulta la página Buscar Tercero por Código.
4. Cómo decide nuby si crea o resuelve
El servicio sigue siempre el mismo orden. Conocerlo te ayuda a interpretar las respuestas:
- Verifica que venga
referencia_externa. Si falta, responde422y no registra nada. - Consulta si tu
referencia_externaya fue usada (idempotencia). - Busca un tercero con ese
documento. - Si ya existe → responde
200concreated: falsey el mismotercero_id. No valida ni modifica el resto de los datos. - Si no existe → valida los obligatorios y las reglas de las maestras (tipo de documento, municipio, régimen, responsabilidad fiscal).
- Si todo es válido, crea el tercero, guarda sus tipos y responde
201concreated: true.
Ojo con las mayúsculas: los nombres y apellidos (nombre1, nombre2, apellido1, apellido2) se almacenan en mayúsculas. Si envías "Acme SAS", en nuby quedará "ACME SAS".
Ojo con el documento: solo se aceptan letras y números. Un documento con puntos, guiones o espacios (por ejemplo 900.123.456) no pasa la validación. Envíalo normalizado: 900123456.
Un tercero, un registro. El documento es único en nuby. Por eso dos envíos con el mismo documento —aunque traigan otro nombre— apuntan siempre al mismo tercero.
5. Idempotencia y reintentos
Toda escritura en esta API exige referencia_externa. nuby guarda la combinación (consumidor, recurso, referencia_externa) y recuerda qué respondió, para que un reintento no duplique el registro.
| Situación | Qué responde nuby |
|---|---|
| Primera vez que se usa la referencia | Procesa la solicitud normal (201 o 200). |
| La referencia ya se completó con el mismo contenido | La respuesta original, con idempotent_replay: true. |
| La referencia ya se completó con otro contenido | 409 con IDEMPOTENCY_PAYLOAD_MISMATCH. |
| La referencia está siendo procesada en este momento (envío simultáneo) | 409 con IDEMPOTENCY_IN_PROGRESS. |
| La referencia quedó en una solicitud fallida | Se permite reintentar, incluso con datos corregidos. |
Importante: una respuesta 422 por datos inválidos no consume la referencia. Puedes corregir el contenido y reintentar con la misma referencia_externa sin conflicto.
Atención: no reutilices una referencia_externa para operaciones distintas. Si usas la misma referencia con un contenido diferente, nuby responde 409 IDEMPOTENCY_PAYLOAD_MISMATCH y no procesa nada. La referencia debe identificar una operación concreta, no un tercero.
Recomendación: guarda en tu plataforma la relación referencia_externa → tercero_id. Así puedes reintentar con seguridad ante timeouts o caídas de red, y sabes a qué tercero corresponde cada operación.
6. Seguridad y Posibles Errores
Las respuestas de error traen siempre success: false, el código HTTP, un message legible y un error_code estable que puedes usar en tu lógica.
| HTTP | error_code |
Cuándo ocurre y cómo resolverlo |
|---|---|---|
400 |
VALIDATION_ERROR |
El cuerpo no es un objeto JSON. Envía un objeto JSON válido y define Content-Type: application/json. |
401 |
— | No enviaste el encabezado Authorization, o el token no existe o expiró. Vuelve a consumir Login y repite la petición. |
403 |
CONSUMIDOR_NO_AUTENTICADO |
El token es válido, pero no corresponde a un cliente OAuth habilitado para consumir la API. |
403 |
RECURSO_NO_AUTORIZADO |
Al cliente OAuth le falta el permiso third-parties:create. Solicita el ajuste a tu administrador en nuby. |
409 |
IDEMPOTENCY_IN_PROGRESS |
Hay una solicitud en curso con esa referencia. Espera unos segundos y reintenta con la misma referencia. |
409 |
IDEMPOTENCY_PAYLOAD_MISMATCH |
La referencia ya se usó con otro contenido. Usa una referencia_externa nueva. |
422 |
VALIDATION_ERROR |
Los datos no cumplen las reglas. Revisa el objeto errors para saber qué campo falló. |
500 |
INTERNAL_ERROR / IDEMPOTENCY_STORAGE_ERROR |
Fallo interno de nuby. La solicitud queda marcada como fallida y puede reintentarse. Si persiste, contacta a soporte. |
Ejemplo de error de validación (422)
{
"success": false,
"status": 422,
"message": "La solicitud contiene errores de validación.",
"error_code": "VALIDATION_ERROR",
"errors": {
"direccion1": [
"El campo \"Dirección Principal\" es obligatorio."
]
}
}
El objeto errors está indexado por el nombre técnico del campo, y cada entrada es una lista de mensajes. Las validaciones más frecuentes son:
Validaciones y mensajes
| Regla | Mensaje | Cómo corregir |
|---|---|---|
| Falta un campo obligatorio y el tercero no existe | El campo "<Etiqueta>" es obligatorio. |
Incluye el campo. Recuerda que los obligatorios solo se exigen cuando el documento no existe. |
tipo_doc_id o municipio_id vacíos, en cero o no numéricos |
El campo "<Etiqueta>" debe ser un identificador numérico mayor que cero. |
Envía un entero mayor que cero tomado de la maestra correspondiente. |
| No se envió ningún tipo de tercero | Debe enviar al menos un tipo de tercero en "Tipo de Tercero" o en tipos[]. |
Envía tipo_tercero_id o tipos[] con al menos un entero mayor que cero. |
| Un identificador no existe en las maestras | El valor ingresado en el campo "<Etiqueta>" no es válido para el sistema. |
Verifica el catálogo de tipo de documento, municipio, régimen, responsabilidad fiscal o banco. |
| Persona natural con NIT | Una Persona Natural no puede registrarse con un tipo de documento de tipo NIT. |
Cambia el tipo_doc_id a uno que no sea NIT o corrige persona. |
| Persona jurídica sin NIT | Una Persona Jurídica debe registrarse de forma obligatoria con un documento de tipo NIT. |
Usa un tipo_doc_id de tipo NIT o corrige persona. |
Atención: cuando la respuesta es 422, nuby no crea ni modifica ningún tercero. Es seguro corregir el contenido y volver a enviar.
Casos especiales
Estos escenarios explican la mayoría de las dudas de integración. La regla que manda siempre es la misma: primero se resuelve el documento y, si ya existe, el resto del payload no se valida.
Tercero existente con payload incompleto
| Escenario | Resultado | Qué hace nuby |
|---|---|---|
El documento ya existe y solo envías referencia_externa y documento |
200 con created: false |
Resuelve el tercero y no exige los demás obligatorios. |
El documento ya existe y omites direccion1 o municipio_id |
200 con created: false |
No valida los obligatorios ni actualiza el registro. |
| El documento ya existe y envías un correo con formato inválido | 200 con created: false |
Ignora el correo y el resto del envío. |
El documento no existe y falta direccion1 |
422 VALIDATION_ERROR |
Exige los obligatorios antes de crear. |
Persona natural con NIT
| Combinación enviada | Resultado | Cómo corregir |
|---|---|---|
persona: 1 con un tipo_doc_id de tipo NIT |
422: Una Persona Natural no puede registrarse con un tipo de documento de tipo NIT. |
Usa un tipo de documento que no sea NIT, o cambia persona a 2. |
persona: 2 con un tipo_doc_id que no es NIT |
422: Una Persona Jurídica debe registrarse de forma obligatoria con un documento de tipo NIT. |
Usa un tipo de documento NIT, o cambia persona a 1. |
Omites persona y envías un NIT |
Se crea si el resto es válido | No hay validación de coherencia documento↔persona; envíala siempre que puedas. |
Documento con puntos o guiones
| Documento enviado | Resultado | Cómo corregir |
|---|---|---|
900.123.456 |
422 VALIDATION_ERROR |
Envía 900123456, sin puntos. |
900-123-456 |
422 VALIDATION_ERROR |
Envía 900123456, sin guiones. |
900123456 |
422 VALIDATION_ERROR |
Quita los espacios antes y después del documento. |
900123456 |
Aceptado | Solo letras y números; no requiere transformación adicional. |
Campos ignorados
| Campo enviado | Efecto | ¿Genera error? |
|---|---|---|
tercero_id |
Se descarta; nuby asigna el identificador real. | No |
creadopor |
Se descarta; nuby registra el consumidor autenticado. | No |
password_hash |
Se descarta y nunca se escribe. | No |
impuestos |
Se descarta; no forma parte de la whitelist. | No |
| Cualquier otro campo fuera de la whitelist | Se ignora en silencio. | No |
tipos[] + tipo_tercero_id
| Entrada | Tipos resultantes | Explicación |
|---|---|---|
tipo_tercero_id: 1, tipos: [2] |
[1, 2] |
Se fusionan ambos campos y se conserva el orden. |
tipo_tercero_id: "1,2", tipos: [2,3] |
[1, 2, 3] |
Se aceptan cadenas separadas por comas y se eliminan los duplicados. |
tipo_tercero_id: 0, tipos: [1] |
[1] |
Los valores <= 0 o no numéricos se descartan. |
tipos: ["abc"] sin tipo_tercero_id |
Ninguno | 422: no queda ningún tipo válido. |
| Omites ambos campos | Ninguno | 422: debes enviar al menos un tipo de tercero. |
7. Ejemplos de integración
cURL
TOKEN="TU_TOKEN_AQUI"
INSTANCIA="tu-inmobiliaria.nuby.app"
curl -X POST "https://${INSTANCIA}/service/v2/public/third-parties" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-d '{
"referencia_externa": "TP-000123",
"documento": "900123456",
"tipo_doc_id": 1,
"nombre1": "ACME SAS",
"tipo_tercero_id": 1,
"tipos": [2],
"direccion1": "CL 1 #2-3",
"municipio_id": 1,
"email": "cuenta@acme.co",
"telefono1": "6040000000"
}'
PHP
<?php
$instancia = 'tu-inmobiliaria.nuby.app';
$token = 'TU_TOKEN_AQUI';
$url = "https://{$instancia}/service/v2/public/third-parties";
$payload = [
'referencia_externa' => 'TP-000123',
'documento' => '900123456',
'tipo_doc_id' => 1,
'nombre1' => 'ACME SAS',
'tipo_tercero_id' => 1,
'tipos' => [2],
'direccion1' => 'CL 1 #2-3',
'municipio_id' => 1,
'email' => 'cuenta@acme.co',
'telefono1' => '6040000000',
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
"Authorization: Bearer {$token}",
]);
$respuesta = curl_exec($ch);
$codigo = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "HTTP: {$codigo}\n";
print_r(json_decode($respuesta, true));
Python
import requests
instancia = "tu-inmobiliaria.nuby.app"
token = "TU_TOKEN_AQUI"
url = f"https://{instancia}/service/v2/public/third-parties"
payload = {
"referencia_externa": "TP-000123",
"documento": "900123456",
"tipo_doc_id": 1,
"nombre1": "ACME SAS",
"tipo_tercero_id": 1,
"tipos": [2],
"direccion1": "CL 1 #2-3",
"municipio_id": 1,
"email": "cuenta@acme.co",
"telefono1": "6040000000",
}
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {token}",
}
respuesta = requests.post(url, json=payload, headers=headers, timeout=30)
if respuesta.ok:
datos = respuesta.json()
print(f"Tercero {datos['body']['tercero_id']} — creado: {datos['body']['created']}")
else:
print(respuesta.status_code, respuesta.json())
JavaScript (Fetch API)
const instancia = 'tu-inmobiliaria.nuby.app';
const token = 'TU_TOKEN_AQUI';
const url = `https://${instancia}/service/v2/public/third-parties`;
const payload = {
referencia_externa: 'TP-000123',
documento: '900123456',
tipo_doc_id: 1,
nombre1: 'ACME SAS',
tipo_tercero_id: 1,
tipos: [2],
direccion1: 'CL 1 #2-3',
municipio_id: 1,
email: 'cuenta@acme.co',
telefono1: '6040000000'
};
const respuesta = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify(payload)
});
const data = await respuesta.json();
if (respuesta.ok) {
console.log(`Tercero ${data.body.tercero_id} — creado: ${data.body.created}`);
} else {
console.error(`${respuesta.status} ${data.error_code}: ${data.message}`, data.errors ?? {});
}
Power Query M (Excel / Power BI)
Power Query construye el cuerpo con Json.FromValue y lo envía con Web.Contents. El resultado se convierte en una tabla de una fila con tercero_id, created y documento.
let
// 1. Configura tus datos de acceso
instancia = "tu-inmobiliaria.nuby.app",
token = "TU_TOKEN_AQUI",
// 2. Prepara la dirección de la petición
url = "https://" & instancia & "/service/v2/public/third-parties",
// 3. Construye el cuerpo JSON
cuerpo = Json.FromValue([
referencia_externa = "TP-000123",
documento = "900123456",
tipo_doc_id = 1,
nombre1 = "ACME SAS",
tipo_tercero_id = 1,
tipos = {2},
direccion1 = "CL 1 #2-3",
municipio_id = 1,
email = "cuenta@acme.co",
telefono1 = "6040000000"
]),
// 4. Envía la petición POST
response = Web.Contents(url, [
Headers = [
#"Content-Type" = "application/json",
#"Authorization" = "Bearer " & token
],
Content = cuerpo
]),
// 5. Decodifica la respuesta JSON
jsonResponse = Json.Document(response),
body = jsonResponse[body],
// 6. Convierte el resultado en tabla
tabla = Table.FromList({body}, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
expandido = Table.ExpandRecordColumn(tabla, "Column1",
{"tercero_id", "created", "documento"},
{"TerceroID", "Creado", "Documento"}),
tipos = Table.TransformColumnTypes(expandido, {
{"TerceroID", Int64.Type},
{"Creado", type logical}
})
in
tipos
8. Buenas prácticas y límites conocidos
Recomendaciones
- Normaliza el documento antes de enviarlo: sin puntos, sin guiones y sin espacios.
- Usa una referencia externa por operación y no la reutilices para otro tercero.
- Aprovecha el resultado
createdpara saber si debes registrar el alta en tu plataforma o si el tercero ya estaba en nuby. - Envía el
tercero_idque devuelve nuby en los procesos siguientes: evita volver a resolver por documento. - Trata el
422como reintentable tras corregir: la referencia no se consume. - Guarda el token fuera del código y renuévalo antes de que expire.
Límites de este servicio
- No existe un servicio de actualización de terceros en esta API: si necesitas corregir los datos de un tercero existente, se gestiona desde nuby.
- Un tercero existente se devuelve sin validar ni comparar el resto del envío; no esperes que el servicio detecte diferencias.
- El servicio no valida el formato del correo electrónico. Envía direcciones válidas.
- Los terceros creados por este servicio quedan disponibles para los demás procesos de nuby en el mismo momento de la respuesta.
Lo que este servicio NO hace
- No actualiza los datos de un tercero que ya existe. Si el tercero está registrado con otro nombre o dirección, el servicio lo resuelve tal como está y descarta el resto del envío.
- No completa datos por su cuenta. No rellena direcciones, correos ni teléfonos con valores por defecto: si falta un dato obligatorio y el tercero no existe, responde un error de validación.
- No gestiona contactos, archivos, bitácoras ni documentos del tercero: eso se administra en el módulo de terceros de nuby.
Para consultar terceros ya registrados, revisa las páginas Listar Terceros y Buscar Tercero por Código.