De la cotización
a la entrega.
Conecta tu sistema para cotizar, generar guías, descargar etiquetas y seguir tus envíos desde una sola API.
API v1 · Envíos nacionalesDisponible hoy: integración nacional con tu llave API. La conciliación de sobrepesos es opcional y se consulta por API. Consulta el estado de internacional.
OpenAPI: importa la descripción de nuestra API en tus herramientas de desarrollo para preparar la conexión de tu sistema.
Postman: importa los ejemplos, configura tu propia llave API y prueba tu primera consulta de saldo.
Tu primera conexión
Necesitas una cuenta activa y una llave creada en Integraciones → API Propia → Generar llave. La llave permite únicamente las operaciones nacionales descritas en esta referencia y los datos de tu propia cuenta. No da acceso al panel administrativo ni a otras integraciones. Al suspender la cuenta se bloquea también la llave. Se muestra completa una sola vez. Guárdala en el servidor de tu aplicación, como una variable de entorno.
https://api.dcenvios.latEnvía X-API-Key: dc_live_... o Authorization: Bearer dc_live_.... Elige una de las dos formas. Para solicitudes con cuerpo, incluye Content-Type: application/json.
export DC_API_KEY="TU_LLAVE_PRIVADA"
curl https://api.dcenvios.lat/api/v1/balance \
--header "X-API-Key: $DC_API_KEY"Los ejemplos de nombres, guías e importes son ficticios. La tarifa aplicable es la que devuelve la cotización de tu cuenta.
Un flujo completo, paso a paso
- Ejecuta
GET /api/v1/balance. - Consulta
GET /api/v1/cp/64000y el CP de destino; selecciona las colonias. - Busca
GET /api/v1/sat/buscar?q=pantalonesy confirma el producto. - Envía
POST /api/v1/quotecon los datos definitivos. - Muestra las tarifas al usuario y usa el
tokende la elegida enPOST /api/v1/label. - Si el resultado está completo, conserva
idynumero_guia. Si está pendiente, consulta/labels. - Consulta
/label-pdf/{id}y decodifica la etiqueta. Luego utiliza/tracking/{guia}.
En Postman, importa la colección, configura api_key localmente y copia el token elegido a token_cotizacion. Para comprar, establece confirmar_compra=true después de revisar la tarifa. Las solicitudes de cancelación y recolección tienen confirmaciones separadas. Usa una versión actual de Postman con soporte para pm.execution.skipRequest(); estos controles pertenecen a la colección y no son restricciones del servidor. Cambia la fecha de ejemplo por una fecha disponible.
Direcciones y contenido
Estas son las entradas recomendadas para una integración completa. Las restricciones particulares de la paquetería pueden producir rechazos adicionales; no existe un límite de longitud universal garantizado para todos los servicios.
Dirección: remitente y destinatario
| Campo | Tipo | Uso |
|---|---|---|
nombreObligatorio | string | Nombre completo del contacto. Usa datos reales, sin abreviaturas ambiguas. |
empresa | string | Empresa; opcional. |
telefonoObligatorio | string | Teléfono nacional de 10 dígitos. Recomendación de formato para evitar rechazos. |
email | string | Correo del contacto; recomendado. |
cpObligatorio | string | Código postal mexicano; conserva ceros iniciales. |
estadoObligatorio | string | Estado según el catálogo de CP. |
ciudadObligatorio | string | Ciudad o municipio según el catálogo de CP. |
coloniaObligatorio | string | Colonia exacta; debe coincidir con la cotización. |
calleObligatorio | string | Calle. |
numeroObligatorio | string | Número exterior/interior como texto. |
referencias | string | Indicaciones para localizar el domicilio; opcional. |
Paquete
| Campo | Tipo | Uso |
|---|---|---|
pesoObligatorio | number | Peso real en kg; conserva el valor usado al cotizar. |
largoObligatorio | number | Largo en cm. |
anchoObligatorio | number | Ancho en cm. |
altoObligatorio | number | Alto en cm. |
contenidoObligatorio | string | Descripción precisa del producto. No uses únicamente una categoría genérica. |
clave_sat | string | Clave vigente de 8 dígitos obtenida en /sat/buscar. Es obligatoria salvo que envíes carta_porte.clave_prod_serv. |
satCategory; generación usa paquete.clave_sat o carta_porte.clave_prod_serv. Si envías ambas claves, deben coincidir. Una clave válida no sustituye una descripción precisa del contenido.Pesos e importes
Usa kg y cm. El cálculo actual de peso volumétrico es largo × ancho × alto / 5000; el peso cobrable toma el mayor entre peso real y volumétrico, redondeado hacia arriba. Utiliza siempre la tarifa devuelta.
Los importes están en MXN. precio y precio_venta son los importes de venta de tu cuenta. Los campos heredados costo_envio y costo_proteccion también representan importes al cliente. La respuesta no desglosa subtotal e IVA por separado; no recalcules el total con una tasa adicional. El comprobante fiscal se gestiona por el proceso de facturación de tu cuenta.
Sobrepesos y ajustes posteriores
Si el saldo no alcanza, solo se descuenta la parte disponible y el resto queda pendiente. Ejemplo: un cargo de $150 con $100 disponibles produce un descuento de $100 y deja $50 pendientes. Consultar la API no cobra, no carga una tarjeta bancaria y no realiza cobros a tus compradores.
No hay webhook de sobrepesos para clientes en esta versión. La integración es una consulta periódica desde tu servidor. Puedes comenzar solamente con saldo y guías y agregar la conciliación después.
La tarifa inicial se calcula con el peso y las medidas declarados. Si la paquetería registra diferencias de peso o dimensiones, puede reportar un ajuste posterior. El importe depende del servicio y del cargo registrado; no hay una cuota fija universal.
Declara las medidas exteriores del paquete ya cerrado, incluido el embalaje. El peso volumétrico también puede generar diferencias aunque el peso físico sea menor. Conserva fotografías del paquete, medidas y lectura de la báscula para una posible aclaración.
| Dato | Qué significa |
|---|---|
| Total original | Importe de la guía al generarla. |
| Ajustes posteriores | Importes adicionales registrados para la guía. |
| Ajustes cobrados | Parte del ajuste que ya se descontó del saldo. |
| Ajustes pendientes | Importe registrado pendiente de aplicación o gestión. No implica que ya se haya cobrado. |
| Total final | Total original más ajustes reportados. Puede incluir importes pendientes; no equivale al dinero descontado. |
Conexión sencilla, sin webhooks
- Desde tu servidor consulta
GET /api/v1/movimientosyGET /api/v1/balance. Puedes programar una consulta cada 5 minutos para un volumen bajo o moderado y consultar al abrir tu pantalla de saldo. Evita consultas simultáneas y respeta el límite global por IP. - Los descuentos ya aplicados se identifican con
tipo: cargo_adicional. El origen puede serajuste_paqueteria. Guarda cada movimiento porid, con una restricción única por cuenta, para no contabilizarlo dos veces. - Usa el saldo que devuelve
/balance. El cargo ya está incluido: no lo vuelvas a descontar. Para interpretar un movimiento usasaldo_anteriorysaldo_nuevo, no solo el signo demonto. - Para relacionar ajustes con cada guía y separar importes cobrados de pendientes, descarga
GET /api/v1/labels/reporte.csv. La referencia del movimiento es un texto descriptivo, no un identificador estructurado garantizado de la guía. - Un ajuste sin saldo cobrado puede no aparecer en movimientos. El reporte incluye lo pendiente. Registrar un pendiente no equivale a cobrarlo; no supongas que se cobrará automáticamente al recargar.
curl 'https://api.dcenvios.lat/api/v1/movimientos' \
--header "X-API-Key: $DC_API_KEY"
curl 'https://api.dcenvios.lat/api/v1/balance' \
--header "X-API-Key: $DC_API_KEY"Ejemplo de lectura con Node.js
Guarda este ejemplo como consultar-ajustes.mjs y ejecútalo en tu servidor con node consultar-ajustes.mjs. Configura antes la variable de entorno DC_API_KEY. El ejemplo lee una vez; tu aplicación debe programar las consultas y guardar los ID en su base de datos.
// Node.js 20 o superior. Ejecutar solo en tu servidor.
// Lectura de una instantánea: no aplica cargos ni modifica el saldo.
const key = process.env.DC_API_KEY;
if (!key) throw new Error('Configura DC_API_KEY en tu servidor.');
async function leer(ruta) {
const r = await fetch('https://api.dcenvios.lat' + ruta, {
headers: { 'X-API-Key': key },
signal: AbortSignal.timeout(15000)
});
if (r.status === 429) {
throw new Error('Espera Retry-After: ' + (r.headers.get('retry-after') || 'no indicado'));
}
if (!r.ok) throw new Error('DC Envíos respondió HTTP ' + r.status);
return r.json();
}
const historial = await leer('/api/v1/movimientos');
const balance = await leer('/api/v1/balance');
const cargos = historial.movimientos.filter(m => m.tipo === 'cargo_adicional');
console.log(JSON.stringify({ saldo_actual: balance.saldo, cargos_aplicados: cargos }, null, 2));
// En tu integración: guarda cada movimiento con clave única (cuenta_dc, id).
// No vuelvas a restar estos cargos a saldo_actual.
// Las dos lecturas son independientes; puede haber actividad entre ellas.
Aclarar un cargo
Reporta la diferencia en el apartado de soporte del portal, categoría Cargo por sobrepeso, o a contacto@dcenvios.lat. Incluye número e ID de guía, fecha, importe del ajuste, peso y medidas declarados y evidencias del paquete. Abrir una aclaración no cancela automáticamente el cargo ni garantiza un reembolso; conserva el folio y verifica la resolución.
API internacional · Próximamente
La función internacional del portal, disponible para cuentas habilitadas, es independiente. No uses un token de sesión del navegador ni credenciales de administración en tu integración.
Consultar saldo
/api/v1/balanceSaldo disponible de la cuenta vinculada a tu llave, en MXN. Si aún no existe un saldo, puede devolver 0 como número.
Ejemplo de solicitud
curl --request GET 'https://api.dcenvios.lat/api/v1/balance' \
--header "X-API-Key: $DC_API_KEY"Respuesta 200
{
"saldo": "1500.00"
}Errores de esta operación: 401 429. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.
Consultar código postal
/api/v1/cp/{cp}Obtén estado, municipio y colonias antes de cotizar. Conserva el nombre de la colonia seleccionada para generar la guía.
Parámetros
| Campo | Tipo | Uso |
|---|---|---|
cpObligatorio | string | CP mexicano de 5 dígitos. |
Ejemplo de solicitud
curl --request GET 'https://api.dcenvios.lat/api/v1/cp/64000' \
--header "X-API-Key: $DC_API_KEY"Respuesta 200
{
"cp": "64000",
"estado": "Nuevo León",
"municipio": "Monterrey",
"ciudad": "Monterrey",
"colonias": [
"Centro"
],
"fuente": "catalogo"
}Errores de esta operación: 400 401 404 429 503. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.
Buscar producto SAT
/api/v1/sat/buscarBusca por nombre o clave de 8 dígitos. Devuelve hasta 20 coincidencias. Una búsqueda de menos de 2 caracteres devuelve una lista vacía. Elige el producto correcto; no adivines la clave ni uses 01010101.
Parámetros
| Campo | Tipo | Uso |
|---|---|---|
q | string | Texto del producto o clave SAT. Ejemplo: pantalones. |
Ejemplo de solicitud
curl --request GET 'https://api.dcenvios.lat/api/v1/sat/buscar?q=pantalones' \
--header "X-API-Key: $DC_API_KEY"Respuesta 200
{
"resultados": [
{
"clave": "53101500",
"nombre": "Pantalones y pantalones cortos",
"fuente": "carta_porte_31",
"material_peligroso": "0"
}
],
"seleccion_automatica": null,
"requiere_precision": true
}Errores de esta operación: 401 429. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.
Cotizar un envío nacional
/api/v1/quoteDevuelve las opciones disponibles para tu cuenta, ordenadas por precio ascendente. Elige una tarifa y conserva su token; vence a los 30 minutos. Repite la cotización si cambian CP, colonia, peso, dimensiones, seguro o embalaje.
Cuerpo de la solicitud
| Campo | Tipo | Uso |
|---|---|---|
cp_origenObligatorio | string | CP de origen en México. |
cp_destinoObligatorio | string | CP de destino en México. |
colonia_origen | string | Colonia de origen; recomendada para obtener una tarifa utilizable. |
colonia_destino | string | Colonia de destino; recomendada para obtener una tarifa utilizable. |
pesoObligatorio | number | Peso real en kg. |
largo | number | Largo real en cm. Recomendado para cotizar correctamente. |
ancho | number | Ancho real en cm. |
alto | number | Alto real en cm. |
asegurar | boolean | Solicitar protección. Confirma asegurado en la tarifa devuelta. Por defecto: false |
valor_declarado | number | Valor en MXN; envíalo cuando asegurar=true. |
satCategory | string | Clave SAT del contenido para cotizar. Se envía como paquete.clave_sat al generar. |
tipo_embalaje | string | Según disponibilidad de tu cuenta y servicio. Valores: box, envelope, palletPor defecto: box |
Ejemplo de solicitud
curl --request POST 'https://api.dcenvios.lat/api/v1/quote' \
--header "X-API-Key: $DC_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"cp_origen": "64000",
"cp_destino": "06000",
"colonia_origen": "Centro",
"colonia_destino": "Centro",
"peso": 1,
"largo": 20,
"ancho": 15,
"alto": 10,
"satCategory": "53101500",
"tipo_embalaje": "box",
"asegurar": false
}'Respuesta 200
{
"cotizaciones": [
{
"paqueteria": "dhl",
"servicio": "Terrestre",
"dias_estimados": 3,
"precio": 180,
"zona_extendida": false,
"token": "TOKEN_DE_LA_OPCION_ELEGIDA",
"peso_real": 1,
"peso_volumetrico": 0.6,
"peso_cobrable": 1,
"divisor_volumetrico": 5000,
"costo_envio": 180,
"costo_proteccion": 0,
"cargo_manejo": 0,
"cargos_adicionales": [],
"asegurado": false,
"valor_declarado": 0,
"tipo_embalaje": "box"
}
],
"cacheado": false,
"peso": {
"peso_real": 1,
"peso_volumetrico": 0.6,
"peso_cobrable": 1,
"divisor_volumetrico": 5000
},
"origen": {
"cp": "64000",
"ciudad": "Monterrey, Nuevo León",
"colonia": "Centro"
},
"destino": {
"cp": "06000",
"ciudad": "Cuauhtémoc, Ciudad de México",
"colonia": "Centro"
}
}Errores de esta operación: 400 401 403 429 502 503. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.
Generar una guía
/api/v1/labelEsta operación compra una guía y descuenta el saldo. Usa el token elegido, direcciones completas y una clave SAT vigente. Seguro, valor declarado y embalaje se toman de la cotización. Conserva id, numero_guia, estatus y cualquier advertencia. Una misma cotización tiene control de duplicados; consulta la sección de reintentos.
Cuerpo de la solicitud
| Campo | Tipo | Uso |
|---|---|---|
token_cotizacionObligatorio | string | Token de la opción elegida en /quote. |
remitenteObligatorio | Address | Ver esquema del objeto en OpenAPI. |
destinatarioObligatorio | Address | Ver esquema del objeto en OpenAPI. |
paqueteObligatorio | Package | Ver esquema del objeto en OpenAPI. |
carta_porte | object | Ver esquema del objeto en OpenAPI. |
comprador_email | string | Correo alternativo para notificaciones si no se proporcionó destinatario.email. Sujeto a la configuración de notificaciones de la cuenta. |
Ejemplo de solicitud
curl --request POST 'https://api.dcenvios.lat/api/v1/label' \
--header "X-API-Key: $DC_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"token_cotizacion": "TOKEN_DE_LA_OPCION_ELEGIDA",
"remitente": {
"nombre": "Tienda Ejemplo",
"empresa": "Tienda Ejemplo",
"telefono": "8112345678",
"email": "remitente@example.com",
"cp": "64000",
"estado": "Nuevo León",
"ciudad": "Monterrey",
"colonia": "Centro",
"calle": "Morelos",
"numero": "100",
"referencias": "Local a pie de calle"
},
"destinatario": {
"nombre": "Cliente Ejemplo",
"telefono": "5512345678",
"email": "destinatario@example.com",
"cp": "06000",
"estado": "Ciudad de México",
"ciudad": "Cuauhtémoc",
"colonia": "Centro",
"calle": "Madero",
"numero": "5"
},
"paquete": {
"peso": 1,
"largo": 20,
"ancho": 15,
"alto": 10,
"contenido": "Pantalones de algodón",
"clave_sat": "53101500"
}
}'Respuesta 200
{
"id": 1234,
"numero_guia": "GUIA_DE_EJEMPLO",
"tracking_number": "GUIA_DE_EJEMPLO",
"tracking_url": null,
"precio_venta": 180,
"estatus": "generada",
"protegido": false,
"proteccion_solicitada": false,
"valor_declarado": 0,
"desglose": {
"envio": 180,
"proteccion": 0,
"total": 180
}
}Respuesta 202
Solicitud aceptada pero por revisar. No generes otra guía.
{
"id": 1234,
"estatus": "por_revisar",
"advertencia": "La solicitud sigue en revisión. Consulta tus guías antes de volver a intentar."
}Errores de esta operación: 400 401 402 403 409 422 429 502. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.
Listar y buscar guías
/api/v1/labelsLista solo las guías de tu cuenta, de más reciente a más antigua. q busca por número, CP, estado, paquetería o nombre del remitente/destinatario. Una página superior a la última se ajusta a la última disponible. Para recuperar una operación pendiente, busca su id en la lista.
Parámetros
| Campo | Tipo | Uso |
|---|---|---|
page | integer | Página solicitada. Por defecto: 1 |
limit | integer | Registros por página. El servidor ajusta valores al rango 10–100. Por defecto: 100 |
q | string | Búsqueda opcional. |
Ejemplo de solicitud
curl --request GET 'https://api.dcenvios.lat/api/v1/labels?page=1&limit=20' \
--header "X-API-Key: $DC_API_KEY"Respuesta 200
{
"guias": [
{
"id": 1234,
"numero_guia": "GUIA_DE_EJEMPLO",
"estatus": "generada",
"paqueteria": "dhl",
"precio_venta": "180.00",
"cp_origen": "64000",
"cp_destino": "06000",
"peso": "1",
"created_at": "2026-09-26T12:00:00Z",
"cancelacion_pendiente": false,
"tiene_movimiento_fisico": false
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 1,
"pages": 1,
"q": null
}
}Errores de esta operación: 401 429. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.
Obtener la etiqueta
/api/v1/label-pdf/{id}Devuelve JSON con base64, no un archivo PDF directo. El valor puede ser base64 puro o una data URL. Decodifícalo y detecta el formato: normalmente PDF, pero puede ser imagen. base64:null significa que la etiqueta aún no está disponible; consulta más tarde sin crear otra guía.
Parámetros
| Campo | Tipo | Uso |
|---|---|---|
idObligatorio | integer | ID devuelto por /label o /labels. |
Ejemplo de solicitud
curl --request GET 'https://api.dcenvios.lat/api/v1/label-pdf/1234' \
--header "X-API-Key: $DC_API_KEY"Respuesta 200
{
"base64": "JVBERi0xLjcK..."
}Errores de esta operación: 401 404 429. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.
Rastrear una guía
/api/v1/tracking/{guia}Consulta el estado normalizado y sus eventos. Usa preferentemente las guías de tu cuenta. No hay una promesa de actualización en tiempo real ni de una frecuencia fija; recomendamos consultar cada 15–30 minutos, reducir la frecuencia después de la entrega y respetar el límite global.
Parámetros
| Campo | Tipo | Uso |
|---|---|---|
guiaObligatorio | string | Número de rastreo. |
Ejemplo de solicitud
curl --request GET 'https://api.dcenvios.lat/api/v1/tracking/GUIA_DE_EJEMPLO' \
--header "X-API-Key: $DC_API_KEY"Respuesta 200
{
"estatus": "en_transito",
"eventos": [
{
"desc": "En tránsito hacia el destino",
"fecha": "2026-09-26T12:00:00Z",
"lugar": "Monterrey"
}
]
}Errores de esta operación: 401 429 502. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.
Solicitar cancelación
/api/v1/cancellationsRegistra una solicitud; HTTP 201 no significa que la guía esté cancelada ni que el saldo haya sido devuelto. Se revisa antes de resolver. Si ya fue recolectada o registra movimiento físico, se rechaza. Consulta cancelacion_pendiente y estatus en /labels, y el saldo tras la resolución.
Cuerpo de la solicitud
| Campo | Tipo | Uso |
|---|---|---|
numero_guiaObligatorio | string | Número de la guía. |
guide_id | integer | ID de DC Envíos. Recomendado; obligatorio si hay varias guías con el mismo número. |
motivo | string | Motivo de la cancelación; opcional. |
Ejemplo de solicitud
curl --request POST 'https://api.dcenvios.lat/api/v1/cancellations' \
--header "X-API-Key: $DC_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"numero_guia": "GUIA_DE_EJEMPLO",
"guide_id": 1234,
"motivo": "El pedido fue cancelado"
}'Respuesta 201
{
"ok": true,
"automatica": false,
"cancelada": false,
"mensaje": "Solicitud de cancelación enviada. Te notificaremos al resolverla."
}Respuesta 200
La guía ya estaba cancelada.
{
"ok": true,
"cancelada": true,
"idempotente": true,
"mensaje": "La guía ya estaba cancelada."
}Errores de esta operación: 400 401 404 409 429. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.
Solicitar recolección
/api/v1/recoleccionesEnvía números de guías existentes y una dirección de origen común. fecha y horario se interpretan como hora local de recolección. La disponibilidad depende de la paquetería. automatica:false queda pendiente de gestión; automatica:true incluye la confirmación disponible. Puede ajustarse el horario. Evita repetir la solicitud si la respuesta se pierde: consulta primero el listado.
Cuerpo de la solicitud
| Campo | Tipo | Uso |
|---|---|---|
fechaObligatorio | string | Fecha solicitada. |
direccionObligatorio | Address | Ver esquema del objeto en OpenAPI. |
guiasObligatorio | array | Ver esquema del objeto en OpenAPI. |
hora_ini | string | Hora inicial local. |
hora_fin | string | Hora final local. |
hora | string | Descripción opcional de horario. |
num_paquetes | integer | Cantidad de paquetes; por defecto usa el número de guías. |
comentarios | string | Indicaciones; opcional. |
Ejemplo de solicitud
curl --request POST 'https://api.dcenvios.lat/api/v1/recolecciones' \
--header "X-API-Key: $DC_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"fecha": "2026-10-01",
"hora_ini": "09:00",
"hora_fin": "18:00",
"direccion": {
"nombre": "Tienda Ejemplo",
"empresa": "Tienda Ejemplo",
"telefono": "8112345678",
"email": "remitente@example.com",
"cp": "64000",
"estado": "Nuevo León",
"ciudad": "Monterrey",
"colonia": "Centro",
"calle": "Morelos",
"numero": "100",
"referencias": "Local a pie de calle"
},
"guias": [
"GUIA_DE_EJEMPLO"
],
"num_paquetes": 1,
"comentarios": "Solicitar acceso en recepción"
}'Respuesta 201
{
"ok": true,
"id": 55,
"automatica": false,
"estado": "pendiente"
}Errores de esta operación: 400 401 403 409 429 502. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.
Consultar recolecciones
/api/v1/recoleccionesDevuelve las 100 solicitudes más recientes de tu cuenta. Esta operación no implementa paginación. El indicador recolectado se calcula con los avances de rastreo de las guías; una solicitud registrada no equivale a un paquete recolectado.
Ejemplo de solicitud
curl --request GET 'https://api.dcenvios.lat/api/v1/recolecciones' \
--header "X-API-Key: $DC_API_KEY"Respuesta 200
{
"recolecciones": [
{
"id": 55,
"fecha": "2026-10-01",
"hora_ini": "09:00",
"hora_fin": "18:00",
"estado": "pendiente",
"folio": null,
"guias": [
"GUIA_DE_EJEMPLO"
],
"num_paquetes": 1,
"recolectado": false,
"recolectado_at": null,
"paqueteria": "dhl"
}
]
}Errores de esta operación: 401 429. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.
Consultar movimientos y cargos
/api/v1/movimientosDevuelve los 500 movimientos más recientes de tu cuenta, ordenados por fecha descendente. No implementa filtros ni paginación. Incluye cargos efectivamente aplicados y reembolsos. Identifica cada movimiento por id y utiliza saldo_anterior/saldo_nuevo para determinar su efecto; no interpretes el signo de monto de forma aislada. Un ajuste aún pendiente puede no aparecer aquí.
Ejemplo de solicitud
curl --request GET 'https://api.dcenvios.lat/api/v1/movimientos' \
--header "X-API-Key: $DC_API_KEY"Respuesta 200
{
"movimientos": [
{
"id": 901,
"tipo": "cargo_adicional",
"monto": "50.00",
"referencia": "Cargo adicional por sobrepeso o ajuste de medidas - guía GUIA_DE_EJEMPLO",
"notas": null,
"saldo_anterior": "1500.00",
"saldo_nuevo": "1450.00",
"origen": "ajuste_paqueteria",
"created_at": "2026-09-26T12:00:00Z"
}
]
}Errores de esta operación: 401 429. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.
Descargar reporte de guías y ajustes
/api/v1/labels/reporte.csvExporta las guías de tu cuenta en CSV UTF-8 con BOM, encabezados, comas y campos entre comillas. No implementa filtros ni paginación. Incluye Total original, Ajustes posteriores, Conceptos de ajustes, Ajustes cobrados, Ajustes pendientes y Total final. Los ajustes corresponden a los registrados en la plataforma; Total final suma el original y los ajustes reportados, aunque una parte siga pendiente. Las fechas se muestran en America/Mexico_City.
Ejemplo de solicitud
curl --request GET 'https://api.dcenvios.lat/api/v1/labels/reporte.csv' \
--header "X-API-Key: $DC_API_KEY"Respuesta 200
Ejemplo abreviado; el archivo real incluye también direcciones y datos del paquete.
"ID","Numero de guia","Total original","Ajustes posteriores","Ajustes cobrados","Ajustes pendientes","Total final"
"1234","GUIA_DE_EJEMPLO","180","50","30","20","230"Errores de esta operación: 401 403 429. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.
Decodificar una etiqueta
Ejemplo para Node.js 18 o posterior. Configura DC_API_KEY y DC_GUIA_ID en tu servidor. No presupone que el contenido siempre será PDF.
// Node.js 18+ · ejecutar en tu servidor
import { writeFile } from 'node:fs/promises';
const base = 'https://api.dcenvios.lat';
const key = process.env.DC_API_KEY;
const id = process.env.DC_GUIA_ID;
if (!key || !id) throw new Error('Configura DC_API_KEY y DC_GUIA_ID');
const res = await fetch(base + '/api/v1/label-pdf/' + encodeURIComponent(id), {
headers: { 'X-API-Key': key }
});
const body = await res.json();
if (!res.ok) throw new Error(body.error || 'Error HTTP ' + res.status);
if (!body.base64) throw new Error('Etiqueta pendiente. Consulta después; no compres otra guía.');
const raw = body.base64.replace(/^data:[^,]*;base64,/i, '');
const bytes = Buffer.from(raw, 'base64');
const ext = bytes.subarray(0, 4).toString() === '%PDF' ? 'pdf'
: bytes.subarray(0, 8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? 'png'
: bytes[0] === 255 && bytes[1] === 216 ? 'jpg' : 'bin';
await writeFile('etiqueta.' + ext, bytes);Duplicados, tiempos de espera y estados pendientes
La generación controla duplicados por cuenta y cotización. Mientras el token sea válido, repetir el mismo token puede devolver la guía original con idempotente:true, un conflicto GUIDE_PROCESSING o un resultado pendiente. No se documenta soporte para un encabezado Idempotency-Key.
| Situación | Qué debe hacer tu sistema |
|---|---|
| HTTP 200 con guía | Guardar el resultado. No generar otra por una advertencia o una etiqueta pendiente. |
| HTTP 202 / por_revisar | Guardar el ID si está disponible. Consultar /labels después de una espera; escalar a soporte si persiste. |
| GUIDE_PROCESSING | Esperar y consultar /labels. No usar un nuevo token para intentar la misma compra. |
| Timeout o respuesta perdida | La ausencia de respuesta no prueba que el envío falló. Consultar guías y saldo antes de cualquier nuevo intento. |
| Token vencido después de un intento | Primero conciliar el intento en /labels. Obtener una nueva cotización no conserva la protección contra duplicados de la anterior. |
| retry_safe:true | Corregir el dato o cotizar nuevamente según el código. Revisar el resultado previo cuando exista. |
| base64:null | Reintentar la consulta de la etiqueta, no la compra. |
Recomendación de cliente: usa un timeout de hasta 90 segundos para cotizar o generar y trata su vencimiento como resultado desconocido. Para consultas, aplica espera progresiva y respeta Retry-After. Estos tiempos son recomendaciones de integración, no una garantía de disponibilidad.
Generación y entrega son estados distintos
generada indica que hay una guía; etiqueta_pendiente que el documento está pendiente; por_revisar requiere conciliación. Ninguno confirma recolección o entrega. El rastreo puede informar recolectada, en_transito, en_reparto, entregada u otros estados normalizados. Tolera valores nuevos y conserva la descripción de los eventos.
Errores y límites
Las respuestas de error son JSON con error. Algunas añaden code o codigo; lee ambos. No automatices decisiones basadas únicamente en el texto del mensaje.
{
"error": "La guía ya se está procesando. Consulta tus guías.",
"code": "GUIDE_PROCESSING"
}| HTTP | Significado / acción |
|---|---|
400 | Datos incompletos, clave SAT inválida o cotización vencida. |
401 | Llave ausente, inválida o revocada. |
402 | Saldo insuficiente. |
403 | Cuenta sin activar o acceso no permitido. |
404 | Recurso no encontrado en el alcance de la operación. |
409 | Solicitud en proceso, duplicada o incompatible con el estado actual. |
422 | Datos rechazados al generar; revisa el campo indicado. |
429 | Límite de solicitudes alcanzado. Respeta Retry-After si está presente. |
500 | Error no esperado. Conserva el contexto y contacta a soporte. |
502 | No se pudo completar la operación. No repitas automáticamente una compra. |
503 | Servicio temporalmente no disponible o no habilitado. |
Códigos específicos
| Código | HTTP | Acción |
|---|---|---|
| SAT_REQUERIDO | 400 | Selecciona una clave vigente del catálogo SAT. |
| CONTENIDO_REQUERIDO | 400 | Describe el producto. |
| QUOTE_EXPIRED_SAFE | 400 | Cotiza de nuevo; el token venció o ya no está disponible. |
| QUOTE_ADDRESS_CHANGED | 409 | Cotiza con el CP y la colonia definitivos. |
| GUIDE_PROCESSING | 409 | Espera y consulta /labels. No vuelvas a comprar. |
| QUOTE_RETRY_SAFE | 409 | El intento previo falló; revisa el resultado y genera una nueva cotización. |
| QUOTE_ALREADY_USED | 409 | Consulta la guía existente antes de cotizar otra. |
| GUIDE_ID_REQUIRED | 409 | Envía guide_id para seleccionar la guía exacta al cancelar. |
| DATOS_POR_CORREGIR | 422 | Corrige el dato indicado y vuelve a cotizar. |
| API_SCOPE | 403 | Usa una operación documentada para la llave API. |
| SERVICIO_TEMPORALMENTE_NO_DISPONIBLE | 502 | Consulta tus guías antes de intentar nuevamente; conserva el identificador de la operación. |
| REVISION_INTERNA | 502 | Consulta tus guías y saldo; contacta a soporte antes de un nuevo intento. |
Límite de solicitudes
El límite global configurado es de 60 solicitudes por minuto por IP. Considera que varios procesos pueden compartir la misma salida a Internet. Al recibir 429, espera el valor de Retry-After cuando esté presente; evita reintentos simultáneos.
Saldo y devolución
La generación verifica y descuenta saldo antes de completar la compra. Los fallos confirmados pueden restituirlo; una operación en revisión puede conservar el cargo. No supongas devolución por recibir un error: consulta /balance, /labels y las indicaciones del resultado. Solicitar cancelación tampoco acredita saldo de inmediato.
Qué puedes integrar hoy
Esta referencia cubre las operaciones nacionales verificadas con la llave API: saldo, movimientos, catálogos, cotización, guías, etiqueta, rastreo, cancelaciones, recolecciones y reporte de ajustes. Los servicios y embalajes disponibles dependen de la cuenta, ruta y paquetería.
- API internacional · Próximamente: todavía no disponible con la llave API. El portal tiene una activación independiente por cuenta. Consulta los requisitos y el alcance.
- Sandbox: no hay un entorno público de pruebas documentado. Consultar catálogos y saldo permite validar la conexión sin emitir una guía. Coordina cualquier prueba de compra con soporte.
- Webhooks para clientes: esta versión no publica un contrato de suscripción. Integra rastreo por consulta.
- Multipieza: no se documenta un parámetro de cantidad en /quote. Gestiona una cotización por operación soportada.
- Compatibilidad: acepta campos adicionales en las respuestas y estados desconocidos. Conserva el contrato publicado de los campos que consumes.
Antes de salir a producción
Comprueba autenticación, selección de colonia y SAT, lectura de tarifas, manejo de 202/409/429, recuperación de etiquetas pendientes y conciliación de guías. Una prueba de compra genera un envío real.
Soporte
Escribe a contacto@dcenvios.lat con fecha y hora, endpoint, HTTP, código de error e ID de guía si existe. Nunca compartas tu API key.
Descargas: OpenAPI 3.0 · Postman · Ejemplo de etiqueta.