curl --request POST \
--url https://api.arcuserp.com/v1/accounting/statements/bulk-send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"account_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"filter": {
"has_open_balance": true,
"overdue_only": true,
"search": "<string>"
},
"from": "2023-12-25",
"to": "2023-12-25",
"dry_run": false
}
'import requests
url = "https://api.arcuserp.com/v1/accounting/statements/bulk-send"
payload = {
"account_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"filter": {
"has_open_balance": True,
"overdue_only": True,
"search": "<string>"
},
"from": "2023-12-25",
"to": "2023-12-25",
"dry_run": False
}
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({
account_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
filter: {has_open_balance: true, overdue_only: true, search: '<string>'},
from: '2023-12-25',
to: '2023-12-25',
dry_run: false
})
};
fetch('https://api.arcuserp.com/v1/accounting/statements/bulk-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/bulk-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([
'account_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'filter' => [
'has_open_balance' => true,
'overdue_only' => true,
'search' => '<string>'
],
'from' => '2023-12-25',
'to' => '2023-12-25',
'dry_run' => false
]),
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/bulk-send"
payload := strings.NewReader("{\n \"account_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"filter\": {\n \"has_open_balance\": true,\n \"overdue_only\": true,\n \"search\": \"<string>\"\n },\n \"from\": \"2023-12-25\",\n \"to\": \"2023-12-25\",\n \"dry_run\": false\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/bulk-send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"account_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"filter\": {\n \"has_open_balance\": true,\n \"overdue_only\": true,\n \"search\": \"<string>\"\n },\n \"from\": \"2023-12-25\",\n \"to\": \"2023-12-25\",\n \"dry_run\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/accounting/statements/bulk-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 \"account_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"filter\": {\n \"has_open_balance\": true,\n \"overdue_only\": true,\n \"search\": \"<string>\"\n },\n \"from\": \"2023-12-25\",\n \"to\": \"2023-12-25\",\n \"dry_run\": false\n}"
response = http.request(request)
puts response.read_body{
"batch_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"dry_run": true,
"period": {
"from": "2023-12-25",
"to": "2023-12-25"
},
"summary": {
"eligible": 123,
"sent": 123,
"skipped": 123,
"failed": 123
},
"results": [
{
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"customer_name": "<string>",
"email": "<string>",
"status": "sent",
"reason": "<string>",
"postmark_message_id": "<string>",
"error_message": "<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"
}Send AR statements in bulk
Sends an AR statement email to every eligible customer account for the requested period, defaulting to the previous calendar month, and skips accounts with no email on file or with statement emails disabled. Requires accounting:read scope; pass dry_run: true to preview the eligible recipients and skip reasons without sending.
curl --request POST \
--url https://api.arcuserp.com/v1/accounting/statements/bulk-send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"account_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"filter": {
"has_open_balance": true,
"overdue_only": true,
"search": "<string>"
},
"from": "2023-12-25",
"to": "2023-12-25",
"dry_run": false
}
'import requests
url = "https://api.arcuserp.com/v1/accounting/statements/bulk-send"
payload = {
"account_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"filter": {
"has_open_balance": True,
"overdue_only": True,
"search": "<string>"
},
"from": "2023-12-25",
"to": "2023-12-25",
"dry_run": False
}
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({
account_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
filter: {has_open_balance: true, overdue_only: true, search: '<string>'},
from: '2023-12-25',
to: '2023-12-25',
dry_run: false
})
};
fetch('https://api.arcuserp.com/v1/accounting/statements/bulk-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/bulk-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([
'account_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'filter' => [
'has_open_balance' => true,
'overdue_only' => true,
'search' => '<string>'
],
'from' => '2023-12-25',
'to' => '2023-12-25',
'dry_run' => false
]),
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/bulk-send"
payload := strings.NewReader("{\n \"account_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"filter\": {\n \"has_open_balance\": true,\n \"overdue_only\": true,\n \"search\": \"<string>\"\n },\n \"from\": \"2023-12-25\",\n \"to\": \"2023-12-25\",\n \"dry_run\": false\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/bulk-send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"account_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"filter\": {\n \"has_open_balance\": true,\n \"overdue_only\": true,\n \"search\": \"<string>\"\n },\n \"from\": \"2023-12-25\",\n \"to\": \"2023-12-25\",\n \"dry_run\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/accounting/statements/bulk-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 \"account_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"filter\": {\n \"has_open_balance\": true,\n \"overdue_only\": true,\n \"search\": \"<string>\"\n },\n \"from\": \"2023-12-25\",\n \"to\": \"2023-12-25\",\n \"dry_run\": false\n}"
response = http.request(request)
puts response.read_body{
"batch_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"dry_run": true,
"period": {
"from": "2023-12-25",
"to": "2023-12-25"
},
"summary": {
"eligible": 123,
"sent": 123,
"skipped": 123,
"failed": 123
},
"results": [
{
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"customer_name": "<string>",
"email": "<string>",
"status": "sent",
"reason": "<string>",
"postmark_message_id": "<string>",
"error_message": "<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.
Body
Explicit list of customer account UUIDs to send to. When set, overrides filter.
Filter-driven eligibility when account_ids is omitted. Mirrors the AR Aging filter set.
Show child attributes
Show child attributes
Statement period start (ISO date). Defaults to first day of previous calendar month.
Statement period end (ISO date). Defaults to last day of previous calendar month.
Preview mode: returns eligible recipients with skip reasons without sending any email.
Was this page helpful?

