curl --request POST \
--url https://api.arcuserp.com/v1/customer-payments/{id}/void \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "<string>",
"relief_entry_date": "2023-12-25"
}
'import requests
url = "https://api.arcuserp.com/v1/customer-payments/{id}/void"
payload = {
"reason": "<string>",
"relief_entry_date": "2023-12-25"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({reason: '<string>', relief_entry_date: '2023-12-25'})
};
fetch('https://api.arcuserp.com/v1/customer-payments/{id}/void', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.arcuserp.com/v1/customer-payments/{id}/void",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'reason' => '<string>',
'relief_entry_date' => '2023-12-25'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.arcuserp.com/v1/customer-payments/{id}/void"
payload := strings.NewReader("{\n \"reason\": \"<string>\",\n \"relief_entry_date\": \"2023-12-25\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.arcuserp.com/v1/customer-payments/{id}/void")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\",\n \"relief_entry_date\": \"2023-12-25\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/customer-payments/{id}/void")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"<string>\",\n \"relief_entry_date\": \"2023-12-25\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"payment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "voided",
"receipt_amount": 123,
"payment_method": "<string>",
"void_summary": {
"invoices_reopened": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"document_number": "<string>",
"amount_returned_to_balance": 123
}
],
"applications_removed": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"document_number": "<string>",
"amount_applied": 123
}
],
"applications_total_before": 123,
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reversal_journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reversal_entry_number": "<string>",
"relief_entry_date": "2023-12-25",
"credit_memo_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"credit_memo_voided": true,
"terms_placements_reopened": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"placement_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
],
"bank_transactions_returned_to_review": [
{
"bank_transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"bank_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"transaction_date": "2023-12-25"
}
],
"book_side": {}
},
"applications": [
{}
]
}
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}Void a posted customer receipt
Takes a POSTED customer cash receipt back off the books: reverses its journal entry, removes it from every invoice it was paying so those balances are owed again, puts any credit-terms promise it had settled back to open, marks the receipt voided, and hands every bank line it was matched to back to the review queue so the money can be recorded correctly. USE IT WHEN THE RECORDING WAS WRONG, not when the money came back. A refund moves real cash and posts its own entries; a void says this receipt should never have been recorded (it was keyed against the wrong customer, or it was the second recording of one bank line, or the deposit never cleared). THE REVERSAL IS DATED AT THE ENTRY IT REVERSES, not at today. The cash never left the bank, and the bank line goes straight back to the review queue still carrying its own statement date, so the correction belongs in the month the money moved in. Dating it today would leave the receipt sitting in the books for every date in between and a reconciled month would stop tying. Pass relief_entry_date only when you specifically need the reversal somewhere else; it is recorded on the audit row as an explicit choice. A CLOSED PERIOD REFUSES (422 period_closed) and names both the closed period and the next open one. It never rolls the correction forward into a month the cash did not move in. CARD RECEIPTS ARE NOT VOIDED HERE (422 receipt_void_is_the_processors). Captured card money comes back through a refund at the processor; an uncaptured authorization is released through POST /v1/payments//void. Reversing the ledger here would tell the books the money returned while it is still with the processor. Idempotent via the Idempotency-Key header. Entity-scoped: a receipt id outside the calling key’s entity answers 404.
curl --request POST \
--url https://api.arcuserp.com/v1/customer-payments/{id}/void \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "<string>",
"relief_entry_date": "2023-12-25"
}
'import requests
url = "https://api.arcuserp.com/v1/customer-payments/{id}/void"
payload = {
"reason": "<string>",
"relief_entry_date": "2023-12-25"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({reason: '<string>', relief_entry_date: '2023-12-25'})
};
fetch('https://api.arcuserp.com/v1/customer-payments/{id}/void', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.arcuserp.com/v1/customer-payments/{id}/void",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'reason' => '<string>',
'relief_entry_date' => '2023-12-25'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.arcuserp.com/v1/customer-payments/{id}/void"
payload := strings.NewReader("{\n \"reason\": \"<string>\",\n \"relief_entry_date\": \"2023-12-25\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.arcuserp.com/v1/customer-payments/{id}/void")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\",\n \"relief_entry_date\": \"2023-12-25\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/customer-payments/{id}/void")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"<string>\",\n \"relief_entry_date\": \"2023-12-25\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"payment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "voided",
"receipt_amount": 123,
"payment_method": "<string>",
"void_summary": {
"invoices_reopened": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"document_number": "<string>",
"amount_returned_to_balance": 123
}
],
"applications_removed": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"document_number": "<string>",
"amount_applied": 123
}
],
"applications_total_before": 123,
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reversal_journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reversal_entry_number": "<string>",
"relief_entry_date": "2023-12-25",
"credit_memo_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"credit_memo_voided": true,
"terms_placements_reopened": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"placement_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
],
"bank_transactions_returned_to_review": [
{
"bank_transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"bank_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"transaction_date": "2023-12-25"
}
],
"book_side": {}
},
"applications": [
{}
]
}
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}Authorizations
API key issued per entity via Settings > Developers > API Keys.
Each key carries scopes (e.g. orders:read, products:write).
Bearer token format: Authorization: Bearer ark_live_ent_Test keys use ark_test_ent_. Both are issued per entity
via Settings > Developers > API Keys.
Headers
Client-generated unique key for idempotent POST/PATCH/DELETE operations. Alias for the Idempotency parameter. Max 255 chars. On retry with the same key, the original response is returned without re-executing the operation. Keys expire after 24 hours.
255Path Parameters
The order_payments id of the receipt to void.
Body
REQUIRED. Why the receipt is being voided. Recorded on the receipt, on every invoice that gets its balance back, and on the reversing journal entry. Omitting it answers 422 void_reason_required.
OPTIONAL explicit date for the reversing entry. Leave it out and the reversal takes the original entry's own date, which is what keeps a reconciled month tied. Whatever date is used must fall in an open period.
Response
The receipt was voided, with the full unwind summary
Show child attributes
Show child attributes
Was this page helpful?

