curl --request POST \
--url https://api.arcuserp.com/v1/entities/{entity_id}/migration/journal-entries/relink-source \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"external_id": "5611654",
"source_id": "6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b",
"source_module": "invoice"
},
{
"external_id": "5611655",
"source_id": "7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c",
"source_module": "payment"
}
]
}
'import requests
url = "https://api.arcuserp.com/v1/entities/{entity_id}/migration/journal-entries/relink-source"
payload = { "items": [
{
"external_id": "5611654",
"source_id": "6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b",
"source_module": "invoice"
},
{
"external_id": "5611655",
"source_id": "7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c",
"source_module": "payment"
}
] }
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({
items: [
{
external_id: '5611654',
source_id: '6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b',
source_module: 'invoice'
},
{
external_id: '5611655',
source_id: '7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c',
source_module: 'payment'
}
]
})
};
fetch('https://api.arcuserp.com/v1/entities/{entity_id}/migration/journal-entries/relink-source', 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}/migration/journal-entries/relink-source",
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([
'items' => [
[
'external_id' => '5611654',
'source_id' => '6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b',
'source_module' => 'invoice'
],
[
'external_id' => '5611655',
'source_id' => '7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c',
'source_module' => 'payment'
]
]
]),
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}/migration/journal-entries/relink-source"
payload := strings.NewReader("{\n \"items\": [\n {\n \"external_id\": \"5611654\",\n \"source_id\": \"6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b\",\n \"source_module\": \"invoice\"\n },\n {\n \"external_id\": \"5611655\",\n \"source_id\": \"7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c\",\n \"source_module\": \"payment\"\n }\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/entities/{entity_id}/migration/journal-entries/relink-source")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"external_id\": \"5611654\",\n \"source_id\": \"6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b\",\n \"source_module\": \"invoice\"\n },\n {\n \"external_id\": \"5611655\",\n \"source_id\": \"7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c\",\n \"source_module\": \"payment\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/entities/{entity_id}/migration/journal-entries/relink-source")
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 \"items\": [\n {\n \"external_id\": \"5611654\",\n \"source_id\": \"6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b\",\n \"source_module\": \"invoice\"\n },\n {\n \"external_id\": \"5611655\",\n \"source_id\": \"7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c\",\n \"source_module\": \"payment\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"object": "migration_je_source_relink_result",
"total": 123,
"relinked": 123,
"already_linked": 123,
"not_found": 123,
"failed": 123,
"source_type_upgraded": 123,
"descriptions_enriched": 123,
"results": [
{
"external_id": "<string>",
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_id": "<string>",
"source_type": "<string>",
"source_type_upgraded": true,
"description_enriched": true,
"relinked": true,
"error": "<string>",
"code": "<string>",
"hint": "<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"
}Relink migrated journal entry sources
Updates a batch of migrated journal entries’ source_id from the source system’s document number to the Arcus order, invoice, or vendor bill UUID it actually represents, since historical GL is loaded before those records exist. Only entries still tagged with a migrated provenance are touched, no line or amount is modified, and re-running is a no-op for entries already relinked; requires migration:write scope.
curl --request POST \
--url https://api.arcuserp.com/v1/entities/{entity_id}/migration/journal-entries/relink-source \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"external_id": "5611654",
"source_id": "6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b",
"source_module": "invoice"
},
{
"external_id": "5611655",
"source_id": "7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c",
"source_module": "payment"
}
]
}
'import requests
url = "https://api.arcuserp.com/v1/entities/{entity_id}/migration/journal-entries/relink-source"
payload = { "items": [
{
"external_id": "5611654",
"source_id": "6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b",
"source_module": "invoice"
},
{
"external_id": "5611655",
"source_id": "7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c",
"source_module": "payment"
}
] }
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({
items: [
{
external_id: '5611654',
source_id: '6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b',
source_module: 'invoice'
},
{
external_id: '5611655',
source_id: '7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c',
source_module: 'payment'
}
]
})
};
fetch('https://api.arcuserp.com/v1/entities/{entity_id}/migration/journal-entries/relink-source', 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}/migration/journal-entries/relink-source",
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([
'items' => [
[
'external_id' => '5611654',
'source_id' => '6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b',
'source_module' => 'invoice'
],
[
'external_id' => '5611655',
'source_id' => '7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c',
'source_module' => 'payment'
]
]
]),
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}/migration/journal-entries/relink-source"
payload := strings.NewReader("{\n \"items\": [\n {\n \"external_id\": \"5611654\",\n \"source_id\": \"6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b\",\n \"source_module\": \"invoice\"\n },\n {\n \"external_id\": \"5611655\",\n \"source_id\": \"7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c\",\n \"source_module\": \"payment\"\n }\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/entities/{entity_id}/migration/journal-entries/relink-source")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"external_id\": \"5611654\",\n \"source_id\": \"6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b\",\n \"source_module\": \"invoice\"\n },\n {\n \"external_id\": \"5611655\",\n \"source_id\": \"7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c\",\n \"source_module\": \"payment\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/entities/{entity_id}/migration/journal-entries/relink-source")
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 \"items\": [\n {\n \"external_id\": \"5611654\",\n \"source_id\": \"6b1e9a4f-1d2c-4f8e-9c8a-8b1d2e3f4a5b\",\n \"source_module\": \"invoice\"\n },\n {\n \"external_id\": \"5611655\",\n \"source_id\": \"7c2f0b5e-2e3d-5f9f-ad9b-9c2e3f4a5b6c\",\n \"source_module\": \"payment\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"object": "migration_je_source_relink_result",
"total": 123,
"relinked": 123,
"already_linked": 123,
"not_found": 123,
"failed": 123,
"source_type_upgraded": 123,
"descriptions_enriched": 123,
"results": [
{
"external_id": "<string>",
"journal_entry_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_id": "<string>",
"source_type": "<string>",
"source_type_upgraded": true,
"description_enriched": true,
"relinked": true,
"error": "<string>",
"code": "<string>",
"hint": "<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"
}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
Optional idempotency key. If supplied, retrying the same call within 24 hours returns the previous result.
Path Parameters
Body
Batch JE source-relink payload (up to 500 items per call).
1 - 500 elementsShow child attributes
Show child attributes
Response
JE source-relink result
Result envelope for JE source relink. Each row in results reports
independently; a failure on one item does not roll back the others. Pure
column UPDATE on the JE header (source_id / source_module / source_type /
description). No line is touched and no amount is touched.
migration_je_source_relink_result Total per-batch count of rows where source_type was upgraded from VERSA_MIGRATION to a canonical value. Added 2026-05-27.
Total per-batch count of rows where the description was rebuilt to the canonical native template. Added 2026-05-27.
Show child attributes
Show child attributes
Was this page helpful?

