curl --request PATCH \
--url https://api.arcuserp.com/v1/customer-payments/{id}/applications \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"applications": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 123
}
],
"reason": "<string>"
}
'import requests
url = "https://api.arcuserp.com/v1/customer-payments/{id}/applications"
payload = {
"applications": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 123
}
],
"reason": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
applications: [{order_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', amount: 123}],
reason: '<string>'
})
};
fetch('https://api.arcuserp.com/v1/customer-payments/{id}/applications', 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}/applications",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'applications' => [
[
'order_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'amount' => 123
]
],
'reason' => '<string>'
]),
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}/applications"
payload := strings.NewReader("{\n \"applications\": [\n {\n \"order_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 123\n }\n ],\n \"reason\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.arcuserp.com/v1/customer-payments/{id}/applications")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"applications\": [\n {\n \"order_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 123\n }\n ],\n \"reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/customer-payments/{id}/applications")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"applications\": [\n {\n \"order_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 123\n }\n ],\n \"reason\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"payment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"receipt_amount": 123,
"applications_total": 123,
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"journal_entry_unchanged": true,
"applications_before": [
{}
],
"applications": [
{}
],
"terms_placements_reopened": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"placement_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
],
"terms_placements_settled": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"placement_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
],
"undo": {
"payment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"applications": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 123
}
]
}
}
}{
"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"
}Change which invoices a posted customer receipt pays
Re-attributes a POSTED customer receipt across a different set of the same customer’s invoices. Use it when cash was recorded correctly but applied to the wrong invoices, which is what happens whenever a receipt is booked without an applications[] payload and the server auto-applies it oldest-first while the customer’s remittance advice names a different set. THIS MOVES NO CASH AND POSTS NO JOURNAL ENTRY. The receipt’s amount, its date, its bank-transaction link and its journal entry are all untouched: the entry that recorded the cash (DR bank / CR Accounts Receivable) was already correct, and only the SUBLEDGER attribution was wrong. The handler fingerprints that entry, header and every line, before and after the rewrite and refuses to commit if a single byte moved. WHAT MUST HOLD, each refused with its own 422 code:
- applications_sum_mismatch - the new set must total exactly what the receipt currently has applied (for a fully applied receipt that is its face amount). The receipt’s entry credits Accounts Receivable by that figure, so changing the total here would break the AR-to-GL tie.
- invoice_on_another_account - every invoice must belong to the customer who sent the cash.
- application_exceeds_balance - an invoice may receive at most what it is open for
once THIS receipt’s existing contribution to it is taken back off. The response
carries
room, so a caller can retry without guessing. - application_target_not_receivable / order_not_payable - the canonical target rules the Receive Payment door enforces, so this door can never accept a document that one would refuse.
- period_closed - the receipt’s own accounting period is closed. The response names the period and the next open one. The correction is NOT silently rolled forward: a re-application is dated by the receipt it corrects.
- receipt_not_posted / receipt_not_reappliable_tender - voided, refunded, returned and pending receipts, and the non-cash ‘terms’ and ‘discount’ rows, are refused.
- receipt_gl_subledger_mismatch - the receipt is already out of tie with its own entry, so its applications are not moved from here.
SIDE EFFECTS. Every invoice on either side of the change is recomputed through the canonical AR writer. Credit-terms placeholders follow: a placeholder this receipt had retired is reopened when the receipt stops settling its invoice, and one is retired when an invoice now reaches zero. Two audit records are written, one on the receipt carrying the whole before and after set and one on each invoice whose share moved. Broadcasts payment.applications_changed plus per-invoice order.payment_status_changed.
UNDO. The response carries an undo object holding the PRIOR set in the exact shape this endpoint accepts, so reverting is one more call with that body.
NOT the same verb as POST /v1/payments//apply, which applies an UNALLOCATED receipt and refuses an already-applied one (payment_already_applied). This one is the correction of an allocation that already exists.
Idempotent via the Idempotency-Key header.
curl --request PATCH \
--url https://api.arcuserp.com/v1/customer-payments/{id}/applications \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"applications": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 123
}
],
"reason": "<string>"
}
'import requests
url = "https://api.arcuserp.com/v1/customer-payments/{id}/applications"
payload = {
"applications": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 123
}
],
"reason": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
applications: [{order_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', amount: 123}],
reason: '<string>'
})
};
fetch('https://api.arcuserp.com/v1/customer-payments/{id}/applications', 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}/applications",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'applications' => [
[
'order_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'amount' => 123
]
],
'reason' => '<string>'
]),
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}/applications"
payload := strings.NewReader("{\n \"applications\": [\n {\n \"order_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 123\n }\n ],\n \"reason\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.arcuserp.com/v1/customer-payments/{id}/applications")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"applications\": [\n {\n \"order_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 123\n }\n ],\n \"reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/customer-payments/{id}/applications")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"applications\": [\n {\n \"order_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 123\n }\n ],\n \"reason\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"payment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"receipt_amount": 123,
"applications_total": 123,
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"journal_entry_unchanged": true,
"applications_before": [
{}
],
"applications": [
{}
],
"terms_placements_reopened": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"placement_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
],
"terms_placements_settled": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"placement_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
],
"undo": {
"payment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"applications": [
{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 123
}
]
}
}
}{
"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 posted receipt to re-apply.
Body
The NEW set, complete. Every invoice this receipt should pay must appear, with the whole amount it receives; an invoice left out stops being paid by this receipt and its balance returns. Each invoice may appear once.
1 - 50 elementsShow child attributes
Show child attributes
Why the attribution changed, for example "Customer remittance advice". Recorded on every audit record this call writes.
Response
The receipt was re-applied
Show child attributes
Show child attributes
Was this page helpful?

