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.
/entry-documents
Crear un documento de entrada
Manda a recibir mercancía (orden de compra, entrada). Se valida con las mismas reglas que la plantilla de carga
masiva: productos, almacén, ubicación destino, lotes y series. La cabecera Idempotency-Key es obligatoria.
Si ya existe un documento del mismo type con ese external_ref, responde 200 con ese documento en lugar de
crear otro; uno nuevo responde 201.
- Alcance (cliente de integración)
receipts:write- Permiso (token de usuario)
entries.manage- Idempotency-Key
- Obligatoria
Cabeceras
-
Idempotency-Keystring obligatorioObligatoria en esta ruta. Llave única por operación (UUID v4); los reintentos repiten la misma.
Cuerpo de la solicitud application/json
-
external_refstring obligatorioReferencia externa (folio del ERP). Con el mismo
type, no se crea dos veces. -
typestring obligatorioTipo de documento: la clave (
purchase_order) o su nombre (Orden de Compra). -
doc_datestring obligatorioFecha del documento:
AAAA-MM-DDodd/mm/aaaa. -
due_datestring | null -
partner_codestring obligatorioCódigo del proveedor o del cliente.
-
partner_namestring | null -
warehouse_codestring obligatorio -
commentsstring | null -
linesarray de objetos obligatorio6 campos de
lines-
item_codestring obligatorio -
qtynumber obligatorio -
batchstring | nullLote (obligatorio si el producto se maneja por lotes al recibir).
-
expiry_datestring | null -
serialsarray de textos | null -
destination_binstring | nullUbicación destino (solo entradas).
-
Respuestas
200
Ya existía un documento con ese type y external_ref; se devuelve ese.
-
dataobjeto obligatorio14 campos de
data-
idinteger obligatorio -
doc_numstring | null obligatorio -
typestring obligatorio -
external_refstring | null -
sourcestring | nullapi,import,webosap. -
statusstring | null obligatorio -
card_codestring | null -
card_namestring | null -
doc_datestring (date) | null -
due_datestring (date) | null -
commentsstring | null -
created_atstring (date-time) | null -
updated_atstring (date-time) | null -
linesarray de objetos obligatorio7 campos de
lines-
line_numinteger | null -
item_codestring | null obligatorio -
qtynumber obligatorio -
open_qtynumber obligatorioLo que falta por recibir.
-
received_qtynumber obligatorio -
whs_codestring | null -
statusstring | null
-
-
201
Documento creado. Location apunta al nuevo recurso.
-
dataobjeto obligatorio14 campos de
data-
idinteger obligatorio -
doc_numstring | null obligatorio -
typestring obligatorio -
external_refstring | null -
sourcestring | nullapi,import,webosap. -
statusstring | null obligatorio -
card_codestring | null -
card_namestring | null -
doc_datestring (date) | null -
due_datestring (date) | null -
commentsstring | null -
created_atstring (date-time) | null -
updated_atstring (date-time) | null -
linesarray de objetos obligatorio7 campos de
lines-
line_numinteger | null -
item_codestring | null obligatorio -
qtynumber obligatorio -
open_qtynumber obligatorioLo que falta por recibir.
-
received_qtynumber obligatorio -
whs_codestring | null -
statusstring | null
-
-
400
Falta la cabecera Idempotency-Key.
Cuerpo: el sobre de error.
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.
409
Otra solicitud con la misma Idempotency-Key sigue en proceso.
Cuerpo: el sobre de error.
422
Datos no válidos (validation_failed), una llave de idempotencia reutilizada con otra solicitud
(idempotency_key_reused) o una regla de negocio que bloquea la operación (rule_blocked).
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 -X POST "https://empresa.chainlink.mx/api/v1/entry-documents" \
-H "Authorization: Bearer $CHAINLINK_TOKEN" \
-H "Accept: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"external_ref": "OC-2026-0042",
"type": "Orden de Compra",
"doc_date": "2026-10-06",
"due_date": "2026-10-09",
"partner_code": "PRV-001",
"partner_name": "Distribuidora del Bajío",
"warehouse_code": "CEDIS-GDL",
"lines": [
{
"item_code": "P-1001",
"qty": 48,
"batch": "L2610",
"expiry_date": "2027-04-30",
"destination_bin": "A-01-01-1"
},
{
"item_code": "P-1002",
"qty": 120
}
]
}'
<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://empresa.chainlink.mx/api/v1/entry-documents', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('CHAINLINK_TOKEN'),
'Accept' => 'application/json',
'Idempotency-Key' => (string) \Ramsey\Uuid\Uuid::uuid4(),
],
'json' => [
'external_ref' => 'OC-2026-0042',
'type' => 'Orden de Compra',
'doc_date' => '2026-10-06',
'due_date' => '2026-10-09',
'partner_code' => 'PRV-001',
'partner_name' => 'Distribuidora del Bajío',
'warehouse_code' => 'CEDIS-GDL',
'lines' => [
[
'item_code' => 'P-1001',
'qty' => 48,
'batch' => 'L2610',
'expiry_date' => '2027-04-30',
'destination_bin' => 'A-01-01-1',
],
[
'item_code' => 'P-1002',
'qty' => 120,
],
],
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://empresa.chainlink.mx/api/v1/entry-documents', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.CHAINLINK_TOKEN}`,
Accept: 'application/json',
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"external_ref": "OC-2026-0042",
"type": "Orden de Compra",
"doc_date": "2026-10-06",
"due_date": "2026-10-09",
"partner_code": "PRV-001",
"partner_name": "Distribuidora del Bajío",
"warehouse_code": "CEDIS-GDL",
"lines": [
{
"item_code": "P-1001",
"qty": 48,
"batch": "L2610",
"expiry_date": "2027-04-30",
"destination_bin": "A-01-01-1"
},
{
"item_code": "P-1002",
"qty": 120
}
]
}),
});
const data = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://empresa.chainlink.mx/api/v1/entry-documents",
headers={
"Authorization": f"Bearer {os.environ['CHAINLINK_TOKEN']}",
"Accept": "application/json",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"external_ref": "OC-2026-0042",
"type": "Orden de Compra",
"doc_date": "2026-10-06",
"due_date": "2026-10-09",
"partner_code": "PRV-001",
"partner_name": "Distribuidora del Bajío",
"warehouse_code": "CEDIS-GDL",
"lines": [
{
"item_code": "P-1001",
"qty": 48,
"batch": "L2610",
"expiry_date": "2027-04-30",
"destination_bin": "A-01-01-1"
},
{
"item_code": "P-1002",
"qty": 120
}
]
},
)
data = response.json()
{
"data": {
"id": 1,
"doc_num": "OC-000001",
"type": "purchase_order",
"external_ref": "OC-2026-0042",
"source": "api",
"status": "open",
"card_code": "PRV-001",
"card_name": null,
"doc_date": "2026-10-06",
"due_date": "2026-10-06",
"comments": null,
"lines": [
{
"line_num": 0,
"item_code": "P-1001",
"qty": 48,
"open_qty": 48,
"received_qty": 0,
"whs_code": "CEDIS-GDL",
"status": "open"
},
{
"line_num": 1,
"item_code": "P-1002",
"qty": 120,
"open_qty": 120,
"received_qty": 0,
"whs_code": "CEDIS-GDL",
"status": "open"
}
],
"created_at": "2026-10-06T16:20:11.000000Z",
"updated_at": "2026-10-06T16:20:11.000000Z"
}
}
{
"data": {
"id": 318,
"doc_num": "OC-000318",
"type": "purchase_order",
"external_ref": "OC-2026-0042",
"source": "api",
"status": "open",
"card_code": "PRV-001",
"card_name": "Distribuidora del Bajío",
"doc_date": "2026-10-06",
"due_date": "2026-10-09",
"comments": null,
"lines": [
{
"line_num": 0,
"item_code": "P-1001",
"qty": 48,
"open_qty": 48,
"received_qty": 0,
"whs_code": "CEDIS-GDL",
"status": "open"
},
{
"line_num": 1,
"item_code": "P-1002",
"qty": 120,
"open_qty": 120,
"received_qty": 0,
"whs_code": "CEDIS-GDL",
"status": "open"
}
],
"created_at": "2026-10-06T16:20:11.000000Z",
"updated_at": "2026-10-06T16:20:11.000000Z"
}
}
{
"error": {
"code": "idempotency_key_required",
"message": "Envía la cabecera Idempotency-Key.",
"doc_url": "https://chainlink.mx/developers/errores#idempotency_key_required",
"request_id": "req_01j9x2m4k7q8r5t6v3w0y1z2a3"
},
"errors": [],
"message": "Envía la cabecera Idempotency-Key."
}
{
"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": "duplicate_in_flight",
"message": "Esta solicitud ya se está procesando.",
"doc_url": "https://chainlink.mx/developers/errores#duplicate_in_flight",
"request_id": "req_01j9x2m4k7q8r5t6v3w0y1z2a3"
},
"errors": [],
"message": "Esta solicitud ya se está procesando."
}
{
"error": {
"code": "validation_failed",
"message": "El campo name es obligatorio.",
"field": "name",
"doc_url": "https://chainlink.mx/developers/errores#validation_failed",
"request_id": "req_01j9x2m4k7q8r5t6v3w0y1z2a3"
},
"errors": [
{
"field": "name",
"message": "El campo name es obligatorio."
}
],
"message": "El campo name es obligatorio."
}
{
"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."
}