Download OpenAPI specification:Download (JSON)
Public API for interfacing with the Getmomo service offering.
This API supports both request/response endpoints and webhook event delivery. See the Webhooks section for details on event types, payload schemas, and signature verification.
Retrieves all deposit accounts with pagination support
| offset | integer >= 0 Default: 0 Example: offset=15 Number of items to skip before returning results |
| limit | integer [ 1 .. 100 ] Default: 15 Example: limit=15 Maximum number of items to return |
| offset required | integer >= 0 Number of items skipped before these results |
| limit required | integer [ 1 .. 100 ] Maximum number of items returned in this response |
| totalItems required | integer >= 0 Total number of items available |
required | Array of objects (DepositAccount) List of deposit accounts for the current page |
{- "offset": 0,
- "limit": 15,
- "totalItems": 2,
- "items": [
- {
- "id": "vWRaPWn3iIDr8iBpdAHpW",
- "createdAt": "2025-09-15T09:00:00+02:00",
- "updatedAt": "2025-10-20T11:30:00+02:00",
- "name": "Property Management GmbH",
- "title": "Primary Account",
- "iban": "DE89370400440532013000",
- "bic": "HSHNDEHHXXX"
}, - {
- "id": "moTEwlVvx2N7U7Eo9Kl6n",
- "createdAt": "2025-09-20T14:15:00+02:00",
- "updatedAt": "2025-10-22T16:45:00+02:00",
- "name": "Property Management GmbH",
- "iban": "DE89370400440532013001",
- "bic": "HSHNDEHHXXX"
}
]
}Retrieves a single deposit account by its unique identifier
| depositAccountId required | string Example: q3a2bQPpNz2tu4nkTrjmI The unique identifier of the deposit account |
| id required | string Unique identifier for the entity |
| createdAt required | string <date-time> Timestamp when the entity was created (ISO 8601 with timezone) |
| updatedAt | string <date-time> Timestamp when the entity was last updated (ISO 8601 with timezone) |
| name required | string Name of the deposit account |
| title | string Optional title for the deposit account |
| iban required | string^[A-Z]{2}[0-9]{2}[A-Z0-9]+$ IBAN of the deposit account |
| bic required | string BIC/SWIFT code of the deposit account |
{- "id": "q3a2bQPpNz2tu4nkTrjmI",
- "createdAt": "2025-09-10T08:30:00+02:00",
- "updatedAt": "2025-10-23T09:15:00+02:00",
- "name": "Property Management GmbH",
- "title": "Primary Account",
- "iban": "DE89370400440532013000",
- "bic": "HSHNDEHHXXX"
}Retrieves all virtual deposit accounts associated with a specific deposit account with pagination support
| depositAccountId required | string Example: TgQBfyro4OHY6Iza0zPQa The unique identifier of the deposit account |
| offset | integer >= 0 Default: 0 Example: offset=15 Number of items to skip before returning results |
| limit | integer [ 1 .. 100 ] Default: 15 Example: limit=15 Maximum number of items to return |
| offset required | integer >= 0 Number of items skipped before these results |
| limit required | integer [ 1 .. 100 ] Maximum number of items returned in this response |
| totalItems required | integer >= 0 Total number of items available |
required | Array of any (VirtualDepositAccount) List of virtual deposit accounts for the current page |
{- "offset": 0,
- "limit": 15,
- "totalItems": 2,
- "items": [
- {
- "id": "C9NS3gndTEXrX6CoHIyGy",
- "createdAt": "2025-09-25T10:30:00+02:00",
- "updatedAt": "2025-10-15T14:20:00+02:00",
- "iban": "DE89370400440532013000",
- "type": "INDIVIDUAL",
- "givenReference": "M03879.Obj0842",
- "sourceId": "pm-2024-unit-789",
- "tenants": [
- {
- "firstName": "Max",
- "lastName": "Mustermann"
}
], - "streetName": "Hauptstraße",
- "streetNumber": "123",
- "postalCode": "10115",
- "region": "Berlin",
- "countryCode": "DE",
- "depositAmountCents": 150000
}, - {
- "id": "MCAtSsrg4gjYK1b9NnZia",
- "createdAt": "2025-09-28T11:45:00+02:00",
- "updatedAt": "2025-10-18T09:30:00+02:00",
- "iban": "DE89370400440532013001",
- "type": "COMPANY",
- "givenReference": "M03880.Obj0843",
- "sourceId": "pm-2024-unit-789",
- "tenants": [
- {
- "companyName": "Mustermann GmbH",
- "companyDirectors": [
- {
- "firstName": "Max",
- "lastName": "Mustermann"
}
]
}
], - "streetName": "Nebenstraße",
- "streetNumber": "456",
- "postalCode": "10117",
- "region": "Berlin",
- "countryCode": "DE",
- "depositAmountCents": 200000
}
]
}Creates a new virtual deposit account for individual tenant(s) or company tenant. Use the 'type' field to specify which type to create.
| depositAccountId required | string Example: EQ4Npb2K_yTUch0oIKWZH The unique identifier of the deposit account |
| givenReference | string Optional reference for the tenancy. We recommend a combination of the tenancy agreement number and property number (e.g. M03879.Obj0842) |
| sourceId | string Optional identifier from your own system. Use this to link the virtual deposit account to records in your property management software or internal database |
| streetName required | string Street name of the rental property |
| streetNumber required | string Street number of the rental property |
| postalCode required | string Postal code of the rental property |
| region required | string Region/state of the rental property |
| countryCode required | string Value: "DE" Country code. Only 'DE' (Deutschland) is accepted as we only support German addresses |
| depositAmountCents required | integer > 0 Deposit amount in cents. Must be a positive integer |
| rentalContractStartDate | string <date> Optional start date of the rental contract (ISO 8601 date format, e.g. 2025-01-01) |
| type required | string Type of virtual deposit account. Must be 'INDIVIDUAL' |
required | Array of objects (IndividualTenant) [ 1 .. 2 ] items Array of individual tenants (minimum 1, maximum 2) |
| id required | string Unique identifier for the entity |
| createdAt required | string <date-time> Timestamp when the entity was created (ISO 8601 with timezone) |
| updatedAt | string <date-time> Timestamp when the entity was last updated (ISO 8601 with timezone) |
| iban required | string^[A-Z]{2}[0-9]{2}[A-Z0-9]+$ The virtual IBAN allocated to this virtual deposit account |
| appLink required | string <uri> Deep link to this virtual deposit account in the Manager App |
| type required | string Type of tenant for this virtual deposit account |
| givenReference | string Optional reference for the tenancy. We recommend a combination of the tenancy agreement number and property number (e.g. M03879.Obj0842) |
| sourceId | string Optional identifier from your own system. Use this to link the virtual deposit account to records in your property management software or internal database |
| streetName required | string Street name of the rental property |
| streetNumber required | string Street number of the rental property |
| postalCode required | string Postal code of the rental property |
| region required | string Region/state of the rental property |
| countryCode required | string Value: "DE" Country code. Only 'DE' (Deutschland) is accepted as we only support German addresses |
| depositAmountCents required | integer > 0 Deposit amount in cents. Must be a positive integer |
| rentalContractStartDate | string <date> Optional start date of the rental contract (ISO 8601 date format, e.g. 2025-01-01) |
required | Array of objects (IndividualTenant) [ 1 .. 2 ] items Array of tenants (minimum 1, maximum 2) |
{- "type": "INDIVIDUAL",
- "givenReference": "M03879.Obj0842",
- "sourceId": "pm-2024-unit-789",
- "tenants": [
- {
- "firstName": "Max",
- "lastName": "Mustermann"
}, - {
- "firstName": "Erika",
- "lastName": "Musterfrau"
}
], - "streetName": "Hauptstraße",
- "streetNumber": "123",
- "postalCode": "10115",
- "region": "Berlin",
- "countryCode": "DE",
- "depositAmountCents": 200000
}{- "id": "C9NS3gndTEXrX6CoHIyGy",
- "createdAt": "2025-10-23T11:00:00+02:00",
- "updatedAt": "2025-10-23T11:00:00+02:00",
- "iban": "DE89370400440532013000",
- "type": "INDIVIDUAL",
- "givenReference": "M03879.Obj0842",
- "sourceId": "pm-2024-unit-789",
- "tenants": [
- {
- "firstName": "Max",
- "lastName": "Mustermann"
}
], - "streetName": "Hauptstraße",
- "streetNumber": "123",
- "postalCode": "10115",
- "region": "Berlin",
- "countryCode": "DE",
- "depositAmountCents": 150000
}Retrieves a single virtual deposit account by its unique identifier
| depositAccountId required | string Example: iDVh8yNUQ8y2hh1jkXTbi The unique identifier of the deposit account |
| virtualDepositAccountId required | string Example: C9NS3gndTEXrX6CoHIyGy The unique identifier of the virtual deposit account |
| id required | string Unique identifier for the entity |
| createdAt required | string <date-time> Timestamp when the entity was created (ISO 8601 with timezone) |
| updatedAt | string <date-time> Timestamp when the entity was last updated (ISO 8601 with timezone) |
| iban required | string^[A-Z]{2}[0-9]{2}[A-Z0-9]+$ The virtual IBAN allocated to this virtual deposit account |
| appLink required | string <uri> Deep link to this virtual deposit account in the Manager App |
| type required | string Type of tenant for this virtual deposit account |
| givenReference | string Optional reference for the tenancy. We recommend a combination of the tenancy agreement number and property number (e.g. M03879.Obj0842) |
| sourceId | string Optional identifier from your own system. Use this to link the virtual deposit account to records in your property management software or internal database |
| streetName required | string Street name of the rental property |
| streetNumber required | string Street number of the rental property |
| postalCode required | string Postal code of the rental property |
| region required | string Region/state of the rental property |
| countryCode required | string Value: "DE" Country code. Only 'DE' (Deutschland) is accepted as we only support German addresses |
| depositAmountCents required | integer > 0 Deposit amount in cents. Must be a positive integer |
| rentalContractStartDate | string <date> Optional start date of the rental contract (ISO 8601 date format, e.g. 2025-01-01) |
required | Array of objects (IndividualTenant) [ 1 .. 2 ] items Array of tenants (minimum 1, maximum 2) |
{- "id": "C9NS3gndTEXrX6CoHIyGy",
- "createdAt": "2025-09-25T10:30:00+02:00",
- "updatedAt": "2025-10-15T14:20:00+02:00",
- "iban": "DE89370400440532013000",
- "type": "INDIVIDUAL",
- "givenReference": "M03879.Obj0842",
- "sourceId": "pm-2024-unit-789",
- "tenants": [
- {
- "firstName": "Max",
- "lastName": "Mustermann"
}
], - "streetName": "Hauptstraße",
- "streetNumber": "123",
- "postalCode": "10115",
- "region": "Berlin",
- "countryCode": "DE",
- "depositAmountCents": 150000
}Retrieves the current balance of a virtual deposit account
| depositAccountId required | string Example: uYfXVMXfUrTkv2vT4xZel The unique identifier of the deposit account |
| virtualDepositAccountId required | string Example: vKo8sCA4VWbTNk8msiqPA The unique identifier of the virtual deposit account |
| amountCents required | integer Current balance in cents |
| currency required | string Value: "EUR" Currency of the balance |
| updatedAt | string or null <date-time> Timestamp when the balance was last updated (ISO 8601 with timezone). Null if no transactions have occurred. |
{- "amountCents": 150000,
- "currency": "EUR",
- "updatedAt": "2025-10-23T14:30:00+02:00"
}

Every webhook request includes an X-Getmomo-Signature header for verifying authenticity. The signature is an HMAC-SHA256 digest of the raw JSON request body, computed with your webhook secret.
Header format: v1,<base64-encoded-signature>
Verification examples:
import crypto from 'node:crypto';
function verifySignature(secret: string, body: string, header: string): boolean {
const signature = crypto.createHmac('sha256', secret).update(body).digest('base64');
const expected = `v1,${signature}`;
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(header));
}
import hmac
import hashlib
import base64
def verify_signature(secret: str, body: bytes, header: str) -> bool:
signature = base64.b64encode(
hmac.new(secret.encode(), body, hashlib.sha256).digest()
).decode()
expected = f"v1,{signature}"
return hmac.compare_digest(expected, header)
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"fmt"
)
func VerifySignature(secret, body, header string) bool {
mac := hmac.New(sha256.New, []byte(secret))
mac.Write([]byte(body))
expected := fmt.Sprintf("v1,%s", base64.StdEncoding.EncodeToString(mac.Sum(nil)))
return hmac.Equal([]byte(expected), []byte(header))
}
using System.Security.Cryptography;
using System.Text;
public static bool VerifySignature(string secret, string body, string header)
{
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(body));
var expected = $"v1,{Convert.ToBase64String(hash)}";
return CryptographicOperations.FixedTimeEquals(
Encoding.UTF8.GetBytes(expected),
Encoding.UTF8.GetBytes(header)
);
}
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.util.Base64;
public static boolean verifySignature(String secret, String body, String header) throws Exception {
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
String signature = Base64.getEncoder().encodeToString(mac.doFinal(body.getBytes("UTF-8")));
String expected = "v1," + signature;
return MessageDigest.isEqual(expected.getBytes("UTF-8"), header.getBytes("UTF-8"));
}
require 'openssl'
require 'base64'
def verify_signature(secret, body, header)
signature = Base64.strict_encode64(
OpenSSL::HMAC.digest('sha256', secret, body)
)
expected = "v1,#{signature}"
Rack::Utils.secure_compare(expected, header)
end
function verifySignature(string $secret, string $body, string $header): bool {
$signature = base64_encode(hash_hmac('sha256', $body, $secret, true));
$expected = "v1,{$signature}";
return hash_equals($expected, $header);
}
Always use a constant-time comparison function to prevent timing attacks.
POST requests with Content-Type: application/json2xx status code to acknowledge receiptAll events share a common envelope:
{
"type": "<EVENT_TYPE>",
"payload": { ... }
}
The type field identifies the event. The payload shape depends on the event type.
Sent when a test event is triggered from the Manager App. Use this to verify your webhook endpoint is correctly configured and can validate signatures.
| X-Getmomo-Signature required | string Example: v1,K7gNU3sdo+OL0wNhqoVWhr3g6s1xYv72ol/pe/Unols= HMAC-SHA256 signature of the request body. Format: |
| type required | string Value: "TEST" Event type identifier |
required | object (WebhookTestPayload) |
{- "type": "TEST",
- "payload": {
- "triggered_at": "2026-03-26T12:00:00.000Z"
}
}Sent whenever the balance of a virtual deposit account changes. Use this to keep your system in sync with deposit balances managed by Momo. Delivery is retried with exponential backoff on failure; after the final unsuccessful retry, the webhook is automatically disabled and the manager is notified by email.
| X-Getmomo-Signature required | string Example: v1,K7gNU3sdo+OL0wNhqoVWhr3g6s1xYv72ol/pe/Unols= HMAC-SHA256 signature of the request body. Format: |
| type required | string Value: "VIRTUAL_DEPOSIT_ACCOUNT_BALANCE_UPDATED" Event type identifier |
required | object (WebhookVirtualDepositAccountBalanceUpdatedPayload) |
{- "type": "VIRTUAL_DEPOSIT_ACCOUNT_BALANCE_UPDATED",
- "payload": {
- "depositAccountId": "deposit-account-abc123",
- "virtualDepositAccountId": "virtual-deposit-account-def456",
- "amountCents": 150000,
- "currency": "EUR",
- "updatedAt": "2026-04-07T12:00:00.000Z"
}
}