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.
| Parameter | Type | Notes |
|---|---|---|
customer_type | enum | individual or business. Omit for both. |
status | enum | Only customers whose rolled-up status is this one. See KyStatus. |
pending_rfi | boolean | true for customers with an open request for information, false for those without. |
cursor | string | next_cursor from the previous page. Omit on the first request. |
limit | integer | Page 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…"
}| Field | Type | Notes |
|---|---|---|
customers | array | This page, newest first. |
next_cursor | string | null | Pass back as ?cursor= for the next page. null on the last page. |
Each row:
| Field | Type | Notes |
|---|---|---|
id | string | Customer id. |
customer_type | "individual" | "business" | Which customer table the row came from. |
status | KyStatus | Rolled-up verification status, the same value GET /customers/:id/kyc/state returns. |
pending_rfi | boolean | An open request for information is outstanding. |
display_name | string | Optional. "First Last" for individuals, legal name for businesses. Absent until name fields are filled in. |
email | string | Optional. Contact email from the profile. Absent until one is provided. |
created_at | string | ISO-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
| Code | Status | Meaning |
|---|---|---|
Unauthorized | 401 | Missing or invalid API key. |