curl -sS -X POST "$FLUIDE_BASE_URL/api/v1/payroll/payroll/process" \
-H "Authorization: Bearer $FLUIDE_ACCESS_TOKEN" \
-H "X-Fluide-Api-Key: $FLUIDE_API_KEY" \
-H "X-Fluide-Client-Id: fluide-developer" \
-H "X-Workspace-Id: $FLUIDE_WORKSPACE_ID" \
-H "X-Acting-Company-Id: $FLUIDE_COMPANY_ID" \
-H "Content-Type: application/json" \
-d '{}'const baseUrl = process.env.FLUIDE_BASE_URL;
const response = await fetch(`${baseUrl}/api/v1/payroll/payroll/process`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.FLUIDE_ACCESS_TOKEN}`,
'X-Fluide-Api-Key': process.env.FLUIDE_API_KEY,
'X-Fluide-Client-Id': 'fluide-developer',
'X-Workspace-Id': process.env.FLUIDE_WORKSPACE_ID,
'X-Acting-Company-Id': process.env.FLUIDE_COMPANY_ID,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());import os
import requests
base_url = os.environ["FLUIDE_BASE_URL"]
headers = {
"Authorization": f"Bearer {os.environ['FLUIDE_ACCESS_TOKEN']}",
"X-Fluide-Api-Key": os.environ["FLUIDE_API_KEY"],
"X-Fluide-Client-Id": "fluide-developer",
"X-Workspace-Id": os.environ["FLUIDE_WORKSPACE_ID"],
"X-Acting-Company-Id": os.environ["FLUIDE_COMPANY_ID"],
}
response = requests.post(
f"{base_url}/api/v1/payroll/payroll/process",
headers=headers,
json={},
timeout=30,
)
response.raise_for_status()
print(response.json())import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String baseUrl = System.getenv("FLUIDE_BASE_URL");
HttpClient client = HttpClient.newHttpClient();
HttpRequest.Builder builder = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/api/v1/payroll/payroll/process"))
.header("Authorization", "Bearer " + System.getenv("FLUIDE_ACCESS_TOKEN"))
.header("X-Fluide-Api-Key", System.getenv("FLUIDE_API_KEY"))
.header("X-Fluide-Client-Id", "fluide-developer")
.header("X-Workspace-Id", System.getenv("FLUIDE_WORKSPACE_ID"))
.header("X-Acting-Company-Id", System.getenv("FLUIDE_COMPANY_ID"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("{}"))
.build();
HttpResponse<String> response = client.send(builder.build(), HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) throw new RuntimeException("HTTP " + response.statusCode() + ": " + response.body());
System.out.println(response.body());<?php
$baseUrl = getenv("FLUIDE_BASE_URL");
$ch = curl_init($baseUrl . "/api/v1/payroll/payroll/process");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('FLUIDE_ACCESS_TOKEN'),
'X-Fluide-Api-Key: ' . getenv('FLUIDE_API_KEY'),
'X-Fluide-Client-Id: fluide-developer',
'X-Workspace-Id: ' . getenv('FLUIDE_WORKSPACE_ID'),
'X-Acting-Company-Id: ' . getenv('FLUIDE_COMPANY_ID'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => "{}",
]);
$response = curl_exec($ch);
if ($response === false) throw new RuntimeException(curl_error($ch));
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($status >= 400) throw new RuntimeException("HTTP $status: $response");
echo $response;{
"organizationId": "<string>",
"companyId": "<string>",
"title": "<string>",
"periodMonth": 123,
"periodYear": 123,
"countryCode": "<string>",
"idempotencyKey": "<string>",
"totalGross": 123,
"totalDeductions": 123,
"totalNet": 123,
"currency": "<string>",
"totalsByCurrency": {},
"processedBy": "<string>",
"processedAt": "2023-11-07T05:31:56Z",
"lockedAt": "2023-11-07T05:31:56Z",
"submittedAt": "2023-11-07T05:31:56Z",
"approvedAt": "2023-11-07T05:31:56Z",
"rejectedAt": "2023-11-07T05:31:56Z",
"validatedAt": "2023-11-07T05:31:56Z",
"ruleSnapshotId": "<string>",
"calculationFingerprint": "<string>",
"includedEmployeeIds": [
"<string>"
],
"payrollCycleId": "<string>",
"isOffCycle": true,
"periodStart": "<string>",
"periodEnd": "<string>",
"payDate": "<string>",
"runType": {},
"offCycleReason": "<string>",
"retroEffectiveDate": "<string>",
"retroReason": "<string>",
"referencePayrollRunId": "<string>",
"settlementSnapshot": {},
"taxRemittanceDocumentUrl": "<string>",
"taxRemittanceArtifactId": "<string>",
"payslips": [
{
"payrollRunId": "<string>",
"payrollRun": "<unknown>",
"employeeId": "<string>",
"employee": {},
"basicSalary": 123,
"allowances": {},
"deductions": {},
"grossPay": 123,
"netPay": 123,
"currency": "<string>",
"payoutCurrency": "<string>",
"employerLegalName": "<string>",
"disbursementQueuedAt": "2023-11-07T05:31:56Z",
"disbursementReference": "<string>",
"disbursementError": "<string>",
"documentPublicUrl": "<string>",
"documentContentHash": "<string>",
"documentArtifactId": "<string>",
"documentReadyAt": "2023-11-07T05:31:56Z",
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}
],
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}{
"success": false,
"message": "Validation failed",
"code": "VALIDATION_FAILED",
"statusCode": 400,
"timestamp": "2026-06-03T12:00:00.000Z",
"errors": {
"from": [
"from must be a valid date"
]
}
}{
"success": false,
"message": "Validation failed",
"code": "VALIDATION_FAILED",
"statusCode": 400,
"timestamp": "2026-06-03T12:00:00.000Z",
"errors": {
"from": [
"from must be a valid date"
]
}
}{
"success": false,
"message": "Validation failed",
"code": "VALIDATION_FAILED",
"statusCode": 400,
"timestamp": "2026-06-03T12:00:00.000Z",
"errors": {
"from": [
"from must be a valid date"
]
}
}{
"success": false,
"message": "Validation failed",
"code": "VALIDATION_FAILED",
"statusCode": 400,
"timestamp": "2026-06-03T12:00:00.000Z",
"errors": {
"from": [
"from must be a valid date"
]
}
}Process payroll for a company and period
curl -sS -X POST "$FLUIDE_BASE_URL/api/v1/payroll/payroll/process" \
-H "Authorization: Bearer $FLUIDE_ACCESS_TOKEN" \
-H "X-Fluide-Api-Key: $FLUIDE_API_KEY" \
-H "X-Fluide-Client-Id: fluide-developer" \
-H "X-Workspace-Id: $FLUIDE_WORKSPACE_ID" \
-H "X-Acting-Company-Id: $FLUIDE_COMPANY_ID" \
-H "Content-Type: application/json" \
-d '{}'const baseUrl = process.env.FLUIDE_BASE_URL;
const response = await fetch(`${baseUrl}/api/v1/payroll/payroll/process`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.FLUIDE_ACCESS_TOKEN}`,
'X-Fluide-Api-Key': process.env.FLUIDE_API_KEY,
'X-Fluide-Client-Id': 'fluide-developer',
'X-Workspace-Id': process.env.FLUIDE_WORKSPACE_ID,
'X-Acting-Company-Id': process.env.FLUIDE_COMPANY_ID,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());import os
import requests
base_url = os.environ["FLUIDE_BASE_URL"]
headers = {
"Authorization": f"Bearer {os.environ['FLUIDE_ACCESS_TOKEN']}",
"X-Fluide-Api-Key": os.environ["FLUIDE_API_KEY"],
"X-Fluide-Client-Id": "fluide-developer",
"X-Workspace-Id": os.environ["FLUIDE_WORKSPACE_ID"],
"X-Acting-Company-Id": os.environ["FLUIDE_COMPANY_ID"],
}
response = requests.post(
f"{base_url}/api/v1/payroll/payroll/process",
headers=headers,
json={},
timeout=30,
)
response.raise_for_status()
print(response.json())import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String baseUrl = System.getenv("FLUIDE_BASE_URL");
HttpClient client = HttpClient.newHttpClient();
HttpRequest.Builder builder = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/api/v1/payroll/payroll/process"))
.header("Authorization", "Bearer " + System.getenv("FLUIDE_ACCESS_TOKEN"))
.header("X-Fluide-Api-Key", System.getenv("FLUIDE_API_KEY"))
.header("X-Fluide-Client-Id", "fluide-developer")
.header("X-Workspace-Id", System.getenv("FLUIDE_WORKSPACE_ID"))
.header("X-Acting-Company-Id", System.getenv("FLUIDE_COMPANY_ID"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("{}"))
.build();
HttpResponse<String> response = client.send(builder.build(), HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) throw new RuntimeException("HTTP " + response.statusCode() + ": " + response.body());
System.out.println(response.body());<?php
$baseUrl = getenv("FLUIDE_BASE_URL");
$ch = curl_init($baseUrl . "/api/v1/payroll/payroll/process");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('FLUIDE_ACCESS_TOKEN'),
'X-Fluide-Api-Key: ' . getenv('FLUIDE_API_KEY'),
'X-Fluide-Client-Id: fluide-developer',
'X-Workspace-Id: ' . getenv('FLUIDE_WORKSPACE_ID'),
'X-Acting-Company-Id: ' . getenv('FLUIDE_COMPANY_ID'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => "{}",
]);
$response = curl_exec($ch);
if ($response === false) throw new RuntimeException(curl_error($ch));
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($status >= 400) throw new RuntimeException("HTTP $status: $response");
echo $response;{
"organizationId": "<string>",
"companyId": "<string>",
"title": "<string>",
"periodMonth": 123,
"periodYear": 123,
"countryCode": "<string>",
"idempotencyKey": "<string>",
"totalGross": 123,
"totalDeductions": 123,
"totalNet": 123,
"currency": "<string>",
"totalsByCurrency": {},
"processedBy": "<string>",
"processedAt": "2023-11-07T05:31:56Z",
"lockedAt": "2023-11-07T05:31:56Z",
"submittedAt": "2023-11-07T05:31:56Z",
"approvedAt": "2023-11-07T05:31:56Z",
"rejectedAt": "2023-11-07T05:31:56Z",
"validatedAt": "2023-11-07T05:31:56Z",
"ruleSnapshotId": "<string>",
"calculationFingerprint": "<string>",
"includedEmployeeIds": [
"<string>"
],
"payrollCycleId": "<string>",
"isOffCycle": true,
"periodStart": "<string>",
"periodEnd": "<string>",
"payDate": "<string>",
"runType": {},
"offCycleReason": "<string>",
"retroEffectiveDate": "<string>",
"retroReason": "<string>",
"referencePayrollRunId": "<string>",
"settlementSnapshot": {},
"taxRemittanceDocumentUrl": "<string>",
"taxRemittanceArtifactId": "<string>",
"payslips": [
{
"payrollRunId": "<string>",
"payrollRun": "<unknown>",
"employeeId": "<string>",
"employee": {},
"basicSalary": 123,
"allowances": {},
"deductions": {},
"grossPay": 123,
"netPay": 123,
"currency": "<string>",
"payoutCurrency": "<string>",
"employerLegalName": "<string>",
"disbursementQueuedAt": "2023-11-07T05:31:56Z",
"disbursementReference": "<string>",
"disbursementError": "<string>",
"documentPublicUrl": "<string>",
"documentContentHash": "<string>",
"documentArtifactId": "<string>",
"documentReadyAt": "2023-11-07T05:31:56Z",
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}
],
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}{
"success": false,
"message": "Validation failed",
"code": "VALIDATION_FAILED",
"statusCode": 400,
"timestamp": "2026-06-03T12:00:00.000Z",
"errors": {
"from": [
"from must be a valid date"
]
}
}{
"success": false,
"message": "Validation failed",
"code": "VALIDATION_FAILED",
"statusCode": 400,
"timestamp": "2026-06-03T12:00:00.000Z",
"errors": {
"from": [
"from must be a valid date"
]
}
}{
"success": false,
"message": "Validation failed",
"code": "VALIDATION_FAILED",
"statusCode": 400,
"timestamp": "2026-06-03T12:00:00.000Z",
"errors": {
"from": [
"from must be a valid date"
]
}
}{
"success": false,
"message": "Validation failed",
"code": "VALIDATION_FAILED",
"statusCode": 400,
"timestamp": "2026-06-03T12:00:00.000Z",
"errors": {
"from": [
"from must be a valid date"
]
}
}Authorizations
Access token JWT. Use as Authorization: Bearer . In the API playground, paste the JWT only.
Developer API key (fl_dev_...). Required on every API call with a machine access token.
First-party client audience. Must match the fluide_client_id claim on the JWT. Use fluide-developer for Connect.
Headers
Partner / ISV only: UUID of the workspace that owns the client company. Required together with X-Acting-Company-Id when scoping product APIs to a merchant. See /getting-started/multi-tenancy.
Partner / ISV only: UUID of the client company to act on. Must belong to the workspace in X-Workspace-Id.
Body
Company ID (from FluideAuth)
"c0a80123-..."
Payroll period month (1-12)
1 <= x <= 123
Payroll period year
2026
Inclusive period start (ISO date)
"2026-03-01"
Inclusive period end (ISO date)
"2026-03-15"
Scheduled pay date (ISO date)
"2026-03-16"
SCHEDULED, OFF_CYCLE Required when runType is OFF_CYCLE
255Client-supplied idempotency key for off-cycle runs (dedupes retries)
128If true, recompute when prior run failed/processing (immutability preserved after validation)
Payroll employee UUIDs to include. Omit for all active employees. Must match an existing run unless forceRecalculate is true.
1Reusable payroll cycle template to seed period and roster
Response
Successful response