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.


Did this page help you?