Skip to main content
List endpoints that can return large result sets are paginated. These are the POST variants of the list routes — you send the paging parameters in the request body, and the response comes back wrapped in a page envelope.
Each list resource has two forms: a simple GET that returns results directly, and a POST that accepts pagination (and, for most, an optional date-range filter). An empty POST body is valid — it returns the first page using the defaults, so the POST form behaves like its GET counterpart when you don’t pass anything.

Paginated endpoints

Most accept an optional date-range filter:
  • POST /ramp/orders
  • POST /ramp/customer/{customer_id}/orders
  • POST /ramp/bank-accounts
  • POST /ramp/customer/{customer_id}/bank-accounts
  • POST /ramp/customers
  • POST /ramp/wallets
  • POST /ramp/customer/{customer_id}/wallets
One takes pagination only (no filter):
  • POST /ramp/webhooks
Find them under the matching groups in the API Reference.

Request

FieldTypeNotes
pageNumberintegerWhich page to return. Zero-based (first page is 0). Defaults to 0.
pageSizeintegerItems per page. Defaults to 30, maximum 100.
filtersobject | nullOptional. Omit it (or send an empty body) to return everything from page 0.
filters.fromDatestring (ISO 8601)Required when filters is present. Returns items created after this time.
filters.toDatestring (ISO 8601)Optional upper bound on the creation time.
curl -X POST https://api.sand.etherfuse.com/ramp/orders \
  -H "Authorization: <your_api_key>" \
  -H "Content-Type: application/json" \
  -d '{
    "pageNumber": 0,
    "pageSize": 30,
    "filters": {
      "fromDate": "2026-01-01T00:00:00Z",
      "toDate": "2026-06-01T00:00:00Z"
    }
  }'
Limits & defaults
  • pageSize defaults to 30 and is capped at 100. Requesting more returns 400 (You can only request 100 items at a time); a pageSize of 0 returns 400 (Page size must be greater than 0).
  • pageNumber defaults to 0.
  • filters is optional. POST /ramp/webhooks ignores filters entirely (pagination only).
  • A malformed JSON body returns 400 with a JSON { "error": … } describing the parse failure; an empty body uses the defaults.

Response

Results come back in a page envelope:
FieldTypeDescription
itemsarrayThe items on this page.
totalItemsintegerTotal items across all pages.
totalPagesintegerTotal number of pages.
pageNumberintegerZero-based index of this page.
pageSizeintegerItems per page.
nextstring | nullURL for the next page, or null on the last page.
{
  "items": [ /* ... */ ],
  "totalItems": 42,
  "totalPages": 2,
  "pageNumber": 0,
  "pageSize": 30,
  "next": "https://api.sand.etherfuse.com/ramp/orders?pageNumber=1"
}

Iterating through pages

Start at pageNumber: 0 and keep requesting until pageNumber + 1 >= totalPages (or until next is null):
let page = 0;
const pageSize = 30; // max 100
const all = [];

while (true) {
  const res = await fetch("https://api.sand.etherfuse.com/ramp/orders", {
    method: "POST",
    headers: { Authorization: apiKey, "Content-Type": "application/json" },
    body: JSON.stringify({
      pageNumber: page,
      pageSize,
      filters: { fromDate: "2026-01-01T00:00:00Z" },
    }),
  });
  const { items, totalPages } = await res.json();
  all.push(...items);
  if (page + 1 >= totalPages) break;
  page++;
}
For real-time order tracking, prefer webhooks over polling these endpoints — newly created orders can take a moment to appear in list results.