---
title: "Consultar una solicitud de cancelación"
method: GET
path: "/cancellations/{id}"
tags: ["cancellations"]
---

# Consultar una solicitud de cancelación

`GET /cancellations/{id}`

## Request

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

Visibilidad idéntica a la del envío que cancela (propios por defecto; los del PDV con `X-PDV-ID` + scope `shipments:read:pdv`) — deliberadamente en paralelo, para que un envío que puedes leer nunca tenga una cancelación que no.

Máquina de estados: `pending → approved → in_progress → cancelled | rejected_by_carrier`; otros estados: `not_cancellable` (la guía no admite cancelación vía API — terminal), `reported_to_carrier` (reporte manual ante la paquetería, sigue abierta), `rejected`, `failed`, `expired`. Reembolso: `not_applicable → refund_in_progress → refunded | refund_denied` (los reembolsos son pass-through de la paquetería; `refunded` cubre también el reembolso manual por override administrativo). Requiere scope `cancellations:read`.

## Path parameters

- `id` integer, required

## Headers

- `X-PDV-ID` string

## Response `200`

La solicitud.

- object
  - `success` unknown, required
  - `data` object, required
    - `cancellation` Cancellation, required
      - `id` integer, required
      - `display_id` string, required
      - `shipment_id` string, nullable, required
      - `status` 'pending' | 'approved' | 'in_progress' | 'cancelled' | 'rejected_by_carrier' | 'not_cancellable' | 'reported_to_carrier' | 'rejected' | 'failed' | 'expired', required
      - `refund_status` 'not_applicable' | 'refund_in_progress' | 'refunded' | 'refund_denied', required
      - `reason_code` string, nullable, required
      - `reason_text` string, nullable, required
      - `refund_amount_expected` number, nullable, required
      - `refund_amount_actual` number, nullable, required
      - `cancellation_deadline` string, nullable, required
      - `created_at` string, nullable, required
      - `updated_at` string, nullable, required
      - `resolved_at` string, nullable, required
  - `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 o el envío subyacente no pertenece al usuario de la llave (respuesta idéntica).
- `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`.
- `500`: `GET_ERROR`.

---

[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)
