curl --request POST \
--url https://api.arcuserp.com/v1/fiscal-periods/{id}/close-fiscal-year \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"fiscal_year": 2024,
"fy_start_date": "2024-01-01",
"fy_end_date": "2024-12-31"
}
'import requests
url = "https://api.arcuserp.com/v1/fiscal-periods/{id}/close-fiscal-year"
payload = {
"fiscal_year": 2024,
"fy_start_date": "2024-01-01",
"fy_end_date": "2024-12-31"
}
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({fiscal_year: 2024, fy_start_date: '2024-01-01', fy_end_date: '2024-12-31'})
};
fetch('https://api.arcuserp.com/v1/fiscal-periods/{id}/close-fiscal-year', 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/fiscal-periods/{id}/close-fiscal-year",
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([
'fiscal_year' => 2024,
'fy_start_date' => '2024-01-01',
'fy_end_date' => '2024-12-31'
]),
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/fiscal-periods/{id}/close-fiscal-year"
payload := strings.NewReader("{\n \"fiscal_year\": 2024,\n \"fy_start_date\": \"2024-01-01\",\n \"fy_end_date\": \"2024-12-31\"\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/fiscal-periods/{id}/close-fiscal-year")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"fiscal_year\": 2024,\n \"fy_start_date\": \"2024-01-01\",\n \"fy_end_date\": \"2024-12-31\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/fiscal-periods/{id}/close-fiscal-year")
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 \"fiscal_year\": 2024,\n \"fy_start_date\": \"2024-01-01\",\n \"fy_end_date\": \"2024-12-31\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"je_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"fiscal_year": 123,
"fy_start_date": "2023-12-25",
"fy_end_date": "2023-12-25",
"net_income_loss": 123,
"retained_earnings_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"period_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"balanced": true,
"idempotent": 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": "close_blocked_by_open_period",
"hint": "<string>",
"open_periods": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"period_name": "<string>",
"start_date": "2023-12-25",
"end_date": "2023-12-25",
"status": "<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"
}Close a fiscal year
Posts the fiscal year-end closing journal entry that sweeps revenue and expense activity into retained earnings and locks the fiscal year’s last monthly period. Requires accounting:close_period scope; every monthly period in the fiscal year must already be closed or pending approval, and re-running for a year already closed returns the existing closing entry instead of posting a duplicate.
curl --request POST \
--url https://api.arcuserp.com/v1/fiscal-periods/{id}/close-fiscal-year \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"fiscal_year": 2024,
"fy_start_date": "2024-01-01",
"fy_end_date": "2024-12-31"
}
'import requests
url = "https://api.arcuserp.com/v1/fiscal-periods/{id}/close-fiscal-year"
payload = {
"fiscal_year": 2024,
"fy_start_date": "2024-01-01",
"fy_end_date": "2024-12-31"
}
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({fiscal_year: 2024, fy_start_date: '2024-01-01', fy_end_date: '2024-12-31'})
};
fetch('https://api.arcuserp.com/v1/fiscal-periods/{id}/close-fiscal-year', 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/fiscal-periods/{id}/close-fiscal-year",
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([
'fiscal_year' => 2024,
'fy_start_date' => '2024-01-01',
'fy_end_date' => '2024-12-31'
]),
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/fiscal-periods/{id}/close-fiscal-year"
payload := strings.NewReader("{\n \"fiscal_year\": 2024,\n \"fy_start_date\": \"2024-01-01\",\n \"fy_end_date\": \"2024-12-31\"\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/fiscal-periods/{id}/close-fiscal-year")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"fiscal_year\": 2024,\n \"fy_start_date\": \"2024-01-01\",\n \"fy_end_date\": \"2024-12-31\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/fiscal-periods/{id}/close-fiscal-year")
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 \"fiscal_year\": 2024,\n \"fy_start_date\": \"2024-01-01\",\n \"fy_end_date\": \"2024-12-31\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"je_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"fiscal_year": 123,
"fy_start_date": "2023-12-25",
"fy_end_date": "2023-12-25",
"net_income_loss": 123,
"retained_earnings_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"period_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"balanced": true,
"idempotent": 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": "close_blocked_by_open_period",
"hint": "<string>",
"open_periods": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"period_name": "<string>",
"start_date": "2023-12-25",
"end_date": "2023-12-25",
"status": "<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"
}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
UUID of the last monthly period of the fiscal year
Body
Response
Fiscal year closed (or idempotent return of existing close JE)
Show child attributes
Show child attributes
Was this page helpful?

