> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.immix.xyz/api-reference/trading/credentials/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.immix.xyz/_mcp/server. # Credentials **`Request — sent`** ```json title="Request — sent" { "op": "subscribe", "reqId": "", "params": { "topics": [ "credential" ] } } ``` **`Response — received`** ```json title="Response — received" { "op": "subscribe", "reqId": "", "success": true } ``` **`credential · snapshot part — received`** ```json title="credential · snapshot part — received" { "event": "credential", "msgType": "credential", "topic": "credential", "seq": "", "seqTs": "", "isSnapshot": true, "snapshotId": "", "part": 0, "last": true, "data": [ { "credentialId": 0, "credential": "", "version": "", "status": "UNKNOWN", "exchange": "", "providerKind": "UNKNOWN", "canTrade": true, "canReadBalances": true, "appGroup": "", "health": { "status": "UNKNOWN", "reason": "UNKNOWN", "sinceNs": "", "transitionAtNs": "", "reportedAtNs": "", "venueRoundTripNs": "", "detail": "" } } ] } ``` **`credential · delta — received`** ```json title="credential · delta — received" { "event": "credential", "msgType": "credential", "topic": "credential", "seq": "", "seqTs": "", "isSnapshot": false, "data": [ { "credentialId": 0, "credential": "", "version": "", "status": "UNKNOWN", "exchange": "", "providerKind": "UNKNOWN", "canTrade": true, "canReadBalances": true, "appGroup": "", "health": { "status": "UNKNOWN", "reason": "UNKNOWN", "sinceNs": "", "transitionAtNs": "", "reportedAtNs": "", "venueRoundTripNs": "", "detail": "" } } ] } ``` Each frame is its shape, read off the contract: `` stands for a value, and a union shows its first form. **URL** — No public environment serves this socket yet. **Topic** `credential` ## Request parameters | Parameter | Type | Required | Description | | ---------- | ---------------- | -------- | ----------------------------------------------------------------------------------------------- | | `op` | string | Yes | `subscribe` | | `reqId` | string | Yes | Echoed byte-exact on the answer. Printable ASCII, escape-free; anything else answers MALFORMED. | | `params` | object | Yes | | | > `topics` | array of strings | Yes | `credential` | ## Response parameters | Parameter | Type | Required | Description | | --------- | ------- | -------- | ----------------------------------------------------------------------------------------------- | | `op` | string | Yes | One of `subscribe`, `unsubscribe`. | | `reqId` | string | Yes | Echoed byte-exact on the answer. Printable ASCII, escape-free; anything else answers MALFORMED. | | `success` | boolean | Yes | `true` | ## Push data parameters Two axes, kept apart on purpose. `status` is the credential's lifecycle — what an administrator decided. `health` is what a connector observed. An approved credential whose venue is down and a suspended credential call for opposite actions, and one word could not say both. `health` is null until a report exists. **What the image holds.** Every credential of the organization this member holds, keyed by `credentialId`, as its latest image — including revoked ones. **How a row leaves.** It does not; `status` is the signal, exactly as on `account`. A revoked credential is served with its status and keeps explaining the orders and accounts that were placed through it. | Parameter | Type | Required | Description | | ------------------- | ---------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `event` | string | Yes | `credential` | | `msgType` | string | Yes | `credential` | | `topic` | string | Yes | `credential` | | `seq` | string | Yes | The stream position, as a decimal string — an int64 a JSON number would truncate. | | `seqTs` | string | Yes | The stream timestamp, epoch-ns as a decimal string. | | `isSnapshot` | boolean | Yes | One of `true`, `false`. | | `snapshotId` | string | No | **Present on a snapshot part only**, and the same on every part of one image; the next image of any topic carries a different one. **Opaque — compare it for equality and nothing else.** It is not a sequence, a version or a timestamp, and its shape may change; a client that ordered by it would be relying on how a member happens to mint it. Use it to keep two images apart. A repeat `subscribe` re-pushes the image — that is the resync, and there is no separate op — so a client can start image N+1 while N is still arriving, and without a name on each part it cannot tell which `last: true` closes which, nor stop a straggling part of N landing in the map N+1 just cleared. **Discard any part whose `snapshotId` is not the one you are currently applying.** | | `part` | integer | No | Present on a snapshot part only; 1-based. | | `last` | boolean | No | Present on a snapshot part only. The image is complete when true — including for an empty channel, which is still one part. | | `data` | array of objects | Yes | One venue credential and its observed health, keyed by `credentialId`. The row carries no secret material by construction: the register's `secretRef`, `keyFingerprint` and `venueKeyId` are not rendered here at all. | | > `credentialId` | integer | Yes | | | > `credential` | string | Yes | The credential's name. | | > `version` | string | Yes | | | > `status` | string | Yes | The LIFECYCLE — what an administrator decided. Not a health reading. One of `UNKNOWN`, `DRAFT`, `PENDING_APPROVAL`, `ACTIVE`, `SUSPENDED`, `REVOKED`. | | > `exchange` | string, nullable | Yes | Null until this member holds the credential's exchange row. | | > `providerKind` | string | Yes | One of `UNKNOWN`, `EXCHANGE`, `CUSTODIAN`, `WALLET_PROVIDER`, `CHAIN_RPC`, `BANK`. | | > `canTrade` | boolean | Yes | | | > `canReadBalances` | boolean | Yes | | | > `appGroup` | string, nullable | Yes | | | > `health` | object, nullable | Yes | What a connector OBSERVED, kept apart from `status` on purpose: an approved credential whose venue is down and a suspended credential call for opposite actions, and one word could not say both. Null until a report exists — an absent object rather than a synthetic UNKNOWN row a client would have to special-case. | > A venue credential and its observed health