# Pagination and filters

Paginated endpoints return 25 records at a time, newest first except for members, which are listed oldest first. Ask for another page with ?page= and another size with ?per_page= (1 to 100; a size outside that range is brought within it rather than refused). Alongside data you get Laravel's meta and links objects, so you can walk the pages without counting yourself.

```bash
curl 'https://api.velirapay.com/v1/charges?status=paid&per_page=50&page=2' \
  --fail-with-body --silent --show-error --max-time 30 \
  -H "Authorization: Bearer ${VELIRAPAY_API_KEY:?Set VELIRAPAY_API_KEY}" \
  -H 'Accept: application/json'
```

**Response**

```json
{
  "data": [ … ],
  "links": { "first": "…", "last": "…", "prev": "…", "next": null },
  "meta": {
    "current_page": 2, "from": 51, "last_page": 2, "links": [ … ],
    "path": "…", "per_page": 50, "to": 63, "total": 63
  }
}
```

These are numbered pages, not a snapshot. Records added, removed or moved out of your filters while you page can cause repeats or skips. Ignore ids you already have, and repeat the scan if you need to reconcile a changing list.

## Filters

Each list endpoint takes the filters that make sense for it, and they combine with paging.

- GET `/v1/charges` Filter with ?status= (pending, underpaid, paid, expired or canceled), ?payment_link= (a payment link id), ?asset= (a coin), ?search= (the charge id, customer email or customer name), ?created_from= and ?created_to= (ISO 8601 dates in UTC; a bare ?created_to= date includes that whole day).
- GET `/v1/invoices` Filter with ?status= (open, paid or void), ?search= (the number, customer name or customer email) and ?overdue=true.
- GET `/v1/payment-links` Filter with ?status= (active or archived) and ?search= (the title).
- GET `/v1/coupons` Filter with ?search= (the code).
- GET `/v1/payouts` Filter with ?status= (pending, sending, sent, failed or manual), ?asset= (a coin) and ?search= (a charge id or a transaction hash).
- GET `/v1/events` Filter with ?type= (one event name), ?charge= (a charge id) and ?invoice= (an invoice id). ?invoice= returns the invoice.* events only: the events of its charges are found with ?charge=.
- GET `/v1/webhook-endpoints` No filters.
- GET `/v1/webhook-endpoints/{id}/deliveries` Filter with ?status= (pending, succeeded, failed) and ?event= (one event name).
- GET `/v1/api-keys` Active keys in the key's mode. No filters.
- GET `/v1/members` Members, oldest first. No filters.
- GET `/v1/invitations` Unaccepted invitations, including expired ones. No filters.
- GET `/v1/activity` Filter with ?action= (an action or sensitive), ?person= (a name or email), ?q= (a subject or IP address), ?from= and ?to= (YYYY-MM-DD).

An invalid status, event type, coin or date in these filters is ignored; other valid filters still apply. An id or search that matches nothing gives an empty list. GET /v1/assets, GET /v1/payout-addresses and GET /v1/payouts/summary return complete lists without paging. GET /v1/assets accepts ?currency= and rejects an unsupported currency with 422.
