---
title: "Descargar la etiqueta de un envío propio"
method: GET
path: "/labels/{envio_id}"
tags: ["labels"]
---

# Descargar la etiqueta de un envío propio

`GET /labels/{envio_id}`

## Request

- Base URL: `https://api.enviadores.com.mx/api/v1`
- URL: `https://api.enviadores.com.mx/api/v1/labels/{envio_id}`
- Auth: HTTP bearer

Transmite la copia de la etiqueta que guarda la plataforma (PDF/ZPL); si aún no existe, la obtiene de la paquetería, la guarda y la transmite. Nunca redirige a la URL de la paquetería. Con `?format=json` responde JSON (`LabelLink`) en lugar de bytes. Solo envíos creados por el usuario de la llave (todos los roles). Requiere scope `labels:read`.

## Path parameters

- `envio_id` string, required

## Query parameters

- `format` 'json'

## Response `200`

Bytes de la etiqueta (copia de la plataforma). Con `?format=json`: `application/json` con `LabelLink`.

- object
  - `success` unknown, required
  - `data` object, required: Respuesta de `GET /labels/{envio_id}?format=json`: enlace a la etiqueta en vez de los bytes.
    - `shipment_id` string, required
    - `guia` string: Solo en sandbox (la vía en vivo omite el campo).
    - `label_url` string, nullable, required: En vivo: enlace firmado a la copia de Enviadores (`https://api.enviadores.com.mx/api/v1/label-files/{envio_id}/{exp}/{firma}.pdf`). Se abre sin llave, vence en `expires_at` (30 días; pide uno nuevo con esta misma llamada) y nunca es la URL de la paquetería. En sandbox: enlace a la etiqueta de prueba. `null` cuando la etiqueta aún no está disponible; `note` lo explica.
    - `expires_at` string, date-time: Solo en vivo: cuándo deja de funcionar `label_url` (UTC).
    - `format` 'pdf', required
    - `sandbox` boolean, required: `true` con llaves `ek_test_`: etiqueta de prueba sin validez.
    - `note` string: Presente solo cuando hay algo que aclarar (etiqueta sandbox, o sin URL directa).
  - `requestId` string, required: Correlación de logs; también en el header `X-Request-Id`.

## Other responses

- `401`: `UNAUTHORIZED` — credencial Bearer ausente/mal formada o llave desconocida/revocada (respuesta idéntica en ambos casos).
- `403`: `INSUFFICIENT_SCOPE` — a la llave le falta el scope requerido · `PDV_NOT_ALLOWED` — violación del carril X-PDV-ID. Nota de orden: el limitador por llave corre ANTES del gate de scope, así que una petición con scope incorrecto y el bucket agotado responde `429 RATE_LIMITED` (el 429 tiene precedencia sobre este 403).
- `404`: `NOT_FOUND` — no existe, no es del usuario de la llave, o no hay etiqueta disponible (respuesta idéntica en todos los casos).
- `429`: `RATE_LIMITED` — bucket de la llave agotado. Espera `Retry-After` s (`details.retry_after_ms` para el hint fino). El limitador corre antes del gate de scope, por lo que un 429 tiene precedencia sobre un 403 `INSUFFICIENT_SCOPE`.

---

[API](https://skmtc.dev/enviadores/apis/enviadores-public-api.md) · [All operations](https://skmtc.dev/enviadores/apis/enviadores-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/enviadores/apis/enviadores-public-api/revisions/3633f08c889c?raw)
