Skip to content
Logo

GET /customers

One page of the org's customers, newest first, carrying each one's rolled-up verification status. Built for sweeps: filter server-side and page with a cursor rather than pulling the whole list.

Query parameters

All optional. A bare GET /customers returns the newest 50.

ParameterTypeNotes
customer_typeenumindividual or business. Omit for both.
statusenumOnly customers whose rolled-up status is this one. See KyStatus.
pending_rfibooleantrue for customers with an open request for information, false for those without.
cursorstringnext_cursor from the previous page. Omit on the first request.
limitintegerPage size. Defaults to 50, capped at 200. A larger value is clamped, not rejected.

Filters combine with AND. status and pending_rfi are rolled-up values rather than stored columns, but they are applied server-side: a filtered page is still a full page, so a short page always means the end of the list and never "this batch happened to match nothing".

Response 200

{
  "customers": [
    {
      "id": "2f10…",
      "customer_type": "business",
      "status": "under_review",
      "pending_rfi": true,
      "display_name": "Acme Manufacturing Ltd",
      "email": "ops@acme.example",
      "created_at": "2026-09-12T09:31:04.000Z"
    }
  ],
  "next_cursor": "MTc4MzM2NDMyODk1NzUwOTo0NzkxNzE1Ny05OTc2…"
}
FieldTypeNotes
customersarrayThis page, newest first.
next_cursorstring | nullPass back as ?cursor= for the next page. null on the last page.

Each row:

FieldTypeNotes
idstringCustomer id.
customer_type"individual" | "business"Which customer table the row came from.
statusKyStatusRolled-up verification status, the same value GET /customers/:id/kyc/state returns.
pending_rfibooleanAn open request for information is outstanding.
display_namestringOptional. "First Last" for individuals, legal name for businesses. Absent until name fields are filled in.
emailstringOptional. Contact email from the profile. Absent until one is provided.
created_atstringISO-8601 timestamp.

Paging

Keep passing next_cursor back until it comes back null:

curl "https://api.seismic.io/v0/customers?limit=100" \
  -H "Authorization: Bearer $SEISMIC_API_KEY"
 
curl "https://api.seismic.io/v0/customers?limit=100&cursor=MTc4MzM2…" \
  -H "Authorization: Bearer $SEISMIC_API_KEY"

The cursor is an opaque keyset over (created_at, id), not an offset — a customer created while you're paging won't shift the rows you haven't read yet. Treat it as opaque; a malformed cursor restarts from the first page rather than erroring.

Sweeping for open requests

The intended shape for a notification sweep: one call per pass, returning only what needs attention.

curl "https://api.seismic.io/v0/customers?pending_rfi=true&limit=100" \
  -H "Authorization: Bearer $SEISMIC_API_KEY"

Then read the detail for each hit with GET /customers/:id/kyc/rfis. The org's own KYB is a separate subject — sweep it with GET /org/kyb/rfis.

Errors

CodeStatusMeaning
Unauthorized401Missing or invalid API key.