curl --request POST \
--url https://aropay.aro.media/api/v1/transfer/letter/claim \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"claimCode": "7K3M-Q9TX-2ABF-H8RD-5CWN-VGP4-0J6Y",
"walletId": "ckwlt0004abcd"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({claimCode: '7K3M-Q9TX-2ABF-H8RD-5CWN-VGP4-0J6Y', walletId: 'ckwlt0004abcd'})
};
fetch('https://aropay.aro.media/api/v1/transfer/letter/claim', 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/letter/claim"
payload = {
"claimCode": "7K3M-Q9TX-2ABF-H8RD-5CWN-VGP4-0J6Y",
"walletId": "ckwlt0004abcd"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)Claim letter
Redeem a claim code into one of your wallets (custodial or
external): the escrow vault sends the letter’s cAROUSD to the wallet
with a confidentialTransfer (LETTER_CLAIM), and the letter moves
CLAIMING → CLAIMED once the receipt lands and the encrypted amount
is verified. Returns the letter (sealed amount and memo now
revealed) and the claim transaction.
Single-use and race-safe: the first claimant wins a guarded status
flip; anyone else gets 409 already_claimed. Idempotent for the same
claimant, who gets the existing claim back. Senders cannot claim their
own letters (400 cannot_claim_own_letter); they void instead. If the
release reverts or the vault cannot cover it, the letter returns to
claimable (502 claim_failed / 503 escrow_vault_underfunded). If
the release was broadcast but bookkeeping failed, the call returns
502 claim_unsettled: the letter stays CLAIMING for you, and
calling claim again returns the in-progress claim once reconciliation
lands.
Blocks up to ~20 s; a CLAIMING letter with a PENDING claim leg
finishes on later reads. Limited to 10 attempts per 15 minutes per
principal and IP, separately from the general write budget.
curl --request POST \
--url https://aropay.aro.media/api/v1/transfer/letter/claim \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"claimCode": "7K3M-Q9TX-2ABF-H8RD-5CWN-VGP4-0J6Y",
"walletId": "ckwlt0004abcd"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({claimCode: '7K3M-Q9TX-2ABF-H8RD-5CWN-VGP4-0J6Y', walletId: 'ckwlt0004abcd'})
};
fetch('https://aropay.aro.media/api/v1/transfer/letter/claim', 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/letter/claim"
payload = {
"claimCode": "7K3M-Q9TX-2ABF-H8RD-5CWN-VGP4-0J6Y",
"walletId": "ckwlt0004abcd"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)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.