generated: '2026-08-12' method: derived source: openapi/ev-energy-api-v2-openapi.yaml note: Entity graph derived from OpenAPI components.schemas $ref links. Resource-ID prefixes read from the published Resource IDs reference (https://developers.ev.energy/docs/resource_ids.md) and from ULID examples embedded in the spec. docs: https://developers.ev.energy/docs/resource_ids.md identifier_scheme: format: 4-character collection prefix + 26-character ULID example: vhcl01HQR99ZREJD9285NV25PVCKVG spec: https://github.com/ulid/spec referencing: Resources reference one another by full absolute URL, not by bare ID. id_prefixes: - prefix: bmet entity: BoundaryMeter - prefix: bmma entity: BoundaryMeterMake - prefix: bmmo entity: BoundaryMeterModel - prefix: cabf entity: CarbonFeed - prefix: cses entity: ChargingSession - prefix: csub entity: ChargingSubSession - prefix: ctcl entity: CTClamp - prefix: devt entity: DispatchEvent - prefix: emak entity: EVSEMake - prefix: emod entity: EVSEModel - prefix: evse entity: EVSE - prefix: evsf entity: EVSEFirmwareVersion - prefix: grfd entity: GridFeed - prefix: hoba entity: HomeBattery - prefix: pagv entity: PageValue - prefix: prog entity: Program - prefix: savr entity: SavedRoute - prefix: scpl entity: SchedulePlan - prefix: solf entity: SolarForecast - prefix: solr entity: SolarArray - prefix: supl entity: Supplier - prefix: tari entity: Tariff - prefix: tick entity: SupportTicket - prefix: tier entity: Tier - prefix: trim entity: VehicleTrim - prefix: tzon entity: TimeZone - prefix: user entity: User - prefix: vhcl entity: Vehicle - prefix: vmak entity: VehicleMake - prefix: vmod entity: VehicleModel entity_count: 149 relationship_count: 111 core_entities: - User - Vehicle - EVSE - ChargingSession - ChargingSubSession - Tariff - SolarArray - HomeBattery - BoundaryMeter - CTClamp - HEMSystem - Program - SupportTicket - Subscription - DispatchEvent - Location relationships: - from: User to: Location via: default_location kind: has_one - from: User to: LocationDetail via: default_location kind: has_one - from: SavedRoute to: RoutePoint via: origin kind: has_one - from: SavedRoute to: RoutePoint via: destination kind: has_one - from: SavedRoute to: RoutePoint via: waypoints kind: has_many - from: SavedRouteCreate to: RoutePoint via: origin kind: has_one - from: SavedRouteCreate to: RoutePoint via: destination kind: has_one - from: SavedRouteCreate to: RoutePoint via: waypoints kind: has_many - from: SavedRoutePatch to: RoutePoint via: origin kind: has_one - from: SavedRoutePatch to: RoutePoint via: destination kind: has_one - from: SavedRoutePatch to: RoutePoint via: waypoints kind: has_many - from: EVSE to: EVSEModel via: model kind: has_one - from: EVSE to: User via: user kind: has_one - from: EVSE to: EVSEStatusLog via: latest_status_log kind: has_one - from: EVSE to: CTClamp via: ct_clamp kind: has_one - from: CTClamp to: EVSE via: evse kind: has_one - from: CTClampLog to: CTClamp via: ct_clamp kind: has_one - from: EVSEModel to: EVSEMake via: make kind: has_one - from: Vehicle to: VehicleTrim via: trim kind: has_one - from: Vehicle to: User via: user kind: has_one - from: Vehicle to: VehicleStatusLog via: latest_status_log kind: has_one - from: VehicleTrim to: VehicleModel via: model kind: has_one - from: VehicleModel to: VehicleMake via: make kind: has_one - from: ProgramVehicleCompatibility to: VehicleModel via: model kind: has_one - from: ChargingSession to: Vehicle via: vehicle kind: has_one - from: ChargingSession to: EVSE via: evse kind: has_one - from: ChargingSession to: ChargingSubSession via: sub_sessions kind: has_one - from: ChargingSubSessionCreatedWebhook to: ChargingSubSession via: data kind: has_one - from: ChargingSubSessionEndedWebhook to: ChargingSubSession via: data kind: has_one - from: ChargingSubSession to: Vehicle via: vehicle kind: has_one - from: ChargingSubSession to: EVSE via: evse kind: has_one - from: ChargingSubSession to: LatLong via: location kind: has_one - from: ChargingSubSession to: EnergyUsage via: energy_usage kind: has_one - from: ChargingSubSession to: Schedules via: schedules kind: has_one - from: ChargingSubSession to: ChargingSubSessionAssessment via: assessment kind: has_one - from: ChargingSubSession to: ChargingSubSessionFlags via: flags kind: has_one - from: ChargingSubSession to: ChargingSubSessionDebugMetadata via: debug_metadata kind: has_one - from: ChargingSubSession to: Tariff via: tariff kind: has_one - from: ChargingSubSession to: CarbonFeed via: carbon_feed kind: has_one - from: ChargingSubSession to: GridFeed via: grid_feeds kind: has_one - from: DispatcherLog to: ChargingSubSession via: charging_sub_session kind: has_one - from: TariffBase to: Supplier via: supplier kind: has_one - from: TariffBase to: DailyPrices via: daily_prices kind: has_one - from: PriceSummary to: Times via: times kind: has_many - from: DailyPrices to: PriceSummary via: peak kind: has_one - from: DailyPrices to: PriceSummary via: mid_peak kind: has_one - from: DailyPrices to: PriceSummary via: off_peak kind: has_one - from: VehicleStatusLog to: Vehicle via: vehicle kind: has_one - from: VehicleAPIErrorLog to: Vehicle via: vehicle kind: has_one - from: VehicleLocationLog to: Vehicle via: vehicle kind: has_one - from: VehicleCommandLog to: Vehicle via: vehicle kind: has_one - from: EVSECommandLog to: EVSE via: evse kind: has_one - from: EVSEAPIErrorLog to: EVSE via: evse kind: has_one - from: EVSEOCPPLog to: EVSE via: evse kind: has_one - from: EVSEOCPPLog to: EVSEOCPPCallResponse via: response kind: has_one - from: RebateType to: RebateEvidenceType via: required_evidence kind: has_many - from: UserRebate to: RebateType via: rebate_type kind: has_one - from: RebateEvidenceType to: RebateEvidenceSupportingData via: evidence_data kind: has_many - from: RebateEvidenceFile to: RebateEvidenceType via: rebate_evidence_type kind: has_one - from: EVSEStatusLog to: EVSE via: evse kind: has_one - from: InverterStatusLog to: Inverter via: inverter kind: has_one - from: InverterModel to: InverterMake via: make kind: has_one - from: HomeBatteryModel to: HomeBatteryMake via: make kind: has_one - from: Inverter to: InverterModel via: model kind: has_one - from: Inverter to: InverterStatusLog via: latest_status_log kind: has_one - from: HomeBattery to: HomeBatteryModel via: model kind: has_one - from: HomeBattery to: HomeBatteryStatusLog via: latest_status_log kind: has_one - from: HomeBatteryStatusLog to: HomeBattery via: home_battery kind: has_one - from: HEMSystemEnergyStatsResponse to: HEMSystemEnergyStatsBucket via: buckets kind: has_many - from: BoundaryMeterModel to: BoundaryMeterMake via: make kind: has_one - from: BoundaryMeter to: BoundaryMeterModel via: model kind: has_one - from: BoundaryMeter to: BoundaryMeterStatusLog via: latest_status_log kind: has_one - from: BoundaryMeterStatusLog to: BoundaryMeter via: boundary_meter kind: has_one - from: SolarArray to: Inverter via: inverter kind: has_one - from: SolarArray to: User via: user kind: has_one - from: SolarForecastLog to: SolarForecast via: solar_forecast kind: has_one - from: Subscription to: SubscriptionOffering via: offering kind: has_one - from: Subscription to: User via: user kind: has_one - from: SupportTicket to: User via: user kind: has_one - from: SupportTicket to: SupportTicketCategoryEnum via: human_verified_category kind: has_one - from: SupportTicket to: SupportTicketSubcategoryEnum via: human_verified_subcategory kind: has_one - from: SupportTicket to: SupportTicketCategoryEnum via: ai_generated_category kind: has_one - from: SupportTicket to: SupportTicketSubcategoryEnum via: ai_generated_subcategory kind: has_one - from: SupportTicket to: SupportTicketMessage via: messages kind: has_one - from: SupportTicketMessage to: SupportTicketMessageTypeEnum via: message_type kind: has_one - from: Location to: CountryCode via: country_code kind: has_one - from: Location to: LatLong via: coordinates kind: has_one - from: Location to: Tariff via: tariff kind: has_one - from: Location to: EVSESite via: evse_site kind: has_one - from: RegionCreate to: GeoJsonMultiPolygon via: geometries kind: has_many - from: RegionCreate to: GeoJsonPolygon via: geometries kind: has_many - from: RegionGroupEntry to: GeoJsonMultiPolygon via: geometries kind: has_many - from: RegionGroupEntry to: GeoJsonPolygon via: geometries kind: has_many - from: RegionGroupCreate to: RegionGroupEntry via: regions kind: has_many - from: RegionGroupValidationResult to: RegionValidationResult via: regions kind: has_many - from: UsageInterval to: EnergyDeliveredByPrice via: energy_delivered_by_price kind: has_one - from: EnergyUsage to: UsageInterval via: intervals kind: has_many - from: ChargingSubSessionFlags to: ChargingSubSession via: charging_sub_session kind: has_one - from: ChargingSubSessionFlags to: ChargingSessionFlag via: flags kind: has_many - from: ChargingSubSessionDebugMetadata to: ChargingSubSession via: charging_sub_session kind: has_one - from: Schedules to: ChargingSubSession via: charging_sub_session kind: has_one - from: Schedules to: ScheduleInterval via: schedules kind: has_many - from: SchedulePlans to: ChargingSubSession via: charging_sub_session kind: has_one - from: SchedulePlans to: SchedulePlan via: schedule_plans kind: has_many - from: SchedulePlan to: Price via: price_data kind: has_one - from: ChargingSubSessionAssessment to: ChargingSubSession via: charging_sub_session kind: has_one - from: ChargingSubSessionAssessment to: ChargingSubSessionAssessmentMetrics via: metrics kind: has_one - from: ChargingSubSessionAssessment to: ChargingSubSessionAssessmentRatings via: ratings kind: has_one - from: EVSEConnectivity to: EVSEStatusLog via: latest_status_log kind: has_one - from: CarbonIntensities to: CarbonIntensity via: carbon_intensities kind: has_many - from: RFC9457ProblemDetail to: Notification via: notification kind: has_one