curl --request POST \
--url https://api.arcuserp.com/v1/journal-entries/{id}/reverse \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "<string>"
}
'import requests
url = "https://api.arcuserp.com/v1/journal-entries/{id}/reverse"
payload = { "reason": "<string>" }
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>'})
};
fetch('https://api.arcuserp.com/v1/journal-entries/{id}/reverse', 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/journal-entries/{id}/reverse",
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>'
]),
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/journal-entries/{id}/reverse"
payload := strings.NewReader("{\n \"reason\": \"<string>\"\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/journal-entries/{id}/reverse")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/journal-entries/{id}/reverse")
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}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"entity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"entry_number": "<string>",
"entry_date": "2023-12-25",
"period_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"entry_type": "<string>",
"status": "draft",
"approval_status": "auto_approved",
"description": "<string>",
"source_type": "INVOICE",
"source_id": "<string>",
"source_module": "<string>",
"is_reversing": true,
"reversed_by_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reversal_of_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reverse_in_period_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"batch_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"total_debit": 123,
"total_credit": 123,
"posted_at": "2023-11-07T05:31:56Z",
"approved_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"approved_at": "2023-11-07T05:31:56Z",
"rejected_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rejected_at": "2023-11-07T05:31:56Z",
"rejection_reason": "<string>",
"idempotency_key": "<string>",
"created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_by_name": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"lines": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"line_number": 123,
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"debit_amount": 1,
"credit_amount": 1,
"description": "<string>",
"location_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"department_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"class_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reconciled": true,
"reconciled_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z"
}
],
"released_bank_transactions": [
{
"bank_transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"bank_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"unstamped": 123,
"reason": "<string>",
"link_kind": "journal_entry",
"transaction_date": "2023-12-25",
"amount": 123,
"settlement_corrections_still_posted": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"entry_number": "<string>",
"entry_date": "2023-12-25"
}
]
}
]
}{
"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"
}Reverse a posted journal entry
Posts a new offsetting journal entry that reverses a posted entry, leaving the original unchanged and immutable; any bank feed line matched to the original entry is returned to the review queue unless a completed reconciliation already claims it. Requires accounting:write scope; a reversing entry cannot itself be reversed.
curl --request POST \
--url https://api.arcuserp.com/v1/journal-entries/{id}/reverse \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "<string>"
}
'import requests
url = "https://api.arcuserp.com/v1/journal-entries/{id}/reverse"
payload = { "reason": "<string>" }
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>'})
};
fetch('https://api.arcuserp.com/v1/journal-entries/{id}/reverse', 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/journal-entries/{id}/reverse",
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>'
]),
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/journal-entries/{id}/reverse"
payload := strings.NewReader("{\n \"reason\": \"<string>\"\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/journal-entries/{id}/reverse")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/journal-entries/{id}/reverse")
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}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"entity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"entry_number": "<string>",
"entry_date": "2023-12-25",
"period_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"entry_type": "<string>",
"status": "draft",
"approval_status": "auto_approved",
"description": "<string>",
"source_type": "INVOICE",
"source_id": "<string>",
"source_module": "<string>",
"is_reversing": true,
"reversed_by_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reversal_of_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reverse_in_period_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"batch_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"total_debit": 123,
"total_credit": 123,
"posted_at": "2023-11-07T05:31:56Z",
"approved_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"approved_at": "2023-11-07T05:31:56Z",
"rejected_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rejected_at": "2023-11-07T05:31:56Z",
"rejection_reason": "<string>",
"idempotency_key": "<string>",
"created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_by_name": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"lines": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"line_number": 123,
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"debit_amount": 1,
"credit_amount": 1,
"description": "<string>",
"location_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"department_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"class_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reconciled": true,
"reconciled_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z"
}
],
"released_bank_transactions": [
{
"bank_transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"bank_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"unstamped": 123,
"reason": "<string>",
"link_kind": "journal_entry",
"transaction_date": "2023-12-25",
"amount": 123,
"settlement_corrections_still_posted": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"entry_number": "<string>",
"entry_date": "2023-12-25"
}
]
}
]
}{
"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.
Path Parameters
Body
Response
New reversing journal entry
A double-entry journal entry. DR sum = CR sum across all lines (Rule A1 / assertGLBalance). entry_date must fall in an open accounting period (Rule A3). Once posted, entries are immutable -- use reverse to undo. Verified against live dev RDS accounting.journal_entries.
Human-readable number (e.g. SB-JE-0000001)
draft, pending_approval, posted, reversed, voided, rejected auto_approved, pending_approval, approved, rejected Event source. Postgres ENUM-locked per P0-JE-SOURCE-TYPE-ENUM (2026-05-18, FIX REQUIRED #18 closed). Invalid values rejected with HTTP 400 at the API boundary and Postgres 22P02 at the database layer. Values mirror JE_SOURCE_TYPE in arcus-api-core/utils/constants.mjs.
INVOICE, FULFILLMENT, TAX, SHIPPING, SHIPPING_COST, DISCOUNT, PRICING_DISCOUNT, COUPON_DISCOUNT, PROCESSING_FEE, PROCESSOR_FEE, ORDER_CANCELLATION, LATE_FEE, PAYMENT, REFUND, CREDIT_APPLIED, WRITE_OFF, CREDIT_MEMO, CUSTOMER_DEPOSIT, CUSTOMER_DEPOSIT_APPLICATION, CUSTOMER_DEPOSIT_REFUND, RETURN, RETURN_FEE, COGS_REVERSAL, VENDOR_RETURN, AP_BILL, AP_PAYMENT, VENDOR_BILL, VENDOR_INVOICE, VENDOR_PAYMENT, VENDOR_CREDIT, BILL_REVALUATION, VENDOR_PREPAYMENT, VENDOR_PREPAYMENT_APPLICATION, VENDOR_PREPAYMENT_REFUND, INVENTORY_ADJUSTMENT, INVENTORY_ADJ, INVENTORY_RECEIVED, INVENTORY_TRANSFER, INTERCOMPANY_TRANSFER, CYCLE_COUNT, PO_RECEIPT, PO_DAMAGED_WRITEOFF, COST_REVALUATION, BANK_RECON, BANK_DEPOSIT, CASH_MOVEMENT, CHECK_CLEARED, PAYOUT, REGISTER, REGISTER_SALE, SHOPIFY_IMPORT, SHOPIFY_PAYOUT, AMAZON_IMPORT, AMAZON_SETTLEMENT, EBAY_IMPORT, EBAY_PAYOUT, MARKETPLACE_PAYOUT, AMAZON_FEES, FBA_INBOUND, FBA_SYNC, TAX_REMITTANCE, DISPUTE_HOLD, DISPUTE_WON, DISPUTE_LOST, MANUAL, MANUAL_REVERSAL, PERIOD_CLOSE, FISCAL_YEAR_CLOSE, ADJUSTMENT, RECURRING_JE, MANUFACTURING, WO_COMPLETION, WO_VARIANCE, WO_LABOR, WO_OVERHEAD, DEPRECIATION, ASSET_ACQUISITION, ASSET_DISPOSAL, IMPAIRMENT, LEASE_COMMENCEMENT, LEASE_PAYMENT, LEASE_MODIFICATION, LEASE_TERMINATION, LEASE_BUYOUT, LABEL_REFUND_DENIED Groups JEs from one business event (e.g. fulfillment posts revenue + COGS + tax + shipping in one batch). Use GET /v1/journal-entries?batch_id= to retrieve all JEs in a batch.
User who created the entry. Stamped from the authenticated user on manual JEs; from the posting helper's created_by on system JEs.
Display name of the creating user (JOIN on users). Null for system-generated entries with no user attribution.
JE lines (included on GET single; omitted on list responses)
Show child attributes
Show child attributes
Bank statement lines this reversal returned to the review queue, empty when the entry had none.
Show child attributes
Show child attributes
Was this page helpful?

