Autenticación

Todas las llamadas a la API requieren el token de empresa (UUID). Puedes enviarlo de dos formas:

  • Header: X-Company-Token: tu-token-uuid
  • Query param: ?token=tu-token-uuid

El token lo encuentras en el portal, en el detalle de cada empresa. Si el token se ve comprometido, puedes regenerarlo desde tu cuenta.

GET /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.

Parámetros
NombreUbicaciónTipoDescripción
periodpathstringPeríodo en formato YYYYMM (ej. 202602)
formatquerystringFormato de respuesta: json (default) o csv
Ejemplos de uso
# 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")
Respuesta exitosa 200
{
  "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"
    }
  ]
}
Extracción iniciada 202
{
  "message": "Extracción iniciada.",
  "task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "log_id": 42
}
GET /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).

Parámetros
NombreUbicaciónTipoDescripción
periodpathstringPeríodo en formato YYYYMM
formatquerystringjson o csv
Ejemplos de uso
# 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")
Respuesta exitosa 200
{
  "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"
    }
  ]
}
GET /api/v1/f29/{period}/

Obtiene los datos del Formulario 29 (IVA) de un período.

Parámetros
NombreUbicaciónTipoDescripción
periodpathstringPeríodo en formato YYYYMM
formatquerystringjson o csv
Ejemplos de uso
# 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")
Respuesta exitosa 200
{
  "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"
    }
  ]
}
GET /api/v1/honorarios/{year}/

Obtiene las boletas de honorarios recibidas durante un año completo.

Parámetros
NombreUbicaciónTipoDescripción
yearpathstringAño en formato YYYY (ej. 2026)
formatquerystringjson o csv
Ejemplos de uso
# 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")
Respuesta exitosa 200
{
  "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"
    }
  ]
}
GET /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.

Parámetros
NombreUbicaciónTipoDescripción
periodpathstringPeríodo en formato YYYYMM (ej. 202602)
Ejemplos de uso
# 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")
Respuesta exitosa 200
{
  "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
  }
}
Sin datos 404
{
  "error": "No hay datos de ventas ni compras para el período 202602. Primero extrae los datos."
}
GET /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.

Parámetros
NombreUbicaciónTipoDescripción
desdequerystringPeríodo inicial YYYYMM (ej. 202601)
hastaquerystringPeríodo final YYYYMM (ej. 202603)
Ejemplos de uso
# 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")
Respuesta exitosa 200 (simplificada)
{
  "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",
      ...
    }
  ]
}
POST /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.

Body (JSON)
CampoTipoRequeridoDescripción
modulestringventas, compras, f29, honorarios
periodstringYYYYMM o YYYY para honorarios
Ejemplos de uso
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']}")
Respuesta 202
{
  "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
}
GET /api/v1/extracciones/{task_id}/

Consulta el estado de una extracción. Útil para hacer polling hasta que status sea SUCCESS o FAILED.

Parámetros
NombreUbicaciónTipoDescripción
task_idpathstringID de la tarea retornado al iniciar la extracción
Ejemplos de uso
# 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")
Estados posibles
EstadoDescripción
PENDINGEn cola, esperando ser procesada
RUNNINGExtracción en curso (conectando al SII)
SUCCESSCompletada. Los datos ya están disponibles en el endpoint correspondiente
FAILEDFalló. Revisa error_message para más detalle
GET /api/v1/empresa/

Retorna la información de la empresa asociada al token utilizado. Útil para verificar que el token es correcto.

Ejemplos de uso
# 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")
Respuesta 200
{
  "rut": "76.543.210-K",
  "business_name": "Comercial Ejemplo SpA",
  "client_email": "contacto@ejemplo.cl",
  "client_company": "Integrador Contable Ltda.",
  "is_active": true
}
Webhooks

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.

Headers enviados
HeaderValorDescripció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.
Payload
{
  "event": "extraction_complete",
  "module": "ventas",
  "rut": "76.543.210-K",
  "period": "202604",
  "status": "SUCCESS",
  "rows": 142,
  "task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
Campos
CampoTipoDescripción
eventstringTipo de evento. Actualmente siempre extraction_complete.
modulestringventas, compras, f29, honorarios o previred
rutstringRUT de la empresa
periodstringPeríodo en formato YYYYMM o YYYY
statusstringSUCCESS si la extracción fue exitosa, FAILED si falló
rowsint/nullCantidad de registros extraídos. null si falló.
task_idstringID de la tarea. Puedes usarlo para consultar el estado vía GET /api/v1/extracciones/{task_id}/
Validación del secret

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);
}
Tu endpoint debe responder con 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ódigos de error
CódigoSignificadoEjemplo
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\"."}
Formatos de respuesta
JSON (por defecto)

No requiere parámetro adicional. El header Content-Type será application/json.

GET /api/v1/ventas/202602/
CSV

Agrega ?format=csv. El archivo incluye BOM para compatibilidad con Excel y usa ; como delimitador.

GET /api/v1/ventas/202602/?format=csv