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

# Get one charging session with its decision timeline, command verdicts and home-energy context



## OpenAPI

````yaml https://app.podero.com/api/partners/v2.0/openapi.json get /api/partners/v2.0/org/{org_id}/users/{user_id}/charging-sessions/{session_id}
openapi: 3.1.0
info:
  title: Podero Partner API
  version: '2.0'
  description: >-
    This API provides a unified interaction point for Podero's partner
    companies.


    The goal of this API is to give partners easily integratable endpoints that
    don't require extensive software

    development. For this reason, the endpoints focus around user and device
    management, setting of preferences

    and high level device controls.


    While direct control of devices is implemented for special use cases such as
    pause power, we abstract away low level

    direct device steering so developers and partners can focus on delivering
    maximum value to end users.
  termsOfService: https://www.podero.com/terms-and-conditions
servers: []
security: []
paths:
  /api/partners/v2.0/org/{org_id}/users/{user_id}/charging-sessions/{session_id}:
    get:
      tags:
        - User Charging Sessions
      summary: >-
        Get one charging session with its decision timeline, command verdicts
        and home-energy context
      operationId: >-
        integrations_api_api_v2_organizations_users_charging_sessions_router_get_charging_session_endpoint
      parameters:
        - in: path
          name: org_id
          schema:
            description: The organization ID
            format: uuid
            title: Org Id
            type: string
          required: true
          description: The organization ID
        - in: path
          name: user_id
          schema:
            description: The user ID
            format: uuid
            title: User Id
            type: string
          required: true
          description: The user ID
        - in: path
          name: session_id
          schema:
            description: Opaque prefix-typed session id (`ev_{uuid}` or `wb_{int}`)
            title: Session Id
            type: string
          required: true
          description: Opaque prefix-typed session id (`ev_{uuid}` or `wb_{int}`)
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChargingSessionDetail'
      security:
        - OAuth2: []
components:
  schemas:
    ChargingSessionDetail:
      properties:
        session:
          $ref: '#/components/schemas/ChargingSessionItem'
        decisions:
          items:
            $ref: '#/components/schemas/DecisionItem'
          title: Decisions
          type: array
        commands:
          items:
            $ref: '#/components/schemas/CommandItem'
          title: Commands
          type: array
        home_energy:
          anyOf:
            - $ref: '#/components/schemas/HomeEnergyContext'
            - type: 'null'
      required:
        - session
        - decisions
        - commands
        - home_energy
      title: ChargingSessionDetail
      type: object
    ChargingSessionItem:
      properties:
        id:
          description: >-
            Opaque prefix-typed id: `ev_{uuid}` or `wb_{int}`. Do not parse —
            use `source`.
          title: Id
          type: string
        source:
          $ref: '#/components/schemas/ChargingSessionSource'
        started_at:
          format: date-time
          title: Started At
          type: string
        ended_at:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Ended At
        is_active:
          title: Is Active
          type: boolean
        electric_vehicle_id:
          anyOf:
            - format: uuid
              type: string
            - type: 'null'
          title: Electric Vehicle Id
        wallbox_id:
          anyOf:
            - format: uuid
              type: string
            - type: 'null'
          title: Wallbox Id
        ocpp_transaction_id:
          anyOf:
            - type: integer
            - type: 'null'
          title: Ocpp Transaction Id
        outcome:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Raw union of the two families' outcome vocabularies, served without
            remapping. One of: aborted, already_at_target, autonomous_charge,
            boosted, charged_from_solar, commands_failed, ev_not_found,
            hems_only_mode, immediate_start, in_progress,
            insufficient_price_coverage, no_battery_capacity, no_surplus,
            not_at_home, not_authenticated, oem_not_capable, oem_reported_full,
            optimized, other, smart_optimization_disabled, spot_no_charge,
            spot_optimized, steering_blocked, steering_ineffective,
            steering_not_effective, target_not_reachable, unknown,
            user_unplugged_early, vehicle_offboarded.
          title: Outcome
        final_hems_state:
          anyOf:
            - type: string
            - type: 'null'
          title: Final Hems State
        hems_activated:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Hems Activated
        is_at_home:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Is At Home
        desired_steering:
          anyOf:
            - type: string
            - type: 'null'
          title: Desired Steering
        optimization_skip_reason:
          anyOf:
            - type: string
            - type: 'null'
          title: Optimization Skip Reason
        energy_delivered_kwh:
          anyOf:
            - type: number
            - type: 'null'
          title: Energy Delivered Kwh
        energy_from_solar_kwh:
          anyOf:
            - type: number
            - type: 'null'
          title: Energy From Solar Kwh
        energy_from_grid_kwh:
          anyOf:
            - type: number
            - type: 'null'
          title: Energy From Grid Kwh
        avg_charge_power_kw:
          anyOf:
            - type: number
            - type: 'null'
          title: Avg Charge Power Kw
        peak_charge_power_kw:
          anyOf:
            - type: number
            - type: 'null'
          title: Peak Charge Power Kw
        initial_soc_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Initial Soc Pct
        final_soc_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Final Soc Pct
        target_soc_pct:
          anyOf:
            - type: number
            - type: 'null'
          title: Target Soc Pct
        soc_source:
          anyOf:
            - type: string
            - type: 'null'
          title: Soc Source
        charge_deadline:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Charge Deadline
        target_reachable:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Target Reachable
        reachable_soc_pct:
          anyOf:
            - type: integer
            - type: 'null'
          title: Reachable Soc Pct
        optimized_cost_eur:
          anyOf:
            - type: number
            - type: 'null'
          title: Optimized Cost Eur
        unoptimized_cost_eur:
          anyOf:
            - type: number
            - type: 'null'
          title: Unoptimized Cost Eur
        spot_savings_eur:
          anyOf:
            - type: number
            - type: 'null'
          title: Spot Savings Eur
        solar_savings_eur:
          anyOf:
            - type: number
            - type: 'null'
          title: Solar Savings Eur
        total_savings_eur:
          anyOf:
            - type: number
            - type: 'null'
          title: Total Savings Eur
        projected_savings_eur:
          anyOf:
            - type: number
            - type: 'null'
          title: Projected Savings Eur
        has_complete_price_coverage:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Has Complete Price Coverage
        commands_sent:
          anyOf:
            - type: integer
            - type: 'null'
          title: Commands Sent
        commands_applied:
          anyOf:
            - type: integer
            - type: 'null'
          title: Commands Applied
        commands_ineffective:
          anyOf:
            - type: integer
            - type: 'null'
          title: Commands Ineffective
        commands_rejected:
          anyOf:
            - type: integer
            - type: 'null'
          title: Commands Rejected
        steering_was_effective:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Steering Was Effective
        dominant_command_error:
          anyOf:
            - type: string
            - type: 'null'
          title: Dominant Command Error
        was_boosted:
          title: Was Boosted
          type: boolean
        boost_triggered_at:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Boost Triggered At
        boost_ended_at:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Boost Ended At
        boost_end_reason:
          anyOf:
            - type: string
            - type: 'null'
          title: Boost End Reason
        desired_charging_start_time:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Desired Charging Start Time
        desired_charging_end_time:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Desired Charging End Time
      required:
        - id
        - source
        - started_at
        - ended_at
        - is_active
        - electric_vehicle_id
        - wallbox_id
        - ocpp_transaction_id
        - final_hems_state
        - hems_activated
        - is_at_home
        - desired_steering
        - optimization_skip_reason
        - energy_delivered_kwh
        - energy_from_solar_kwh
        - energy_from_grid_kwh
        - avg_charge_power_kw
        - peak_charge_power_kw
        - initial_soc_pct
        - final_soc_pct
        - target_soc_pct
        - soc_source
        - charge_deadline
        - target_reachable
        - reachable_soc_pct
        - optimized_cost_eur
        - unoptimized_cost_eur
        - spot_savings_eur
        - solar_savings_eur
        - total_savings_eur
        - projected_savings_eur
        - has_complete_price_coverage
        - commands_sent
        - commands_applied
        - commands_ineffective
        - commands_rejected
        - steering_was_effective
        - dominant_command_error
        - was_boosted
        - boost_triggered_at
        - boost_ended_at
        - boost_end_reason
        - desired_charging_start_time
        - desired_charging_end_time
      title: ChargingSessionItem
      type: object
    DecisionItem:
      description: >-
        One steering decision point — a typed view over a
        ``SmartChargingDecision``

        row shared by both families. The domain variables live in its JSON
        context

        envelope and are surfaced flat/typed; the raw context is never passed
        through.
      properties:
        time:
          format: date-time
          title: Time
          type: string
        device_type:
          description: '"ev" or "wb" — the device that emitted the decision.'
          title: Device Type
          type: string
        device_id:
          format: uuid
          title: Device Id
          type: string
        state:
          title: State
          type: string
        decision:
          $ref: '#/components/schemas/SmartChargingDecisionKind'
        reason:
          title: Reason
          type: string
        dispatched:
          title: Dispatched
          type: boolean
        steering_command_id:
          anyOf:
            - type: integer
            - type: 'null'
          title: Steering Command Id
        export_w:
          anyOf:
            - type: number
            - type: 'null'
          title: Export W
        target_w:
          anyOf:
            - type: number
            - type: 'null'
          title: Target W
        phases:
          anyOf:
            - type: integer
            - type: 'null'
          title: Phases
        battery_w:
          anyOf:
            - type: number
            - type: 'null'
          title: Battery W
      required:
        - time
        - device_type
        - device_id
        - state
        - decision
        - reason
        - dispatched
        - steering_command_id
        - export_w
        - target_w
        - phases
        - battery_w
      title: DecisionItem
      type: object
    CommandItem:
      properties:
        id:
          title: Id
          type: integer
        time:
          format: date-time
          title: Time
          type: string
        commanded_watts:
          title: Commanded Watts
          type: number
        commanded_amps:
          title: Commanded Amps
          type: number
        commanded_phases:
          anyOf:
            - type: integer
            - type: 'null'
          title: Commanded Phases
        dispatch_status:
          title: Dispatch Status
          type: string
        outcome:
          $ref: '#/components/schemas/SteeringOutcome'
        observed_current_offered_a:
          anyOf:
            - type: number
            - type: 'null'
          title: Observed Current Offered A
        observed_power_w:
          anyOf:
            - type: number
            - type: 'null'
          title: Observed Power W
        observed_phases:
          anyOf:
            - type: integer
            - type: 'null'
          title: Observed Phases
      required:
        - id
        - time
        - commanded_watts
        - commanded_amps
        - commanded_phases
        - dispatch_status
        - outcome
        - observed_current_offered_a
        - observed_power_w
        - observed_phases
      title: CommandItem
      type: object
    HomeEnergyContext:
      description: >-
        Whole-home energy context integrated at read time from the owner's

        authenticated inverter(s) over the session window. The designed
        forward-compat

        surface: inverter/PV timeseries and charging graphs are added later as
        new

        optional fields here (additive, non-breaking). No total household-load
        figure

        is served — the underlying datapoint is solar self-consumption, not
        total load.
      properties:
        pv_production_kwh:
          title: Pv Production Kwh
          type: number
        battery_charged_kwh:
          title: Battery Charged Kwh
          type: number
        battery_discharged_kwh:
          title: Battery Discharged Kwh
          type: number
        grid_import_kwh:
          title: Grid Import Kwh
          type: number
        grid_export_kwh:
          title: Grid Export Kwh
          type: number
        inverter_ids:
          items:
            format: uuid
            type: string
          title: Inverter Ids
          type: array
      required:
        - pv_production_kwh
        - battery_charged_kwh
        - battery_discharged_kwh
        - grid_import_kwh
        - grid_export_kwh
        - inverter_ids
      title: HomeEnergyContext
      type: object
    ChargingSessionSource:
      enum:
        - ev
        - wallbox
      title: ChargingSessionSource
      type: string
    SmartChargingDecisionKind:
      description: >-
        What a Smart Charging steering loop decided at one decision point
        (SC-56).


        Smart Charging vertical only (EVs + wallboxes — not inverters/heat
        pumps,

        which are separate verticals with their own observability). One row per

        decision point makes the timeline queryable — "started because surplus
        held

        for N readings", "held through the commitment window", "re-modulated to

        track surplus", "stopped on sustained import" — without reading Temporal

        histories or Loki. Values are device-neutral within the vertical; the EV

        path adopts the same kinds when it lands (PLF-700 direction).


        START - steering began: first rate/command imposed (e.g.
        IDLE→COMMITMENT).

        STEP  - adjusted the rate/plan to track conditions.

        HOLD  - no dispatch at this decision point (gates not met / window
        ticking / no data).

        STOP  - steering ended: profile cleared / charging stopped.

        SKIP  - decision point aborted (inputs unavailable) — recorded so gaps
        are explainable.
      enum:
        - start
        - step
        - hold
        - stop
        - skip
      title: SmartChargingDecisionKind
      type: string
    SteeringOutcome:
      description: >-
        Per-command verdict for a wallbox steering command, recorded once we

        know whether the wallbox actually applied the cap — not just whether it

        replied Accepted (SC-55).


        The first four mirror the dispatch-time CommandStatus the CSMS reports.

        The verification verdicts are layered on top of an `applied` dispatch,
        by

        reading the next MeterValues Current.Offered (and, for a phase command,
        the

        per-phase currents):


        APPLIED              - dispatched Accepted AND Current.Offered converged
                               to the commanded amps within tolerance (and, when a
                               phase count was commanded and observable, the
                               energized phase count matched). Proven.
        ACCEPTED_INEFFECTIVE - dispatched Accepted but Current.Offered never
                               moved toward the command (Go-E silent no-op). The
                               failure SC-55 exists to catch.
        PHASE_SWITCH_INEFFECTIVE - dispatched Accepted, the amperage cap took
                               effect, but MORE phases were observed energized than
                               commanded (e.g. commanded a shed to 1 phase, all three
                               still carry current). A load cannot draw a phase the box
                               did not energize, and incomplete per-phase telemetry only
                               ever under-counts, so an over-count is unambiguous proof
                               the numberPhases switch did not take. The only phase
                               evidence still read as ineffective.
        PHASE_SWITCH_UNVERIFIED - dispatched Accepted and the amperage cap took
        effect,
                               but FEWER phases were observed energized than commanded.
                               Ambiguous: a single-phase-capable EV draws on one phase of
                               a correctly-switched 3-phase supply, and partial per-phase
                               telemetry under-counts — neither is a dropped switch, and
                               without per-EV phase capability the shortfall cannot be
                               attributed. Reported unverified rather than ineffective and
                               kept out of the compliance counters (benign, like the other
                               unverifiable verdicts).
        STUCK                - CSMS reports the box demonstrably stuck on
                               SuspendedEVSE for a deduped set_charge_rate: the wire
                               Accepted the profile yet the box delivers nothing.
                               Sourced from the dispatch reply, not the meter — CSMS
                               has already read the connector state — so it needs no
                               separate verification. Counted as ineffective (an
                               accept-then-no-op), kept out of the rejected bucket,
                               which is reserved for genuine wire Rejects.
        UNVERIFIABLE_IDLE    - dispatched Accepted, a sample landed, but the box
        was
                               drawing nothing (car idle / SuspendedEV): its offered
                               current sat off the command because there was no load
                               to cap, not because the command was a silent no-op.
                               The amperage analogue of masking 0 energized phases on
                               the phase leg. Benign — a command issued into an idle
                               box, not a steering failure.
        UNVERIFIABLE_NO_SAMPLE - dispatched Accepted, no Current.Offered sample
        landed
                               in the settle window, but the box was still producing
                               telemetry around it (the ~60s Go-E MeterValues cadence
                               outruns the settle window, so a sample is simply missed).
                               Benign — the cap could not be sampled this cycle, not a
                               telemetry outage.
        UNVERIFIED           - dispatched Accepted, no Current.Offered sample
        landed in
                               the settle window, AND the box produced no telemetry
                               around it — a genuine dark-box gap (wallbox went silent
                               / lost connectivity). Not counted as success; the only
                               residual verification gap worth alerting on.
        DISPATCHED_UNVERIFIED - recorded at dispatch time by a path that runs no
                               per-command meter verification (the EV-routed wallbox
                               verbs: pause / release / clear via the steering
                               service). Kept apart from UNVERIFIED so dispatch-only
                               rows never pollute the dark-box alert bucket; those
                               sessions are verified one level up, by the
                               energy-in-planned-window check at finalize.
        REJECTED             - wire response was Rejected / NotSupported.

        UNREACHABLE          - no live WS / no open transaction (transient).

        TIMEOUT              - CSMS server budget elapsed (transient).

        NOT_CAPABLE          - adapter-side: wallbox lacks current modulation.

        FLOORED_TO_PAUSE     - adapter-side (SC-131): the command's integer amps
                               resolved below the wallbox's configured OCPP
                               MinChargingCurrent, so the doomed command was never
                               put on the wire — a 0 A pause was sent instead to
                               keep the fail-open lease armed.
      enum:
        - applied
        - accepted_ineffective
        - phase_switch_ineffective
        - phase_switch_unverified
        - stuck
        - unverifiable_idle
        - unverifiable_no_sample
        - unverified
        - dispatched_unverified
        - rejected
        - unreachable
        - timeout
        - not_capable
        - floored_to_pause
      title: SteeringOutcome
      type: string
  securitySchemes:
    OAuth2:
      type: oauth2
      flows:
        password:
          tokenUrl: /api/partners/v2.0/auth/token
          scopes: {}
        clientCredentials:
          tokenUrl: /api/partners/v2.0/auth/token
          scopes: {}

````