Cancel account subscription (all stores)
Overview
Cancel every active store plan under the given account and notify an admin via a brandPlanCancelled billing webhook. All matching StorePlans (status active/expired) are set to close with plan_end, cancel_subscription_at, and the reason stamped.
Prerequisites
- A bearer token in the
Authorizationheader.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
POST /api/v1/plans/cancel-account-subscription
Authentication
-
Requires a bearer token in the
Authorization: Bearer <bearer-token>header. -
Both (Partner or Account), within the account's own tree. Sits in the authenticated group under the
plansprefix, with no extra route-level guard. -
Two-layer scoping applies. Layer 1 requires
company_idto be an existingbundle_id=3(account) Company passing an ownership check. Layer 2 additionally requires the auth user'scompany_idto equal the account id or the account's parent company id — else 403 (Permission denied). -
So an Account user cancels their own account; the parent Partner can cancel a child account.
-
404 if the account has no locations (
Location not found.) or no payable active plans (No active plan found.).
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
company_id | integer | Yes | Account ID; existing bundle_id=3 Company in the caller's hierarchy. |
cancelling_reason | string | Yes | One of: Price too high, Response quality not good enough, Another solution in place, Prefer to respond myself, Do not get enough reviews to justify it, Responses are not important to our business, Other. |
cancelling_reason_other | string | No | nullable, max 255. |
Rate limit
- No rate limit.
Request body
{
"company_id": 12,
"cancelling_reason": "Price too high",
"cancelling_reason_other": "Switching to a competitor"
}Response
200 Success · 200
200{
"data": { "message": "Subscription cancelled successfully." }
}403 Permission denied · 403
403{
"message": "Forbidden",
"status": "error",
"errors": "Permission denied"
}404 Location not found · 404
404{
"message": "Not Found",
"status": "error",
"errors": "Location not found."
}Errors
| Status | Meaning |
|---|---|
401 | The bearer token is missing, expired or invalid |
403 | Permission denied |
404 | Location not found |
422 | The request failed validation — the response names the fields |
500 | Unexpected server error |
Example request
curl --request POST \
--url "https://production-api.shoutaboutus.com/api/v1/plans/cancel-account-subscription" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"company_id": 12, "cancelling_reason": "Price too high", "cancelling_reason_other": "Switching to a competitor"}'Updated 10 days ago
