Skip to main content
PUT
Update details of a user's electric vehicle

Authorizations

Authorization
string
header
required

The access token received from the authorization server in the OAuth 2.0 flow.

Path Parameters

org_id
string<uuid>
required

The organization ID of the user's organization

user_id
string<uuid>
required

The user ID of the user whom the electric vehicle belongs to

electric_vehicle_id
string<uuid>
required

The ID of the modified electric vehicle

Body

application/json
is_pause_power_active
boolean
default:false
is_smart_optimization_active
boolean
default:false
is_inverter_forced_mode_enabled
boolean
default:false
actual_steering_state
string
default:unknown
Maximum string length: 20
device_model
DeviceModelInput · object | null
price_zone
enum<string>
default:AT
Available options:
AT,
AT_HOURLY,
BE,
CH,
EE,
DE_LU,
HR,
HU,
IE_SEM,
IT_CNOR,
IT_CSUD,
IT_NORD,
IT_PUN,
IT_SARD,
IT_SICI,
IT_SUD,
PT,
RO,
SE_1,
SE_2,
SE_3,
SE_4,
UK
hems_mode
enum<string>
default:balanced

How an EV's HEMS start/stop thresholds are determined (SC-137).

The preset modes derive the surplus start/stop band at session start from the household PV size (kWp) and the actuation floor — see core_app.services.smart_charging.thresholds.derive_preset_thresholds. The stored raw threshold columns on ElectricVehicle are read only in CUSTOM mode (or as fallback when no usable kWp is known).

EAGER - start on a small surplus fraction of kWp; tolerate more import. BALANCED - the default middle ground. CONSERVATIVE - start only on a large surplus; stop early on import. CUSTOM - the user/operator set the raw threshold columns explicitly.

Available options:
eager,
balanced,
conservative,
custom
deleted_at
string<date-time> | null

When set, the device is considered deleted.

pause_power_until
string<date-time> | null
optimization_score
number | null
comment
string | null
Maximum string length: 300
last_monitoring_executed_at
string<date-time> | null
charge_target_min
integer | null
default:50
is_charge_policy_enabled
boolean | null
default:false
minimum_charge_limit
integer | null
default:100
charge_deadline_at
string<time> | null
default:06:00:00
is_over_charge_allowed
boolean | null
default:false
expected_max_charge_power
integer
default:3600
charge_power_measured_at
string<date-time> | null
plug_state_evidence_at
string<date-time> | null

Event time of the last accepted canonical plug-state write, from any source (Smartcar telemetry, OCPP wire). The arbitration watermark: a claim whose evidence time is not newer than this is stale and does not write. NULL = no claim yet, so anything wins.

boost_active_at
string<date-time> | null

Timestamp boost was activated by the workflow. NULL when no boost is active. Retained for the whole boost (REQUESTED before is_charging=true, ONGOING once charging); cleared only when the boost ends.

boost_stop_requested_at
string<date-time> | null

Timestamp the API signalled a boost cancel (owned by the API, not the workflow). Drives BoostState.STOPPING until the workflow ends the boost and clears boost_active_at. Cleared by the API on an un-cancel (re-tap).

boost_for_next_session
boolean
default:false

User tapped boost while unplugged. Workflow consumes on next session start (fires signal_boost on the schedule child) and auto-resets. Means 'don't optimize next session, charge ASAP'.

latitude
number | null
longitude
number | null
coordinates_last_updated_at
string<date-time> | null
geo_fence_distance_m
number
default:100
battery_at_plug_in
number | null

Battery level at latest plug-in event

steering_block_probed_at
string<date-time> | null

Last steering-block recovery probe attempt. NULL = never probed.

minimum_solar_coverage
number
default:1
hems_min_export_to_start_w
integer
default:2000
hems_max_import_before_stopping_w
integer
default:4000
hems_min_production_to_start_w
integer
default:3000
hems_min_production_before_stopping_w
integer
default:2000
token_refresh_status
string | null
Maximum string length: 16
token_refresh_last_succeeded_at
string<date-time> | null
token_refresh_degraded_since
string<date-time> | null
token_refresh_terminal_at
string<date-time> | null
token_refresh_terminal_reason
string | null
Maximum string length: 200
information_notifications
string[] | null

Response

200 - application/json

OK

connection_status
enum<string>
required
Available options:
ok,
warning,
error,
unknown
monitoring_status
enum<string>
required
Available options:
ok,
warning,
error,
unknown
steering_status
enum<string>
required
Available options:
ok,
warning,
error,
unknown
tone
required

The device's console health tone, and the only verdict a client should render: action_required when a partner-resolvable action is pending, else the worst of connection and monitoring, with not_steered for a healthy device nobody optimizes. Do not re-derive it from connection_status/monitoring_status/steering_status — those three are cue-blind and would report a device asking for reauthentication as healthy. The status filter on GET /org/{org_id}/devices and the tone counts on …/devices/summary grade the three statuses only, so a device with a pending action reads action_required here while being counted and filtered under its status tone.

Available options:
good,
warning,
critical,
not_steered
device_model
DeviceModelOutput · object | null
required
owner
OwnerOutput · object
required
created_at
string<date-time>
required
updated_at
string<date-time>
required
service_health
ServiceHealthOutput · object
required

Whether the platform is doing what it should for this vehicle, component by component, and where the problem starts when it is not. Every cell is a reading of state the evaluators already recorded, so a cell nothing has observed reads not_measured rather than a guess.

action_needed
boolean
default:false
deprecated

Deprecated — use GET /org/{org_id}/notifications/status for per-device-type counts, or GET /org/{org_id}/notifications/actions?device_id=… for the specifics. True when at least one action is pending against this device and the partner must take that action before the device can resume normal operation.

price_zone
enum<string>
default:AT
Available options:
AT,
AT_HOURLY,
BE,
CH,
EE,
DE_LU,
HR,
HU,
IE_SEM,
IT_CNOR,
IT_CSUD,
IT_NORD,
IT_PUN,
IT_SARD,
IT_SICI,
IT_SUD,
PT,
RO,
SE_1,
SE_2,
SE_3,
SE_4,
UK
is_authenticated
boolean | null
default:false
is_smart_optimization_active
boolean
default:false
is_inverter_forced_mode_enabled
boolean
default:false
actual_steering_state
string
default:unknown
Maximum string length: 20
id
string<uuid> | null
deleted_at
string<date-time> | null

When set, the device is considered deleted.

pause_power_until
string<date-time> | null
is_pause_power_active
boolean
default:false
external_device_id
string | null
default:""
Maximum string length: 255
optimization_score
number | null
current_mode
string | null
comment
string | null
Maximum string length: 300
current_state_last_updated_at
string<date-time> | null
last_monitoring_executed_at
string<date-time> | null
is_inverter_forced_mode_active
boolean
default:false
inverter_forced_mode_since
string<date-time> | null
default:0001-01-01T00:00:00Z
charge_target_min
integer | null
default:50
charge_target_max
integer | null

Detected OEM-app charge cap (percent). NULL = unknown / no cap detected.

is_charge_policy_enabled
boolean | null
default:false
charge_policy_last_updated_at
string<date-time> | null
minimum_charge_limit
integer | null
default:100
charge_deadline_at
string<time> | null
default:06:00:00
is_over_charge_allowed
boolean | null
default:false
expected_max_charge_power
integer
default:3600
charge_power_measured_at
string<date-time> | null
charge_time_remaining
integer | null
charge_rate_w
integer | null
is_fully_charged
boolean | null
default:false
is_plugged_in
boolean | null
default:false
is_charging
boolean | null
default:false
battery_level
integer | null
driving_range
integer | null
battery_capacity_kwh
default:0
charge_state_last_updated_at
string<date-time> | null
plug_state_evidence_at
string<date-time> | null

Event time of the last accepted canonical plug-state write, from any source (Smartcar telemetry, OCPP wire). The arbitration watermark: a claim whose evidence time is not newer than this is stale and does not write. NULL = no claim yet, so anything wins.

boost_stop_requested_at
string<date-time> | null

Timestamp the API signalled a boost cancel (owned by the API, not the workflow). Drives BoostState.STOPPING until the workflow ends the boost and clears boost_active_at. Cleared by the API on an un-cancel (re-tap).

boost_for_next_session
boolean
default:false
latitude
number | null
longitude
number | null
coordinates_last_updated_at
string<date-time> | null
geo_fence_distance_m
number
default:100
consumption_last_day_kwh
consumption_last_week_kwh
consumption_last_month_kwh
consumption_last_updated_at
string<date-time> | null
battery_at_plug_in
number | null

Battery level at latest plug-in event

steering_block_probed_at
string<date-time> | null

Last steering-block recovery probe attempt. NULL = never probed.

minimum_solar_coverage
number
default:1
hems_mode
string
default:balanced
Maximum string length: 16
hems_min_export_to_start_w
integer
default:2000
hems_max_import_before_stopping_w
integer
default:4000
hems_min_production_to_start_w
integer
default:3000
hems_min_production_before_stopping_w
integer
default:2000
token_refresh_status
string | null
Maximum string length: 16
token_refresh_last_succeeded_at
string<date-time> | null
token_refresh_degraded_since
string<date-time> | null
token_refresh_terminal_at
string<date-time> | null
token_refresh_terminal_reason
string | null
Maximum string length: 200
information_notifications
string[] | null
embeddable_url
string | null

URL to embeddable onboarding form

authorization_url
string | null

Base URL for authorizing with the Podero server

boost_state
enum<string>
default:unavailable

Pure boost lifecycle, shared by EVs and wallboxes (SC-154). Describes only the boost, not whether the device is charging — normal optimizer-driven charging is AVAILABLE (boostable), not ONGOING.

Available options:
available,
requested,
unavailable,
ongoing,
stopping
boost_feature_enabled
boolean
default:true