Paginação e sincronização
Página a página ou só o que mudou desde a última vez.
Dois modos
Página a página
limit e offset: o modo de sempre, para telas e relatórios. A ordem de cada recurso é fixa e não muda entre versões.
Só o que mudou (incremental)
desde (data ou data e hora) liga o modo incremental: vêm só os registros criados ou alterados a partir dali, em ordem de alteração. A resposta traz proximoDesde, proximoId e temMais; devolva os dois primeiros em desde e depoisDe na chamada seguinte até temMais ser false.
Parâmetros de paginação
| Nome | Tipo | Descrição |
|---|---|---|
limit | integer | Máx. de itens (até 200). |
offset | integer | Deslocamento para paginação. |
desde | string | Só o que mudou a partir deste instante (ISO-8601: 2026-08-27 ou 2026-08-27T14:30:00). Ativa o modo incremental: a resposta traz proximoDesde/proximoId/temMais, que você devolve na chamada seguinte. |
depoisDe | integer | Use o proximoId da resposta anterior, junto com proximoDesde em 'desde'. Desempata registros gravados no mesmo instante. |
O envelope da resposta
| Nome | Tipo | Descrição |
|---|---|---|
data | array | Os registros da página. |
moeda | string | Moeda funcional da conta (ISO 4217) em que os valores estão. |
limit | integer | O limit aplicado. |
offset | integer | O offset aplicado. |
count | integer | Quantos registros vieram nesta página. |
desde | string | Só no modo incremental: o corte aplicado. |
temMais | boolean | Há outra página. |
proximoDesde | string | Só no modo incremental: devolva em desde na chamada seguinte. |
proximoId | integer | Só no modo incremental: devolva em depoisDe na chamada seguinte. |
O laço de sincronização
Guarde proximoDesde e proximoId depois de cada página e, na próxima execução, comece deles. Registros gravados no mesmo instante não se perdem nem se repetem, porque o cursor é o par data e id.
Python
import os
import requests
BASE = "https://tenka.app.br/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['TENKA_API_KEY']}"}
desde, depois_de = "2026-10-01", None # the last saved checkpoint
while True:
params = {"desde": desde, "limit": 200}
if depois_de:
params["depoisDe"] = depois_de
page = requests.get(f"{BASE}/clientes", headers=HEADERS, params=params, timeout=30).json()
if "erro" in page:
raise RuntimeError(page["erro"])
for record in page["data"]:
save(record)
if "proximoDesde" in page:
desde, depois_de = page["proximoDesde"], page["proximoId"]
if not page["temMais"]:
break
save_checkpoint(desde, depois_de)JavaScript
const BASE = "https://tenka.app.br/api/v1";
let desde = "2026-10-01", depoisDe = null; // the last saved checkpoint
while (true) {
const url = new URL(BASE + "/clientes");
url.searchParams.set("desde", desde);
url.searchParams.set("limit", 200);
if (depoisDe) url.searchParams.set("depoisDe", depoisDe);
const page = await (await fetch(url, { headers: { Authorization: "Bearer " + TENKA_API_KEY } })).json();
if (page.erro) throw new Error(page.erro);
page.data.forEach(save);
if (page.proximoDesde) { desde = page.proximoDesde; depoisDe = page.proximoId; }
if (!page.temMais) break;
}
saveCheckpoint(desde, depoisDe);