Ir al contenido

Integraciones Sigero - Business Central

Flujos de Inserción vía Service Bus + Logic Apps

Sección titulada «Flujos de Inserción vía Service Bus + Logic Apps»

Garantía de Entrega Asíncrona: Sigero depositará las transacciones en colas de mensajería independientes de la disponibilidad inmediata de Business Central. Esto asegura que la operación nunca se pierda por saturación del ERP

Confirmación de Recepción en Cola: El servicio de mensajería emitirá un acuse de recibo inmediato cada vez que una inserción sea depositada correctamente en la cola. Esta notificación actúa como una garantía de persistencia, permitiendo que el sistema externo confirme el envío y libere la transacción.

Identificación Única de Mensajes y Trazabilidad: Cada mensaje depositado en la cola recibirá un identificador único global generado por la infraestructura de mensajería. Este ID servirá como la referencia de seguimiento compartida entre ambos sistemas, permitiendo realizar consultas posteriores sobre el estado de la integración (En espera, Procesado o Fallido).

Gestión de Bloqueos y Resiliencia: Ante bloqueos temporales de tablas en Business Central, la lógica de integración aplicará ciclos de reintento automático con tiempos de espera exponenciales. El proceso solo se dará por fallido tras agotar los intentos configurados, protegiendo la continuidad operativa.

Aislamiento y Trazabilidad de Errores: Aquellas transacciones que contengan errores lógicos o de datos serán desviadas a una cola de mensajes fallidos para su inspección. Esto permite que el resto del flujo continúe operando sin interrupciones.

Pantalla para el integracion Azure Service Bus

La interacción con el bus de servicio debe realizarse obligatoriamente a través del SDK oficial de Azure, descartando el uso de llamadas REST genéricas.

  • Se recibe una solicitud desde Service Bus.
  • Si la recepcion se procesa correctamente se envia una respuesta 201 al remitente.
  • En paralelo los datos recibidos son procesados por la logica del flujo en Logic App para derivarlo a Business Central. Cada proceso tiene definida una cola para evitar que los mensajes se solapen o un flujo elevando afecte una unica cola.

Pantalla para el diario de productos

Es un mecanismo que envía una notificación HTTP automática a una URL cada vez que ocurre un cambio (Crear, Modificar o Eliminar) en una tabla de Business Central. Business Central avisa proactivamente al ecosistema en el segundo exacto en que se crea o modifica un registro, eliminando la necesidad de consultas constantes (polling) que ralentizan el ERP.

Entidades a utilizar

  • Artículos.
  • Unidades de Medida.
  • Clientes.
  • Proveedores.
  • Almacenes.
  • Transportistas.
  • Códigos de motivo.

Notificación de Eventos en Business Central: En el momento en que se produzca una creación o modificación en Business Central, el Webhook disparará una notificación hacia la Sigero. Vinculación de Identidades (ID Único): Todo registro guardado en Sigero (Clientes, Artículos, Proveedores, etc.) debe contener obligatoriamente el ID del registro original de Business Central (SystemId/GUID) Suscripción por Entidad: Se configurará un Webhook independiente por cada entidad maestra (por compañía y ambiente). Renovación de suscripción: El sistema debe enviar una petición a la API de suscripciones de Business Central para actualizar la fecha y hora de expiración de cada Webhook activo. Gestión de Seguridad: Sigero debe validar el token o Client State incluido en el Webhook para confirmar que la petición proviene exclusivamente de nuestra instancia de Business Central.

Complementando la arquitectura de eventos, habilitaremos el consumo manual de datos a través de las APIs estándar de Business Central (v2.0). El acceso está protegido mediante el protocolo de autorización moderno de Microsoft, garantizando que solo aplicaciones registradas en Azure AD puedan consumir los datos.

Herramientas de Consumo: El acceso podrá realizarse mediante herramientas de prueba de APIs (como Postman), scripts de administración o desde la propia interfaz de consulta de Sigero, siempre bajo intervención humana. Autenticación Individual: Cada consulta debe estar respaldada por un token de acceso seguro (OAuth 2.0), asegurando que solo personal autorizado pueda “leer” los datos del ERP. Restricción de Operaciones: Por seguridad, el acceso manual vía API se configurará preferentemente en modo “Solo Lectura” (GET) para las entidades maestras. Cualquier inserción de datos deberá seguir el canal oficial del Service Bus para mantener la trazabilidad.

Configuración de credenciales de Business Central

Sección titulada «Configuración de credenciales de Business Central»

Antes de poder utilizar las apis, Webhooks e integrar aplicaciones externas con Business Central, es fundamental contar con las credenciales de acceso necesarias.

  1. URL del ambiente de Business Central
  2. Credenciales OAuth 2.0
    • Client ID (Aplicación ID): Identificador de la aplicación registrada
    • Client Secret: Clave secreta de la aplicación.
  3. Credenciales de Azure AD
    • Shared Access Signature (SAS) o certificado para autenticación segura.
  4. Permisos y alcances (Scopes)

Para facilitar la integración y pruebas de los Webhook de Business Central, está disponible un espacio de trabajo en Postman. Esto permite interactuar con la API sin necesidad de desarrollar código de cliente de manera inmediata.

Antes de trabajar con cualquier entidad en Business Central, es necesario conocer el Company ID de la compañía con la que se desea interactuar. Este es un paso fundamental ya que todas las operaciones posteriores requieren este identificador.

GET
https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{environmentName}/api/v2.0/companies
Content-Type: application/json
Authorization: Bearer {access_token}
{
"@odata.context": "{{https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{environmentName}/api/v2.0/$metadata#companies}}",
"value": [
{
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"systemVersion": "25000",
"timestamp": 45887,
"name": "CRONUS",
"displayName": "CRONUS International Ltd.",
"businessProfileId": "",
"systemCreatedAt": "2023-01-15T10:30:00Z",
"systemCreatedBy": "a25fcdd5-5d7d-4986-b6da-2e09aa08c17f",
"systemModifiedAt": "2024-06-20T14:45:00Z",
"systemModifiedBy": "a25fcdd5-5d7d-4986-b6da-2e09aa08c17f",
},
{
"id": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
"systemVersion": "25000",
"timestamp": 45887,
"name": "CRONUS",
"displayName": "Mi Empresa S.A.",
"businessProfileId": "",
"systemCreatedAt": "2023-01-15T10:30:00Z",
"systemCreatedBy": "a25fcdd5-5d7d-4986-b6da-2e09aa08c17f",
"systemModifiedAt": "2024-06-20T14:45:00Z",
"systemModifiedBy": "a25fcdd5-5d7d-4986-b6da-2e09aa08c17f",
}
]
}

Campos de la respuesta

NombreTipo de datoDescripción
@odata.contextLa URL que define el esquema y el origen de los datos
idGuidID único de la compañia
systemVersionIntegerVersión del sistema
timestampIntegersegundos del sistema
nameText[30]Nombre interno de la compañía.
displayNameText[250]Nombre para mostrar de la compañía.
businessProfileIdGuidID del perfil de negocio (si aplica).
systemCreatedAtDatetimeFecha de creación de la compañía en el sistema.
systemCreatedByGuidID del usuario cuando se creó
systemModifiedByGuidID del usuario cuando se modificó.
systemModifiedAtDatetimeFecha de última modificación.

Para interactuar con una API de Business Central, normalmente sigues estos pasos:

Configuración en Azure: Debes registrar una aplicación en el portal de Azure para obtener un Client ID y un Secret. • Identificar el Endpoint:

Business Central utiliza un sistema de cuotas basado en el tiempo. Si se exceden, la API devolverá un error HTTP 429 (Too Many Requests).

ConceptoLímite (SaaS)Solicitudes Concurrentes
Máximo solicitudes simultaneas100 solicitudes simultáneas por entorno.
Solicitudes por MinutoMáximo 6,000 por minuto.

Business Central puede un máximo de 20,000 registros por petición. Si tu consulta supera ese número, Business Central cortará la respuesta.

Al realizar consultas directas vía API, el sistema emisor es el responsable único de gestionar la saturación del ERP. Para prevenir errores 429 (Too Many Requests), el cliente debe implementar una cola local de reintentos que respete el encabezado Retry-After de Business Central. Esta propiedad indica el tiempo recomendado que el cliente debe esperar antes de volver a intentar la solicitud.

Por defecto, si llamas a un endpoint como /customers, Business central te devuelve todos los campos (nombre, dirección, saldo, correos, etc.). Si solo quieres el nombre y el saldo, añades el parámetro a la URL:

.../api/v2.0/companies(id)/customers?$select=number,displayName,balance

deben escribirse exactamente como aparecen en la definición de la API. Usa comas para separar los campos, sin espacios.

es una propiedad de control que contiene una URL de continuación. Representa un curso de estado en el servidor que permite al cliente recuperar el siguiente subconjunto de resultados (página) de una consulta masiva. Se genera automáticamente cuando el volumen de datos excede el límite de registros por respuesta.

Ejemplo de Petición

GET
https://api.businesscentral.dynamics.com/v2.0/.../items?$select=number,displayName&$top=2

Ejemplo de JSON de Respuesta

{
"@odata.context":"https://api.businesscentral.dynamics.com/v2.0/.../$metadata#items(number,displayName)",
"value": [
{
"@odata.etag": "W/\"JzQ0OzE2MTI5ODc1NDI2MzI0ODExOzAwOyc=\"",
"number": "1896-S",
"displayName": "Escritorio ATHENS"
},
{
"@odata.etag": "W/\"JzQ0OzE5MDU2ODc1NDI2MzI0ODExOzAwOyc=\"",
"number": "1900-S",
"displayName": "Silla PARIS"
}
],
"@odata.nextLink": "https://api.businesscentral.dynamics.com/v2.0/.../items?$select=number,displayName&$skiptoken=X'08100000005349500000'"
}

Define el límite superior de registros que el servidor debe retornar en el cuerpo de la respuesta.

ejemplo: Obtener los primeros 5 registros de los articulos.

/items?$top=5

Se utiliza para omitir un número específico de registros de una colección antes de devolver los resultados restantes. Es el complemento directo de $top y es fundamental para implementar la lógica de paginación

GET .../items?$top=10&$skip=0
GET .../items?$top=10&$skip=10

Especifica los criterios de clasificación de los recursos de una colección. Si no se incluye, Business Central devuelve los datos basándose en la Clave Primaria (Primary Key) de la tabla por defecto.

GET .../salesOrders?$orderby=orderDate desc, customerName asc

Los Webhook son mecanismos de comunicación que permiten la integración en tiempo real entre Business Central y aplicaciones externas.

Para implementar Webhook con Business Central, es necesario seguir un proceso de configuración que incluye la creación del endpoint y la suscripción a eventos. Pasos para la configuración:

  1. Creación de la Suscripción mediante API
POST
https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{environmentName}/api/v2.0/subscriptions
Content-Type: application/json
Authorization: Bearer {access_token}
body: {
"notificationUrl": "https://tu-servidor.com/webhook/endpoint",
"resource": "companies(companyid) /purchaseOrders",
"clientState": "OptionalSecretToken123",
}

Parámetros de la suscripción:

  • notificationUrl: URL de tu endpoint que recibirá las notificaciones.
  • resource: Entidad a la que te suscribes. Ejemplo:
    • companies(companyId)/purchaseOrders - Órdenes de compra.
  • clientState: Token secreto opcional para validar que las notificaciones vienen de BC.

Respuesta esperada (JSON)

{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/30eb258d-51a4-4f58-9c88-bf72d4d3325a/TEST/api/v2.0/$metadata#subscriptions/$entity",
"@odata.etag": "W/\"JzE5Ozg3OTQ1NDA5NjgxOTE4MzYyOTMxOzAwOyc=\"",
"subscriptionId": "a10b670ba93149c98c89fa574762ab2b",
"notificationUrl": "https://funcionesdesarrollovog-b7aaazc5dmgzctbx.canadacentral-01.azurewebsites.net/api/FunctionHttpTrigger?code=C2u",
"resource": "api/v2.0/companies(9c2a3721-0c80-ef11-ac21-0022483842ea)/customers",
"timestamp": 6465970,
"userId": "79d10a1b-ea16-483b-964d-5d547971cf47",
"lastModifiedDateTime": "2026-02-05T18:37:57Z",
"clientState": "optionalValueOf2048",
"expirationDateTime": "2026-02-08T18:37:57Z",
"systemCreatedAt": "2026-02-05T18:38:01.4Z",
"systemCreatedBy": "79d10a1b-ea16-483b-964d-5d547971cf47",
"systemModifiedAt": "2026-02-05T18:38:01.4Z",
"systemModifiedBy": "79d10a1b-ea16-483b-964d-5d547971cf47"
}

Campos de la respuesta

NombreTipo de datoDescripción
@odata.contextString (URL)La URL que define el esquema y el origen de los datos.
@odata.etagStringIdentificador de versión del registro para el control de concurrencia optimista.
subscriptionIdGUIDIdentificador único de la suscripción de Webhook creada.
notificationUrlText[250]Dirección URL donde Business Central enviará las notificaciones.
resourceText[250]Ruta de la API que define el recurso monitoreado.
timestampbigintNúmero interno de control de versiones de la base de datos SQL.
userIdGUIDIdentificador único del usuario de Business Central que originó la suscripción.
lastModifiedDateTimeDateTimeFecha y hora de la última modificación de los parámetros de suscripción.
clientStateText[250]Secreto compartido para validar la autenticidad de las notificaciones.
expirationDateTimeDateTimeFecha y hora exacta en la que el Webhook dejará de estar activo.
systemCreatedAtDateTimeMarca de tiempo exacta de la creación del registro en el sistema.
systemCreatedByGUIDIdentificador del usuario o servicio que creó el registro.
systemModifiedAtDateTimeMarca de tiempo de la última modificación registrada por el sistema.
systemModifiedByDateTimeIdentificador del usuario o servicio que realizó la última modificación en el sistema.

Las suscripciones expiran máximo en 3 días, por lo que debes renovarlas periódicamente. Para renovar, debes enviar una solicitud PATCH al endpoint de la suscripción específica. No es necesario esperar a que venza; puedes hacerlo de forma proactiva.

PATCH
https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{environmentName}/api/v2.0/subscriptions({subscriptionId})
Content-Type: application/json
If-Match: @odata.etag (o el ETag específico de la suscripción)
Authorization: Bearer {access_token}

Respuesta esperada (JSON)

{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/30eb258d-51a4-4f58-9c88-bf72d4d3325a/TEST/api/v2.0/$metadata#subscriptions/$entity",
"@odata.etag": "W/\"JzE5Ozg3NjQ5MTcyMDMyMDAwODMwNjcxOzAwOyc=\"",
"subscriptionId": "a10b670ba93149c98c89fa574762ab2b",
"notificationUrl": "https://funcionesdesarrollovog-b7aaazc5dmgzctbx.canadacentral-01.azurewebsites.net/api/FunctionHttpTrigger?code=",
"resource": "api/v2.0/companies(9c2a3721-0c80-ef11-ac21-0022483842ea)/customers",
"timestamp": 6466168,
"userId": "79d10a1b-ea16-483b-964d-5d547971cf47",
"lastModifiedDateTime": "2026-02-05T19:09:46Z",
"clientState": "optionalValueOf2048",
"expirationDateTime": "2026-02-08T19:09:46Z",
"systemCreatedAt": "2026-02-05T18:38:01.4Z",
"systemCreatedBy": "79d10a1b-ea16-483b-964d-5d547971cf47",
"systemModifiedAt": "2026-02-05T19:09:48.653Z",
"systemModifiedBy": "79d10a1b-ea16-483b-964d-5d547971cf47"
}

Campos de la respuesta

NombreTipo de datoDescripción
@odata.contextString (URL)URL que define el esquema y el origen de los datos.
@odata.etagStringIdentificador de versión del registro para control de concurrencia optimista (usar en If-Match).
subscriptionIdGUIDIdentificador único de la suscripción de Webhook.
notificationUrlString (URL)Dirección URL donde Business Central enviará las notificaciones.
resourceStringRuta de la API que define el recurso monitoreado.
timestampBigInt / IntegerValor interno de control de versiones de la base de datos.
userIdGUIDIdentificador del usuario que creó o autorizó la suscripción.
lastModifiedDateTimeDateTimeFecha y hora de la última modificación de la suscripción.
clientStateStringSecreto compartido definido por el cliente para validar notificaciones.
expirationDateTimeDateTimeFecha y hora en la que la suscripción expirará.
systemCreatedAtDateTimeMarca temporal de creación del registro en el sistema.
systemCreatedByGUIDIdentificador del usuario o servicio que creó el registro.
systemModifiedAtDateTimeMarca temporal de la última modificación técnica registrada.
systemModifiedByGUIDIdentificador del usuario o servicio que realizó la última modificación.

Para listar las suscripciones activas en el entorno de Business Central realiza una petición GET al recurso de subscriptions.

GET {{https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{environmentName}/api/v2.0/subscriptions}}
Authorization: Bearer {access_token}

Respuesta esperada (JSON)

{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/30eb258d-51a4-4f58-9c88-bf72d4d3325a/TEST/api/v2.0/$metadata#subscriptions",
"value": [
{
"@odata.etag": "W/\"JzE5Ozg3NjQ5MTcyMDMyMDAwODMwNjcxOzAwOyc=\"",
"subscriptionId": "a10b670ba93149c98c89fa574762ab2b",
"notificationUrl": "https://funcionesdesarrollovog-b7aaazc5dmgzctbx.canadacentral-01.azurewebsites.net/api/FunctionHttpTrigger?code=",
"resource": "api/v2.0/companies(9c2a3721-0c80-ef11-ac21-0022483842ea)/customers",
"timestamp": 6466168,
"userId": "79d10a1b-ea16-483b-964d-5d547971cf47",
"lastModifiedDateTime": "2026-02-05T19:09:46Z",
"clientState": "optionalValueOf2048",
"expirationDateTime": "2026-02-08T19:09:46Z",
"systemCreatedAt": "2026-02-05T18:38:01.4Z",
"systemCreatedBy": "79d10a1b-ea16-483b-964d-5d547971cf47",
"systemModifiedAt": "2026-02-05T19:09:48.653Z",
"systemModifiedBy": "79d10a1b-ea16-483b-964d-5d547971cf47"
}
]
}

Campos de la respuesta

NombreTipo de datoDescripción
@odata.contextString (URL)Indica el origen de los metadatos y el esquema de la respuesta.
valueArrayContenedor con las suscripciones encontradas.
@odata.etagStringSello de versión del registro; usar para If-Match en actualizaciones.
subscriptionIdGUIDIdentificador único de la suscripción (usado para PATCH/DELETE).
notificationUrlString (URL)URL que recibirá las notificaciones de cambios.
resourceStringEntidad o ruta de la API que se está monitoreando.
timestampBigInt / IntegerValor interno de control de versiones en la base de datos.
userIdGUIDID del usuario que creó o autorizó la suscripción.
lastModifiedDateTimeDateTimeFecha y hora de la última modificación de la suscripción.
clientStateStringValor secreto definido por el cliente para validar notificaciones.
expirationDateTimeDateTimeFecha y hora en la que la suscripción expirará.
systemCreatedAtDateTimeMarca temporal de creación del registro en el sistema.
systemCreatedByGUIDIdentificador del usuario o servicio que creó el registro.
systemModifiedAtDateTimeMarca temporal de la última modificación técnica registrada.
systemModifiedByGUIDIdentificador del usuario o servicio que realizó la última modificación.

Para eliminar la suscripción que tienes activa, debes realizar una petición DELETE apuntando específicamente al subscriptionId que tienes en tu JSON.

DELETE
https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{environmentName}/api/v2.0/subscriptions({subscriptionId})
Authorization: Bearer {access_token}
Content-Type: application/json
If-Match: @odata.etag (o el ETag específico de la suscripción)

Cuando lanzas el DELETE con éxito, la respuesta de Business Central no contiene texto, solo un código de estado:

  • Código HTTP: 204 No Content
  • Significado: La operación se realizó correctamente y la suscripción ha sido borrada permanentemente. No hay cuerpo (body) en la respuesta porque el recurso ya no existe.

Cada notificación enviada al suscriptor (notificationUrl) puede contener múltiples notificaciones de diferentes suscripciones. Aquí tienes un ejemplo de carga útil de notificación:

{
"value": [
{
"subscriptionId": "webhookItemsId",
"clientState": "someClientState",
"expirationDateTime": "2018-10-29T07:52:31Z",
"resource": "api/v2.0/companies(b18aed47-c385-49d2-b954-dbdf8ad71780)/items(26814998-936a-401c-81c1-0e848a64971d)",
"changeType": "updated",
"lastModifiedDateTime": "2018-10-26T12:54:20.467Z"
},
{
"subscriptionId": "webhookCustomersId",
"clientState": "someClientState",
"expirationDateTime": "2018-10-29T12:50:30Z",
"resource": "api/v2.0/companies(b18aed47-c385-49d2-b954-dbdf8ad71780)/customers(130bbd17-dbb9-4790-9b12-2b0e9c9d22c3)",
"changeType": "created",
"lastModifiedDateTime": "2018-10-26T12:54:26.057Z"
},
{
"subscriptionId": "webhookCustomersId",
"clientState": "someClientState",
"expirationDateTime": "2018-10-29T12:50:30Z",
"resource": "api/v2.0/companies(b18aed47-c385-49d2-b954-dbdf8ad71780)/customers(4b4f31f0-dc1c-4033-b2aa-ab03ca1d6ebc)",
"changeType": "deleted",
"lastModifiedDateTime": "2018-10-26T12:54:30.503Z"
},
{
"subscriptionId": "salesInvoice",
"clientState": "someClientState",
"expirationDateTime": "2018-10-20T10:55:01Z",
"resource": "/api/v2.0/companies(7dbba574-5f69-4167-a43e-fb975045de15)/salesInvoices?$filter=lastDateTimeModified%20gt%202018-10-15T11:00:00Z",
"changeType": "collection",
"lastModifiedDateTime": "2018-10-26T12:54:30.503Z"
}
]
}

El parámetro “changeType” indica el tipo de cambio:

  • Created: Se creo un nuevo registro
  • Updated: Se modifico el registro.
  • Deleted: Se elimino el registro.
  • Collection: Significa que Business Central envía una notificación de que se han creado o cambiado muchos registros. Se aplica un filtro al recurso, lo que permite al suscriptor solicitar a todas las entidades que cumplan con el filtro.

Para autenticarte con Azure Service Bus, puedes generar un token SAS (Shared Access Signature) utilizando el siguiente código de ejemplo en Python. Este token se utiliza para autorizar tus solicitudes al Service Bus.

import hmac
import hashlib
import base64
import time
import urllib.parse
import requests
def get_auth_token(sb_uri, key_name, key):
"""Genera el token SAS para la cabecera Authorization"""
# El URI debe estar codificado para el string de firma
ttl = int(time.time()) + 3600 # Válido por 1 hora
expiry = str(ttl)
encoded_uri = urllib.parse.quote_plus(sb_uri)
string_to_sign = encoded_uri + '\n' + expiry
# Firma HMAC-SHA256
key_bytes = key.encode('utf-8')
string_to_sign_bytes = string_to_sign.encode('utf-8')
signature = base64.b64encode(hmac.new(key_bytes, string_to_sign_bytes, hashlib.sha256).digest())
# Construcción del token codificado
auth_format = 'SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}'
token = auth_format.format(
encoded_uri,
urllib.parse.quote_plus(signature),
expiry,
key_name
)
return token
# --- CONFIGURACIÓN ---
NAMESPACE = "" # Solo el nombre, sin .servicebus...
ENTITY_PATH = "TU-COLA-O-TOPIC" # Nombre de la cola o el topic
KEY_NAME = "RootManageSharedAccessKey"
KEY_VALUE = "TU-PRIMARY-KEY-AQUI"
# Construcción de la URL de Azure REST API
resource_uri = f"https://{NAMESPACE}.servicebus.windows.net/{ENTITY_PATH}"
send_url = f"{resource_uri}/messages"
# 1. Generar el Token
sas_token = get_auth_token(resource_uri, KEY_NAME, KEY_VALUE)

Se necesita un GUID para el correlationId del mensaje. Aquí tienes un ejemplo de cómo generar un ID:

Python
import uuid
correlationId = str(uuid.uuid4())
print(correlationId)
2728f6b3-4aaa-4fe7-80d7-4c19fa21c625
NodeJS:
const { v4: uuidv4 } = require('uuid');
correlationId=uuidv4()
console.log(correlationId)
aa463307-09a0-4cb2-8cac-db745719c612
PowerShell
$correlationId=[guid]::NewGuid().ToString()
Write-Output $correlationId
da41df95-679b-40fd-ba67-d5b8fc311aa6

Una vez enviado el mensaje procedemos con monitorear la cola de salida para obtener la respuesta. Usamos POST porque vamos a sacar el menssaje de la cola.

El trigger de la logica que sondea la cola recepcionalmacen lo ajuste a 30 segundos

El timeout del request lo ajuste a 30 segundos, dando el tiempo necesario para obtener el mensaje.

Suscripción del recurso por webhook

POST
https://api.businesscentral.dynamics.com/v2.0/{{TenantID}}/{{enviromentName}}/api/virtualOfficeGroup/integration/v1.0/subscriptions
Content-Type: application/json
Authorization: Bearer {access_token}
{
"notificationUrl": UrlNotificationId,
"resource": "/virtualOfficeGroup/vog/v1.0/companies({{companyId}})/warehouseReceipts",
"clientState": ""
}

Consumir Endpoints (Manual)

GET
https://api.businesscentral.dynamics.com/v2.0/{{TenantID}}/DEMO/api/virtualOfficeGroup/integration/v1.0/companies(db22931c-25f2-f011-8405-000d3a88d306)/transferOrders?$expand=transferOrderLines
Content-Type: application/json
Authorization: Bearer {access_token}
POST
https://{namespace}.servicebus.windows.net/{queue_name}/messages
Header{
Content-Type: application/json
Authorization: Bearer {SharedAccessSignature}
companyID: {companyID} // Id de la compañía en Business Central
environment: {environment} // Nombre del ambiente en Business Central
BrokerProperties: {CorrelationId:{correlationId}} // CorrelationId para rastreo del mensaje
}
body
{
"locationCode": "PRINCIPAL", //Codigo de Almacen
"postingDate": "2026-02-10", // Fecha de Registro
"sortingMethod": "Item", // Metodo de Orden
"shippingAgentCode": "ALEX", //Codigo del transportista
"warehouseReceiptLines": [
{
"sourceDocument": "Purchase Order", // Tipo de documento de origen
"sourceNo": "C-PDA0000273", // Numero de documento de origen
"sourceLineNo": 50000, // Numero de linea del documento de origen
"itemNo": "PROD005", // Codigo del articulo
"unitMeasureCode": "KG", // Unidad de medida
"quantity": 10 // Cantidad a recibir
},
{
"sourceDocument": "Purchase Order", // Tipo de documento de origen
"sourceNo": "C-PDA0000273", // Numero de documento de origen
"sourceLineNo": 50000, // Numero de linea del documento de origen
"itemNo": "PROD003", // Codigo del articulo
"unitMeasureCode": "KG", // Unidad de medida
"quantity": 10 // Cantidad a recibir
}
]
}

Datos obtenidos

{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/30eb258d-51a4-4f58-9c88-bf72d4d3325a/TEST/api/virtualOfficeGroup/integration/v1.0/$metadata#companies(41cc1c74-5021-f011-9af7-000d3ac04986)/warehouseReceipts/$entity",
"@odata.etag": "W/\"JzE5OzE2MDIwNTUwMDg1MTM5NjkzODIxOzAwOyc=\"",
"id": "418de961-8125-f111-bec2-7ced8da8a20f",
"documentNo": "A-REC0000367",
"locationCode": "PRINCIPAL",
"noSeries": "A-RECEPCIÓN",
"zoneCode": "",
"binCode": "",
"postingDate": "2026-03-21",
"vendorShipmentNo": "",
"shippingAgentCode": "ALEX",
"plate": "",
"sortingMethod": "Item",
"assignedUserID": "",
"systemModifiedAt": "2026-03-21T23:55:05.957Z",
"warehouseReceiptLines": [
{
"@odata.etag": "W/\"JzIwOzE2OTU1NTk0NjkwNjgzMjQ5MTQ2MTswMDsn\"",
"id": "428de961-8125-f111-bec2-7ced8da8a20f",
"documentNo": "A-REC0000367",
"locationCode": "",
"lineNo": 1000,
"itemNo": "PROD005",
"description": "NITRATO DE SODIO",
"quantity": 10.00000,
"qtyReceive": 10.00000,
"qtyOutstanding": 10.00000,
"qtyReceived": 0,
"unitMeasureCode": "KG",
"sourceType": 39,
"sourceSubtype": "1",
"sourceNo": "C-PDA0000273",
"sourceLineNo": 50000,
"sourceDocument": "Purchase_x0020_Order",
"status": " ",
"systemModifiedAt": "2026-03-21T23:55:06.037Z",
"sortingSequenceNo": 0
},
{
"@odata.etag": "W/\"JzIwOzE1NzY3MzExOTA3OTA1MDA2NjI4MTswMDsn\"",
"id": "438de961-8125-f111-bec2-7ced8da8a20f",
"documentNo": "A-REC0000367",
"locationCode": "",
"lineNo": 2000,
"itemNo": "PROD003",
"description": "CARNE DE AVE",
"quantity": 10.00000,
"qtyReceive": 10.00000,
"qtyOutstanding": 10.00000,
"qtyReceived": 0,
"unitMeasureCode": "KG",
"sourceType": 39,
"sourceSubtype": "1",
"sourceNo": "C-PDA0000273",
"sourceLineNo": 50000,
"sourceDocument": "Purchase_x0020_Order",
"status": " ",
"systemModifiedAt": "2026-03-21T23:55:06.073Z",
"sortingSequenceNo": 0
}
]
}

Campos de la respuesta (Encabezado)

NombreTipo de datoDescripción
@odata.contextLa URL que define el esquema y el origen de los datos.
@odata.etagUn identificador de versión del registro.
idGuidID de la recepción de almacén creada.
documentNoText[20]Número de documento de la recepción de almacén.
locationCodeText[20]Código del almacén donde se está realizando la recepción.
noSeriesText[20]Serie de numeración utilizada para generar el número de documento.
zoneCodeText[20]Código de la zona dentro del almacén (si aplica).
binCodeText[20]Código de la ubicación específica dentro del almacén (si aplica).
postingDateDateFecha de registro de la recepción.
vendorShipmentNoText[20]Número de envío del proveedor (si aplica).
shippingAgentCodeText[20]Código del agente de transporte asociado a la recepción.
plateText[20]Número de placa del vehículo de transporte (si aplica).
sortingMethodText[20]Método de ordenamiento utilizado para las líneas de la recepción.
assignedUserIDText[20]ID del usuario asignado para gestionar la recepción (si aplica).
systemModifiedAtDatetimeFecha y hora de la última modificación del registro.

Campos de la respuesta (Líneas)

NombreTipo de datoDescripción
sourceDocumentText[50]Tipo de documento de origen relacionado con la línea de recepción (por ejemplo, “Purchase Order”).
sourceNoText[50]Número del documento de origen que respalda la línea de recepción.
sourceLineNoIntegerNúmero de línea específico dentro del documento de origen.
itemNoText[50]Código del artículo que se está recibiendo.
unitMeasureCodeText[20]Código de la unidad de medida utilizada para la cantidad recibida (por ejemplo, “KG”).
quantityDecimalCantidad del artículo que se está recibiendo.

Para poder visualizarlo, el usuario debe navegar a la pantalla de Recepción Almacén. Desde esta ventana, es posible visualizar y gestionar todos los documentos de entrada pendientes de recepción de almacén.

Listado de recepciones de almacén

Pantalla listado de recepcion de almacen

** Detalle de la recepción de almacén**

Recepción de almacén

Suscripción del recurso por webhook

POST
https://api.businesscentral.dynamics.com/v2.0/{{TenantID}}/{{enviromentName}}/api/virtualOfficeGroup/integration/v1.0/subscriptions
Content-Type: application/json
Authorization: Bearer {access_token}
{
"notificationUrl": UrlNotificationId,
"resource": "/virtualOfficeGroup/vog/v1.0/companies({{companyId}})/transferOrders",
"clientState": ""
}
POST
https://{namespace}.servicebus.windows.net/{queue_name}/messages
Header{
Content-Type: application/json
Authorization: Bearer {SharedAccessSignature}
companyID: {companyID} // Id de la compañía en Business Central
environment: {environment} // Nombre del ambiente en Business Central
}
body
{
"transferFromCode": "ALMACEN 1", // Codigo del almacen origen
"transferToCode": "ALMACEN 2", // Codigo del almacen destino
"directTransfer": false, // Define si el movimiento es directo o en transito
"transferOrderLines": [
{
"itemNo": "MPPA01090", // Codigo del articulo
"qty": 10, // Cantidad a transferir
"outstandingQuantity": 10, // Cantidad pendiente por transferir
"unitMeasureCode": "KG" // Unidad de medida
},
{
"itemNo": "MPPA01090", // Codigo del articulo
"qty": 10, // Cantidad a transferir
"outstandingQuantity": 10, // Cantidad pendiente por transferir
"unitMeasureCode": "KG" // Unidad de medida
}
]
}

Datos obtenidos

{
"@odata.etag": "W/\"JzIwOzEyMTgyNTIwNDM2NzYxNTg2OTkzMTswMDsn\"",
"No": "I-TRAN0000056",
"id": "8db86854-4b08-f111-8405-000d3ac0ae45",
"transferFromCode": "NUEVO",
"transferFromName": "NUEVA LOCACIÓN",
"transferFromName2": "",
"transferFromAddress": "",
"transferFromAddress2": "",
"transferFromPostCode": "",
"transferFromCity": "",
"transferFromCounty": "",
"transferFromContact": "",
"trsfFromCountryRegionCode": "",
"transferToCode": "SIMPLE",
"transferToName": "ALMACEN SIMPLE",
"transferToName2": "",
"transferToAddress": "",
"transferToAddress2": "",
"transferToPostCode": "",
"transferToCity": "",
"transferToCounty": "",
"transferToContact": "",
"trsfToCountryRegionCode": "",
"status": "Open",
"comment": false,
"directTransfer": false,
"inTransitCode": "TRANSITO",
"shipmentDate": "2026-02-12",
"receiptDate": "2026-02-12",
"postingDate": "2026-02-12",
"shippingAgentCode": "",
"plate": "",
"systemCreatedAt": "2026-02-12T19:45:07.76Z",
"systemModifiedAt": "2026-02-12T19:47:30.867Z",
"transferOrderLines": [
{
"@odata.etag": "W/\"JzE5OzI5MDEzMzkwNDI5NjU0NjExNjcxOzAwOyc=\"",
"documentNo": "I-TRAN0000056",
"id": "73666881-4b08-f111-8405-000d3ac0ae45",
"lineNo": 10000,
"itemNo": "PROD001",
"qty": 30,
"description": "HARINA DE MAIZ ",
"unitOfMeasure": "Kilo",
"qtytoShip": 30,
"qtytoReceive": 0,
"qtyShipped": 0,
"qtyReceived": 0,
"status": "Open",
"unitMeasureCode": "KG",
"systemModifiedAt": "2026-02-12T19:47:30.85Z"
}
]
}

Campos de la respuesta (Encabezado)

NombreTipo de datoDescripción
@odata.contextLa URL que define el esquema y el origen de los datos
@odata.etagStringUn identificador de versión del registro.
idGuidID pedido de transferencia
NoText[20]Código pedido de transferencia
transferFromCodeText[20]El código de la ubicación de origen.
transferFromNameText[100]Nombre comercial o descripción de la ubicación de origen.
transferFromName2Text[50]Campo de nombre secundario para el origen.
transferFromAddressText[100]Dirección física del almacén de origen.
transferFromAddress2Text[50]Dirección adicional del almacén de origen.
transferFromPostCodeText[20]Código postal de la ubicación de origen.
transferFromCityText[30]Ciudad de la ubicación de origen.
transferFromCountyText[30]Provincia, estado o condado de la ubicación de origen.
transferFromContactText[100]Persona de contacto responsable.
trsfToCountryRegionCodeText[10]Código ISO del país/región de destino.
statusText[30]Indica el ciclo de vida del documento.
commentBooleanIndica si existen líneas de comentarios anexadas al encabezado.
directTransferBooleanDefine el flujo: false = requiere envío y recepción; true = movimiento instantáneo.
inTransitCodeText[10]Código del almacén virtual de tránsito.
shipmentDateDatetimeFecha prevista en la que se registra la salida.
receiptDateDatetimeFecha prevista en la que se registra la entrada.
postingDateDatetimeFecha de registro contable.
shippingAgentCodeText[10]Código del transportista.
plateText[10]Campo de texto para la matrícula.
systemCreatedAtDatetimeMarca de tiempo que indica el momento exacto de la creación del registro.
lastModifiedDateTimeDatetimeMarca de tiempo (UTC) de la última vez que se realizó un cambio en cualquier campo de este registro.

Campos de la respuesta (Líneas)

NombreTipo de datoDescripción
@odata.contextLa URL que define el esquema y el origen de los datos
@odata.etagUn identificador de versión del registro.
idGuidID de la línea.
lineNoIntegerEs el identificador secuencial de la línea.
itemNoEl código o SKU del producto en tu inventario.
descriptionTextEl nombre comercial del producto.
qtyDecimal/IntegerLa cantidad total que se planea transferir.
qtytoShipDecimal/IntegerCantidad pendiente por enviar.
qtytoReceiveDecimal/IntegerCantidad pendiente por recibir.
qtyShippedDecimal/IntegerCantidad ya enviada.
qtyReceivedDecimal/IntegerCantidad ya recibida.
statusTextEstado de la línea (Open, Released, etc.).
unitOfMeasureTextUnidad de medida legible.
unitMeasureCodeTextCódigo de la unidad de medida (ej. KG).
lastModifiedDateTimeDatetimeMarca de tiempo (UTC) de la última vez que se realizó un cambio en cualquier campo de este registro.

En Business Central, la creación de un Envío de Almacén a partir de un Pedido de Transferencia no es automática por el simple hecho de registrar, sino que depende estrictamente de la jerarquía de configuración en la ficha del almacén de origen.

POST
https://{namespace}.servicebus.windows.net/{queue_name}/messages
Header{
Content-Type: application/json
Authorization: Bearer {SharedAccessSignature}
companyID: {companyID} // Id de la compañía en Business Central
environment: {environment} // Nombre del ambiente en Business Central
BrokerProperties: {CorrelationId:{correlationId}} // CorrelationId para rastreo del mensaje
}
body
{
"environment":{environment}, // Nombre del entorno
"companyName":{companyID}, //codigo de la compañia
"transferOrderID": "8db86854-4b08-f111-8405-000d3ac0ae45", // ID del pedido de transferencia
}

Datos Obtenidos

{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/30eb258d-51a4-4f58-9c88-bf72d4d3325a/DEMO/api/virtualOfficeGroup/integration/v1.0/$metadata#companies(db22931c-25f2-f011-8405-000d3a88d306)/warehouseShipments/$entity",
"@odata.etag": "W/\"JzE5OzU3ODY5MDI5NDgxOTI4MDc4MDcxOzAwOyc=\"",
"id": "6365b89b-171e-f111-8405-7ced8da8a20f",
"locationCode": "ALMACEN 1",
"no": "A-ENV00003",
"sortingMethod": "None",
"zoneCode": "",
"documentStatus": "Partially_x0020_Shipped",
"postingDate": "2025-11-09",
"shippingAgentCode": "",
"shipmentMethodCode": "",
"status": "Released",
"systemModifiedAt": "2026-03-12T13:35:39.263Z",
"warehouseShipmentLines": [
{
"@odata.etag": "W/\"JzIwOzE2Njc2MTY5MDUwMzQyMDgyNzAyMTswMDsn\"",
"id": "6465b89b-171e-f111-8405-7ced8da8a20f",
"no": "A-ENV00003",
"lineNo": 10000,
"sourceType": 5741,
"sourceSubtype": "0",
"sourceDocument": "Outbound_x0020_Transfer",
"sourceLineNo": 10000,
"quantity": 100,
"itemNo": "MPPA01090",
"description": "Alimento para Pollos",
"unitMeasureCode": "KG",
"qtyperUnitMeasure": 1
}
]
}

campos de la respuesta (Encabezado)

NombreTipo de datoDescripción
@odata.contextLa URL que define el esquema y el origen de los datos
@odata.etagStringUn identificador de versión del registro.
idGuidID del envío de almacén creado.
noText[20]Número de documento del envío de almacén.
locationCodeText[20]Código del almacén desde el cual se realiza el envío.
sortingMethodText[20]Método de ordenamiento utilizado para las líneas del envío.
zoneCodeText[20]Código de la zona dentro del almacén (si aplica).
documentStatusText[20]Estado del documento (ej. “Partially Shipped”).
postingDateDateFecha de registro del envío.
shippingAgentCodeText[20]Código del agente de transporte asociado al envío.
shipmentMethodCodeText[20]Código del método de envío utilizado.
statusText[20]Estado del envío (ej. “Released”).
systemModifiedAtDatetimeFecha y hora de la última modificación del registro.

Campos de la respuesta (Líneas)

NombreTipo de datoDescripción
@odata.etagStringUn identificador de versión del registro.
idGuidID de la línea del envío.
lineNoIntegerNúmero de línea dentro del envío.
sourceTypeIntegerCódigo que representa el tipo de documento de origen
sourceSubtypeText[10]Subtipo del documento de origen (si aplica).
sourceDocumentText[50]Tipo de documento de origen (ej. “Outbound Transfer”).
sourceLineNoIntegerNúmero de línea del documento de origen que respalda esta línea del envío.
itemNoText[50]Código del artículo que se está enviando.
descriptionText[100]Nombre comercial del artículo.
quantityDecimalCantidad del artículo que se está enviando.
unitMeasureCodeText[20]Código de la unidad de medida utilizada para la cantidad enviada
qtyperUnitMeasureDecimalCantidad de unidades por cada unidad de medida (si aplica).

al momento de lanzar esta peticion creara automaticamente el envio del almacen del pedido de transferencia, siempre y cuando en la configuración del almacén de origen, se tenga seleccionado que el proceso de transferencias genere envíos de almacén.

Se podra visualizar el envío de almacén creado desde la pantalla de Envios de Almacén en Business Central, donde se podrán gestionar los envíos generados a partir de los pedidos de transferencia.

Envios de almacén

Detalle del envío de almacén

En business central, la creación de un Picking de Almacén a partir de un Envío de Almacén no es automática por el simple hecho de registrar, sino que depende estrictamente de la jerarquía de configuración en la ficha del almacén de origen.

El picking de almacen se crear a partir de cada linea del envio de almacen, por lo que para crear el picking de almacen se debe consumir el mismo endpoint que para la creación del envio de almacen, pero enviando en el body la información de la linea del pedido de transferencia y no del encabezado.

POST
https://{namespace}.servicebus.windows.net/{queue_name}/messages
Header{
Content-Type: application/json
Authorization: Bearer {SharedAccessSignature}
companyID: {companyID} // Id de la compañía en Business Central
environment: {environment} // Nombre del ambiente en Business Central
BrokerProperties: {CorrelationId:{correlationId}} // CorrelationId para rastreo del mensaje
}
{
"environment":{environment}, // Nombre del entorno
"companyName":{companyID}, //codigo de la compañia
"warehouseShipmentLineID": "8db86854-4b08-f111-8405-000d3ac0ae45", // ID del linea del envio de almacen
}

Datos Obtenidos

{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/30eb258d-51a4-4f58-9c88-bf72d4d3325a/DEMO/api/virtualOfficeGroup/integration/v1.0/$metadata#companies(db22931c-25f2-f011-8405-000d3ac04986)/warehousePickings/$entity",
"@odata.etag": "W/\"JzE5OzU3ODY5MDI5NDgxOTI4MDc4MDcxOzAwOyc=\"",
"id": "6365b89b-171e-f111-8405-7ced8da8a20f",
"locationCode": "ALMACEN 1",
"no": "A-PIC00003",
"sortingMethod": "None",
"sourceDocument": "Outbound_x0020_Transfer",
"sourceno": "I-TRAN0000056",
"postingDate": "2025-11-09",
"shipmentDate": "2025-11-09",
"systemModifiedAt": "2026-03-12T13:35:39.263Z",
"warehouseActivityLines": [
{
"@odata.etag": "W/\"JzIwOzE2Njc2MTY5MDUwMzQyMDgyNzAyMTswMDsn\"",
"id": "6465b89b-171e-f111-8405-7ced8da8a20f",
"no": "A-PIC00003",
"lineNo": 10000,
"sourceType": 5741,
"sourceSubtype": "0",
"sourceDocument": "Outbound_x0020_Transfer",
"sourceLineNo": 10000,
"quantity": 100,
"itemNo": "MPPA01090",
"description": "Alimento para Pollos",
"unitMeasureCode": "KG",
"qtyperUnitMeasure": 1
}
]
}

Campos de la respuesta (Encabezado)

NombreTipo de datoDescripción
@odata.contextLa URL que define el esquema y el origen de los datos
@odata.etagStringUn identificador de versión del registro.
idGuidID del picking de almacén creado.
noText[20]Número de documento del picking de almacén.
locationCodeText[20]Código del almacén desde el cual se realiza el picking.
sortingMethodText[20]Método de ordenamiento utilizado para las líneas del picking.
sourceDocumentText[50]Tipo de documento de origen (ej. “Outbound Transfer”).
sourcenoText[20]Número del documento de origen que respalda este picking.
postingDateDateFecha de registro del picking.
shipmentDateDateFecha de envío asociada al picking.
systemModifiedAtDatetimeFecha y hora de la última modificación del registro.

Campos de la respuesta (Líneas)

NombreTipo de datoDescripción
@odata.etagStringUn identificador de versión del registro.
idGuidID de la línea del picking.
lineNoIntegerNúmero de línea dentro del picking.
sourceTypeIntegerCódigo que representa el tipo de documento de origen
sourceSubtypeIntegerSubtipo del documento de origen (si aplica).
sourceDocumentText[20]Tipo de documento de origen.
sourceLineNoIntegerNúmero de línea del documento de origen que respalda esta línea del picking.
itemNoText[20]Código del artículo que se está preparando para envío.
descriptionText[100]Nombre comercial del artículo.
quantityDecimalCantidad del artículo que se está preparando para envío.
unitMeasureCodeText[20]Código de la unidad de medida utilizada para la cantidad del picking.
qtyperUnitMeasureDecimalCantidad de unidades por cada unidad de medida.

al momento de lanzar esta peticion creara automaticamente el picking del almacen del envio de transferencia, siempre y cuando en la configuración del almacén de origen, se tenga seleccionado que el proceso de transferencias genere envíos de almacén.

Se podra visualizar el picking de almacén creado desde la pantalla de Pickings de Almacén en Business Central, donde se podrán gestionar los pickings generados a partir de los envíos de transferencia.

Pickings de almacén

Detalle del picking de almacén

Para la creacion de ajuste de inventario a partir de la API, se debe configurar la plantilla y sección de diario a utilizar para crear los asientos en el diario de productos.Se pueden como Configuración Ajuste de inventario (SIGERO) en business central.

Pantalla para la configuración de seccion de diario

POST
https://{namespace}.servicebus.windows.net/{queue_name}/messages
Header{
Content-Type: application/json
Authorization: Bearer {sas_token}
companyID: {companyID} // Id de la compañía en Business Central
environment: {environment} // Nombre del ambiente en Business Central
BrokerProperties: {CorrelationId:{correlationId}} // CorrelationId para rastreo del mensaje
}
{
"environment":{environment}, // Nombre del entorno
"companyName":{companyID}, //codigo de la compañia
"itemNo": "1002", // Codigo del Producto
"entryType": "Positive Adjmt.", // Tipo de ajuste: Positivo
"documentNo": "4874", //Numero de documento
"locationCode": "PRINCIPAL", //Codigo el Almacen
"quantity": 40 //Cantidad a ajustar
}
POST
https://{namespace}.servicebus.windows.net/{queue_name}/messages
Header{
Content-Type: application/json
Authorization: Bearer {SharedAccessSignature}
companyID: {companyID} // Id de la compañía en Business Central
environment: {environment} // Nombre del ambiente en Business Central
BrokerProperties: {CorrelationId:{correlationId}} // CorrelationId para rastreo del mensaje
}
{
"environment":{environment}, // Nombre del entorno
"companyName":{companyID}, //codigo de la compañia
"itemNo": "1002", // Codigo del Producto
"entryType": "Negative Adjmt.", //Tipo de ajuste: Negativo
"documentNo": "4874", //Numero de documento a vincular con el ajuste
"locationCode": "PRINCIPAL", //Codigo el Almacen
"quantity": 40 //Cantidad a ajustar
}

Datos obtenidos

{
"@odata.etag": "W/\"JzE5OzUyNzU3Nzg0NzIwNzgxMTYwNjkxOzAwOyc=\"",
"journalId": "af6ea8d5-2c08-f111-8405-002248d31bd2",
"journalTemplateName": "PRODUCTO",
"journalBatchName": "GENERICO",
"lineNo": 20000,
"itemNo": "PROD001",
"description": "HARINA DE MAIZ ",
"entryType": "Positive Adjmt.",
"sourceNo": "",
"documentNo": "4874",
"locationCode": "PRINCIPAL",
"quantity": 40,
"invoicedQuantity": 40,
"unitAmount": 55222.331,
"unitCost": 55222.331,
"amount": 2208893.24,
"discountAmount": 0,
"systemModifiedAt": "2026-02-12T16:06:52.377Z"
}

Campos de la respuesta

NombreTipo de datoDescripción
@odata.contextLa URL que define el esquema y el origen de los datos
@odata.etagStringUn identificador de versión del registro.
journalIdGuidEl ID de la cabecera del diario.
journalTemplateNameText[10]Nombre de la Plantilla del Diario. Define la estructura y el comportamiento del diario.
journalBatchNameText[10]Nombre del Sección.
lineNoIntegerEl número de línea.
itemNoText[20]El código del producto.
descriptionText[100]Texto descriptivo de la línea.
entryTypeText[30]Define la naturaleza del movimiento.
documentNoText[30]El número de documento externo.
locationCodeText[10]Código del Almacén.
quantityDecimalCantidad física que entrará o saldrá del inventario.
invoicedQuantityDecimalCantidad que será procesada financieramente.
unitAmountDecimalPrecio unitario del producto en la línea.
unitCostDecimalCosto unitario que se utilizará para valorar el inventario.
amountDecimalEl valor total de la línea.
discountAmountDecimalValor monetario del descuento aplicado a la línea.
systemModifiedAtDatetimeMarca de tiempo (UTC) de la última vez que se realizó un cambio en cualquier campo de este registro.

Los asientos de diario se pueden visualizar en la venta de diario de productos.

Listado de asientos de diario

Pantalla para el diario de productos

Suscripción de webhook

El consumo de pedidos de compra puede integrarse mediante webhook para detectar cambios sobre el recurso en Business Central.

POST https://api.businesscentral.dynamics.com/v2.0/{{TenantID}}/{{enviromentName}}/api/v2.0/subscriptions
Content-Type: application/json
Authorization: Bearer {access_token}
{
"notificationUrl": "%UrlNotificationId%",
"resource": "api/v2.0/companies({{companyId}})/purchaseOrders",
"clientState": ""
}

Consumir Endpoints

Para consultar manualmente las órdenes de compra, puedes consumir el endpoint estándar de Business Central.

GET
https://api.businesscentral.dynamics.com/v2.0/{{TenantID}}/{{enviromentName}}/api/v2.0/companies({{companyId}})/purchaseOrders?$expand=PurchaseOrderLines&$filter=status eq 'open' and fullyReceived eq false
Content-Type: application/json
Authorization: Bearer {access_token}

Datos obtenidos

{
"@odata.etag": "W/\"JzIwOzE0OTk0MjAxMzgwMTQ2OTIxNzU4MTswMDsn\"",
"id": "f454e208-1222-f011-9af7-6045bd3b911d",
"number": "C-PDA0000262",
"orderDate": "2025-04-25",
"postingDate": "2025-04-25",
"vendorId": "3efbdd7d-da21-f011-9af7-000d3ac04986",
"vendorNumber": "C-PROV0000013",
"vendorName": "PROVEEDOR 4",
"payToName": "PROVEEDOR 4",
"payToVendorId": "3efbdd7d-da21-f011-9af7-000d3ac04986",
"payToVendorNumber": "C-PROV0000013",
"shipToName": "ALMACEN PRINCIPAL",
"shipToContact": "",
"buyFromAddressLine1": "",
"buyFromAddressLine2": "",
"buyFromCity": "",
"buyFromCountry": "",
"buyFromState": "",
"buyFromPostCode": "",
"payToAddressLine1": "",
"payToAddressLine2": "",
"payToCity": "",
"payToCountry": "",
"payToState": "",
"payToPostCode": "",
"shipToAddressLine1": "",
"shipToAddressLine2": "",
"shipToCity": "",
"shipToCountry": "",
"shipToState": "",
"shipToPostCode": "",
"shortcutDimension1Code": "",
"shortcutDimension2Code": "",
"currencyId": "7d2ee4e9-5021-f011-9af7-002248dfda48",
"currencyCode": "USD",
"pricesIncludeTax": false,
"paymentTermsId": "6f2ee4e9-5021-f011-9af7-002248dfda48",
"shipmentMethodId": "00000000-0000-0000-0000-000000000000",
"purchaser": "",
"requestedReceiptDate": "0001-01-01",
"discountAmount": 0,
"discountAppliedBeforeTax": true,
"totalAmountExcludingTax": 300,
"totalTaxAmount": 48,
"totalAmountIncludingTax": 348,
"fullyReceived": false,
"status": "Open",
"lastModifiedDateTime": "2025-04-25T20:17:52.347Z",
"purchaseOrderLines": [
{
"@odata.etag": "W/\"JzE5OzcwMjk4MTM5NjI2MDU1MzExNjYxOzAwOyc=\"",
"id": "400ba948-1222-f011-9af7-6045bd3b911d",
"documentId": "f454e208-1222-f011-9af7-6045bd3b911d",
"sequence": 10000,
"itemId": "5be2c78d-0f22-f011-9af7-6045bd3b911d",
"accountId": "00000000-0000-0000-0000-000000000000",
"lineType": "Item",
"lineObjectNumber": "PROD007",
"description": "SULFATO DE SODIO",
"description2": "",
"unitOfMeasureId": "4fcfdbef-5021-f011-9af7-002248dfda48",
"unitOfMeasureCode": "KG",
"quantity": 300,
"directUnitCost": 1,
"discountAmount": 0,
"discountPercent": 0,
"discountAppliedBeforeTax": false,
"amountExcludingTax": 300,
"taxCode": "IVA 16",
"taxPercent": 16,
"totalTaxAmount": 48,
"amountIncludingTax": 348,
"invoiceDiscountAllocation": 0,
"netAmount": 300,
"netTaxAmount": 48,
"netAmountIncludingTax": 348,
"expectedReceiptDate": "2025-04-25",
"receivedQuantity": 295,
"invoicedQuantity": 0,
"invoiceQuantity": 295,
"receiveQuantity": 0,
"itemVariantId": "00000000-0000-0000-0000-000000000000",
"locationId": "79231df8-d921-f011-9af7-000d3ac04986"
}
]
},

Campos de la respuesta (Encabezado)

NombreTipoDescripción
@odata.etagIdentificador de versión para control de concurrencia.
idGUIDIdentificador único universal del registro.
numberText[20]Códigoo pedido de compra
orderDateDateFecha de emisión del documento.
postingDateDateFecha contable del registro.
vendorIdGUIDID único del proveedor vinculado.
vendorNumberText[20]Código maestro del proveedor
vendorNameText[100]Nombre o razón social del proveedor.
payToNameText[100]Nombre de la entidad a la que se paga.
payToVendorIdGUIDID del proveedor receptor del pago.
payToVendorNumberText[20]Código del proveedor receptor del pago.
shipToNameText[100]Nombre del destino de entrega.
shipToContactText[100]Persona de contacto en el punto de entrega.
buyFromAddressLine1Text[100]Dirección principal de compra.
buyFromAddressLine2Text[50]Dirección secundaria de compra.
buyFromCityText[50]Ciudad del proveedor.
buyFromCountryText[10]País del proveedor.
buyFromStateText[40]Estado o provincia del proveedor.
buyFromPostCodeText[20]Código postal del proveedor.
payToAddressLine1Text[100]Dirección de facturación (Línea 1).
payToAddressLine2Text[50]Dirección de facturación (Línea 2).
payToCityText[50]Ciudad de facturación.
payToCountryText[20]País de facturación.
payToStateText[40]Estado de facturación.
shipToAddressLine1Text[100]Dirección de envío (Línea 1).
shipToAddressLine2Text[50]Dirección de envío (Línea 2).
shipToCityText[30]Ciudad de envío.
shipToCountryText[20]País de envío.
shipToStateText[40]Estado de envío.
shipToPostCodeText[20]Código postal de envío.
shortcutDimension1CodeText[20]Código de dimensión contable 1.
shortcutDimension2CodeText[20]Código de dimensión contable 2.
currencyIdGUIDIdentificador único de la divisa.
currencyCodeText[10]Código ISO de la moneda.
pricesIncludeTaxBooleanIndica si los precios incluyen impuestos.
paymentTermsIdGUIDID de los términos de pago configurados.
shipmentMethodIdGUIDID del método de envío.
purchaserText[20]Código del agente de compras.
requestedReceiptDateDateFecha de recepción solicitada por el cliente.
discountAmountDecimalMonto total de descuento aplicado.
discountAppliedBeforeTaxBooleanDefine si el descuento afecta la base imponible.
totalAmountExcludingTaxDecimalSubtotal antes de impuestos.
totalTaxAmountDecimalMonto de impuestos calculados.
totalAmountIncludingTaxDecimalTotal bruto de la transacción.
fullyReceivedBooleanIndica si se recibió el 100% de la mercancía.
statusStringEstado del flujo del documento.
lastModifiedDateTimeDateTimeSello de tiempo de la última edición.

Campos de la respuesta (Detalle)

NombreTipoDescripción
@odata.etagStringIdentificador de versión para control de concurrencia.
idGUIDIdentificador único de la línea de documento.
documentIdGUIDID del documento principal (cabecera) al que pertenece.
sequenceIntegerOrden de aparición de la línea en el documento (10000).
itemIdGUIDIdentificador único del producto en el sistema.
accountIdGUIDID de la cuenta contable asociada (si aplica).
lineTypeStringTipo de línea (ej. Item/Producto).
lineObjectNumberStringCódigo de referencia del producto (PROD007).
descriptionStringDescripción del producto (SULFATO DE SODIO).
description2StringInformación adicional o secundaria del producto.
unitOfMeasureIdGUIDID de la unidad de medida utilizada.
unitOfMeasureCodeStringCódigo de la unidad de medida (KG).
quantityDecimalCantidad total solicitada (300).
directUnitCostDecimalCosto unitario directo del producto.
discountAmountDecimalValor monetario del descuento en la línea.
discountPercentDecimalPorcentaje de descuento aplicado.
discountAppliedBeforeTaxBooleanIndica si el descuento se aplicó antes de impuestos.
amountExcludingTaxDecimalImporte neto antes de impuestos (300).
taxCodeStringCódigo del grupo de impuestos (IVA 16).
taxPercentDecimalPorcentaje de impuesto aplicado (16).
totalTaxAmountDecimalImporte total de impuestos de la línea (48).
amountIncludingTaxDecimalImporte total con impuestos incluidos (348).
invoiceDiscountAllocationDecimalParte proporcional del descuento de factura asignado.
netAmountDecimalImporte neto después de descuentos.
netTaxAmountDecimalImporte de impuesto neto aplicado.
netAmountIncludingTaxDecimalTotal neto final con impuestos.
expectedReceiptDateDateFecha estimada de recepción de la mercancía.
receivedQuantityDecimalCantidad física ya recibida (295).
invoicedQuantityDecimalCantidad que ya ha sido facturada.
invoiceQuantityDecimalCantidad pendiente o lista para facturar (295).
receiveQuantityDecimalCantidad pendiente por recibir físicamente.
itemVariantIdGUIDID de la variante del producto (si aplica).
locationIdGUIDID del almacén o ubicación de destino.

El maestro de artículos contiene toda la información relacionada con los productos que maneja la empresa.

Suscripción del recurso por webhook

POST
https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{environmentName}/api/v2.0/subscriptions
Content-Type: application/json
Authorization: Bearer {access_token}
body
{
"notificationUrl": "%UrlNotificationId%",
"resource": "/api/v2.0/companies({{companyId}})/Items",
"clientState": ""
}

Endpoint para Listado de Articulos (Sincronización Manual)

GET
https://api.businesscentral.dynamics.com/v2.0/{{TenantID}}/{{enviromentName}}/api/v2.0/companies({{companyId}})/items
Content-Type: application/json
Authorization: Bearer {access_token}

Datos obtenidos

{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/30eb258d-51a4-4f58-9c88-bf72d4d3325a/TEST/api/v2.0/$metadata#companies(41cc1c74-5021-f011-9af7-000d3ac04986)/items",
"value": [
{
"@odata.etag": "W/\"JzE5OzE3Mzg5MzEwMDE1NjQyNjE0OTExOzAwOyc=\"",
"id": "1ea0551c-7378-f011-8eef-002248de9fb5",
"number": "ALQUILER",
"displayName": "Alquiler de inmueble",
"displayName2": "",
"type": "Service",
"itemCategoryId": "00000000-0000-0000-0000-000000000000",
"itemCategoryCode": "",
"blocked": false,
"gtin": "",
"inventory": 0,
"unitPrice": 0,
"priceIncludesTax": false,
"unitCost": 0,
"taxGroupId": "00000000-0000-0000-0000-000000000000",
"taxGroupCode": "",
"baseUnitOfMeasureId": "5bcfdbef-5021-f011-9af7-002248dfda48",
"baseUnitOfMeasureCode": "UND",
"generalProductPostingGroupId": "6dcfdbef-5021-f011-9af7-002248dfda48",
"generalProductPostingGroupCode": "SERVICIOS",
"inventoryPostingGroupId": "00000000-0000-0000-0000-000000000000",
"inventoryPostingGroupCode": "",
"lastModifiedDateTime": "2025-08-13T18:28:16.41Z"
}
]}

Campos de la respuesta

NombreTipo de datoDescripción
@odata.contextString (URL)La URL que define el esquema y el origen de los datos.
@odata.etagStringUn identificador de versión del registro (concurrencia).
idGuidEl GUID (Identificador Único Global) interno de Business Central.
numberText[20]Es el código de producto (No. de artículo).
displayNameText[100]El nombre principal del artículo que aparecerá en los documentos.
displayName2Text[50]Descripción secundaria o extendida para nombres en otros idiomas o detalles técnicos.
typeEnum/Text[20]Define el tipo de productos (Inventory, Service o Non-Inventory).
itemCategoryIdGuidID de la categoría del producto.
itemCategoryCodetext[20]Código de la categoría asignada.
blockedBooleanSi es true, el ítem está deshabilitado para transacciones.
gtinText[14]Código de barras estándar internacional.
inventoryDecimalCantidad física actual en existencias.
unitPriceDecimalPrecio de venta unitario antes de impuestos.
priceIncludesTaxBooleanIndica si el valor en unitPrice ya contiene el impuesto (IVA/VAT).
unitCostDecimalCosto unitario del producto.
taxGroupIdGuidID del grupo de impuestos.
taxGroupCodeText[20]Código que vincula el producto con una configuración de impuestos específica.
baseUnitOfMeasureIdGuidID de la unidad de medida base.
baseUnitOfMeasureCodeText[10]Código de la unidad de medida (ej. PZ, UND, KG).
generalProductPostingGroupIdGuidID del grupo de registro de producto (General).
generalProductPostingGroupCodeText[20]Determina las cuentas de ingresos y gastos en el Libro Mayor.
inventoryPostingGroupIdGuidID del grupo de registro de inventario.
inventoryPostingGroupCodeText[20]Determina la cuenta de activos (Inventario) en el balance.
lastModifiedDateTimeDatetimeMarca de tiempo (UTC) de la última modificación del registro.

El maestro de clientes contiene toda la información relacionada con los clientes registrados en la empresa.

Suscripción del recurso por webhook

POST
https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{environmentName}/api/v2.0/subscriptions
Content-Type: application/json
Authorization: Bearer {access_token}
body
{
"notificationUrl": "UrlNotificationId",
"resource": "/api/v2.0/companies({{companyId}})/customers",
"clientState": ""
}

Endpoint para Listado de clientes (Sincronización Manual)

GET
https://api.businesscentral.dynamics.com/v2.0/{{TenantID}}/{{enviromentName}}/api/v2.0/companies({{companyId}})/customers
Content-Type: application/json
Authorization: Bearer {access_token}

Datos obtenidos

{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/30eb258d-51a4-4f58-9c88-bf72d4d3325a/TEST/api/v2.0/$metadata#companies(41cc1c74-5021-f011-9af7-000d3ac04986)/customers",
"value": [
{
"@odata.etag": "W/\"JzE5OzQyMzIwNDQ4NTc1OTY5Njg3ODkxOzAwOyc=\"",
"id": "edceedac-2825-f011-9af7-6045bd39528a",
"number": "V-CLI0000025",
"displayName": "CLIENTE MODIFICADO",
"type": "Company",
"addressLine1": "",
"addressLine2": "",
"city": "",
"state": "",
"country": "",
"postalCode": "",
"phoneNumber": "",
"email": "",
"website": "",
"salespersonCode": "",
"balanceDue": 0,
"creditLimit": 0,
"taxLiable": false,
"taxAreaId": "e9cfdbef-5021-f011-9af7-002248dfda48",
"taxAreaDisplayName": "Clientes Nacionales",
"taxRegistrationNumber": "",
"currencyId": "7d2ee4e9-5021-f011-9af7-002248dfda48",
"currencyCode": "USD",
"paymentTermsId": "6f2ee4e9-5021-f011-9af7-002248dfda48",
"shipmentMethodId": "00000000-0000-0000-0000-000000000000",
"paymentMethodId": "00000000-0000-0000-0000-000000000000",
"blocked": "_x0020_",
"lastModifiedDateTime": "2026-02-03T14:31:47.067Z"
}

Campos de la respuesta

NombreTipo de datoDescripción
@odata.contextString (URL)La URL que define el esquema y el origen de los datos.
@odata.etagStringUn identificador de versión del registro (control de concurrencia).
idGuidEl GUID (Identificador Único Global) interno del cliente.
numberText[20]Es el código de cliente (No. de cliente).
displayNameText[100]El nombre principal del cliente que aparecerá en los documentos.
typeEnumDefine el tipo de cliente (Person o Company).
addressLine1Text[100]Campo para la dirección principal.
addressLine2Text[50]Campo para información adicional de la dirección.
cityText[30]Nombre de la ciudad de residencia o de despacho del cliente.
stateText[30]Estado, provincia, departamento o región administrativa.
countryText[10]Código ISO del país.
postalCodeText[20]Código o zona postal.
phoneNumberText[30]Número telefónico de contacto del cliente.
emailText[80]Dirección de correo electrónico principal.
websiteText[255]Dirección URL del portal web del cliente.
salespersonCodeText[20]Código del vendedor o asesor comercial responsable.
balanceDueDecimalMonto total de las facturas vencidas e impagadas.
creditLimitDecimalLímite de crédito financiero otorgado al cliente.
taxLiableBooleanSi es true, el sistema calcula impuestos en sus ventas.
taxAreaIdGuidID del área de impuestos asociada al cliente.
taxAreaDisplayNameText[100]Nombre legible de la configuración de impuestos.
taxRegistrationNumberText[20]Número de identificación tributaria legal (RUC/NIT/RIF).
currencyIdGuidIdentificador técnico (GUID) de la moneda del cliente.
currencyCodeText[10]Código internacional de la moneda (ej. USD, EUR).
paymentTermsIdGuidID que define las condiciones y días de crédito.
shipmentMethodIdGuidID que define la logística o método de entrega.
paymentMethodIdGuidID que indica la forma de pago habitual del cliente.
blockedText[10]Estado de bloqueo administrativo (ej. Blank, Ship, Invoice, All).
lastModifiedDateTimeDatetimeMarca de tiempo (UTC) de la última modificación del registro.

El maestro de almacenes contiene toda la información relacionada con los sitios registrados en la empresa.

Suscripción del recurso por webhook

POST
https://api.businesscentral.dynamics.com/v2.0/{{TenantID}}/{{enviromentName}}/api/virtualOfficeGroup/integration/v1.0/subscriptions
Content-Type: application/json
Authorization: Bearer {access_token}
body
{
"notificationUrl": "UrlNotificationId",
"resource": "/virtualOfficeGroup/vog/v1.0/companies({{companyId}})/locations",
"clientState": ""
}

Endpoint para Listado de almacenes (Sincronización Manual)

GET
https://api.businesscentral.dynamics.com/v2.0/{{TenantID}}/{{enviromentName}}/api/virtualOfficeGroup/integration/v1.0/companies({{companyId}})/Locations
Content-Type: application/json
Authorization: Bearer {access_token}

Datos obtenidos

{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/30eb258d-51a4-4f58-9c88-bf72d4d3325a/TEST/api/v2.0/$metadata#companies(41cc1c74-5021-f011-9af7-000d3ac04986)/locations/$entity",
"@odata.etag": "W/\"JzE5OzQxMTUyNTY0NzUzNjg4MDEyODIxOzAwOyc=\"",
"id": "79231df8-d921-f011-9af7-000d3ac04986",
"code": "PRINCIPAL",
"displayName": "ALMACEN PRINCIPAL",
"contact": "",
"addressLine1": "",
"addressLine2": "",
"city": "",
"state": "",
"country": "",
"postalCode": "",
"phoneNumber": "",
"email": "",
"website": "",
"requirePicking": false,
"requireReceive": false,
"requireShipment": false,
"lastModifiedDateTime": "2025-04-25T13:34:24.23Z"
}

Campos de la respuesta

NombreTipo de datoDescripción
@odata.contextString (URL)La URL que define el esquema y el origen de los datos
@odata.etagStringUn identificador de versión del registro.
idGuidID del almacén.
codeText[10]Es el código del almacén.
displayNameText[100]Nombre descriptivo del almacén.
contactText[100]Nombre del contacto.
addressLine1Text[100]Campo para la dirección principal.
addressLine2Text[50]Campo para información adicional de la dirección.
cityText[30]Nombre de la ciudad de residencia o de despacho.
stateText[30]Estado, provincia, departamento o región administrativa.
countryText[30]Código del país.
postalCodeText[20]Código o zona postal.
phoneNumberText[30]Número telefónico de contacto.
emailText[80]Dirección de correo electrónico.
websiteText[255]Dirección URL del almacén.
requirePickingBooleanSi es requerido el picking en las transferencias
requireReceiveBooleanSi es requerido la recepción en las transferencias
requireShipmentBooleanSi es requerido el envio del almacen en las transferencias

| lastModifiedDateTime | Datetime | Marca de tiempo (UTC) de la última vez que se realizó un cambio en cualquier campo de este registro. |

El maestro de proveedores contiene toda la información relacionada con todos los proveedores registrados en la empresa.

Suscripción del recurso por webhook

POST
https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{environmentName}/api/v2.0/subscriptions
Content-Type: application/json
Authorization: Bearer {access_token}
body
{
"notificationUrl": "UrlNotificationId",
"resource": "/api/v2.0/companies(%companyId%)/vendors",
"clientState": ""
}

Endpoint para Listado de proveedores (Sincronización Manual)

GET
https://api.businesscentral.dynamics.com/v2.0/%TenantID%/%enviromentName%/api/v2.0/companies(%companyId%)/vendors
Content-Type: application/json
Authorization: Bearer {access_token}

Datos obtenidos

{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/30eb258d-51a4-4f58-9c88-bf72d4d3325a/TEST/api/v2.0/$metadata#companies(41cc1c74-5021-f011-9af7-000d3ac04986)/vendors/$entity",
"@odata.etag": "W/\"JzIwOzEyNDExOTE4NjY5ODI1NDc2OTA2MTswMDsn\"",
"id": "8797deb4-5121-f011-9af7-002248dfda48",
"number": "C-PROV0000008",
"displayName": "PROVEEDOR 1",
"addressLine1": "",
"addressLine2": "",
"city": "Caracas",
"state": "Distrito Capital",
"country": "VE",
"postalCode": "1010",
"phoneNumber": "",
"email": "",
"website": "",
"taxRegistrationNumber": "",
"currencyId": "7d2ee4e9-5021-f011-9af7-002248dfda48",
"currencyCode": "USD",
"irs1099Code": "",
"paymentTermsId": "00000000-0000-0000-0000-000000000000",
"paymentMethodId": "00000000-0000-0000-0000-000000000000",
"taxLiable": false,
"blocked": "_x0020_",
"balance": 3840813.19,
"lastModifiedDateTime": "2026-02-05T00:00:07.777Z"
}

Campos de la respuesta

NombreTipo de datoDescripción
@odata.contextString (URL)La URL que define el esquema y el origen de los datos.
@odata.etagStringUn identificador de versión del registro.
idGuidID de unidad.
numberText[20]Es el código del proveedor.
displayNameText[100]Nombre descriptivo del proveedor.
addressLine1Text[100]Campo para la dirección principal.
addressLine2Text[50]Campo para información adicional de la dirección.
cityText[30]Nombre de la ciudad de residencia o de despacho del cliente.
stateText[30]Estado, provincia, departamento o región administrativa.
countryText[10]Código del país.
postalCodeText[20]Código o zona postal.
phoneNumberText[30]Número telefónico de contacto.
emailText[80]Dirección de correo electrónico.
websiteText[255]Dirección URL del almacén.
taxRegistrationNumberText[50]Es el identificador fiscal.
taxLiableBooleanDefine si el proveedor está sujeto a impuestos.
currencyIdGuidIdentificador técnico (GUID) de la moneda que el cliente.
currencyCodeText[10]Código internacional de la moneda.
balanceDecimalEs la suma de todos los movimientos contables abiertos.
blockedBooleanEstado de bloqueo administrativo.
paymentTermsIdGuidIdentificador técnico (GUID) que define los días de crédito.
paymentMethodIdGuidIdentificador (GUID) que indica cómo suele pagar el proveedor.
irs1099CodeText[50]Específico para la localización de EE. UU.
lastModifiedDateTimeDatetimeMarca de tiempo (UTC) de la última vez que se realizó un cambio en cualquier campo de este registro.

El maestro de unidades contiene toda la información relacionada con todas las unidades de medidas utilizadas en los artículos registrados en la empresa.

Suscripción del recurso por webhook

POST
https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{environmentName}/api/v2.0/subscriptions
Content-Type: application/json
Authorization: Bearer {access_token}
{
"notificationUrl": "UrlNotificationId",
"resource": "/api/v2.0/companies({companyId})/unitsOfMeasure",
"clientState": ""
}

Endpoint para Listado de unidades de medida (Sincronización Manual)

GET
https://api.businesscentral.dynamics.com/v2.0/{TenantID}/{enviromentName}/api/v2.0/companies({companyId})/unitsOfMeasure
Content-Type: application/json
Authorization: Bearer {access_token}

Datos obtenidos

{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/30eb258d-51a4-4f58-9c88-bf72d4d3325a/TEST/api/v2.0/$metadata#companies(41cc1c74-5021-f011-9af7-000d3ac04986)/unitsOfMeasure/$entity",
"@odata.etag": "W/\"JzIwOzExODk2NTgyNjA1MDcwOTE1NjE4MTswMDsn\"",
"id": "4acfdbef-5021-f011-9af7-002248dfda48",
"code": "BOTELLA",
"displayName": "Botella",
"internationalStandardCode": "BOTELLA",
"symbol": "",
"lastModifiedDateTime": "2025-04-24T21:13:43.817Z"
}

Campos de la respuesta

NombreTipo de datoDescripción
@odata.contextString (URL)La URL que define el esquema y el origen de los datos
@odata.etagStringUn identificador de versión del registro.
idGuidID de unidad.
codeText[10]Es el identificador que el usuario ve y utiliza.
displayNameText[50]El nombre descriptivo de la unidad.
internationalStandardCodeText[50]Código estándar internacional de la unidad.
symbolText[10]El símbolo gráfico de la unidad.
lastModifiedDateTimeDatetimeMarca de tiempo (UTC) de la última vez que se realizó un cambio en cualquier campo de este registro.

El maestro de transportistas contiene toda la información relacionada con el listado de transportistas registrados en la empresa.

Suscripción del recurso por webhook

POST
https://api.businesscentral.dynamics.com/v2.0/{{TenantID}}/{{enviromentName}}/api/virtualOfficeGroup/integration/v1.0/subscriptions
Content-Type: application/json
Authorization: Bearer {access_token}
{
"notificationUrl": UrlNotificationId,
"resource": "/virtualOfficeGroup/vog/v1.0/companies({{companyId}})/shippingAgents",
"clientState": ""
}

Endpoint para Listado de transportistas (Sincronización Manual)

Sección titulada «Endpoint para Listado de transportistas (Sincronización Manual)»
GET
https://api.businesscentral.dynamics.com/v2.0/{{TenantID}}/{{enviromentName}}/api/virtualOfficeGroup/integration/v1.0/companies({companyId})/ShippingAgents
Content-Type: application/json
Authorization: Bearer {access_token}

Datos obtenidos

{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/30eb258d-51a4-4f58-9c88-bf72d4d3325a/TEST/ODataV4/$metadata#Company('41cc1c74-5021-f011-9af7-000d3ac04986')/ShippingAgents",
"value": [
{
"@odata.etag": "W/\"JzIwOzE3ODEwMDE1NTU4ODg0NjM0OTc2MTswMDsn\"",
"id": "b057d38a-c006-f111-8405-7ced8da9239b",
"code": "ALEX",
"name": "Alexander",
"lastName": "",
"companyName": "",
"nitCompany": "",
"plate": "",
"accountNo": "",
"lastModifiedDateTime": "2026-02-26T14:30:23.28Z"
}
]
}

Campos de la respuesta

NombreTipo de datoDescripción
@odata.contextLa URL que define el esquema y el origen de los datos
@odata.etagUn identificador de versión del registro.
idGuidID del Transportista.
codeText[10]Es el código del transportista.
nameText[50]Nombre del transportista.
lastNameText[50]Apellido del transportista
companyNameText[100]Nombre de compañía
nitCompanyText[50]Rif de compañía
plateText[20]Placa del vehículo
accountNoText[30]Número de cuenta
lastModifiedDateTimeDatetimeMarca de tiempo (UTC) de la última vez que se realizó un cambio en cualquier campo de este registro.

El maestro de código motivo contiene toda la información relacionada con el listado de códigos de motivo utilizados en ajustes de inventario y transferencia de pedidos.

Suscripción del recurso por webhook

{
"notificationUrl": "UrlNotificationId",
"resource": "/virtualOfficeGroup/vog/v1.0/companies({{companyId}})/reasonCodes",
"clientState": ""
}

Endpoint para Listado (Sincronización Manual)

GET

https://api.businesscentral.dynamics.com/v2.0/{{TenantID}}/{{enviromentName}}/ODataV4/Company('{{companyId}}')/ReasonCodes

Content-Type: application/json Authorization: Bearer {access_token}

Datos obtenidos

{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/30eb258d-51a4-4f58-9c88-bf72d4d3325a/TEST/ODataV4/$metadata#Company('41cc1c74-5021-f011-9af7-000d3ac04986')/ReasonCodes",
"value": [
{
"@odata.etag": "W/\"JzE4OzU4Nzk3ODU4NjA2OTE2OTgyNTE7MDA7Jw==\"",
"code": "ACTIVO",
"description": "CODIGO ACTIVO",
"status": true,
"adjustment": false,
"accountNo": "",
"itemTransfer": true,
"inTransit": false,
"id": "3a0342ee-4013-f111-8341-002248d31bd2",
"systemCreatedAt": "2026-02-26T18:28:31.28Z",
"systemModifiedAt": "2026-02-26T18:38:34.72Z"
}
]
}

Campos de la respuesta

NombreTipo de datoDescripción
@odata.contextLa URL que define el esquema y el origen de los datos
@odata.etagUn identificador de versión del registro.
idGuidID del recurso.
codeText[10]Código de motivo
descriptionText[50]Descripción del motivo.
statusBooleanEstado del código de motivo
adjustmentBooleanSi está activo para ajuste de inventario
accountNoText[20]Cuenta contable asociada
itemTransferBooleanSi está activo para artículos en transferencias
inTransitBooleanSi está activo para transferencia en tránsito
systemCreatedAtDatetimeMarca de tiempo (UTC) de la fecha en que se registró el código de motivo
systemModifiedAtDatetimeMarca de tiempo (UTC) de la última vez que se realizó un cambio en cualquier campo de este registro.