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

# Ottenere un token di accesso

> Scambia le credenziali client per un token Bearer di breve durata (3600s).

Accetta le credenziali tramite:
- `Authorization: Basic base64(client_id:client_secret)` con
  `grant_type=client_credentials` nel corpo della richiesta (RFC 6749)
- Corpo JSON con `client_id`, `client_secret` e `grant_type`




## OpenAPI

````yaml api-reference/energy-management/openapi.it.yaml POST /oauth/token
openapi: 3.1.0
info:
  title: RiDERgy Energy Management API
  version: '1.0'
  license:
    name: Proprietary
    identifier: LicenseRef-Proprietary
  description: >
    Controllo programmatico dei limiti di potenza di ricarica su location,

    singoli charger, organizzazioni e cluster cross-location.


    ## Autenticazione

    Ogni endpoint, eccetto `GET /health` e `POST /oauth/token`, richiede un

    token Bearer ottenuto tramite il flusso OAuth 2.0 client_credentials:


    1. Crea le credenziali client OAuth nella dashboard RiDERgy.

    2. Scambiale per un access token di breve durata tramite `POST
    /oauth/token`.

    3. Passa il token come `Authorization: Bearer <token>` ad ogni richiesta.


    I token scadono dopo 3600 secondi. Il tuo tenant è incorporato nel token

    e non può essere falsificato. Le credenziali di un tenant non possono

    accedere a un altro.


    Il tuo tenant deve avere abilitata la funzionalità Energy Management API,

    altrimenti le richieste falliscono con `403 FEATURE_NOT_ENABLED`. Contatta

    RiDERgy per abilitarla.


    ## Scopes

    I token contengono scopes che controllano quali endpoint sono accessibili:

    `locations:read`, `locations:write`, `clusters:read`, `clusters:write`,

    `chargers:write`, `org:write`. Le richieste verso endpoint che richiedono

    uno scope non presente nel token falliranno con `403 INSUFFICIENT_SCOPE`.


    ## Modello di priorità

    I limiti di location e charger sono controllati tramite **profili con

    finestre di priorità**:


    - Le priorità vanno da **0 (più bassa) a 10 (più alta)**, in stile stack
      OCPP.
    - Un target (location o connettore del charger) può avere fino a 11
      profili, uno per livello di priorità, ciascuno con la propria finestra
      `[startTime, endTime)`.
    - In ogni momento, il **limite effettivo** è il `limitKw` del profilo a
      priorità più alta la cui finestra è attualmente attiva.
    - Se nessun profilo è attivo, una location ricade sul proprio
      `permanentLimitKw`.
    - L'invio di un profilo a una priorità che ne ha già uno per quel target
      lo **sostituisce**.
    - I profili vengono applicati e ripristinati automaticamente in base a
      `startTime`/`endTime`. Una volta creato un profilo non sono necessarie
      ulteriori chiamate API. I record dei profili non vengono mai eliminati,
      quindi la cronologia rimane interrogabile.

    ## Errori

    Tutti gli errori condividono questa struttura:


    ```json

    {
      "error": {
        "code": "LOCATION_NOT_FOUND",
        "message": "Location 123 was not found for the provided tenant",
        "requestId": "b1f6e6b0-..."
      }
    }

    ```
servers:
  - url: https://api.ridergy.com/v1
    description: Production
security:
  - BearerAuth: []
tags:
  - name: Auth
    description: Endpoint token OAuth 2.0 per il grant client_credentials.
  - name: Health
    description: Controllo dello stato del servizio non autenticato.
  - name: Locations
    description: >-
      Leggi e imposta i limiti di potenza e i profili di priorità a livello di
      location.
  - name: Chargers
    description: >-
      Blocca singoli connettori del charger su un limite di potenza fisso per
      una finestra temporale.
  - name: Organizations
    description: >-
      Profili di cap a livello di tenant (solo registrati, l'enforcement non è
      ancora attivo).
  - name: Clusters
    description: >-
      Raggruppa location sotto un cap kW condiviso e applica schedulazioni su di
      esse.
paths:
  /oauth/token:
    post:
      tags:
        - Auth
      summary: Obtain an access token
      description: >
        Scambia le credenziali client per un token Bearer di breve durata
        (3600s).


        Accetta le credenziali tramite:

        - `Authorization: Basic base64(client_id:client_secret)` con
          `grant_type=client_credentials` nel corpo della richiesta (RFC 6749)
        - Corpo JSON con `client_id`, `client_secret` e `grant_type`
      operationId: createToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - grant_type
              properties:
                grant_type:
                  type: string
                  enum:
                    - client_credentials
                client_id:
                  type: string
                  description: Obbligatorio se non si utilizza l'header Basic auth.
                  example: emcl_a1b2c3d4e5f67890a1b2c3d4e5f67890
                client_secret:
                  type: string
                  description: Obbligatorio se non si utilizza l'header Basic auth.
                  example: emcs_...
            examples:
              jsonBody:
                value:
                  grant_type: client_credentials
                  client_id: emcl_a1b2c3d4e5f67890a1b2c3d4e5f67890
                  client_secret: emcs_a1b2c3d4...
      responses:
        '200':
          description: Access token emesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  access_token:
                    type: string
                    description: Token Bearer JWT
                    example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
                  token_type:
                    type: string
                    example: Bearer
                  expires_in:
                    type: integer
                    description: Durata del token in secondi
                    example: 3600
                  scope:
                    type: string
                    description: Elenco degli scope concessi separati da spazi
                    example: >-
                      locations:read locations:write clusters:read
                      clusters:write chargers:write org:write
        '400':
          description: Richiesta non valida (grant_type mancante o grant non supportato)
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: unsupported_grant_type
                  error_description:
                    type: string
                    example: Only client_credentials grant type is supported
        '401':
          description: Credenziali client non valide
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: invalid_client
                  error_description:
                    type: string
                    example: Invalid client credentials
      security: []
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >
        Access token OAuth 2.0 ottenuto tramite `POST /oauth/token` con grant
        client_credentials.

        Tenant e scopes sono incorporati nel JWT. Non sono necessari header
        aggiuntivi.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.