> This page is for Taurus PROTECT, version v3.56.
> For other versions, use one of these documentation indexes:
> - v3.58 (default): https://taurushq.ferndocs.com/protect-capital/v3.58/llms.txt
> - v3.56: https://taurushq.ferndocs.com/protect-capital/v3.56/llms.txt
> - v3.54: https://taurushq.ferndocs.com/protect-capital/v3.54/llms.txt
> - v3.52: https://taurushq.ferndocs.com/protect-capital/v3.52/llms.txt
> - v3.50: https://taurushq.ferndocs.com/protect-capital/v3.50/llms.txt
> - v3.48: https://taurushq.ferndocs.com/protect-capital/v3.48/llms.txt
> - v3.46: https://taurushq.ferndocs.com/protect-capital/v3.46/llms.txt
> - v3.44: https://taurushq.ferndocs.com/protect-capital/v3.44/llms.txt
> - v3.42: https://taurushq.ferndocs.com/protect-capital/v3.42/llms.txt
> - v3.40: https://taurushq.ferndocs.com/protect-capital/v3.40/llms.txt
> - v3.38: https://taurushq.ferndocs.com/protect-capital/v3.38/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://taurushq.ferndocs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://taurushq.ferndocs.com/_mcp/server.

# Get a single asset operation

GET https://your-protect-instance.example.com/api/rest/v2/assets/{assetID}/operations/{id}

Returns one operation by its UUID, scoped to the asset in the URL. 404 if the operation doesn't belong to that asset.

Reference: https://taurushq.ferndocs.com/protect-capital/reference/assets-v2/get-asset-operation-v-2

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Path parameters

- `assetID` (string, required) — assetID scopes the operation in the URL; the server checks the operation actually belongs to this asset and 404s otherwise.
- `id` (string, required)

## Response

### 200

A successful response.

- `result` (tgvalidatordAssetOperationV2, optional) — AssetOperationV2 is a record of a, asset lifecycle change.

## Errors

### 400 Bad Request Error

Bad Request: indicates that the server cannot or will not process the request due to something that is perceived to be a client error (for example, malformed request syntax, invalid request message framing, or deceptive request routing)

- `any`

### 401 Unauthorized Error

Unauthorized: indicates that the client request has not been completed because it lacks valid authentication credentials for the requested resource

- `any`

### 403 Forbidden Error

Forbidden: indicates that the server understands the request but refuses to authorize it

- `any`

### 404 Not Found Error

Not Found: indicates that the server cannot find the requested resource

- `any`

### 500 Internal Server Error

Internal Server Error: indicates that the server encountered an unexpected condition that prevented it from fulfilling the request

- `any`

### 503 Service Unavailable Error

Service Unavailable: indicates that the server is not ready to handle the request.

- `any`

## Types

### tgvalidatordAssetOperationV2

AssetOperationV2 is a record of a, asset lifecycle change.

- `id` (string, optional)
- `assetID` (string, optional)
- `type` (enum, optional)
  - Allowed values: `ASSET_OPERATION_TYPE_V2_CREATE`, `ASSET_OPERATION_TYPE_V2_UPDATE`, `ASSET_OPERATION_TYPE_V2_IMPORT`, `ASSET_OPERATION_TYPE_V2_MINT`, `ASSET_OPERATION_TYPE_V2_BURN`, `ASSET_OPERATION_TYPE_V2_PAUSE`, `ASSET_OPERATION_TYPE_V2_UNPAUSE`, `ASSET_OPERATION_TYPE_V2_PAUSE_ACCOUNT`, `ASSET_OPERATION_TYPE_V2_UNPAUSE_ACCOUNT`, `ASSET_OPERATION_TYPE_V2_SET_KYC`
- `status` (enum, optional) — AssetOperationStatusV2 is the consumer-facing lifecycle status of an operation. Two non-terminal values: - PENDING: system is making progress automatically; consumer should wait. - PAUSED: action required from the operation initiator (or an operator) before progress can resume — see AssetOperationV2.blockingReason for the machine-readable cause. Three terminal values: COMPLETED, FAILED, CANCELED.
  - Allowed values: `ASSET_OPERATION_STATUS_V2_PENDING`, `ASSET_OPERATION_STATUS_V2_PAUSED`, `ASSET_OPERATION_STATUS_V2_COMPLETED`, `ASSET_OPERATION_STATUS_V2_FAILED`, `ASSET_OPERATION_STATUS_V2_CANCELED`
- `createdAt` (datetime, optional)
- `updatedAt` (datetime, optional)
- `initiatedByAddressID` (string, optional) — Internal address that initiated this operation.
- `failureReason` (enum, optional) — AssetOperationFailureReasonV2 is the machine-readable cause when an operation reaches the FAILED terminal status. Free-form failure messages are not surfaced on the wire; consumers should switch on this enum. Two-tier: UNSPECIFIED means not failed; UNKNOWN is the catch-all for failed-with-no-typed-code; specific reasons grow as concrete cases are wired through from the underlying workflows. - ASSET_OPERATION_FAILURE_REASON_V2_UNKNOWN: Failed, but no typed code is available - ASSET_OPERATION_FAILURE_REASON_V2_INTERNAL_ERROR: Specific: a system/internal error occurred. - ASSET_OPERATION_FAILURE_REASON_V2_REQUEST_REJECTED: The underlying approval request was rejected by an approver. - ASSET_OPERATION_FAILURE_REASON_V2_REQUEST_FAILED: The underlying request terminated in failure for some non-rejection reason (expired, timed out, on-chain failure, ...). - ASSET_OPERATION_FAILURE_REASON_V2_SOURCE_ADDRESS_ON_INVALID_CURRENCY: The source address passed to the operation is registered for a different currency than the asset. One must retry with the address tied to the asset's currency. - ASSET_OPERATION_FAILURE_REASON_V2_SOURCE_ADDRESS_NOT_ASSET_ISSUER: The source address isn't the asset's on-chain issuer (the per-chain name varies. Only the issuer can mint or burn the asset. - ASSET_OPERATION_FAILURE_REASON_V2_DESTINATION_ADDRESS_ON_INVALID_CURRENCY: The destination is an internal address registered for a different currency than the asset. Symmetric with the source variant — retry with the address tied to the asset's currency. - ASSET_OPERATION_FAILURE_REASON_V2_DESTINATION_ADDRESS_INVALID: The destination is otherwise unusable: a WLA on the wrong chain or network, malformed on-chain address, no destination provided, or a chain-specific invariant violated. Retry with a destination that matches the asset's chain and the operation's constraints. - ASSET_OPERATION_FAILURE_REASON_V2_NOT_ENOUGH_FUNDS: The source address doesn't hold enough of the asset itself for the operation (e.g. trying to burn more than the source holds). - ASSET_OPERATION_FAILURE_REASON_V2_NOT_ENOUGH_FUNDS_FOR_FEES: The source has enough of the asset but not enough of the chain's native fee currency to broadcast. Top up the fee currency. - ASSET_OPERATION_FAILURE_REASON_V2_FORBIDDEN_BY_BUSINESS_RULE: A governance/business rule forbade the request (amount over a limit, currency disabled, outside business hours/days, ...). The request is well-formed but policy forbids it. - ASSET_OPERATION_FAILURE_REASON_V2_INVALID_PARAMETERS: Request parameters were rejected at creation (zero amount, a currency that doesn't support the operation, malformed source/destination selection, ...). A general parameter validation failure.
  - Allowed values: `ASSET_OPERATION_FAILURE_REASON_V2_UNKNOWN`, `ASSET_OPERATION_FAILURE_REASON_V2_INTERNAL_ERROR`, `ASSET_OPERATION_FAILURE_REASON_V2_REQUEST_REJECTED`, `ASSET_OPERATION_FAILURE_REASON_V2_REQUEST_FAILED`, `ASSET_OPERATION_FAILURE_REASON_V2_SOURCE_ADDRESS_ON_INVALID_CURRENCY`, `ASSET_OPERATION_FAILURE_REASON_V2_SOURCE_ADDRESS_NOT_ASSET_ISSUER`, `ASSET_OPERATION_FAILURE_REASON_V2_DESTINATION_ADDRESS_ON_INVALID_CURRENCY`, `ASSET_OPERATION_FAILURE_REASON_V2_DESTINATION_ADDRESS_INVALID`, `ASSET_OPERATION_FAILURE_REASON_V2_NOT_ENOUGH_FUNDS`, `ASSET_OPERATION_FAILURE_REASON_V2_NOT_ENOUGH_FUNDS_FOR_FEES`, `ASSET_OPERATION_FAILURE_REASON_V2_FORBIDDEN_BY_BUSINESS_RULE`, `ASSET_OPERATION_FAILURE_REASON_V2_INVALID_PARAMETERS`
- `blockingReason` (enum, optional) — AssetOperationBlockingReasonV2 is the machine-readable cause when an operation is in the PAUSED non-terminal status. Distinct from FailureReason: a paused operation is alive and resumable once the blocker is cleared. Two-tier same as FailureReason: UNSPECIFIED means not paused; UNKNOWN is the catch-all for paused-with-no-typed-code; specific reasons grow as concrete cases land. - ASSET_OPERATION_BLOCKING_REASON_V2_UNKNOWN: Paused, but no typed code is available. - ASSET_OPERATION_BLOCKING_REASON_V2_MISSING_GOVERNANCE_RULE: Governance rule missing to complete the operations. - ASSET_OPERATION_BLOCKING_REASON_V2_MANUAL_PAUSE: Operation has been manually paused. - ASSET_OPERATION_BLOCKING_REASON_V2_AWAITING_REQUEST_APPROVAL: Awaiting human approval on a deployment / mint / burn / etc. request (the HandleRequestWorkflow's PENDING state). - ASSET_OPERATION_BLOCKING_REASON_V2_AWAITING_WHITELIST_APPROVAL: Awaiting approval of a whitelisted-address record for the asset. - ASSET_OPERATION_BLOCKING_REASON_V2_AWAITING_CURRENCY_PRICE: Operation blocked because no price is set for the asset's currency. - ASSET_OPERATION_BLOCKING_REASON_V2_AWAITING_MANUAL_WHITELIST: The auto-generated whitelist proposal was rejected by an approver; the asset is on-chain but the workflow waits for someone to manually create + approve a whitelist (which resumes the flow). - ASSET_OPERATION_BLOCKING_REASON_V2_WHITELIST_PARAMS_CONFLICT: The automatic whitelist was rejected for invalid parameters (most commonly the name/symbol is already whitelisted for another token) while the asset is on-chain. An operator must whitelist the token manually with different parameters (e.g. a different symbol), which then resumes the flow.
  - Allowed values: `ASSET_OPERATION_BLOCKING_REASON_V2_UNKNOWN`, `ASSET_OPERATION_BLOCKING_REASON_V2_MISSING_GOVERNANCE_RULE`, `ASSET_OPERATION_BLOCKING_REASON_V2_MANUAL_PAUSE`, `ASSET_OPERATION_BLOCKING_REASON_V2_AWAITING_REQUEST_APPROVAL`, `ASSET_OPERATION_BLOCKING_REASON_V2_AWAITING_WHITELIST_APPROVAL`, `ASSET_OPERATION_BLOCKING_REASON_V2_AWAITING_CURRENCY_PRICE`, `ASSET_OPERATION_BLOCKING_REASON_V2_AWAITING_MANUAL_WHITELIST`, `ASSET_OPERATION_BLOCKING_REASON_V2_WHITELIST_PARAMS_CONFLICT`
- `create` (tgvalidatordCreateOperationDetailsV2, optional)
- `update` (tgvalidatordUpdateOperationDetailsV2, optional) — UpdateOperationDetailsV2 records what an update operation *requested* — the off-chain label/price and the on-chain params. This is the immutable audit of the requested change, distinct from the asset's realized state on the AssetView (which reflects the on-chain result once the operation completes).
- `import` (tgvalidatordImportOperationDetailsV2, optional)
- `mint` (tgvalidatordMintOperationDetailsV2, optional)
- `burn` (tgvalidatordBurnOperationDetailsV2, optional)
- `pause` (tgvalidatordPauseOperationDetailsV2, optional)
- `unpause` (tgvalidatordUnpauseOperationDetailsV2, optional)
- `pauseAccount` (tgvalidatordPauseAccountOperationDetailsV2, optional)
- `unpauseAccount` (tgvalidatordUnpauseAccountOperationDetailsV2, optional)
- `setKyc` (tgvalidatordSetKYCOperationDetailsV2, optional)

### tgvalidatordCreateOperationDetailsV2

- `label` (string, optional)
- `price` (string, optional)
- `decimals` (string, optional)
- `params` (tgvalidatordAssetParamsV2, optional) — AssetParamsV2 carries blockchain-specific params for asset creation. Exactly one branch must be set.
- `blockchain` (string, optional) — Blockchain/network/assetType the asset is being created on. Frozen at request time; carried on the op row so consumers can see the deployment target without joining AssetResourceV2.
- `network` (string, optional)
- `assetType` (string, optional)

### tgvalidatordUpdateOperationDetailsV2

UpdateOperationDetailsV2 records what an update operation *requested* — the off-chain label/price and the on-chain params. This is the immutable audit of the requested change, distinct from the asset's realized state on the AssetView (which reflects the on-chain result once the operation completes).

- `label` (string, optional) — The off-chain label the operation requested.
- `price` (string, optional) — The price the operation requested.
- `params` (tgvalidatordUpdateAssetParamsV2, optional) — UpdateAssetParamsV2 mirrors AssetParamsV2's shape so callers learn one pattern. Branches for chains that don't support update today are empty messages; populating them later is non-breaking. UpdateAssetParamsV2 is the per-chain on-chain update payload — the typed change applied to the token.

### tgvalidatordImportOperationDetailsV2

- `blockchain` (string, optional)
- `network` (string, optional)
- `label` (string, optional)
- `price` (string, optional)
- `decimals` (string, optional)
- `address` (string, optional)
- `params` (tgvalidatordImportAssetParamsV2, optional) — ImportAssetParamsV2 mirrors AssetParamsV2's shape for importing an existing on-chain asset.

### tgvalidatordMintOperationDetailsV2

- `destination` (tgvalidatordAddressTargetV2, optional) — AddressTargetV2 names an address as either an internal address (managed by the platform) or a whitelisted external address. Exactly one variant must be set. Replaces v1's paired uint64 fields where mutual exclusion was a runtime invariant.
- `amount` (string, optional)
- `nftMetadata` (list of string, optional)

### tgvalidatordBurnOperationDetailsV2

- `destination` (tgvalidatordAddressTargetV2, optional) — AddressTargetV2 names an address as either an internal address (managed by the platform) or a whitelisted external address. Exactly one variant must be set. Replaces v1's paired uint64 fields where mutual exclusion was a runtime invariant.
- `amount` (string, optional)
- `nftTokenIDs` (list of string, optional)

### tgvalidatordPauseOperationDetailsV2

### tgvalidatordUnpauseOperationDetailsV2

### tgvalidatordPauseAccountOperationDetailsV2

- `target` (tgvalidatordAddressTargetV2, optional) — AddressTargetV2 names an address as either an internal address (managed by the platform) or a whitelisted external address. Exactly one variant must be set. Replaces v1's paired uint64 fields where mutual exclusion was a runtime invariant.

### tgvalidatordUnpauseAccountOperationDetailsV2

- `target` (tgvalidatordAddressTargetV2, optional) — AddressTargetV2 names an address as either an internal address (managed by the platform) or a whitelisted external address. Exactly one variant must be set. Replaces v1's paired uint64 fields where mutual exclusion was a runtime invariant.

### tgvalidatordSetKYCOperationDetailsV2

- `target` (tgvalidatordAddressTargetV2, optional) — AddressTargetV2 names an address as either an internal address (managed by the platform) or a whitelisted external address. Exactly one variant must be set. Replaces v1's paired uint64 fields where mutual exclusion was a runtime invariant.
- `status` (enum, optional)
  - Allowed values: `KYC_STATUS_V2_APPROVED`, `KYC_STATUS_V2_REVOKED`

### tgvalidatordAssetParamsV2

AssetParamsV2 carries blockchain-specific params for asset creation. Exactly one branch must be set.

- `cantonNativeTokenParams` (tgvalidatordCantonNativeTokenParamsV2, optional)

### tgvalidatordUpdateAssetParamsV2

UpdateAssetParamsV2 mirrors AssetParamsV2's shape so callers learn one pattern. Branches for chains that don't support update today are empty messages; populating them later is non-breaking. UpdateAssetParamsV2 is the per-chain on-chain update payload — the typed change applied to the token.

- `cantonUpdateNativeTokenParams` (tgvalidatordCantonUpdateNativeTokenParamsV2, optional)

### tgvalidatordImportAssetParamsV2

ImportAssetParamsV2 mirrors AssetParamsV2's shape for importing an existing on-chain asset.

- `cantonNativeTokenImportParams` (tgvalidatordCantonNativeTokenImportParamsV2, optional)

### tgvalidatordAddressTargetV2

AddressTargetV2 names an address as either an internal address (managed by the platform) or a whitelisted external address. Exactly one variant must be set. Replaces v1's paired uint64 fields where mutual exclusion was a runtime invariant.

- `addressID` (string, optional) — Internal address identifier.
- `whitelistedAddressID` (string, optional) — Whitelisted address identifier.

### tgvalidatordCantonNativeTokenParamsV2

- `instrumentID` (string, optional) — Unique on-chain identifier for the token. Used internally as the tokenID for asset whitelisting.
- `name` (string, optional) — Name used internally for asset whitelisting.
- `symbol` (string, optional) — Symbol used internally for asset whitelisting, usually the same as the instrumentID.

### tgvalidatordCantonUpdateNativeTokenParamsV2

- `requireCredentials` (boolean, optional) — Whether holders must present a credential to hold the instrument. Archives and recreates the instrument configuration with the corresponding holder requirement.

### tgvalidatordCantonNativeTokenImportParamsV2

## Examples

**Response**

```json
{
  "result": {
    "id": "string",
    "assetID": "string",
    "type": "ASSET_OPERATION_TYPE_V2_CREATE",
    "status": "ASSET_OPERATION_STATUS_V2_PENDING",
    "createdAt": "2024-01-15T09:30:00Z",
    "updatedAt": "2024-01-15T09:30:00Z",
    "initiatedByAddressID": "string",
    "failureReason": "ASSET_OPERATION_FAILURE_REASON_V2_UNKNOWN",
    "blockingReason": "ASSET_OPERATION_BLOCKING_REASON_V2_UNKNOWN",
    "create": {
      "label": "string",
      "price": "string",
      "decimals": "string",
      "params": {
        "cantonNativeTokenParams": {
          "instrumentID": "string",
          "name": "string",
          "symbol": "string"
        }
      },
      "blockchain": "string",
      "network": "string",
      "assetType": "string"
    },
    "update": {
      "label": "string",
      "price": "string",
      "params": {
        "cantonUpdateNativeTokenParams": {
          "requireCredentials": true
        }
      }
    },
    "import": {
      "blockchain": "string",
      "network": "string",
      "label": "string",
      "price": "string",
      "decimals": "string",
      "address": "string",
      "params": {
        "cantonNativeTokenImportParams": {}
      }
    },
    "mint": {
      "destination": {
        "addressID": "string",
        "whitelistedAddressID": "string"
      },
      "amount": "string",
      "nftMetadata": [
        "string"
      ]
    },
    "burn": {
      "destination": {
        "addressID": "string",
        "whitelistedAddressID": "string"
      },
      "amount": "string",
      "nftTokenIDs": [
        "string"
      ]
    },
    "pause": {},
    "unpause": {},
    "pauseAccount": {
      "target": {
        "addressID": "string",
        "whitelistedAddressID": "string"
      }
    },
    "unpauseAccount": {
      "target": {
        "addressID": "string",
        "whitelistedAddressID": "string"
      }
    },
    "setKyc": {
      "target": {
        "addressID": "string",
        "whitelistedAddressID": "string"
      },
      "status": "KYC_STATUS_V2_APPROVED"
    }
  }
}
```

**SDK Code**

```python
import requests

url = "https://your-protect-instance.example.com/api/rest/v2/assets/assetID/operations/id"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript
const url = 'https://your-protect-instance.example.com/api/rest/v2/assets/assetID/operations/id';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://your-protect-instance.example.com/api/rest/v2/assets/assetID/operations/id"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://your-protect-instance.example.com/api/rest/v2/assets/assetID/operations/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://your-protect-instance.example.com/api/rest/v2/assets/assetID/operations/id")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://your-protect-instance.example.com/api/rest/v2/assets/assetID/operations/id', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://your-protect-instance.example.com/api/rest/v2/assets/assetID/operations/id");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://your-protect-instance.example.com/api/rest/v2/assets/assetID/operations/id")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```