curl --request POST \
--url https://aropay.aro.media/api/v1/transfer/letter/{id}/void \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"acknowledgeMailed": true
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({acknowledgeMailed: true})
};
fetch('https://aropay.aro.media/api/v1/transfer/letter/{id}/void', 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/{id}/void"
payload = { "acknowledgeMailed": True }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"data": {
"letter": {
"id": "cklet0001abcd",
"status": "DRAFT",
"chainId": 11155111,
"amount": "<string>",
"token": "cAROUSD",
"amountVisibility": "sealed",
"memo": "<string>",
"recipient": {
"name": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"landmark": "<string>",
"city": "<string>",
"region": "<string>",
"postal": "<string>",
"country": "NG",
"countryName": "Nigeria"
}
},
"isDomestic": true,
"expiresAt": "2023-11-07T05:31:56Z",
"sender": {
"walletId": "<string>",
"address": "<string>"
},
"claimCode": "<string>",
"claimUrl": "<string>",
"pdfUrl": "<string>",
"escrow": {
"transactionId": "cktxn0005abcd",
"txHash": "<string>",
"explorerUrl": "<string>",
"status": "PENDING",
"verified": true
},
"claim": {
"transactionId": "cktxn0005abcd",
"txHash": "<string>",
"explorerUrl": "<string>",
"status": "PENDING",
"verified": true,
"claimedAt": "2023-11-07T05:31:56Z",
"walletAddress": "<string>"
},
"refund": {
"transactionId": "cktxn0005abcd",
"txHash": "<string>",
"explorerUrl": "<string>",
"status": "PENDING",
"verified": true,
"reason": "voided"
},
"mail": {
"provider": "lob",
"providerId": "<string>",
"deliveryMethod": "standard",
"status": "<string>",
"trackingNumber": "<string>",
"expectedDeliveryDate": "<string>",
"mailedAt": "2023-11-07T05:31:56Z",
"testMode": true
},
"needsReview": true,
"error": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
}
}{
"ok": false,
"error": {
"code": "void_requires_acknowledgement",
"message": "This letter has been mailed. Send acknowledgeMailed true to void it anyway."
}
}{
"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": "letter_not_found",
"message": "Letter not found."
}
}{
"ok": false,
"error": {
"code": "already_claimed",
"message": "This letter has already been claimed."
}
}{
"ok": false,
"error": {
"code": "rate_limited",
"message": "Too many requests. Try again shortly."
}
}{
"ok": false,
"error": {
"code": "internal_error",
"message": "An unexpected error occurred."
}
}Void letter
Cancel an unclaimed letter and refund the escrow to the sending
wallet’s address (a LETTER_REFUND transfer from the vault). Allowed
from ESCROWED at any time, and from MAILED only with
acknowledgeMailed: true, confirming you understand the paper letter
will stop working (whoever scans it gets 409 letter_not_claimable);
AroPay also asks Lob to cancel the mailing, best effort.
The letter is returned as VOIDED with the refund leg attached. If the
refund transfer fails on-chain the letter stays VOIDED and the
operator’s sweep retries the refund; the void itself never rolls back.
curl --request POST \
--url https://aropay.aro.media/api/v1/transfer/letter/{id}/void \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"acknowledgeMailed": true
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({acknowledgeMailed: true})
};
fetch('https://aropay.aro.media/api/v1/transfer/letter/{id}/void', 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/{id}/void"
payload = { "acknowledgeMailed": True }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"data": {
"letter": {
"id": "cklet0001abcd",
"status": "DRAFT",
"chainId": 11155111,
"amount": "<string>",
"token": "cAROUSD",
"amountVisibility": "sealed",
"memo": "<string>",
"recipient": {
"name": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"landmark": "<string>",
"city": "<string>",
"region": "<string>",
"postal": "<string>",
"country": "NG",
"countryName": "Nigeria"
}
},
"isDomestic": true,
"expiresAt": "2023-11-07T05:31:56Z",
"sender": {
"walletId": "<string>",
"address": "<string>"
},
"claimCode": "<string>",
"claimUrl": "<string>",
"pdfUrl": "<string>",
"escrow": {
"transactionId": "cktxn0005abcd",
"txHash": "<string>",
"explorerUrl": "<string>",
"status": "PENDING",
"verified": true
},
"claim": {
"transactionId": "cktxn0005abcd",
"txHash": "<string>",
"explorerUrl": "<string>",
"status": "PENDING",
"verified": true,
"claimedAt": "2023-11-07T05:31:56Z",
"walletAddress": "<string>"
},
"refund": {
"transactionId": "cktxn0005abcd",
"txHash": "<string>",
"explorerUrl": "<string>",
"status": "PENDING",
"verified": true,
"reason": "voided"
},
"mail": {
"provider": "lob",
"providerId": "<string>",
"deliveryMethod": "standard",
"status": "<string>",
"trackingNumber": "<string>",
"expectedDeliveryDate": "<string>",
"mailedAt": "2023-11-07T05:31:56Z",
"testMode": true
},
"needsReview": true,
"error": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
}
}{
"ok": false,
"error": {
"code": "void_requires_acknowledgement",
"message": "This letter has been mailed. Send acknowledgeMailed true to void it anyway."
}
}{
"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": "letter_not_found",
"message": "Letter not found."
}
}{
"ok": false,
"error": {
"code": "already_claimed",
"message": "This letter has already been claimed."
}
}{
"ok": false,
"error": {
"code": "rate_limited",
"message": "Too many requests. Try again shortly."
}
}{
"ok": false,
"error": {
"code": "internal_error",
"message": "An unexpected error occurred."
}
}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.
Path Parameters
Letter ID.
Body
Required true to void a MAILED letter (stop-payment; the paper letter stops working). Ignored for ESCROWED letters.