CONSTRUYE CON DC ENVÍOS

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 nacionales

Disponible 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.

HTTPS + JSONLlave API por cuenta
PRIMEROS PASOS

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.

URL base de producción
https://api.dcenvios.lat

Enví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.

Bash
export DC_API_KEY="TU_LLAVE_PRIVADA"
curl https://api.dcenvios.lat/api/v1/balance \
  --header "X-API-Key: $DC_API_KEY"
No incluyas la llave en JavaScript público, apps distribuidas, repositorios, capturas ni archivos Postman compartidos. Si se filtra, revócala desde el portal y genera otra. Esta documentación no solicita ni almacena tu llave.

Los ejemplos de nombres, guías e importes son ficticios. La tarifa aplicable es la que devuelve la cotización de tu cuenta.

INTEGRACIÓN

Un flujo completo, paso a paso

01 · Prepara el envíoConsulta saldo, CP y colonias. Selecciona el producto SAT y captura peso y dimensiones.
02 · Cotiza y compraElige una tarifa, conserva su token y genera una sola guía. Guarda el ID y revisa el estado recibido.
03 · Imprime y sigueObtén la etiqueta, solicita recolección si está disponible y consulta el rastreo.
  1. Ejecuta GET /api/v1/balance.
  2. Consulta GET /api/v1/cp/64000 y el CP de destino; selecciona las colonias.
  3. Busca GET /api/v1/sat/buscar?q=pantalones y confirma el producto.
  4. Envía POST /api/v1/quote con los datos definitivos.
  5. Muestra las tarifas al usuario y usa el token de la elegida en POST /api/v1/label.
  6. Si el resultado está completo, conserva id y numero_guia. Si está pendiente, consulta /labels.
  7. 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.

MODELOS

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

CampoTipoUso
nombreObligatoriostringNombre completo del contacto. Usa datos reales, sin abreviaturas ambiguas.
empresastringEmpresa; opcional.
telefonoObligatoriostringTeléfono nacional de 10 dígitos. Recomendación de formato para evitar rechazos.
emailstringCorreo del contacto; recomendado.
cpObligatoriostringCódigo postal mexicano; conserva ceros iniciales.
estadoObligatoriostringEstado según el catálogo de CP.
ciudadObligatoriostringCiudad o municipio según el catálogo de CP.
coloniaObligatoriostringColonia exacta; debe coincidir con la cotización.
calleObligatoriostringCalle.
numeroObligatoriostringNúmero exterior/interior como texto.
referenciasstringIndicaciones para localizar el domicilio; opcional.

Paquete

CampoTipoUso
pesoObligatorionumberPeso real en kg; conserva el valor usado al cotizar.
largoObligatorionumberLargo en cm.
anchoObligatorionumberAncho en cm.
altoObligatorionumberAlto en cm.
contenidoObligatoriostringDescripción precisa del producto. No uses únicamente una categoría genérica.
clave_satstringClave vigente de 8 dígitos obtenida en /sat/buscar. Es obligatoria salvo que envíes carta_porte.clave_prod_serv.
La clave SAT es necesaria para generar. Cotización usa 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.

SALDO Y CONCILIACIÓN

Sobrepesos y ajustes posteriores

¿Cuándo se descuenta? Un ajuste reportado queda pendiente de revisión. Cuando administración de DC Envíos autoriza el cobro, el sistema descuenta el importe autorizado del saldo disponible de tu cuenta y registra un movimiento. Tu integración no tiene que ejecutar otra operación de cobro.

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.

DatoQué significa
Total originalImporte de la guía al generarla.
Ajustes posterioresImportes adicionales registrados para la guía.
Ajustes cobradosParte del ajuste que ya se descontó del saldo.
Ajustes pendientesImporte registrado pendiente de aplicación o gestión. No implica que ya se haya cobrado.
Total finalTotal original más ajustes reportados. Puede incluir importes pendientes; no equivale al dinero descontado.

Conexión sencilla, sin webhooks

  1. Desde tu servidor consulta GET /api/v1/movimientos y GET /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.
  2. Los descuentos ya aplicados se identifican con tipo: cargo_adicional. El origen puede ser ajuste_paqueteria. Guarda cada movimiento por id, con una restricción única por cuenta, para no contabilizarlo dos veces.
  3. Usa el saldo que devuelve /balance. El cargo ya está incluido: no lo vuelvas a descontar. Para interpretar un movimiento usa saldo_anterior y saldo_nuevo, no solo el signo de monto.
  4. 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.
  5. 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.
Límite actual: movimientos devuelve solo los últimos 500 registros y no tiene paginación ni filtros. La primera sincronización es una instantánea, no un historial completo. Si pueden acumularse más de 500 movimientos entre consultas, coordina la conciliación con soporte; este ejemplo no garantiza recuperar todo el historial.
Bash
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.

JavaScript · Node.js
// 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.
No necesitas registrar una URL receptora ni configurar firmas o reintentos de webhook. Esta versión no ofrece a clientes una operación para aprobar o cobrar ajustes. La autorización del cobro se gestiona por DC Envíos.

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.

DISPONIBILIDAD

API internacional · Próximamente

Por ahora, tu llave API permite las operaciones nacionales de esta documentación. La cotización y generación internacional por API se anunciarán aquí cuando estén disponibles, junto con sus requisitos y ejemplos.

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.

REFERENCIA

Consultar saldo

GET/api/v1/balance

Saldo 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 · Bash
curl --request GET 'https://api.dcenvios.lat/api/v1/balance' \
  --header "X-API-Key: $DC_API_KEY"

Respuesta 200

JSON
{
  "saldo": "1500.00"
}

Errores de esta operación: 401 429. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.

REFERENCIA

Consultar código postal

GET/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

CampoTipoUso
cpObligatoriostringCP mexicano de 5 dígitos.

Ejemplo de solicitud

cURL · Bash
curl --request GET 'https://api.dcenvios.lat/api/v1/cp/64000' \
  --header "X-API-Key: $DC_API_KEY"

Respuesta 200

JSON
{
  "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.

REFERENCIA

Buscar producto SAT

GET/api/v1/sat/buscar

Busca 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

CampoTipoUso
qstringTexto del producto o clave SAT. Ejemplo: pantalones.

Ejemplo de solicitud

cURL · Bash
curl --request GET 'https://api.dcenvios.lat/api/v1/sat/buscar?q=pantalones' \
  --header "X-API-Key: $DC_API_KEY"

Respuesta 200

JSON
{
  "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.

REFERENCIA

Cotizar un envío nacional

POST/api/v1/quote

Devuelve 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

CampoTipoUso
cp_origenObligatoriostringCP de origen en México.
cp_destinoObligatoriostringCP de destino en México.
colonia_origenstringColonia de origen; recomendada para obtener una tarifa utilizable.
colonia_destinostringColonia de destino; recomendada para obtener una tarifa utilizable.
pesoObligatorionumberPeso real en kg.
largonumberLargo real en cm. Recomendado para cotizar correctamente.
anchonumberAncho real en cm.
altonumberAlto real en cm.
asegurarbooleanSolicitar protección. Confirma asegurado en la tarifa devuelta.
Por defecto: false
valor_declaradonumberValor en MXN; envíalo cuando asegurar=true.
satCategorystringClave SAT del contenido para cotizar. Se envía como paquete.clave_sat al generar.
tipo_embalajestringSegún disponibilidad de tu cuenta y servicio.
Valores: box, envelope, pallet
Por defecto: box

Ejemplo de solicitud

cURL · Bash
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

JSON
{
  "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.

REFERENCIA

Generar una guía

POST/api/v1/label

Esta 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.

Operación con cargo: confirma la tarifa elegida antes de ejecutar esta solicitud.

Cuerpo de la solicitud

CampoTipoUso
token_cotizacionObligatoriostringToken de la opción elegida en /quote.
remitenteObligatorioAddressVer esquema del objeto en OpenAPI.
destinatarioObligatorioAddressVer esquema del objeto en OpenAPI.
paqueteObligatorioPackageVer esquema del objeto en OpenAPI.
carta_porteobjectVer esquema del objeto en OpenAPI.
comprador_emailstringCorreo alternativo para notificaciones si no se proporcionó destinatario.email. Sujeto a la configuración de notificaciones de la cuenta.

Ejemplo de solicitud

cURL · Bash
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

JSON
{
  "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.

JSON
{
  "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.

REFERENCIA

Listar y buscar guías

GET/api/v1/labels

Lista 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

CampoTipoUso
pageintegerPágina solicitada.
Por defecto: 1
limitintegerRegistros por página. El servidor ajusta valores al rango 10–100.
Por defecto: 100
qstringBúsqueda opcional.

Ejemplo de solicitud

cURL · Bash
curl --request GET 'https://api.dcenvios.lat/api/v1/labels?page=1&limit=20' \
  --header "X-API-Key: $DC_API_KEY"

Respuesta 200

JSON
{
  "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.

REFERENCIA

Obtener la etiqueta

GET/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

CampoTipoUso
idObligatoriointegerID devuelto por /label o /labels.

Ejemplo de solicitud

cURL · Bash
curl --request GET 'https://api.dcenvios.lat/api/v1/label-pdf/1234' \
  --header "X-API-Key: $DC_API_KEY"

Respuesta 200

JSON
{
  "base64": "JVBERi0xLjcK..."
}

Errores de esta operación: 401 404 429. El archivo OpenAPI incluye los esquemas de respuesta y los campos adicionales.

REFERENCIA

Rastrear una guía

GET/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

CampoTipoUso
guiaObligatoriostringNúmero de rastreo.

Ejemplo de solicitud

cURL · Bash
curl --request GET 'https://api.dcenvios.lat/api/v1/tracking/GUIA_DE_EJEMPLO' \
  --header "X-API-Key: $DC_API_KEY"

Respuesta 200

JSON
{
  "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.

REFERENCIA

Solicitar cancelación

POST/api/v1/cancellations

Registra 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

CampoTipoUso
numero_guiaObligatoriostringNúmero de la guía.
guide_idintegerID de DC Envíos. Recomendado; obligatorio si hay varias guías con el mismo número.
motivostringMotivo de la cancelación; opcional.

Ejemplo de solicitud

cURL · Bash
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

JSON
{
  "ok": true,
  "automatica": false,
  "cancelada": false,
  "mensaje": "Solicitud de cancelación enviada. Te notificaremos al resolverla."
}

Respuesta 200

La guía ya estaba cancelada.

JSON
{
  "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.

REFERENCIA

Solicitar recolección

POST/api/v1/recolecciones

Enví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

CampoTipoUso
fechaObligatoriostringFecha solicitada.
direccionObligatorioAddressVer esquema del objeto en OpenAPI.
guiasObligatorioarrayVer esquema del objeto en OpenAPI.
hora_inistringHora inicial local.
hora_finstringHora final local.
horastringDescripción opcional de horario.
num_paquetesintegerCantidad de paquetes; por defecto usa el número de guías.
comentariosstringIndicaciones; opcional.

Ejemplo de solicitud

cURL · Bash
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

JSON
{
  "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.

REFERENCIA

Consultar recolecciones

GET/api/v1/recolecciones

Devuelve 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 · Bash
curl --request GET 'https://api.dcenvios.lat/api/v1/recolecciones' \
  --header "X-API-Key: $DC_API_KEY"

Respuesta 200

JSON
{
  "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.

REFERENCIA

Consultar movimientos y cargos

GET/api/v1/movimientos

Devuelve 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 · Bash
curl --request GET 'https://api.dcenvios.lat/api/v1/movimientos' \
  --header "X-API-Key: $DC_API_KEY"

Respuesta 200

JSON
{
  "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.

REFERENCIA

Descargar reporte de guías y ajustes

GET/api/v1/labels/reporte.csv

Exporta 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 · Bash
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.

CSV · columnas seleccionadas
"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.

JavaScript · Node.js
// 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);
Descargar ejemplo
OPERACIÓN CONFIABLE

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ónQué debe hacer tu sistema
HTTP 200 con guíaGuardar el resultado. No generar otra por una advertencia o una etiqueta pendiente.
HTTP 202 / por_revisarGuardar el ID si está disponible. Consultar /labels después de una espera; escalar a soporte si persiste.
GUIDE_PROCESSINGEsperar y consultar /labels. No usar un nuevo token para intentar la misma compra.
Timeout o respuesta perdidaLa 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 intentoPrimero conciliar el intento en /labels. Obtener una nueva cotización no conserva la protección contra duplicados de la anterior.
retry_safe:trueCorregir el dato o cotizar nuevamente según el código. Revisar el resultado previo cuando exista.
base64:nullReintentar 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.

DIAGNÓSTICO

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.

JSON
{
  "error": "La guía ya se está procesando. Consulta tus guías.",
  "code": "GUIDE_PROCESSING"
}
HTTPSignificado / acción
400Datos incompletos, clave SAT inválida o cotización vencida.
401Llave ausente, inválida o revocada.
402Saldo insuficiente.
403Cuenta sin activar o acceso no permitido.
404Recurso no encontrado en el alcance de la operación.
409Solicitud en proceso, duplicada o incompatible con el estado actual.
422Datos rechazados al generar; revisa el campo indicado.
429Límite de solicitudes alcanzado. Respeta Retry-After si está presente.
500Error no esperado. Conserva el contexto y contacta a soporte.
502No se pudo completar la operación. No repitas automáticamente una compra.
503Servicio temporalmente no disponible o no habilitado.

Códigos específicos

CódigoHTTPAcción
SAT_REQUERIDO400Selecciona una clave vigente del catálogo SAT.
CONTENIDO_REQUERIDO400Describe el producto.
QUOTE_EXPIRED_SAFE400Cotiza de nuevo; el token venció o ya no está disponible.
QUOTE_ADDRESS_CHANGED409Cotiza con el CP y la colonia definitivos.
GUIDE_PROCESSING409Espera y consulta /labels. No vuelvas a comprar.
QUOTE_RETRY_SAFE409El intento previo falló; revisa el resultado y genera una nueva cotización.
QUOTE_ALREADY_USED409Consulta la guía existente antes de cotizar otra.
GUIDE_ID_REQUIRED409Envía guide_id para seleccionar la guía exacta al cancelar.
DATOS_POR_CORREGIR422Corrige el dato indicado y vuelve a cotizar.
API_SCOPE403Usa una operación documentada para la llave API.
SERVICIO_TEMPORALMENTE_NO_DISPONIBLE502Consulta tus guías antes de intentar nuevamente; conserva el identificador de la operación.
REVISION_INTERNA502Consulta 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.

ALCANCE

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.

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.