Skip to main content

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​

NameRequiredValue
AuthorizationYesBearer <partner access token> with partner:read (also implied by partner:provision)

Query parameters​

NameTypeRequiredDescription
limitintegerNoMembers per page, 1–200. Default: 50
cursorstringNoOpaque 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.

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))

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"
}
}
FieldMeaning
members[].external_id, uid, statusYour member id, CrossTrade user id and membership state
members[].grantGrant version and active flag, or null when no grant exists
members[].brokersIdentities covered by an active grant; empty if none
brokers[].environment, user_idTradovate environment and login user id
brokers[].nameStored login name; null when no session record exists
brokers[].reasonConfirmed failure reason such as expired or evicted, otherwise null
brokers[].expires, linkedStored session expiry and link timestamps; may be null
members[].all_readytrue only if at least one shared login exists and all are ready
next_cursorContinuation token, or null on the last page
as_ofUTC time used for the status snapshot

Connection states​

brokers[].statusMeaningNext step
readySession record exists and its expiry is in the futureContinue normally
reauth_requiredCrossTrade recorded a confirmed broker-session failureSend a relink Connect URL
unknownSession is expired or lacks an expiry, without a confirmed failureRead again shortly; renewal may be pending
unlinkedShared identity has no stored session recordAsk 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​

StatusErrorMeaning
400validation_failedInvalid cursor, limit, query parameter or unexpected body
401unauthorizedInvalid partner token
403insufficient_scope, partner_not_enabled, partner_disabledScope or service policy refuses the read
429rate_limited, too_many_concurrent_requestsHonor Retry-After
503storage_unavailable, policy_unavailable, auth_unavailable, partner_api_unavailableRetry with backoff

See Partner errors for response shapes.