GET Members
List your partner's members, including revoked members. Results are ordered by creation time descending, then external_id descending. Use GET Member for one member and its current ETag.
Endpoint
GET https://app.crosstrade.io/v1/api/partner/users
Headers
| Name | Required | Value |
|---|---|---|
| Authorization | Yes | Bearer <partner access token> with partner:read (also implied by partner:provision) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Page size, 1–200. Default: 50 |
cursor | string | No | Opaque next_cursor from the previous page. Omit on the first request |
No request body. Unknown or repeated query parameters are rejected.
Code examples
Set PARTNER_TOKEN to your service's access token. These examples read the first page; pass its next_cursor on subsequent requests until it is null.
- Python
- JavaScript
- cURL
import json
import os
import requests
response = requests.get(
"https://app.crosstrade.io/v1/api/partner/users",
headers={"Authorization": f"Bearer {os.environ['PARTNER_TOKEN']}"},
params={"limit": 50},
timeout=15,
)
response.raise_for_status()
print(json.dumps(response.json(), indent=2))
const response = await fetch("https://app.crosstrade.io/v1/api/partner/users?limit=50", {
headers: { Authorization: `Bearer ${process.env.PARTNER_TOKEN}` },
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
console.log(JSON.stringify(await response.json(), null, 2));
curl -sS --get "https://app.crosstrade.io/v1/api/partner/users" \
-H "Authorization: Bearer $PARTNER_TOKEN" \
--data-urlencode "limit=50"
Response
200 OK. Each item uses the member object. Lists do not return an ETag.
{
"success": true,
"members": [
{
"external_id": "th_8831",
"uid": "k3Qz9pLa",
"email": "member@example.com",
"name": "Jamie Rivera",
"status": "connected",
"ownership_verified": true,
"version": 1,
"environments": [
"demo"
],
"metadata": {},
"seat": {
"started": "2026-10-15T14:02:11Z",
"ended": null
},
"created": "2026-10-15T14:02:11Z",
"authorization": {
"status": "exchanged",
"flow_id": "pcf_a1b2c3d4e5f6",
"purpose": "authorize",
"generation": 1
},
"grant": {
"version": 1,
"active": true
}
}
],
"next_cursor": null,
"as_of": "2026-10-16T10:00:00Z",
"events_high_water": 42,
"meta": {
"requestId": "preq_9a8b7c6d5e4f3a21"
}
}
| Field | Meaning |
|---|---|
members | Member records on this page; an empty array when none remain |
next_cursor | Opaque continuation token, or null on the last page |
as_of | UTC time of the read |
events_high_water | Event sequence captured before reading member state |
To recover from 410 cursor_expired on GET Events, retain events_high_water from the first member-list page, reconcile all pages, then resume events from that value. Do not replace it with a later page's high-water mark.
Errors
| Status | Error | Meaning |
|---|---|---|
| 400 | validation_failed | Invalid cursor, limit, query parameter or unexpected body |
| 401 | unauthorized | Invalid partner token |
| 403 | insufficient_scope, partner_not_enabled, partner_disabled | Scope or service policy refuses the read |
| 429 | rate_limited, too_many_concurrent_requests | Honor Retry-After |
| 503 | storage_unavailable, policy_unavailable, auth_unavailable, partner_api_unavailable | Retry with backoff |
See Partner errors for response shapes.