Referencia completa de la API de ApiPyme v1.
Todas las llamadas a la API requieren el token de empresa (UUID). Puedes enviarlo de dos formas:
X-Company-Token: tu-token-uuid?token=tu-token-uuidEl token lo encuentras en el portal, en el detalle de cada empresa. Si el token se ve comprometido, puedes regenerarlo desde tu cuenta.
/api/v1/ventas/{period}/
Obtiene el registro de ventas de un período. Si los datos no existen aún, inicia una extracción automática y responde con 202.
| Nombre | Ubicación | Tipo | Descripción |
|---|---|---|---|
period | path | string | Período en formato YYYYMM (ej. 202602) |
format | query | string | Formato de respuesta: json (default) o csv |
# Reemplaza TU_TOKEN por el token de tu empresa
curl -H "X-Company-Token: TU_TOKEN" \
"https://apipyme.cl/api/v1/ventas/202602/"
import requests
url = "https://apipyme.cl/api/v1/ventas/202602/"
headers = {"X-Company-Token": "TU_TOKEN"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()["data"]
print(f"Se obtuvieron {len(data)} registros")
elif response.status_code == 202:
task_id = response.json()["task_id"]
print(f"Extracción iniciada: {task_id}")
// Node.js / fetch
const response = await fetch(
"https://apipyme.cl/api/v1/ventas/202602/",
{ headers: { "X-Company-Token": "TU_TOKEN" } }
);
if (response.status === 200) {
const { data } = await response.json();
console.log(`Se obtuvieron ${data.length} registros`);
} else if (response.status === 202) {
const { task_id } = await response.json();
console.log(`Extracción iniciada: ${task_id}`);
}
// PHP con cURL
$ch = curl_init("https://apipyme.cl/api/v1/ventas/202602/");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-Company-Token: TU_TOKEN"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 200) {
echo "Registros: " . count($data["data"]);
} elseif ($httpCode === 202) {
echo "Extracción iniciada: " . $data["task_id"];
}
# pip install apipyme-sdk
from apipyme import ApiPyme
api = ApiPyme(
token="TU_TOKEN",
base_url="https://apipyme.cl/api/v1"
)
# Obtiene los datos; si no existen, espera la extracción
data = api.ventas("202602")
print(f"Se obtuvieron {len(data)} registros")
{
"period": "202602",
"rut": "76.543.210-K",
"data": [
{
"id": 1,
"period": "202602",
"doc_type": "33",
"doc_number": "4521",
"issue_date": "2026-02-05",
"rut_receiver": "77.888.999-0",
"receiver_name": "Comercial Acme SpA",
"net_amount": 1500000,
"tax_amount": 285000,
"total_amount": 1785000,
"exempt_amount": 0,
"extracted_at": "2026-03-08T10:32:00Z"
}
]
}
{
"message": "Extracción iniciada.",
"task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"log_id": 42
}
/api/v1/compras/{period}/
Obtiene el registro de compras de un período. Comportamiento idéntico al de ventas: si no hay datos, inicia extracción (202).
| Nombre | Ubicación | Tipo | Descripción |
|---|---|---|---|
period | path | string | Período en formato YYYYMM |
format | query | string | json o csv |
# Reemplaza TU_TOKEN por el token de tu empresa
curl -H "X-Company-Token: TU_TOKEN" \
"https://apipyme.cl/api/v1/compras/202602/"
import requests
url = "https://apipyme.cl/api/v1/compras/202602/"
headers = {"X-Company-Token": "TU_TOKEN"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()["data"]
print(f"Se obtuvieron {len(data)} registros")
elif response.status_code == 202:
task_id = response.json()["task_id"]
print(f"Extracción iniciada: {task_id}")
// Node.js / fetch
const response = await fetch(
"https://apipyme.cl/api/v1/compras/202602/",
{ headers: { "X-Company-Token": "TU_TOKEN" } }
);
if (response.status === 200) {
const { data } = await response.json();
console.log(`Se obtuvieron ${data.length} registros`);
} else if (response.status === 202) {
const { task_id } = await response.json();
console.log(`Extracción iniciada: ${task_id}`);
}
// PHP con cURL
$ch = curl_init("https://apipyme.cl/api/v1/compras/202602/");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-Company-Token: TU_TOKEN"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 200) {
echo "Registros: " . count($data["data"]);
} elseif ($httpCode === 202) {
echo "Extracción iniciada: " . $data["task_id"];
}
# pip install apipyme-sdk
from apipyme import ApiPyme
api = ApiPyme(
token="TU_TOKEN",
base_url="https://apipyme.cl/api/v1"
)
# Obtiene los datos; si no existen, espera la extracción
data = api.compras("202602")
print(f"Se obtuvieron {len(data)} registros")
{
"period": "202602",
"rut": "76.543.210-K",
"data": [
{
"id": 1,
"period": "202602",
"doc_type": "33",
"doc_number": "8901",
"issue_date": "2026-02-10",
"rut_issuer": "78.111.222-3",
"issuer_name": "Distribuidora Norte Ltda.",
"net_amount": 850000,
"tax_amount": 161500,
"total_amount": 1011500,
"exempt_amount": 0,
"extracted_at": "2026-03-08T10:35:00Z"
}
]
}
/api/v1/f29/{period}/
Obtiene los datos del Formulario 29 (IVA) de un período.
| Nombre | Ubicación | Tipo | Descripción |
|---|---|---|---|
period | path | string | Período en formato YYYYMM |
format | query | string | json o csv |
# Reemplaza TU_TOKEN por el token de tu empresa
curl -H "X-Company-Token: TU_TOKEN" \
"https://apipyme.cl/api/v1/f29/202602/"
import requests
url = "https://apipyme.cl/api/v1/f29/202602/"
headers = {"X-Company-Token": "TU_TOKEN"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()["data"]
print(f"Se obtuvieron {len(data)} registros")
elif response.status_code == 202:
task_id = response.json()["task_id"]
print(f"Extracción iniciada: {task_id}")
// Node.js / fetch
const response = await fetch(
"https://apipyme.cl/api/v1/f29/202602/",
{ headers: { "X-Company-Token": "TU_TOKEN" } }
);
if (response.status === 200) {
const { data } = await response.json();
console.log(`Se obtuvieron ${data.length} registros`);
} else if (response.status === 202) {
const { task_id } = await response.json();
console.log(`Extracción iniciada: ${task_id}`);
}
// PHP con cURL
$ch = curl_init("https://apipyme.cl/api/v1/f29/202602/");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-Company-Token: TU_TOKEN"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 200) {
echo "Registros: " . count($data["data"]);
} elseif ($httpCode === 202) {
echo "Extracción iniciada: " . $data["task_id"];
}
# pip install apipyme-sdk
from apipyme import ApiPyme
api = ApiPyme(
token="TU_TOKEN",
base_url="https://apipyme.cl/api/v1"
)
# Obtiene los datos; si no existen, espera la extracción
data = api.f29("202602")
print(f"Se obtuvieron {len(data)} registros")
{
"period": "202602",
"rut": "76.543.210-K",
"data": [
{
"id": 1,
"period": "202602",
"folio": "123456789",
"total_ventas_afectas": 12450000,
"total_compras_afectas": 8230000,
"iva_debito": 2365500,
"iva_credito": 1563700,
"iva_neto": 801800,
"extracted_at": "2026-03-08T10:40:00Z"
}
]
}
/api/v1/honorarios/{year}/
Obtiene las boletas de honorarios recibidas durante un año completo.
| Nombre | Ubicación | Tipo | Descripción |
|---|---|---|---|
year | path | string | Año en formato YYYY (ej. 2026) |
format | query | string | json o csv |
# Reemplaza TU_TOKEN por el token de tu empresa
curl -H "X-Company-Token: TU_TOKEN" \
"https://apipyme.cl/api/v1/honorarios/2026/"
import requests
url = "https://apipyme.cl/api/v1/honorarios/2026/"
headers = {"X-Company-Token": "TU_TOKEN"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()["data"]
print(f"Se obtuvieron {len(data)} registros")
elif response.status_code == 202:
task_id = response.json()["task_id"]
print(f"Extracción iniciada: {task_id}")
// Node.js / fetch
const response = await fetch(
"https://apipyme.cl/api/v1/honorarios/2026/",
{ headers: { "X-Company-Token": "TU_TOKEN" } }
);
if (response.status === 200) {
const { data } = await response.json();
console.log(`Se obtuvieron ${data.length} registros`);
} else if (response.status === 202) {
const { task_id } = await response.json();
console.log(`Extracción iniciada: ${task_id}`);
}
// PHP con cURL
$ch = curl_init("https://apipyme.cl/api/v1/honorarios/2026/");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-Company-Token: TU_TOKEN"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 200) {
echo "Registros: " . count($data["data"]);
} elseif ($httpCode === 202) {
echo "Extracción iniciada: " . $data["task_id"];
}
# pip install apipyme-sdk
from apipyme import ApiPyme
api = ApiPyme(
token="TU_TOKEN",
base_url="https://apipyme.cl/api/v1"
)
# Obtiene los datos; si no existen, espera la extracción
data = api.honorarios("2026")
print(f"Se obtuvieron {len(data)} registros")
{
"year": "2026",
"rut": "76.543.210-K",
"data": [
{
"id": 1,
"year": "2026",
"folio": "00012345",
"issue_date": "2026-01-15",
"rut_issuer": "12.345.678-9",
"issuer_name": "Juan Pérez González",
"gross_amount": 1000000,
"retention": 125000,
"net_amount": 875000,
"extracted_at": "2026-03-08T10:45:00Z"
}
]
}
/api/v1/resumen/{period}/
Extra: Resumen Mensual
Retorna un resumen consolidado de ventas y compras del período, con el cálculo de IVA neto. Las notas de crédito (tipo 60, 61) se restan del total y las notas de débito (tipo 56) se suman. Requiere que los datos de ventas y/o compras ya estén extraídos.
| Nombre | Ubicación | Tipo | Descripción |
|---|---|---|---|
period | path | string | Período en formato YYYYMM (ej. 202602) |
# Reemplaza TU_TOKEN por el token de tu empresa
curl -H "X-Company-Token: TU_TOKEN" \
"https://apipyme.cl/api/v1/resumen/202602/"
import requests
url = "https://apipyme.cl/api/v1/resumen/202602/"
headers = {"X-Company-Token": "TU_TOKEN"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()["data"]
print(f"Se obtuvieron {len(data)} registros")
elif response.status_code == 202:
task_id = response.json()["task_id"]
print(f"Extracción iniciada: {task_id}")
// Node.js / fetch
const response = await fetch(
"https://apipyme.cl/api/v1/resumen/202602/",
{ headers: { "X-Company-Token": "TU_TOKEN" } }
);
if (response.status === 200) {
const { data } = await response.json();
console.log(`Se obtuvieron ${data.length} registros`);
} else if (response.status === 202) {
const { task_id } = await response.json();
console.log(`Extracción iniciada: ${task_id}`);
}
// PHP con cURL
$ch = curl_init("https://apipyme.cl/api/v1/resumen/202602/");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-Company-Token: TU_TOKEN"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 200) {
echo "Registros: " . count($data["data"]);
} elseif ($httpCode === 202) {
echo "Extracción iniciada: " . $data["task_id"];
}
# pip install apipyme-sdk
from apipyme import ApiPyme
api = ApiPyme(
token="TU_TOKEN",
base_url="https://apipyme.cl/api/v1"
)
# Obtiene los datos; si no existen, espera la extracción
data = api.resumen("202602")
print(f"Se obtuvieron {len(data)} registros")
{
"period": "202602",
"rut": "76.543.210-K",
"ventas": {
"documentos": 45,
"neto": 12450000,
"iva": 2365500,
"total": 14815500,
"exento": 0,
"notas_credito": {
"cantidad": 3,
"neto": 850000,
"iva": 161500,
"total": 1011500
},
"desglose_tipo_documento": [
{"doc_type": "33", "cantidad": 38, "neto": 12800000, "iva": 2432000, "total": 15232000, "exento": 0},
{"doc_type": "56", "cantidad": 4, "neto": 500000, "iva": 95000, "total": 595000, "exento": 0},
{"doc_type": "61", "cantidad": 3, "neto": 850000, "iva": 161500, "total": 1011500, "exento": 0}
]
},
"compras": {
"documentos": 22,
"neto": 8230000,
"iva": 1563700,
"total": 9793700,
"exento": 120000,
"notas_credito": {
"cantidad": 1,
"neto": 200000,
"iva": 38000,
"total": 238000
},
"desglose_tipo_documento": [
{"doc_type": "33", "cantidad": 20, "neto": 8380000, "iva": 1592200, "total": 9972200, "exento": 120000},
{"doc_type": "34", "cantidad": 1, "neto": 50000, "iva": 9500, "total": 59500, "exento": 0},
{"doc_type": "61", "cantidad": 1, "neto": 200000, "iva": 38000, "total": 238000, "exento": 0}
]
},
"balance": {
"iva_debito": 2365500,
"iva_credito": 1563700,
"iva_neto": 801800,
"iva_a_pagar": 801800,
"remanente_credito": 0
}
}
{
"error": "No hay datos de ventas ni compras para el período 202602. Primero extrae los datos."
}
/api/v1/comparativa/?desde=YYYYMM&hasta=YYYYMM
Extra: Comparativa de Períodos
Compara los resúmenes de ventas y compras entre dos o más períodos consecutivos. Muestra la variación porcentual de cada campo entre un mes y el anterior. Máximo 12 períodos por consulta.
| Nombre | Ubicación | Tipo | Descripción |
|---|---|---|---|
desde | query | string | Período inicial YYYYMM (ej. 202601) |
hasta | query | string | Período final YYYYMM (ej. 202603) |
# Reemplaza TU_TOKEN por el token de tu empresa
curl -H "X-Company-Token: TU_TOKEN" \
"https://apipyme.cl/api/v1/comparativa/?desde=202601&hasta=202603"
import requests
url = "https://apipyme.cl/api/v1/comparativa/?desde=202601&hasta=202603"
headers = {"X-Company-Token": "TU_TOKEN"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()["data"]
print(f"Se obtuvieron {len(data)} registros")
elif response.status_code == 202:
task_id = response.json()["task_id"]
print(f"Extracción iniciada: {task_id}")
// Node.js / fetch
const response = await fetch(
"https://apipyme.cl/api/v1/comparativa/?desde=202601&hasta=202603",
{ headers: { "X-Company-Token": "TU_TOKEN" } }
);
if (response.status === 200) {
const { data } = await response.json();
console.log(`Se obtuvieron ${data.length} registros`);
} else if (response.status === 202) {
const { task_id } = await response.json();
console.log(`Extracción iniciada: ${task_id}`);
}
// PHP con cURL
$ch = curl_init("https://apipyme.cl/api/v1/comparativa/?desde=202601&hasta=202603");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-Company-Token: TU_TOKEN"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 200) {
echo "Registros: " . count($data["data"]);
} elseif ($httpCode === 202) {
echo "Extracción iniciada: " . $data["task_id"];
}
# pip install apipyme-sdk
from apipyme import ApiPyme
api = ApiPyme(
token="TU_TOKEN",
base_url="https://apipyme.cl/api/v1"
)
# Obtiene los datos; si no existen, espera la extracción
data = api.comparativa("")
print(f"Se obtuvieron {len(data)} registros")
{
"rut": "76.543.210-K",
"desde": "202601",
"hasta": "202603",
"periodos": ["202601", "202602", "202603"],
"resumenes": {
"202601": {"period": "202601", "ventas": {...}, "compras": {...}, "balance": {...}},
"202602": {"period": "202602", "ventas": {...}, "compras": {...}, "balance": {...}},
"202603": {"period": "202603", "ventas": {...}, "compras": {...}, "balance": {...}}
},
"comparaciones": [
{
"periodo_actual": "202602",
"periodo_anterior": "202601",
"ventas": {
"total": {"actual": 14815500, "anterior": 12500000, "diferencia": 2315500, "variacion_pct": 18.52},
"neto": {"actual": 12450000, "anterior": 10504202, "diferencia": 1945798, "variacion_pct": 18.52},
"iva": {"actual": 2365500, "anterior": 1995798, "diferencia": 369702, "variacion_pct": 18.52},
"documentos": {"actual": 45, "anterior": 38, "diferencia": 7, "variacion_pct": 18.42},
"exento": {"actual": 0, "anterior": 0, "diferencia": 0, "variacion_pct": null}
},
"compras": {
"total": {"actual": 9793700, "anterior": 8100000, "diferencia": 1693700, "variacion_pct": 20.91},
...
},
"balance_iva": {
"iva_neto_actual": 801800,
"iva_neto_anterior": 650000,
"diferencia": 151800,
"variacion_pct": 23.35
}
},
{
"periodo_actual": "202603",
"periodo_anterior": "202602",
...
}
]
}
/api/v1/extracciones/
Fuerza una extracción on-demand de un módulo y período específico. Retorna un task_id para consultar el estado.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
module | string | Sí | ventas, compras, f29, honorarios |
period | string | Sí | YYYYMM o YYYY para honorarios |
curl -X POST "https://apipyme.cl/api/v1/extracciones/" \
-H "X-Company-Token: TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"module": "ventas", "period": "202602"}'
import requests
url = "https://apipyme.cl/api/v1/extracciones/"
headers = {
"X-Company-Token": "TU_TOKEN",
"Content-Type": "application/json",
}
body = {"module": "ventas", "period": "202602"}
response = requests.post(url, json=body, headers=headers)
data = response.json()
print(f"Task ID: {data['task_id']}")
print(f"Estado: {data['status']}")
const response = await fetch(
"https://apipyme.cl/api/v1/extracciones/",
{
method: "POST",
headers: {
"X-Company-Token": "TU_TOKEN",
"Content-Type": "application/json",
},
body: JSON.stringify({
module: "ventas",
period: "202602",
}),
}
);
const data = await response.json();
console.log(`Task ID: ${data.task_id}`);
$ch = curl_init("https://apipyme.cl/api/v1/extracciones/");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-Company-Token: TU_TOKEN",
"Content-Type: application/json",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
"module" => "ventas",
"period" => "202602",
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
echo "Task ID: " . $data["task_id"];
# pip install apipyme-sdk
from apipyme import ApiPyme
api = ApiPyme(
token="TU_TOKEN",
base_url="https://apipyme.cl/api/v1"
)
# Forzar extracción
task = api.extraer("ventas", "202602")
print(f"Task ID: {task.task_id}")
# Esperar a que termine (polling automático)
resultado = task.poll(timeout=180)
print(f"Estado: {resultado['status']}")
print(f"Registros extraídos: {resultado['rows_extracted']}")
{
"id": 42,
"module": "ventas",
"period": "202602",
"status": "PENDING",
"task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"triggered_by": "ONDEMAND",
"started_at": "2026-03-08T10:50:00Z",
"completed_at": null,
"rows_extracted": null,
"error_message": null
}
/api/v1/extracciones/{task_id}/
Consulta el estado de una extracción. Útil para hacer polling hasta que status sea SUCCESS o FAILED.
| Nombre | Ubicación | Tipo | Descripción |
|---|---|---|---|
task_id | path | string | ID de la tarea retornado al iniciar la extracción |
# Reemplaza TU_TOKEN por el token de tu empresa
curl -H "X-Company-Token: TU_TOKEN" \
"https://apipyme.cl/api/v1/extracciones/a1b2c3d4-e5f6-7890-abcd-ef1234567890/"
import requests
url = "https://apipyme.cl/api/v1/extracciones/a1b2c3d4-e5f6-7890-abcd-ef1234567890/"
headers = {"X-Company-Token": "TU_TOKEN"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()["data"]
print(f"Se obtuvieron {len(data)} registros")
elif response.status_code == 202:
task_id = response.json()["task_id"]
print(f"Extracción iniciada: {task_id}")
// Node.js / fetch
const response = await fetch(
"https://apipyme.cl/api/v1/extracciones/a1b2c3d4-e5f6-7890-abcd-ef1234567890/",
{ headers: { "X-Company-Token": "TU_TOKEN" } }
);
if (response.status === 200) {
const { data } = await response.json();
console.log(`Se obtuvieron ${data.length} registros`);
} else if (response.status === 202) {
const { task_id } = await response.json();
console.log(`Extracción iniciada: ${task_id}`);
}
// PHP con cURL
$ch = curl_init("https://apipyme.cl/api/v1/extracciones/a1b2c3d4-e5f6-7890-abcd-ef1234567890/");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-Company-Token: TU_TOKEN"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 200) {
echo "Registros: " . count($data["data"]);
} elseif ($httpCode === 202) {
echo "Extracción iniciada: " . $data["task_id"];
}
# pip install apipyme-sdk
from apipyme import ApiPyme
api = ApiPyme(
token="TU_TOKEN",
base_url="https://apipyme.cl/api/v1"
)
# Obtiene los datos; si no existen, espera la extracción
data = api.estado("")
print(f"Se obtuvieron {len(data)} registros")
| Estado | Descripción |
|---|---|
PENDING | En cola, esperando ser procesada |
RUNNING | Extracción en curso (conectando al SII) |
SUCCESS | Completada. Los datos ya están disponibles en el endpoint correspondiente |
FAILED | Falló. Revisa error_message para más detalle |
/api/v1/empresa/
Retorna la información de la empresa asociada al token utilizado. Útil para verificar que el token es correcto.
# Reemplaza TU_TOKEN por el token de tu empresa
curl -H "X-Company-Token: TU_TOKEN" \
"https://apipyme.cl/api/v1/empresa/"
import requests
url = "https://apipyme.cl/api/v1/empresa/"
headers = {"X-Company-Token": "TU_TOKEN"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()["data"]
print(f"Se obtuvieron {len(data)} registros")
elif response.status_code == 202:
task_id = response.json()["task_id"]
print(f"Extracción iniciada: {task_id}")
// Node.js / fetch
const response = await fetch(
"https://apipyme.cl/api/v1/empresa/",
{ headers: { "X-Company-Token": "TU_TOKEN" } }
);
if (response.status === 200) {
const { data } = await response.json();
console.log(`Se obtuvieron ${data.length} registros`);
} else if (response.status === 202) {
const { task_id } = await response.json();
console.log(`Extracción iniciada: ${task_id}`);
}
// PHP con cURL
$ch = curl_init("https://apipyme.cl/api/v1/empresa/");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-Company-Token: TU_TOKEN"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 200) {
echo "Registros: " . count($data["data"]);
} elseif ($httpCode === 202) {
echo "Extracción iniciada: " . $data["task_id"];
}
# pip install apipyme-sdk
from apipyme import ApiPyme
api = ApiPyme(
token="TU_TOKEN",
base_url="https://apipyme.cl/api/v1"
)
# Obtiene los datos; si no existen, espera la extracción
data = api.empresa("")
print(f"Se obtuvieron {len(data)} registros")
{
"rut": "76.543.210-K",
"business_name": "Comercial Ejemplo SpA",
"client_email": "contacto@ejemplo.cl",
"client_company": "Integrador Contable Ltda.",
"is_active": true
}
Cuando una extracción termina, ApiPyme envía un POST a la URL de webhook
que configures en
Configuración Webhook (en tu cuenta del portal).
Esto te permite recibir notificaciones en tu sistema sin necesidad de hacer polling.
| Header | Valor | Descripción |
|---|---|---|
Content-Type |
application/json |
Siempre JSON |
X-Webhook-Secret |
Tu secret configurado | Solo si configuraste un secret. Úsalo para validar que la notificación viene de ApiPyme. |
{
"event": "extraction_complete",
"module": "ventas",
"rut": "76.543.210-K",
"period": "202604",
"status": "SUCCESS",
"rows": 142,
"task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
| Campo | Tipo | Descripción |
|---|---|---|
event | string | Tipo de evento. Actualmente siempre extraction_complete. |
module | string | ventas, compras, f29, honorarios o previred |
rut | string | RUT de la empresa |
period | string | Período en formato YYYYMM o YYYY |
status | string | SUCCESS si la extracción fue exitosa, FAILED si falló |
rows | int/null | Cantidad de registros extraídos. null si falló. |
task_id | string | ID de la tarea. Puedes usarlo para consultar el estado vía GET /api/v1/extracciones/{task_id}/ |
Si configuraste un webhook_secret, valida el header en tu endpoint:
# Python (Flask/Django)
secret = request.headers.get('X-Webhook-Secret', '')
if secret != 'tu-secret-configurado':
return Response(status=401)
# Node.js (Express)
const secret = req.headers['x-webhook-secret'];
if (secret !== 'tu-secret-configurado') {
return res.sendStatus(401);
}
2xx en menos de 10 segundos.
Si tienes el feature Webhook con reintentos, se reintentará
hasta 5 veces con backoff exponencial (1, 2, 4, 8 minutos).
| Código | Significado | Ejemplo |
|---|---|---|
| 401 | Token no enviado o inválido | {"detail": "Token inválido o empresa inactiva."} |
| 403 | Sin licencia activa para el módulo | {"error": "No tienes licencia activa para el módulo \"ventas\"."} |
| 429 | Límite diario de requests alcanzado | {"error": "Has superado el límite diario de 5 requests para este módulo."} |
| 404 | Recurso no encontrado | {"error": "Tarea no encontrada."} |
| 400 | Parámetros inválidos o faltantes | {"error": "Se requieren los campos \"module\" y \"period\"."} |
No requiere parámetro adicional. El header Content-Type será application/json.
GET /api/v1/ventas/202602/
Agrega ?format=csv. El archivo incluye BOM para compatibilidad con Excel y usa ; como delimitador.
GET /api/v1/ventas/202602/?format=csv