curl -sS -X POST "$FLUIDE_BASE_URL/api/v1/payroll/rules/versions" \
-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/rules/versions`, {
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/rules/versions",
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/rules/versions"))
.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/rules/versions");
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;{
"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"
]
}
}Create Rule Version
curl -sS -X POST "$FLUIDE_BASE_URL/api/v1/payroll/rules/versions" \
-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/rules/versions`, {
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/rules/versions",
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/rules/versions"))
.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/rules/versions");
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;{
"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
Country ISO code (e.g., CM, NG)
2Rule type key used by payroll strategies (e.g., CNPS, TAX, PENSION, PAYE, NHF, NSITF, ITF)
30Effective from date
Effective to date
Frozen config payload used for deterministic computation
Response
Successful response