The customization module stores the visual appearance (icon, color, theme) for savings products: saving_goal, saving_circle, commodity_financing, charitable_cause. Customization records are created automatically by each product’s service (the POST endpoint is disabled); FE only accesses them through list, detail, update, and delete on the /customizations route.
Property Value Base URL {HOST}/v1Auth Bearer JWT (header Authorization) or access_token cookie Content-Type application/jsonError envelope { "message": string | string[], "statusCode": number, "error": string }Validation Global ValidationPipe · whitelist: true, forbidNonWhitelisted: true Related modules saving-goals, saving-circles, commodity-financing, charitable-cause Document version v1 · 2026-05-20 Audience Internal FE devs (mobile + web)
Four active endpoints: list all customizations, get detail by UUID, update theme/icon/color, and delete. The POST /customizations endpoint exists in source but is commented-out — customization records are created as a side effect by the product modules (e.g. when creating a saving goal).
Method Path Auth Summary GET /v1/customizationsbearer List all customizations GET /v1/customizations/:idbearer Customization detail by UUID PATCH /v1/customizations/:idbearer Update icon/color/theme DELETE /v1/customizations/:idbearer Soft delete a customization
Notes
No @Permissions or @Roles on the controller — the global Bearer guard is sufficient.
All :id are validated via ParseUUIDPipe — send UUID v4 or get a 400.
theme is an enum: dark, light, system. reference_type in the response: saving_goal, saving_circle, commodity_financing, charitable_cause.
The color field in the DB is a string of length 9 (likely a hex code with alpha, e.g. #FF5733FF).
Retrieve all customizations. The service returns { customizations, total }.
bearer
"message" : " Customizations retrieved successfully " ,
"id" : " 550e8400-e29b-41d4-a716-446655440000 " ,
"reference_id" : " 660e8400-e29b-41d4-a716-446655440111 " ,
"reference_type" : " saving_goal " ,
"created_by" : " 770e8400-e29b-41d4-a716-446655440222 " ,
"updated_by" : " 770e8400-e29b-41d4-a716-446655440222 " ,
"created_at" : " 2026-05-20T08:30:00.000Z " ,
"updated_at" : " 2026-05-20T08:30:00.000Z "
Status When it occurs 401 UnauthorizedBearer/cookie is invalid
Detail of one customization. ID must be UUID v4.
bearer
Param Type Notes idUUID Validated via ParseUUIDPipe
"message" : " Customization retrieved successfully " ,
"id" : " 550e8400-e29b-41d4-a716-446655440000 " ,
"reference_id" : " 660e8400-e29b-41d4-a716-446655440111 " ,
"reference_type" : " saving_goal " ,
"created_by" : " 770e8400-e29b-41d4-a716-446655440222 " ,
"updated_by" : " 770e8400-e29b-41d4-a716-446655440222 " ,
"created_at" : " 2026-05-20T08:30:00.000Z " ,
"updated_at" : " 2026-05-20T08:30:00.000Z "
Status When it occurs 400 Bad Requestid is not a UUID401 UnauthorizedBearer/cookie is invalid 404 Not FoundCustomization not found
Update a customization. The theme field is required (see DTO). Other fields are optional via PartialType(CreateCustomizationDto).
bearer
Param Type Notes idUUID Validated via ParseUUIDPipe
Field Type Required Notes themeenum Theme ✓ dark, light, system (entity default: light)refrence_idstring optional Note: the DTO spelling is indeed refrence_id (without the second “e”). Mobile FE already consumes this name — leave it as-is. iconstring optional Icon name or URL colorstring optional Hex code, max length 9 chars
"message" : " Customization updated successfully " ,
"id" : " 550e8400-e29b-41d4-a716-446655440000 " ,
"reference_id" : " 660e8400-e29b-41d4-a716-446655440111 " ,
"reference_type" : " saving_goal " ,
"created_by" : " 770e8400-e29b-41d4-a716-446655440222 " ,
"updated_by" : " 770e8400-e29b-41d4-a716-446655440222 " ,
"created_at" : " 2026-05-20T08:30:00.000Z " ,
"updated_at" : " 2026-05-20T09:00:00.000Z "
Status When it occurs 400 Bad Requestid is not a UUID, theme invalid, or non-whitelisted field401 UnauthorizedBearer/cookie is invalid 404 Not FoundCustomization not found
Soft delete a customization. The service calls softDeleteCustomization — the record remains but deleted_at/deleted_by are set.
bearer
Param Type Notes idUUID Validated via ParseUUIDPipe
"message" : " Customization deleted successfully "
Status When it occurs 400 Bad Requestid is not a UUID401 UnauthorizedBearer/cookie is invalid 404 Not FoundCustomization not found
dark
light — entity default
system
saving_goal
saving_circle
commodity_financing
charitable_cause
"message" : " Validation failed (uuid is expected) " ,
400 body/param validation
401 missing / expired token
404 customization not found
The POST /customizations endpoint exists in source code but is commented-out. Records are created automatically by the product modules (saving-goals, saving-circles, etc.).