This page covers the technical API details for your development team. For business context, see the preceding guide pages.
Endpoints
| Method | Endpoint | Description |
|---|
| GET | /api/v1/orders | List custodied orders (filterable, paginated) |
| GET | /api/v1/orders/{intent_id} | Get order by ID |
| POST | /api/v1/orders/{intent_id}/accept | Accept an order proposal (sender custodian) |
| GET | /api/v1/orders/{intent_id}/quotes | List quotes for an order |
| POST | /api/v1/orders/{intent_id}/quotes/{quote_id}/accept | Accept a quote (sender custodian) |
| GET | /api/v1/orders/events | Real-time SSE event stream |
| GET | /api/v1/dashboard/stats | Order counts and settlement volume |
All endpoints require JWT authentication (except /health and /auth/token). See Authentication and API Conventions.
Only sender custodians can accept order proposals and quotes. Receiver custodians have read-only access to orders where they are the receiving custodian.
Quick Example: Review and Accept a Quote
1. List Pending Orders
curl -H "Authorization: Bearer $TOKEN" \
"https://your-backend.example.com/api/v1/orders?status=PENDING"
{
"data": [
{
"intent_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"status": "PENDING",
"sender_party_id": "SenderInstitution::209fa2c...b341",
"sender_custodian_party_id": "SenderCustodian::209fa2c...b341",
"source_currency": "JPYSC0",
"target_amount": "100000",
"target_currency": "USDCx",
"source_amount_max": "12000000",
"created_at": "2025-03-15T09:00:00.000Z",
"expires_at": "2025-03-15T09:05:00.000Z"
}
],
"meta": { "request_id": "req_a1b2c3d4", "timestamp": "2025-03-15T09:00:01.000Z" },
"pagination": { "page": 1, "page_size": 20, "total_items": 1, "total_pages": 1 }
}
2. Review Competing Quotes
curl -H "Authorization: Bearer $TOKEN" \
"https://your-backend.example.com/api/v1/orders/f47ac10b-58cc-4372-a567-0e02b2c3d479/quotes"
{
"data": [
{
"quote_id": "a1b2c3d4-e5f6-7890-abcd-ef0123456789",
"intent_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"market_maker_party_id": "MarketMaker::c4d5e6f7...8901",
"fx_rate": "112.0",
"target_amount": "11200000",
"target_amount": "100000",
"submitted_at": "2025-03-15T09:00:08.000Z",
"valid_until": "2025-03-15T09:00:41.000Z",
"status": "PENDING"
}
],
"meta": { "request_id": "req_b2c3d4e5", "timestamp": "2025-03-15T09:00:09.000Z" },
"pagination": { "page": 1, "page_size": 20, "total_items": 1, "total_pages": 1 }
}
3. Accept the Best Quote
curl -X POST \
"https://your-backend.example.com/api/v1/orders/f47ac10b-58cc-4372-a567-0e02b2c3d479/quotes/a1b2c3d4-e5f6-7890-abcd-ef0123456789/accept" \
-H "Authorization: Bearer $TOKEN"
{
"data": {
"intent_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"status": "QUOTED",
"quote_id": "a1b2c3d4-e5f6-7890-abcd-ef0123456789",
"fx_rate": "112.0",
"source_amount_actual": "11200000",
"quote_accepted_at": "2025-03-15T09:00:11.000Z"
},
"meta": { "request_id": "req_c3d4e5f6", "timestamp": "2025-03-15T09:00:11.100Z" }
}
The order is now QUOTED. Settlement proceeds automatically and completes in ~4 seconds.
4. Verify Settlement
Poll GET /api/v1/orders/{intent_id} until status is SETTLED:
{
"data": {
"intent_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"status": "SETTLED",
"target_amount": "100000",
"source_amount_actual": "11200000",
"fx_rate": "112.0",
"transaction_hash": "a3f2c1d9e8b74f6a2c1d9e8b74f6a2c14401",
"settled_at": "2025-03-15T09:00:15.000Z"
},
"meta": { "request_id": "req_d4e5f6a7", "timestamp": "2025-03-15T09:00:15.100Z" }
}
Real-Time Events (SSE)
Connect to GET /api/v1/orders/events:
const events = new EventSource(
'https://your-backend.example.com/api/v1/orders/events'
);
events.addEventListener('order_updated', (e) => {
const order = JSON.parse(e.data);
console.log(`Order ${order.intent_id}: ${order.status}`);
});
events.addEventListener('quote_received', (e) => {
const quote = JSON.parse(e.data);
console.log(`Quote: ${quote.fx_rate} (${quote.target_amount} USDCx)`);
});
| Event | Trigger |
|---|
order_updated | A custodied order changed status |
quote_received | New quote on a sender custodian’s PENDING order |
heartbeat | Keepalive every 30 seconds |
Filter to a specific order: ?intent_id={uuid}
Full OpenAPI Specification
For complete request/response schemas, see the auto-generated Custodian API Reference.