{
	"openapi": "3.0.3",
	"info": {
		"title": "Digital Savings — DJS API",
		"version": "1.0.0",
		"description": "The DJS (Dynamic Journey Service) API the MTN USSD gateway calls. Two endpoints multiplex every operation via the `operation_name` argument in the envelope.\n\nPick an operation from the request/response **examples** below to see the exact envelope to send and the keys returned.\n\nProduction ingress (the MoMo gateway channel) is mutual TLS: configure a client certificate for the host in your client (Postman → Settings → Certificates). The contract itself (this file) needs no network access."
	},
	"servers": [
		{
			"url": "https://develop-savings-ussd-api.kamoa.io",
			"description": "develop — MoMo sandbox (default), live over HTTPS."
		},
		{
			"url": "https://internal-savings-ussd-api.kamoa.io",
			"description": "internal — our test stage, live over HTTPS."
		}
	],
	"paths": {
		"/getdynamicarguments": {
			"post": {
				"operationId": "getDynamicArguments",
				"summary": "Single-record operations (one record of return keys).",
				"description": "Operations:\n- `check_registration_status` — Is this MSISDN registered? Routes to the Home Menu or to the registration disclosure screen. Returns: registration_status, account_id?, user_email?.\n- `register_savings_account` — Opens the savings account for this MSISDN (idempotent; re-dial → ALREADY_REGISTERED). Returns: registration_result, account_id?, failure_reason?.\n- `create_deposit_summary` — Quotes the chosen amount + lock period against the live offerable product version (no state written). Returns: summary_status, amount?, interest_rate?, estimated_earnings?, total_at_maturity?, duration_days?, minimum_amount?, currency, product_code?, deposit_reference?.\n- `confirm_deposit` — Writes the PENDING PaymentOrder + fires the MoMo Request-to-Pay; PENDING_VALIDATION until the async outcome settles. Returns: deposit_status, deposit_reference?, payment_message?, failure_reason?.\n- `create_withdrawal_summary` — Quotes the early-exit terms for the position's full balance (no state written). Mints withdrawal_reference for confirm. Returns: amount, penalty_applied, original_rate, new_rate, penalty_amount, net_amount, currency, settlement_delay, withdrawal_reference.\n- `confirm_withdrawal` — Reserves the LOCKED position + fires the MoMo Disbursement; PENDING until the async outcome settles. Returns: withdrawal_status, withdrawal_reference?, failure_reason?.\n- `get_savings_balance` — Locked savings balance: principal with computed interest. Returns: total_balance, total_interest, locked_rates, currency.\n- `confirm_opt_out` _(stub)_ — Confirms opt-out / account closure (stub). Returns: opt_out_status.\n- `get_user_email` — Fetches the email on file (internal step; happy path = on file). Returns: email, email_status.\n- `request_full_statement` _(stub)_ — Requests a full statement (async email delivery) (stub). Returns: request_status.",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DjsEnvelope"
							},
							"examples": {
								"check_registration_status": {
									"summary": "Is this MSISDN registered? Routes to the Home Menu or to the registration disclosure screen.",
									"value": {
										"arguments": [
											{
												"key": {
													"value": "operation_name"
												},
												"value": {
													"value": "check_registration_status"
												}
											},
											{
												"key": {
													"value": "ACCOUNT_HOLDER_MSISDN"
												},
												"value": {
													"value": "242060000001"
												}
											}
										],
										"languageCode": "fr",
										"sessionIdentifier": "example-session",
										"journeyIdentifier": "example-journey"
									}
								},
								"register_savings_account": {
									"summary": "Opens the savings account for this MSISDN (idempotent; re-dial → ALREADY_REGISTERED).",
									"value": {
										"arguments": [
											{
												"key": {
													"value": "operation_name"
												},
												"value": {
													"value": "register_savings_account"
												}
											},
											{
												"key": {
													"value": "ACCOUNT_HOLDER_MSISDN"
												},
												"value": {
													"value": "242060000001"
												}
											},
											{
												"key": {
													"value": "ACCOUNT_HOLDER_EMAIL"
												},
												"value": {
													"value": "client@example.cd"
												}
											}
										],
										"languageCode": "fr",
										"sessionIdentifier": "example-session",
										"journeyIdentifier": "example-journey"
									}
								},
								"create_deposit_summary": {
									"summary": "Quotes the chosen amount + lock period against the live offerable product version (no state written).",
									"value": {
										"arguments": [
											{
												"key": {
													"value": "operation_name"
												},
												"value": {
													"value": "create_deposit_summary"
												}
											},
											{
												"key": {
													"value": "ACCOUNT_HOLDER_MSISDN"
												},
												"value": {
													"value": "242060000001"
												}
											},
											{
												"key": {
													"value": "amount"
												},
												"value": {
													"value": "50000"
												}
											},
											{
												"key": {
													"value": "product_code"
												},
												"value": {
													"value": "prod3m"
												}
											}
										],
										"languageCode": "fr",
										"sessionIdentifier": "example-session",
										"journeyIdentifier": "example-journey"
									}
								},
								"confirm_deposit": {
									"summary": "Writes the PENDING PaymentOrder + fires the MoMo Request-to-Pay; PENDING_VALIDATION until the async outcome settles.",
									"value": {
										"arguments": [
											{
												"key": {
													"value": "operation_name"
												},
												"value": {
													"value": "confirm_deposit"
												}
											},
											{
												"key": {
													"value": "ACCOUNT_HOLDER_MSISDN"
												},
												"value": {
													"value": "242060000001"
												}
											},
											{
												"key": {
													"value": "amount"
												},
												"value": {
													"value": "50000"
												}
											},
											{
												"key": {
													"value": "product_code"
												},
												"value": {
													"value": "prod3m"
												}
											},
											{
												"key": {
													"value": "deposit_reference"
												},
												"value": {
													"value": "dep_2f1c…"
												}
											}
										],
										"languageCode": "fr",
										"sessionIdentifier": "example-session",
										"journeyIdentifier": "example-journey"
									}
								},
								"create_withdrawal_summary": {
									"summary": "Quotes the early-exit terms for the position's full balance (no state written). Mints withdrawal_reference for confirm.",
									"value": {
										"arguments": [
											{
												"key": {
													"value": "operation_name"
												},
												"value": {
													"value": "create_withdrawal_summary"
												}
											},
											{
												"key": {
													"value": "ACCOUNT_HOLDER_MSISDN"
												},
												"value": {
													"value": "242060000001"
												}
											},
											{
												"key": {
													"value": "locked_account_id"
												},
												"value": {
													"value": "7ade4636-df3e-4ac9-a73b-32635bccc7d3"
												}
											}
										],
										"languageCode": "fr",
										"sessionIdentifier": "example-session",
										"journeyIdentifier": "example-journey"
									}
								},
								"confirm_withdrawal": {
									"summary": "Reserves the LOCKED position + fires the MoMo Disbursement; PENDING until the async outcome settles.",
									"value": {
										"arguments": [
											{
												"key": {
													"value": "operation_name"
												},
												"value": {
													"value": "confirm_withdrawal"
												}
											},
											{
												"key": {
													"value": "ACCOUNT_HOLDER_MSISDN"
												},
												"value": {
													"value": "242060000001"
												}
											},
											{
												"key": {
													"value": "withdrawal_reference"
												},
												"value": {
													"value": "c4e7f8a2-1b3d-4f9e-8c0a-5d2e6f7a9b1c"
												}
											},
											{
												"key": {
													"value": "locked_account_id"
												},
												"value": {
													"value": "7ade4636-df3e-4ac9-a73b-32635bccc7d3"
												}
											}
										],
										"languageCode": "fr",
										"sessionIdentifier": "example-session",
										"journeyIdentifier": "example-journey"
									}
								},
								"get_savings_balance": {
									"summary": "Locked savings balance: principal with computed interest.",
									"value": {
										"arguments": [
											{
												"key": {
													"value": "operation_name"
												},
												"value": {
													"value": "get_savings_balance"
												}
											},
											{
												"key": {
													"value": "ACCOUNT_HOLDER_MSISDN"
												},
												"value": {
													"value": "242060000001"
												}
											}
										],
										"languageCode": "fr",
										"sessionIdentifier": "example-session",
										"journeyIdentifier": "example-journey"
									}
								},
								"confirm_opt_out": {
									"summary": "Confirms opt-out / account closure (stub).",
									"value": {
										"arguments": [
											{
												"key": {
													"value": "operation_name"
												},
												"value": {
													"value": "confirm_opt_out"
												}
											},
											{
												"key": {
													"value": "ACCOUNT_HOLDER_MSISDN"
												},
												"value": {
													"value": "242060000001"
												}
											}
										],
										"languageCode": "fr",
										"sessionIdentifier": "example-session",
										"journeyIdentifier": "example-journey"
									}
								},
								"get_user_email": {
									"summary": "Fetches the email on file (internal step; happy path = on file).",
									"value": {
										"arguments": [
											{
												"key": {
													"value": "operation_name"
												},
												"value": {
													"value": "get_user_email"
												}
											},
											{
												"key": {
													"value": "ACCOUNT_HOLDER_MSISDN"
												},
												"value": {
													"value": "242060000001"
												}
											}
										],
										"languageCode": "fr",
										"sessionIdentifier": "example-session",
										"journeyIdentifier": "example-journey"
									}
								},
								"request_full_statement": {
									"summary": "Requests a full statement (async email delivery) (stub).",
									"value": {
										"arguments": [
											{
												"key": {
													"value": "operation_name"
												},
												"value": {
													"value": "request_full_statement"
												}
											},
											{
												"key": {
													"value": "ACCOUNT_HOLDER_MSISDN"
												},
												"value": {
													"value": "242060000001"
												}
											}
										],
										"languageCode": "fr",
										"sessionIdentifier": "example-session",
										"journeyIdentifier": "example-journey"
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "The operation's return keys as an arguments record.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ArgumentsResponse"
								},
								"examples": {
									"check_registration_status": {
										"summary": "Is this MSISDN registered? Routes to the Home Menu or to the registration disclosure screen.",
										"value": {
											"arguments": [
												{
													"key": {
														"value": "registration_status"
													},
													"value": {
														"value": "REGISTERED"
													}
												},
												{
													"key": {
														"value": "account_id"
													},
													"value": {
														"value": "7ade4636-df3e-4ac9-a73b-32635bccc7d3"
													}
												},
												{
													"key": {
														"value": "user_email"
													},
													"value": {
														"value": "client@example.cd"
													}
												}
											]
										}
									},
									"register_savings_account": {
										"summary": "Opens the savings account for this MSISDN (idempotent; re-dial → ALREADY_REGISTERED).",
										"value": {
											"arguments": [
												{
													"key": {
														"value": "registration_result"
													},
													"value": {
														"value": "REGISTERED"
													}
												},
												{
													"key": {
														"value": "account_id"
													},
													"value": {
														"value": "7ade4636-df3e-4ac9-a73b-32635bccc7d3"
													}
												}
											]
										}
									},
									"create_deposit_summary": {
										"summary": "Quotes the chosen amount + lock period against the live offerable product version (no state written).",
										"value": {
											"arguments": [
												{
													"key": {
														"value": "summary_status"
													},
													"value": {
														"value": "OK"
													}
												},
												{
													"key": {
														"value": "amount"
													},
													"value": {
														"value": "50000"
													}
												},
												{
													"key": {
														"value": "interest_rate"
													},
													"value": {
														"value": "5"
													}
												},
												{
													"key": {
														"value": "estimated_earnings"
													},
													"value": {
														"value": "625"
													}
												},
												{
													"key": {
														"value": "total_at_maturity"
													},
													"value": {
														"value": "50625"
													}
												},
												{
													"key": {
														"value": "duration_days"
													},
													"value": {
														"value": "91"
													}
												},
												{
													"key": {
														"value": "currency"
													},
													"value": {
														"value": "XAF"
													}
												},
												{
													"key": {
														"value": "product_code"
													},
													"value": {
														"value": "prod3m"
													}
												},
												{
													"key": {
														"value": "deposit_reference"
													},
													"value": {
														"value": "dep_2f1c…"
													}
												}
											]
										}
									},
									"confirm_deposit": {
										"summary": "Writes the PENDING PaymentOrder + fires the MoMo Request-to-Pay; PENDING_VALIDATION until the async outcome settles.",
										"value": {
											"arguments": [
												{
													"key": {
														"value": "deposit_status"
													},
													"value": {
														"value": "PENDING_VALIDATION"
													}
												},
												{
													"key": {
														"value": "deposit_reference"
													},
													"value": {
														"value": "dep_2f1c…"
													}
												},
												{
													"key": {
														"value": "payment_message"
													},
													"value": {
														"value": "Confirmez le paiement sur votre téléphone MoMo (saisissez votre code PIN)."
													}
												}
											]
										}
									},
									"create_withdrawal_summary": {
										"summary": "Quotes the early-exit terms for the position's full balance (no state written). Mints withdrawal_reference for confirm.",
										"value": {
											"arguments": [
												{
													"key": {
														"value": "amount"
													},
													"value": {
														"value": "100000"
													}
												},
												{
													"key": {
														"value": "penalty_applied"
													},
													"value": {
														"value": "N"
													}
												},
												{
													"key": {
														"value": "original_rate"
													},
													"value": {
														"value": "5"
													}
												},
												{
													"key": {
														"value": "new_rate"
													},
													"value": {
														"value": "4.5"
													}
												},
												{
													"key": {
														"value": "penalty_amount"
													},
													"value": {
														"value": "0"
													}
												},
												{
													"key": {
														"value": "net_amount"
													},
													"value": {
														"value": "101125"
													}
												},
												{
													"key": {
														"value": "currency"
													},
													"value": {
														"value": "XAF"
													}
												},
												{
													"key": {
														"value": "settlement_delay"
													},
													"value": {
														"value": "48h"
													}
												},
												{
													"key": {
														"value": "withdrawal_reference"
													},
													"value": {
														"value": "c4e7f8a2-1b3d-4f9e-8c0a-5d2e6f7a9b1c"
													}
												}
											]
										}
									},
									"confirm_withdrawal": {
										"summary": "Reserves the LOCKED position + fires the MoMo Disbursement; PENDING until the async outcome settles.",
										"value": {
											"arguments": [
												{
													"key": {
														"value": "withdrawal_status"
													},
													"value": {
														"value": "PENDING"
													}
												},
												{
													"key": {
														"value": "withdrawal_reference"
													},
													"value": {
														"value": "c4e7f8a2-1b3d-4f9e-8c0a-5d2e6f7a9b1c"
													}
												}
											]
										}
									},
									"get_savings_balance": {
										"summary": "Locked savings balance: principal with computed interest.",
										"value": {
											"arguments": [
												{
													"key": {
														"value": "total_balance"
													},
													"value": {
														"value": "120000"
													}
												},
												{
													"key": {
														"value": "total_interest"
													},
													"value": {
														"value": "932"
													}
												},
												{
													"key": {
														"value": "locked_rates"
													},
													"value": {
														"value": "5.5,4"
													}
												},
												{
													"key": {
														"value": "currency"
													},
													"value": {
														"value": "XAF"
													}
												}
											]
										}
									},
									"confirm_opt_out": {
										"summary": "Confirms opt-out / account closure (stub).",
										"value": {
											"arguments": [
												{
													"key": {
														"value": "opt_out_status"
													},
													"value": {
														"value": "COMPLETED"
													}
												}
											]
										}
									},
									"get_user_email": {
										"summary": "Fetches the email on file (internal step; happy path = on file).",
										"value": {
											"arguments": [
												{
													"key": {
														"value": "email"
													},
													"value": {
														"value": "client@example.cd"
													}
												},
												{
													"key": {
														"value": "email_status"
													},
													"value": {
														"value": "ON_FILE"
													}
												}
											]
										}
									},
									"request_full_statement": {
										"summary": "Requests a full statement (async email delivery) (stub).",
										"value": {
											"arguments": [
												{
													"key": {
														"value": "request_status"
													},
													"value": {
														"value": "REQUESTED"
													}
												}
											]
										}
									}
								}
							}
						}
					},
					"400": {
						"description": "Malformed envelope, invalid JSON, or unknown operation.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/getdynamicoptions": {
			"post": {
				"operationId": "getDynamicOptions",
				"summary": "Collection operations (one row of keys per option).",
				"description": "Operations:\n- `list_locked_accounts` — Locked positions the customer can withdraw from. One row per open LOCKED position; balance reflects any in-progress reservation. Returns: locked_account_id, label, maturity_date, current_balance.\n- `list_recent_transactions` — The last few transactions (mini statement). Returns: transaction_id, transaction_date, transaction_type, amount, currency.",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DjsEnvelope"
							},
							"examples": {
								"list_locked_accounts": {
									"summary": "Locked positions the customer can withdraw from. One row per open LOCKED position; balance reflects any in-progress reservation.",
									"value": {
										"arguments": [
											{
												"key": {
													"value": "operation_name"
												},
												"value": {
													"value": "list_locked_accounts"
												}
											},
											{
												"key": {
													"value": "ACCOUNT_HOLDER_MSISDN"
												},
												"value": {
													"value": "242060000001"
												}
											}
										],
										"languageCode": "fr",
										"sessionIdentifier": "example-session",
										"journeyIdentifier": "example-journey"
									}
								},
								"list_recent_transactions": {
									"summary": "The last few transactions (mini statement).",
									"value": {
										"arguments": [
											{
												"key": {
													"value": "operation_name"
												},
												"value": {
													"value": "list_recent_transactions"
												}
											},
											{
												"key": {
													"value": "ACCOUNT_HOLDER_MSISDN"
												},
												"value": {
													"value": "242060000001"
												}
											}
										],
										"languageCode": "fr",
										"sessionIdentifier": "example-session",
										"journeyIdentifier": "example-journey"
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "The options as an argumentsList (one row of keys each).",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ArgumentsListResponse"
								},
								"examples": {
									"list_locked_accounts": {
										"summary": "Locked positions the customer can withdraw from. One row per open LOCKED position; balance reflects any in-progress reservation.",
										"value": {
											"argumentsList": [
												[
													{
														"key": {
															"value": "locked_account_id"
														},
														"value": {
															"value": "7ade4636-df3e-4ac9-a73b-32635bccc7d3"
														}
													},
													{
														"key": {
															"value": "label"
														},
														"value": {
															"value": "3 mois - 50000 FCFA"
														}
													},
													{
														"key": {
															"value": "maturity_date"
														},
														"value": {
															"value": "2026-09-11"
														}
													},
													{
														"key": {
															"value": "current_balance"
														},
														"value": {
															"value": "50000"
														}
													}
												]
											]
										}
									},
									"list_recent_transactions": {
										"summary": "The last few transactions (mini statement).",
										"value": {
											"argumentsList": [
												[
													{
														"key": {
															"value": "transaction_id"
														},
														"value": {
															"value": "7ade4636-df3e-4ac9-a73b-32635bccc7d3"
														}
													},
													{
														"key": {
															"value": "transaction_date"
														},
														"value": {
															"value": "2026-06-10"
														}
													},
													{
														"key": {
															"value": "transaction_type"
														},
														"value": {
															"value": "DEPOSIT"
														}
													},
													{
														"key": {
															"value": "amount"
														},
														"value": {
															"value": "50000"
														}
													},
													{
														"key": {
															"value": "currency"
														},
														"value": {
															"value": "XAF"
														}
													}
												],
												[
													{
														"key": {
															"value": "transaction_id"
														},
														"value": {
															"value": "a1f2e3d4-5b6c-7d8e-9f01-234567890abc"
														}
													},
													{
														"key": {
															"value": "transaction_date"
														},
														"value": {
															"value": "2026-06-09"
														}
													},
													{
														"key": {
															"value": "transaction_type"
														},
														"value": {
															"value": "MATURITY"
														}
													},
													{
														"key": {
															"value": "amount"
														},
														"value": {
															"value": "125"
														}
													},
													{
														"key": {
															"value": "currency"
														},
														"value": {
															"value": "XAF"
														}
													}
												]
											]
										}
									}
								}
							}
						}
					},
					"400": {
						"description": "Malformed envelope, invalid JSON, or unknown operation.",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		}
	},
	"components": {
		"schemas": {
			"ArgPair": {
				"type": "object",
				"properties": {
					"key": {
						"type": "object",
						"properties": {
							"value": {
								"type": "string"
							}
						},
						"required": [
							"value"
						]
					},
					"value": {
						"type": "object",
						"properties": {
							"value": {
								"type": "string"
							}
						},
						"required": [
							"value"
						]
					}
				},
				"required": [
					"key",
					"value"
				]
			},
			"DjsEnvelope": {
				"type": "object",
				"description": "The DJS envelope: a flat list of key/value pairs plus session metadata. `operation_name` selects the operation.",
				"properties": {
					"arguments": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/ArgPair"
						}
					},
					"languageCode": {
						"type": "string",
						"default": "fr"
					},
					"sessionIdentifier": {
						"type": "string"
					},
					"journeyIdentifier": {
						"type": "string"
					}
				},
				"required": [
					"arguments",
					"sessionIdentifier",
					"journeyIdentifier"
				]
			},
			"ArgumentsResponse": {
				"type": "object",
				"properties": {
					"arguments": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/ArgPair"
						}
					}
				},
				"required": [
					"arguments"
				]
			},
			"ArgumentsListResponse": {
				"type": "object",
				"properties": {
					"argumentsList": {
						"type": "array",
						"items": {
							"type": "array",
							"items": {
								"$ref": "#/components/schemas/ArgPair"
							}
						}
					}
				},
				"required": [
					"argumentsList"
				]
			},
			"ErrorResponse": {
				"type": "object",
				"properties": {
					"error": {
						"type": "object",
						"properties": {
							"code": {
								"type": "string"
							},
							"message": {
								"type": "string"
							}
						},
						"required": [
							"code",
							"message"
						]
					}
				},
				"required": [
					"error"
				]
			},
			"CheckRegistrationStatusOutput": {
				"type": "object",
				"properties": {
					"registration_status": {
						"type": "string",
						"description": "Whether the MSISDN already has an account.",
						"enum": [
							"REGISTERED",
							"NOT_REGISTERED"
						]
					},
					"account_id": {
						"type": "string",
						"description": "Opaque account reference; present when REGISTERED."
					},
					"user_email": {
						"type": "string",
						"description": "Email on file; present when REGISTERED and one was supplied."
					}
				},
				"required": [
					"registration_status"
				],
				"additionalProperties": false
			},
			"RegisterSavingsAccountOutput": {
				"type": "object",
				"properties": {
					"registration_result": {
						"type": "string",
						"description": "Outcome of the open-account attempt.",
						"enum": [
							"REGISTERED",
							"ALREADY_REGISTERED",
							"FAILED"
						]
					},
					"account_id": {
						"type": "string",
						"description": "Opaque account reference; present on REGISTERED/ALREADY_REGISTERED."
					},
					"failure_reason": {
						"type": "string",
						"description": "Generic reason; present only on FAILED (identity not yet resolvable, or resolver unavailable — try again)."
					}
				},
				"required": [
					"registration_result"
				],
				"additionalProperties": false
			},
			"CreateDepositSummaryOutput": {
				"type": "object",
				"properties": {
					"summary_status": {
						"type": "string",
						"description": "OK | AMOUNT_TOO_LOW."
					},
					"amount": {
						"type": "string",
						"description": "Deposit amount (XAF)."
					},
					"interest_rate": {
						"type": "string",
						"description": "Annual rate, bare percent (e.g. 5)."
					},
					"estimated_earnings": {
						"type": "string",
						"description": "Projected interest at maturity (XAF)."
					},
					"total_at_maturity": {
						"type": "string",
						"description": "Principal + projected interest (XAF)."
					},
					"duration_days": {
						"type": "string",
						"description": "Lock term in days."
					},
					"minimum_amount": {
						"type": "string",
						"description": "Product minimum (present when AMOUNT_TOO_LOW)."
					},
					"currency": {
						"type": "string",
						"description": "ISO currency (XAF)."
					},
					"product_code": {
						"type": "string",
						"description": "Echoed for confirm."
					},
					"deposit_reference": {
						"type": "string",
						"description": "Minted X-Reference-Id, carried into confirm."
					}
				},
				"required": [
					"summary_status",
					"currency"
				],
				"additionalProperties": false
			},
			"ConfirmDepositOutput": {
				"type": "object",
				"properties": {
					"deposit_status": {
						"type": "string",
						"description": "PENDING_VALIDATION | FAILED."
					},
					"deposit_reference": {
						"type": "string",
						"description": "The deposit reference (PENDING_VALIDATION)."
					},
					"payment_message": {
						"type": "string",
						"description": "Customer-facing PIN prompt (PENDING_VALIDATION)."
					},
					"failure_reason": {
						"type": "string",
						"description": "Why the deposit couldn't start (FAILED)."
					}
				},
				"required": [
					"deposit_status"
				],
				"additionalProperties": false
			},
			"CreateWithdrawalSummaryOutput": {
				"type": "object",
				"properties": {
					"amount": {
						"type": "string",
						"description": "Withdrawal amount (XAF)."
					},
					"penalty_applied": {
						"type": "string",
						"description": "Y/N — early-exit penalty applied."
					},
					"original_rate": {
						"type": "string",
						"description": "Original annual rate, bare percent (e.g. 5)."
					},
					"new_rate": {
						"type": "string",
						"description": "Effective rate after early-exit discount, bare percent (e.g. 4.5)."
					},
					"penalty_amount": {
						"type": "string",
						"description": "Forfeited interest (XAF)."
					},
					"net_amount": {
						"type": "string",
						"description": "Principal + entitled interest the customer receives (XAF)."
					},
					"currency": {
						"type": "string",
						"description": "ISO currency (XAF)."
					},
					"settlement_delay": {
						"type": "string",
						"description": "Expected disbursement delay shown to the customer (e.g. 48h)."
					},
					"withdrawal_reference": {
						"type": "string",
						"description": "Minted X-Reference-Id, carried into confirmWithdrawal."
					}
				},
				"required": [
					"amount",
					"penalty_applied",
					"original_rate",
					"new_rate",
					"penalty_amount",
					"net_amount",
					"currency",
					"settlement_delay",
					"withdrawal_reference"
				],
				"additionalProperties": false
			},
			"ConfirmWithdrawalOutput": {
				"type": "object",
				"properties": {
					"withdrawal_status": {
						"type": "string",
						"description": "PENDING | FAILED."
					},
					"withdrawal_reference": {
						"type": "string",
						"description": "The withdrawal reference (PENDING)."
					},
					"failure_reason": {
						"type": "string",
						"description": "Why the withdrawal couldn't start (FAILED)."
					}
				},
				"required": [
					"withdrawal_status"
				],
				"additionalProperties": false
			},
			"GetSavingsBalanceOutput": {
				"type": "object",
				"properties": {
					"total_balance": {
						"type": "string",
						"description": "Total locked principal across all open positions (whole XAF)."
					},
					"total_interest": {
						"type": "string",
						"description": "Total interest earned to date (whole XAF)."
					},
					"locked_rates": {
						"type": "string",
						"description": "Comma-separated annual rate per open position, bare percent (e.g. 5.5,4), oldest position first. Empty when no open positions."
					},
					"currency": {
						"type": "string",
						"description": "ISO currency (FCFA)."
					}
				},
				"required": [
					"total_balance",
					"total_interest",
					"locked_rates",
					"currency"
				],
				"additionalProperties": false
			},
			"ConfirmOptOutOutput": {
				"type": "object",
				"properties": {
					"opt_out_status": {
						"type": "string",
						"description": "Opt-out lifecycle status."
					}
				},
				"required": [
					"opt_out_status"
				],
				"additionalProperties": false
			},
			"GetUserEmailOutput": {
				"type": "object",
				"properties": {
					"email": {
						"type": "string",
						"description": "Email on file."
					},
					"email_status": {
						"type": "string",
						"description": "ON_FILE or NOT_ON_FILE."
					}
				},
				"required": [
					"email",
					"email_status"
				],
				"additionalProperties": false
			},
			"RequestFullStatementOutput": {
				"type": "object",
				"properties": {
					"request_status": {
						"type": "string",
						"description": "Statement request status."
					}
				},
				"required": [
					"request_status"
				],
				"additionalProperties": false
			},
			"ListLockedAccountsOutput": {
				"type": "object",
				"properties": {
					"locked_account_id": {
						"type": "string",
						"description": "Locked-position reference."
					},
					"label": {
						"type": "string",
						"description": "Human label shown on the USSD menu (duration + balance, e.g. '3 mois - 50000 FCFA')."
					},
					"maturity_date": {
						"type": "string",
						"description": "ISO-8601 maturity date."
					},
					"current_balance": {
						"type": "string",
						"description": "Current principal balance of the position (whole XAF)."
					}
				},
				"required": [
					"locked_account_id",
					"label",
					"maturity_date",
					"current_balance"
				],
				"additionalProperties": false
			},
			"ListRecentTransactionsOutput": {
				"type": "object",
				"properties": {
					"transaction_id": {
						"type": "string",
						"description": "Transaction reference."
					},
					"transaction_date": {
						"type": "string",
						"description": "ISO-8601 transaction date."
					},
					"transaction_type": {
						"type": "string",
						"description": "DEPOSIT, WITHDRAWAL, MATURITY, EARLY_EXIT, REVERSAL, or FUNDING."
					},
					"amount": {
						"type": "string",
						"description": "Transaction amount."
					},
					"currency": {
						"type": "string",
						"description": "ISO currency (FCFA)."
					}
				},
				"required": [
					"transaction_id",
					"transaction_date",
					"transaction_type",
					"amount",
					"currency"
				],
				"additionalProperties": false
			}
		}
	}
}
