Saving Circles is the implementation of Arisan rotational savings — a group of users contributes each round, and one member receives the payout per round. The module provides circle CRUD, member management, contributions (gateway or balance rail), and admin summaries. POST /saving-circles accepts two DTO shapes: CreateSavingCircleDto (regular user) or AdminCreateSavingCircleDto (admin creating on behalf of employees).
Property
Value
Base URL
{HOST}/v1
Auth
Bearer JWT (header Authorization) or cookie access_token
Typical flow: create circle → add members (member accounts) → each round members contribute (gateway VA / QR or balance debit) → the round winner receives the payout. Organization admins can view statistics summaries for circles in their org. The visibility field controls whether the circle is discoverable in other orgs’ marketplaces or kept private.
Method
Path
Summary
POST
/v1/saving-circles
Create a saving circle (regular or admin oneOf DTO)
POST
/v1/saving-circles/members
Add members to a circle
POST
/v1/saving-circles/contribute
Contribute to a circle (gateway / balance)
GET
/v1/saving-circles
List circles with status / org / user filters
GET
/v1/saving-circles/:id
Detail of a single circle
PATCH
/v1/saving-circles/:id
Update circle parameters
DELETE
/v1/saving-circles/:id
Delete a circle (not allowed when there are active contributions)
Create a new saving circle. The server picks the DTO based on user_type: INDIVIDUAL uses CreateSavingCircleDto, MORIA/ORGANIZATION uses AdminCreateSavingCircleDto (creating a circle for employees).
bearercreate-saving-circleRESOURCE_CREATED
Request body — CreateSavingCircleDto (regular user)
New. When set, the admin creates an INDIVIDUAL-owned circle on behalf of this member (who must belong to the admin’s own organization). The target member is recorded as the first member (turn 0) using their main pocket as the contribution source. When omitted, the circle is ORGANIZATION-owned and starts with no members — they are added via POST /saving-circles/:id/members.
A member contributes to the circle for the current round. Can use the balance rail (debit Moria balance directly) or the gateway rail (Bisabiller). Dedup rule: a row with status PENDING or COMPLETED for the same (circle_id, user_id, turn_number) rejects a repeat attempt; FAILED/CANCELLED rows allow retry.
ORGANIZATION admin — the combined set of org-owned circles (owner_type=ORGANIZATION, owner_id=admin's org) and circles owned by individual members of the same organization (member-individual circles are scoped via users.organization_id — they do not leak across orgs). When user_id is supplied (must belong to the admin’s org), it narrows results: for org-owned circles, to those the user participates in as a member; for individual-owned circles, to those owned by that user.
MORIA — all.
Also supports organization_id for marketplace lookup (searching for public circles in another org).
Web / mobile — honors x-client-type (default mobile). See Client types (web vs mobile) for the full rules. Concretely: web nests audit fields as created/updated/deleted{ at, by } objects and replaces relations with formatted owner/account/members objects (and a members_count); mobile returns the raw entity with flat created_at/updated_at + created_by/updated_by/deleted_by and foreign-key ids (owner_id, account_id) plus the raw members array.
Detail of a single saving circle, including members and a contributions summary. Response format differs between WEB and MOBILE.
Web / mobile — honors x-client-type (default mobile). See Client types (web vs mobile) for the full rules. Concretely: web nests audit fields as created/updated/deleted{ at, by } objects and exposes a formatted owner object; mobile returns the raw entity with flat created_at/updated_at + created_by/updated_by/deleted_by and foreign-key ids (owner_id, account_id). Both shapes carry the same members and member_contributions arrays.
Organization-level saving circles statistics summary. Admin endpoint — only MORIA and ORGANIZATION. Includes totals, status breakdown, capacity utilization, etc.