curl --request POST \
--url https://aropay.aro.media/api/v1/transfer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"walletId": "ckwlt0001abcd",
"to": "0x52aE1b7c86D2f1e9021a1B4a9c3B8d55E37F9021",
"amount": "25",
"type": "private"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
walletId: 'ckwlt0001abcd',
to: '0x52aE1b7c86D2f1e9021a1B4a9c3B8d55E37F9021',
amount: '25',
type: 'private'
})
};
fetch('https://aropay.aro.media/api/v1/transfer', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://aropay.aro.media/api/v1/transfer"
payload = {
"walletId": "ckwlt0001abcd",
"to": "0x52aE1b7c86D2f1e9021a1B4a9c3B8d55E37F9021",
"amount": "25",
"type": "private"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"data": {
"transaction": {
"id": "cktxn0003abcd",
"type": "PRIVATE_TRANSFER",
"status": "QUEUED",
"chainId": 11155111,
"amount": "25.00",
"token": "cAROUSD",
"txHash": null,
"settlementTxHash": null,
"explorerUrl": null,
"fromAddress": "0x8Ba1f109551bD432803012645Ac136ddd64DBA72",
"toAddress": "0x52aE1b7c86D2f1e9021a1B4a9c3B8d55E37F9021",
"counterparty": null,
"walletId": "ckwlt0001abcd",
"error": null,
"errorCode": null,
"metadata": null,
"createdAt": "2026-08-13T09:45:00.000Z",
"updatedAt": "2026-08-13T09:45:00.000Z"
}
}
}{
"ok": false,
"error": {
"code": "invalid_recipient",
"message": "Recipient must be a valid address."
}
}{
"ok": false,
"error": {
"code": "invalid_api_key",
"message": "Invalid API key."
}
}{
"ok": false,
"error": {
"code": "account_disabled",
"message": "This account is disabled."
}
}{
"ok": false,
"error": {
"code": "not_found",
"message": "Resource not found."
}
}{
"ok": false,
"error": {
"code": "rate_limited",
"message": "Too many requests. Try again shortly."
}
}{
"ok": false,
"error": {
"code": "internal_error",
"message": "An unexpected error occurred."
}
}{
"ok": false,
"error": {
"code": "fhe_credentials_missing",
"message": "Confidential operations are disabled until FHE relayer credentials are configured."
}
}Transfer funds
Send from a custodial wallet on either rail: type: "public" is a
standard ERC-20 stablecoin transfer; type: "private" is a cAROUSD
confidentialTransfer whose amount is FHE-encrypted on-chain.
Asynchronous: returns 201 immediately with the transaction in status
QUEUED (txHash: null); a background worker signs and broadcasts it
(PENDING) and tracks the receipt. Poll GET /transactions/{id}
until status is CONFIRMED or FAILED. Execution failures surface
as status FAILED with errorCode on the transaction (e.g.
transfer_failed, insufficient_balance,
insufficient_confidential_balance), not as an HTTP error.
curl --request POST \
--url https://aropay.aro.media/api/v1/transfer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"walletId": "ckwlt0001abcd",
"to": "0x52aE1b7c86D2f1e9021a1B4a9c3B8d55E37F9021",
"amount": "25",
"type": "private"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
walletId: 'ckwlt0001abcd',
to: '0x52aE1b7c86D2f1e9021a1B4a9c3B8d55E37F9021',
amount: '25',
type: 'private'
})
};
fetch('https://aropay.aro.media/api/v1/transfer', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://aropay.aro.media/api/v1/transfer"
payload = {
"walletId": "ckwlt0001abcd",
"to": "0x52aE1b7c86D2f1e9021a1B4a9c3B8d55E37F9021",
"amount": "25",
"type": "private"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"data": {
"transaction": {
"id": "cktxn0003abcd",
"type": "PRIVATE_TRANSFER",
"status": "QUEUED",
"chainId": 11155111,
"amount": "25.00",
"token": "cAROUSD",
"txHash": null,
"settlementTxHash": null,
"explorerUrl": null,
"fromAddress": "0x8Ba1f109551bD432803012645Ac136ddd64DBA72",
"toAddress": "0x52aE1b7c86D2f1e9021a1B4a9c3B8d55E37F9021",
"counterparty": null,
"walletId": "ckwlt0001abcd",
"error": null,
"errorCode": null,
"metadata": null,
"createdAt": "2026-08-13T09:45:00.000Z",
"updatedAt": "2026-08-13T09:45:00.000Z"
}
}
}{
"ok": false,
"error": {
"code": "invalid_recipient",
"message": "Recipient must be a valid address."
}
}{
"ok": false,
"error": {
"code": "invalid_api_key",
"message": "Invalid API key."
}
}{
"ok": false,
"error": {
"code": "account_disabled",
"message": "This account is disabled."
}
}{
"ok": false,
"error": {
"code": "not_found",
"message": "Resource not found."
}
}{
"ok": false,
"error": {
"code": "rate_limited",
"message": "Too many requests. Try again shortly."
}
}{
"ok": false,
"error": {
"code": "internal_error",
"message": "An unexpected error occurred."
}
}{
"ok": false,
"error": {
"code": "fhe_credentials_missing",
"message": "Confidential operations are disabled until FHE relayer credentials are configured."
}
}Authorizations
AroPay API key, sent as Authorization: Bearer aro_sk_…. Created in
the dashboard under Settings → API keys. Takes precedence over a
session cookie when both are present.