curl --request GET \
--url https://api.filexpress.app/api/external/v1/accounting/reports/budget-vs-actual \
--header 'X-API-Key: <api-key>'const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.filexpress.app/api/external/v1/accounting/reports/budget-vs-actual', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.filexpress.app/api/external/v1/accounting/reports/budget-vs-actual"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.filexpress.app/api/external/v1/accounting/reports/budget-vs-actual",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"status": true,
"data": {
"title": "Presupuesto vs real por centro de costo",
"budget": {
"id": "9d1c5a3e-4b7f-4e2a-9c1d-2f6b8a0e7c11",
"name": "Presupuesto 2026",
"fiscal_year": 2026,
"status": "approved"
},
"month_from": 1,
"month_to": 10,
"expense_threshold": 100,
"income_threshold": 100,
"centers": [
{
"id": "9d1c5a3e-4b7f-4e2a-9c1d-2f6b8a0e7c11",
"code": "01",
"name": "Ventas",
"level": 1,
"parent_id": null,
"is_leaf": false,
"rows": [
{
"account_code": "6102",
"account_name": "Papelería",
"group": "expenses",
"budget": 100,
"actual": 120,
"variance": 20,
"execution_pct": 120,
"status": "exceeded"
}
],
"totals": {
"income": {
"budget": 0,
"actual": 0,
"variance": 0,
"execution_pct": null
},
"costs": {
"budget": 0,
"actual": 0,
"variance": 0,
"execution_pct": null
},
"expenses": {
"budget": 100,
"actual": 120,
"variance": 20,
"execution_pct": 120
}
}
}
],
"totals": {
"income": {
"budget": 0,
"actual": 0,
"variance": 0,
"execution_pct": null
},
"costs": {
"budget": 0,
"actual": 0,
"variance": 0,
"execution_pct": null
},
"expenses": {
"budget": 100,
"actual": 120,
"variance": 20,
"execution_pct": 120
}
}
}
}{
"status": false,
"message": "Invalid API Key."
}{
"status": false,
"message": "This integration does not have the 'hr.employees' permission.",
"required_scope": "hr.employees"
}{
"status": false,
"message": "Validation errors",
"errors": {
"budget_id": [
"No hay un presupuesto aprobado para 2026."
]
}
}{
"status": false,
"message": "Rate limit exceeded. Please try again later.",
"rate_limit": 100
}Budget vs actual
Compares the budget (by default the year’s approved one) against actuals from PROCESSED journal entries, by center and account. status: exceeded (cost/expense with execution above expense_threshold, or actuals with no budget), under (income with execution below income_threshold), or ok.
Required permission: accounting.budgets
curl --request GET \
--url https://api.filexpress.app/api/external/v1/accounting/reports/budget-vs-actual \
--header 'X-API-Key: <api-key>'const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.filexpress.app/api/external/v1/accounting/reports/budget-vs-actual', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.filexpress.app/api/external/v1/accounting/reports/budget-vs-actual"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.filexpress.app/api/external/v1/accounting/reports/budget-vs-actual",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"status": true,
"data": {
"title": "Presupuesto vs real por centro de costo",
"budget": {
"id": "9d1c5a3e-4b7f-4e2a-9c1d-2f6b8a0e7c11",
"name": "Presupuesto 2026",
"fiscal_year": 2026,
"status": "approved"
},
"month_from": 1,
"month_to": 10,
"expense_threshold": 100,
"income_threshold": 100,
"centers": [
{
"id": "9d1c5a3e-4b7f-4e2a-9c1d-2f6b8a0e7c11",
"code": "01",
"name": "Ventas",
"level": 1,
"parent_id": null,
"is_leaf": false,
"rows": [
{
"account_code": "6102",
"account_name": "Papelería",
"group": "expenses",
"budget": 100,
"actual": 120,
"variance": 20,
"execution_pct": 120,
"status": "exceeded"
}
],
"totals": {
"income": {
"budget": 0,
"actual": 0,
"variance": 0,
"execution_pct": null
},
"costs": {
"budget": 0,
"actual": 0,
"variance": 0,
"execution_pct": null
},
"expenses": {
"budget": 100,
"actual": 120,
"variance": 20,
"execution_pct": 120
}
}
}
],
"totals": {
"income": {
"budget": 0,
"actual": 0,
"variance": 0,
"execution_pct": null
},
"costs": {
"budget": 0,
"actual": 0,
"variance": 0,
"execution_pct": null
},
"expenses": {
"budget": 100,
"actual": 120,
"variance": 20,
"execution_pct": 120
}
}
}
}{
"status": false,
"message": "Invalid API Key."
}{
"status": false,
"message": "This integration does not have the 'hr.employees' permission.",
"required_scope": "hr.employees"
}{
"status": false,
"message": "Validation errors",
"errors": {
"budget_id": [
"No hay un presupuesto aprobado para 2026."
]
}
}{
"status": false,
"message": "Rate limit exceeded. Please try again later.",
"rate_limit": 100
}Authorizations
Integration API Key (Integrations → New Integration).
Query Parameters
Year (default the current one).
Budget to compare (default the year's approved one).
Start month (1–12).
1 <= x <= 12End month (1–12).
1 <= x <= 12Cost centers to include (repeatable). Without it, the whole tree.
Includes sub-centers (default true).
Groups accounts under the ancestor at that level.
Restricts actuals to one branch.
Execution threshold for costs and expenses (default 100).
Execution threshold for income (default 100).
json (default), pdf or excel (downloads presupuesto-vs-real-YYYY).
json, pdf, excel