Apariencia
RUC
Consultas de contribuyentes por número de RUC.
Un RUC mal formado (no son 11 dígitos, prefijo distinto de
10,15,16,17,20o dígito verificador incorrecto) responde HTTP 400El número de RUC no es válido.Los textos vienen en MAYÚSCULAS, tal como los publica SUNAT. Un valor que SUNAT muestra como
-llega comonull.Las fechas (
fecha_*,*_desde) vienen enYYYY-MM-DD.fuentesiempre esconsultape.pro.
Consultar RUC
GET /v1/ruc/{numero} · Módulo ruc
Datos básicos desde el padrón reducido de SUNAT: razón social, estado, condición, dirección y ubigeo. Es la consulta más rápida.
| Parámetro | En | Tipo | Requerido | Descripción |
|---|---|---|---|---|
numero | ruta | string | Sí | RUC de 11 dígitos. |
bash
curl "https://api.consultape.pro/v1/ruc/20100193117" \
-H "Authorization: Bearer $CONSULTAPE_TOKEN"js
const respuesta = await fetch('https://api.consultape.pro/v1/ruc/20100193117', {
headers: {
Authorization: `Bearer ${process.env.CONSULTAPE_TOKEN}`,
},
});
const datos = await respuesta.json();
if (datos.success) console.log(datos.result);
else console.error(respuesta.status, datos.message);php
<?php
$ch = curl_init('https://api.consultape.pro/v1/ruc/20100193117');
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);
$datos = json_decode($cuerpo, true);
if ($datos['success']) {
print_r($datos['result']);
} else {
echo "Error $http: {$datos['message']}";
}python
import os
import requests
r = requests.get(
"https://api.consultape.pro/v1/ruc/20100193117",
headers={"Authorization": f"Bearer {os.environ['CONSULTAPE_TOKEN']}"},
timeout=120,
)
datos = r.json()
print(datos["result"] if datos["success"] else f"Error {r.status_code}: {datos['message']}")Respuesta (persona jurídica):
json
{
"success": true,
"message": "Consulta exitosa",
"result": {
"ruc": "20100193117",
"razon_social": "YARA PERU S.R.L.",
"estado": "ACTIVO",
"condicion": "HABIDO",
"direccion": "JR. MONTERROSA NRO. 271 DPTO. 902",
"direccion_completa": "JR. MONTERROSA NRO. 271 DPTO. 902 LIMA - LIMA - SANTIAGO DE SURCO",
"departamento": "LIMA",
"provincia": "LIMA",
"distrito": "SANTIAGO DE SURCO",
"ubigeo": ["15", "1501", "150140"],
"domicilio": {
"tipo_via": "JR.",
"nombre_via": "MONTERROSA",
"numero": "271",
"kilometro": null,
"manzana": null,
"lote": null,
"dpto": "902",
"interior": null,
"tipo_zona": null,
"nombre_zona": null
},
"fuente": "consultape.pro",
"desde_cache": false
}
}| Campo | Descripción |
|---|---|
direccion | Dirección armada con las partes del padrón, sin la región. null si el padrón no la publica. |
direccion_completa | direccion + DEPARTAMENTO - PROVINCIA - DISTRITO. |
ubigeo | Código INEI [departamento, provincia, distrito] o [null, null, null]. |
domicilio | Partes de la dirección tal como vienen en el padrón (dpto es el número de departamento u oficina, no la región). null si los datos no salieron del padrón. |
Personas naturales (RUC 10) y RUC 15/17: SUNAT no publica su dirección en el padrón. ConsultaPe la obtiene del domicilio fiscal cuando es posible; si no está disponible, direccion, direccion_completa, la región y ubigeo llegan en null.
RUC recién inscritos que aún no figuran en el padrón se consultan en línea en SUNAT (domicilio: null).
Sin datos (HTTP 200): No se encontró el RUC 20999999991.
RUC completo
GET /v1/ruc/{numero}/completo · Módulo ruc.plus
Ficha RUC completa de SUNAT: tipo de contribuyente, fechas, actividades económicas, comprobantes autorizados, emisión electrónica y padrones. Opcionalmente incluye establecimientos anexos y representantes legales sin consumo adicional (cuenta como una sola consulta ruc.plus).
| Parámetro | En | Tipo | Requerido | Descripción |
|---|---|---|---|---|
numero | ruta | string | Sí | RUC de 11 dígitos. |
establecimientos | query | 0 | 1 | No | 1 agrega establecimientos. También acepta true, si, on, yes. |
representantes | query | 0 | 1 | No | 1 agrega representantes_legales. |
bash
curl "https://api.consultape.pro/v1/ruc/20100047218/completo?establecimientos=1&representantes=1" \
-H "Authorization: Bearer $CONSULTAPE_TOKEN"js
const respuesta = await fetch('https://api.consultape.pro/v1/ruc/20100047218/completo?establecimientos=1&representantes=1', {
headers: {
Authorization: `Bearer ${process.env.CONSULTAPE_TOKEN}`,
},
});
const datos = await respuesta.json();
if (datos.success) console.log(datos.result);
else console.error(respuesta.status, datos.message);php
<?php
$ch = curl_init('https://api.consultape.pro/v1/ruc/20100047218/completo?establecimientos=1&representantes=1');
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);
$datos = json_decode($cuerpo, true);
if ($datos['success']) {
print_r($datos['result']);
} else {
echo "Error $http: {$datos['message']}";
}python
import os
import requests
r = requests.get(
"https://api.consultape.pro/v1/ruc/20100047218/completo",
params={
"establecimientos": 1,
"representantes": 1,
},
headers={"Authorization": f"Bearer {os.environ['CONSULTAPE_TOKEN']}"},
timeout=120,
)
datos = r.json()
print(datos["result"] if datos["success"] else f"Error {r.status_code}: {datos['message']}")Respuesta:
json
{
"success": true,
"message": "Consulta exitosa",
"result": {
"ruc": "20100047218",
"razon_social": "BANCO DE CREDITO DEL PERU",
"nombre_comercial": "BANCO DE CREDITO DEL PERU",
"tipo_contribuyente": "SOCIEDAD ANONIMA",
"estado": "ACTIVO",
"condicion": "HABIDO",
"fecha_inscripcion": "1992-10-09",
"fecha_inicio_actividades": "1889-04-09",
"domicilio_fiscal": "JR. CENTENARIO NRO. 156 URB. LADERAS DE MELGAREJO",
"direccion_completa": "JR. CENTENARIO NRO. 156 URB. LADERAS DE MELGAREJO LIMA - LIMA - LA MOLINA",
"departamento": "LIMA",
"provincia": "LIMA",
"distrito": "LA MOLINA",
"ubigeo": ["15", "1501", "150114"],
"sistema_emision_comprobante": "COMPUTARIZADO",
"sistema_contabilidad": "COMPUTARIZADO",
"actividad_comercio_exterior": "SIN ACTIVIDAD",
"actividades_economicas": [
{ "tipo": "principal", "codigo": "6419", "descripcion": "OTROS TIPOS DE INTERMEDIACIÓN MONETARIA" },
{ "tipo": "secundaria", "codigo": "6491", "descripcion": "ARRENDAMIENTO FINANCIERO" }
],
"comprobantes_pago": ["NINGUNO"],
"sistema_emision_electronica": ["DESDE LOS SISTEMAS DEL CONTRIBUYENTE. AUTORIZ DESDE 02/11/2023"],
"emisor_electronico_desde": "2023-11-02",
"comprobantes_electronicos": ["FACTURA (desde 02/11/2023)", "BOLETA (desde 02/11/2023)"],
"afiliado_ple_desde": null,
"padrones": ["NINGUNO"],
"establecimientos": [
{
"codigo": "0001",
"tipo_establecimiento": "AGENCIA",
"direccion": "AV. LARCO NRO. 101 LIMA - LIMA - MIRAFLORES",
"actividad_economica": "-"
}
],
"establecimientos_mensaje": null,
"representantes_legales": [
{
"tipo_documento": "DNI",
"numero_documento": "07871234",
"nombre": "PEREZ PEREZ JUAN",
"cargo": "GERENTE GENERAL",
"fecha_desde": "2020-01-01"
}
],
"representantes_mensaje": null,
"consultado_at": "2026-10-04T15:20:11.000Z",
"fuente": "consultape.pro",
"desde_cache": false
}
}domicilio_fiscal: dirección sin la región. Para RUC 10/15/17 SUNAT no la muestra en la ficha; se usa el domicilio fiscal obtenido con Clave SOL onull.actividades_economicas[].tipo:principalosecundaria.establecimientos,representantes_legalesy sus*_mensajesolo aparecen si los pediste. Si una lista no se pudo obtener, lleganully su*_mensajeexplica el motivo (la ficha igual se devuelve consuccess: true).- La ficha se guarda y se reutiliza por 7 días (
desde_cache: true).
Fallas (HTTP 200): No se encontró el RUC 20999999991 en SUNAT. · SUNAT no respondió, intenta nuevamente en unos minutos.
Establecimientos anexos
GET /v1/ruc/{numero}/establecimientos · Módulo ruc.establecimientos
Locales anexos registrados en SUNAT. Se guardan y reutilizan por 7 días.
| Parámetro | En | Tipo | Requerido | Descripción |
|---|---|---|---|---|
numero | ruta | string | Sí | RUC de 11 dígitos. |
bash
curl "https://api.consultape.pro/v1/ruc/20100070970/establecimientos" \
-H "Authorization: Bearer $CONSULTAPE_TOKEN"js
const respuesta = await fetch('https://api.consultape.pro/v1/ruc/20100070970/establecimientos', {
headers: {
Authorization: `Bearer ${process.env.CONSULTAPE_TOKEN}`,
},
});
const datos = await respuesta.json();
if (datos.success) console.log(datos.result);
else console.error(respuesta.status, datos.message);php
<?php
$ch = curl_init('https://api.consultape.pro/v1/ruc/20100070970/establecimientos');
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);
$datos = json_decode($cuerpo, true);
if ($datos['success']) {
print_r($datos['result']);
} else {
echo "Error $http: {$datos['message']}";
}python
import os
import requests
r = requests.get(
"https://api.consultape.pro/v1/ruc/20100070970/establecimientos",
headers={"Authorization": f"Bearer {os.environ['CONSULTAPE_TOKEN']}"},
timeout=120,
)
datos = r.json()
print(datos["result"] if datos["success"] else f"Error {r.status_code}: {datos['message']}")Respuesta:
json
{
"success": true,
"message": "Consulta exitosa",
"result": {
"ruc": "20100070970",
"cantidad": 1,
"establecimientos": [
{
"codigo": "0001",
"tipo_establecimiento": "ALMACEN",
"direccion": "AV. EJEMPLO NRO. 123 LIMA - LIMA - LIMA",
"actividad_economica": "VENTA AL POR MAYOR NO ESPECIALIZADA"
}
],
"consultado_at": "2026-10-04T15:20:11.000Z",
"fuente": "consultape.pro",
"desde_cache": false
}
}Sin locales anexos: success: true, cantidad: 0, establecimientos: [].
Representantes legales
GET /v1/ruc/{numero}/representantes · Módulo ruc.representantes
Representantes legales registrados en SUNAT. Se guardan y reutilizan por 7 días.
| Parámetro | En | Tipo | Requerido | Descripción |
|---|---|---|---|---|
numero | ruta | string | Sí | RUC de 11 dígitos. |
bash
curl "https://api.consultape.pro/v1/ruc/20100070970/representantes" \
-H "Authorization: Bearer $CONSULTAPE_TOKEN"js
const respuesta = await fetch('https://api.consultape.pro/v1/ruc/20100070970/representantes', {
headers: {
Authorization: `Bearer ${process.env.CONSULTAPE_TOKEN}`,
},
});
const datos = await respuesta.json();
if (datos.success) console.log(datos.result);
else console.error(respuesta.status, datos.message);php
<?php
$ch = curl_init('https://api.consultape.pro/v1/ruc/20100070970/representantes');
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);
$datos = json_decode($cuerpo, true);
if ($datos['success']) {
print_r($datos['result']);
} else {
echo "Error $http: {$datos['message']}";
}python
import os
import requests
r = requests.get(
"https://api.consultape.pro/v1/ruc/20100070970/representantes",
headers={"Authorization": f"Bearer {os.environ['CONSULTAPE_TOKEN']}"},
timeout=120,
)
datos = r.json()
print(datos["result"] if datos["success"] else f"Error {r.status_code}: {datos['message']}")Respuesta:
json
{
"success": true,
"message": "Consulta exitosa",
"result": {
"ruc": "20100070970",
"cantidad": 1,
"representantes_legales": [
{
"tipo_documento": "DNI",
"numero_documento": "12345678",
"nombre": "PEREZ PEREZ JUAN",
"cargo": "GERENTE GENERAL",
"fecha_desde": "2020-01-01"
}
],
"consultado_at": "2026-10-04T15:20:11.000Z",
"fuente": "consultape.pro",
"desde_cache": false
}
}Sin representantes: success: true, cantidad: 0, representantes_legales: [].
Ficha RUC en PDF
POST /v1/ruc/ficha · Módulo ruc.ficha
Descarga la ficha RUC oficial (reporte electrónico de SUNAT Operaciones en Línea, opción 10.1.1.1.1) en PDF. Necesita la clave SOL del contribuyente: la ficha es siempre del RUC de esa clave.
Tres por día
SUNAT permite generar solo tres fichas por día por RUC. Cada llamada exitosa gasta una; guarda el PDF en lugar de pedirlo otra vez.
| Parámetro | En | Tipo | Requerido | Descripción |
|---|---|---|---|---|
ruc | cuerpo | string | Sí, salvo con credencial_id | RUC del contribuyente (dueño de la clave SOL). |
usuario_sol | cuerpo | string | Sí, salvo con credencial_id | Usuario SOL. |
clave_sol | cuerpo | string | Sí, salvo con credencial_id | Clave SOL. |
credencial_id | cuerpo | string (UUID) | No | Credencial guardada (reemplaza a los tres anteriores). Ver Credenciales SOL. |
bash
curl -X POST "https://api.consultape.pro/v1/ruc/ficha" -H "Authorization: Bearer $CONSULTAPE_TOKEN" -H "Content-Type: application/json" -d '{"ruc": "20100070970", "usuario_sol": "MODDATOS", "clave_sol": "moddatos"}'js
const respuesta = await fetch('https://api.consultape.pro/v1/ruc/ficha', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.CONSULTAPE_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ ruc: '20100070970', usuario_sol: 'MODDATOS', clave_sol: 'moddatos' }),
});
const datos = await respuesta.json();
if (datos.success) console.log(datos.result);
else console.error(respuesta.status, datos.message);php
<?php
$ch = curl_init('https://api.consultape.pro/v1/ruc/ficha');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CONSULTAPE_TOKEN'), 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'ruc' => '20100070970',
'usuario_sol' => 'MODDATOS',
'clave_sol' => 'moddatos',
]),
CURLOPT_TIMEOUT => 120,
]);
$cuerpo = curl_exec($ch);
$http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$datos = json_decode($cuerpo, true);
if ($datos['success']) {
print_r($datos['result']);
} else {
echo "Error $http: {$datos['message']}";
}python
import os
import requests
r = requests.post(
"https://api.consultape.pro/v1/ruc/ficha",
headers={"Authorization": f"Bearer {os.environ['CONSULTAPE_TOKEN']}"},
json={"ruc": "20100070970", "usuario_sol": "MODDATOS", "clave_sol": "moddatos"},
timeout=120,
)
datos = r.json()
print(datos["result"] if datos["success"] else f"Error {r.status_code}: {datos['message']}")Con una credencial guardada:
json
{ "credencial_id": "0192f1c4-7a1e-7c3a-9d2e-3f4b5a6c7d8e" }Respuesta:
json
{
"success": true,
"message": "Ficha RUC descargada de SUNAT",
"result": {
"ruc": "20100070970",
"generada_at": "2026-10-05T15:20:11.000Z",
"archivo": {
"id": "0192f1c4-9c3a-7e5b-bf40-5b6c7d8e9fa1",
"nombre": "ficha-ruc-20100070970-20261005-102011.pdf",
"url": "/v1/archivos/0192f1c4-9c3a-7e5b-bf40-5b6c7d8e9fa1"
}
}
}archivo: el PDF de la ficha. Descárgalo con Archivos (disponible 72 horas).- La consulta tarda de 15 a 60 segundos: usa un timeout de al menos 120 segundos.
Fallas (HTTP 200, success: false, no consumen cuota). El mensaje de SUNAT llega tal cual:
json
{ "success": false, "message": "SUNAT rechazó el usuario o la clave SOL. Verifica tus credenciales.", "result": null }json
{ "success": false, "message": "SUNAT no generó la ficha RUC: <aviso del portal de SUNAT, p. ej. el límite diario>", "result": null }