> ## 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.

# Claim Asset

> Calldata that delivers the asset to the buyer after full payment

> [!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).

Builds the delivery of the asset on a `REPAID` listing. Only the buyer can sign it. The asset goes to `recipient`, the buyer's own wallet unless you name another, and the listing reads `COMPLETED`.

In freeze mode the adapter unfreezes the amount in the seller's wallet and force-transfers it to the recipient. In custody mode the adapter transfers it from its own holdings. Either way the asset token checks the recipient, so the recipient must be a wallet the token admits, for example one verified on its identity register.

Before building, the API checks, in order:

1. `from` is the buyer. Any other wallet answers `409 TX_WOULD_REVERT` with `NotBuyer`, naming the buyer in the message and in `details.buyer`.
2. The asset can still be delivered. While it cannot (`assetLeg.deliverable: false`), the claim answers `409 ASSET_NOT_DELIVERABLE` with `details.assetLeg`. See [Asset leg](/endpoints/seller-financing/introduction.md#asset-leg).
3. The recipient is verified on the asset token's own identity register, when the token names one. A recipient the register answers as not verified is refused with `409 RECIPIENT_NOT_VERIFIED`, naming `recipient` and `registry`.
4. In custody mode, the token admits the delivery: the transfer from the custody adapter to the recipient is simulated, and a refusal answers `409 RECIPIENT_REFUSED` with the token's `reason`.

A check that cannot be read does not refuse the claim. The claim is then simulated from `from`, and a revert there, such as a freeze-mode forced transfer the token refuses, answers `409 TX_WOULD_REVERT` with the token's reason. Nothing is lost on any refusal: the listing stays `REPAID`. Claim again later, or name another admitted wallet. A claim stays open while the market is paused.

## Path Parameters

**marketId** `string` *required*

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

**listingId** `string` *required*

The listing's ID on the market.

## Body Parameters

**recipient** `string`

The wallet that receives the asset. It cannot be the market or its adapter. Omitted, `""` or `null`, the asset goes to `from`.

**from** `string` *required*

The buyer's wallet, which signs. Without it the answer is `400 FROM_REQUIRED`. Any other wallet answers `409 TX_WOULD_REVERT` with `NotBuyer`, `details.requiredRole: "BUYER"` and `details.buyer`.

## Response Fields

**data** `object`

**action** `string`

`SIGN_TRANSACTIONS`.

**chainId** `integer`

The chain the step is built for.

**steps** `array`

One step, `claimAsset` on the market, with `gasLimit`.

**confirmStepIndex** `integer`

`0`.

**preflight** `object`

`{ simulated: true, gasEstimate }`.

**recipient** `string`

The wallet that receives the asset.

**assetLeg** `object`

Present only when the asset leg carries a warning while the asset can still be delivered, for example a freeze partly released or a seller balance that covers fewer than all of its sold listings. As on [Get Listing](/endpoints/seller-financing/get-listing.md#response-fields).

**warning** `string`

`assetLeg.warning`, present with it.

```bash cURL theme={null}
curl -X POST "https://api.trusset.org/seller-financing/api/markets/cmsg4x7k20003sf9q1d8v6b2e/listings/4/claim-asset" \
  -H "X-API-Key: trusset_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"from": "0x09BD3f5c18488e492a7bC3C7CCfc6cc837f511e8"}'
```

```typescript TypeScript theme={null}
const res = await fetch(
  `https://api.trusset.org/seller-financing/api/markets/${marketId}/listings/${listingId}/claim-asset`,
  {
    method: 'POST',
    headers: { 'X-API-Key': 'trusset_your_key_here', 'Content-Type': 'application/json' },
    body: JSON.stringify({ from: await buyer.getAddress() })
  }
);
const { data } = await res.json();
const step = data.steps[0];
await (await buyer.sendTransaction({ to: step.to, data: step.data, value: 0, gasLimit: step.gasLimit })).wait();
```

```json Response theme={null}
{
  "success": true,
  "data": {
    "action": "SIGN_TRANSACTIONS",
    "chainId": 11155111,
    "steps": [
      {
        "to": "0xc35e5f74eC4C1dfB8cE2b8798D6161B706F9B5E1",
        "data": "0x7b0bf655...",
        "value": "0",
        "functionName": "claimAsset",
        "label": "Claim the asset of listing 4 to 0x09BD...11e8",
        "description": "Claim the asset of listing 4 to 0x09BD...11e8",
        "gasLimit": "608693",
        "chainId": 11155111
      }
    ],
    "confirmStepIndex": 0,
    "preflight": {
      "simulated": true,
      "gasEstimate": "468226"
    },
    "recipient": "0x09BD3f5c18488e492a7bC3C7CCfc6cc837f511e8"
  },
  "error": null,
  "metadata": {
    "timestamp": "2026-11-12T14:30:00.000Z",
    "requestId": "3f7c2a91-6d84-4b0e-9a15-c2e8f4d7b603",
    "instanceId": "inst_abc123"
  }
}
```

```json Error - Recipient Not Verified theme={null}
{
  "success": false,
  "data": null,
  "error": {
    "code": "RECIPIENT_NOT_VERIFIED",
    "message": "The recipient 0x7AE1c4D5B28f0E93a6c1F84b2D07E5c9a3b6f120 is not verified on the asset token's identity register 0x18dC3306C6488413aBE3706352CE2f3362F4E342, so the token refuses the delivery. Name a wallet that is verified there, or have the token's register provider verify 0x7AE1c4D5B28f0E93a6c1F84b2D07E5c9a3b6f120 first.",
    "details": {
      "recipient": "0x7AE1c4D5B28f0E93a6c1F84b2D07E5c9a3b6f120",
      "registry": "0x18dC3306C6488413aBE3706352CE2f3362F4E342"
    }
  },
  "metadata": {
    "timestamp": "2026-11-12T14:30:00.000Z",
    "requestId": "3f7c2a91-6d84-4b0e-9a15-c2e8f4d7b603",
    "instanceId": "inst_abc123"
  }
}
```

```json Error - Not the Buyer theme={null}
{
  "success": false,
  "data": null,
  "error": {
    "code": "TX_WOULD_REVERT",
    "message": "Only the buyer 0x09BD3f5c18488e492a7bC3C7CCfc6cc837f511e8 can claim the asset of listing 4; 0x3E22FdfA28e880239541d9c5B66B3b161F9ED77b is not the buyer.",
    "details": {
      "action": "asset claim",
      "error": "NotBuyer",
      "requiredRole": "BUYER",
      "buyer": "0x09BD3f5c18488e492a7bC3C7CCfc6cc837f511e8"
    }
  },
  "metadata": {
    "timestamp": "2026-11-12T14:30:00.000Z",
    "requestId": "3f7c2a91-6d84-4b0e-9a15-c2e8f4d7b603",
    "instanceId": "inst_abc123"
  }
}
```

## Error Codes

| Code | HTTP | Cause |
| - | - | - |
| `INVALID_LISTING_ID` | `400` | `listingId` is not a positive integer of up to 19 digits |
| `VALIDATION_ERROR` | `400` | An address is malformed, or the body carries another field. `error.details` names it |
| `FROM_REQUIRED` | `400` | `from` is missing. The message names who signs: the buyer of the listing |
| `MARKET_NOT_FOUND` | `404` | No market with this ID that your instance reaches on its network |
| `LISTING_NOT_FOUND` | `404` | No listing with this ID on the market |
| `INVALID_STATUS` | `409` | The listing is not `REPAID`. `details.status` names its status |
| `ASSET_NOT_DELIVERABLE` | `409` | The asset can no longer be delivered: the seller's wallet or the custody adapter holds less than the listing sold. `details.assetLeg` carries the check |
| `RECIPIENT_NOT_VERIFIED` | `409` | The recipient is not verified on the asset token's identity register. `details` carries `recipient` and `registry` |
| `RECIPIENT_REFUSED` | `409` | Custody mode: the asset token refuses the delivery from the adapter to the recipient. `details` carries `recipient` and the token's `reason`, `null` when it gave none |
| `TX_WOULD_REVERT` | `409` | The claim would revert: `NotBuyer` with `details.requiredRole` and `details.buyer`, `InvalidRecipient`, a token refusal of the recipient with the token's reason, or an adapter error such as `ForcedTransferFailed` or `TransferShortfall` |
| `CHAIN_UNAVAILABLE` | `503` | The chain could not be read. Nothing was built. Retry shortly |
| `SELLER_FINANCING_UNAVAILABLE` | `503` | The instance is a `PRODUCTION` instance or not on Ethereum |
| `CLAIM_BUILD_FAILED` | `500` | Unexpected failure. Nothing was built. Retry, or contact support with the request ID |


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