curl -sS -X POST "$FLUIDE_BASE_URL/api/v1/payments/collections/mobile-money" \ -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/payments/collections/mobile-money`, { 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/payments/collections/mobile-money", 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/payments/collections/mobile-money")) .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/payments/collections/mobile-money");
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": true,
"message": "Operation completed successfully",
"data": {}
}{
"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"
]
}
}Initiate a mobile money collection charge
curl -sS -X POST "$FLUIDE_BASE_URL/api/v1/payments/collections/mobile-money" \ -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/payments/collections/mobile-money`, { 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/payments/collections/mobile-money", 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/payments/collections/mobile-money")) .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/payments/collections/mobile-money");
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": true,
"message": "Operation completed successfully",
"data": {}
}{
"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
Charge amount in major currency units (e.g. 1000 GHS).
x >= 0.011000
ISO currency. Maps to charge type when type is omitted (GHS→ghana, UGX→uganda, RWF→rwanda, ZMW→zambia, XAF/XOF→franco).
"GHS"
"customer@example.com"
Customer mobile money MSISDN.
"0551234567"
Unique transaction reference (6–42 chars). Generated when omitted.
6 - 42"fwmomo-org123-a1b2c3d4"
Charge type query param. Inferred from currency when omitted.
mobile_money_ghana, mobile_money_uganda, mobile_money_rwanda, mobile_money_zambia, mobile_money_franco Required for Ghana, Uganda, and Zambia (e.g. MTN, VODAFONE, AIRTEL).
"MTN"
ISO 3166-1 alpha-2 country. Required for Francophone (XAF/XOF).
2"CM"
Required for Uganda mobile money.
"128373"
Required for Rwanda and Zambia. Generated when omitted for those corridors.
"ORD_MM_1585323540079"
"Jane Doe"
Optional redirect after customer completes authorization.
"https://app.example.com/pay/return"
{
"checkoutSessionId": "uuid",
"organizationId": "uuid"
}
"154.123.220.1"
"62wd23423rq324323qew1"