> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trusset.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Role Audit

> The role assignments of a market's deployment, today's role holders and every later change, verified live

> [!NOTE]
>
> Seller Financing is in beta and runs on Ethereum Sepolia instances only for now (`DEVELOPMENT` instances on Ethereum). A `PRODUCTION` instance, or one on another network, answers `503 SELLER_FINANCING_UNAVAILABLE`. See [Seller Financing](/endpoints/seller-financing/introduction.md).

Returns the record of who received which role when the market was deployed, who holds each role now, and what changed in between. It is rebuilt on every call:

* **At deployment.** Each `RoleGranted` event the market emitted in the deployment transaction, the signer, and the market's initial parameters, read from the receipt.
* **Since.** Every `RoleGranted`, `RoleRevoked`, `IdentityRegistryUpdated` and `Upgraded` event the market emitted after the deployment transaction, read from its event log, and the implementation its ERC-1967 slot names now.
* **Now.** Every role checked live with `hasRole`: the grants of the deployment, the admin and operator named at deployment, and every account a later `RoleGranted` named. Neither the factory nor its owner may hold the admin or operator role, and that is checked too.

[Record Deployment](/endpoints/seller-financing/confirm-deployment.md) returns the same record as `auditDocument`. [Get Role Certificate](/endpoints/seller-financing/get-role-certificate.md) renders it as a PDF certificate under the same `docRef`, on the API key and in the Issuer Portal.

## Path Parameters

**marketId** `string` *required*

The market's record ID, as `id` on [List Markets](/endpoints/seller-financing/list-markets.md).

## Response Fields

**data** `object`

**docRef** `string`

`SF-` followed by 12 hex characters, derived from the chain, the market and the deployment transaction. The same market always has the same reference.

**title** `string`

`Seller Financing market deployment: role assignments`.

**chainId** `integer`

The chain.

**market** `string`

The market contract.

**adapter** `string`

Its collateral adapter.

**factory** `string`

The factory that deployed it.

**assetToken** `string`

The asset token.

**paymentToken** `string`

The payment token.

**mode** `string`

`FREEZE` or `CUSTODY`.

**collateralAgent** `string`

The collateral agent.

**identityRegistry** `string`

The market identity register the deployment set, or `null`.

**currentIdentityRegistry** `string`

The market identity register in force now, read live, or `null` when the market names none. Absent when it could not be read. `registerChanges` lists each change in between.

**repayFee** `string`

The repay fee the factory stamped, in the payment token's smallest unit.

**transaction** `object`

**hash** `string`

The deployment transaction.

**blockNumber** `integer`

Its block.

**blockHash** `string`

The block hash.

**timestamp** `integer`

The block time, in unix seconds.

**signer** `string`

The wallet that signed the deployment. For a smart-account deployment, the smart account.

**outerSender** `string`

For a smart-account deployment, the wallet that broadcast the outer transaction. `null` for a direct one.

**outerTarget** `string`

For a smart-account deployment, the contract the outer transaction called, such as the Safe or the ERC-4337 entry point. `null` for a direct one.

**status** `integer`

`1` for a successful transaction.

**assignments** `array`

Each role the market granted in the deployment transaction: `{ role, roleHash, account, grantedBy, logIndex }`. `role` is `DEFAULT_ADMIN_ROLE` or `OPERATOR_ROLE`, or the raw hash of any other role.

**atomic** `boolean`

`true` when the deployment transaction granted roles and the factory made every one of those grants. `false` when it granted none, or another account made one.

**liveVerification** `object`

The live check.

**checkedAtBlock** `integer`

The block the check ran against.

**checkedAt** `string`

ISO 8601 time of the check.

**assignments** `array`

The same grants with `holdsNow`: `true` when the account still holds the role, `false` when it was revoked or renounced, `null` when unread.

**noRoleFor** `array`

`{ account, label, holdsAdmin, holdsOperator }` for the factory (`label: "factory"`) and its owner (`label: "factory owner"`). Both read `false` on a market where Trusset holds no role. `null` means unread. When the factory's owner cannot be read, its row is left out.

**currentHolders** `array`

Today's role holders, as `{ role, roleHash, account, holdsNow }`. `holdsNow` is `true`, or `null` when that account's role could not be read; an account the chain answers `false` for is left out. `role` is `DEFAULT_ADMIN_ROLE`, `OPERATOR_ROLE` or the raw hash of another role. `null` when the holders could not be read at all.

**roleChanges** `array`

Each `RoleGranted` and `RoleRevoked` after the deployment transaction, oldest first, as `{ event, blockNumber, transactionHash, logIndex, role, roleHash, account, sender }`. `sender` is the wallet that granted or revoked.

**registerChanges** `array`

Each `IdentityRegistryUpdated`, as `{ event, blockNumber, transactionHash, logIndex, previousRegistry, newRegistry }`. A register removed or never set reads `null`.

**upgrades** `array`

Each `Upgraded` after the deployment transaction, as `{ event, blockNumber, transactionHash, logIndex, implementation }`. An upgraded implementation is not bound by the rules of the deployed one.

**implementation** `string`

The implementation the market's ERC-1967 slot names now. `null` when unread.

**history** `object`

How far the event log was read: `{ complete, fromBlock, scannedToBlock }`. `fromBlock` is the deployment block. The log is read in chunks of 10,000 blocks, at most 40 per call. `complete` is `false` when the read stopped short of the chain head or a chunk failed, so a later change may be missing from the three lists and an account granted a role there from `currentHolders`. `scannedToBlock` is `null` when nothing could be read.

> [!NOTE]
>
> `assignments` covers the grants of the deployment transaction only. A role revoked later shows there as `holdsNow: false`. A role the admin granted later is in `roleChanges` and, while held, in `currentHolders`. Check `history.complete` before you rely on either list being exhaustive.

```bash cURL theme={null}
curl "https://api.trusset.org/seller-financing/api/markets/cmsg4x7k20003sf9q1d8v6b2e/role-audit" \
  -H "X-API-Key: trusset_your_key_here"
```

```typescript TypeScript theme={null}
const res = await fetch(
  `https://api.trusset.org/seller-financing/api/markets/${marketId}/role-audit`,
  { headers: { 'X-API-Key': 'trusset_your_key_here' } }
);
const { data } = await res.json();
const trussetFree = data.liveVerification.noRoleFor.every(
  (r: { holdsAdmin: boolean | null; holdsOperator: boolean | null }) => r.holdsAdmin === false && r.holdsOperator === false
);
const operators = (data.liveVerification.currentHolders ?? [])
  .filter((h: { role: string; holdsNow: boolean | null }) => h.role === 'OPERATOR_ROLE' && h.holdsNow === true)
  .map((h: { account: string }) => h.account);
if (!data.liveVerification.history.complete) console.log('Role history read in part; call again');
```

```json Response theme={null}
{
  "success": true,
  "data": {
    "docRef": "SF-739AD00ECE63",
    "title": "Seller Financing market deployment: role assignments",
    "chainId": 11155111,
    "market": "0xc35e5f74eC4C1dfB8cE2b8798D6161B706F9B5E1",
    "adapter": "0x037B9e26D8B98aa1B1FCC321ba45A87Fc786C7Fc",
    "factory": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
    "assetToken": "0x305382e98F8e6ee24c32dF3567342E1F1DECb9b6",
    "paymentToken": "0x98aD0ca091552e23C564B41C74282e5343D03E8a",
    "mode": "FREEZE",
    "collateralAgent": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
    "identityRegistry": null,
    "currentIdentityRegistry": null,
    "repayFee": "1500000",
    "transaction": {
      "hash": "0xab2709878f3c6a93fef46c073043a8a7206fa5a164e04bf1f2cd5055da619fde",
      "blockNumber": 11943817,
      "blockHash": "0x2371180b75e06fb38b90fc899a1f982e899f316e144bd84ac4c5f372988021bd",
      "timestamp": 1792359828,
      "signer": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
      "outerSender": null,
      "outerTarget": null,
      "status": 1
    },
    "assignments": [
      {
        "role": "DEFAULT_ADMIN_ROLE",
        "roleHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
        "grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
        "logIndex": 76
      },
      {
        "role": "OPERATOR_ROLE",
        "roleHash": "0x97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929",
        "account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
        "grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
        "logIndex": 77
      }
    ],
    "atomic": true,
    "liveVerification": {
      "checkedAtBlock": 11947182,
      "checkedAt": "2026-10-19T09:07:00.512Z",
      "assignments": [
        {
          "role": "DEFAULT_ADMIN_ROLE",
          "roleHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
          "grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
          "logIndex": 76,
          "holdsNow": true
        },
        {
          "role": "OPERATOR_ROLE",
          "roleHash": "0x97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929",
          "account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895",
          "grantedBy": "0x2805394e8fCC41bB11613c95967be0104AB88b1c",
          "logIndex": 77,
          "holdsNow": true
        }
      ],
      "noRoleFor": [
        { "account": "0x2805394e8fCC41bB11613c95967be0104AB88b1c", "label": "factory", "holdsAdmin": false, "holdsOperator": false },
        { "account": "0x5Ad87a0621175206b72d10E4b8577b192e7F40aB", "label": "factory owner", "holdsAdmin": false, "holdsOperator": false }
      ],
      "currentHolders": [
        { "role": "DEFAULT_ADMIN_ROLE", "roleHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895", "holdsNow": true },
        { "role": "OPERATOR_ROLE", "roleHash": "0x97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929", "account": "0xCD421aBbA2b9b047eC069215Df5C49c97C96f895", "holdsNow": true }
      ],
      "roleChanges": [],
      "registerChanges": [],
      "upgrades": [],
      "implementation": "0xde0Dd200b23De7a21877980A75ea4143543Bab47",
      "history": { "complete": true, "fromBlock": 11943817, "scannedToBlock": 11947182 }
    }
  },
  "error": null,
  "metadata": {
    "timestamp": "2026-10-19T09:07:00.618Z",
    "requestId": "3f7c2a91-6d84-4b0e-9a15-c2e8f4d7b603",
    "instanceId": "inst_abc123"
  }
}
```

## Error Codes

| Code | HTTP | Cause |
| - | - | - |
| `MISSING_MARKET_ID` | `400` | `marketId` is longer than 100 characters |
| `MARKET_NOT_FOUND` | `404` | No market with this ID that your instance reaches on its network |
| `TX_NOT_FOUND` | `404` | The deployment transaction could not be loaded from the chain |
| `CHAIN_UNAVAILABLE` | `503` | The chain could not be read. Retry shortly |
| `SELLER_FINANCING_UNAVAILABLE` | `503` | The instance is a `PRODUCTION` instance or not on Ethereum |
| `ROLE_AUDIT_FAILED` | `500` | Unexpected failure. Retry, or contact support with the request ID |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.