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

# Zeitplan auf alle Standorte eines Clusters anwenden

> Wendet denselben `LimitProfileRequest` auf jeden Standort im Cluster
an (entspricht dem Aufruf von
`POST /locations/{locationId}/schedules` für jedes Mitglied).




## OpenAPI

````yaml /api-reference/energy-management/openapi.de.yaml POST /clusters/{clusterId}/schedules
openapi: 3.1.0
info:
  title: RiDERgy Energy Management API
  version: '1.0'
  license:
    name: Proprietary
    identifier: LicenseRef-Proprietary
  description: |
    Programmatische Steuerung von Ladeleistungslimits über Standorte, einzelne
    Ladepunkte, Organisationen und standortübergreifende Cluster hinweg.

    ## Authentifizierung
    Jeder Endpunkt außer `GET /health` benötigt einen `x-api-key`-Header. Der
    Schlüssel bestimmt Ihren Mandanten — er wird nie aus dem Request-Body oder
    einem anderen Header gelesen, sodass ein Schlüssel eines Mandanten nicht
    auf die Daten eines anderen Mandanten zugreifen kann.

    Ihr Mandant muss das Feature der Energy Management API aktiviert haben,
    andernfalls schlagen Anfragen mit `403 FEATURE_NOT_ENABLED` fehl.
    Kontaktieren Sie RiDERgy, um es zu aktivieren.

    ## Prioritätsmodell
    Standort- und Ladepunkt-Limits werden über **prioritätsbasierte
    Zeitfenster-Profile** gesteuert:

    - Prioritäten reichen von **0 (niedrigste) bis 10 (höchste)**, im
      OCPP-Stack-Stil.
    - Ein Ziel (Standort oder Ladepunkt-Connector) kann bis zu 11 Profile
      haben, eines pro Prioritätsstufe, jeweils mit eigenem
      `[startTime, endTime)`-Zeitfenster.
    - Zu jedem Zeitpunkt ist das **effektive Limit** der `limitKw`-Wert des
      Profils mit der höchsten Priorität, dessen Zeitfenster gerade aktiv ist.
    - Ist kein Profil aktiv, fällt ein Standort auf sein `permanentLimitKw`
      zurück.
    - Wird ein Profil mit einer Priorität übermittelt, für die für dieses Ziel
      bereits eines existiert, wird dieses **ersetzt**.
    - Profile werden automatisch zu ihrer `startTime`/`endTime` angewendet und
      wieder rückgängig gemacht — nach dem Erstellen eines Profils sind keine
      weiteren API-Aufrufe erforderlich. Profil-Datensätze werden nie gelöscht,
      sodass die Historie weiterhin abfragbar bleibt.

    ## Fehler
    Alle Fehler haben diese Form:

    ```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:
  - ApiKeyAuth: []
tags:
  - name: Health
    description: Nicht authentifizierter Service-Health-Check.
  - name: Locations
    description: >-
      Lesen und Setzen von Leistungslimits und Prioritätsprofilen auf
      Standortebene.
  - name: Chargers
    description: >-
      Sperren einzelner Ladepunkt-Connectoren auf ein festes Leistungslimit für
      ein Zeitfenster.
  - name: Organizations
    description: >-
      Mandantenweite Cap-Profile (werden nur erfasst — Durchsetzung noch nicht
      aktiv).
  - name: Clusters
    description: >-
      Gruppierung von Standorten unter einem gemeinsamen kW-Limit und Anwendung
      von Zeitplänen über diese hinweg.
paths:
  /clusters/{clusterId}/schedules:
    post:
      tags:
        - Clusters
      summary: Apply a schedule to every location in a cluster
      description: |
        Wendet denselben `LimitProfileRequest` auf jeden Standort im Cluster
        an (entspricht dem Aufruf von
        `POST /locations/{locationId}/schedules` für jedes Mitglied).
      operationId: applyClusterSchedule
      parameters:
        - $ref: '#/components/parameters/ClusterId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LimitProfileRequest'
            examples:
              example:
                value:
                  startTime: '2026-06-12T08:00:00Z'
                  endTime: '2026-06-12T18:00:00Z'
                  limitKw: 50
                  priority: 5
      responses:
        '200':
          description: Zeitplan auf mindestens einen Standort angewendet
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClusterScheduleResponse'
        '400':
          description: Cluster ist inaktiv, leer, oder der Request-Body ist ungültig
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                clusterInactive:
                  summary: CLUSTER_INACTIVE
                  value:
                    error:
                      code: CLUSTER_INACTIVE
                      message: Cluster clst_20260612_a1b2c3d4 is inactive
                      requestId: b1f6e6b0-1234-4abc-9def-000000000000
                clusterEmpty:
                  summary: CLUSTER_EMPTY
                  value:
                    error:
                      code: CLUSTER_EMPTY
                      message: Cluster has no locations
                      requestId: b1f6e6b0-1234-4abc-9def-000000000000
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/FeatureNotEnabled'
        '404':
          $ref: '#/components/responses/ClusterNotFound'
components:
  parameters:
    ClusterId:
      name: clusterId
      in: path
      required: true
      schema:
        type: string
      example: clst_20260612_a1b2c3d4
  schemas:
    LimitProfileRequest:
      type: object
      required:
        - startTime
        - endTime
        - limitKw
      properties:
        startTime:
          type: string
          format: date-time
          description: ISO-8601-UTC-Zeitstempel. Erforderlich.
          example: '2026-06-12T08:00:00Z'
        endTime:
          type: string
          format: date-time
          description: >-
            ISO-8601-UTC-Zeitstempel. Muss nach `startTime` liegen und in der
            Zukunft sein. Erforderlich.
          example: '2026-06-12T18:00:00Z'
        limitKw:
          type: number
          format: float
          exclusiveMinimum: 0
          description: Leistungslimit in kW. Muss größer als 0 sein. Erforderlich.
          example: 50
        priority:
          type: integer
          minimum: 0
          maximum: 10
          default: 0
          description: |
            Prioritätsstufe im OCPP-Stack-Stil, 0 (niedrigste) bis 10
            (höchste). Wird ein Profil mit einer Priorität übermittelt, die
            für dieses Ziel bereits existiert, wird dieses ersetzt.
          example: 5
    ClusterScheduleResponse:
      type: object
      properties:
        clusterId:
          type: string
          example: clst_20260612_a1b2c3d4
        applied:
          type: array
          items:
            allOf:
              - type: object
                properties:
                  locationId:
                    type: string
              - $ref: '#/components/schemas/LocationScheduleResponse'
        errors:
          type: array
          items:
            type: object
            properties:
              locationId:
                type: string
              error:
                $ref: '#/components/schemas/Error'
        totalLocations:
          type: integer
          example: 2
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              example: LOCATION_NOT_FOUND
            message:
              type: string
              example: Location 123 was not found for the provided tenant
            requestId:
              type: string
              format: uuid
    LocationScheduleResponse:
      type: object
      properties:
        locationId:
          type: string
          example: '3632155'
        priority:
          type: integer
          example: 5
        limitKw:
          type: number
          example: 50
        startTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
        status:
          $ref: '#/components/schemas/ProfileStatus'
        permanentLimitKw:
          type:
            - number
            - 'null'
          example: 100
        effectiveLimitKw:
          type:
            - number
            - 'null'
          example: 50
    ProfileStatus:
      type: string
      enum:
        - SCHEDULED
        - ACTIVE
        - EXPIRED
  responses:
    Unauthorized:
      description: Fehlender, ungültiger oder abgelaufener API-Schlüssel
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            unauthorized:
              value:
                error:
                  code: UNAUTHORIZED
                  message: Invalid or inactive API key
                  requestId: b1f6e6b0-1234-4abc-9def-000000000000
    FeatureNotEnabled:
      description: Mandant hat die Energy Management API nicht aktiviert
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            featureNotEnabled:
              value:
                error:
                  code: FEATURE_NOT_ENABLED
                  message: >-
                    The Energy Management API is not enabled for your account.
                    Contact RiDERgy to enable this feature.
                  requestId: b1f6e6b0-1234-4abc-9def-000000000000
    ClusterNotFound:
      description: Cluster nicht gefunden
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            clusterNotFound:
              value:
                error:
                  code: CLUSTER_NOT_FOUND
                  message: Cluster clst_20260612_a1b2c3d4 not found
                  requestId: b1f6e6b0-1234-4abc-9def-000000000000
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Mandanten-spezifischer API-Schlüssel. Der Mandant wird aus dem Schlüssel
        abgeleitet — nie aus dem Request.

````