Documentación de la API
Consulta los datos de un contribuyente por su RUT. Es una API HTTP que responde JSON: sirve desde cualquier lenguaje.
- Dirección base
https://rut.tdcom.cl- Formato
- JSON, UTF-8
- Tope por minuto
- 120 consultas
Primeros pasos
- Consigue tu llave. Crea tu cuenta y sácala en tu panel. Empieza con
dc_y se muestra una sola vez: guárdala en un lugar seguro. - Haz tu primera consulta. Reemplaza
dc_tu_llavepor tu llave y ejecuta:curl -s "https://rut.tdcom.cl/v1/contribuyentes/78348672-5" \ -H "Authorization: Bearer dc_tu_llave" - Lee la respuesta. Los datos principales están arriba (
razon_social,correo_dte,direccion); las listas para elegir, ensucursalesygiros; y los valores para Odoo, enodoo. Ver una respuesta completa.
Usa la llave solo desde tu servidor. En una página web o una app quedaría a la vista de cualquiera: haz la consulta desde tu backend y entrega el resultado a tu página.
Ejemplos por lenguaje
Cada ejemplo está completo: consulta el RUT 78348672-5, revisa si hubo error y muestra la razón social. Cópialo, pon tu llave y ejecútalo.
curl
curl -s "https://rut.tdcom.cl/v1/contribuyentes/78348672-5" \
-H "Authorization: Bearer dc_tu_llave"
Para ejecutarlo: En la terminal.
Python
# pip install requests
import sys
import requests
URL = "https://rut.tdcom.cl"
LLAVE = "dc_tu_llave"
respuesta = requests.get(
f"{URL}/v1/contribuyentes/78348672-5",
headers={"Authorization": f"Bearer {LLAVE}"},
timeout=15,
)
datos = respuesta.json()
if respuesta.status_code != 200:
# 401 llave inválida, 404 no está, 422 RUT inválido, 429 cuota agotada
sys.exit(f"Error {respuesta.status_code}: {datos['error']['mensaje']}")
print(datos["razon_social"])
print("Correo DTE:", datos["correo_dte"])
if datos["direccion"]:
print("Dirección:", datos["direccion"]["direccion"], "-", datos["direccion"]["comuna"])
print("Consultas restantes este mes:", respuesta.headers["X-Cuota-Restantes"])
Para ejecutarlo: python consulta.py
JavaScript (Node)
// Node 18 o superior (trae fetch). Guárdalo como consulta.mjs
const URL_API = "https://rut.tdcom.cl";
const LLAVE = "dc_tu_llave";
const respuesta = await fetch(`${URL_API}/v1/contribuyentes/78348672-5`, {
headers: { Authorization: `Bearer ${LLAVE}` },
});
const datos = await respuesta.json();
if (!respuesta.ok) {
// 401 llave inválida, 404 no está, 422 RUT inválido, 429 cuota agotada
console.error(`Error ${respuesta.status}: ${datos.error.mensaje}`);
process.exit(1);
}
console.log(datos.razon_social);
console.log("Correo DTE:", datos.correo_dte);
if (datos.direccion) {
console.log("Dirección:", datos.direccion.direccion, "-", datos.direccion.comuna);
}
console.log("Consultas restantes este mes:", respuesta.headers.get("X-Cuota-Restantes"));
Para ejecutarlo: node consulta.mjs
PHP
<?php
$url = "https://rut.tdcom.cl";
$llave = "dc_tu_llave";
$contexto = stream_context_create(["http" => [
"header" => "Authorization: Bearer $llave\r\n",
"ignore_errors" => true, // para leer también el cuerpo de los errores
"timeout" => 15,
]]);
$cuerpo = file_get_contents("$url/v1/contribuyentes/78348672-5", false, $contexto);
if ($cuerpo === false) {
fwrite(STDERR, "No se pudo conectar al servicio\n");
exit(1);
}
$datos = json_decode($cuerpo, true);
$estado = (int) explode(" ", $http_response_header[0])[1];
if ($estado !== 200) {
// 401 llave inválida, 404 no está, 422 RUT inválido, 429 cuota agotada
fwrite(STDERR, "Error $estado: " . $datos["error"]["mensaje"] . "\n");
exit(1);
}
echo $datos["razon_social"], "\n";
echo "Correo DTE: ", $datos["correo_dte"] ?? "sin correo", "\n";
if ($datos["direccion"]) {
echo "Dirección: ", $datos["direccion"]["direccion"], " - ", $datos["direccion"]["comuna"], "\n";
}
Para ejecutarlo: php consulta.php
Java
// Java 11 o superior. Para leer el JSON completo usa Jackson o Gson;
// aquí se saca un campo con una expresión regular para no pedir nada extra.
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Consulta {
static final String URL = "https://rut.tdcom.cl";
static final String LLAVE = "dc_tu_llave";
static String campo(String json, String nombre) {
Matcher m = Pattern.compile("\"" + nombre + "\":\\s*\"((?:[^\"\\\\]|\\\\.)*)\"").matcher(json);
return m.find() ? m.group(1) : null;
}
public static void main(String[] args) throws Exception {
HttpRequest peticion = HttpRequest.newBuilder()
.uri(URI.create(URL + "/v1/contribuyentes/78348672-5"))
.header("Authorization", "Bearer " + LLAVE)
.build();
HttpResponse<String> respuesta = HttpClient.newHttpClient()
.send(peticion, HttpResponse.BodyHandlers.ofString());
if (respuesta.statusCode() != 200) {
// 401 llave inválida, 404 no está, 422 RUT inválido, 429 cuota agotada
System.err.println("Error " + respuesta.statusCode() + ": " + campo(respuesta.body(), "mensaje"));
System.exit(1);
}
System.out.println(campo(respuesta.body(), "razon_social"));
System.out.println("Correo DTE: " + campo(respuesta.body(), "correo_dte"));
}
}
Para ejecutarlo: java Consulta.java
C#
// .NET 6 o superior
using System.Net.Http.Headers;
using System.Text.Json;
const string Url = "https://rut.tdcom.cl";
const string Llave = "dc_tu_llave";
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Llave);
var respuesta = await http.GetAsync($"{Url}/v1/contribuyentes/78348672-5");
using var datos = JsonDocument.Parse(await respuesta.Content.ReadAsStringAsync());
var raiz = datos.RootElement;
if (!respuesta.IsSuccessStatusCode)
{
// 401 llave inválida, 404 no está, 422 RUT inválido, 429 cuota agotada
Console.Error.WriteLine($"Error {(int)respuesta.StatusCode}: {raiz.GetProperty("error").GetProperty("mensaje")}");
return 1;
}
Console.WriteLine(raiz.GetProperty("razon_social"));
Console.WriteLine($"Correo DTE: {raiz.GetProperty("correo_dte")}");
return 0;
Para ejecutarlo: dotnet run (como Program.cs de un proyecto de consola)
Go
package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
const (
url = "https://rut.tdcom.cl"
llave = "dc_tu_llave"
)
type respuesta struct {
RazonSocial string `json:"razon_social"`
CorreoDte *string `json:"correo_dte"`
Error *struct {
Mensaje string `json:"mensaje"`
} `json:"error"`
}
func main() {
peticion, _ := http.NewRequest("GET", url+"/v1/contribuyentes/78348672-5", nil)
peticion.Header.Set("Authorization", "Bearer "+llave)
r, err := http.DefaultClient.Do(peticion)
if err != nil {
fmt.Fprintln(os.Stderr, "No se pudo conectar:", err)
os.Exit(1)
}
defer r.Body.Close()
var datos respuesta
if err := json.NewDecoder(r.Body).Decode(&datos); err != nil {
fmt.Fprintln(os.Stderr, "Respuesta inesperada:", err)
os.Exit(1)
}
if r.StatusCode != 200 {
// 401 llave inválida, 404 no está, 422 RUT inválido, 429 cuota agotada
fmt.Fprintf(os.Stderr, "Error %d: %s\n", r.StatusCode, datos.Error.Mensaje)
os.Exit(1)
}
fmt.Println(datos.RazonSocial)
if datos.CorreoDte != nil {
fmt.Println("Correo DTE:", *datos.CorreoDte)
}
}
Para ejecutarlo: go run consulta.go
Ruby
require "json"
require "net/http"
require "uri"
URL = "https://rut.tdcom.cl"
LLAVE = "dc_tu_llave"
uri = URI("#{URL}/v1/contribuyentes/78348672-5")
peticion = Net::HTTP::Get.new(uri)
peticion["Authorization"] = "Bearer #{LLAVE}"
respuesta = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
http.request(peticion)
end
datos = JSON.parse(respuesta.body)
unless respuesta.code == "200"
# 401 llave inválida, 404 no está, 422 RUT inválido, 429 cuota agotada
abort "Error #{respuesta.code}: #{datos['error']['mensaje']}"
end
puts datos["razon_social"]
puts "Correo DTE: #{datos['correo_dte']}"
puts "Dirección: #{datos['direccion']['direccion']} - #{datos['direccion']['comuna']}" if datos["direccion"]
Para ejecutarlo: ruby consulta.rb
Autenticación
Cada petición lleva tu llave en una cabecera. Sirve cualquiera de las dos formas:
Authorization: Bearer dc_tu_llave
X-API-Key: dc_tu_llaveSi la llave se filtra, pide que la revoquemos y te damos otra: puedes tener varias a la vez, por ejemplo una por sistema.
Rutas
| Ruta | Para qué |
|---|---|
GET /salud | Estado del servicio |
GET /v1/contribuyentes/{rut} | Datos de un contribuyente |
GET /v1/contribuyentes/{rut}/sucursales | Buscar entre las sucursales vigentes de un RUT |
POST /v1/contribuyentes/lote | Consultar varios RUT de una vez |
GET /v1/cuenta | Plan y consumo del mes |
GET /salud
Estado del servicio
Responde: Salud.
GET /v1/contribuyentes/{rut}
Datos de un contribuyente
Razón social, tipo de persona, direcciones, giros y correo DTE de un RUT, más el bloque `odoo` listo para `res.partner`. Cuenta una consulta, esté o no el RUT en la base; un RUT inválido no se cobra.
El correo y la resolución DTE se verifican en línea con el SII la primera vez que se pide el RUT y después cada cierto tiempo (`dte.fuente` es `en_linea`). Si el SII no responde, se entrega lo del listado masivo.
| Parámetro | Va en | Tipo | Descripción |
|---|---|---|---|
rut | ruta | texto | RUT con dígito verificador, con o sin puntos y guion. |
sucursales | consulta | entero | Cuántas sucursales vigentes incluir. Por defecto: 50. |
Responde: Contribuyente.
Errores: 401, 404, 422, 429.
GET /v1/contribuyentes/{rut}/sucursales
Buscar entre las sucursales vigentes de un RUT
Para empresas con muchas sucursales (hay RUT con cientos). Cuenta una consulta.
| Parámetro | Va en | Tipo | Descripción |
|---|---|---|---|
rut | ruta | texto | RUT con dígito verificador, con o sin puntos y guion. |
q | consulta | texto o null | Texto en calle, número, comuna o ciudad. |
limite | consulta | entero | Por defecto: 50. |
desde | consulta | entero | Por defecto: 0. |
Responde: Sucursales.
Errores: 401, 422, 429.
POST /v1/contribuyentes/lote
Consultar varios RUT de una vez
Hasta 100 RUT por llamada, para actualizar contactos existentes. Se cobra una consulta por cada RUT válido y distinto; si no caben en la cuota, no se procesa ninguno. El lote no consulta al SII en línea: entrega lo guardado (incluido lo ya verificado en consultas individuales).
Cuerpo (JSON): PeticionLote.
Responde: RespuestaLote.
Errores: 401, 422, 429.
GET /v1/cuenta
Plan y consumo del mes
No cuenta como consulta.
Responde: EstadoCuenta.
Errores: 401.
La respuesta
Esto responde GET /v1/contribuyentes/78348672-5. Para que se lea, aquí va con una sola sucursal y dos giros; la respuesta real los trae todos.
{
"rut": "78348672-5",
"rut_numero": 78348672,
"dv": "5",
"razon_social": "TECNOLOGÍA E INNOVACIÓN TDCOM SPA",
"tipo_persona": "juridica",
"subtipo": {
"codigo": 223,
"nombre": "SOCIEDAD POR ACCIONES",
"tipo": "PERSONA JURIDICA COMERCIAL"
},
"fecha_inicio": "2026-02-03",
"fecha_termino_giro": null,
"vigente": true,
"correo_dte": "dte@tdcom.cl",
"resolucion_dte": {
"numero": "80",
"fecha": "2014-08-22"
},
"dte": {
"fuente": "listado",
"autorizado": true,
"verificado_en": null,
"documentos": []
},
"direccion": {
"id": 3879628,
"tipo": "DOMICILIO",
"vigente": true,
"direccion": "APOQUINDO 6410 OF 1004 PS 10",
"calle": "APOQUINDO 6410 OF 1004 PS 10",
"numero": null,
"bloque": null,
"departamento": null,
"villa_poblacion": null,
"ciudad": null,
"comuna": "LAS CONDES",
"region": "XIII REGION METROPOLITANA",
"region_iso": "CL-RM",
"region_numero": 13,
"fecha": "2026-02-04"
},
"sucursales": [
{
"id": 3879628,
"tipo": "DOMICILIO",
"vigente": true,
"direccion": "APOQUINDO 6410 OF 1004 PS 10",
"calle": "APOQUINDO 6410 OF 1004 PS 10",
"numero": null,
"bloque": null,
"departamento": null,
"villa_poblacion": null,
"ciudad": null,
"comuna": "LAS CONDES",
"region": "XIII REGION METROPOLITANA",
"region_iso": "CL-RM",
"region_numero": 13,
"fecha": "2026-02-04"
}
],
"sucursales_total": 1,
"giros": [
{
"codigo": "620200",
"descripcion": "ACTIVIDADES DE CONSULTORIA DE INFORMATICA Y DE GESTION DE INSTALACIONES INFORMATICAS",
"afecta_iva": true,
"categoria_tributaria": 1,
"fecha": "2026-02-03"
}
],
"actualizado_en": "2026-11-10T01:41:49.692005-03:00",
"odoo": {
"name": "TECNOLOGÍA E INNOVACIÓN TDCOM SPA",
"vat": "78348672-5",
"company_type": "company",
"street": "APOQUINDO 6410 OF 1004 PS 10",
"street2": null,
"city": "LAS CONDES",
"state_iso": "CL-RM",
"state_numero": 13,
"country_code": "CL",
"l10n_cl_activity_description": "ACTIVIDADES DE CONSULTORIA DE INFORMATICA Y DE GESTION DE INSTALACIONES INFORMATICAS",
"l10n_cl_dte_email": "dte@tdcom.cl",
"l10n_cl_sii_taxpayer_type": "1"
}
}direcciones el domicilio vigente.sucursalesson las direcciones vigentes para que el usuario elija, con el domicilio primero; cada una tiene unidestable.sucursales_totaldice cuántas hay. Si son más de las que pediste, usa la ruta de sucursales para buscar.dte.fuentedice de dónde salencorreo_dteyresolucion_dte:en_linea(verificado en el SII, con los documentos autorizados) olistado(el listado masivo del SII, que puede venir atrasado).odoorepite lo necesario con los nombres de campo de un contacto de Odoo.- Lo que el SII no publica viene en
nullo en una lista vacía, nunca falta el campo.
Campos
Contribuyente
| Campo | Tipo | Descripción |
|---|---|---|
rut | texto | |
rut_numero | entero | |
dv | texto | |
razon_social | texto o null | |
tipo_persona | texto | juridica o natural. |
subtipo | Subtipo o null | |
fecha_inicio | fecha (AAAA-MM-DD) o null | |
fecha_termino_giro | fecha (AAAA-MM-DD) o null | |
vigente | sí/no | false si tiene término de giro. |
correo_dte | texto o null | Correo de intercambio de documentos electrónicos. |
resolucion_dte | ResolucionDte o null | |
dte | Dte | |
direccion | Direccion o null | Domicilio vigente; si no hay direcciones vigentes, la más reciente. |
sucursales | lista de Direccion | Direcciones vigentes para elegir, con el domicilio primero. |
sucursales_total | entero | Total de direcciones vigentes; si supera las entregadas, usa /sucursales. |
giros | lista de Giro | Todos los giros, el más reciente primero. |
actualizado_en | fecha y hora (ISO 8601) | |
odoo | DatosOdoo |
Dte
| Campo | Tipo | Descripción |
|---|---|---|
fuente | texto o null | De dónde salen correo_dte y resolucion_dte: en_linea (verificado en el SII), listado (listado masivo, puede venir atrasado) o null si no hay datos. |
autorizado | sí/no | Si es emisor autorizado de documentos electrónicos. |
verificado_en | fecha y hora (ISO 8601) o null | Cuándo se verificó en línea con el SII. |
documentos | lista de DocumentoDte | Documentos autorizados (solo con fuente en_linea). |
DocumentoDte
| Campo | Tipo | Descripción |
|---|---|---|
codigo | entero | Código del documento, p. ej. 33 (factura electrónica). |
descripcion | texto o null | |
autorizado | fecha (AAAA-MM-DD) o null | |
desautorizado | fecha (AAAA-MM-DD) o null |
Direccion
| Campo | Tipo | Descripción |
|---|---|---|
id | entero | Identificador estable de la dirección: lo que el usuario elige. |
tipo | texto | DOMICILIO o SUCURSAL. |
vigente | sí/no | |
direccion | texto | Calle, número, bloque y departamento en una línea. |
calle | texto o null | |
numero | texto o null | |
bloque | texto o null | |
departamento | texto o null | |
villa_poblacion | texto o null | |
ciudad | texto o null | |
comuna | texto o null | |
region | texto o null | Texto del SII, p. ej. XIII REGION METROPOLITANA. |
region_iso | texto o null | Código ISO 3166-2:CL, p. ej. CL-RM. |
region_numero | entero o null | Número de la región (1 a 16). |
fecha | fecha (AAAA-MM-DD) o null |
Giro
| Campo | Tipo | Descripción |
|---|---|---|
codigo | texto | |
descripcion | texto o null | |
afecta_iva | sí/no o null | |
categoria_tributaria | entero o null | |
fecha | fecha (AAAA-MM-DD) o null |
Subtipo
| Campo | Tipo | Descripción |
|---|---|---|
codigo | entero | |
nombre | texto o null | |
tipo | texto o null |
ResolucionDte
| Campo | Tipo | Descripción |
|---|---|---|
numero | texto o null | |
fecha | fecha (AAAA-MM-DD) o null |
DatosOdoo
Valores listos para res.partner con la localización chilena (l10n_cl).
| Campo | Tipo | Descripción |
|---|---|---|
name | texto o null | |
vat | texto | |
company_type | texto | company o person. |
street | texto o null | |
street2 | texto o null | |
city | texto o null | Comuna. |
state_iso | texto o null | Para buscar res.country.state: ISO 3166-2:CL. |
state_numero | entero o null | |
country_code | texto | |
l10n_cl_activity_description | texto o null | Giro más reciente. |
l10n_cl_dte_email | texto o null | |
l10n_cl_sii_taxpayer_type | texto o null | Sugerido: "1" afecto a IVA, "2" boletas de honorarios; null si no hay giros. |
Sucursales
| Campo | Tipo | Descripción |
|---|---|---|
total | entero | |
desde | entero | |
sucursales | lista de Direccion |
PeticionLote
| Campo | Tipo | Descripción |
|---|---|---|
ruts | lista de texto |
RespuestaLote
| Campo | Tipo | Descripción |
|---|---|---|
resultados | lista de ResultadoLote | |
consultas_cobradas | entero |
ResultadoLote
| Campo | Tipo | Descripción |
|---|---|---|
rut | texto | El RUT tal como se pidió. |
estado | texto | encontrado, no_encontrado o rut_invalido. |
contribuyente | Contribuyente o null |
EstadoCuenta
| Campo | Tipo | Descripción |
|---|---|---|
cliente | texto | |
plan | texto | |
periodo | texto | Mes en que partió el ciclo en curso. |
periodo_desde | fecha (AAAA-MM-DD) | Primer día del ciclo de 30 días en curso. |
se_renueva | fecha (AAAA-MM-DD) | Día en que la cuota vuelve a cero. |
consultas_mes | entero | |
usadas | entero | |
restantes | entero |
Errores y cuotas
Todos los errores tienen la misma forma. Usa codigo en tu programa y muestra mensaje a la persona:
{"error": {"codigo": "rut_invalido", "mensaje": "El RUT no es válido (revisa el dígito verificador)."}}| Estado | Código | Qué pasó | ¿Se cobra? |
|---|---|---|---|
| 401 | no_autorizado | Falta la llave o no es válida (revocada, o cliente suspendido). | No |
| 403 | ip_no_autorizada | La llave de prueba ya se usó desde otra conexión. Libérala en tu cuenta o contrata un plan. | No |
| 404 | no_encontrado | El RUT es válido pero no está en la base. | Sí |
| 422 | rut_invalido | El RUT no es válido: revisa el dígito verificador. | No |
| 422 | peticion_invalida | Falta un dato o viene con otro formato (p. ej. un lote vacío). | No |
| 429 | demasiadas_consultas | Pasaste el tope de consultas por minuto. Espera y reintenta. | No |
| 429 | cuota_agotada | Se acabaron las consultas del mes de tu plan. | No |
| 413 | peticion_demasiado_grande | El cuerpo de la petición supera 1 MB. | No |
Cada respuesta de consulta trae tres cabeceras con tu cuota del mes:
X-Cuota-Limite: 10000
X-Cuota-Usadas: 1234
X-Cuota-Restantes: 8766- Se cobra una consulta por cada RUT válido consultado, esté o no en la base.
- En un lote se cobra una por cada RUT válido y distinto. Si no caben en tu cuota, no se procesa ninguno.
- Ver tu cuenta (
GET /v1/cuenta) no se cobra. - La cuota se renueva cada 30 días, contados desde que partió tu plan.
GET /v1/cuentadice el día (se_renueva). - La llave del plan de prueba queda atada a la primera conexión (IP) que la usa. Desde otra responde
403; puedes liberarla en tu cuenta una vez al día.
Odoo
El bloque odoo de la respuesta trae los valores con los nombres de campo del contacto. Este método, dentro de un módulo propio, completa la ficha a partir del RUT:
# Dentro de un módulo propio de Odoo (18 a 20). Agrega un botón en la ficha del
# contacto que llame a action_completar_desde_sii. Guarda la URL y la llave en
# Ajustes > Técnico > Parámetros del sistema, no en el código.
import requests
from odoo import _, models
from odoo.exceptions import UserError
class ResPartner(models.Model):
_inherit = "res.partner"
def action_completar_desde_sii(self):
self.ensure_one()
parametros = self.env["ir.config_parameter"].sudo()
url = parametros.get_param("contribuyentes.url") # https://rut.tdcom.cl
llave = parametros.get_param("contribuyentes.llave") # dc_tu_llave
if not self.vat:
raise UserError(_("Escribe primero el RUT del contacto."))
respuesta = requests.get(
f"{url}/v1/contribuyentes/{self.vat}",
headers={"Authorization": f"Bearer {llave}"},
timeout=15,
)
datos = respuesta.json()
if respuesta.status_code != 200:
raise UserError(datos["error"]["mensaje"])
odoo = datos["odoo"]
region = self.env["res.country.state"].search(
[("country_id.code", "=", "CL"), ("code", "=", odoo["state_iso"])], limit=1)
# (revisa en tu versión de Odoo cómo vienen los códigos de región)
self.write({
"name": odoo["name"],
"company_type": odoo["company_type"],
"street": odoo["street"],
"street2": odoo["street2"],
"city": odoo["city"],
"state_id": region.id,
"country_id": self.env.ref("base.cl").id,
"l10n_cl_activity_description": odoo["l10n_cl_activity_description"],
"l10n_cl_dte_email": odoo["l10n_cl_dte_email"],
})
# datos["sucursales"] y datos["giros"] traen las listas completas, por si
# quieres que el usuario elija otra dirección u otro giro.
Los nombres l10n_cl_* son los de la localización chilena. Confírmalos en tu versión de Odoo antes de usarlo en producción.
Asistentes de IA (MCP)
El servicio también se puede usar desde un asistente de IA con MCP (Model Context Protocol). Lo conectas una vez y después le pides en la conversación «busca los datos del RUT 78348672-5».
- Dirección del servidor
https://rut.tdcom.cl/mcp- Transporte
- HTTP (Streamable HTTP)
- Acceso
- Tu llave, en
Authorization: Bearer
Usa la misma llave de la API y la misma cuota: cada RUT que consulta el asistente cuenta como una consulta. Las herramientas son solo de lectura.
| Herramienta | Qué hace | ¿Se cobra? |
|---|---|---|
consultar_contribuyente | Los datos de un RUT, con sus primeras sucursales y todos sus giros. | 1 |
buscar_sucursales | Busca entre las direcciones vigentes de un RUT por calle, comuna o ciudad. | 1 |
consultar_varios | Resumen de hasta 25 RUT en una llamada. | 1 por RUT válido y distinto |
estado_de_cuenta | Tu plan y cuántas consultas te quedan este mes. | No |
Claude Code
En la terminal, una sola vez:
claude mcp add --transport http contribuyentes https://rut.tdcom.cl/mcp \
--header "Authorization: Bearer dc_tu_llave"Cursor
En el archivo .cursor/mcp.json de tu proyecto (o en el global):
{
"mcpServers": {
"contribuyentes": {
"url": "https://rut.tdcom.cl/mcp",
"headers": { "Authorization": "Bearer dc_tu_llave" }
}
}
}VS Code
En el archivo .vscode/mcp.json:
{
"servers": {
"contribuyentes": {
"type": "http",
"url": "https://rut.tdcom.cl/mcp",
"headers": { "Authorization": "Bearer dc_tu_llave" }
}
}
}Claude Desktop y otros que solo aceptan servidores locales
Usa el puente mcp-remote (necesita Node). En el archivo de configuración del asistente:
{
"mcpServers": {
"contribuyentes": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://rut.tdcom.cl/mcp",
"--header", "Authorization: Bearer dc_tu_llave"]
}
}
}La llave queda guardada en la configuración de tu asistente. Si compartes ese archivo o el equipo, pide una llave aparte para el asistente: así puedes revocarla sin afectar a tu sistema.