Skip to main content

custody

The shycustody API is served by the shywire API server. Custody routes share the server with wire transfer and contract routes under the same base URL.

Base URL

Configured via shyconfig.api.base_url.

Authentication

TierEndpointsAuth
PublicPolicy, operator, SKU reads
UserPOST /custody/redemptions, balance readsBearer token
OperatorAll POST writes except redemption requestsOperator JWT + operatorMode: true

Endpoint summary

Policy

MethodPathDescription
GET/custody/policiesList all consortium policies
GET/custody/policies/currentGet the active policy
GET/custody/policies/{policy_id}Get a policy by ID
POST/custody/policiesRegister a consortium policy (operator)

Operators

MethodPathDescription
GET/custody/operatorsList registered warehouse operators
GET/custody/operators/{operator_id}Get a warehouse operator
POST/custody/operatorsRegister a warehouse operator (operator)

SKU classes

MethodPathDescription
GET/custody/skusList accepted SKU classes
GET/custody/skus/{sku_class_id}Get a SKU class
POST/custody/skusRegister a SKU class (operator)

Lots

MethodPathDescription
GET/custody/lotsList all intake lots
GET/custody/lots/{lot_id}Get a lot record
POST/custody/lotsRecord a custody intake lot (operator)

Redemptions

MethodPathDescription
GET/custody/redemptionsList redemption requests
GET/custody/redemptions/{request_id}Get a redemption request
POST/custody/redemptionsRequest a redemption (participant)
POST/custody/redemptions/settleSettle a redemption (operator)

Settlements

MethodPathDescription
GET/custody/settlementsList settlements
GET/custody/settlements/{settlement_id}Get a settlement

Demurrage

MethodPathDescription
GET/custody/demurrageList demurrage assessments
GET/custody/demurrage/{assessment_id}Get a demurrage assessment
POST/custody/demurrageApply demurrage (operator)

POST /custody/policies

Registers the consortium governance policy. Operators and SKU classes referenced by active_operator_ids and accepted_sku_class_ids must be registered first.

{
"policy_id": "policy-2026-q2",
"asset_id": "vault-gold-1",
"name": "Q2 2026 Policy",
"active_operator_ids": ["op-west"],
"accepted_sku_class_ids": ["XAU-9999"],
"unit_of_measure": "troy_oz",
"quantity_normalization": "grade_weight_nav",
"shipping_adjustment_ref": "",
"demurrage_rate_bps": 25,
"operator_fee_bps": 50,
"redemption_mode": "physical_goods_only",
"redemption_routing": "holder_chooses_warehouse",
"evidence_requirements": ["camera_session_ref", "operator_receipt_ref"],
"timestamp": 1741651200
}

POST /custody/operators

{
"operator_id": "op-west",
"name": "West Vault",
"warehouse_id": "wh-001",
"region": "us-west-2",
"video_stream_ref": "stream://wh-001",
"status": "active",
"timestamp": 1741651200
}

POST /custody/skus

{
"sku_class_id": "XAU-9999",
"name": "London Good Delivery",
"grade_band": "999.9",
"unit_of_measure": "troy_oz",
"normalized_factor_bps": 10000,
"storage_class": "standard",
"status": "active",
"timestamp": 1741651200
}

POST /custody/lots

Records a physical commodity intake lot after the warehouse operator attests receipt via shycam/shystream. minted_amount is the silo units created; quantity is the physical quantity in unit_of_measure. evidence_refs are type:id strings linking to off-chain evidence.

{
"lot_id": "lot-001",
"policy_id": "policy-2026-q2",
"asset_id": "vault-gold-1",
"operator_id": "op-west",
"warehouse_id": "wh-001",
"account_commitment": "<H(wallet_address)>",
"sku_class_id": "XAU-9999",
"quantity": 100,
"minted_amount": 1000000,
"operator_fee_amount": 500,
"shipping_cost_amount": 200,
"storage_reserve_amount": 300,
"video_session_ref": "cam-session-abc123",
"evidence_refs": ["camera_session_ref:cam-abc123", "operator_receipt_ref:rcpt-99"],
"timestamp": 1741651200
}

POST /custody/redemptions

Requests redemption. silo_amount is the silo units to burn; requested_quantity is the physical quantity expected back. Participants choose their warehouse via warehouse_id.

{
"request_id": "<H(random)>",
"asset_id": "vault-gold-1",
"account_commitment": "<H(wallet_address)>",
"warehouse_id": "wh-001",
"sku_class_id": "XAU-9999",
"silo_amount": 500000,
"requested_quantity": 50,
"destination_ref": "dock-3",
"timestamp": 1741651200
}

POST /custody/redemptions/settle

Settles after the warehouse confirms physical release. burn_amount is the silo units burned; settled_quantity is the physical quantity released.

{
"settlement_id": "<H(random)>",
"request_id": "redeem-001",
"operator_id": "op-west",
"warehouse_id": "wh-001",
"fulfillment_ref": "warehouse-release-99",
"burn_amount": 500000,
"settled_quantity": 50,
"settled_at": 1741651200
}

POST /custody/demurrage

Applies a demurrage charge against a holder's account commitment for a given storage period.

{
"assessment_id": "<H(random)>",
"asset_id": "vault-gold-1",
"account_commitment": "<H(wallet_address)>",
"policy_id": "policy-2026-q2",
"amount": 125,
"period_start": 1770000000,
"period_end": 1780000000,
"reason": "storage_fee_q2",
"applied_at": 1780000000
}