Skip to main content
A API da AWSales usa paginação baseada em cursor para endpoints que retornam listas de recursos. A paginação por cursor fornece resultados estáveis e consistentes mesmo quando dados estão sendo adicionados ou removidos entre requests.

Como funciona

Em vez de números de página, cursores atuam como ponteiros para uma posição específica no conjunto de resultados. Cada response paginada inclui metadados com cursores que você pode usar para buscar a próxima página ou a anterior.

Estrutura da response

Todo endpoint paginado retorna a mesma estrutura:
{
  "data": [
    { "invoiceId": "019525fd-c290-7a9e-f6b2-8c0d2e4a6b8e", "..." : "..." },
    { "invoiceId": "019525fd-d3a1-7b0f-g7c3-9d1e3f5a7b9d", "..." : "..." }
  ],
  "meta": {
    "hasMore": true,
    "nextCursor": "019525fd-d3a1-7b0f-g7c3-9d1e3f5a7b9d",
    "previousCursor": "019525fd-c290-7a9e-f6b2-8c0d2e4a6b8e",
    "limit": 10
  }
}
CampoTipoDescrição
dataarrayO array de recursos da página atual
meta.hasMorebooleantrue se existem mais resultados além desta página
meta.nextCursorstringCursor para passar como nextCursor para buscar a próxima página
meta.previousCursorstringCursor para passar como previousCursor para buscar a página anterior
meta.limitintegerNúmero de resultados por página
Alguns endpoints (como Listar Planos) usam paginação baseada em offset com page, limit, totalItems e totalPages em vez de cursores. Consulte a referência do endpoint para o modelo de paginação específico utilizado.

Parâmetros de query

ParâmetroTipoPadrãoDescrição
limitinteger10Número de resultados por página. O máximo varia por endpoint (normalmente 50 ou 100).
nextCursorstringCursor de uma response anterior para buscar a próxima página.
previousCursorstringCursor de uma response anterior para buscar a página anterior.
sortstringVariaCampo e direção de ordenação (ex: createdAt:desc).
Não passe nextCursor e previousCursor na mesma request. Use um ou outro.

Paginação básica

Busque a primeira página e depois a próxima usando o cursor da response.
# First page
curl "https://api.awsales.io/studio/organizations/019525fd-4c38-7e30-a5c1-b6e3f4d8a9c2/invoices?limit=10" \
  -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIs..."

# Next page (using nextCursor from the previous response)
curl "https://api.awsales.io/studio/organizations/019525fd-4c38-7e30-a5c1-b6e3f4d8a9c2/invoices?limit=10&nextCursor=019525fd-d3a1-7b0f-g7c3-9d1e3f5a7b9d" \
  -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIs..."

Paginando por todos os resultados

Um loop completo que busca todas as páginas até não haver mais resultados.
async function fetchAllInvoices(orgId, token) {
  const BASE_URL = "https://api.awsales.io/studio";
  const allInvoices = [];
  let cursor = null;
  let hasMore = true;

  while (hasMore) {
    const url = new URL(`${BASE_URL}/organizations/${orgId}/invoices`);
    url.searchParams.set("limit", "50");
    if (cursor) {
      url.searchParams.set("nextCursor", cursor);
    }

    const response = await fetch(url.toString(), {
      headers: { Authorization: `Bearer ${token}` },
    });

    if (!response.ok) {
      throw new Error(`API error: ${response.status}`);
    }

    const { data, meta } = await response.json();
    allInvoices.push(...data);

    hasMore = meta.hasMore;
    cursor = meta.nextCursor;
  }

  return allInvoices;
}

// Usage
const invoices = await fetchAllInvoices(
  "019525fd-4c38-7e30-a5c1-b6e3f4d8a9c2",
  "eyJhbGciOiJSUzI1NiIs..."
);
console.log(`Fetched ${invoices.length} invoices`);
Use o maior valor de limit razoável para reduzir o número de chamadas à API. Menos requests significa menor latência e menos chance de atingir os limites de requisição.

Ordenação

A maioria dos endpoints paginados suporta o parâmetro de query sort. O formato é campo:direção, onde a direção pode ser asc ou desc.
# Invoices sorted by due date, newest first
curl "https://api.awsales.io/studio/organizations/{orgId}/invoices?sort=dueDate:desc&limit=20" \
  -H "Authorization: Bearer ..."
Os campos de ordenação disponíveis variam por endpoint:
EndpointCampos ordenáveis
Faturasstatus, type, dueDate, createdAt
Planosname

Filtragem

Muitos endpoints suportam filtros via parâmetros de query. Os filtros são aplicados antes da paginação, então os valores de cursor e hasMore refletem o conjunto de resultados filtrado.
# Only PAID invoices, sorted by creation date
curl "https://api.awsales.io/studio/organizations/{orgId}/invoices?status=PAID&sort=createdAt:desc&limit=10" \
  -H "Authorization: Bearer ..."
Ao combinar filtros com paginação, use os mesmos parâmetros de filtro em todas as requests de página. Alterar os filtros entre páginas produzirá resultados inconsistentes.

Próximos passos

Limites de Requisição

Entenda os limites de request e como lidar com throttling.

Tratamento de Erros

Trate erros de paginação e casos extremos com elegância.