Paginação e filtros

Percorra qualquer listagem da API do começo ao fim e use os filtros que cada uma realmente aplica.

Parâmetros page e per_page

Toda listagem aceita dois parâmetros na query string:

ParâmetroO que fazPadrãoLimites
pageNúmero da página, começando em 1.1Inteiro, mínimo 1.
per_pageQuantos itens vêm por página.25Inteiro, de 1 a 100.

per_page acima de 100 responde 400 invalid_request, com message vazia. Uma página depois da última responde 200 com data vazio.

Formato da resposta

Toda listagem responde com data e meta:

{
  "data": [
    {
      "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
      "identifier": "PPO9876543210",
      "status": "PAID",
      "total_amount": 97
    }
  ],
  "meta": {
    "page": 1,
    "per_page": 25,
    "total": 58,
    "total_pages": 3
  }
}

Resposta resumida. Os campos de cada item estão na Referência da API.

Campo de metaO que significa
pagePágina devolvida.
per_pageItens por página usados.
totalTotal de itens que atendem aos filtros.
total_pagesTotal de páginas. 0 quando não há itens.

Ordem dos resultados

Todas as listagens vêm da mais nova para a mais antiga, pela data de criação (created_at). Não há parâmetro para mudar a ordem.

Filtros de cada listagem

Cada listagem aceita só os filtros da tabela, além de page e per_page. Um filtro que a rota não aplica, ou um valor fora da lista, responde 400 invalid_request.

RotaFiltros aceitos
GET /salesstatus, payment_method, created_from, created_to, external_reference, product_id, customer_email, customer_document
GET /subscriptionsstatus, plan_id, customer_email, customer_document, created_from, created_to
GET /refundsstatus, sale_identifier, customer_email, customer_document, created_from, created_to
GET /customersemail, name, document
GET /productsname, type, is_active
GET /plansname, is_active
GET /offers/by-product/{id}title, is_active
GET /plans/{id}/offerstitle, is_active

Os valores aceitos em status, payment_method e type estão em cada rota da Referência da API. O status de GET /sales usa as situações da venda, e o de GET /subscriptions, as da assinatura: um não vale no outro.

Você pode combinar filtros na mesma chamada. A listagem traz só os itens que atendem a todos eles.

Como cada tipo de filtro compara

TipoFiltrosComo comparaExemplo
Busca por textoname, titleParte do texto, sem diferenciar maiúsculas de minúsculas.name=curso encontra "Curso de Excel" e "Minicurso".
E-mailemail, customer_emailE-mail completo, sem diferenciar maiúsculas de minúsculas.customer_email=Maria@Email.com encontra maria@email.com.
Documentodocument, customer_documentCPF com 11 dígitos ou CNPJ com 14, com ou sem pontuação. Compara só os dígitos.123.456.789-09 e 12345678909 encontram o mesmo cliente.
Idproduct_id, plan_idO id exato, no formato uuid.plan_id=3fa85f64-5717-4562-b3fc-2c963f66afa6
Situação e tipostatus, payment_method, typeO valor exato, em maiúsculas.status=PAID
Ativois_activetrue traz só os ativos; false, só os inativos. Sem o filtro, vêm os dois.is_active=true
Datacreated_from, created_toData e hora completas em ISO 8601, com fuso. As duas pontas entram no resultado.created_to=2026-09-15T23:59:59-03:00

Detalhes que evitam surpresas:

  • GET /sales?product_id= traz as vendas que têm o produto em algum item. A venda vem com todos os itens, inclusive os de outros produtos.
  • GET /products não lista planos. Para planos, use GET /plans. Por isso type aceita só DIGITAL, PHYSICAL e PACKAGE.
  • Documento com outra quantidade de dígitos, ou com letras, responde 400 invalid_request.
  • Na busca por texto, % e _ valem como caracteres comuns, não como curinga.

Exemplo: vendas pagas de um cliente, buscando pelo CPF.

curl "https://api.pagpolar.com/v1/sales?status=PAID&customer_document=123.456.789-09" \
  -H "Authorization: Bearer <SEU_TOKEN_DE_ACESSO>"

Percorra todas as páginas sem perder registros

Novas vendas entram no topo da lista enquanto você pagina. Isso empurra os itens para a página seguinte, e um mesmo item pode aparecer duas vezes.

Para evitar isso:

  1. Fixe created_to com a data e hora em que você começou a busca.
  2. Use per_page=100 para fazer menos chamadas.
  3. Guarde os itens pelo id. Se um id repetir, ignore.

Os exemplos abaixo usam um token de acesso. Veja Autenticação.

curl "https://api.pagpolar.com/v1/sales?page=1&per_page=100&created_from=2026-09-01T00:00:00-03:00&created_to=2026-09-15T23:59:59-03:00" \
  -H "Authorization: Bearer <SEU_TOKEN_DE_ACESSO>"
const apiUrl = 'https://api.pagpolar.com/v1';
const accessToken = '<SEU_TOKEN_DE_ACESSO>';
const createdTo = new Date().toISOString();
const salesById = new Map();

let page = 1;
let totalPages = 1;

do {
  const query = new URLSearchParams({
    page: String(page),
    per_page: '100',
    created_from: '2026-09-01T00:00:00-03:00',
    created_to: createdTo,
  });

  const response = await fetch(`${apiUrl}/sales?${query}`, {
    headers: { Authorization: `Bearer ${accessToken}` },
  });

  if (!response.ok) {
    throw new Error(`Erro ${response.status}: ${await response.text()}`);
  }

  const body = await response.json();

  for (const sale of body.data) {
    salesById.set(sale.id, sale);
  }

  totalPages = body.meta.total_pages;
  page += 1;
} while (page <= totalPages);

console.log(`${salesById.size} vendas encontradas`);

Próximos passos