Export Company Payroll Report Data via API Integration
This article is a guide on how to create a Company Payroll Report API integration to export company payroll data from the BrioHR Payroll module.
Note: For a comprehensive overview of the BrioHR API integration flow, please refer to the article here.
IMPORTANT:
To enable this integration, you will need to contact our support team via email or live chat so we can provide the necessary access. Please contact us via:
- Email: support@briohr.com
- Live chat: Available 9 am - 6 pm (Kuala Lumpur working days)
Note: If you are still in the implementation stage, please reach out to your implementation manager for support.
The integration flow with BrioHR will consist of the steps below:
- Client request for the APIs/integration access together with the list of IPs (recommended for securing the line of integration).
- BrioHR will create the credentials for client. Consists of: Authentication credentials and client’s ID.
- Client can try to connect to BrioHR API using the link, authentication & ID.
Report API URL:
https://static.api.briohr.com/v2/api/external/reports/payroll-report/download
| Header | Value |
| Authorization |
|
| x-api-context-company | <company id> |
| x-resource-type | payroll-report |
| Query Parameter | Mandatory/Optional | Example Value |
| country | Mandatory | MY (ISO-2; expands to every payroll center of that country for the company unless payrollCenter is also provided). Supported: MY, SG. |
| period | Mandatory | 2026-04 (YYYY-MM - single month, Mode = Monthly) |
| payrollCenter | Optional | 66f1a2b3c4d5e6f708091011 (comma-seperated for multiple PCs; each id must belong to your company). When provided, explicit ids win over country. |
| cycleName | Optional | Bonus Cycle (the cycle's name as shown in BrioHR; case-sensitive). Only valid when exactly one payrollCenter is targeted. Pass CombinedCycle or omit for the combined view |
| granularity | Optional (Default employees) |
employees | employees and departments |
| format | Optional (Default csv) |
csv | json |
For Power BI & other 3rd party that cannot inject the x-api-context-company in the header:
Expected output: payroll-report.csv (or payroll-report.json when format=json).
Example of CURL
curl -o payroll-report.csv --location
'https://static.api.briohr.com/v2/api/external/reports/payroll-report/download?
format=csv&country=MY&period=2026-04' \
--header 'Authorization: Basic aHotYXBwOmJyaW9ocg==' \
--header 'x-api-context-company: 6100c5285e18f90007694f8a' \
--header 'x-resource-type: payroll-report'
Example of CURL for PowerBI
curl -o payroll-report.csv --location
'https://static.api.briohr.com/v2/api/external/reports/payroll-report/download?
format=csv&company=6100c5285e18f90007694f8a&resource=payroll-report&country=MY&period=2026-
04' \
--header 'Authorization: Basic aHotYXBwOmJyaW9ocg=='
Example of CSV Output
A row per employee. Columns are Title Case (e.g., "First Name", "Basic Salary"). The full set is ~100 columns covering identity, employment, tax/statutory categories, and
earnings/deductions; the exact column set depends on the country (MY vs SG). Truncated
sample showing the first columns:
"Manager","Job Title","Age","Employment Type","Office","Nationality","Joining
Date","Active/Inactive","Salary","Department","Internal Id","First Name","Last
Name","Email","Payroll Center","Basic Salary","Gross Earnings","Net Pay","Total Employee
Deductions","Total Employer Deductions", ...
"Francis Wiley","HR demo","","","Nabil Group","Malaysian","2020-01-
01","Active",3600,"Mangement","00004","Kaseem","Avery","taticawyho@mailinator.com","Nabil
Group",3600,3600,2808,792,936, ...
NOTES:
-
Returns the same source data as the Company Payroll Report in the BrioHR web app. The CSV column set and order differ from the web app's "Export CSV" — the API returns the raw column set (~100+ fields), while the web app's export uses a curated, smaller column set. Values for shared columns (Internal Id, First Name, Basic Salary, Net Pay, etc.) match.
-
cycleNameis case-insensitive but only works when a singlepayrollCenter
is targeted. PassCombined Cycle(or omit) for the combined view across all cycles in the period. -
Every
payrollCenterID you pass must belong to your company. Placeholder IDs in this doc (e.g.66f1a2b3c4d5e6f708091011) are illustrative — replace them with your real IDs.
IMPORTANT:
Kindly be informed that BrioHR will need to whitelist the client's IP and then provide the client with the username, password and company ID.
Common Errors
| HTTP | Body message | Cause |
| 400 | country is required (e.g. MY, SG) |
Missing country param |
|
400 |
country must be one of: MY, SG |
Unknown or unsupported country code |
| 400 | no payroll centers found for country <CODE>; passpayrollCenter explicitly or use a different country |
Your company has no payroll centers in that country |
| 400 | period is required(format YYYY-MM) |
Missing period |
| 400 | period must be in YYYY-MM format |
Invalid period shape (e.g.Apr2026) |
| 400 | cycleName "<name>" can only be used when a single payrollCenter is targeted |
Used cycleNamewith 0 or 2+ payroll centers |
| 400 | cycleName "<name>" not found for the selected payroll center and period |
The cycle name doesn't exist for that payroll center + period combination |
| 500 | Cannot read property 'country' of undefined(type: "typescript") |
One or morepayrollCenterIDs do not belong to your company. Fix: replace any placeholder IDs with the real IDs your BrioHR contact provided. |
| 403 | (no body) | Invalid API key, IP not allowlisted, or the integration isn't enabled forpayroll-report |
Need Assistance?
If you have any questions regarding the API above or require assistance, please reach out to our support team via live chat or email us at support@briohr.com.