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.