curl --request GET \
--url https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/account-audit \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/account-audit"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/account-audit', 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/entities/{entity_id}/reconciliation/account-audit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/account-audit"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/account-audit")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/account-audit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "reconciliation_account_audit",
"entity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"bank_account": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"last4": "<string>",
"gl_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"gl_account_number": "<string>",
"gl_account_name": "<string>",
"normal_balance": "<string>",
"plaid_connected": true,
"bank_stated_balance": 123,
"bank_stated_as_of": "2023-11-07T05:31:56Z",
"baseline_date": "2023-12-25",
"baseline_balance": 123
},
"as_of": "2023-12-25",
"month_ends": [
"2023-12-25"
],
"since": "2023-12-25",
"method": {
"document": "<string>",
"steps": [
{
"key": "<string>",
"step": 123,
"answered": true,
"title": "<string>"
}
]
},
"answers": {
"feed_against_bank": {},
"duplicates_and_exclusions": {},
"books_against_bank": {},
"clearing_accounts": {},
"error_classes": {}
},
"findings": [
{
"class": "<string>",
"step": 123,
"door": "match",
"severity": "blocking",
"headline": "<string>",
"detail": "<string>",
"amount": 123,
"count": 123
}
],
"finding_count": 123,
"blocking_count": 123,
"next_step": "<string>",
"writes_nothing": true
}{
"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"
}The reconciliation audit of one bank account, with the door for each finding
The whole reconciliation audit of ONE bank account in one call: the answers an accountant
gives when proving a migrated or reconnected account, in the order they must be fixed.
Five answers are returned under answers: feed_against_bank (does the bank feed
reproduce the bank’s own balance today and at each month end), duplicates_and_exclusions
(any bank event live twice; every exclusion, split into system and human, and any human
exclusion with no live twin), books_against_bank (the posted books against the bank at
each month end, with the unpaired bank rows and unpaired book lines listed),
clearing_accounts (each clearing account this bank feeds, against the money genuinely in
flight) and error_classes (a row matched to a reversed entry, an entry whose lines are all
one account, a payment recorded on a bank that did not pay it, a fee booked twice).
Every item in findings names its class, the audit step it belongs to (1 to 7),
its severity (blocking or review) and the door that fixes it (match, undo,
move_to_this_bank_and_match, restore or review). next_step is one sentence naming the
lowest-numbered blocking step, because a feed problem is fixed before the books are looked
at and the baseline is set last. Steps 4 and 7 are judgements and are marked unanswered in
method.steps.
A count is never a page size: every list is capped by row_limit and publishes its
unbounded total beside the rows it listed. A figure this audit cannot derive is null,
never 0.
READ-ONLY. It writes nothing, posts nothing and calls no third party: every bank figure comes
from persisted state through the same engine as bank-balance-as-of, so the two cannot
disagree. It is not cheap: a migrated book of several hundred thousand entries takes seconds,
so ask for the month ends you need. The bank account must belong to the entity of the key
and be mapped to a general ledger account; otherwise the answer is 404
bank_account_not_found.
Requires accounting:read or migration:read scope.
curl --request GET \
--url https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/account-audit \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/account-audit"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/account-audit', 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/entities/{entity_id}/reconciliation/account-audit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/account-audit"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/account-audit")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/account-audit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "reconciliation_account_audit",
"entity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"bank_account": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"last4": "<string>",
"gl_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"gl_account_number": "<string>",
"gl_account_name": "<string>",
"normal_balance": "<string>",
"plaid_connected": true,
"bank_stated_balance": 123,
"bank_stated_as_of": "2023-11-07T05:31:56Z",
"baseline_date": "2023-12-25",
"baseline_balance": 123
},
"as_of": "2023-12-25",
"month_ends": [
"2023-12-25"
],
"since": "2023-12-25",
"method": {
"document": "<string>",
"steps": [
{
"key": "<string>",
"step": 123,
"answered": true,
"title": "<string>"
}
]
},
"answers": {
"feed_against_bank": {},
"duplicates_and_exclusions": {},
"books_against_bank": {},
"clearing_accounts": {},
"error_classes": {}
},
"findings": [
{
"class": "<string>",
"step": 123,
"door": "match",
"severity": "blocking",
"headline": "<string>",
"detail": "<string>",
"amount": 123,
"count": 123
}
],
"finding_count": 123,
"blocking_count": 123,
"next_step": "<string>",
"writes_nothing": true
}{
"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
Query Parameters
YYYY-MM-DD. Defaults to today.
How many month ends before as_of to test, 1 to 36.
1 <= x <= 36YYYY-MM-DD. Limits the clearing and error-class answers to activity on or after this day.
How many days apart an unpaired bank row and an unpaired book line of the same amount may be and still be offered as a pair.
How many days apart two same-amount vendor payments may be and still be reported as a possible double payment.
The most rows any one list returns. Each list still publishes its unbounded total.
Response
The audit of that bank account
reconciliation_account_audit The account audited, its mapped general ledger account and the bank's last persisted balance.
Show child attributes
Show child attributes
The audit method's steps, and which of them this read answers.
Show child attributes
Show child attributes
The five answers, each with its own figures, rows and findings.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?

