A valid request URL is required to generate request examples{
"enabled": true,
"packs": [
{
"id": "topup-500",
"name": "500 SMS",
"credits": 500,
"priceCents": 2500
},
{
"id": "topup-2000",
"name": "2000 SMS",
"credits": 2000,
"priceCents": 9000
}
],
"plans": [
{
"id": "starter",
"name": "Starter",
"monthlySmsCredits": 200,
"emailFairUseCap": 5000,
"priceCents": 1900
},
{
"id": "pro",
"name": "Pro",
"monthlySmsCredits": 1000,
"emailFairUseCap": 20000,
"priceCents": 4900
}
],
"currentPlanTier": "starter"
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123,
"fieldErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}Read the billing catalogue and current plan
Returns the purchasable one-off top-up packs and monthly plans (each with its credits, email fair-use cap and display price in cents), the currentPlanTier the wallet subscribes to (omitted when on no plan), and enabled — false when the deployment has no Stripe secret, meaning every checkout below will return a dry-run stub instead of a payable session. ALWAYS call this before opening a checkout: it is the only source of the valid packId / tierId values, which are deployment config and not guessable. Read-only.
A valid request URL is required to generate request examples{
"enabled": true,
"packs": [
{
"id": "topup-500",
"name": "500 SMS",
"credits": 500,
"priceCents": 2500
},
{
"id": "topup-2000",
"name": "2000 SMS",
"credits": 2000,
"priceCents": 9000
}
],
"plans": [
{
"id": "starter",
"name": "Starter",
"monthlySmsCredits": 200,
"emailFairUseCap": 5000,
"priceCents": 1900
},
{
"id": "pro",
"name": "Pro",
"monthlySmsCredits": 1000,
"emailFairUseCap": 20000,
"priceCents": 4900
}
],
"currentPlanTier": "starter"
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123,
"fieldErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}Authorizations
Authorization: Bearer <token>. Accepts EITHER a Keycloak access token (scopes-in-token) OR an opaque POS session token; both resolve to the same pos.* scope vocabulary the route guards enforce.
Response
The catalogue, the Stripe-enabled flag and the currently subscribed tier.

