{
	"info": {
		"name": "Digital Savings — DJS API",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
		"description": "**MoMo Savings+** — a digital locked-savings product for MTN MoMo customers in Congo, operated under the BCH banking licence. This is its DJS (Dynamic Journey Service) API: what MTN's USSD gateway calls, once per step, to drive a customer through a savings journey — registering, depositing into a locked position, checking a balance, withdrawing early, requesting a statement.\n\nEvery operation goes through one of two endpoints, picked by whether it returns a single record or a list; the `operation_name` argument in a shared envelope selects which operation actually runs. Pick an operation from the request/response **examples** below to see the exact envelope to send and the keys you get back.\n\nThis collection makes every operation runnable, targeting the `{{baseUrl}}` variable. Import whichever environment file matches your target stage (`develop.postman_environment.json`, `internal.postman_environment.json`) — its `baseUrl` is prefilled to that stage's live host. `openapi.json` stays the authoritative spec; this collection mirrors it as something you can actually run.\n\nProduction ingress (the MoMo gateway channel) uses standard TLS (HTTPS) — no client certificate is needed or accepted."
	},
	"item": [
		{
			"name": "check_registration_status",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"check_registration_status\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicarguments",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicarguments"
					]
				},
				"description": "Is this MSISDN registered? Routes to the Home Menu or to the registration disclosure screen."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "register_savings_account",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"register_savings_account\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_EMAIL\"\n      },\n      \"value\": {\n        \"value\": \"client@example.cd\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicarguments",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicarguments"
					]
				},
				"description": "Opens the savings account for this MSISDN (idempotent; re-dial → ALREADY_REGISTERED)."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "create_deposit_summary",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"create_deposit_summary\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"amount\"\n      },\n      \"value\": {\n        \"value\": \"50000\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"product_code\"\n      },\n      \"value\": {\n        \"value\": \"prod3m\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicarguments",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicarguments"
					]
				},
				"description": "Quotes the chosen amount + lock period against the live offerable product version (no state written)."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "confirm_deposit",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"confirm_deposit\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"deposit_reference\"\n      },\n      \"value\": {\n        \"value\": \"dep_2f1c…\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicarguments",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicarguments"
					]
				},
				"description": "Writes the PENDING PaymentOrder + fires the MoMo Request-to-Pay; PENDING_VALIDATION until the async outcome settles. Trusts the quote create_deposit_summary recorded, not resent amount/product_code."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "create_withdrawal_summary",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"create_withdrawal_summary\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"locked_account_id\"\n      },\n      \"value\": {\n        \"value\": \"7ade4636-df3e-4ac9-a73b-32635bccc7d3\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicarguments",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicarguments"
					]
				},
				"description": "Withdrawal preview for one LOCKED position (no state written): what it would pay now vs. what waiting to maturity would earn. Mints withdrawal_reference for confirm."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "confirm_withdrawal",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"confirm_withdrawal\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"withdrawal_reference\"\n      },\n      \"value\": {\n        \"value\": \"c4e7f8a2-1b3d-4f9e-8c0a-5d2e6f7a9b1c\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicarguments",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicarguments"
					]
				},
				"description": "Reserves the LOCKED position + fires the MoMo Disbursement; PENDING until the async outcome settles. Trusts the position create_withdrawal_summary recorded, not a resent locked_account_id."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "get_savings_balance",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"get_savings_balance\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicarguments",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicarguments"
					]
				},
				"description": "Savings totals: locked principal + any in-flight withdrawal, with interest earned to date. Paired with list_locked_accounts for the per-position breakdown."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "confirm_opt_out",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"confirm_opt_out\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicarguments",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicarguments"
					]
				},
				"description": "Early-exits every open locked position, then closes the account once everything has settled."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "get_user_email",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"get_user_email\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicarguments",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicarguments"
					]
				},
				"description": "Fetches the email on file (internal step; happy path = on file)."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "create_full_statement_summary",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"create_full_statement_summary\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicarguments",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicarguments"
					]
				},
				"description": "Mints the reference the confirm step (request_full_statement) echoes back to make it idempotent (no state written)."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "request_full_statement",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"request_full_statement\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_EMAIL\"\n      },\n      \"value\": {\n        \"value\": \"client@example.cd\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"period\"\n      },\n      \"value\": {\n        \"value\": \"3m\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"statement_reference\"\n      },\n      \"value\": {\n        \"value\": \"stmt_2f1c…\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicarguments",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicarguments"
					]
				},
				"description": "Confirms/updates the email on file, then hands the period-bounded PDF generation + delivery off to a background worker (async email delivery)."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "list_locked_accounts",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"list_locked_accounts\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicoptions",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicoptions"
					]
				},
				"description": "Locked positions the customer can withdraw from — also backs the balance screen's per-position breakdown (get_savings_balance only carries totals). One row per open LOCKED position; balance reflects any in-progress reservation."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "list_opt_out_positions",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"list_opt_out_positions\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicoptions",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicoptions"
					]
				},
				"description": "The closure breakdown: every open locked position with its early-exit terms, so the pre-confirmation screen can show what confirm_opt_out would settle."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "list_recent_transactions",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"arguments\": [\n    {\n      \"key\": {\n        \"value\": \"operation_name\"\n      },\n      \"value\": {\n        \"value\": \"list_recent_transactions\"\n      }\n    },\n    {\n      \"key\": {\n        \"value\": \"ACCOUNT_HOLDER_MSISDN\"\n      },\n      \"value\": {\n        \"value\": \"242060000001\"\n      }\n    }\n  ],\n  \"languageCode\": \"fr\",\n  \"sessionIdentifier\": \"example-session\",\n  \"journeyIdentifier\": \"example-journey\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/getdynamicoptions",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"getdynamicoptions"
					]
				},
				"description": "The last few transactions (mini statement)."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		}
	]
}
