> ## 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.

# Obtener un token de acceso

> Intercambia credenciales de cliente por un token Bearer de corta duración (3600s).

Acepta credenciales mediante:
- `Authorization: Basic base64(client_id:client_secret)` con
  `grant_type=client_credentials` en el cuerpo de la solicitud (RFC 6749)
- Cuerpo JSON con `client_id`, `client_secret` y `grant_type`




## OpenAPI

````yaml api-reference/energy-management/openapi.es.yaml POST /oauth/token
openapi: 3.1.0
info:
  title: RiDERgy Energy Management API
  version: '1.0'
  license:
    name: Proprietary
    identifier: LicenseRef-Proprietary
  description: >
    Control programático de los límites de potencia de carga en ubicaciones,

    cargadores individuales, organizaciones y clústeres entre ubicaciones.


    ## Autenticación

    Todos los endpoints excepto `GET /health` y `POST /oauth/token` requieren

    un token Bearer obtenido mediante el flujo OAuth 2.0 client_credentials:


    1. Crea credenciales de cliente OAuth en el panel de RiDERgy.

    2. Intercámbialas por un token de acceso de corta duración mediante `POST
    /oauth/token`.

    3. Pasa el token como `Authorization: Bearer <token>` en cada solicitud.


    Los tokens expiran tras 3600 segundos. Tu tenant está integrado en el token

    y no puede ser suplantado. Las credenciales de un tenant no pueden acceder

    a otro.


    Tu tenant debe tener habilitada la función Energy Management API; de lo

    contrario, las solicitudes fallarán con `403 FEATURE_NOT_ENABLED`. Contacta

    con RiDERgy para habilitarla.


    ## Scopes

    Los tokens llevan scopes que controlan qué endpoints son accesibles:

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

    `chargers:write`, `org:write`. Las solicitudes a endpoints que requieran un

    scope que el token no posea fallarán con `403 INSUFFICIENT_SCOPE`.


    ## Modelo de prioridad

    Los límites de ubicación y de cargador se controlan mediante **perfiles con

    ventanas de prioridad**:


    - Las prioridades van de **0 (la más baja) a 10 (la más alta)**, al estilo
      de la pila OCPP.
    - Un objetivo (ubicación o conector de cargador) puede tener hasta 11
      perfiles, uno por nivel de prioridad, cada uno con su propia ventana
      `[startTime, endTime)`.
    - En cualquier momento, el **límite efectivo** es el `limitKw` del perfil
      de mayor prioridad cuya ventana esté actualmente activa.
    - Si no hay ningún perfil activo, una ubicación recurre a su
      `permanentLimitKw`.
    - Enviar un perfil con una prioridad que ya tiene uno para ese objetivo lo
      **reemplaza**.
    - Los perfiles se aplican y revierten automáticamente en su
      `startTime`/`endTime`. No se necesitan más llamadas a la API una vez
      creado un perfil. Los registros de perfiles nunca se eliminan, por lo que
      el historial sigue siendo consultable.

    ## Errores

    Todos los errores comparten esta forma:


    ```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 de token OAuth 2.0 para el grant client_credentials.
  - name: Health
    description: Comprobación de estado del servicio sin autenticación.
  - name: Locations
    description: >-
      Consultar y establecer límites de potencia y perfiles de prioridad a nivel
      de ubicación.
  - name: Chargers
    description: >-
      Bloquear conectores de cargadores individuales a un límite de potencia
      fijo durante una ventana de tiempo.
  - name: Organizations
    description: >-
      Perfiles de límite a nivel de organización (solo se registran; la
      aplicación aún no está activa).
  - name: Clusters
    description: >-
      Agrupar ubicaciones bajo un límite de kW compartido y aplicar horarios
      entre ellas.
paths:
  /oauth/token:
    post:
      tags:
        - Auth
      summary: Obtain an access token
      description: >
        Intercambia credenciales de cliente por un token Bearer de corta
        duración (3600s).


        Acepta credenciales mediante:

        - `Authorization: Basic base64(client_id:client_secret)` con
          `grant_type=client_credentials` en el cuerpo de la solicitud (RFC 6749)
        - Cuerpo JSON con `client_id`, `client_secret` y `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: Obligatorio si no se usa la cabecera Basic auth.
                  example: emcl_a1b2c3d4e5f67890a1b2c3d4e5f67890
                client_secret:
                  type: string
                  description: Obligatorio si no se usa la cabecera Basic auth.
                  example: emcs_...
            examples:
              jsonBody:
                value:
                  grant_type: client_credentials
                  client_id: emcl_a1b2c3d4e5f67890a1b2c3d4e5f67890
                  client_secret: emcs_a1b2c3d4...
      responses:
        '200':
          description: Token de acceso emitido
          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: Tiempo de vida del token en segundos
                    example: 3600
                  scope:
                    type: string
                    description: Lista de scopes otorgados separados por espacios
                    example: >-
                      locations:read locations:write clusters:read
                      clusters:write chargers:write org:write
        '400':
          description: Solicitud no válida (falta grant_type o grant no soportado)
          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: Credenciales de cliente no válidas
          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: >
        Token de acceso OAuth 2.0 obtenido mediante `POST /oauth/token` con
        grant client_credentials.

        El tenant y los scopes están integrados en el JWT. No se necesitan
        cabeceras adicionales.

````

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