GET Member
Read one member's current seat and authorization state. The response includes the membership ETag for POST Reopen Member. It never returns an authorization code or a Connect URL.
Endpoint
GET https://app.crosstrade.io/v1/api/partner/users/{external_id}
Headers
| Name | Required | Value |
|---|---|---|
| Authorization | Yes | Bearer <partner access token> with partner:read (also implied by partner:provision) |
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
external_id | string | Yes | Your member id: 1–64 letters, digits, periods, underscores or hyphens |
No query parameters or request body.
Code examples
Set PARTNER_TOKEN and replace th_8831 with your member's external id.
- Python
- JavaScript
- cURL
import json
import os
import requests
external_id = "th_8831"
response = requests.get(
f"https://app.crosstrade.io/v1/api/partner/users/{external_id}",
headers={"Authorization": f"Bearer {os.environ['PARTNER_TOKEN']}"},
timeout=15,
)
response.raise_for_status()
print("ETag:", response.headers.get("ETag"))
print(json.dumps(response.json(), indent=2))
const externalId = "th_8831";
const response = await fetch(
`https://app.crosstrade.io/v1/api/partner/users/${encodeURIComponent(externalId)}`,
{ headers: { Authorization: `Bearer ${process.env.PARTNER_TOKEN}` } },
);
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
console.log("ETag:", response.headers.get("etag"));
console.log(JSON.stringify(await response.json(), null, 2));
curl -sS -i "https://app.crosstrade.io/v1/api/partner/users/th_8831" \
-H "Authorization: Bearer $PARTNER_TOKEN"
Response
200 OK, with ETag: "v1" in this example. See the member field reference.
{
"success": true,
"member": {
"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
},
"events_high_water": 42
},
"meta": {
"requestId": "preq_5e4d3c2b1a0f9e87",
"etag": "\"v1\""
}
}
connected records an approved authorization. grant.active reports whether the grant remains active; neither field proves the member's access token or broker session is currently usable. Use GET Member Broker Status for stored connection health.
Errors
| Status | Error | Meaning |
|---|---|---|
| 400 | validation_failed | Malformed external id, 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 |
| 404 | member_not_found | No member with that external id under your partner |
| 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.