Lookup sunat · locales by RUC
https://api.latinfo.dev/pe/sunat/locales/ruc/{ruc}
One annex establishment address; a company can have several records. Coverage: Annex establishments published for legal-entity RUCs. Lookup by ruc as a string, preserving leading zeros. Accepted syntax and normalization are defined by the contract below. departamento is an address/unit component, not the geographic department; resolve UBIGEO for geography. Returns all records as an array. Import time is not observation time; inspect freshness headers. Add limit (1–500) and offset to retrieve an explicit page; without them the complete original array is returned. X-Total-Count gives the exact row count; follow Link rel=next to retrieve all pages.
Source contract
- Publisher
- SUNAT, Peru
- Coverage
- Annex establishments published for legal-entity RUCs.
- Record meaning
- One annex establishment address; a company can have several records.
- Identifier
- Lookup by ruc as a string, preserving leading zeros. Accepted syntax and normalization are defined by the contract below.
- Accepted pattern
^\d{11}$- Cardinality
many- License
- Reuse permission has not been verified. Public access is not a reuse license.
Known limitations
- departamento is an address/unit component, not the geographic department; resolve UBIGEO for geography.
Parameters
rucstringpathrequiredRUC in the source's normalized format. Keep identifiers as strings; preserve leading zeros.
Example: 20100047218
limitintegerqueryOptional page size. Supplying limit or offset enables explicit pagination; default page size is 100.
offsetintegerqueryRow offset, default 0. Keep the same source generation while collecting pages.
generationstringqueryOpaque source-generation guard, automatically included in the next-page Link. A changed generation returns 409; restart retrieval.
Request example
curl https://api.latinfo.dev/pe/sunat/locales/ruc/20100047218 \
-H "Authorization: Bearer $LATINFO_API_KEY"
Responses
200Published source records. Missing data is not a clearance or a negative finding.
Response headers
X-Latinfo-Imported-AtImport time, not the date of the government observation.
X-Source-Updated-AtPublisher update time, when known.
X-Latest-Observation-AtLatest date in returned records, when known.
X-Freshness-Statusstring
CURRENT · DELAYED · STALE · UNKNOWNX-Credits-CostActual credits charged for this request.
X-Source-GenerationOpaque immutable source generation. Follow the guarded next-page Link when collecting a history.
X-Total-CountExact row count for this identifier when pagination is requested.
X-Page-Offsetinteger
X-Page-Limitinteger
LinkNext page URL, rel=next. Absent at the end.
application/jsonResponse fields
[].ruc string requiredLookup by ruc as a string, preserving leading zeros. Accepted syntax and normalization are defined by the contract below.
[].ubigeo string requiredSix-digit INEI district code; retain leading zeros.
[].tipo_via string requiredPublished street-type abbreviation.
[].nombre_via string requiredPublished street name.
[].codigo_zona string requiredPublished zone-type abbreviation.
[].tipo_zona string requiredPublished zone name.
[].numero string requiredExternal street number; not a count.
[].kilometro string requiredAddress kilometer marker; not a measured company distance.
[].interior string requiredInterior/unit address component.
[].lote string requiredAddress lot component.
[].departamento string requiredApartment/unit address component; not the geographic department.
[].manzana string requiredAddress block component.
Response schema
{
"type": "array",
"items": {
"type": "object",
"properties": {
"ruc": {
"type": "string",
"description": "Lookup by ruc as a string, preserving leading zeros. Accepted syntax and normalization are defined by the contract below."
},
"ubigeo": {
"type": "string",
"description": "Six-digit INEI district code; retain leading zeros.",
"x-latinfo-meaning": "code"
},
"tipo_via": {
"type": "string",
"description": "Published street-type abbreviation.",
"x-latinfo-meaning": "text"
},
"nombre_via": {
"type": "string",
"description": "Published street name.",
"x-latinfo-meaning": "text"
},
"codigo_zona": {
"type": "string",
"description": "Published zone-type abbreviation.",
"x-latinfo-meaning": "text"
},
"tipo_zona": {
"type": "string",
"description": "Published zone name.",
"x-latinfo-meaning": "text"
},
"numero": {
"type": "string",
"description": "External street number; not a count.",
"x-latinfo-meaning": "text"
},
"kilometro": {
"type": "string",
"description": "Address kilometer marker; not a measured company distance.",
"x-latinfo-meaning": "text"
},
"interior": {
"type": "string",
"description": "Interior/unit address component.",
"x-latinfo-meaning": "text"
},
"lote": {
"type": "string",
"description": "Address lot component.",
"x-latinfo-meaning": "text"
},
"departamento": {
"type": "string",
"description": "Apartment/unit address component; not the geographic department.",
"x-latinfo-meaning": "text"
},
"manzana": {
"type": "string",
"description": "Address block component.",
"x-latinfo-meaning": "text"
}
},
"required": [
"ruc",
"ubigeo",
"tipo_via",
"nombre_via",
"codigo_zona",
"tipo_zona",
"numero",
"kilometro",
"interior",
"lote",
"departamento",
"manzana"
],
"additionalProperties": false
}
}400Invalid identifier or query. Correct the input before retrying.
401Missing or invalid API key. Authenticate before retrying.
404No published record, or identifier outside the legal-entity scope. Not proof that the company does not exist.
409Source generation changed during paginated retrieval. Restart from offset 0.
429Rate or credit limit exceeded. Inspect the response and rate-limit headers before retrying.
503Source unavailable. Report unavailable, not an empty result.
Example JSON
Illustrative schema example. This is not a live response.
[
{
"ruc": "string",
"ubigeo": "string",
"tipo_via": "string",
"nombre_via": "string",
"codigo_zona": "string",
"tipo_zona": "string",
"numero": "string",
"kilometro": "string",
"interior": "string",
"lote": "string",
"departamento": "string",
"manzana": "string"
}
]Provenance and limitations
Coverage varies by country and public source. A missing field is not evidence that the underlying fact does not exist. Public registries may be delayed or contain source errors; inspect the returned evidence and source date before relying on a result.