Separa el navegador del token
Aunque fetch también existe en el navegador, este ejemplo está escrito para Node.js. process.env.DATOSPERU_API_KEY pertenece al servidor: no la conviertas en una variable NEXT_PUBLIC, VITE ni en una propiedad enviada a un componente cliente.
Define DATOSPERU_RUC con un documento autorizado. Si recibes el RUC de un formulario, autentica a la persona que realiza la consulta, aplica un límite por usuario y comprueba once dígitos antes de llamar a DatosPerú.
Valida lo que recibes
fetch no lanza un error por recibir HTTP 401, 422 o 429. Comprueba response.ok y success. Una respuesta JSON exitosa puede contener campos opcionales o nulos; el contrato OpenAPI permite generar tipos, pero la validación de datos externos sigue siendo necesaria.
AbortSignal.timeout limita la espera. Un timeout no prueba que la solicitud no haya llegado al servidor: si implementas reintentos, usa una cantidad máxima y considera que una consulta repetida puede consumir otro crédito.
Ejemplo de código
const token = process.env.DATOSPERU_API_KEY;
const ruc = process.env.DATOSPERU_RUC;
if (!token || !/^\d{11}$/.test(ruc || '')) {
throw new Error('Configura la clave y un RUC autorizado.');
}
const response = await fetch('https://api.datosperu.net/api/v1/ruc', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + token,
'Content-Type': 'application/json'
},
body: JSON.stringify({ ruc }),
signal: AbortSignal.timeout(30000),
redirect: 'error'
});
const result = await response.json();
if (!response.ok || !result.success) {
throw new Error(result.error?.message || 'Consulta fallida.');
}
const empresa = result.data;
Este ejemplo realiza una solicitud real cuando configuras tus credenciales y lo ejecutas. No contiene resultados simulados.