Approve or reject OTC orders
A new OTC order is created in pending_approval and doesn't execute until it's approved. Approval is a separate step from creating the order, and it's meant to be done by a different user with the approve permission (an admin or owner on the tenant). This two-step control is how Gravv keeps a single person from both creating and releasing an exchange.
List orders awaiting approval
Use List pending approvals to see the orders waiting on a decision. It pages with page and items_per_page (default 20, max 100):
curl --request GET \
--url https://api.gravv.xyz/v1/fx/orders/pending-approvals \
--header 'Api-Key: <Api Key>'Approve an order
Approve with Approve order, using the order_id in the path. On approval, Gravv charges the source and the order moves to active, then completed once it settles:
curl --request POST \
--url https://api.gravv.xyz/v1/fx/orders/OTC-1737031200-AB12/approve \
--header 'Api-Key: <Api Key>'{
"data": {
"order_id": "OTC-1737031200-AB12",
"status": "active",
"approved_by_user_id": "9e3cccad-e9ae-47a0-81ee-063af0159310",
"approved_at": "2026-06-20T10:35:02.000Z"
},
"error": null
}Reject an order
Reject with Reject order. A reason is required:
curl --request POST \
--url https://api.gravv.xyz/v1/fx/orders/OTC-1737031200-AB12/reject \
--header 'Api-Key: <Api Key>' \
--header 'content-type: application/json' \
--data '
{
"reason": "Rate moved outside the agreed range"
}
'{
"data": {
"order_id": "OTC-1737031200-AB12",
"status": "rejected",
"rejected_by_user_id": "9e3cccad-e9ae-47a0-81ee-063af0159310",
"rejected_at": "2026-06-20T10:36:40.000Z",
"rejection_reason": "Rate moved outside the agreed range"
},
"error": null
}A rejected order is final. To try again, create a new order.
Updated 3 months ago
