Paginación y filtrado

Recorre los endpoints de listado de Tokeflow con page/limit, lee el bloque meta.pagination, itera de forma segura y acota los resultados con filtros de fecha, estado y entidad.

Cada endpoint de listado de Tokeflow devuelve los resultados en páginas. Tú solicitas una página; Tokeflow devuelve ese segmento más un bloque meta.pagination que describe en qué punto del conjunto completo de resultados te encuentras. Las mismas convenciones se aplican en todas partes — transacciones, órdenes, clientes, productos, suscripciones y más — así que una vez que las aprendas para un recurso, las conoces para todos.

Esta página cubre dos cosas:

  • Paginación — page / limit, el bloque meta.pagination y un bucle que recorre cada página.
  • Filtrado — rangos de fechas, filtros de estado de múltiples valores y filtros de entidad/moneda que acotan una lista antes de paginarla.

Tokeflow es la capa de orquestación. Los endpoints de listado consultan los registros estandarizados que Tokeflow mantiene a través de tus proveedores conectados; los propios proveedores realizan el procesamiento y la liquidación subyacentes.


Paginación

Parámetros de consulta

Dos parámetros de consulta controlan la paginación. Ambos son opcionales.

FieldTypeRequiredDescription
pageintegerNoNúmero de página, indexado desde 1. Predeterminado 1. Mínimo 1.
limitintegerNoElementos por página. Predeterminado 20. Mínimo 1, máximo 100.

Solicitar page=1&limit=20 devuelve los primeros 20 elementos. Solicitar page=2&limit=20 devuelve los elementos 21–40, y así sucesivamente. Los valores fuera del rango permitido devuelven 400 validation_error.

Elige el limit más grande que tu carga de trabajo pueda procesar cómodamente (hasta 100) para reducir el número de idas y vueltas al iterar un conjunto grande de resultados.

El bloque meta.pagination

Las respuestas paginadas envuelven el arreglo en el sobre de éxito estándar. El arreglo vive en data; los detalles de paginación viven en meta.pagination.

FieldTypeDescription
pageintegerLa página en la que te encuentras actualmente.
limitintegerElementos por página aplicados a esta respuesta.
totalintegerNúmero total de elementos que coinciden con la solicitud (a través de todas las páginas, después de los filtros).
total_pagesintegerNúmero total de páginas: ceil(total / limit).
has_nextbooleantrue si existe una página después de esta.
has_prevbooleantrue si existe una página antes de esta.

total y total_pages reflejan el conjunto de resultados filtrado. Aplicar un filtro (ver más abajo) cambia ambos — cuentan las coincidencias, no cada registro del recurso.

Iterar cada página

Para procesar un conjunto de resultados completo, solicita la página 1 y sigue avanzando mientras has_next sea true. Detente cuando cambie a false.

El helper de Node que aparece a continuación recorre cada página de un endpoint de listado y produce cada elemento. Usa el limit máximo para minimizar las solicitudes y se apoya en has_next en lugar de calcular desplazamientos a mano.

/**
 * Async generator that yields every item across all pages of a Tokeflow list endpoint.
 * `path` is a resource path, e.g. "/api/v1/customers".
 * `params` are extra filters, e.g. { currency: "BRL" }.
 */
async function* paginate(path, params = {}, { limit = 100 } = {}) {
  let page = 1;

  for (;;) {
    const url = new URL(`https://api.tokeflow.com${path}`);
    url.searchParams.set("page", String(page));
    url.searchParams.set("limit", String(limit));
    for (const [key, value] of Object.entries(params)) {
      url.searchParams.set(key, value);
    }

    const res = await fetch(url, {
      headers: {
        Authorization: `Bearer ${process.env.TOKEFLOW_SECRET_KEY}`,
        Accept: "application/json",
      },
    });
    const body = await res.json();

    for (const item of body.data) {
      yield item;
    }

    if (!body.meta.pagination.has_next) break;
    page += 1;
  }
}

// Usage — collect every BRL customer.
const customers = [];
for await (const customer of paginate("/api/v1/customers", { currency: "BRL" })) {
  customers.push(customer);
}

Se pueden crear nuevos registros mientras paginas. Si se agregan elementos entre solicitudes, un escaneo de larga duración puede ver un elemento desplazarse a través de los límites de página o perder/repetir uno. Para una conciliación exacta, prefiere una ventana de filtro estable (por ejemplo, un rango cerrado date_from/date_to) para que el conjunto de resultados no cambie a mitad del escaneo.

Mantén la clave secreta (sk_*) solo en el servidor. Los bucles de paginación pertenecen a tu backend — nunca incrustes una clave secreta en código de navegador o móvil. Consulta Autenticación.


Filtrado

Los filtros son parámetros de consulta adicionales que acotan una lista antes de que se aplique la paginación. Combina tantos como el endpoint admita; se unen con AND. Los filtros disponibles varían por recurso — consulta cada referencia de endpoint para conocer el conjunto exacto — pero las convenciones son coherentes.

Filtros de rango de fechas

La mayoría de los endpoints de listado admiten una ventana de fecha de creación mediante date_from y date_to. Ambos toman marcas de tiempo ISO 8601 en UTC. Cualquiera de los dos puede suministrarse por sí solo.

FieldTypeDescription
date_fromstring (ISO 8601)Incluye elementos creados en este instante o después de él.
date_tostring (ISO 8601)Incluye elementos creados en este instante o antes de él.
?date_from=2026-01-01T00:00:00Z&date_to=2026-01-31T23:59:59Z

Filtros de múltiples valores (estado)

Los filtros de estado aceptan múltiples valores. Puedes pasarlos de dos maneras equivalentes:

  • Repite el parámetro: ?status=authorized&status=refunded
  • Separa los valores por comas: ?status=authorized,refunded

Ambas producen el mismo resultado — cualquier elemento cuyo estado coincida con alguno de los valores enumerados. Usa los valores enum exactos del recurso (por ejemplo, estados de transacción como authorized, refunded, partially_refunded; consulta la referencia de endpoint para conocer el enum de cada recurso).

Filtros de entidad y moneda

Los endpoints de listado exponen filtros que acotan los resultados a una entidad o atributo relacionado. El conjunto exacto depende del recurso. Ejemplos comunes:

FilterApplies to (examples)Description
currencytransactions, ordersCódigo de moneda ISO 4217, p. ej. BRL.
customer_idordersElementos que pertenecen a un cliente específico (cust_…).
customer_referencetransactionsElementos que coinciden con tu referencia de cliente externa.
emailcustomersClientes con un correo electrónico coincidente.
order_typeordersUno de los valores enum de order.type, p. ej. checkout.
external_order_idordersTu identificador de orden externo.

Las claves de Organization deben agregar el parámetro de consulta merchant_id para acotar los recursos a nivel de Merchant a un solo Merchant. Las claves de Merchant infieren el Merchant automáticamente y lo omiten. Consulta Autenticación.


Ejemplo: una solicitud filtrada y paginada

Lista la primera página de transacciones que están authorized o refunded, en BRL, creadas durante enero de 2026. (Auth: clave de Organization con merchant_id, o clave de Merchant.)

curl -G https://api.tokeflow.com/api/v1/transactions \
  -H "Authorization: Bearer sk_live_mer_xxx" \
  -H "Accept: application/json" \
  --data-urlencode "page=1" \
  --data-urlencode "limit=20" \
  --data-urlencode "status=authorized,refunded" \
  --data-urlencode "currency=BRL" \
  --data-urlencode "date_from=2026-01-01T00:00:00Z" \
  --data-urlencode "date_to=2026-01-31T23:59:59Z"

Respuesta (200 OK):

{
  "success": true,
  "data": [
    {
      "id": "tx_9a8b7c6d",
      "status": "authorized",
      "amount": 15000,
      "currency": "BRL",
      "payment_method": "credit_card",
      "charge_type": "payment",
      "customer_id": "cust_7h2k9",
      "created_at": "2026-01-15T12:30:00.000Z"
    },
    {
      "id": "tx_5f4e3d2c",
      "status": "refunded",
      "amount": 9900,
      "currency": "BRL",
      "payment_method": "pix",
      "charge_type": "payment",
      "customer_id": "cust_3p9q1",
      "created_at": "2026-01-09T08:12:00.000Z"
    }
  ],
  "meta": {
    "pagination": {
      "page": 1,
      "limit": 20,
      "total": 42,
      "total_pages": 3,
      "has_next": true,
      "has_prev": false
    }
  },
  "request_id": "req_8f3c2a91",
  "timestamp": "2026-01-15T12:30:00.000Z"
}

Como has_next es true, solicita page=2 con los mismos filtros para continuar, y sigue hasta que has_next sea false.


Errores

SituationHTTPType
limit por encima de 100, page por debajo de 1, o no entero400validation_error
date_from / date_to inválido (no ISO 8601)400validation_error
Valor status desconocido para el recurso400validation_error
La clave de Organization omite el merchant_id requerido403authorization_error

Ejemplo (400 validation_error):

{
  "error": {
    "type": "validation_error",
    "code": "INVALID_VALUE",
    "message": "limit must not be greater than 100",
    "details": { "field": "limit", "max": 100 },
    "request_id": "req_1b2c3d4e",
    "timestamp": "2026-01-15T12:30:00.000Z"
  }
}

Consulta Errores para la referencia completa de tipos de error.


Lecturas relacionadas

En esta página