curl --request POST \
--url https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/match-journal-entry \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"bank_transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reconciliation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/match-journal-entry"
payload = {
"bank_transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reconciliation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
bank_transaction_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
journal_entry_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
reconciliation_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/match-journal-entry', 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/match-journal-entry",
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([
'bank_transaction_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'journal_entry_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'reconciliation_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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/entities/{entity_id}/reconciliation/match-journal-entry"
payload := strings.NewReader("{\n \"bank_transaction_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"journal_entry_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"reconciliation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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/entities/{entity_id}/reconciliation/match-journal-entry")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"bank_transaction_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"journal_entry_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"reconciliation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/match-journal-entry")
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 \"bank_transaction_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"journal_entry_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"reconciliation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"bank_transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"entry_number": "<string>",
"matched": true,
"entry_bank_net": 123,
"amount_warning": "<string>",
"posted_journal_entry": 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"
}{
"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"
}Match a bank transaction to a posted journal entry
Ties a bank transaction to cash the books ALREADY carry as a posted journal entry that no subledger record explains: a bank fee the feed posted itself, a manual correction, a cutover entry. It is the fifth bank-match verb and the only one that points at the general ledger directly.
Posts NO journal entry of any kind. The money is already booked; the defect this closes is that the bank side never said so, which left the line in the review queue offering to book it a second time under a different idempotency key.
Atomic: both rows are locked and updated inside one transaction
(matched_journal_entry_id plus reconciliation_status = 'matched').
Refuses an entry that is not posted, that was voided, that has been
reversed, or that another bank transaction already claims; refuses a
bank line that is excluded, still pending, or already matched. An
amount difference is REPORTED as amount_warning, never refused: the
caller chose the pair. Reversible via the unmatch flow. Requires
accounting:write scope. Idempotent via the Idempotency-Key header.
THE ONE RULE: delegates to the canonical matchBankToJournalEntry
handler shared with the internal UI.
curl --request POST \
--url https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/match-journal-entry \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"bank_transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reconciliation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/match-journal-entry"
payload = {
"bank_transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reconciliation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
bank_transaction_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
journal_entry_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
reconciliation_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/match-journal-entry', 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/match-journal-entry",
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([
'bank_transaction_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'journal_entry_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'reconciliation_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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/entities/{entity_id}/reconciliation/match-journal-entry"
payload := strings.NewReader("{\n \"bank_transaction_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"journal_entry_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"reconciliation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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/entities/{entity_id}/reconciliation/match-journal-entry")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"bank_transaction_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"journal_entry_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"reconciliation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/entities/{entity_id}/reconciliation/match-journal-entry")
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 \"bank_transaction_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"journal_entry_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"reconciliation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"bank_transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"entry_number": "<string>",
"matched": true,
"entry_bank_net": 123,
"amount_warning": "<string>",
"posted_journal_entry": 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"
}{
"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
Deduplicates retried match submissions for 24 hours.
255Path Parameters
Body
The bank transaction to match. Must be unreconciled, not excluded and not pending.
The posted journal entry that already carries this cash. Must not be voided, reversed, or claimed by another bank transaction.
Optional open bank-reconciliation to attach the match to.
Response
Match recorded. No journal entry was posted.
The entry's own signed net across this entity's bank GL accounts, read from the ledger. Comparable to the bank line's signed amount.
Set when the bank amount and the entry's bank net differ by more than half a cent.
Always false. This verb records a link and posts no GL.
Was this page helpful?

