curl "https://api.scanova.io/plans/downgrade-impact/?target_plan=starter-scanova-io" \
-H "Authorization: 401f7ac837da42b97f613d789819ff93537bee6a"
{
"violations": [
{
"codename": "TOTAL_QR_CODES",
"quota_name": "Total QR Codes",
"exceed_value": 12,
"resolvable": true,
"total_affected_count": 112,
"affected_resources": ["Q07afe81aa0034c01", "Q19bd72cc1145d02"]
}
],
"current_plan_expiry": "2027-08-16",
"days_remaining": 365
}
Analytics & Plans
Preview a plan downgrade's impact
GET /plans/downgrade-impact/
GET
/
plans
/
downgrade-impact
/
curl "https://api.scanova.io/plans/downgrade-impact/?target_plan=starter-scanova-io" \
-H "Authorization: 401f7ac837da42b97f613d789819ff93537bee6a"
{
"violations": [
{
"codename": "TOTAL_QR_CODES",
"quota_name": "Total QR Codes",
"exceed_value": 12,
"resolvable": true,
"total_affected_count": 112,
"affected_resources": ["Q07afe81aa0034c01", "Q19bd72cc1145d02"]
}
],
"current_plan_expiry": "2027-08-16",
"days_remaining": 365
}
Previews which resources would block a downgrade before you commit to checkout, on the Management API host (
An empty
api.scanova.io), authenticated with your raw Management API key.
GET https://api.scanova.io/plans/downgrade-impact/
Authorization: 401f7ac837da42b97f613d789819ff93537bee6a
string
required
The target plan’s slug (from List available plans’s
slug field).curl "https://api.scanova.io/plans/downgrade-impact/?target_plan=starter-scanova-io" \
-H "Authorization: 401f7ac837da42b97f613d789819ff93537bee6a"
{
"violations": [
{
"codename": "TOTAL_QR_CODES",
"quota_name": "Total QR Codes",
"exceed_value": 12,
"resolvable": true,
"total_affected_count": 112,
"affected_resources": ["Q07afe81aa0034c01", "Q19bd72cc1145d02"]
}
],
"current_plan_expiry": "2027-08-16",
"days_remaining": 365
}
violations array means the downgrade is currently clean — nothing would need to change first. This is entirely read-only and changes nothing; it reuses the exact same rule engine real checkout enforces, so it can’t disagree with what actually happens if you go ahead with the downgrade.
Response fields
array
One entry per quota the target plan can’t accommodate given the account’s current usage.
Show violation properties
Show violation properties
string
The quota’s stable identifier (e.g.
TOTAL_QR_CODES, SHARED_USERS).string
Human-readable quota name.
integer
How far over the target plan’s limit the account currently is.
boolean
Whether the account can resolve this itself (e.g. by deleting/deactivating some resources) before downgrading.
integer
Total count of resources counted against this quota.
array
Identifiers of the specific resources counted (e.g. QR
qrid values) — may be a truncated sample for high counts.string
The current plan’s expiry date, or
null for a plan with no expiry.integer | null
Days remaining until
current_plan_expiry, or null if the plan has no expiry.400 if target_plan is missing.
Related
- List available plans — find a
slugto preview downgrading to. - Current plan — the account’s current plan and quota grants.
- Management API overview — the auth scheme and quota rules that apply to this endpoint.
Authorizations
Send your Management API key as the raw value of the Authorization header — no "Bearer " or "Token " prefix, and no other characters. Example: Authorization: 401f7ac837da42b97f613d789819ff93537bee6a. A header containing more than one space-separated part is rejected outright. Requests also require the request's Host header to be the management API host (e.g. api.scanova.io) — the same key sent to the regular API host will not authenticate.
Query Parameters
The target plan's slug.
Response
Violations that would block the downgrade (empty array if none), plus the current plan's remaining time.
Was this page helpful?