Endpoints de la API. Especificación exacta de cada operación de la API v1 (parámetros, cuerpo, respuestas y ejemplos), generada del documento OpenAPI con el que se valida cada respuesta real. Los procedimientos completos están en Guías.
GET
/transfer-orders/{id}
Consultar una orden de transferencia
- Alcance (cliente de integración)
transfers:read- Permiso (token de usuario)
- Token válido
- Idempotency-Key
- No aplica
- Requisitos
- Órdenes de transferencia activas
Parámetros de ruta
-
idinteger obligatorioIdentificador numérico del recurso.
Respuestas
200 La orden con sus líneas y unidades pedidas, surtidas, despachadas y recibidas.
-
dataobjeto obligatorio26 campos de
data-
objectstring «transfer_order» obligatorio -
idinteger obligatorio -
codestring obligatorio -
statusstring obligatorioValores:draft,released,picking,picked,in_transit,receiving,received,closed,cancelled -
status_labelstring -
headlinestring | null -
has_discrepancybooleanLo recibido no coincide con lo despachado.
-
fromobjeto obligatorio3 campos de
from-
idinteger | null -
codestring | null -
namestring | null
-
-
toobjeto obligatorio3 campos de
to-
idinteger | null -
codestring | null -
namestring | null
-
-
priorityinteger -
reasonstring | null -
due_atstring (date-time) | null -
lines_countinteger -
unitsobjeto obligatorio4 campos de
units-
requestednumber -
pickednumber -
dispatchednumber -
receivednumber
-
-
dispatched_atstring (date-time) | null -
received_atstring (date-time) | null -
closed_atstring (date-time) | null -
seal_numberstring | null -
vehicle_platestring | null -
carrier_idinteger | null -
external_refstring | null -
sourcestringValores:web,api,import,sap -
picking_idinteger | null -
receipt_idinteger | null -
sapobjeto | nullEstado del envío al ERP cuando aplica.
-
linesarray de objetos | nullnullen el listado; en el detalle, las líneas.11 campos de
lines-
idinteger -
line_numinteger -
product_idinteger | null -
item_codestring | null -
qtynumber -
picked_qtynumber -
dispatched_qtynumber -
received_qtynumber -
batch_numstring | null -
serial_numbersarray de textos -
statusstring
-
-
401 Falta el token o no es válido.
Cuerpo: el sobre de error.
402 La función no está en el plan de la empresa, o la cuenta está suspendida o cancelada.
Cuerpo: el sobre de error.
403
Al cliente le falta el alcance (missing_scope), al usuario el permiso (forbidden), o el token de usuario no
tiene acceso a la ruta (client_not_allowed: aplicación móvil o usuario con verificación en dos pasos).
Cuerpo: el sobre de error.
404 El recurso no existe.
Cuerpo: el sobre de error.
429
Se superó el límite por minuto. Reintente después de los segundos de Retry-After.
Cuerpo: el sobre de error.
Probar
Probar con una instancia
curl "https://empresa.chainlink.mx/api/v1/transfer-orders/101" \
-H "Authorization: Bearer $CHAINLINK_TOKEN" \
-H "Accept: application/json"
<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://empresa.chainlink.mx/api/v1/transfer-orders/101', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('CHAINLINK_TOKEN'),
'Accept' => 'application/json',
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://empresa.chainlink.mx/api/v1/transfer-orders/101', {
headers: {
Authorization: `Bearer ${process.env.CHAINLINK_TOKEN}`,
Accept: 'application/json',
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://empresa.chainlink.mx/api/v1/transfer-orders/101",
headers={
"Authorization": f"Bearer {os.environ['CHAINLINK_TOKEN']}",
"Accept": "application/json",
},
)
data = response.json()
{
"data": {
"object": "transfer_order",
"id": 41,
"code": "TR-000041",
"status": "in_transit",
"status_label": "En tránsito",
"headline": "CEDIS-GDL → TDA-MTY",
"has_discrepancy": false,
"from": {
"id": 1,
"code": "CEDIS-GDL",
"name": "CEDIS Guadalajara"
},
"to": {
"id": 2,
"code": "TDA-MTY",
"name": "Tienda Monterrey"
},
"priority": 50,
"reason": "Reabasto semanal",
"due_at": "2026-10-08T18:00:00-06:00",
"lines_count": 1,
"units": {
"requested": 24,
"picked": 24,
"dispatched": 24,
"received": 0
},
"dispatched_at": "2026-10-07T09:30:00-06:00",
"received_at": null,
"closed_at": null,
"seal_number": "S-99812",
"vehicle_plate": "JAL-123-A",
"carrier_id": 3,
"external_ref": "TR-2026-0107",
"source": "api",
"picking_id": 6120,
"receipt_id": null,
"sap": {
"dispatch": null,
"receipt": null
},
"lines": [
{
"id": 77,
"line_num": 0,
"product_id": 101,
"item_code": "P-1001",
"qty": 24,
"picked_qty": 24,
"dispatched_qty": 24,
"received_qty": 0,
"batch_num": null,
"serial_numbers": [],
"status": "dispatched"
}
]
}
}
{
"error": {
"code": "unauthenticated",
"message": "Falta el token de acceso o ya no es válido.",
"doc_url": "https://chainlink.mx/developers/errores#unauthenticated",
"request_id": "req_01j9x2m4k7q8r5t6v3w0y1z2a3"
},
"errors": [],
"message": "Falta el token de acceso o ya no es válido."
}
{
"error": {
"code": "feature_not_in_plan",
"message": "Función no disponible en tu plan actual.",
"feature": "webhooks.enabled",
"upgrade_url": "/billing/plans",
"doc_url": "https://chainlink.mx/developers/errores#feature_not_in_plan",
"request_id": "req_01j9x2m4k7q8r5t6v3w0y1z2a3"
},
"errors": [],
"message": "Función no disponible en tu plan actual."
}
{
"error": {
"code": "missing_scope",
"message": "El cliente no tiene el alcance products:write.",
"scope": "products:write",
"doc_url": "https://chainlink.mx/developers/errores#missing_scope",
"request_id": "req_01j9x2m4k7q8r5t6v3w0y1z2a3"
},
"errors": [],
"message": "El cliente no tiene el alcance products:write."
}
{
"error": {
"code": "not_found",
"message": "El recurso no existe.",
"doc_url": "https://chainlink.mx/developers/errores#not_found",
"request_id": "req_01j9x2m4k7q8r5t6v3w0y1z2a3"
},
"errors": [],
"message": "El recurso no existe."
}
{
"error": {
"code": "rate_limited",
"message": "Superaste el límite de solicitudes por minuto. Espera los segundos que indica Retry-After.",
"doc_url": "https://chainlink.mx/developers/errores#rate_limited",
"request_id": "req_01j9x2m4k7q8r5t6v3w0y1z2a3"
},
"errors": [],
"message": "Superaste el límite de solicitudes por minuto. Espera los segundos que indica Retry-After."
}