- A to-bank order changes your USDT or USDC into a local currency. Jenzy pays the money to a bank account that you name.
- A from-bank order changes a local currency into USDT or USDC. You send a bank transfer to Jenzy. Jenzy credits the stablecoin to your balance.
Jenzy operations must enable the desk for your org. Until then, each
/v2/orders request gets 403 with the code corridor_not_enabled.Supported currencies
The desk trades USDT and USDC against these currencies:
Send and read each amount with the decimal places in the table. A
BIF
amount has no decimal places. To see the rates and the smallest order for each
currency now, read the corridors.
Read the corridors
GET /v2/orders/corridors lists the currencies of the desk, with the rate in
each direction and the smallest order.
rate_off_rampis the rate for a to-bank order.rate_on_rampis the rate for a from-bank order. Each rate is units ofassetfor one stablecoin.- A
nullrate means that the desk does not take orders in this direction now. openisfalsewhen you cannot get a quote in this corridor.minis the smallest order, on the stablecoin side.- The rate includes all costs. An order has no
feefield.
Get a quote
POST /v2/orders/quotes takes from_asset, to_asset, and one amount. Send
from_amount to fix what you pay. Send to_amount to fix what you get. Send
one of the two, not both.
- The two amounts do not change. Hermes calculates the other amount at the rate. Hermes rounds the local currency down, and the stablecoin up.
- A quote expires after 60 seconds. Read
expires_at. Do not use a fixed time in your code. - A quote is for one order. Get a new quote for each order.
- A quote holds no money. Hermes does not list quotes.
unsupported_pair (422). An amount below min gets
amount_below_minimum (422). A closed direction gets rate_unavailable
(503). When Jenzy closes the desk, a quote or a create request gets 503
with service_maintenance or service_incident. See
Errors.
Create the order
POST /v2/orders takes quote_id, client_ref, and, for a to-bank order,
beneficiary. The request needs an Idempotency-Key header.
client_refis your reference. It has a maximum of 64 characters. It must be unique across your orders. A usedclient_refgetsclient_ref_used(409).beneficiaryis the bank account that gets the money. Hermes has no list of banks for the local currencies. Write the bank name as text.beneficiaryhasname,bank_name, andaccount_number.branchis optional. Hermes keeps the text as you send it and does not check it.- A to-bank order with no
beneficiarygetsbeneficiary_required(422). - A from-bank order with a
beneficiarygetsbeneficiary_not_allowed(422).
from_amount from your stablecoin balance at once. If
your available is too low, you get insufficient_funds (402). A from-bank
order holds no money.
The response is the order. There is no webhook for the create step.
Send the request again
- The same
Idempotency-Keywith the same body returns the first response. This is the safe way to send a request again after a timeout. - The same quote with a different key gets
quote_used(409). - A quote after its
expires_atgetsquote_expired(422). Get a new quote.
Status
Each order has onestatus. The two types of order use different steps.
A to-bank order
accepted → processing → completed
A from-bank order
awaiting_instructions → awaiting_funds → proof_submitted →
funds_confirmed → completed
There is no cancel endpoint
You cannot cancel an order through the API. To stop an order, contact Jenzy operations.When an order fails
Afailed order has failure: { code, message }. The message for each
code does not change.
Refund of a to-bank order
A to-bank order can fail afterprocessing. Then the order gets a refund
object:
{ "status": "pending" }— your stablecoin comes back to you.{ "status": "returned" }— Hermes credited the stablecoin to your balance as a collection.
processing has no refund. Hermes released
the hold, and no money left your balance.
Fund a from-bank order
When the desk prepares the bank details, the order moves toawaiting_funds.
Hermes sends order.awaiting_funds. The order now has a funding block:
- Send
funding.amountinfunding.assetto the account infunding. - Write
funding.referenceon the transfer. The desk uses it to find your money. - Do these steps before
funding.deadline.deadlineandexpires_atare the same time.
expired.
Upload a funding proof
After the transfer, upload the proof of the transfer. Send the file as the request body, with itsContent-Type.
- The file must be a PDF, a JPEG, or a PNG. Hermes reads the bytes of the
file. A different file type gets
unsupported_media_type(415). - The maximum size is 10 MiB. A larger file gets
payload_too_large(413). - You can upload only when the order is
awaiting_funds. At a different time you getproof_not_expected(409). - An upload has no
Idempotency-Key. If you send the upload again after a timeout and getproof_not_expected, read the order. If the status isproof_submitted, the order has a funding proof. The portal or a different API key can also upload. To see which file the order has, download the funding proof.
proof_submitted and
proofs.funding.uploaded_at. Hermes sends order.proof_submitted.
If the desk refuses your proof, the order goes back to awaiting_funds.
Hermes sends order.awaiting_funds again. proofs.funding.rejected_reason
tells you why. Upload a new file. Hermes keeps your earlier files.
Download a funding proof
GET /v2/orders/{id}/proofs/funding returns a link to your newest proof.
expires_at, 300 seconds after the request. Send the
request again for a new link. Before you upload a proof, you get 404.
Read your orders
GET /v2/orders/{id}returns one order.GET /v2/orderslists your orders, newest first, with keyset pagination. Filter withstatus, or withasset.assetmatchesfrom_assetorto_asset.
Webhooks
Hermes sends one event for each change of status that you can see. Each delivery hasapi_version: "v2". data is the order, as
GET /v2/orders/{id} shows it. See Webhooks for the wrapper
and the signature.
- There is no event when you create an order. The response to the create request is your record.
order.refundeddoes not changestatus. The status staysfailed. Onlyrefund.statuschanges toreturned.
Receipts
The API has no receipt route. The order has all the fields of a receipt. The Jenzy portal prints a receipt for acompleted to-bank order.