await afriex.transactions.submitPoolAccountPaymentProof({
amount: 5000,
customerId: "customer-id",
countryCode: "NG",
reference: "pool-account-reference",
fileKey: "s3-object-key",
timestamp: "2026-01-01T12:00:00.000Z",
});
curl --request POST \
--url https://sandbox.api.afriex.com/api/v1/transaction/pool-account \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"amount": 5000,
"customerId": "6929843e2c4653277440acc0",
"countryCode": "NG",
"reference": "6929843e2c4653277440acc0",
"fileKey": "64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf",
"timestamp": "2026-01-01T12:00:00.000Z"
}
'import requests
url = "https://sandbox.api.afriex.com/api/v1/transaction/pool-account"
payload = {
"amount": 5000,
"customerId": "6929843e2c4653277440acc0",
"countryCode": "NG",
"reference": "6929843e2c4653277440acc0",
"fileKey": "64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf",
"timestamp": "2026-01-01T12:00:00.000Z"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
amount: 5000,
customerId: '6929843e2c4653277440acc0',
countryCode: 'NG',
reference: '6929843e2c4653277440acc0',
fileKey: '64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf',
timestamp: '2026-01-01T12:00:00.000Z'
})
};
fetch('https://sandbox.api.afriex.com/api/v1/transaction/pool-account', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.api.afriex.com/api/v1/transaction/pool-account",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'amount' => 5000,
'customerId' => '6929843e2c4653277440acc0',
'countryCode' => 'NG',
'reference' => '6929843e2c4653277440acc0',
'fileKey' => '64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf',
'timestamp' => '2026-01-01T12:00:00.000Z'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.api.afriex.com/api/v1/transaction/pool-account"
payload := strings.NewReader("{\n \"amount\": 5000,\n \"customerId\": \"6929843e2c4653277440acc0\",\n \"countryCode\": \"NG\",\n \"reference\": \"6929843e2c4653277440acc0\",\n \"fileKey\": \"64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf\",\n \"timestamp\": \"2026-01-01T12:00:00.000Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.api.afriex.com/api/v1/transaction/pool-account")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 5000,\n \"customerId\": \"6929843e2c4653277440acc0\",\n \"countryCode\": \"NG\",\n \"reference\": \"6929843e2c4653277440acc0\",\n \"fileKey\": \"64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf\",\n \"timestamp\": \"2026-01-01T12:00:00.000Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.afriex.com/api/v1/transaction/pool-account")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 5000,\n \"customerId\": \"6929843e2c4653277440acc0\",\n \"countryCode\": \"NG\",\n \"reference\": \"6929843e2c4653277440acc0\",\n \"fileKey\": \"64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf\",\n \"timestamp\": \"2026-01-01T12:00:00.000Z\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"transactionId": "<string>",
"customerId": "<string>",
"sourceId": "<string>",
"destinationId": "<string>",
"sourceAmount": "<string>",
"sourceCurrency": "<string>",
"destinationAmount": "<string>",
"destinationCurrency": "<string>",
"type": "DEPOSIT",
"channel": "BANK_ACCOUNT",
"status": "PENDING",
"merchantReference": "<string>",
"rate": "<string>",
"fee": "<string>",
"meta": {
"narration": "<string>",
"otpRequired": true,
"failureReason": {
"code": "AFX_VELOCITY_LIMIT_EXCEEDED",
"message": "<string>",
"retryable": true
}
},
"createdAt": "<string>",
"updatedAt": "<string>"
}
}Submit Pool-Account Payment Proof
Submits proof of a deposit made to the business pool account. The request creates a business deposit transaction in IN_REVIEW status; an operator confirms the bank inflow before the funds are credited. The response returns that transaction. Duplicate submissions of the same business, customer, amount, reference, timestamp and sender details within the configured idempotency window are rejected.
await afriex.transactions.submitPoolAccountPaymentProof({
amount: 5000,
customerId: "customer-id",
countryCode: "NG",
reference: "pool-account-reference",
fileKey: "s3-object-key",
timestamp: "2026-01-01T12:00:00.000Z",
});
curl --request POST \
--url https://sandbox.api.afriex.com/api/v1/transaction/pool-account \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"amount": 5000,
"customerId": "6929843e2c4653277440acc0",
"countryCode": "NG",
"reference": "6929843e2c4653277440acc0",
"fileKey": "64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf",
"timestamp": "2026-01-01T12:00:00.000Z"
}
'import requests
url = "https://sandbox.api.afriex.com/api/v1/transaction/pool-account"
payload = {
"amount": 5000,
"customerId": "6929843e2c4653277440acc0",
"countryCode": "NG",
"reference": "6929843e2c4653277440acc0",
"fileKey": "64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf",
"timestamp": "2026-01-01T12:00:00.000Z"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
amount: 5000,
customerId: '6929843e2c4653277440acc0',
countryCode: 'NG',
reference: '6929843e2c4653277440acc0',
fileKey: '64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf',
timestamp: '2026-01-01T12:00:00.000Z'
})
};
fetch('https://sandbox.api.afriex.com/api/v1/transaction/pool-account', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.api.afriex.com/api/v1/transaction/pool-account",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'amount' => 5000,
'customerId' => '6929843e2c4653277440acc0',
'countryCode' => 'NG',
'reference' => '6929843e2c4653277440acc0',
'fileKey' => '64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf',
'timestamp' => '2026-01-01T12:00:00.000Z'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.api.afriex.com/api/v1/transaction/pool-account"
payload := strings.NewReader("{\n \"amount\": 5000,\n \"customerId\": \"6929843e2c4653277440acc0\",\n \"countryCode\": \"NG\",\n \"reference\": \"6929843e2c4653277440acc0\",\n \"fileKey\": \"64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf\",\n \"timestamp\": \"2026-01-01T12:00:00.000Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.api.afriex.com/api/v1/transaction/pool-account")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 5000,\n \"customerId\": \"6929843e2c4653277440acc0\",\n \"countryCode\": \"NG\",\n \"reference\": \"6929843e2c4653277440acc0\",\n \"fileKey\": \"64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf\",\n \"timestamp\": \"2026-01-01T12:00:00.000Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.afriex.com/api/v1/transaction/pool-account")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 5000,\n \"customerId\": \"6929843e2c4653277440acc0\",\n \"countryCode\": \"NG\",\n \"reference\": \"6929843e2c4653277440acc0\",\n \"fileKey\": \"64f0c2a1e4b0a1b2c3d4e5f6/proof.pdf\",\n \"timestamp\": \"2026-01-01T12:00:00.000Z\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"transactionId": "<string>",
"customerId": "<string>",
"sourceId": "<string>",
"destinationId": "<string>",
"sourceAmount": "<string>",
"sourceCurrency": "<string>",
"destinationAmount": "<string>",
"destinationCurrency": "<string>",
"type": "DEPOSIT",
"channel": "BANK_ACCOUNT",
"status": "PENDING",
"merchantReference": "<string>",
"rate": "<string>",
"fee": "<string>",
"meta": {
"narration": "<string>",
"otpRequired": true,
"failureReason": {
"code": "AFX_VELOCITY_LIMIT_EXCEEDED",
"message": "<string>",
"retryable": true
}
},
"createdAt": "<string>",
"updatedAt": "<string>"
}
}IN_REVIEW; an operator confirms the bank inflow before the funds are credited.
Flow
Upload the proof
type: "transaction" and PUT the proof file (bank receipt, screenshot, etc.) to the returned presigned URL.type matters. A URL requested with type: "user" uploads to a different bucket; passing that key here is rejected as not found.Submit the proof
amount, the countryCode of the pool account, the pool-account reference (see below), the S3 fileKey returned in step 1, and the payment timestamp. Optionally attach senderDetails (name, account number, bank, country) to help reconciliation.Wait for confirmation
IN_REVIEW. Subscribe to Transaction Events to be notified when the operator confirms and the status transitions.Choosing the reference
- Credit an end customer: pass the customer’s
reference(the shortened value returned on customer reads; falls back to the customer id when none is assigned).customerIdmust match that customer. - Credit the business itself: pass the business’s own pool-account reference from Get Pool Account. Routing does not use
customerIdin this case.
Idempotency
Duplicate submissions with the same business,customerId, amount, reference, timestamp, and senderDetails within the configured window are rejected with 409 DUPLICATE_REQUEST. Include a distinct timestamp per real payment.Authorizations
Static business API key issued from the dashboard. A business can provision multiple API keys, each scoped to a configurable set of permissions (e.g. read transactions, create deposits, etc). Permissions are chosen per key at creation time in the dashboard and may be revoked by deleting the key. Requests made with a key that does not include the permission required by the target endpoint will be rejected with a 403 Forbidden response; an unrecognised, malformed or revoked key returns 401 Unauthorized. Manage your keys and their permissions under Developer → API keys in the dashboard.
Headers
Signature of the request payload, used for request authentication where payload signing is enabled for your business.
API version in ISO 8601 format (e.g. 2025-12-28). Defaults to latest stable.
Body
The deposit amount in the major currency unit.
x > 0The Afriex customer ID the deposit should be credited to. Applies when reference is a customer reference, in which case it must match that customer. When reference is the business's own pool-account reference the deposit is credited to the business and this field is not used for routing.
ISO 3166-1 alpha-2 country code of the pool account.
The pool-account reference returned by GET /api/v1/payment-method/pool-account. Used to reconcile the deposit.
The S3 object key of the uploaded proof-of-payment file. Obtain this from POST /api/v1/media/url with type: transaction first; a URL requested without that type uploads to a different bucket and the key will be rejected as not found.
ISO 8601 timestamp of when the payment was sent. Used for idempotency together with the other request fields.
Show child attributes
Show child attributes
Response
Proof submitted successfully.
Show child attributes
Show child attributes
