Asset Data
Acknowledge Asset Data
Build the transaction that records the lender of record approval of an asset data version
POST
/
lending-external-securities-v2
/
api
/
markets
/
{market}
/
asset-data
/
acknowledge
curl -X POST "https://api.trusset.org/lending-external-securities-v2/api/markets/0x70a0e25c7b768b87e658348b3b577678a173e038/asset-data/acknowledge" \
-H "X-API-Key: trusset_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "contentHash": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a" }'
const base = 'https://api.trusset.org/lending-external-securities-v2/api/markets';
const headers = { 'X-API-Key': 'trusset_your_key_here', 'Content-Type': 'application/json' };
const build = await fetch(`${base}/${marketAddress}/asset-data/acknowledge`, {
method: 'POST',
headers,
body: JSON.stringify({ contentHash: reviewedHash })
});
const { success, data, error } = await build.json();
if (!success) throw new Error(`${error.code}: ${error.message}`);
const tx = await wallet.sendTransaction(data.transaction);
await tx.wait();
await fetch(`${base}/${marketAddress}/asset-data/acknowledge/confirm`, {
method: 'POST',
headers,
body: JSON.stringify({ txHash: tx.hash })
});
{
"success": true,
"data": {
"action": "SIGN_TRANSACTION",
"transaction": {
"to": "0xf1aD12F5698F58badd8a662AcfFcCb067A2Ddb8a",
"data": "0xd780db9e00000000000000000000000070a0e25c7b768b87e658348b3b577678a173e038ba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"value": "0",
"chainId": 11155111
},
"functionName": "acknowledgeAssetData",
"marketAddress": "0x70a0e25c7b768b87e658348b3b577678a173e038",
"signer": "0x4e91a7c05d3b62f18a0c94e7db2358f1c60a4e93",
"contentHash": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"version": 2,
"attestor": "0x511f527bcee080ac9b88afbf24386baedf393948",
"attestedAt": "2026-09-20T10:15:40.000Z",
"previouslyAcknowledged": "0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb",
"schemaVersion": "1.0.0",
"bundleAvailable": true,
"confirmWith": {
"endpoint": "POST /lending-external-securities-v2/api/markets/0x70a0e25c7b768b87e658348b3b577678a173e038/asset-data/acknowledge/confirm",
"field": "txHash"
}
}
}
{
"success": false,
"data": null,
"error": {
"code": "ASSET_DATA_STALE",
"message": "The version you reviewed (0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb) is no longer the one the issuer stands behind: version 2 (0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a) was attested at 2026-09-20T10:15:40.000Z. Read the current bundle again and approve that one; the factory refuses an acknowledgement of a version that no longer stands.",
"details": {
"reviewed": "0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb",
"standing": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"standingVersion": 2,
"attestedAt": "2026-09-20T10:15:40.000Z"
}
}
}
Returns the unsigned
acknowledgeAssetData transaction that records the lender of record’s approval of the asset data version it reviewed. The lender of record, or the admin it named, signs it with its own wallet and confirms it with Confirm Asset Data Acknowledgement.
Name the hash that was actually read, from Get Asset Data Bundle. The build refuses a hash that is not the standing attestation with ASSET_DATA_STALE, rather than approving whatever stands. The factory applies the same rule when the transaction mines: if the issuer re-attests in between, the acknowledgement reverts with AssetDataMismatch. Read the new bundle and acknowledge again.
An acknowledgement records a review, and the chain stores only the hash. The market contracts never read it, and no loan, liquidity or liquidation operation depends on it.
Who can acknowledge
The caller must pass the market access check described on Get Asset Data. One of this instance’s verified wallets must also be the wallet that took the lender-of-record role, or the admin it named. Any other instance is refused withNOT_ACKNOWLEDGER, and details.acknowledgers names the wallets that can sign.
Before a lender of record adopts the market there is nobody to acknowledge, and the call is refused with NOT_ADOPTED. The adoption itself can carry the first acknowledgement: name the reviewed hash as assetDataHash in the adoption terms on Accept Lender Role.
Path Parameters
string
required
The market contract address, as 40 hex characters with a
0x prefix.Body Parameters
string
required
The hash of the version reviewed, as
0x and 64 hex characters. The zero hash is refused with INVALID_CONTENT_HASH, because it names no version.Response Fields
object
Show child attributes
Show child attributes
string
SIGN_TRANSACTION.object
Unsigned transaction,
{ to, data, value, chainId }, targeting the lending factory.string
acknowledgeAssetData.string
The market, lowercased.
string
The wallet of this instance that must sign: the lender of record’s wallet when this instance holds it, otherwise the admin’s.
string
The version being acknowledged, lowercased.
integer
Its attestation version.
string
The wallet that attested it.
string
ISO 8601 time it was attested.
string
The version acknowledged before, as a hash.
null when none.string
Bundle schema of the stored bytes.
null when the platform holds none.boolean
true when the platform holds the bytes behind the hash.object
{ endpoint, field } naming the confirm route and the txHash field it takes.curl -X POST "https://api.trusset.org/lending-external-securities-v2/api/markets/0x70a0e25c7b768b87e658348b3b577678a173e038/asset-data/acknowledge" \
-H "X-API-Key: trusset_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "contentHash": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a" }'
const base = 'https://api.trusset.org/lending-external-securities-v2/api/markets';
const headers = { 'X-API-Key': 'trusset_your_key_here', 'Content-Type': 'application/json' };
const build = await fetch(`${base}/${marketAddress}/asset-data/acknowledge`, {
method: 'POST',
headers,
body: JSON.stringify({ contentHash: reviewedHash })
});
const { success, data, error } = await build.json();
if (!success) throw new Error(`${error.code}: ${error.message}`);
const tx = await wallet.sendTransaction(data.transaction);
await tx.wait();
await fetch(`${base}/${marketAddress}/asset-data/acknowledge/confirm`, {
method: 'POST',
headers,
body: JSON.stringify({ txHash: tx.hash })
});
{
"success": true,
"data": {
"action": "SIGN_TRANSACTION",
"transaction": {
"to": "0xf1aD12F5698F58badd8a662AcfFcCb067A2Ddb8a",
"data": "0xd780db9e00000000000000000000000070a0e25c7b768b87e658348b3b577678a173e038ba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"value": "0",
"chainId": 11155111
},
"functionName": "acknowledgeAssetData",
"marketAddress": "0x70a0e25c7b768b87e658348b3b577678a173e038",
"signer": "0x4e91a7c05d3b62f18a0c94e7db2358f1c60a4e93",
"contentHash": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"version": 2,
"attestor": "0x511f527bcee080ac9b88afbf24386baedf393948",
"attestedAt": "2026-09-20T10:15:40.000Z",
"previouslyAcknowledged": "0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb",
"schemaVersion": "1.0.0",
"bundleAvailable": true,
"confirmWith": {
"endpoint": "POST /lending-external-securities-v2/api/markets/0x70a0e25c7b768b87e658348b3b577678a173e038/asset-data/acknowledge/confirm",
"field": "txHash"
}
}
}
{
"success": false,
"data": null,
"error": {
"code": "ASSET_DATA_STALE",
"message": "The version you reviewed (0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb) is no longer the one the issuer stands behind: version 2 (0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a) was attested at 2026-09-20T10:15:40.000Z. Read the current bundle again and approve that one; the factory refuses an acknowledgement of a version that no longer stands.",
"details": {
"reviewed": "0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb",
"standing": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"standingVersion": 2,
"attestedAt": "2026-09-20T10:15:40.000Z"
}
}
}
Error Codes
The asset data routes report a validation failure with the first failing rule asmessage and no details list. Every access code from Get Asset Data applies here too.
| Code | HTTP | Cause |
|---|---|---|
VALIDATION_ERROR | 400 | market is not a 40-character hex address, or contentHash is missing or not 0x and 64 hex characters |
INVALID_CONTENT_HASH | 400 | contentHash is the zero hash |
NOT_ACKNOWLEDGER | 403 | No verified wallet of this instance is the lender of record or its named admin. details.acknowledgers lists who is |
MARKET_NOT_DEPLOYED | 404 | The lending factory returns no deployment for this address |
ACKNOWLEDGEMENT_CURRENT | 409 | The standing version is already the acknowledged one. details carries contentHash and version |
ASSET_DATA_NONE | 409 | Nothing has been attested on the market, so there is no version to acknowledge |
ASSET_DATA_STALE | 409 | The reviewed hash is not the standing attestation. details carries reviewed, standing, standingVersion and attestedAt |
FACTORY_UPGRADE_REQUIRED | 409 | The factory implementation predates asset data attestation |
NOT_ADOPTED | 409 | The market has no lender of record yet. Acknowledge inside the adoption instead |
ACKNOWLEDGE_BUILD_FAILED | 500 | The transaction could not be built for a reason the service did not classify |
FACTORY_READ_FAILED | 503 | The factory could not be read. Retry shortly |
⌘I
curl -X POST "https://api.trusset.org/lending-external-securities-v2/api/markets/0x70a0e25c7b768b87e658348b3b577678a173e038/asset-data/acknowledge" \
-H "X-API-Key: trusset_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "contentHash": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a" }'
const base = 'https://api.trusset.org/lending-external-securities-v2/api/markets';
const headers = { 'X-API-Key': 'trusset_your_key_here', 'Content-Type': 'application/json' };
const build = await fetch(`${base}/${marketAddress}/asset-data/acknowledge`, {
method: 'POST',
headers,
body: JSON.stringify({ contentHash: reviewedHash })
});
const { success, data, error } = await build.json();
if (!success) throw new Error(`${error.code}: ${error.message}`);
const tx = await wallet.sendTransaction(data.transaction);
await tx.wait();
await fetch(`${base}/${marketAddress}/asset-data/acknowledge/confirm`, {
method: 'POST',
headers,
body: JSON.stringify({ txHash: tx.hash })
});
{
"success": true,
"data": {
"action": "SIGN_TRANSACTION",
"transaction": {
"to": "0xf1aD12F5698F58badd8a662AcfFcCb067A2Ddb8a",
"data": "0xd780db9e00000000000000000000000070a0e25c7b768b87e658348b3b577678a173e038ba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"value": "0",
"chainId": 11155111
},
"functionName": "acknowledgeAssetData",
"marketAddress": "0x70a0e25c7b768b87e658348b3b577678a173e038",
"signer": "0x4e91a7c05d3b62f18a0c94e7db2358f1c60a4e93",
"contentHash": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"version": 2,
"attestor": "0x511f527bcee080ac9b88afbf24386baedf393948",
"attestedAt": "2026-09-20T10:15:40.000Z",
"previouslyAcknowledged": "0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb",
"schemaVersion": "1.0.0",
"bundleAvailable": true,
"confirmWith": {
"endpoint": "POST /lending-external-securities-v2/api/markets/0x70a0e25c7b768b87e658348b3b577678a173e038/asset-data/acknowledge/confirm",
"field": "txHash"
}
}
}
{
"success": false,
"data": null,
"error": {
"code": "ASSET_DATA_STALE",
"message": "The version you reviewed (0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb) is no longer the one the issuer stands behind: version 2 (0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a) was attested at 2026-09-20T10:15:40.000Z. Read the current bundle again and approve that one; the factory refuses an acknowledgement of a version that no longer stands.",
"details": {
"reviewed": "0x65ed3a41511863cfbeacd3617041f1ccfcf281ab1a29bd7c08002a15cb427ccb",
"standing": "0xba94f849b5852511dd4cc5a0d2cf10d2edbd51d27a69f4f434db122b5fbb0f1a",
"standingVersion": 2,
"attestedAt": "2026-09-20T10:15:40.000Z"
}
}
}
