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",
- "isDefault": true
}, - {
- "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",
- "isDefault": false
}
]
}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) |
| version required | string^[0-9]+$ Opaque optimistic-concurrency token for the entity. Round-trip this value unchanged on mutating requests (PATCH, DELETE) to detect stale writes. |
| 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 |
| isDefault required | boolean Indicates whether this is the default 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",
- "isDefault": true
}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",
- "version": "1"
}
], - "streetName": "Hauptstraße",
- "streetNumber": "123",
- "postalCode": "10115",
- "region": "Berlin",
- "countryCode": "DE",
- "depositAmountCents": 150000,
- "notes": "Tenant requested deposit split over two months",
- "payoutNote": null,
- "moveOutDate": null,
- "propertyOwnerId": "vWRaPWn3iIDr8iBpdAHpW",
- "status": "COMPLETE"
}, - {
- "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"
}
], - "version": "1"
}
], - "streetName": "Nebenstraße",
- "streetNumber": "456",
- "postalCode": "10117",
- "region": "Berlin",
- "countryCode": "DE",
- "depositAmountCents": 200000,
- "notes": null,
- "payoutNote": null,
- "moveOutDate": null,
- "propertyOwnerId": null,
- "status": "INCOMPLETE"
}
]
}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 (IndividualTenantInput) [ 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) |
| version required | string^[0-9]+$ Opaque optimistic-concurrency token for the entity. Round-trip this value unchanged on mutating requests (PATCH, DELETE) to detect stale writes. |
| 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) |
| notes required | string or null Free-text internal notes on the tenancy. Null if no notes have been recorded |
| payoutNote required | string or null Note describing the payout / settlement of the deposit. Null if no payout note has been recorded |
| moveOutDate required | string or null <date> Date the tenant moved out (ISO 8601 date format, e.g. 2025-08-31). Null if not set |
| propertyOwnerId required | string or null Identifier of the property owner assigned to this virtual deposit account. Null if no owner is assigned |
| status required | string Enum: "INCOMPLETE" "COMPLETE" "PARTIALLY_PAID_OUT" "RESOLVED" Lifecycle status of the virtual deposit account |
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",
- "version": "1"
}
], - "streetName": "Hauptstraße",
- "streetNumber": "123",
- "postalCode": "10115",
- "region": "Berlin",
- "countryCode": "DE",
- "depositAmountCents": 150000,
- "notes": null,
- "payoutNote": null,
- "moveOutDate": null,
- "propertyOwnerId": null,
- "status": "INCOMPLETE"
}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) |
| version required | string^[0-9]+$ Opaque optimistic-concurrency token for the entity. Round-trip this value unchanged on mutating requests (PATCH, DELETE) to detect stale writes. |
| 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) |
| notes required | string or null Free-text internal notes on the tenancy. Null if no notes have been recorded |
| payoutNote required | string or null Note describing the payout / settlement of the deposit. Null if no payout note has been recorded |
| moveOutDate required | string or null <date> Date the tenant moved out (ISO 8601 date format, e.g. 2025-08-31). Null if not set |
| propertyOwnerId required | string or null Identifier of the property owner assigned to this virtual deposit account. Null if no owner is assigned |
| status required | string Enum: "INCOMPLETE" "COMPLETE" "PARTIALLY_PAID_OUT" "RESOLVED" Lifecycle status of the virtual deposit account |
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",
- "version": "1"
}
], - "streetName": "Hauptstraße",
- "streetNumber": "123",
- "postalCode": "10115",
- "region": "Berlin",
- "countryCode": "DE",
- "depositAmountCents": 150000,
- "notes": "Tenant requested deposit split over two months",
- "payoutNote": "Deducted EUR 200 for cleaning",
- "moveOutDate": "2025-08-31",
- "propertyOwnerId": "vWRaPWn3iIDr8iBpdAHpW",
- "status": "COMPLETE"
}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"
}Endpoints for polling the state of asynchronous jobs such as tax certificate and bank statement generation
Retrieves the current state of an asynchronous job (e.g. tax certificate or bank statement generation) initiated for the authenticated manager.
| 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 |
| jobId required | string Example: j8sCA4VWbTNk8msiqPAvK The unique identifier of the async job |
| id required | string |
| type required | string Enum: "TAX_CERTIFICATE" "STATEMENT" |
| referenceType required | string Value: "VIRTUAL_DEPOSIT_ACCOUNT" |
| referenceId required | string |
| status required | string Enum: "PENDING" "PROCESSING" "COMPLETED" "FAILED" |
| createdAt required | string <date-time> |
| completedAt required | string or null <date-time> |
| errorCode required | string or null |
| version required | string^[0-9]+$ |
{- "id": "j8sCA4VWbTNk8msiqPAvK",
- "type": "TAX_CERTIFICATE",
- "referenceType": "VIRTUAL_DEPOSIT_ACCOUNT",
- "referenceId": "vKo8sCA4VWbTNk8msiqPA",
- "status": "COMPLETED",
- "createdAt": "2025-10-23T14:30:00+02:00",
- "completedAt": "2025-10-23T14:31:00+02:00",
- "errorCode": null,
- "version": "3"
}Mints a fresh short-lived presigned HTTP-GET URL (TTL 7 days) for the completed job's artifact in partner-facing object storage; returns a new URL on every call.
| 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 |
| jobId required | string Example: j8sCA4VWbTNk8msiqPAvK The unique identifier of the async job |
| jobId required | string |
| fileUrl required | string <uri> |
| expiresAt required | string <date-time> |
{- "jobId": "iDVh8yNUQ8y2hh1jkXTbi",
- "expiresAt": "2026-06-19T15:02:31.018Z"
}

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"
}
}