Distributor Internal Posting
Purpose
This functionality allows the distributor to post internal transactions such as debiting client IBANs and transferring funds to an operational account. Internal posting is essential for back-office operations that need to move funds between accounts without going through external payment networks.
When to use
Use this API for back-office operations that require internal fund transfers, such as:
- Collecting fees from customer accounts
- Consolidating funds to operational accounts
- Periodic settlement processes
- Correcting accounting entries
These operations are typically not exposed to end users but are crucial for the distributor's financial management.
Testing Endpoints
You can test these endpoints directly in our API Sandbox.
Available Modes
The Internal Posting API supports two operational modes:
- Transaction Mode - Used for individual transfers processed immediately
- Pre-authorization Mode - Used for transactions requiring additional approval steps
Distributor Internal Posting - Single Transaction
Endpoint
https://sandbox.revsto.com/api/distributor/v1/transactions/distributorPostingpostingInternal posting operations require the posting scope. Access should be restricted to authorized back-office personnel only.
Code Examples
- cURL
- Python
- JavaScript
curl -X POST "https://sandbox.revsto.com/api/distributor/v1/transactions/distributorPosting" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_api_token" \
-d '{
"accounting": [
{
"srcAccount": "10000056878",
"dstAccount": "10000056910",
"amount": {"value": 10, "currency": "EUR"},
"type": "TRANSFER"
}
],
"mode": "TRANSACTION"
}'
import requests
url = "https://sandbox.revsto.com/api/distributor/v1/transactions/distributorPosting"
payload = {
"accounting": [
{
"srcAccount": "10000056878",
"dstAccount": "10000056910",
"amount": {"value": 10, "currency": "EUR"},
"type": "TRANSFER"
}
],
"mode": "TRANSACTION"
}
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer your_api_token"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
fetch("https://sandbox.revsto.com/api/distributor/v1/transactions/distributorPosting", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer your_api_token"
},
body: JSON.stringify({
accounting: [
{
srcAccount: "10000056878",
dstAccount: "10000056910",
amount: { value: 10, currency: "EUR" },
type: "TRANSFER"
}
],
mode: "TRANSACTION"
})
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
Request Body
{
"accounting": [
{
"srcAccount": "10000056878",
"dstAccount": "10000056910",
"amount": {"value": 10, "currency": "EUR"},
"type": "TRANSFER"
}
],
"mode": "TRANSACTION"
}
Sample Response
{
"id": "15047",
"externalId": null,
"processId": null,
"type": "DISTRIBUTOR_POSTING",
"localizedType": {
"value": "DISTRIBUTOR_POSTING",
"label": "Distributor Posting"
},
"amount": {
"value": 10000,
"currency": "EUR"
},
"description": "Transfer from #10000096916 to #10000008325 of 100,00 €",
"shortDescription": "",
"media": "API",
"createdAt": "2025-05-09T11:32:36+03:00",
"businessProcessId": null,
"accountingEntries": [
{
"id": "13215",
"accountId": "10000096916",
"transactionId": "15047",
"externalId": null,
"description": "Transfer to account #10000008325 of 100,00 €",
"type": "TRANSFER",
"amount": {
"value": -10000,
"currency": "EUR"
},
"balance": {
"value": 949876,
"currency": "EUR"
},
"availableBalance": {
"value": 949876,
"currency": "EUR"
},
"createdAt": "2025-05-09T11:32:36+03:00",
"accountOwner": {
"id": "3630",
"name": "My Test Business",
"externalId": null,
"userRole": "COMPANY"
}
},
{
"id": "13216",
"accountId": "10000008325",
"transactionId": "15047",
"externalId": null,
"description": "Transfer of 100,00 € from #10000096916",
"type": "TRANSFER",
"amount": {
"value": 10000,
"currency": "EUR"
},
"balance": {
"value": 10000,
"currency": "EUR"
},
"availableBalance": {
"value": 10000,
"currency": "EUR"
},
"createdAt": "2025-05-09T11:32:36+03:00",
"accountOwner": {
"id": "1016",
"name": "SURESWIPE E.M.I. PLC",
"externalId": null,
"userRole": "DISTRIBUTOR"
}
}
],
"contributions": [
{
"id": "20795",
"role": "INITIATOR",
"device": null,
"contributor": "1016",
"name": "SURESWIPE E.M.I. PLC",
"externalId": null,
"userRole": {},
"employee": null,
"supportId": null
}
]
}
Request Parameters - Transaction Mode
| Parameter | Required | Description |
|---|---|---|
accounting | Yes | Array of accounting entries (at least one entry required) |
accounting[].srcAccount | Yes | Source account number to debit |
accounting[].dstAccount | Yes | Destination account number to credit |
accounting[].amount.value | Yes | Amount to transfer |
accounting[].amount.currency | Yes | Currency code of the amount (e.g., "EUR") |
accounting[].type | Yes | Type of transfer (usually "TRANSFER") |
mode | Yes | Must be set to "TRANSACTION" for standard transactions or "PREAUTH" for pre-authorized transactions |
Distributor Internal Posting - Multiple Transfers
You can include multiple accounting entries in a single request to transfer funds between multiple accounts.
Endpoint
https://sandbox.revsto.com/api/distributor/v1/transactions/distributorPostingpostingInternal posting operations require the posting scope. Access should be restricted to authorized back-office personnel only.
Code Examples
- cURL
- Python
- JavaScript
curl -X POST "https://sandbox.revsto.com/api/distributor/v1/transactions/distributorPosting" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_api_token" \
-d '{
"accounting": [
{
"srcAccount": "10000056878",
"dstAccount": "10000056910",
"amount": {"value": 10, "currency": "EUR"},
"type": "TRANSFER"
},
{
"srcAccount": "10000056878",
"dstAccount": "10000056911",
"amount": {"value": 20, "currency": "EUR"},
"type": "TRANSFER"
}
],
"mode": "BATCH"
}'
import requests
url = "https://sandbox.revsto.com/api/distributor/v1/transactions/distributorPosting"
payload = {
"accounting": [
{
"srcAccount": "10000056878",
"dstAccount": "10000056910",
"amount": {"value": 10, "currency": "EUR"},
"type": "TRANSFER"
},
{
"srcAccount": "10000056878",
"dstAccount": "10000056911",
"amount": {"value": 20, "currency": "EUR"},
"type": "TRANSFER"
}
],
"mode": "BATCH"
}
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer your_api_token"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
fetch("https://sandbox.revsto.com/api/distributor/v1/transactions/distributorPosting", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer your_api_token"
},
body: JSON.stringify({
accounting: [
{
srcAccount: "10000056878",
dstAccount: "10000056910",
amount: { value: 10, currency: "EUR" },
type: "TRANSFER"
},
{
srcAccount: "10000056878",
dstAccount: "10000056911",
amount: { value: 20, currency: "EUR" },
type: "TRANSFER"
}
],
mode: "BATCH"
})
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
Request Body - Multiple Transfers
{
"accounting": [
{
"srcAccount": "10000056878",
"dstAccount": "10000056910",
"amount": {"value": 10, "currency": "EUR"},
"type": "TRANSFER"
},
{
"srcAccount": "10000056878",
"dstAccount": "10000056911",
"amount": {"value": 20, "currency": "EUR"},
"type": "TRANSFER"
}
],
"mode": "BATCH"
}
Sample Response - Multiple Transfers
Similar to single transfers, but with multiple accounting entries reflected in the response.
Request Parameters - Multiple Transfers
| Parameter | Required | Description |
|---|---|---|
accounting | Yes | Array of accounting entries (multiple entries for multiple transfers) |
accounting[].srcAccount | Yes | Source account number to debit |
accounting[].dstAccount | Yes | Destination account number to credit |
accounting[].amount.value | Yes | Amount to transfer |
accounting[].amount.currency | Yes | Currency code of the amount (e.g., "EUR") |
accounting[].type | Yes | Type of transfer (usually "TRANSFER") |
mode | Yes | Must be set to "TRANSACTION" or "PREAUTH" |
Transaction Status and Notifications
Internal posting transactions are automatically settled in real-time. You will receive webhook notifications about the transaction status instead of polling for status updates.
Webhook Notification Example
When an internal posting is completed, you'll receive a webhook notification:
{
"id": "15047",
"webhookId": "0196afb7-268e-730e-917f-c690256e7784",
"type": "transaction",
"event": "transaction.new",
"data": {
"transactionLogId": "15047",
"transactionType": "DISTRIBUTOR_POSTING"
}
}
Transaction Response Structure
The response includes detailed accounting entries showing:
- Source account debit: Negative amount showing funds leaving the source account
- Destination account credit: Positive amount showing funds entering the destination account
- Updated balances: Current balance and available balance for each affected account
- Account ownership: Details about who owns each account involved in the transfer
Transaction Types
| Type | Description |
|---|---|
TRANSFER | Standard transfer between accounts |
FEE | Fee collection from a customer account |
SETTLEMENT | Settlement transaction (typically for batch operations) |
CORRECTION | Correction of a previous accounting entry |
Available Modes
| Mode | Description |
|---|---|
TRANSACTION | Standard transfer processed immediately |
PREAUTH | Pre-authorization mode requiring additional approval steps |
Status Values
Internal posting transactions are processed immediately and have the following characteristics:
- Transactions are automatically settled in real-time
- No intermediate status values - transfers complete immediately or fail
- Status notifications are sent via webhooks rather than polling
Best Practices
-
Use Multiple Entries for Efficiency: When transferring to multiple accounts, include multiple accounting entries in a single request to reduce the number of API calls.
-
Monitor via Webhooks: Internal posting operations are automatically settled. Use webhook notifications to track transaction completion rather than polling for status.
-
Implement Proper Error Handling: Handle API errors appropriately. Failed requests will return error details in the response.
-
Account Validation: Validate source and destination accounts before attempting transfers to avoid rejected transactions.
-
Reconciliation: Use the detailed accounting entries in the response to reconcile internal transfers against account balances.
Security Considerations
Internal posting operations involve direct movement of funds, so they require careful security controls:
-
Access Control: Limit access to internal posting APIs to authorized back-office personnel only.
-
Audit Trail: Maintain comprehensive logs of all internal postings for audit purposes.
-
Dual Authorization: Consider implementing a dual authorization process for transfers above a certain threshold.
-
IP Restrictions: Consider restricting API access to specific IP addresses or VPNs.
Internal posting operations modify account balances directly. Always ensure that source accounts have sufficient funds before initiating transfers to avoid rejected transactions.