GET Events
Read member, authorization, broker and partner lifecycle changes in ascending sequence order. Use this durable feed to poll for changes or recover missed webhook deliveries. Trading fills, positions and order rejections are read through the Trading API instead.
Endpoint
GET https://app.crosstrade.io/v1/api/partner/events
Headers
| Name | Required | Value |
|---|---|---|
| Authorization | Yes | Bearer <partner access token> with partner:read (also implied by partner:provision) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
cursor | integer | No | Last processed sequence, at least 0. Returns events strictly after it. Omit to start at the oldest retained event |
limit | integer | No | Page size, 1–200. Default: 50 |
No request body. Unknown or repeated query parameters are rejected. Unlike member-list cursors, this cursor is an integer, not an opaque string. There is no event-type filter parameter; filter type in your application.
Code examples
Set PARTNER_TOKEN. These examples read the first retained page. After processing it durably, save next_cursor and pass it as cursor on the next request.
- Python
- JavaScript
- cURL
import json
import os
import requests
response = requests.get(
"https://app.crosstrade.io/v1/api/partner/events",
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/events?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/events" \
-H "Authorization: Bearer $PARTNER_TOKEN" \
--data-urlencode "limit=50"
Response
200 OK. Optional attribution fields are included here; records omit them when unavailable.
{
"success": true,
"events": [
{
"id": "pev_3f9a1c2b4d5e6f70",
"sequence": 41,
"version": 1,
"type": "member.created",
"created": "2026-10-15T14:02:11Z",
"partner_id": "p_8f1c2d3e",
"external_id": "th_8831",
"uid": "k3Qz9pLa",
"client_id": "xt_ci_example",
"data": {
"status": "provisioned",
"version": 1
}
}
],
"next_cursor": 41,
"floor": 0,
"high_water": 41,
"has_more": false,
"as_of": "2026-10-15T14:03:00Z",
"meta": {
"requestId": "preq_7a6b5c4d3e2f1a09"
}
}
| Field | Meaning |
|---|---|
events[].id | Stable event id, shared with webhook retries; deduplicate by this value |
events[].sequence | Increasing, gap-free sequence within your partner's event history |
events[].version | Event schema version, currently 1 |
events[].type, data | Event name and type-specific details; see event types |
events[].created, partner_id | Change timestamp and owning partner |
events[].external_id | Member id when available; can be null for partner and authorization notices |
events[].uid, client_id, grant_version | Optional feed attribution fields; webhook bodies omit these |
next_cursor | Sequence to request after; unchanged on an empty page |
floor | Highest pruned sequence. A cursor below it has expired |
high_water | Latest sequence captured before reading this page |
has_more | More events remain within this page's captured high-water mark |
as_of | UTC time of the read |
When has_more is true, fetch another page with cursor=next_cursor. When it is false, retain the cursor and poll later. next_cursor remains an integer even when no events remain; it does not become null.
Expired cursor recovery
Events are retained for at least 30 days. Unresolved webhook deliveries can keep older events available. On 410 cursor_expired:
- Request the first page of GET Members and save its
events_high_water. - Reconcile every member-list page into your local state, retaining the first page's high-water mark.
- Resume this feed using that saved value as
cursor, deduplicating events as needed.
Using a later page's high-water mark can skip changes that happened during the listing. See Events and webhooks for webhook signatures, delivery behavior and the event catalog.
Errors
| Status | Error | Meaning |
|---|---|---|
| 400 | validation_failed | Invalid limit, negative cursor, cursor above high_water, unsupported 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 |
| 410 | cursor_expired | Cursor is below the retained floor; reconcile members before resuming |
| 429 | rate_limited, too_many_concurrent_requests | Honor Retry-After |
| 503 | policy_unavailable, auth_unavailable, partner_api_unavailable | Retry with backoff |
See Partner errors for response shapes.