curl --request POST \
--url https://api.arcuserp.com/v1/reports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"report_type": "<string>",
"parameters": {
"include_historical": true
},
"format": "json"
}
'import requests
url = "https://api.arcuserp.com/v1/reports"
payload = {
"report_type": "<string>",
"parameters": { "include_historical": True },
"format": "json"
}
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({
report_type: '<string>',
parameters: {include_historical: true},
format: 'json'
})
};
fetch('https://api.arcuserp.com/v1/reports', 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/reports",
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([
'report_type' => '<string>',
'parameters' => [
'include_historical' => true
],
'format' => 'json'
]),
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/reports"
payload := strings.NewReader("{\n \"report_type\": \"<string>\",\n \"parameters\": {\n \"include_historical\": true\n },\n \"format\": \"json\"\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/reports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"report_type\": \"<string>\",\n \"parameters\": {\n \"include_historical\": true\n },\n \"format\": \"json\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/reports")
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 \"report_type\": \"<string>\",\n \"parameters\": {\n \"include_historical\": true\n },\n \"format\": \"json\"\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "pending"
}{
"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"
}Create an async report job
Triggers an async report job and returns 202 Accepted with the job id in pending status. Poll the job until it completes, then download its result; requires reports:write scope.
curl --request POST \
--url https://api.arcuserp.com/v1/reports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"report_type": "<string>",
"parameters": {
"include_historical": true
},
"format": "json"
}
'import requests
url = "https://api.arcuserp.com/v1/reports"
payload = {
"report_type": "<string>",
"parameters": { "include_historical": True },
"format": "json"
}
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({
report_type: '<string>',
parameters: {include_historical: true},
format: 'json'
})
};
fetch('https://api.arcuserp.com/v1/reports', 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/reports",
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([
'report_type' => '<string>',
'parameters' => [
'include_historical' => true
],
'format' => 'json'
]),
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/reports"
payload := strings.NewReader("{\n \"report_type\": \"<string>\",\n \"parameters\": {\n \"include_historical\": true\n },\n \"format\": \"json\"\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/reports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"report_type\": \"<string>\",\n \"parameters\": {\n \"include_historical\": true\n },\n \"format\": \"json\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/reports")
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 \"report_type\": \"<string>\",\n \"parameters\": {\n \"include_historical\": true\n },\n \"format\": \"json\"\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "pending"
}{
"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.
255Body
One of the keys returned by GET /v1/reports/types.
Report-specific filter parameters. Schema depends on report_type
(see GET /v1/reports/types). All report types accept the optional
include_historical boolean (default true): set false to
EXCLUDE migration-backfill rows (is_historical_import = true)
so revenue / sales aggregations reflect the LIVE business only.
Aging reports (ar_aging / ap_aging) accept it for surface
consistency but treat it as a no-op (an open balance is owed
regardless of import origin).
Show child attributes
Show child attributes
Artifact format. csv is UTF-8 WITH a byte order mark: the file begins
with the 3 bytes EF BB BF (U+FEFF) and is served as
Content-Type: text/csv; charset=utf-8. The BOM is required for Microsoft
Excel on Windows, which sniffs the BOM and ignores the MIME charset. Read it
with a BOM-aware decoder (encoding='utf-8-sig' in Python,
new UTF8Encoding(true) in .NET, TextDecoder('utf-8', {ignoreBOM:false})
in JS) or strip the leading U+FEFF, otherwise the FIRST column name arrives as
<name>. The completed job echoes the contract in
metadata.artifact.csv_encoding ("utf-8-bom"). json is BOM-free per
RFC 8259; xlsx / pdf are binary.
json, csv, xlsx, pdf Was this page helpful?

