Asset Data
Get Asset Data
Read the asset data attestation and acknowledgement standing on a market
GET
/
lending-external-securities-v2
/
api
/
markets
/
{market}
/
asset-data
curl "https://api.trusset.org/lending-external-securities-v2/api/markets/0x70a0e25c7b768b87e658348b3b577678a173e038/asset-data" \
-H "X-API-Key: trusset_your_key_here"
const res = await fetch(
`https://api.trusset.org/lending-external-securities-v2/api/markets/${marketAddress}/asset-data`,
{ headers: { 'X-API-Key': 'trusset_your_key_here' } }
);
const { success, data, error } = await res.json();
if (!success) throw new Error(`${error.code}: ${error.message}`);
if (data.status === 'DIVERGED' && data.viewer.canAcknowledge) {
console.log(`Version ${data.attested.version} (${data.attested.contentHash}) awaits review`);
}
{
"success": true,
"data": {
"marketAddress": "0x70a0e25c7b768b87e658348b3b577678a173e038",
"family": "FUNGIBLE",
"factory": "0xf1ad12f5698f58badd8a662acffccb067a2ddb8a",
"factorySupport": true,
"status": "DIVERGED",
"record": {
"attested": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"acknowledged": "0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb",
"attestor": "0x511f527bcee080ac9b88afbf24386baedf393948",
"version": 2,
"attestedAt": 1789899340,
"acknowledgedAt": 1789398168,
"diverged": true
},
"diverged": true,
"attested": {
"contentHash": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"version": 2,
"attestor": "0x511f527bcee080ac9b88afbf24386baedf393948",
"attestedAt": "2026-09-20T10:15:40.000Z",
"txHash": "0x94c206e7614a93e3194caffa428756827f9c0f4d042de189439ffe2f225f822f",
"schemaVersion": "1.0.0",
"bundleAvailable": true,
"storedAt": "2026-09-20T10:14:02.000Z"
},
"acknowledged": {
"contentHash": "0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb",
"version": 1,
"acknowledgedAt": "2026-09-14T15:02:48.000Z",
"txHash": "0xb5968bce29317b97e5a3df1a4b5aeef2867ceef13147c8e1aab443eb541ff8ad",
"schemaVersion": "1.0.0",
"bundleAvailable": true,
"storedAt": "2026-09-12T08:31:05.000Z"
},
"authority": {
"attestor": "0x511f527bcee080ac9b88afbf24386baedf393948",
"attestorRole": "ISSUER",
"acknowledgers": [
"0x4e91a7c05d3b62f18a0c94e7db2358f1c60a4e93",
"0x89b1dc3d25b4fbd80e4b2bdb7ed01c4560325c52"
],
"seekingCurator": false
},
"viewer": {
"wallets": ["0x4e91a7c05d3b62f18a0c94e7db2358f1c60a4e93"],
"canAttest": false,
"canAcknowledge": true
},
"profile": {
"available": true,
"imported": true,
"comparedWith": "ATTESTING_INSTANCE",
"currentHash": "0xe690b3947cde93dbad27657b035df5bede74fef7367d8cb0973e15802dbeac4b",
"schemaVersion": "1.1.0",
"changedSinceAttestation": true,
"attestedSchemaVersion": "1.0.0",
"schemaUpgrade": true,
"canReattest": false,
"note": "The standing version was attested under schema 1.0.0, which does not bind the instrument record's terms or the hashes of its documents. The data itself has not changed; re-attesting under schema 1.1.0 binds them. Only the attestor (0x511f527bcee080ac9b88afbf24386baedf393948) can attest a new version; no verified wallet of this instance is it."
},
"origin": "OWN"
},
"error": null,
"metadata": {
"timestamp": "2026-09-20T11:02:17.000Z",
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"instanceId": "inst_abc123"
}
}
{
"success": false,
"data": null,
"error": {
"code": "NOT_NOMINATED",
"message": "No verified wallet of this instance is nominated to take this market"
}
}
{
"success": false,
"data": null,
"error": {
"code": "MARKET_NOT_V2",
"message": "This market is not registered in the external securities lending v2 factory this instance deploys to (0xf1aD12F5698F58badd8a662AcfFcCb067A2Ddb8a). A market deployed through an earlier factory generation cannot be operated here; deploy it again through the current factory."
}
}
Returns a market’s asset data record: the hash of the bundle the issuer side attested and the hash the lender of record acknowledged. It also says who may write each one next, and whether this instance can. A lender of record adopting a market underwrites an asset it did not issue, described by data no contract can read. The factory makes that description attributable and tamper-evident. It does not verify it.
The record lives on the lending factory as two hashes per market. The attested hash is written only by the attestor’s own transaction and the acknowledged hash only by the lender of record’s or its admin’s own transaction. The bundle itself never goes on chain. Read its exact bytes with Get Asset Data Bundle.
This endpoint takes the market’s contract address, not its market ID.
Every other caller is refused with
A
Who can read it
The market must be registered on the v2 lending factory this instance deploys to, or the call is refused withMARKET_NOT_V2. Access then follows the lender-of-record queue, and origin in the response says which rule admitted the caller.
origin | Admitted because |
|---|---|
NOMINATED | A verified wallet of this instance is nominated on the market as candidate lender of record |
OWN | This instance holds an active record of the market, as the issuer instance that deployed it does, and the lender of record’s instance does once its adoption is confirmed |
OPEN | The market is still seeking a lender of record and is open to any. Trusset has approved this account to act as a lender of record, and the instance has a verified wallet |
NOT_NOMINATED. On an open market the refusal names what is missing instead: WALLET_NOT_CONFIGURED or CURATOR_NOT_APPROVED. The write routes check their own authority on top of this one.
Status
status | Meaning |
|---|---|
NONE | Nothing attested. version is 0 and both hashes are zero |
ATTESTED | The issuer side attested a bundle, and no lender of record has acknowledged any version |
ACKNOWLEDGED | The lender of record acknowledged the version that stands now |
DIVERGED | The lender of record acknowledged a version, and the issuer re-attested since, so the two hashes differ |
status is null when the factory record could not be read. factorySupport then says why: false for a factory implementation that predates asset data attestation, null for a read that failed.
DIVERGED is the signal a lender of record watches. The description moved after approval, and a re-attestation never removes the earlier acknowledgement. Neither the market contracts nor this API act on a divergence. Whether the new version still supports the credit already extended is the lender of record’s decision, and Acknowledge Asset Data records a new approval.
diverged is the factory’s own assetDataDiverged answer, which compares the two hashes. It also reads true on ATTESTED, where nothing was acknowledged. Branch on status.
Who writes next
The attestor follows who answers for the data at that point in the market’s life. While the market seeks a lender of record it is the wallet that deployed it (attestorRole: DEPLOYER). Once a lender of record adopts it, it is the issuer wallet that lender named in its adoption terms (ISSUER). A market whose deployer the factory never recorded has no attestor, and nobody can attest on it.
The acknowledgers are the wallet that took the lender-of-record role and the admin it named. Before adoption there are none. A lender of record can also acknowledge inside the adoption itself, by naming the reviewed hash in its adoption terms on Accept Lender Role.
Path Parameters
string
required
The market contract address, as 40 hex characters with a
0x prefix.Response Fields
object
Show child attributes
Show child attributes
string
The market, lowercased.
string
FUNGIBLE on this surface.string
The lending factory that holds the record, lowercased.
boolean
true when the factory records asset data attestations, false when its implementation predates them, null when it could not be read.string
NONE, ATTESTED, ACKNOWLEDGED or DIVERGED. null when the record could not be read.object
The factory’s answer, unprocessed.
null when it could not be read.Show child attributes
Show child attributes
string
Standing attested hash. The zero hash when nothing was attested.
string
Acknowledged hash. The zero hash when nothing was acknowledged.
string
Wallet that wrote the standing attestation, lowercased.
null when there is none.integer
Number of attestations made on the market.
0 when none.integer
Unix seconds of the standing attestation.
null when there is none.integer
Unix seconds of the acknowledgement.
null when there is none.boolean
The factory’s
assetDataDiverged.boolean
Same as
record.diverged. null when the record could not be read.object
The standing attestation.
null when there is none.Show child attributes
Show child attributes
string
The attested hash.
integer
Its version.
string
Wallet that attested it.
string
ISO 8601 time of the attestation.
string
Transaction that wrote it, when a platform record or the index knows it. Otherwise
null.string
Bundle schema of the stored bytes.
null without them.boolean
true when the platform stores the exact bytes behind this hash. A hash attested with bytes prepared elsewhere has none.string
When the bytes were stored.
null without them.object
The acknowledgement.
null when there is none. Carries contentHash, version, acknowledgedAt, txHash, schemaVersion, bundleAvailable and storedAt, read the same way as attested. version is the attestation version of the acknowledged bundle as the platform recorded it, and null when it has no record of it.object
Show child attributes
Show child attributes
string
Wallet the factory admits as attestor right now.
null when nobody can attest.string
DEPLOYER while the market seeks a lender of record, ISSUER after adoption.array
Wallets that may acknowledge: the lender of record and the admin it named. Empty before adoption.
boolean
Whether the market is still seeking a lender of record.
object
object
Whether the data behind the standing attestation still hashes to it. The bundle is rebuilt from the token as the attesting instance holds it: the instance that stored the attested bytes, or this instance when no bytes are stored.
null when that token import could not be read.Show child attributes
Show child attributes
boolean
false when the token is not imported and active there, its profile is empty, or no bundle could be built from it.boolean
Whether the compared instance holds an active import of the collateral token.
null when the attesting instance holds none.string
THIS_INSTANCE or ATTESTING_INSTANCE: whose data was rebuilt.string
The hash that data would attest now.
null when unavailable.string
The schema
currentHash was built under. Present when available is true.boolean
true when an attestation stands and currentHash differs from it.string
The schema the standing attestation’s bytes were stored under,
null without them. Present when available is true.boolean
true when the data is unchanged and only the schema differs: the standing version was attested under 1.0.0, which binds neither the instrument record’s terms nor the hashes of its documents. Present when available is true.boolean
Whether one of this instance’s verified wallets is the attestor. Present when
available is true.string
What a change means and who can re-attest it. Present when the hashes differ, or when
thisInstance.differsFromAttestedData is true.object
Present when the attesting instance’s data was compared and this instance holds the attestor wallet.
currentHash and schemaVersion of the bundle this instance’s own data produces, differsFromStanding, and differsFromAttestedData. When the last one is true, a re-attestation from this instance publishes different data than the one attested, and note says so.string
Why the profile is unavailable. Present when
available is false.string
profile compares against the data the issuer actually attested, whichever instance reads it. changedSinceAttestation: true means the token’s profile or instrument record changed since the attestation, or the attestation was made under schema 1.0.0, and a re-attestation is due. Only the attestor can make it, with Attest Asset Data.
curl "https://api.trusset.org/lending-external-securities-v2/api/markets/0x70a0e25c7b768b87e658348b3b577678a173e038/asset-data" \
-H "X-API-Key: trusset_your_key_here"
const res = await fetch(
`https://api.trusset.org/lending-external-securities-v2/api/markets/${marketAddress}/asset-data`,
{ headers: { 'X-API-Key': 'trusset_your_key_here' } }
);
const { success, data, error } = await res.json();
if (!success) throw new Error(`${error.code}: ${error.message}`);
if (data.status === 'DIVERGED' && data.viewer.canAcknowledge) {
console.log(`Version ${data.attested.version} (${data.attested.contentHash}) awaits review`);
}
{
"success": true,
"data": {
"marketAddress": "0x70a0e25c7b768b87e658348b3b577678a173e038",
"family": "FUNGIBLE",
"factory": "0xf1ad12f5698f58badd8a662acffccb067a2ddb8a",
"factorySupport": true,
"status": "DIVERGED",
"record": {
"attested": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"acknowledged": "0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb",
"attestor": "0x511f527bcee080ac9b88afbf24386baedf393948",
"version": 2,
"attestedAt": 1789899340,
"acknowledgedAt": 1789398168,
"diverged": true
},
"diverged": true,
"attested": {
"contentHash": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"version": 2,
"attestor": "0x511f527bcee080ac9b88afbf24386baedf393948",
"attestedAt": "2026-09-20T10:15:40.000Z",
"txHash": "0x94c206e7614a93e3194caffa428756827f9c0f4d042de189439ffe2f225f822f",
"schemaVersion": "1.0.0",
"bundleAvailable": true,
"storedAt": "2026-09-20T10:14:02.000Z"
},
"acknowledged": {
"contentHash": "0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb",
"version": 1,
"acknowledgedAt": "2026-09-14T15:02:48.000Z",
"txHash": "0xb5968bce29317b97e5a3df1a4b5aeef2867ceef13147c8e1aab443eb541ff8ad",
"schemaVersion": "1.0.0",
"bundleAvailable": true,
"storedAt": "2026-09-12T08:31:05.000Z"
},
"authority": {
"attestor": "0x511f527bcee080ac9b88afbf24386baedf393948",
"attestorRole": "ISSUER",
"acknowledgers": [
"0x4e91a7c05d3b62f18a0c94e7db2358f1c60a4e93",
"0x89b1dc3d25b4fbd80e4b2bdb7ed01c4560325c52"
],
"seekingCurator": false
},
"viewer": {
"wallets": ["0x4e91a7c05d3b62f18a0c94e7db2358f1c60a4e93"],
"canAttest": false,
"canAcknowledge": true
},
"profile": {
"available": true,
"imported": true,
"comparedWith": "ATTESTING_INSTANCE",
"currentHash": "0xe690b3947cde93dbad27657b035df5bede74fef7367d8cb0973e15802dbeac4b",
"schemaVersion": "1.1.0",
"changedSinceAttestation": true,
"attestedSchemaVersion": "1.0.0",
"schemaUpgrade": true,
"canReattest": false,
"note": "The standing version was attested under schema 1.0.0, which does not bind the instrument record's terms or the hashes of its documents. The data itself has not changed; re-attesting under schema 1.1.0 binds them. Only the attestor (0x511f527bcee080ac9b88afbf24386baedf393948) can attest a new version; no verified wallet of this instance is it."
},
"origin": "OWN"
},
"error": null,
"metadata": {
"timestamp": "2026-09-20T11:02:17.000Z",
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"instanceId": "inst_abc123"
}
}
{
"success": false,
"data": null,
"error": {
"code": "NOT_NOMINATED",
"message": "No verified wallet of this instance is nominated to take this market"
}
}
{
"success": false,
"data": null,
"error": {
"code": "MARKET_NOT_V2",
"message": "This market is not registered in the external securities lending v2 factory this instance deploys to (0xf1aD12F5698F58badd8a662AcfFcCb067A2Ddb8a). A market deployed through an earlier factory generation cannot be operated here; deploy it again through the current factory."
}
}
Error Codes
The asset data routes report a validation failure with the first failing rule asmessage and no details list.
| Code | HTTP | Cause |
|---|---|---|
VALIDATION_ERROR | 400 | market is not a 0x-prefixed 40-character hex address |
CURATOR_NOT_APPROVED | 403 | The market is open to any lender of record, and this account is not approved to act as one |
NOT_NOMINATED | 403 | No verified wallet of this instance is nominated on the market, and the instance holds no record of it |
MARKET_NOT_DEPLOYED | 404 | The lending factory returns no deployment for this address |
MARKET_NOT_V2 | 404 | The address is not a market on the v2 factory this instance deploys to |
WALLET_NOT_CONFIGURED | 412 | The market is open to any lender of record, but this instance has no verified wallet |
MARKET_ACCESS_FAILED | 500 | The access check failed for a reason the service did not classify |
ASSET_DATA_READ_FAILED | 500 | The record could not be assembled for a reason the service did not classify |
FACTORY_READ_FAILED | 503 | The lending factory could not be reached to resolve the market. Retry shortly |
FACTORY_UNREADABLE | 503 | The factory could not be read to confirm the nomination. Retry shortly |
MARKET_VERIFICATION_UNAVAILABLE | 503 | The market could not be checked against the v2 factory. Retry shortly |
403 or 412 is a statement about this instance’s access to this market. A 503 says a read failed, and nothing about the market or the caller.⌘I
curl "https://api.trusset.org/lending-external-securities-v2/api/markets/0x70a0e25c7b768b87e658348b3b577678a173e038/asset-data" \
-H "X-API-Key: trusset_your_key_here"
const res = await fetch(
`https://api.trusset.org/lending-external-securities-v2/api/markets/${marketAddress}/asset-data`,
{ headers: { 'X-API-Key': 'trusset_your_key_here' } }
);
const { success, data, error } = await res.json();
if (!success) throw new Error(`${error.code}: ${error.message}`);
if (data.status === 'DIVERGED' && data.viewer.canAcknowledge) {
console.log(`Version ${data.attested.version} (${data.attested.contentHash}) awaits review`);
}
{
"success": true,
"data": {
"marketAddress": "0x70a0e25c7b768b87e658348b3b577678a173e038",
"family": "FUNGIBLE",
"factory": "0xf1ad12f5698f58badd8a662acffccb067a2ddb8a",
"factorySupport": true,
"status": "DIVERGED",
"record": {
"attested": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"acknowledged": "0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb",
"attestor": "0x511f527bcee080ac9b88afbf24386baedf393948",
"version": 2,
"attestedAt": 1789899340,
"acknowledgedAt": 1789398168,
"diverged": true
},
"diverged": true,
"attested": {
"contentHash": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"version": 2,
"attestor": "0x511f527bcee080ac9b88afbf24386baedf393948",
"attestedAt": "2026-09-20T10:15:40.000Z",
"txHash": "0x94c206e7614a93e3194caffa428756827f9c0f4d042de189439ffe2f225f822f",
"schemaVersion": "1.0.0",
"bundleAvailable": true,
"storedAt": "2026-09-20T10:14:02.000Z"
},
"acknowledged": {
"contentHash": "0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb",
"version": 1,
"acknowledgedAt": "2026-09-14T15:02:48.000Z",
"txHash": "0xb5968bce29317b97e5a3df1a4b5aeef2867ceef13147c8e1aab443eb541ff8ad",
"schemaVersion": "1.0.0",
"bundleAvailable": true,
"storedAt": "2026-09-12T08:31:05.000Z"
},
"authority": {
"attestor": "0x511f527bcee080ac9b88afbf24386baedf393948",
"attestorRole": "ISSUER",
"acknowledgers": [
"0x4e91a7c05d3b62f18a0c94e7db2358f1c60a4e93",
"0x89b1dc3d25b4fbd80e4b2bdb7ed01c4560325c52"
],
"seekingCurator": false
},
"viewer": {
"wallets": ["0x4e91a7c05d3b62f18a0c94e7db2358f1c60a4e93"],
"canAttest": false,
"canAcknowledge": true
},
"profile": {
"available": true,
"imported": true,
"comparedWith": "ATTESTING_INSTANCE",
"currentHash": "0xe690b3947cde93dbad27657b035df5bede74fef7367d8cb0973e15802dbeac4b",
"schemaVersion": "1.1.0",
"changedSinceAttestation": true,
"attestedSchemaVersion": "1.0.0",
"schemaUpgrade": true,
"canReattest": false,
"note": "The standing version was attested under schema 1.0.0, which does not bind the instrument record's terms or the hashes of its documents. The data itself has not changed; re-attesting under schema 1.1.0 binds them. Only the attestor (0x511f527bcee080ac9b88afbf24386baedf393948) can attest a new version; no verified wallet of this instance is it."
},
"origin": "OWN"
},
"error": null,
"metadata": {
"timestamp": "2026-09-20T11:02:17.000Z",
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"instanceId": "inst_abc123"
}
}
{
"success": false,
"data": null,
"error": {
"code": "NOT_NOMINATED",
"message": "No verified wallet of this instance is nominated to take this market"
}
}
{
"success": false,
"data": null,
"error": {
"code": "MARKET_NOT_V2",
"message": "This market is not registered in the external securities lending v2 factory this instance deploys to (0xf1aD12F5698F58badd8a662AcfFcCb067A2Ddb8a). A market deployed through an earlier factory generation cannot be operated here; deploy it again through the current factory."
}
}
