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/yR-{nombre}.xml, conContent-Type: application/zip. Así un CDR nuestro es intercambiable con uno bajado del portal de SUNAT. - Con
?formato=xmlse 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).
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
| Name | Type | Description |
|---|---|---|
| Accept | string | application/json |
| Content-Type | string | application/json |
| Authorization | string | Bearer <token>. Genéralo desde tu panel, en Tokens de API. |
Parámetros de URL
| Name | Type | Description |
|---|---|---|
| external_id* | string | Identificador del comprobante devuelto al emitir. |
Parámetros de consulta
| Name | Type | Description |
|---|---|---|
| formato | string | Deja 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"Copiar
<?php
$token_empresa = 'pega-aqui-tu-token';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.xmlperu.dev/v1/cpe/9c2f1b7e-0000-0000-0000-000000000000/cdr?formato=xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $token_empresa,
'Accept: application/json',
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);Copiar
const TOKEN_EMPRESA = 'pega-aqui-tu-token';
const res = await fetch('https://api.xmlperu.dev/v1/cpe/9c2f1b7e-0000-0000-0000-000000000000/cdr?formato=xml', {
method: 'GET',
headers: {
Authorization: `Bearer ${TOKEN_EMPRESA}`,
Accept: 'application/json',
},
});
const data = await res.json();Copiar
import requests
TOKEN_EMPRESA = "pega-aqui-tu-token"
headers = {
"Authorization": f"Bearer {TOKEN_EMPRESA}",
"Accept": "application/json",
}
res = requests.get("https://api.xmlperu.dev/v1/cpe/9c2f1b7e-0000-0000-0000-000000000000/cdr?formato=xml", headers=headers)
data = res.json()Respuesta
404 No existeapplication/json
{
"success": false,
"message": "El comprobante no existe."
}