XmlPeruDevDocs

Descargar CDR

Descarga la constancia de recepción (CDR) devuelta por SUNAT/OSE, en el mismo ZIP que entrega SUNAT.

Autenticación: token Bearer de empresa (cpe:sign).

Consideraciones

  • La respuesta exitosa es un archivo, no un JSON.
  • Por defecto se entrega el ZIP tal como lo entrega SUNAT: contiene dummy/ y R-{nombre}.xml, con Content-Type: application/zip. Así un CDR nuestro es intercambiable con uno bajado del portal de SUNAT.
  • Con ?formato=xml se devuelve el XML ya extraído, sin envoltorio. El contenido es el mismo byte a byte.
  • Sirve también para resúmenes (RC, RA, RR) y guías, no solo para facturas y boletas.
  • Disponible cuando el comprobante tiene has_cdr: true (ver Consultar).
GEThttps://api.xmlperu.dev/v1/cpe/{external_id}/cdrCopiar

Qué contiene el ZIP

El mismo envoltorio que entrega SUNAT:

R-20123456789-01-F001-42.zip
├── dummy/
└── R-20123456789-01-F001-42.xml

El dummy/ vacío no sirve para nada, pero es parte del formato: quitarlo haría que nuestro ZIP no fuera intercambiable con el de SUNAT, y algunos sistemas contables lo esperan.

# El ZIP, como lo da SUNAT
curl https://api.xmlperu.dev/v1/cpe/$EXTERNAL_ID/cdr   -H "Authorization: Bearer $TOKEN" -o cdr.zip

# Solo el XML de dentro
curl "https://api.xmlperu.dev/v1/cpe/$EXTERNAL_ID/cdr?formato=xml"   -H "Authorization: Bearer $TOKEN" -o cdr.xml

El XML es el que devolvió SUNAT, sin tocar.

Headers

NameTypeDescription
Acceptstringapplication/json
Content-Typestringapplication/json
AuthorizationstringBearer <token>. Genéralo desde tu panel, en Tokens de API.

Parámetros de URL

NameTypeDescription
external_id*stringIdentificador del comprobante devuelto al emitir.

Parámetros de consulta

NameTypeDescription
formatostringDeja vacío para el ZIP de SUNAT (por defecto). xml devuelve el XML extraído.

Ejemplo de solicitud

Copiar
curl -X GET https://api.xmlperu.dev/v1/cpe/9c2f1b7e-0000-0000-0000-000000000000/cdr?formato=xml \
  -H "Authorization: Bearer $TOKEN_EMPRESA" \
  -H "Accept: application/json"

Respuesta

404 No existeapplication/json
{
  "success": false,
  "message": "El comprobante no existe."
}