Preview claim
curl --request POST \
--url https://aropay.aro.media/api/v1/transfer/letter/claim/preview \
--header 'Content-Type: application/json' \
--data '
{
"claimCode": "7K3M-Q9TX-2ABF-H8RD-5CWN-VGP4-0J6Y"
}
'const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({claimCode: '7K3M-Q9TX-2ABF-H8RD-5CWN-VGP4-0J6Y'})
};
fetch('https://aropay.aro.media/api/v1/transfer/letter/claim/preview', 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/preview"
payload = { "claimCode": "7K3M-Q9TX-2ABF-H8RD-5CWN-VGP4-0J6Y" }
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"data": {
"preview": {
"state": "claimable",
"amount": null,
"token": "cAROUSD",
"amountVisibility": "sealed",
"senderName": "Acme Payroll, Inc.",
"memo": null,
"expiresAt": "2026-10-22T09:45:00.000Z",
"claimedAt": null,
"chainId": 11155111
}
}
}{
"ok": false,
"error": {
"code": "invalid_claim_code",
"message": "That claim code is not valid. Check it against the letter and try again."
}
}{
"ok": false,
"error": {
"code": "letter_not_found",
"message": "Letter 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."
}
}Aro Mail
Preview claim
Public. Look up a claim code without moving money, so the claim
page can show who the letter is from and whether it is still
claimable before the recipient signs in. Sealed letters return
amount: null and memo: null; the amount is revealed by the claim
itself.
Codes are normalised before lookup (upper-cased, dashes and whitespace
removed, O→0, I→1, L→1) and checksum-verified. Limited to 60
requests per 15 minutes per IP. The response never identifies the
recipient or the letter id.
POST
/
transfer
/
letter
/
claim
/
preview
Preview claim
curl --request POST \
--url https://aropay.aro.media/api/v1/transfer/letter/claim/preview \
--header 'Content-Type: application/json' \
--data '
{
"claimCode": "7K3M-Q9TX-2ABF-H8RD-5CWN-VGP4-0J6Y"
}
'const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({claimCode: '7K3M-Q9TX-2ABF-H8RD-5CWN-VGP4-0J6Y'})
};
fetch('https://aropay.aro.media/api/v1/transfer/letter/claim/preview', 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/preview"
payload = { "claimCode": "7K3M-Q9TX-2ABF-H8RD-5CWN-VGP4-0J6Y" }
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"data": {
"preview": {
"state": "claimable",
"amount": null,
"token": "cAROUSD",
"amountVisibility": "sealed",
"senderName": "Acme Payroll, Inc.",
"memo": null,
"expiresAt": "2026-10-22T09:45:00.000Z",
"claimedAt": null,
"chainId": 11155111
}
}
}{
"ok": false,
"error": {
"code": "invalid_claim_code",
"message": "That claim code is not valid. Check it against the letter and try again."
}
}{
"ok": false,
"error": {
"code": "letter_not_found",
"message": "Letter 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."
}
}