API reference · Savings & everyday money
Savings cycles 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Example Request body: CycleRequest · Response: GenericResponseCycleResponse
curl Request Response
Copy 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
}' Copy {
"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
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"communityReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": {
"name": "string"
},
"cycleType": "ROTATING",
"status": "DRAFT",
"potAccountNumber": "string",
"contributionAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"contributionFrequency": "DAILY",
"cycleStartDate": "2026-09-25",
"cycleNumber": 0,
"periodCount": 0,
"currentPeriodNumber": 0,
"rotationOrderMode": "FIXED",
"orderSealedAt": "2026-09-25T10:00:00Z",
"orderHash": "string",
"orderSeedSource": "string",
"disclosedTermsHash": "string",
"collateralMode": "NONE",
"collateralBasisPoints": 0,
"lateFeeModel": "NONE",
"lateFeeAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"lateFeeBasisPoints": 0,
"lateFeeMaximum": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"graceDays": 0,
"accruedInterest": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"participantCount": 0,
"minimumParticipants": 0,
"maximumParticipants": 0,
"welfareFundBalance": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"potBalance": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"activatedAt": "2026-09-25T10:00:00Z",
"closedAt": "2026-09-25T10:00:00Z",
"creationDateTime": "2026-09-25T10:00:00Z"
},
"description": "Cycle created successfully"
} Responses Status When 200Cycle created successfully
GET Read a cycle GET /savings/cycle/{reference}
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Example Response: GenericResponseCycleResponse
curl Response
Copy 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" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"communityReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": {
"name": "string"
},
"cycleType": "ROTATING",
"status": "DRAFT",
"potAccountNumber": "string",
"contributionAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"contributionFrequency": "DAILY",
"cycleStartDate": "2026-09-25",
"cycleNumber": 0,
"periodCount": 0,
"currentPeriodNumber": 0,
"rotationOrderMode": "FIXED",
"orderSealedAt": "2026-09-25T10:00:00Z",
"orderHash": "string",
"orderSeedSource": "string",
"disclosedTermsHash": "string",
"collateralMode": "NONE",
"collateralBasisPoints": 0,
"lateFeeModel": "NONE",
"lateFeeAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"lateFeeBasisPoints": 0,
"lateFeeMaximum": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"graceDays": 0,
"accruedInterest": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"participantCount": 0,
"minimumParticipants": 0,
"maximumParticipants": 0,
"welfareFundBalance": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"potBalance": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"activatedAt": "2026-09-25T10:00:00Z",
"closedAt": "2026-09-25T10:00:00Z",
"creationDateTime": "2026-09-25T10:00:00Z"
},
"description": "Cycle retrieved successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Example Response: GenericResponseCycleResponse
curl Response
Copy 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" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"communityReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": {
"name": "string"
},
"cycleType": "ROTATING",
"status": "DRAFT",
"potAccountNumber": "string",
"contributionAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"contributionFrequency": "DAILY",
"cycleStartDate": "2026-09-25",
"cycleNumber": 0,
"periodCount": 0,
"currentPeriodNumber": 0,
"rotationOrderMode": "FIXED",
"orderSealedAt": "2026-09-25T10:00:00Z",
"orderHash": "string",
"orderSeedSource": "string",
"disclosedTermsHash": "string",
"collateralMode": "NONE",
"collateralBasisPoints": 0,
"lateFeeModel": "NONE",
"lateFeeAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"lateFeeBasisPoints": 0,
"lateFeeMaximum": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"graceDays": 0,
"accruedInterest": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"participantCount": 0,
"minimumParticipants": 0,
"maximumParticipants": 0,
"welfareFundBalance": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"potBalance": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"activatedAt": "2026-09-25T10:00:00Z",
"closedAt": "2026-09-25T10:00:00Z",
"creationDateTime": "2026-09-25T10:00:00Z"
},
"description": "Cycle activated successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Example Response: GenericResponseListCycleParticipantResponse
curl Response
Copy 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" Copy {
"data": [
{
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"userReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"displayName": {
"name": "string"
},
"sequenceNumber": 0,
"status": "INVITED",
"contributedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"receivedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"obligationRemaining": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"shareUnits": 0,
"outstandingLateFees": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"shareUnitDays": 0,
"interestAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"missedPeriods": 0,
"collateralLienReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"collateralHeld": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"inArrears": true,
"optedInAt": "2026-09-25T10:00:00Z",
"exitedAt": "2026-09-25T10:00:00Z"
}
],
"description": "Members in arrears retrieved successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Path parameters Example Request body: CycleContributionRequest · Response: GenericResponseContributionResponse
curl Request Response
Copy 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
}' Copy {
"amount": 20000.0,
"periodNumber": 0
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"planReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"trigger": "MANUAL",
"source": "MAIN_WALLET",
"ruleReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"occurrenceNumber": 0,
"amount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"feeAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"status": "PENDING",
"transactionReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"planSavedAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"planLockedAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"progressPercent": 0,
"failureReason": "string",
"postedAt": "2026-09-25T10:00:00Z",
"creationDateTime": "2026-09-25T10:00:00Z",
"charges": [
{
"pricingRuleReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": {
"name": "string"
},
"category": "FEE",
"amount": 0
}
],
"totalFees": 0,
"totalTaxes": 0,
"totalLevies": 0
},
"description": "Contribution posted successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Path parameters Example Request body: DeclareDefaultRequest · Response: GenericResponseDefaultSettlementResponse
curl Request Response
Copy 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"
}' Copy {
"participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"reason": "string"
} Copy {
"data": {
"cycleReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"collateralHeld": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"owedToGroup": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"seizedForGroup": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"returnedToMember": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"stillOwedAfter": {
"amount": "10000.00",
"currencyCode": "NGN"
}
},
"description": "Arrears settled successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Path parameters Example Request body: DeclareDefaultRequest · Response: GenericResponseDefaultSettlementResponse
curl Request Response
Copy 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"
}' Copy {
"participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"reason": "string"
} Copy {
"data": {
"cycleReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"collateralHeld": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"owedToGroup": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"seizedForGroup": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"returnedToMember": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"stillOwedAfter": {
"amount": "10000.00",
"currencyCode": "NGN"
}
},
"description": "Settlement put right successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Example Response: GenericResponseCyclePositionResponse
curl Response
Copy 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" Copy {
"data": {
"cycleReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"status": "INVITED",
"sequenceNumber": 0,
"expectedPayoutDate": "2026-09-25",
"hasCollected": true,
"contributedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"receivedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"obligationRemaining": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"dueThisPeriod": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"shareUnitDays": 0,
"outstandingLateFees": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"collateralHeld": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"exitSettlementAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"optedInAt": "2026-09-25T10:00:00Z"
},
"description": "Exited the cycle successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Example Response: GenericResponseCyclePositionResponse
curl Response
Copy 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" Copy {
"data": {
"cycleReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"status": "INVITED",
"sequenceNumber": 0,
"expectedPayoutDate": "2026-09-25",
"hasCollected": true,
"contributedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"receivedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"obligationRemaining": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"dueThisPeriod": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"shareUnitDays": 0,
"outstandingLateFees": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"collateralHeld": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"exitSettlementAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"optedInAt": "2026-09-25T10:00:00Z"
},
"description": "Position retrieved successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Path parameters Example Request body: CycleOptInRequest · Response: GenericResponseCycleParticipantResponse
curl Request Response
Copy 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
}' Copy {
"disclosedTermsHash": "string",
"payoutAccountNumber": 1000000042
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"userReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"displayName": {
"name": "string"
},
"sequenceNumber": 0,
"status": "INVITED",
"contributedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"receivedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"obligationRemaining": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"shareUnits": 0,
"outstandingLateFees": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"shareUnitDays": 0,
"interestAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"missedPeriods": 0,
"collateralLienReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"collateralHeld": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"inArrears": true,
"optedInAt": "2026-09-25T10:00:00Z",
"exitedAt": "2026-09-25T10:00:00Z"
},
"description": "Joined the cycle successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Example Response: GenericResponseCycleParticipantResponse
curl Response
Copy 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" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"userReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"displayName": {
"name": "string"
},
"sequenceNumber": 0,
"status": "INVITED",
"contributedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"receivedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"obligationRemaining": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"shareUnits": 0,
"outstandingLateFees": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"shareUnitDays": 0,
"interestAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"missedPeriods": 0,
"collateralLienReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"collateralHeld": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"inArrears": true,
"optedInAt": "2026-09-25T10:00:00Z",
"exitedAt": "2026-09-25T10:00:00Z"
},
"description": "Left the cycle successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Path parameters Example Request body: CycleOrderRequest · Response: GenericResponseCycleResponse
curl Request Response
Copy 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"
]
}' Copy {
"participantReferences": [
"string"
]
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"communityReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": {
"name": "string"
},
"cycleType": "ROTATING",
"status": "DRAFT",
"potAccountNumber": "string",
"contributionAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"contributionFrequency": "DAILY",
"cycleStartDate": "2026-09-25",
"cycleNumber": 0,
"periodCount": 0,
"currentPeriodNumber": 0,
"rotationOrderMode": "FIXED",
"orderSealedAt": "2026-09-25T10:00:00Z",
"orderHash": "string",
"orderSeedSource": "string",
"disclosedTermsHash": "string",
"collateralMode": "NONE",
"collateralBasisPoints": 0,
"lateFeeModel": "NONE",
"lateFeeAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"lateFeeBasisPoints": 0,
"lateFeeMaximum": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"graceDays": 0,
"accruedInterest": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"participantCount": 0,
"minimumParticipants": 0,
"maximumParticipants": 0,
"welfareFundBalance": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"potBalance": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"activatedAt": "2026-09-25T10:00:00Z",
"closedAt": "2026-09-25T10:00:00Z",
"creationDateTime": "2026-09-25T10:00:00Z"
},
"description": "Order set successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Example Response: GenericResponseListCycleParticipantResponse
curl Response
Copy 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" Copy {
"data": [
{
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"userReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"displayName": {
"name": "string"
},
"sequenceNumber": 0,
"status": "INVITED",
"contributedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"receivedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"obligationRemaining": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"shareUnits": 0,
"outstandingLateFees": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"shareUnitDays": 0,
"interestAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"missedPeriods": 0,
"collateralLienReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"collateralHeld": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"inArrears": true,
"optedInAt": "2026-09-25T10:00:00Z",
"exitedAt": "2026-09-25T10:00:00Z"
}
],
"description": "Participants retrieved successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Name referenceperiodNumber
Example Response: GenericResponseCyclePeriodResponse
curl Response
Copy 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" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"periodNumber": 0,
"dueDate": "2026-09-25",
"graceEndsOn": "2026-09-25",
"expectedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"collectedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"lateFeeTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"payoutParticipantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"payoutParticipantName": {
"name": "string"
},
"payoutAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"managementFeeAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"payoutTransactionReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"status": "PENDING",
"lines": [
{
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"displayName": {
"name": "string"
},
"expectedAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"paidAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"status": "DUE",
"lateFeeAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"waivedByUserReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"paidAt": "2026-09-25T10:00:00Z"
}
],
"openedAt": "2026-09-25T10:00:00Z",
"paidAt": "2026-09-25T10:00:00Z"
},
"description": "Period settled successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live Content-Typeapplication/json
Path parameters Name referenceperiodNumber
Example Request body: WaiveLineRequest · Response: GenericResponseCyclePeriodResponse
curl Request Response
Copy 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"
}' Copy {
"participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"reason": "string"
} Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"periodNumber": 0,
"dueDate": "2026-09-25",
"graceEndsOn": "2026-09-25",
"expectedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"collectedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"lateFeeTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"payoutParticipantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"payoutParticipantName": {
"name": "string"
},
"payoutAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"managementFeeAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"payoutTransactionReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"status": "PENDING",
"lines": [
{
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"displayName": {
"name": "string"
},
"expectedAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"paidAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"status": "DUE",
"lateFeeAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"waivedByUserReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"paidAt": "2026-09-25T10:00:00Z"
}
],
"openedAt": "2026-09-25T10:00:00Z",
"paidAt": "2026-09-25T10:00:00Z"
},
"description": "Obligation waived successfully"
} Responses Status When 200Obligation waived successfully
GET List the cycle's periods, with each member's line GET /savings/cycle/{reference}/periods
Headers Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Example Response: GenericResponseListCyclePeriodResponse
curl Response
Copy 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" Copy {
"data": [
{
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"periodNumber": 0,
"dueDate": "2026-09-25",
"graceEndsOn": "2026-09-25",
"expectedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"collectedTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"lateFeeTotal": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"payoutParticipantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"payoutParticipantName": {
"name": "string"
},
"payoutAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"managementFeeAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"payoutTransactionReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"status": "PENDING",
"lines": [
{
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"displayName": {
"name": "string"
},
"expectedAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"paidAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"status": "DUE",
"lateFeeAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"waivedByUserReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"paidAt": "2026-09-25T10:00:00Z"
}
],
"openedAt": "2026-09-25T10:00:00Z",
"paidAt": "2026-09-25T10:00:00Z"
}
],
"description": "Periods retrieved successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Example Response: GenericResponseCycleResponse
curl Response
Copy 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" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"communityReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": {
"name": "string"
},
"cycleType": "ROTATING",
"status": "DRAFT",
"potAccountNumber": "string",
"contributionAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"contributionFrequency": "DAILY",
"cycleStartDate": "2026-09-25",
"cycleNumber": 0,
"periodCount": 0,
"currentPeriodNumber": 0,
"rotationOrderMode": "FIXED",
"orderSealedAt": "2026-09-25T10:00:00Z",
"orderHash": "string",
"orderSeedSource": "string",
"disclosedTermsHash": "string",
"collateralMode": "NONE",
"collateralBasisPoints": 0,
"lateFeeModel": "NONE",
"lateFeeAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"lateFeeBasisPoints": 0,
"lateFeeMaximum": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"graceDays": 0,
"accruedInterest": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"participantCount": 0,
"minimumParticipants": 0,
"maximumParticipants": 0,
"welfareFundBalance": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"potBalance": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"activatedAt": "2026-09-25T10:00:00Z",
"closedAt": "2026-09-25T10:00:00Z",
"creationDateTime": "2026-09-25T10:00:00Z"
},
"description": "Cycle opened successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Example Response: GenericResponseCycleResponse
curl Response
Copy 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" Copy {
"data": {
"reference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"communityReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"name": {
"name": "string"
},
"cycleType": "ROTATING",
"status": "DRAFT",
"potAccountNumber": "string",
"contributionAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"contributionFrequency": "DAILY",
"cycleStartDate": "2026-09-25",
"cycleNumber": 0,
"periodCount": 0,
"currentPeriodNumber": 0,
"rotationOrderMode": "FIXED",
"orderSealedAt": "2026-09-25T10:00:00Z",
"orderHash": "string",
"orderSeedSource": "string",
"disclosedTermsHash": "string",
"collateralMode": "NONE",
"collateralBasisPoints": 0,
"lateFeeModel": "NONE",
"lateFeeAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"lateFeeBasisPoints": 0,
"lateFeeMaximum": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"graceDays": 0,
"accruedInterest": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"participantCount": 0,
"minimumParticipants": 0,
"maximumParticipants": 0,
"welfareFundBalance": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"potBalance": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"activatedAt": "2026-09-25T10:00:00Z",
"closedAt": "2026-09-25T10:00:00Z",
"creationDateTime": "2026-09-25T10:00:00Z"
},
"description": "Cycle renewed successfully"
} Responses Status When 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 Name Notes AuthorizationBearer token X-TenantYour tenant X-Environmenttest or live
Path parameters Example Response: GenericResponseShareOutResponse
curl Response
Copy 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" Copy {
"data": {
"cycleReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"distributedAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"interestDistributed": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"welfareFundRetained": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"participantCount": 0,
"batchCount": 0,
"lines": [
{
"participantReference": "b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e",
"shareUnits": 0,
"shareUnitDays": 0,
"interestAmount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"amount": {
"amount": "10000.00",
"currencyCode": "NGN"
},
"receivedRemainderUnit": true
}
]
},
"description": "Cycle shared out successfully"
} Responses Status When 200Cycle shared out successfully