Upsert Platform Owner Fee
Creates or replaces the platform owner's default fee: the entity 2 row with no node and no setup (see Fees Overview). Only the platform owner node's own API key may call this; every other key gets 403.
The row is saved and returned at once. It is not pushed to setups that are already deployed; setups deployed afterwards resolve it at deploy time. To change what the platform owner charges a node's deployed setups, use Upsert Node Platform Owner Fee or Upsert Setup Platform Owner Fee.
Required permission: fee:upsert
Request
PUT /v2/admin/fees/platform-owner
Headers
| Name | Description |
|---|---|
Authorization | Required. Bearer <access_token> |
Content-Type | Required. application/json |
Body
| Field | Type | Required | Description |
|---|---|---|---|
value | object | Yes | The nine rates. All nine leaves are required: tokenization.asset_tokenization, tokenization.tokenized_asset_sales, tokenization.management, secondary_market.buy_order, secondary_market.sell_order, secondary_market.otc_sale, lending.borrower, lending.lending, lending.liquidation |
value.<group>.<leaf>.value | string | Yes | Rate in percent, "0" to "100", at most one decimal (for example "2.5"). See Amounts and Percentages |
categories | array or null | No | Per-asset-category overrides. An override on a parent category is applied to its leaf categories |
categories[].id | string | Yes | Category ID (24-character hex) |
categories[].value | object | Yes | Rates for this category, same shape as value |
Scope is taken from the route only: entity, node_id or platform_owner_id in the body are ignored. Any id sent inside a leaf is ignored too.
Example
curl --request PUT \
--url '{{baseUrl}}/v2/admin/fees/platform-owner' \
--header 'Authorization: Bearer <access_token>' \
--header 'Content-Type: application/json' \
--data '{
"value": {
"tokenization": {
"asset_tokenization": { "value": "1" },
"tokenized_asset_sales": { "value": "1" },
"management": { "value": "0.5" }
},
"secondary_market": {
"buy_order": { "value": "0.5" },
"sell_order": { "value": "0.5" },
"otc_sale": { "value": "0.5" }
},
"lending": {
"borrower": { "value": "0" },
"lending": { "value": "0" },
"liquidation": { "value": "0" }
}
},
"categories": null
}'
Response
{
"id": "680be1f55d63bcee848d38e8",
"entity": 2,
"value": {
"tokenization": {
"asset_tokenization": { "id": 0, "value": "1" },
"tokenized_asset_sales": { "id": 0, "value": "1" },
"management": { "id": 0, "value": "0.5" }
},
"secondary_market": {
"buy_order": { "id": 0, "value": "0.5" },
"sell_order": { "id": 0, "value": "0.5" },
"otc_sale": { "id": 0, "value": "0.5" }
},
"lending": {
"borrower": { "id": 0, "value": "0" },
"lending": { "id": 0, "value": "0" },
"liquidation": { "id": 0, "value": "0" }
}
},
"categories": null
}
Response Fields
The saved fee row, in the same shape as Get Fee by ID.
| Field | Type | Description |
|---|---|---|
id | string | Fee row ID |
entity | integer | 2 (platform owner) |
value | object | The saved rates. Each leaf is { "id": 0, "value": "<percent>" } |
categories | array or null | The saved per-category overrides, expanded to leaf categories (id, int_id, path, value) |
Errors
| Status | Code | Description |
|---|---|---|
| 400 | 10015 | Validation failed — see details. A malformed rate is reported here too |
| 400 | 10002 (domain 9) | value does not contain all nine rates |
| 400 | 10001 (domain 4) | A categories[].id does not exist |
| 403 | 10003 (domain 9) | The key is not the platform owner node's |
| 500 | 10000 | Unexpected server error |
See Errors for the error format and common codes.