List User OTC Groups
Returns the user's OTC offers collapsed to one row per token, newest token first. total_quantity sums the quantity of every offer the user made on the token that is not still awaiting chain confirmation (open, accepted, canceled and rejected offers alike). For the offers themselves, use List User OTC Offers.
A user without offers gets an empty page, not a 404.
Required permission: otc:view
Request
GET /v2/users/{user_id}/otcs
Parameters
| Name | Type | In | Description |
|---|---|---|---|
user_id | string | path | Required. User ID |
page | integer | query | Required. Page number, starting at 1 |
per_page | integer | query | Required. Items per page, 1–100 |
Headers
| Name | Description |
|---|---|
Authorization | Required. Bearer <access_token> |
Example
curl --request GET \
--url '{{baseUrl}}/v2/users/680c02896d91ca0145cfeb81/otcs?page=1&per_page=10' \
--header 'Authorization: Bearer <access_token>'
Response
{
"data": [
{
"token_id": "68ae06cfcccf4e8fc19362d1",
"total_quantity": 30,
"total_amount": "0",
"overall_profit": null,
"source": "otc",
"token": {
"name": "Sample Token",
"symbol": "Sample",
"image": "https://cdn.example.com/tokens/68ae06cfcccf4e8fc19362d1/cover.png",
"address": "0x4ecde4b1b0a8f7a5d5c1e0f1a2b3c4d5e6f78387",
"diamond_address": "0x730d22ae2267fc5b40520605868ddb48c29331a7",
"status": 6,
"category_id": "667e9251ca818a2138ed4885",
"price_symbol": "VUSD",
"is_external": false,
"is_open_to_secondary_market": true,
"is_open_to_otc": true,
"secondary_market": null,
"rate_changes": {
"hourly": null,
"daily": null,
"weekly": null,
"monthly": null,
"quarterly": null
}
}
}
],
"total": 1,
"page": 1,
"per_page": 10
}
Response Fields
The row has the same shape as List User Holdings; on this endpoint:
| Field | Type | Description |
|---|---|---|
data[].token_id | string | Token the offers are on |
data[].total_quantity | integer | Sum of quantity over the user's offers on the token (pending offers excluded) |
data[].total_amount | string | Not computed for OTC groups: always "0" |
data[].overall_profit | string | null | Not computed for OTC groups: always null |
data[].source | string | Always otc |
data[].token | object | The token: name, symbol (the token's on-chain name), image, address, diamond_address, status, category_id, price_symbol, is_external, is_open_to_secondary_market, is_open_to_otc. secondary_market is null and every rate_changes window is null on this endpoint |
total | integer | Number of tokens the user has offers on |
page | integer | Requested page |
per_page | integer | Requested page size |
Errors
| Status | Code | Description |
|---|---|---|
| 400 | 10015 | Validation failed (page, per_page) — see details |
| 500 | 10000 | Unexpected server-side failure |
See Errors for the error format and common codes.