API reference · Savings & everyday money

Savings cycles

GET List a community's savings cycles

GET /savings/community/{reference}/cycles

Headers

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

Path parameters

Name
reference

Example

Response: GenericResponseListCycleResponse

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

Responses

StatusWhen
200Cycles retrieved successfully

POST Set up a savings cycle

POST /savings/cycle

An ajo, esusu, chama, stokvel or village fund, run over a community. A rotating cycle has everyone pay in each period and one member collect the whole pot, taking turns; a pooled one shares the pot out at the end in proportion to what each put in. The money lives in its own account belonging to the community - deliberately not the community's own pot, so an ordinary community payout can never spend it. Give a community reference, or a community block to found one in the same call.

Headers

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

Example

Request body: CycleRequest · Response: GenericResponseCycleResponse

curl -X POST "https://api.bridgemoni.com/savings/cycle" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "communityReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
  "community": {
    "name": "Lagos traders association",
    "description": "string"
  },
  "name": 2026,
  "cycleType": "ROTATING",
  "productCode": "AJO_STANDARD",
  "currencyCode": "NGN",
  "contributionAmount": 20000.0,
  "contributionFrequency": "DAILY",
  "cycleStartDate": "2026-09-25",
  "rotationOrderMode": "FIXED",
  "periodCount": 12,
  "collateralMode": "LIEN_REMAINING",
  "collateralBasisPoints": 2500,
  "lateFeeModel": "FLAT",
  "lateFeeAmount": 500.0,
  "lateFeeBasisPoints": 500,
  "lateFeeMaximum": 2000.0,
  "graceDays": 3,
  "minimumParticipants": 3,
  "maximumParticipants": 12
}'

Responses

StatusWhen
200Cycle created successfully

GET Read a cycle

GET /savings/cycle/{reference}

Headers

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

Path parameters

Name
reference

Example

Response: GenericResponseCycleResponse

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

Responses

StatusWhen
200Cycle retrieved successfully

POST Start the cycle

POST /savings/cycle/{reference}/activate

Seals the turn order, opens the cycle's account, and opens the first period. From here nobody - including whoever set it up - can change whose turn it is. A random draw is made now, from a seed recorded on the cycle so any member can recompute it afterwards and check it was not rigged.

Headers

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

Path parameters

Name
reference

Example

Response: GenericResponseCycleResponse

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

Responses

StatusWhen
200Cycle activated successfully

GET List the members who have fallen behind

GET /savings/cycle/{reference}/arrears

Everyone who has missed enough periods that the group could settle their arrears against their security. Being in arrears is not the same as being in default - this is a list to have a conversation from, not an instruction. Every member of the community can see who is behind; the figures need permission to view positions, and your own are always shown to you.

Headers

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

Path parameters

Name
reference

Example

Response: GenericResponseListCycleParticipantResponse

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

Responses

StatusWhen
200Members in arrears retrieved successfully

POST Pay your contribution

POST /savings/cycle/{reference}/contribute

Needs no permission. Paying into a group you already belong to is an act of membership, and gating it would let an administrator editing a role for unrelated reasons stop everyone paying. Leave the amount out to pay exactly what this period asks of you.

Headers

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

Path parameters

Name
reference

Example

Request body: CycleContributionRequest · Response: GenericResponseContributionResponse

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

Responses

StatusWhen
200Contribution posted successfully

POST Settle a member's arrears against their security

POST /savings/cycle/{reference}/default

For a member who has stopped paying. Their security is released and what they owe the group is taken from it and paid into the cycle's pot, where it goes to whoever's turn it is next. Anything left over is theirs and is released back to them - the group is made whole and not a naira better off. If they owe more than was held, the shortfall stays on the record: collateral reduces the group's loss, it does not always erase it. Never automatic. A scheduler that took a member's money because a date passed is precisely the thing that should require a person to decide, and the reason is recorded against their name. Owner-only, and never your own arrears.

Headers

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

Path parameters

Name
reference

Example

Request body: DeclareDefaultRequest · Response: GenericResponseDefaultSettlementResponse

curl -X POST "https://api.bridgemoni.com/savings/cycle/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/default" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
  "reason": "string"
}'

Responses

StatusWhen
200Arrears settled successfully

POST Put right an arrears settlement made in error

POST /savings/cycle/{reference}/default/reverse

Returns what was taken from a member's security to the member, restores what they owed the group, and puts them back in good standing. It is a fresh posting in the opposite direction, not an erasure: both movements stay on the ledger, and the reason for each is on the record. There is no parameter for how much or to whom. The amount is what was actually taken and the destination is the member it was taken from, both read from the settlement being undone - so this cannot become a way to move the group's money to somebody of the caller's choosing. It stops working once the period the money was credited to has paid out. By then what was taken has gone to whoever's turn it was, and getting it back means asking them to return money they were legitimately paid. That is a conversation for the group, and this endpoint will not do it on their behalf.

Headers

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

Path parameters

Name
reference

Example

Request body: DeclareDefaultRequest · Response: GenericResponseDefaultSettlementResponse

curl -X POST "https://api.bridgemoni.com/savings/cycle/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/default/reverse" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
  "reason": "string"
}'

Responses

StatusWhen
200Settlement put right successfully

POST Leave a running cycle

POST /savings/cycle/{reference}/exit

Settles what you are owed and what you owe. A member who has already collected and still owes the group cannot simply walk away - that is the group's money, not theirs

Headers

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

Path parameters

Name
reference

Example

Response: GenericResponseCyclePositionResponse

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

Responses

StatusWhen
200Exited the cycle successfully

GET Where you stand in this cycle

GET /savings/cycle/{reference}/my-position

What you have paid, what you have collected, what you still owe, when your turn is, and what you would walk away with if you left now

Headers

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

Path parameters

Name
reference

Example

Response: GenericResponseCyclePositionResponse

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

Responses

StatusWhen
200Position retrieved successfully

POST Join a cycle

POST /savings/cycle/{reference}/opt-in

Belonging to the community and joining one of its cycles are different things - not everyone in a cooperative joins every ajo it runs. You must send back the fingerprint of the terms you were shown, so you can never be bound to terms that changed while you were reading them.

Headers

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

Path parameters

Name
reference

Example

Request body: CycleOptInRequest · Response: GenericResponseCycleParticipantResponse

curl -X POST "https://api.bridgemoni.com/savings/cycle/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/opt-in" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "disclosedTermsHash": "string",
  "payoutAccountNumber": 1000000042
}'

Responses

StatusWhen
200Joined the cycle successfully

POST Leave a cycle before it starts

POST /savings/cycle/{reference}/opt-out

Only while it is still open. Once it is running, use exit instead

Headers

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

Path parameters

Name
reference

Example

Response: GenericResponseCycleParticipantResponse

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

Responses

StatusWhen
200Left the cycle successfully

POST Set the turn order by hand

POST /savings/cycle/{reference}/order

Only before the cycle is activated. Every active participant must appear exactly once. Once activated the order is sealed with a fingerprint and this endpoint refuses - moving somebody up the queue after money starts moving is the oldest fraud in rotating savings, and it is not expressible here.

Headers

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

Path parameters

Name
reference

Example

Request body: CycleOrderRequest · Response: GenericResponseCycleResponse

curl -X POST "https://api.bridgemoni.com/savings/cycle/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/order" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "participantReferences": [
    "string"
  ]
}'

Responses

StatusWhen
200Order set successfully

GET List who is taking part

GET /savings/cycle/{reference}/participants

Every member of the community sees who is in and whose turn is when. The money figures need permission to view positions - your own are always shown to you

Headers

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

Path parameters

Name
reference

Example

Response: GenericResponseListCycleParticipantResponse

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

Responses

StatusWhen
200Participants retrieved successfully

POST Settle a period that is already due

POST /savings/cycle/{reference}/period/{periodNumber}/settle

Pays the whole pot to whoever's turn it is and opens the next period. There is no parameter here for who collects or how much: the recipient was written when the period opened, from the order sealed at activation, and is checked against that seal again before anything moves. The amount is what was collected. A period that is not yet due is refused.

Headers

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

Path parameters

Name
reference
periodNumber

Example

Response: GenericResponseCyclePeriodResponse

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

Responses

StatusWhen
200Period settled successfully

POST Forgive a member's contribution for one period

POST /savings/cycle/{reference}/period/{periodNumber}/waive

For hardship, illness, bereavement - the reasons real groups have always made room for. Never your own line, whatever role you hold. The reason is recorded and the group can see who granted it.

Headers

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

Path parameters

Name
reference
periodNumber

Example

Request body: WaiveLineRequest · Response: GenericResponseCyclePeriodResponse

curl -X POST "https://api.bridgemoni.com/savings/cycle/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/period/value/waive" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
  "reason": "string"
}'

Responses

StatusWhen
200Obligation waived successfully

GET List the cycle's periods, with each member's line

GET /savings/cycle/{reference}/periods

Headers

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

Path parameters

Name
reference

Example

Response: GenericResponseListCyclePeriodResponse

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

Responses

StatusWhen
200Periods retrieved successfully

POST Open a cycle for members to join

POST /savings/cycle/{reference}/publish

Moves it out of draft so the community's members can opt in

Headers

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

Path parameters

Name
reference

Example

Response: GenericResponseCycleResponse

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

Responses

StatusWhen
200Cycle opened successfully

POST Run the cycle again

POST /savings/cycle/{reference}/renew

Opens a fresh cycle on the same terms for the same community, numbered one higher. Nobody is carried over - everyone opts in again, and the order is drawn again

Headers

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

Path parameters

Name
reference

Example

Response: GenericResponseCycleResponse

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

Responses

StatusWhen
200Cycle renewed successfully

POST Share out a pooled cycle

POST /savings/cycle/{reference}/share-out

Distributes the pot, less anything held back for the group's welfare fund, in proportion to what each member put in. Every last kobo is distributed: the rounding remainder goes to whoever the fractions favour, and the tie-break rotates between cycles rather than quietly favouring the same member every time. A large group is paid in batches, each atomic.

Headers

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

Path parameters

Name
reference

Example

Response: GenericResponseShareOutResponse

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

Responses

StatusWhen
200Cycle shared out successfully

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