curl --request GET \
--url https://api.tupana.ai/v2/folios/ \
--header 'Authorization: <api-key>'import requests
url = "https://api.tupana.ai/v2/folios/"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.tupana.ai/v2/folios/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tupana.ai/v2/folios/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tupana.ai/v2/folios/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tupana.ai/v2/folios/")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tupana.ai/v2/folios/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"dte_type": 33,
"available": 120,
"max_per_request": 50,
"last_timbraje": "2026-08-19",
"timbrajes": [
{
"authorization_date": "2026-08-19",
"quantity": 50,
"folio_start": 539,
"folio_end": 588,
"consistent": true
}
],
"as_of": "2026-08-27T14:05:00Z"
}
],
"meta": {
"page": null,
"page_size": null,
"total": 1,
"total_pages": null
},
"links": {
"next": null,
"prev": null
}
}{
"detail": "No tienes acceso a esta entidad."
}Folios disponibles y timbrajes históricos
Última lectura conocida del estado de tus folios en el SII: cuántos tienes timbrados y sin emitir (available), cuántos te autoriza el SII por solicitud (max_per_request) y los rangos que te timbraron antes (timbrajes).
El dato vive en el SII y solo se conoce consultándolo, así que este endpoint responde con la última foto guardada y su fecha (as_of) — no bloquea. Para forzar una relectura usa POST /folios/refresh.
Si la entidad nunca fue consultada, results viene vacío. Vacío significa no sabemos, no cero folios.
curl --request GET \
--url https://api.tupana.ai/v2/folios/ \
--header 'Authorization: <api-key>'import requests
url = "https://api.tupana.ai/v2/folios/"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.tupana.ai/v2/folios/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tupana.ai/v2/folios/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tupana.ai/v2/folios/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tupana.ai/v2/folios/")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tupana.ai/v2/folios/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"dte_type": 33,
"available": 120,
"max_per_request": 50,
"last_timbraje": "2026-08-19",
"timbrajes": [
{
"authorization_date": "2026-08-19",
"quantity": 50,
"folio_start": 539,
"folio_end": 588,
"consistent": true
}
],
"as_of": "2026-08-27T14:05:00Z"
}
],
"meta": {
"page": null,
"page_size": null,
"total": 1,
"total_pages": null
},
"links": {
"next": null,
"prev": null
}
}{
"detail": "No tienes acceso a esta entidad."
}Authorizations
API Key para autenticación. Debe proporcionarse en el header Authorization con el formato: 'Api-Key YOUR-API-KEY' (incluye el prefijo 'Api-Key ' seguido de tu API key)
Query Parameters
ID de la entidad maestra (public ID ment_...).
Filtra por tipo de documento.
Ambiente del SII. Si se omite, producción: los folios de certificación son un stock distinto y mostrarlos como propios sería peor que no mostrar nada.
production, certification 