curl --request POST \
--url https://api.arcuserp.com/v1/orders/{id}/invoice/reopen \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "<string>",
"expect": {
"invoice_number": "<string>",
"order_total": 123,
"amount_paid": 123
}
}
'import requests
url = "https://api.arcuserp.com/v1/orders/{id}/invoice/reopen"
payload = {
"reason": "<string>",
"expect": {
"invoice_number": "<string>",
"order_total": 123,
"amount_paid": 123
}
}
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>',
expect: {invoice_number: '<string>', order_total: 123, amount_paid: 123}
})
};
fetch('https://api.arcuserp.com/v1/orders/{id}/invoice/reopen', 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}/invoice/reopen",
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>',
'expect' => [
'invoice_number' => '<string>',
'order_total' => 123,
'amount_paid' => 123
]
]),
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}/invoice/reopen"
payload := strings.NewReader("{\n \"reason\": \"<string>\",\n \"expect\": {\n \"invoice_number\": \"<string>\",\n \"order_total\": 123,\n \"amount_paid\": 123\n }\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}/invoice/reopen")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\",\n \"expect\": {\n \"invoice_number\": \"<string>\",\n \"order_total\": 123,\n \"amount_paid\": 123\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/orders/{id}/invoice/reopen")
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 \"expect\": {\n \"invoice_number\": \"<string>\",\n \"order_total\": 123,\n \"amount_paid\": 123\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"order": {
"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"
},
"changed": true,
"voided_first": true,
"retired_invoice_number": "<string>",
"history_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"target": "in_place",
"payment_status_before": "<string>",
"payment_status_after": "<string>"
}
}{
"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"
}Reopen an order's bill
Reopens the bill on a sales order whose invoice is issued in place so it can be corrected before it is issued again (the lines and prices of an order that has not shipped can be edited, while a change to goods already shipped goes through a return): the invoice number is retired into the order’s invoice history with the reason given, the order returns to not invoiced with no invoice number, and the balance is worked out again from the payments already on the order. A posted, overdue or paid invoice is voided first in the same transaction (its revenue, tax, shipping and discount entries, and the cost of goods and stock relief of anything shipped, are reversed), which requires the key’s user to hold the accounting.post permission, and its tax document is voided right after that transaction commits, retried later if the tax service is unreachable; nothing is refunded and no email is sent to the customer. Payments taken before the re-issue stay on the order and, in customer-deposit mode, are held as a customer deposit and applied to the invoice when it is re-issued with POST /v1/orders/{id}/invoice.
curl --request POST \
--url https://api.arcuserp.com/v1/orders/{id}/invoice/reopen \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "<string>",
"expect": {
"invoice_number": "<string>",
"order_total": 123,
"amount_paid": 123
}
}
'import requests
url = "https://api.arcuserp.com/v1/orders/{id}/invoice/reopen"
payload = {
"reason": "<string>",
"expect": {
"invoice_number": "<string>",
"order_total": 123,
"amount_paid": 123
}
}
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>',
expect: {invoice_number: '<string>', order_total: 123, amount_paid: 123}
})
};
fetch('https://api.arcuserp.com/v1/orders/{id}/invoice/reopen', 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}/invoice/reopen",
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>',
'expect' => [
'invoice_number' => '<string>',
'order_total' => 123,
'amount_paid' => 123
]
]),
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}/invoice/reopen"
payload := strings.NewReader("{\n \"reason\": \"<string>\",\n \"expect\": {\n \"invoice_number\": \"<string>\",\n \"order_total\": 123,\n \"amount_paid\": 123\n }\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}/invoice/reopen")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\",\n \"expect\": {\n \"invoice_number\": \"<string>\",\n \"order_total\": 123,\n \"amount_paid\": 123\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/orders/{id}/invoice/reopen")
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 \"expect\": {\n \"invoice_number\": \"<string>\",\n \"order_total\": 123,\n \"amount_paid\": 123\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"order": {
"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"
},
"changed": true,
"voided_first": true,
"retired_invoice_number": "<string>",
"history_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"target": "in_place",
"payment_status_before": "<string>",
"payment_status_after": "<string>"
}
}{
"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. A second request with the same
key sent while the first is still running waits for it and returns its
answer; if the first is still running after 20 seconds the second
answers 409 idempotency_key_in_use (retryable, nothing done). An
answer carrying retryable: true is not cached. Reusing a key with a
different request body answers 409 idempotency_key_collision (nothing
done; send the new request with a fresh key). The replay, the wait and
these two 409 codes come from the idempotency layer, so they apply to
the operations that run it, each of which can answer the two codes
whether or not its own 409 response lists them. The handlers of these
operations take the header but do not run the layer, so on them the key
neither replays nor answers either code: createPaymentPlan,
chargePaymentPlanInstallment, setProductLocations, updateOrder,
emailOrder, updateOrderItem, confirmPickup, markOrderNoShow,
applyExistingPaymentToInvoices, updatePackage, movePackageItem,
changePackageBox, changePackageCarrier, voidPackageLabel,
printPackageLabel, emailPackage, setProNumberV1, setPackageProNumber,
sendPurchaseOrderToVendorV1, notifyRevisionPurchaseOrderV1,
addMaintenanceLog, generateBOLV1,
createReportJobV1 and customerAcknowledgeRevision; recordVendorPrepaymentV1
and recordCustomerDepositV1 hand the key to their own write instead.
255Path Parameters
Body
Why the bill is being re-opened. At least 10 characters after trimming; kept with the retired invoice.
10The order as the caller last read it. When any named field has changed the endpoint returns 409 reopen_pre_image_moved and changes nothing.
Show child attributes
Show child attributes
Response
The bill is re-opened (or was already re-opened, changed false).
Show child attributes
Show child attributes
Was this page helpful?

