curl --request POST \
--url https://api.arcuserp.com/v1/accounting/statements/{account_id}/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"to_email": "jsmith@example.com",
"from": "2023-12-25",
"to": "2023-12-25",
"custom_message": "<string>"
}
'import requests
url = "https://api.arcuserp.com/v1/accounting/statements/{account_id}/send"
payload = {
"to_email": "jsmith@example.com",
"from": "2023-12-25",
"to": "2023-12-25",
"custom_message": "<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({
to_email: 'jsmith@example.com',
from: '2023-12-25',
to: '2023-12-25',
custom_message: '<string>'
})
};
fetch('https://api.arcuserp.com/v1/accounting/statements/{account_id}/send', 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/accounting/statements/{account_id}/send",
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([
'to_email' => 'jsmith@example.com',
'from' => '2023-12-25',
'to' => '2023-12-25',
'custom_message' => '<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/accounting/statements/{account_id}/send"
payload := strings.NewReader("{\n \"to_email\": \"jsmith@example.com\",\n \"from\": \"2023-12-25\",\n \"to\": \"2023-12-25\",\n \"custom_message\": \"<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/accounting/statements/{account_id}/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"to_email\": \"jsmith@example.com\",\n \"from\": \"2023-12-25\",\n \"to\": \"2023-12-25\",\n \"custom_message\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/accounting/statements/{account_id}/send")
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 \"to_email\": \"jsmith@example.com\",\n \"from\": \"2023-12-25\",\n \"to\": \"2023-12-25\",\n \"custom_message\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"sent_to": "jsmith@example.com",
"send_result": {},
"skipped": true,
"reason": "<string>",
"preference": "<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"
}{
"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"
}Send AR statement to a single customer
accounting:readSends an AR statement to a single customer account for the requested period. The per-account counterpart to the bulk endpoint above; mirrors the same template, gating, and 4-layer customer-email guard.
Industry parity: NetSuite “Email Statement” single-customer action, QuickBooks Online single-customer Statements view, Acumatica per-customer statement send.
Email gating: subject to the entity statement_email notification toggle
(default OFF) and per-account opt-out + global unsubscribe + template unsubscribe.
When gated, returns { skipped: true, reason: 'notification_disabled', preference }
with HTTP 200; the call still succeeds at the API contract level.
curl --request POST \
--url https://api.arcuserp.com/v1/accounting/statements/{account_id}/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"to_email": "jsmith@example.com",
"from": "2023-12-25",
"to": "2023-12-25",
"custom_message": "<string>"
}
'import requests
url = "https://api.arcuserp.com/v1/accounting/statements/{account_id}/send"
payload = {
"to_email": "jsmith@example.com",
"from": "2023-12-25",
"to": "2023-12-25",
"custom_message": "<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({
to_email: 'jsmith@example.com',
from: '2023-12-25',
to: '2023-12-25',
custom_message: '<string>'
})
};
fetch('https://api.arcuserp.com/v1/accounting/statements/{account_id}/send', 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/accounting/statements/{account_id}/send",
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([
'to_email' => 'jsmith@example.com',
'from' => '2023-12-25',
'to' => '2023-12-25',
'custom_message' => '<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/accounting/statements/{account_id}/send"
payload := strings.NewReader("{\n \"to_email\": \"jsmith@example.com\",\n \"from\": \"2023-12-25\",\n \"to\": \"2023-12-25\",\n \"custom_message\": \"<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/accounting/statements/{account_id}/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"to_email\": \"jsmith@example.com\",\n \"from\": \"2023-12-25\",\n \"to\": \"2023-12-25\",\n \"custom_message\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/accounting/statements/{account_id}/send")
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 \"to_email\": \"jsmith@example.com\",\n \"from\": \"2023-12-25\",\n \"to\": \"2023-12-25\",\n \"custom_message\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"sent_to": "jsmith@example.com",
"send_result": {},
"skipped": true,
"reason": "<string>",
"preference": "<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"
}{
"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
Customer account UUID. Must belong to the calling entity (Layer 1).
Body
Override recipient. Defaults to accounts.email lookup. Required if account has no email on file.
Statement period start (ISO date).
Statement period end (ISO date).
Optional one-time message rendered into the statement_email template.
Response
Send result
Postmark send response (message_id + accepted_at).
True when gated by notification preference; success=false in that case.
Populated when skipped=true (e.g. 'notification_disabled').
Populated when skipped=true (the notification key that gated).
Was this page helpful?

