GET Broker Status
Read broker connection health across your members using your partner token. The response uses CrossTrade's stored session state without making a live Tradovate request. Only identities covered by an active grant appear; revoked members remain in the list with an empty brokers array.
Endpoint
GET https://app.crosstrade.io/v1/api/partner/brokers
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 | Members per page, 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. Members are ordered by creation time descending, then external_id descending, just like GET Members.
Code examples
Set PARTNER_TOKEN. Continue with each next_cursor until it is null.
- Python
- JavaScript
- cURL
import json
import os
import requests
response = requests.get(
"https://app.crosstrade.io/v1/api/partner/brokers",
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/brokers?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/brokers" \
-H "Authorization: Bearer $PARTNER_TOKEN" \
--data-urlencode "limit=50"
Response
200 OK. Each item summarizes one member, with one brokers entry per shared Tradovate login, rather than per trading account.
{
"success": true,
"members": [
{
"external_id": "th_8831",
"uid": "k3Qz9pLa",
"status": "connected",
"grant": {
"version": 1,
"active": true
},
"brokers": [
{
"environment": "demo",
"user_id": "4815162",
"name": "jamie_r",
"status": "reauth_required",
"reason": "expired",
"expires": "2026-10-15T20:00:00Z",
"linked": "2026-10-15T14:08:40Z"
}
],
"all_ready": false
}
],
"next_cursor": null,
"as_of": "2026-10-16T01:00:00Z",
"meta": {
"requestId": "preq_7e6d5c4b3a291807"
}
}
| Field | Meaning |
|---|---|
members[].external_id, uid, status | Your member id, CrossTrade user id and membership state |
members[].grant | Grant version and active flag, or null when no grant exists |
members[].brokers | Identities covered by an active grant; empty if none |
brokers[].environment, user_id | Tradovate environment and login user id |
brokers[].name | Stored login name; null when no session record exists |
brokers[].reason | Confirmed failure reason such as expired or evicted, otherwise null |
brokers[].expires, linked | Stored session expiry and link timestamps; may be null |
members[].all_ready | true only if at least one shared login exists and all are ready |
next_cursor | Continuation token, or null on the last page |
as_of | UTC time used for the status snapshot |
Connection states
brokers[].status | Meaning | Next step |
|---|---|---|
ready | Session record exists and its expiry is in the future | Continue normally |
reauth_required | CrossTrade recorded a confirmed broker-session failure | Send a relink Connect URL |
unknown | Session is expired or lacks an expiry, without a confirmed failure | Read again shortly; renewal may be pending |
unlinked | Shared identity has no stored session record | Ask the member to link that identity again |
Connection health does not guarantee a trade will pass scope, account, environment or policy checks. Use the member's token on the Trading API for trading data. Unlike this filtered health summary, the Trading API's aggregate /accounts route requires consent covering all linked identities.
Read one member with GET Member Broker Status, and follow broker.ready, broker.reauth_required and broker.unlinked through GET Events or signed webhooks.
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.