API reference · Savings & everyday money

Savings

Plan types, funding rules, rotating groups and daily interest. About savings Live

POST Open a savings plan

POST /savings/plan

Opens a plan as a draft. The product's rate, charges and limits are frozen onto it there and then, so a later change to the product does not reach you. Your savings pot is opened on the first plan you hold in a currency, not before.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live
Content-Typeapplication/json

Example

Request body: SavingsPlanRequest · Response: GenericResponseSavingsPlanResponse

curl -X POST "https://api.bridgemoni.com/savings/plan" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "planType": "TARGET",
  "name": "School fees - 2027 session",
  "description": "string",
  "currencyCode": "NGN",
  "productCode": "string",
  "targetAmount": 850000.0,
  "targetDate": "2027-08-15",
  "lockMode": "NONE",
  "maturityDate": "2027-08-15",
  "termDays": 90,
  "autoRolloverOnMaturity": true,
  "priority": 1,
  "colourTag": "AMBER",
  "imageUrl": "string"
}'

Responses

StatusWhen
200Savings plan created successfully

POST Move one of your budget goals into savings

POST /savings/plan/from-goal

Turns a goal you already have into a savings plan of the same name, with the same target and date, and moves what you had put aside across in the same movement. Nothing is lost: the goal stays on your record showing where its money went, and its contribution history stays readable. Your other goals are untouched - you move them one at a time, if and when you want to. A goal that belongs to an organization or a community stays where it is, because a savings plan belongs to one person.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live
Content-Typeapplication/json

Example

Request body: MigrateGoalRequest · Response: GenericResponseGoalMigrationResponse

curl -X POST "https://api.bridgemoni.com/savings/plan/from-goal" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "goalReference": "9f1c7a2e-4b6d-4a11-9f3e-2c8d5e7a1b40",
  "productCode": "TARGET-NGN-STANDARD",
  "name": "School fees 2027"
}'

Responses

StatusWhen
200Goal moved into savings successfully

GET Read one plan

GET /savings/plan/{reference}

What is available, what is locked, and how far along you are.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseSavingsPlanResponse

curl -X GET "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Savings plan retrieved successfully

PUT Rename a plan or move its target

PUT /savings/plan/{reference}

The name, the target and how it looks in your app. Never the rate, the charges or when you may take the money out - those were agreed when you opened it.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live
Content-Typeapplication/json

Path parameters

Name
reference

Example

Request body: UpdateSavingsPlanRequest · Response: GenericResponseSavingsPlanResponse

curl -X PUT "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "name": {
    "name": "string"
  },
  "description": "string",
  "targetAmount": 1000000.0,
  "targetDate": "2027-12-01",
  "priority": 0,
  "colourTag": "string",
  "imageUrl": "string"
}'

Responses

StatusWhen
200Savings plan updated successfully

POST Activate a draft plan

POST /savings/plan/{reference}/activate

A first contribution does this too.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseSavingsPlanResponse

curl -X POST "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/activate" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Savings plan activated successfully

POST Cancel a new lock at no cost

POST /savings/plan/{reference}/cancel-lock

Within the cooling-off window your plan was opened under, a lock can be undone for nothing: the money is unlocked and no charge is made. After that window the only way out is a withdrawal, which costs what the quote says.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseSavingsPlanResponse

curl -X POST "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/cancel-lock" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Lock cancelled successfully

POST Close an empty plan

POST /savings/plan/{reference}/close

Only once nothing is left in it. The plan and its history stay readable - what you saved is a record, not something to delete.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseSavingsPlanResponse

curl -X POST "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/close" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Savings plan closed successfully

POST Add money to a plan

POST /savings/plan/{reference}/contribute

Moves money from your main wallet in the same currency. There is no source to name. Send the same idempotency key again to retry safely.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live
Idempotency-KeyReuse the same value on every retry of this request
Content-Typeapplication/json

Path parameters

Name
reference

Example

Request body: ContributionRequest · Response: GenericResponseContributionResponse

curl -X POST "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/contribute" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "amount": 25000.0,
  "narration": "August"
}'

Responses

StatusWhen
200Contribution posted successfully

GET Everything that has gone into a plan

GET /savings/plan/{reference}/contributions

Newest first.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseListContributionResponse

curl -X GET "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/contributions" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Contributions retrieved successfully

GET The interest on a plan, day by day

GET /savings/plan/{reference}/interest

What was earned each day, on what balance and at what rate, and every time interest was actually paid in. Daily figures are shown to six decimal places: interest is worked out to that precision and rounded only when it is paid in, so adding up the days reaches the same total we pay rather than drifting away from it.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Query parameters

NameDefault
fromOptional
toOptional

Example

Response: GenericResponseInterestSummaryResponse

curl -X GET "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/interest" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Interest retrieved successfully

DELETE Withdraw the notice you gave

DELETE /savings/plan/{reference}/notice

The plan goes back to running.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseSavingsPlanResponse

curl -X DELETE "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/notice" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Notice withdrawn successfully

POST Give notice on a plan that needs it

POST /savings/plan/{reference}/notice

Starts the notice period this plan was opened under. Once it has run, a withdrawal costs nothing. You can withdraw the notice at any time before then.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseSavingsPlanResponse

curl -X POST "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/notice" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Notice given successfully

POST Pause a plan

POST /savings/plan/{reference}/pause

Stops automatic funding. Your money stays exactly where it is.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseSavingsPlanResponse

curl -X POST "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/pause" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Savings plan paused successfully

GET How a plan is doing against its target

GET /savings/plan/{reference}/progress

How far along you are, what is left, how much a month would get you there, and whether you are on track for the date you set. The projection is drawn from your own saving so far and is not a promise - it moves as you do.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseSavingsProgressResponse

curl -X GET "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/progress" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Progress retrieved successfully

POST Resume a paused plan

POST /savings/plan/{reference}/resume

Automatic funding starts again.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseSavingsPlanResponse

curl -X POST "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/resume" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Savings plan resumed successfully

GET A plan's statement

GET /savings/plan/{reference}/statement

Every movement over the period, oldest first, with a running balance - contributions, withdrawals, interest paid in, penalties and fees, each carrying the ledger transaction reference so it can be reconciled against a bank statement. Defaults to the last three months. Only settled movements appear: something still in flight has not happened yet, and a statement that shows it would be wrong the moment it fails.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Query parameters

NameDefault
fromOptional
toOptional

Example

Response: GenericResponseSavingsStatementResponse

curl -X GET "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/statement" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Statement retrieved successfully

GET The terms you agreed to on this plan

GET /savings/plan/{reference}/terms

Read back exactly as they were frozen when you opened it - the rate, when interest is paid, what taking money out early costs, and how long you have to change your mind. A later change to the product never reaches a plan already open under these terms, and the fingerprint here is what proves it.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseSavingsPlanTermsResponse

curl -X GET "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/terms" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Terms retrieved successfully

POST Take money out

POST /savings/plan/{reference}/withdraw

Requires the fingerprint from a quote, and an explicit acknowledgement when there is a charge. Send the same idempotency key again to retry safely.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live
Idempotency-KeyReuse the same value on every retry of this request
Content-Typeapplication/json

Path parameters

Name
reference

Example

Request body: WithdrawalRequest · Response: GenericResponseWithdrawalResponse

curl -X POST "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/withdraw" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "beneficiaryReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
  "organizationReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
  "sourceAccountNumber": 3000000001,
  "instrumentReference": "8c1f0d4e-6b2a-4f7c-9d31-2a5e8b0c7f44",
  "destinationAccountNumber": "string",
  "destinationAccountProviderCode": "GTB",
  "destinationAccountProviderName": "Guaranty Trust Bank",
  "destinationAccountName": {
    "name": "string"
  },
  "amount": 0,
  "saveBeneficiary": true,
  "beneficiaryAlias": "Landlord",
  "currencyCode": "string",
  "narration": "string",
  "executionMode": "SYNCHRONOUS",
  "schedule": {
    "startDateTime": "2026-09-25T10:00:00Z",
    "frequency": "HOURLY",
    "endDateTime": "2026-09-25T10:00:00Z",
    "maxOccurrences": 0
  }
}'

Responses

StatusWhen
200Withdrawal posted successfully

POST What would taking money out cost?

POST /savings/plan/{reference}/withdrawal/quote

Works out the charge and what you would actually receive. Nothing moves. The fingerprint it returns must be sent back with the withdrawal, so you are only ever charged terms you were actually shown.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live
Content-Typeapplication/json

Path parameters

Name
reference

Example

Request body: WithdrawalQuoteRequest · Response: GenericResponseWithdrawalQuoteResponse

curl -X POST "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/withdrawal/quote" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "amount": 100000.0
}'

Responses

StatusWhen
200Withdrawal quote calculated successfully

GET Everything that has come out of a plan

GET /savings/plan/{reference}/withdrawals

Newest first.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseListWithdrawalResponse

curl -X GET "https://api.bridgemoni.com/savings/plan/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/withdrawals" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Withdrawals retrieved successfully

GET List your plans

GET /savings/plans

Filter by status or by kind of plan.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Query parameters

NameDefault
statusOptional
planTypeOptional

Example

Response: GenericResponseListSavingsPlanResponse

curl -X GET "https://api.bridgemoni.com/savings/plans" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Savings plans retrieved successfully

GET One savings product, in full

GET /savings/product/{reference}

The rate band by band, when interest is paid, what an early withdrawal costs and the terms in plain language - for the product you are about to open a plan under. Only products you are eligible for are returned.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseSavingsProductSummaryResponse

curl -X GET "https://api.bridgemoni.com/savings/product/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Savings product retrieved successfully

GET See what you can open

GET /savings/products

The savings products available to you, with the rate you would earn band by band, when interest is paid, what taking money out early costs, and the terms in plain language. Whatever you open, these terms are frozen onto your plan and a later change to the product does not reach you.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Query parameters

NameDefault
appliesToOptional
currencyCodeOptional
countryCodeOptional

Example

Response: GenericResponseListSavingsProductSummaryResponse

curl -X GET "https://api.bridgemoni.com/savings/products" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Savings products retrieved successfully

GET Everything you have saved, across every plan

GET /savings/summary

Totals by currency, with the plans behind each. A saver with a rent pot, a school-fees target and a locked plan wants one answer to 'how much have I got', and this is it. Interest that has accrued but not yet been paid in is shown separately from what is actually in the pot, because only one of the two can be withdrawn today.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Example

Response: GenericResponseSavingsSummaryResponse

curl -X GET "https://api.bridgemoni.com/savings/summary" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Summary retrieved successfully

Generated from the OpenAPI document. Branch on the HTTP status: there is no machine-readable error code on the wire. Errors