> ## Documentation Index
> Fetch the complete documentation index at: https://docs.scanova.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Prévisualiser l'impact d'un déclassement de forfait

> GET /plans/downgrade-impact/

Prévisualise les ressources qui bloqueraient un déclassement avant de valider le paiement, sur l'hôte de l'**API de gestion** (`api.scanova.io`), authentifié avec votre clé brute d'API de gestion.

```
GET https://api.scanova.io/plans/downgrade-impact/
Authorization: 401f7ac837da42b97f613d789819ff93537bee6a
```

<ParamField query="target_plan" type="string" required>
  Le slug du forfait cible (depuis le champ `slug` de [Lister les forfaits disponibles](/fr/api-reference/management-api/plans/available)).
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl "https://api.scanova.io/plans/downgrade-impact/?target_plan=starter-scanova-io" \
    -H "Authorization: 401f7ac837da42b97f613d789819ff93537bee6a"
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "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
  }
  ```
</ResponseExample>

Un tableau `violations` vide signifie que le déclassement est propre pour l'instant — rien n'aurait besoin de changer avant. Ceci est entièrement en lecture seule et ne change rien ; cela réutilise exactement le même moteur de règles que celui appliqué lors du paiement réel, donc cela ne peut pas être en contradiction avec ce qui se passerait réellement en procédant au déclassement.

### Champs de la réponse

<ResponseField name="violations" type="array">
  Une entrée par quota que le forfait cible ne peut pas satisfaire compte tenu de l'utilisation actuelle du compte.

  <Expandable title="propriétés de violation">
    <ResponseField name="codename" type="string">L'identifiant stable du quota (p. ex. `TOTAL_QR_CODES`, `SHARED_USERS`).</ResponseField>
    <ResponseField name="quota_name" type="string">Nom lisible du quota.</ResponseField>
    <ResponseField name="exceed_value" type="integer">De combien le compte dépasse actuellement la limite du forfait cible.</ResponseField>
    <ResponseField name="resolvable" type="boolean">Si le compte peut résoudre cela lui-même (p. ex. en supprimant/désactivant certaines ressources) avant de déclasser.</ResponseField>
    <ResponseField name="total_affected_count" type="integer">Nombre total de ressources comptabilisées pour ce quota.</ResponseField>
    <ResponseField name="affected_resources" type="array">Identifiants des ressources concrètes comptabilisées (p. ex. valeurs `qrid` des QR codes) — peut être un échantillon tronqué pour des volumes élevés.</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="current_plan_expiry" type="string">
  La date d'expiration du forfait actuel, ou `null` pour un forfait sans expiration.
</ResponseField>

<ResponseField name="days_remaining" type="integer | null">
  Jours restants jusqu'à `current_plan_expiry`, ou `null` si le forfait n'a pas d'expiration.
</ResponseField>

`400` si `target_plan` est manquant.

## Voir aussi

* [Lister les forfaits disponibles](/fr/api-reference/management-api/plans/available) — trouver un `slug` pour prévisualiser le déclassement.
* [Forfait actuel](/fr/api-reference/management-api/plans/current) — le forfait actuel et les attributions de quota du compte.
* [Présentation de l'API de gestion](/fr/api-reference/management-api/overview) — le schéma d'authentification et les règles de quota applicables à cet endpoint.


## OpenAPI

````yaml api-reference/openapi/management-api.json GET /plans/downgrade-impact/
openapi: 3.1.0
info:
  title: Scanova Management API (v2)
  description: >-
    The complete Scanova Management API — every endpoint available at
    api.scanova.io (QR codes, folders, tags, leads, forms, analytics, plans,
    shared users & roles), plus the token-creation and usage-stats endpoints
    used to authenticate against it. Every path and request/response shape below
    was verified live against a real API key and the actual running backend
    (Phase 7, 2026-08-16) — not guessed from reading urls.py alone.
  version: 2.0.0
servers:
  - url: https://api.scanova.io
    description: Management API — QR/folder/tag/lead/form/analytics/plans endpoints
security:
  - apiKeyAuth: []
paths:
  /plans/downgrade-impact/:
    get:
      summary: Preview a plan downgrade's impact
      description: >-
        Read-only preview of which specific resources (e.g. QR codes over a new
        lower limit, shared users beyond a new seat count) would block a
        downgrade to `target_plan`, before committing to checkout. Reuses the
        exact same violation-detection logic real checkout enforces, so this
        preview can never disagree with what actually happens at order creation.
      operationId: getManagedDowngradeImpact
      parameters:
        - name: target_plan
          in: query
          required: true
          schema:
            type: string
          description: The target plan's slug.
      responses:
        '200':
          description: >-
            Violations that would block the downgrade (empty array if none),
            plus the current plan's remaining time.
          content:
            application/json:
              example:
                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
        '400':
          description: Missing `target_plan` query parameter.
components:
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        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.

````