curl --request POST \
--url https://api.arcuserp.com/v1/orders/{id}/confirm \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"acknowledge_delinquency": true,
"acknowledge_reason": "Customer confirmed ACH payment of overdue invoices en route; GM approved.",
"override_credit_hold": true,
"override_reason": "GM John approved by phone; card on file pre-charged for full balance.",
"send_email": true
}
'import requests
url = "https://api.arcuserp.com/v1/orders/{id}/confirm"
payload = {
"acknowledge_delinquency": True,
"acknowledge_reason": "Customer confirmed ACH payment of overdue invoices en route; GM approved.",
"override_credit_hold": True,
"override_reason": "GM John approved by phone; card on file pre-charged for full balance.",
"send_email": True
}
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({
acknowledge_delinquency: true,
acknowledge_reason: 'Customer confirmed ACH payment of overdue invoices en route; GM approved.',
override_credit_hold: true,
override_reason: 'GM John approved by phone; card on file pre-charged for full balance.',
send_email: true
})
};
fetch('https://api.arcuserp.com/v1/orders/{id}/confirm', 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/orders/{id}/confirm",
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([
'acknowledge_delinquency' => true,
'acknowledge_reason' => 'Customer confirmed ACH payment of overdue invoices en route; GM approved.',
'override_credit_hold' => true,
'override_reason' => 'GM John approved by phone; card on file pre-charged for full balance.',
'send_email' => true
]),
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/orders/{id}/confirm"
payload := strings.NewReader("{\n \"acknowledge_delinquency\": true,\n \"acknowledge_reason\": \"Customer confirmed ACH payment of overdue invoices en route; GM approved.\",\n \"override_credit_hold\": true,\n \"override_reason\": \"GM John approved by phone; card on file pre-charged for full balance.\",\n \"send_email\": true\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/orders/{id}/confirm")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"acknowledge_delinquency\": true,\n \"acknowledge_reason\": \"Customer confirmed ACH payment of overdue invoices en route; GM approved.\",\n \"override_credit_hold\": true,\n \"override_reason\": \"GM John approved by phone; card on file pre-charged for full balance.\",\n \"send_email\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/orders/{id}/confirm")
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 \"acknowledge_delinquency\": true,\n \"acknowledge_reason\": \"Customer confirmed ACH payment of overdue invoices en route; GM approved.\",\n \"override_credit_hold\": true,\n \"override_reason\": \"GM John approved by phone; card on file pre-charged for full balance.\",\n \"send_email\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"object": "order",
"entity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"order_number": "<string>",
"document_type": "quote",
"order_status": "draft",
"payment_status": "unpaid",
"fulfillment_status": "unfulfilled",
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"location_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"po_number": "<string>",
"order_date": "2023-11-07T05:31:56Z",
"due_date": "2023-11-07T05:31:56Z",
"subtotal": 123,
"discount_total": 123,
"shipping_total": 123,
"tax_total": 123,
"fee_total": 123,
"order_total": 123,
"list_price_total": 123,
"pricing_savings": 123,
"amount_paid": 123,
"balance_due": 123,
"amount_due": 123,
"tax_exempt": true,
"delivery_option": "ship",
"notes": "<string>",
"internal_notes": "<string>",
"invoice_number": "<string>",
"invoice_type": "order",
"is_on_hold": true,
"hold_type": "<string>",
"ship_complete": true,
"source_platform": "<string>",
"external_order_id": "<string>",
"external_order_number": "<string>",
"metadata": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"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": "permission_denied",
"code": "permission_denied",
"type": "permission_error",
"permission_key": "accounts.acknowledge_delinquency",
"hint": "Acknowledging a delinquent account requires the 'accounts.acknowledge_delinquency' permission. Ask an Owner, Admin, Manager, or Accountant."
}{
"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": "Order placed on hold",
"hold": true,
"hold_type": "credit_limit",
"reason": "Order exceeds credit limit. Outstanding: $4,200.00 . Limit: $5,000.00 . This order: $850.00",
"override_permission_key": "accounts.override_credit_hold",
"override_hint": "A user with accounts.override_credit_hold may push this through by retrying with body.override_credit_hold=true and body.override_reason (min 10 chars)."
}{
"error": "delinquency_acknowledge_requires_reason",
"code": "delinquency_acknowledge_requires_reason",
"type": "validation_error",
"hint": "Provide a reason >= 10 characters explaining the acknowledgement.",
"overdue_count": 3,
"overdue_amount": 4750,
"max_days_overdue": 47,
"acknowledge_permission_key": "accounts.acknowledge_delinquency",
"acknowledge_hint": "A user with accounts.acknowledge_delinquency may push through by retrying with acknowledge_delinquency=true and acknowledge_reason (min 10 chars).",
"hold_type": "credit_limit",
"original_reason": "Order exceeds credit limit. Outstanding: $4,200.00 . Limit: $5,000.00 . This order: $850.00",
"convert_endpoint": "/orders/0c2a8a8e-8a8a-4a8a-8a8a-8a8a8a8a8a8a/convert"
}Confirm an order
Transitions a draft sales order or invoice to the open state, running approval-threshold and credit-hold checks and allocating inventory for each line; a quote must first be converted with the convert operation before it can be confirmed. An account on credit hold or with overdue invoices returns 409 or 422 unless the caller has the matching override permission and supplies a reason of at least 10 characters.
curl --request POST \
--url https://api.arcuserp.com/v1/orders/{id}/confirm \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"acknowledge_delinquency": true,
"acknowledge_reason": "Customer confirmed ACH payment of overdue invoices en route; GM approved.",
"override_credit_hold": true,
"override_reason": "GM John approved by phone; card on file pre-charged for full balance.",
"send_email": true
}
'import requests
url = "https://api.arcuserp.com/v1/orders/{id}/confirm"
payload = {
"acknowledge_delinquency": True,
"acknowledge_reason": "Customer confirmed ACH payment of overdue invoices en route; GM approved.",
"override_credit_hold": True,
"override_reason": "GM John approved by phone; card on file pre-charged for full balance.",
"send_email": True
}
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({
acknowledge_delinquency: true,
acknowledge_reason: 'Customer confirmed ACH payment of overdue invoices en route; GM approved.',
override_credit_hold: true,
override_reason: 'GM John approved by phone; card on file pre-charged for full balance.',
send_email: true
})
};
fetch('https://api.arcuserp.com/v1/orders/{id}/confirm', 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/orders/{id}/confirm",
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([
'acknowledge_delinquency' => true,
'acknowledge_reason' => 'Customer confirmed ACH payment of overdue invoices en route; GM approved.',
'override_credit_hold' => true,
'override_reason' => 'GM John approved by phone; card on file pre-charged for full balance.',
'send_email' => true
]),
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/orders/{id}/confirm"
payload := strings.NewReader("{\n \"acknowledge_delinquency\": true,\n \"acknowledge_reason\": \"Customer confirmed ACH payment of overdue invoices en route; GM approved.\",\n \"override_credit_hold\": true,\n \"override_reason\": \"GM John approved by phone; card on file pre-charged for full balance.\",\n \"send_email\": true\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/orders/{id}/confirm")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"acknowledge_delinquency\": true,\n \"acknowledge_reason\": \"Customer confirmed ACH payment of overdue invoices en route; GM approved.\",\n \"override_credit_hold\": true,\n \"override_reason\": \"GM John approved by phone; card on file pre-charged for full balance.\",\n \"send_email\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/orders/{id}/confirm")
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 \"acknowledge_delinquency\": true,\n \"acknowledge_reason\": \"Customer confirmed ACH payment of overdue invoices en route; GM approved.\",\n \"override_credit_hold\": true,\n \"override_reason\": \"GM John approved by phone; card on file pre-charged for full balance.\",\n \"send_email\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"object": "order",
"entity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"order_number": "<string>",
"document_type": "quote",
"order_status": "draft",
"payment_status": "unpaid",
"fulfillment_status": "unfulfilled",
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"location_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"po_number": "<string>",
"order_date": "2023-11-07T05:31:56Z",
"due_date": "2023-11-07T05:31:56Z",
"subtotal": 123,
"discount_total": 123,
"shipping_total": 123,
"tax_total": 123,
"fee_total": 123,
"order_total": 123,
"list_price_total": 123,
"pricing_savings": 123,
"amount_paid": 123,
"balance_due": 123,
"amount_due": 123,
"tax_exempt": true,
"delivery_option": "ship",
"notes": "<string>",
"internal_notes": "<string>",
"invoice_number": "<string>",
"invoice_type": "order",
"is_on_hold": true,
"hold_type": "<string>",
"ship_complete": true,
"source_platform": "<string>",
"external_order_id": "<string>",
"external_order_number": "<string>",
"metadata": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"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": "permission_denied",
"code": "permission_denied",
"type": "permission_error",
"permission_key": "accounts.acknowledge_delinquency",
"hint": "Acknowledging a delinquent account requires the 'accounts.acknowledge_delinquency' permission. Ask an Owner, Admin, Manager, or Accountant."
}{
"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": "Order placed on hold",
"hold": true,
"hold_type": "credit_limit",
"reason": "Order exceeds credit limit. Outstanding: $4,200.00 . Limit: $5,000.00 . This order: $850.00",
"override_permission_key": "accounts.override_credit_hold",
"override_hint": "A user with accounts.override_credit_hold may push this through by retrying with body.override_credit_hold=true and body.override_reason (min 10 chars)."
}{
"error": "delinquency_acknowledge_requires_reason",
"code": "delinquency_acknowledge_requires_reason",
"type": "validation_error",
"hint": "Provide a reason >= 10 characters explaining the acknowledgement.",
"overdue_count": 3,
"overdue_amount": 4750,
"max_days_overdue": 47,
"acknowledge_permission_key": "accounts.acknowledge_delinquency",
"acknowledge_hint": "A user with accounts.acknowledge_delinquency may push through by retrying with acknowledge_delinquency=true and acknowledge_reason (min 10 chars).",
"hold_type": "credit_limit",
"original_reason": "Order exceeds credit limit. Outstanding: $4,200.00 . Limit: $5,000.00 . This order: $850.00",
"convert_endpoint": "/orders/0c2a8a8e-8a8a-4a8a-8a8a-8a8a8a8a8a8a/convert"
}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
Body
Set to true to bypass the delinquency soft-warning (account has
overdue invoices but is not on manual / credit-limit hold). Must be
paired with acknowledge_reason (min 10 chars after trim). Requires
accounts.acknowledge_delinquency permission (HTTP 403 if denied).
Industry: NetSuite Customer Past-Due Override, Acumatica Past Due
workflow override, Brightpearl override-credit-limit prompt.
Operator-typed reason for proceeding despite delinquency. Required
when acknowledge_delinquency: true. Minimum 10 characters after
trim. Stored in orders.delinquency_acknowledged_reason and
emitted in the order_timeline + activity_log row so AR teams
can review via the controller audit report surface. Returns HTTP
422 delinquency_acknowledge_requires_reason if omitted or too short.
10"Customer confirmed ACH payment of overdue invoices en route; GM approved."
Set to true to push an on-hold order through the credit gate
WITHOUT placing it on hold. Requires accounts.override_credit_hold
permission AND a paired override_reason (min 10 chars after trim).
Audit-logged via activity_log + order_timeline + realtime broadcast.
Operator-typed reason for the credit-hold override. Required when
override_credit_hold: true. Stored in
orders.credit_hold_override_reason + audit log metadata.
10"GM John approved by phone; card on file pre-charged for full balance."
Send the order confirmation email on success.
Response
Confirmed order
An Arcus ERP order document. One table holds quotes, sales_orders, invoices, returns, and purchase_orders -- always filter by document_type. entity_id is always from the API key (Layer 1 isolation).
order quote, sales_order, invoice, return, purchase_order draft, confirmed, partially_fulfilled, fulfilled, cancelled, voided, awaiting_ach_clearance, on_hold unpaid, partially_paid, paid, overpaid, refunded, partially_refunded, voided unfulfilled, partially_fulfilled, fulfilled Derived (display-only): SUM(list_price * qty) over non-kit lines. The gross baseline of the gross-to-net bridge (List price minus pricing_savings equals subtotal). Never part of order_total.
Derived (display-only): SUM(pricing_rule_adjustment * qty) over non-kit lines (positive magnitude). Per-unit pricing-rule savings already baked into subtotal via sell_rate (ASC 606 transaction price); shown as an informational List-to-Subtotal bridge, never subtracted from order_total.
SSOT: utils/ar-helpers.mjs::updateARBalance. Do not write directly.
AR receivable (the amount this document is owed AS A RECEIVABLE). Forced to 0 on DRAFT sales documents, on cancelled / archived / expired orders, and on voided or fully-refunded invoices, because none of those carries a receivable: a draft is not a receivable, and a terminal document owes nothing. This is the number that ties to AR aging, the AR outstanding total, and the GL AR control account. For the amount still COLLECTIBLE on any document at any status (including a draft), use amount_due. Purchase orders and quotes are never forced to 0. SSOT: utils/ar-helpers.mjs::updateARBalance. Do not write directly.
Collectible remainder: order_total minus amount_paid, rounded to 2 decimals. Status-blind BY DESIGN, so it answers "how much is still OUTSTANDING on this document as simple arithmetic" even where balance_due is 0 because the document is not (yet) a receivable. Negative when the customer has overpaid (money owed back to them). On a confirmed, non-refunded document with no sales allowance and no cancellation, amount_due and balance_due are equal. NOT A PAYABLE AMOUNT. Because it is status-blind it stays positive on documents that can accept no payment at all -- a cancelled / archived / expired order, a voided invoice, a fully-refunded order -- and it OVERSTATES what is owed on an allowance-settled order (a standalone concession refund reversed goods or tax: balance_due correctly settles to 0 while the remainder does not). Collecting amount_due on either shape creates an overpayment, and the payment endpoints will refuse it with order_not_payable (422). To decide how much to collect, take the amount from the payment surface you are about to call (POST /v1/orders/{id}/payments validates and caps server-side); to reconcile against AR aging or the GL AR control account, use balance_due.
ship, pick_up, local_delivery order, manual, proforma, correction Was this page helpful?

