{
	"info": {
		"name": "Digital Savings — Portal API",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
		"description": "The portal and ops surface for **Bomba Cash**: the savings product catalogue, the hourly liability tally, and the one action an operator can take on a stuck payment order.\n\nEvery answer carries the same envelope — `data` on a success, `error` on a failure, never both — so a caller branches on one field rather than on the status.\n\nImport whichever environment matches your target stage (`internal.postman_environment.json`) — its `baseUrl` is already that stage's live host. Run **createPortalToken** first and paste the `accessToken` it returns into the environment's `accessToken` variable; every other request sends it.\n\nEvery route but one is behind a Cognito user pool. Ask `POST /auth/token` for a token, sending the email address or phone number you sign in with and your password, then send it as `Authorization: Bearer <accessToken>`. A token lasts an hour. A request without one is answered `401 Unauthorized` by the gateway, before any of this API runs."
	},
	"auth": {
		"type": "bearer",
		"bearer": [
			{
				"key": "token",
				"value": "{{accessToken}}",
				"type": "string"
			}
		]
	},
	"item": [
		{
			"name": "listPortalRoles",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/roles",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"roles"
					]
				},
				"description": "Every role and what it grants. With pairs=1, one row per organisation and role that has holders you can see, and one with no organisation for a role none of them holds."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "getPortalRole",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/roles/:roleKey",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"roles",
						":roleKey"
					]
				},
				"description": "One role and what it grants."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "listPortalRoleHolders",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/roles/:roleKey/holders",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"roles",
						":roleKey",
						"holders"
					]
				},
				"description": "Who holds a role, among the users you can see."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "createPortalRole",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"name\": \"Operations view\",\n  \"description\": \"Reads the Operations section and nothing else.\",\n  \"pageGrants\": {\n    \"savings\": [\n      \"read\"\n    ],\n    \"maturities\": [\n      \"read\"\n    ]\n  },\n  \"fieldGrants\": {}\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/roles",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"roles"
					]
				},
				"description": "Create a role. Its key is built from the name, and it may grant only what your roles grant."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "updatePortalRole",
			"request": {
				"method": "PATCH",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/roles/:roleKey",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"roles",
						":roleKey"
					]
				},
				"description": "Change a role's name, description or grants. It may grant only what your roles grant, and may not leave you unable to edit roles."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "retirePortalRole",
			"request": {
				"method": "DELETE",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/roles/:roleKey",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"roles",
						":roleKey"
					]
				},
				"description": "Retire a role nobody holds. Super only, and never a role the pool ships with."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "listPortalOrganisations",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/organisations",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"organisations"
					]
				},
				"description": "The organisations you hold, and who each is."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "updatePortalOrganisation",
			"request": {
				"method": "PATCH",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/organisations/:id",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"organisations",
						":id"
					]
				},
				"description": "Change an organisation's contact details, or which pages its people may reach. Only one you hold, and the pages only as a super."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "listPortalActivity",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/activity",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"activity"
					]
				},
				"description": "What changed, newest first, among the changes that concern an organisation you hold."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "listProductEvents",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/products/:code/events",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"products",
						":code",
						"events"
					]
				},
				"description": "A product's change history, newest first."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "listPortalUserEvents",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/users/:id/events",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"users",
						":id",
						"events"
					]
				},
				"description": "A user's change history, newest first. Only a user you can see."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "listPortalRoleEvents",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/roles/:roleKey/events",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"roles",
						":roleKey",
						"events"
					]
				},
				"description": "A role's change history, newest first."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "listPortalOrganisationEvents",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/organisations/:id/events",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"organisations",
						":id",
						"events"
					]
				},
				"description": "An organisation's change history, newest first. Only one you hold."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "getPortalSettings",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/settings",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"settings"
					]
				},
				"description": "The platform settings: SMS on or off, the terms link, and when each scheduled worker runs."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "updatePortalSettings",
			"request": {
				"method": "PATCH",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/settings",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"settings"
					]
				},
				"description": "Change any setting. A schedule is written to its worker's Rule, and every value changed is on the trail."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "getPortalSettingsReference",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/settings/reference",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"settings",
						"reference"
					]
				},
				"description": "What the deployed code holds: partners, their currencies, the SMS categories and the scheduled workers."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "listProducts",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/products",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"products"
					]
				},
				"description": "One market's catalogue: each product's version in force and its next scheduled change."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "cancelScheduledVersion",
			"request": {
				"method": "DELETE",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/products/:code/versions/:version",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"products",
						":code",
						"versions",
						":version"
					]
				},
				"description": "Take back a version that has not taken effect. One in force is never removed."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "getPortalMe",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/auth/me",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"auth",
						"me"
					]
				},
				"description": "Who you are: your alias, your name, the groups you hold, and the pages and actions your roles grant."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "createPortalToken",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"username\": \"ops@kamoa.io\",\n  \"password\": \"…\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/auth/token",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"auth",
						"token"
					]
				},
				"description": "Exchange an email address or phone number and a password for a token."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "getProductInForce",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/products/:code",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"products",
						":code"
					]
				},
				"description": "The version of one product in force, whatever its status."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "listProductVersions",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/products/:code/versions",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"products",
						":code",
						"versions"
					]
				},
				"description": "One page of a product's versions, oldest first."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "createProductVersion",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"currency\": \"XAF\",\n  \"accrualPeriod\": \"MONTH\",\n  \"accrualPeriods\": 3,\n  \"interestRate\": \"0.055\",\n  \"discountRate\": \"0.10\",\n  \"minAmount\": \"1000\",\n  \"maxBalance\": \"2000000\",\n  \"earlyExitHoldSeconds\": 172800,\n  \"effectiveFrom\": \"2027-01-01T00:00:00.000Z\",\n  \"status\": \"ACTIVE\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/products",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"products"
					]
				},
				"description": "Append one product version. Versions are immutable."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "getLiabilityRange",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/liability/days",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"liability",
						"days"
					]
				},
				"description": "What the book owed across a window, one row per day."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "getLiabilityDay",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/liability/days/:asOf",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"liability",
						"days",
						":asOf"
					]
				},
				"description": "What the book owed on one day."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "getProductLiabilitySeries",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/liability/products/:code/versions/:version",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"liability",
						"products",
						":code",
						"versions",
						":version"
					]
				},
				"description": "One product version's liability over a window, oldest first."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "fundPool",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"reference\": \"treasury-2026-09-18-01\",\n  \"currency\": \"XAF\",\n  \"amount\": \"5000000\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/funding",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"funding"
					]
				},
				"description": "Put the business's own money into the pooled wallet."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "redriveStuckOrder",
			"request": {
				"method": "POST",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/orders/:reference/redrive",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"orders",
						":reference",
						"redrive"
					]
				},
				"description": "Clear one stuck order's marker so the overdue sweep picks it up again."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "answerPortalChallenge",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"username\": \"ops@kamoa.io\",\n  \"password\": \"…\",\n  \"newPassword\": \"…\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/auth/challenge",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"auth",
						"challenge"
					]
				},
				"description": "Answer the challenge a sign-in was refused on, and get a token. Send the password again — the session is taken out here."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "startPortalPasswordReset",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"username\": \"ops@kamoa.io\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/auth/forgot",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"auth",
						"forgot"
					]
				},
				"description": "Send a reset code to the alias. An unknown alias answers the same way."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "confirmPortalPasswordReset",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"username\": \"ops@kamoa.io\",\n  \"code\": \"123456\",\n  \"password\": \"…\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/auth/forgot/confirm",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"auth",
						"forgot",
						"confirm"
					]
				},
				"description": "Finish a reset with the code and a new password."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "changePortalPassword",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"previousPassword\": \"…\",\n  \"proposedPassword\": \"…\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/auth/password",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"auth",
						"password"
					]
				},
				"description": "Change your own password while signed in."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "enablePortalMfa",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"code\": \"123456\"\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/auth/mfa",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"auth",
						"mfa"
					]
				},
				"description": "Turn TOTP on. With no code it answers the secret an authenticator app takes; with one it confirms and enables."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "disablePortalMfa",
			"request": {
				"method": "DELETE",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/auth/mfa",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"auth",
						"mfa"
					]
				},
				"description": "Turn TOTP off."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "createPortalUser",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"name\": \"Awa Ndiaye\",\n  \"email\": \"awa@kamoa.io\",\n  \"organisations\": [\n    \"kamoa\"\n  ],\n  \"roles\": [\n    \"role:operations\",\n    \"role:tech\"\n  ]\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/users",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"users"
					]
				},
				"description": "Invite one user by the email or phone number they will sign in with, scoped to organisations and given roles."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "listPortalUsers",
			"request": {
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/users",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"users"
					]
				},
				"description": "Every user you share an organisation with, each with all the groups they hold. One response, never paged."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "updatePortalUser",
			"request": {
				"method": "PATCH",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"roles\": [\n    \"role:support\"\n  ],\n  \"enabled\": false\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "{{baseUrl}}/users/:id",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"users",
						":id"
					]
				},
				"description": "Change a user's organisations or roles, add an alias they lack, or disable them."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "resetPortalUserPassword",
			"request": {
				"method": "POST",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/users/:id/reset",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"users",
						":id",
						"reset"
					]
				},
				"description": "Force a password reset. Their next sign-in is a challenge."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		},
		{
			"name": "resendPortalUserInvite",
			"request": {
				"method": "POST",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/users/:id/invite",
					"host": [
						"{{baseUrl}}"
					],
					"path": [
						"users",
						":id",
						"invite"
					]
				},
				"description": "Send the invitation again, reissuing the temporary password."
			},
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"pm.test(\"status is 200\", () => pm.response.to.have.status(200));"
						]
					}
				}
			]
		}
	]
}
