Apariencia
Archivos
Las consultas de CDR, XML y PDF no devuelven el archivo dentro del JSON: devuelven una referencia en result.archivo:
json
"archivo": {
"id": "0192f1c4-7a1e-7c3a-9d2e-3f4b5a6c7d8e",
"nombre": "20100070970-01-F001-123.xml",
"url": "/v1/archivos/0192f1c4-7a1e-7c3a-9d2e-3f4b5a6c7d8e"
}Descarga el contenido con el endpoint de archivos, usando el mismo token.
Descargar un archivo
GET /v1/archivos/{id} · Sin módulo (no consume cuota)
| Parámetro | En | Tipo | Requerido | Descripción |
|---|---|---|---|---|
id | ruta | string (UUID) | Sí | result.archivo.id de la consulta. |
bash
curl "https://api.consultape.pro/v1/archivos/0192f1c4-7a1e-7c3a-9d2e-3f4b5a6c7d8e" \
-H "Authorization: Bearer $CONSULTAPE_TOKEN" \
-o "20100070970-01-F001-123.xml"js
import { writeFile } from 'node:fs/promises';
const respuesta = await fetch('https://api.consultape.pro/v1/archivos/0192f1c4-7a1e-7c3a-9d2e-3f4b5a6c7d8e', {
headers: {
Authorization: `Bearer ${process.env.CONSULTAPE_TOKEN}`,
},
});
if (respuesta.ok) {
await writeFile('20100070970-01-F001-123.xml', Buffer.from(await respuesta.arrayBuffer()));
} else {
console.error((await respuesta.json()).message);
}php
<?php
$ch = curl_init('https://api.consultape.pro/v1/archivos/0192f1c4-7a1e-7c3a-9d2e-3f4b5a6c7d8e');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CONSULTAPE_TOKEN')],
CURLOPT_TIMEOUT => 120,
]);
$cuerpo = curl_exec($ch);
$http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http === 200) {
file_put_contents('20100070970-01-F001-123.xml', $cuerpo);
} else {
echo json_decode($cuerpo, true)['message'];
}python
import os
import requests
r = requests.get(
"https://api.consultape.pro/v1/archivos/0192f1c4-7a1e-7c3a-9d2e-3f4b5a6c7d8e",
headers={"Authorization": f"Bearer {os.environ['CONSULTAPE_TOKEN']}"},
timeout=120,
)
if r.ok:
with open("20100070970-01-F001-123.xml", "wb") as salida:
salida.write(r.content)
else:
print(r.json()["message"])Respuesta: el contenido binario del archivo (no usa la envoltura JSON), con las cabeceras:
http
HTTP/1.1 200 OK
Content-Type: application/xml
Content-Disposition: attachment; filename="20100070970-01-F001-123.xml"| Tipo | Content-Type |
|---|---|
| XML / CDR | application/xml |
application/pdf | |
| Excel | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
Reglas
- Solo el dueño de la consulta puede descargar el archivo.
- Los archivos vencen a las 72 horas. Si necesitas conservarlos, guárdalos en tu sistema apenas los descargues.
- Si el archivo no existe, no es tuyo o ya venció: 404
Archivo no encontrado o vencido:
json
{ "success": false, "message": "Archivo no encontrado o vencido", "result": null }Flujo completo
Descargar el XML de una compra y guardarlo en disco:
js
const API = 'https://api.consultape.pro';
const cabeceras = { Authorization: `Bearer ${process.env.CONSULTAPE_TOKEN}` };
// 1. Pide el XML a SUNAT
const r = await fetch(`${API}/v1/cpe/xml`, {
method: 'POST',
headers: { ...cabeceras, 'Content-Type': 'application/json' },
body: JSON.stringify({
credencial_id: process.env.CONSULTAPE_CREDENCIAL,
proceso: 'compra',
ruc_emisor: '20600000001',
serie: 'F001',
numero: '123',
}),
});
const { success, message, result } = await r.json();
if (!success) throw new Error(message);
// 2. Descarga el archivo con la URL que devolvió la consulta
const archivo = await fetch(`${API}${result.archivo.url}`, { headers: cabeceras });
const { writeFile } = await import('node:fs/promises');
await writeFile(result.archivo.nombre, Buffer.from(await archivo.arrayBuffer()));