Paginação e Filtros
Como paginar resultados e filtrar dados na API de Integrações usando cursor pagination e flat query params.
Paginação por cursor
Endpoints de listagem usam cursor-based pagination. Esse modelo é mais eficiente que offset pagination para datasets grandes.
Como funciona
- Faça a primeira chamada sem o parâmetro
cursor - Se
pagination.has_next_pagefortrue, use o valor depagination.next_cursorna próxima chamada - Repita até
pagination.has_next_pageserfalse
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
cursor | string | Cursor opaco da página anterior. Omitir na primeira chamada. |
limit | number | Itens por página (padrão: 20, máximo: 100) |
Exemplo
# Primeira página
curl -H "Authorization: Bearer sk_xxx_yyy" \
"https://api.biterp.ai/products?limit=10"
# Próxima página
curl -H "Authorization: Bearer sk_xxx_yyy" \
"https://api.biterp.ai/products?limit=10&cursor=eyJmIjoiY3Jl..."Formato da resposta
Os dados vêm em data; os metadados de navegação, em pagination; e o eco de filtros/ordenação aplicados, em meta:
{
"data": [...],
"pagination": {
"limit": 20,
"has_next_page": true,
"has_previous_page": false,
"next_cursor": "eyJmIjoiY3JlYXRlZF9hdCIsInYiOi...",
"previous_cursor": null
},
"meta": {
"sort": { "field": "created_at", "order": "asc" }
}
}Filtros (Flat Query Params)
Os endpoints de listagem aceitam filtros via query params planos, no estilo Stripe (bracket notation).
Sintaxe
# Igualdade (sem operador)
GET /products?name=notebook&is_active=true
# Operadores via bracket notation
GET /products?sale_price[gte]=1000&sale_price[lte]=5000
# Busca parcial (contains)
GET /customers?legal_name[contains]=acme
# Combinando filtros, ordenação e paginação
GET /quotes?created_at[gte]=2026-01-01&sort=created_at:desc&limit=50Operadores disponíveis
| Sintaxe | Operador | Tipos suportados |
|---|---|---|
field=value | Igual (eq) | string, number, boolean, date |
field[neq]=value | Diferente | string, number, boolean, date |
field[gt]=value | Maior que | number, date |
field[gte]=value | Maior ou igual | number, date |
field[lt]=value | Menor que | number, date |
field[lte]=value | Menor ou igual | number, date |
field[contains]=value | Contém (busca parcial) | string |
field[not_contains]=value | Não contém | string |
field[is_null]=true | É nulo | todos os tipos (campo nullable) |
field[is_not_null]=true | Não é nulo | todos os tipos (campo nullable) |
No payload JSON de filters, use { "f": "reference_code", "op": "is_null" } sem v (ou "v": null) — o operador não carrega valor:
{
"logic": "and",
"conditions": [{ "f": "reference_code", "op": "is_null" }]
}Equivalente flat: GET /products?reference_code[is_null]=true
Ordenação
Use o parâmetro sort com o formato campo:direcao:
# Ordenar por preço decrescente
GET /products?sort=sale_price:desc
# Ordenar por data de criação crescente
GET /products?sort=created_at:ascOrdenação padrão por recurso
Se você não enviar sort, cada recurso aplica a ordenação que faz sentido para o seu domínio — não existe um padrão único para toda a API:
| Recurso | Ordenação padrão |
|---|---|
/products, /customers, /suppliers | created_at:asc |
/quotes, /sales-orders | record_number:asc |
/invoices | invoice_date:desc |
/purchase-invoices | issue_date:desc |
/receivables, /payables | due_date:asc |
/financial-transactions | posted_at:desc |
/financial-accounts, /banks | display_order:asc |
/financial-categories | position:asc |
/countries, /states, /cities, /payment-methods, /units-of-measurement | id:desc |
O bloco meta.sort da resposta sempre ecoa a ordenação efetivamente aplicada, então você pode confirmar o comportamento sem adivinhar.
A ordenação padrão é estável e faz parte do contrato: paginar por cursor sem
sortpercorre a coleção inteira sem repetir nem pular registros. Se a sua integração depende de uma ordem específica, enviesortexplicitamente em vez de confiar no padrão.
Regras
- Todos os filtros são combinados com AND
is_null/is_not_nullsó funcionam em campos marcados como nullable no contrato do recurso (ex.:reference_codeem cadastros que aceitam código opcional)- Campos desconhecidos retornam
400 Bad Request - Valores inválidos (ex: texto em campo numérico) retornam
400 Bad Request - Cada recurso tem seus próprios campos filtráveis — consulte a referência de endpoints

