REST · ¿Quién está detrás?
Sociedades y grupos
En qué sociedades participa un RUT, quiénes participan en él y el grupo que se arma siguiendo esas participaciones. Los ejemplos de abajo son la petición y la respuesta real de cada operación, no una aproximación.
Lo que descuenta cada operación es lo mismo por REST, SOAP, GraphQL y MCP —pagas por el dato, no por el protocolo—; la tabla completa está en Empezar.
GET /v1/rut/{rut}/sociedades
Sociedades y socios
En qué sociedades participa el RUT y con cuánto, qué personas jurídicas participan en él, y cuánto suman sus personas naturales — sin nombrarlas: el SII publica el porcentaje agregado, no quiénes son. Las listas vacías también son respuesta: «no tiene» es información.
Lo que devuelve
| Campo | Tipo | Qué es |
|---|---|---|
rut | string | El RUT que consultaste, normalizado: con guion y sin puntos. |
rut_formateado | string | El mismo RUT listo para mostrar: con puntos y guion. |
es_empresa | boolean | true si el RUT es de una empresa y false si es de una persona. Sirve para decidir qué pedirle a quien se está registrando. |
participaciones | array | Las sociedades en que ESTE RUT participa. Vacía si no participa en ninguna. |
socios | array | Las personas jurídicas que participan en él. Vacía si ninguna lo hace — una sociedad de personas naturales, o una empresa del Estado. |
personas_naturales | object | El agregado de sus socios personas naturales: solo el porcentaje, sin nombres ni RUT, porque es lo único que el SII publica de ellos. null cuando el RUT no tiene socios personas naturales. |
fuente | string | De dónde salen los datos de esta respuesta, en texto listo para citar («Composición de sociedades, SII»). Es constante para esta llamada: guárdalo una vez y no lo parsees. |
publicado | string | De cuándo es la composición de sociedades que respondió. ISO 8601 con hora y zona (2026-08-05T15:36:37+00:00), siempre en UTC. Es otro archivo que el padrón: otra fecha que padron_publicado. |
consultado_en | string | Cuándo se respondió esta llamada. ISO 8601 con hora y zona (2026-08-05T15:36:37+00:00), siempre en UTC. |
Dentro de participaciones
| Campo | Tipo | Qué es |
|---|---|---|
rut | string | El RUT del otro extremo, normalizado. Pide su ficha con él. |
rut_formateado | string | El mismo RUT listo para mostrar. |
razon_social | string | Su nombre legal según el padrón. Cadena vacía si no está en él. |
participacion | number | El porcentaje de participación, tal como el SII lo publica: hasta diez decimales, y puede pasar de 100 — no supongas que los socios suman 100. null cuando el SII no lo informa: una de cada dieciséis participaciones. |
Dentro de socios
| Campo | Tipo | Qué es |
|---|---|---|
rut | string | El RUT del otro extremo, normalizado. Pide su ficha con él. |
rut_formateado | string | El mismo RUT listo para mostrar. |
razon_social | string | Su nombre legal según el padrón. Cadena vacía si no está en él. |
participacion | number | El porcentaje de participación, tal como el SII lo publica: hasta diez decimales, y puede pasar de 100 — no supongas que los socios suman 100. null cuando el SII no lo informa: una de cada dieciséis participaciones. |
Dentro de personas_naturales
| Campo | Tipo | Qué es |
|---|---|---|
participacion | number | El porcentaje que suman las personas naturales. null si el SII no lo informa. |
Cuándo responde cada cosa
- 200 El RUT está en el padrón. Descuenta dos consultas, también con las listas vacías: «no participa en nada» es información. Descuenta 2 consultas.
- 401 No mandaste el header, o no empieza con dtr_. No descuenta.
- 401 La key viajó bien pero ya no sirve: la revocaste o la rotaste. No descuenta.
- 422 El dígito verificador no corresponde al cuerpo. No se cobra: no hubo consulta. No descuenta.
- 422 No tiene forma de RUT: cuerpo fuera de 7-8 dígitos, o los ocho caracteres sin guion, que son ambiguos. No descuenta.
- 503 El padrón todavía no tiene datos que responder. Es excepcional: reintenta más tarde y, si sigue, mira el estado del servicio. No descuenta.
-
429
Fuiste más rápido que las consultas por minuto de tu plan.
Retry-Afterdice cuánto esperar. No descuenta. - 402 Se agotaron las consultas del plan y no hay saldo de recargas. Las consultas se detienen hasta que renueven. No descuenta.
- 402 Se agotaron las consultas del plan, hay saldo de recargas, y el interruptor «usar mi saldo automáticamente» está apagado. Nada se cobra. No descuenta.
- 404 El RUT es válido pero el SII no lo tiene. SÍ descuenta lo que cuesta la operación pedida: «no está» también es información. Descuenta 2 consultas.
curl -s -i -H "Authorization: Bearer dtr_TU_KEY" \
https://api.datario.cl/v1/rut/61.704.000-K/sociedades
import requests
r = requests.get(
"https://api.datario.cl/v1/rut/61.704.000-K/sociedades",
headers={"Authorization": "Bearer dtr_TU_KEY"},
timeout=10,
)
cuerpo = r.json()
if r.status_code != 200:
raise SystemExit(f"{cuerpo['error']}: {cuerpo['detail']}")
print(cuerpo["participaciones"][0]["razon_social"])
print(r.headers.get("X-Plan-Remaining"), "restantes")
const r = await fetch(
"https://api.datario.cl/v1/rut/61.704.000-K/sociedades",
{ headers: { "Authorization": "Bearer dtr_TU_KEY" } },
);
const cuerpo = await r.json();
if (!r.ok) {
if (r.status === 429) {
const s = r.headers.get("Retry-After");
throw new Error(`Reintenta en ${s} s`);
}
throw new Error(`${cuerpo.error}: ${cuerpo.detail}`);
}
console.log(cuerpo.participaciones[0].razon_social);
<?php
$ch = curl_init(
"https://api.datario.cl/v1/rut/61.704.000-K/sociedades"
);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer dtr_TU_KEY"],
]);
$cuerpo = json_decode(curl_exec($ch), true);
$estado = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($estado !== 200) {
throw new Exception(
$cuerpo["error"] . ": " . $cuerpo["detail"]
);
}
echo $cuerpo["participaciones"][0]["razon_social"];
using var http = new HttpClient();
http.DefaultRequestHeaders.Add(
"Authorization", "Bearer dtr_TU_KEY");
var r = await http.GetAsync(
"https://api.datario.cl/v1/rut/61.704.000-K/sociedades");
var raiz = JsonDocument.Parse(
await r.Content.ReadAsStringAsync()).RootElement;
if (!r.IsSuccessStatusCode)
{
throw new Exception(
raiz.GetProperty("error").GetString() + ": " +
raiz.GetProperty("detail").GetString());
}
var item = raiz.GetProperty("participaciones")[0];
Console.WriteLine(
item.GetProperty("razon_social").GetString());
var req = HttpRequest.newBuilder()
.uri(URI.create(
"https://api.datario.cl/v1/rut/61.704.000-K/sociedades"))
.header("Authorization", "Bearer dtr_TU_KEY")
.build();
var r = HttpClient.newHttpClient()
.send(req, BodyHandlers.ofString());
if (r.statusCode() != 200) {
// El cuerpo trae siempre {error, detail}.
throw new IOException(r.body());
}
System.out.println(r.body());
req, _ := http.NewRequest("GET",
"https://api.datario.cl/v1/rut/61.704.000-K/sociedades", nil)
req.Header.Set("Authorization", "Bearer dtr_TU_KEY")
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
if res.StatusCode != 200 {
var e struct {
Error string `json:"error"`
Detail string `json:"detail"`
}
json.NewDecoder(res.Body).Decode(&e)
log.Fatalf("%s: %s", e.Error, e.Detail)
}
var cuerpo map[string]any
json.NewDecoder(res.Body).Decode(&cuerpo)
fmt.Println(cuerpo["participaciones"])
uri = URI("https://api.datario.cl/v1/rut/61.704.000-K/sociedades")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer dtr_TU_KEY"
res = Net::HTTP.start(
uri.host, uri.port, use_ssl: uri.scheme == "https"
) { |h| h.request(req) }
cuerpo = JSON.parse(res.body)
unless res.code == "200"
raise "#{cuerpo['error']}: #{cuerpo['detail']}"
end
puts cuerpo["participaciones"][0]["razon_social"]
Set Variable [ $url ; Value:
"https://api.datario.cl/v1/rut/61.704.000-K/sociedades" ]
Insert from URL [ Select ; With dialog: Off ; Target: $r ;
$url ; cURL options:
"-H \"Authorization: Bearer dtr_TU_KEY\"" ]
Set Variable [ $e ; Value: JSONGetElement ( $r ; "error" ) ]
If [ not IsEmpty ( $e ) ]
Show Custom Dialog [ $e & ": " &
JSONGetElement ( $r ; "detail" ) ]
Exit Script [ Text Result: $e ]
End If
Show Custom Dialog [
JSONGetElement ( $r ; "participaciones[0].razon_social" ) ]
Respuestas
{
"rut": "61704000-K",
"rut_formateado": "61.704.000-K",
"es_empresa": true,
"participaciones": [
{
"rut": "76028880-2",
"rut_formateado": "76.028.880-2",
"razon_social": "SOCIEDAD CONTRACTUAL MINERA PUREN",
"participacion": 35.0
},
{
"rut": "76148338-2",
"rut_formateado": "76.148.338-2",
"razon_social": "SOCIEDAD DE PROCESAMIENTO DE MOLIBDENO SPA",
"participacion": 100.0
}
],
"socios": [],
"personas_naturales": null,
"fuente": "Composición de sociedades, SII",
"publicado": "2025-11-25T16:11:42+00:00",
"consultado_en": "2026-08-29T04:12:07+00:00"
}
Headers: X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset X-Plan-Limit X-Plan-Remaining X-Plan-Reset X-Credits-Remaining
{
"error": "api_key_invalida",
"detail": "Falta la API key: envíala en el header Authorization: Bearer dtr_…."
}
{
"error": "api_key_invalida",
"detail": "La API key no existe o fue revocada."
}
{
"error": "rut_invalido",
"detail": "El RUT no es válido: revisa el dígito verificador."
}
{
"error": "rut_invalido",
"detail": "Eso no parece un RUT: son 7 u 8 dígitos más el verificador."
}
{
"error": "padron_no_disponible",
"detail": "El padrón aún no está cargado; intenta más tarde. Estado del servicio: https://status.datario.cl"
}
{
"error": "limite_de_velocidad",
"detail": "Superaste las consultas por minuto de tu plan: X-RateLimit-Limit dice cuántas y Retry-After cuánto esperar."
}
Headers: X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset Retry-After
{
"error": "sin_saldo",
"detail": "Se acabaron las consultas de tu plan y no te queda saldo. Renuevan el día que tu plan cumple el mes (X-Plan-Reset); para seguir ahora, recarga saldo (no vence) en https://datario.cl/panel/packs, o contrata el plan de ese mismo volumen en https://datario.cl/panel/planes, que sale más barato por consulta"
}
Headers: X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset
{
"error": "saldo_protegido",
"detail": "Las consultas del plan no alcanzan y tu saldo está protegido (pediste no gastarlo automáticamente): actívalo en https://datario.cl/panel/configuracion/avisos o renueva tu plan"
}
Headers: X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset
{
"error": "rut_no_registrado",
"detail": "El SII no registra datos para 12345678-5."
}
Headers: X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset X-Plan-Limit X-Plan-Remaining X-Plan-Reset X-Credits-Remaining
GET /v1/rut/{rut}/grupos
El grupo
Las empresas que se alcanzan siguiendo las participaciones desde el RUT —en las dos direcciones— hasta saltos de distancia, y las participaciones entre ellas. El grupo se corta en 200 empresas y lo dice.
Parámetros
| Parámetro | Tipo | Qué es |
|---|---|---|
saltos | integer | Hasta cuántos saltos seguir las participaciones: 1 a 3. Por defecto 2. Uno es participación directa; cada salto más multiplica las empresas. |
Lo que devuelve
| Campo | Tipo | Qué es |
|---|---|---|
rut | string | El RUT que consultaste, normalizado: con guion y sin puntos. |
rut_formateado | string | El mismo RUT listo para mostrar: con puntos y guion. |
es_empresa | boolean | true si el RUT es de una empresa y false si es de una persona. Sirve para decidir qué pedirle a quien se está registrando. |
saltos | integer | Hasta cuántos saltos se siguió: el que pediste, o 2. |
empresas | array | Las empresas del grupo, de la más cercana a la más lejana. Vacía si el RUT no participa en nada ni nadie participa en él. |
participaciones | array | Las participaciones ENTRE las empresas de la respuesta (el RUT incluido): el grafo que la lista describe. |
truncado | boolean | true si el grupo tiene más de 200 empresas y la respuesta trae solo las más cercanas. Con menos saltos se ve más de cerca. |
fuente | string | De dónde salen los datos de esta respuesta, en texto listo para citar («Composición de sociedades, SII»). Es constante para esta llamada: guárdalo una vez y no lo parsees. |
publicado | string | De cuándo es la composición de sociedades que respondió. ISO 8601 con hora y zona (2026-08-05T15:36:37+00:00), siempre en UTC. Es otro archivo que el padrón: otra fecha que padron_publicado. |
consultado_en | string | Cuándo se respondió esta llamada. ISO 8601 con hora y zona (2026-08-05T15:36:37+00:00), siempre en UTC. |
Dentro de empresas
| Campo | Tipo | Qué es |
|---|---|---|
rut | string | El RUT, normalizado. Pide su ficha con él. |
rut_formateado | string | El mismo RUT listo para mostrar. |
razon_social | string | Su nombre legal según el padrón. Cadena vacía si no está. |
distancia | integer | A cuántos saltos del RUT consultado: 1 es participación directa. |
Dentro de participaciones
| Campo | Tipo | Qué es |
|---|---|---|
socio | string | Quién participa. |
sociedad | string | En qué sociedad. |
participacion | number | El porcentaje, tal como el SII lo publica. null si no lo informa. |
Cuándo responde cada cosa
- 200 El RUT está en el padrón. Descuenta cinco consultas, con el grupo entero o truncado. Descuenta 5 consultas.
- 401 No mandaste el header, o no empieza con dtr_. No descuenta.
- 401 La key viajó bien pero ya no sirve: la revocaste o la rotaste. No descuenta.
- 422 El dígito verificador no corresponde al cuerpo. No se cobra: no hubo consulta. No descuenta.
- 422 No tiene forma de RUT: cuerpo fuera de 7-8 dígitos, o los ocho caracteres sin guion, que son ambiguos. No descuenta.
- 503 El padrón todavía no tiene datos que responder. Es excepcional: reintenta más tarde y, si sigue, mira el estado del servicio. No descuenta.
-
429
Fuiste más rápido que las consultas por minuto de tu plan.
Retry-Afterdice cuánto esperar. No descuenta. - 402 Se agotaron las consultas del plan y no hay saldo de recargas. Las consultas se detienen hasta que renueven. No descuenta.
- 402 Se agotaron las consultas del plan, hay saldo de recargas, y el interruptor «usar mi saldo automáticamente» está apagado. Nada se cobra. No descuenta.
- 422 Pediste más saltos de los que el grupo sigue. No se cobra: no hubo lectura. No descuenta.
- 503 El grafo tardó más que su techo propio: pasa con holdings de miles de filiales y 3 saltos. No se cobra, y con menos saltos casi siempre responde. No descuenta.
- 404 El RUT es válido pero el SII no lo tiene. SÍ descuenta lo que cuesta la operación pedida: «no está» también es información. Descuenta 5 consultas.
curl -s -i -H "Authorization: Bearer dtr_TU_KEY" \
https://api.datario.cl/v1/rut/61.704.000-K/grupos
import requests
r = requests.get(
"https://api.datario.cl/v1/rut/61.704.000-K/grupos",
headers={"Authorization": "Bearer dtr_TU_KEY"},
timeout=10,
)
cuerpo = r.json()
if r.status_code != 200:
raise SystemExit(f"{cuerpo['error']}: {cuerpo['detail']}")
print(cuerpo["empresas"][0]["razon_social"])
print(r.headers.get("X-Plan-Remaining"), "restantes")
const r = await fetch(
"https://api.datario.cl/v1/rut/61.704.000-K/grupos",
{ headers: { "Authorization": "Bearer dtr_TU_KEY" } },
);
const cuerpo = await r.json();
if (!r.ok) {
if (r.status === 429) {
const s = r.headers.get("Retry-After");
throw new Error(`Reintenta en ${s} s`);
}
throw new Error(`${cuerpo.error}: ${cuerpo.detail}`);
}
console.log(cuerpo.empresas[0].razon_social);
<?php
$ch = curl_init(
"https://api.datario.cl/v1/rut/61.704.000-K/grupos"
);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer dtr_TU_KEY"],
]);
$cuerpo = json_decode(curl_exec($ch), true);
$estado = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($estado !== 200) {
throw new Exception(
$cuerpo["error"] . ": " . $cuerpo["detail"]
);
}
echo $cuerpo["empresas"][0]["razon_social"];
using var http = new HttpClient();
http.DefaultRequestHeaders.Add(
"Authorization", "Bearer dtr_TU_KEY");
var r = await http.GetAsync(
"https://api.datario.cl/v1/rut/61.704.000-K/grupos");
var raiz = JsonDocument.Parse(
await r.Content.ReadAsStringAsync()).RootElement;
if (!r.IsSuccessStatusCode)
{
throw new Exception(
raiz.GetProperty("error").GetString() + ": " +
raiz.GetProperty("detail").GetString());
}
var item = raiz.GetProperty("empresas")[0];
Console.WriteLine(
item.GetProperty("razon_social").GetString());
var req = HttpRequest.newBuilder()
.uri(URI.create(
"https://api.datario.cl/v1/rut/61.704.000-K/grupos"))
.header("Authorization", "Bearer dtr_TU_KEY")
.build();
var r = HttpClient.newHttpClient()
.send(req, BodyHandlers.ofString());
if (r.statusCode() != 200) {
// El cuerpo trae siempre {error, detail}.
throw new IOException(r.body());
}
System.out.println(r.body());
req, _ := http.NewRequest("GET",
"https://api.datario.cl/v1/rut/61.704.000-K/grupos", nil)
req.Header.Set("Authorization", "Bearer dtr_TU_KEY")
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
if res.StatusCode != 200 {
var e struct {
Error string `json:"error"`
Detail string `json:"detail"`
}
json.NewDecoder(res.Body).Decode(&e)
log.Fatalf("%s: %s", e.Error, e.Detail)
}
var cuerpo map[string]any
json.NewDecoder(res.Body).Decode(&cuerpo)
fmt.Println(cuerpo["empresas"])
uri = URI("https://api.datario.cl/v1/rut/61.704.000-K/grupos")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer dtr_TU_KEY"
res = Net::HTTP.start(
uri.host, uri.port, use_ssl: uri.scheme == "https"
) { |h| h.request(req) }
cuerpo = JSON.parse(res.body)
unless res.code == "200"
raise "#{cuerpo['error']}: #{cuerpo['detail']}"
end
puts cuerpo["empresas"][0]["razon_social"]
Set Variable [ $url ; Value:
"https://api.datario.cl/v1/rut/61.704.000-K/grupos" ]
Insert from URL [ Select ; With dialog: Off ; Target: $r ;
$url ; cURL options:
"-H \"Authorization: Bearer dtr_TU_KEY\"" ]
Set Variable [ $e ; Value: JSONGetElement ( $r ; "error" ) ]
If [ not IsEmpty ( $e ) ]
Show Custom Dialog [ $e & ": " &
JSONGetElement ( $r ; "detail" ) ]
Exit Script [ Text Result: $e ]
End If
Show Custom Dialog [
JSONGetElement ( $r ; "empresas[0].razon_social" ) ]
Respuestas
{
"rut": "61704000-K",
"rut_formateado": "61.704.000-K",
"es_empresa": true,
"saltos": 2,
"empresas": [
{
"rut": "76063022-5",
"rut_formateado": "76.063.022-5",
"razon_social": "INCA DE ORO S.A.",
"distancia": 1
},
{
"rut": "76092641-8",
"rut_formateado": "76.092.641-8",
"razon_social": "PANAUST MINERA IDO LIMITADA",
"distancia": 2
}
],
"participaciones": [
{
"socio": "61704000-K",
"sociedad": "76063022-5",
"participacion": 30.6
},
{
"socio": "76092641-8",
"sociedad": "76063022-5",
"participacion": 69.4
}
],
"truncado": true,
"fuente": "Composición de sociedades, SII",
"publicado": "2025-11-25T16:11:42+00:00",
"consultado_en": "2026-08-29T04:12:07+00:00"
}
Headers: X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset X-Plan-Limit X-Plan-Remaining X-Plan-Reset X-Credits-Remaining
{
"error": "api_key_invalida",
"detail": "Falta la API key: envíala en el header Authorization: Bearer dtr_…."
}
{
"error": "api_key_invalida",
"detail": "La API key no existe o fue revocada."
}
{
"error": "rut_invalido",
"detail": "El RUT no es válido: revisa el dígito verificador."
}
{
"error": "rut_invalido",
"detail": "Eso no parece un RUT: son 7 u 8 dígitos más el verificador."
}
{
"error": "padron_no_disponible",
"detail": "El padrón aún no está cargado; intenta más tarde. Estado del servicio: https://status.datario.cl"
}
{
"error": "limite_de_velocidad",
"detail": "Superaste las consultas por minuto de tu plan: X-RateLimit-Limit dice cuántas y Retry-After cuánto esperar."
}
Headers: X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset Retry-After
{
"error": "sin_saldo",
"detail": "Se acabaron las consultas de tu plan y no te queda saldo. Renuevan el día que tu plan cumple el mes (X-Plan-Reset); para seguir ahora, recarga saldo (no vence) en https://datario.cl/panel/packs, o contrata el plan de ese mismo volumen en https://datario.cl/panel/planes, que sale más barato por consulta"
}
Headers: X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset
{
"error": "saldo_protegido",
"detail": "Las consultas del plan no alcanzan y tu saldo está protegido (pediste no gastarlo automáticamente): actívalo en https://datario.cl/panel/configuracion/avisos o renueva tu plan"
}
Headers: X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset
{
"error": "parametros_invalidos",
"detail": "saltos debe ser un entero entre 1 y 3."
}
{
"error": "lectura_expirada",
"detail": "La lectura tardó demasiado: reduce saltos o reintenta. Si sigue fallando, mira https://status.datario.cl"
}
Headers: X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset
{
"error": "rut_no_registrado",
"detail": "El SII no registra datos para 12345678-5."
}
Headers: X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset X-Plan-Limit X-Plan-Remaining X-Plan-Reset X-Credits-Remaining
Probar en la consola Este producto por SOAP Este producto por GraphQL Este producto por MCP Qué es Sociedades y grupos