Tesla Fleet API
by @odrobnik
Use when integrating with Tesla's official Fleet API to read vehicle/energy device data or issue remote commands (e.g. start HVAC preconditioning, wake vehic...
clawhub install tesla-fleet-apiπ About This Skill
name: tesla-fleet-api description: Use when integrating with Tesla's official Fleet API to read vehicle/energy device data or issue remote commands (e.g. start HVAC preconditioning, wake vehicle, charge controls). Covers onboarding (developer app registration, regions/base URLs), OAuth token flows (third-party + partner tokens, refresh rotation), required domain/public-key hosting, and using Tesla's official vehicle-command/tesla-http-proxy for signed vehicle commands. version: 1.5.2 homepage: https://github.com/odrobnik/tesla-fleet-api-skill metadata: openclaw: emoji: "π" requires: bins: ["python3", "openssl"] env: ["TESLA_CLIENT_ID", "TESLA_CLIENT_SECRET"] optionalEnv: ["TESLA_AUDIENCE", "TESLA_REDIRECT_URI", "TESLA_DOMAIN", "TESLA_BASE_URL", "TESLA_CA_CERT", "TESLA_ACCESS_TOKEN", "TESLA_REFRESH_TOKEN", "TESLA_SCOPE"]
Tesla Fleet API
Control Tesla vehicles via the official Fleet API.
Scripts Overview
| Script | Purpose |
|--------|---------|
| command.py | Vehicle commands (climate, charging, locks, etc.) |
| vehicle_data.py | Read vehicle data (battery, climate, location, etc.) |
| vehicles.py | List vehicles + refresh cache |
| auth.py | Authentication and configuration |
| tesla_oauth_local.py | OAuth helper with local callback server |
| start_proxy.sh | Start the signing proxy (for vehicle commands) |
| stop_proxy.sh | Stop the signing proxy |
Setup / Configuration
Setup is documented in SETUP.md:
State directory: {workspace}/tesla-fleet-api/
config.json (provider creds + non-token config)auth.json (tokens)vehicles.json (cached vehicle list)places.json (named locations)proxy/ (TLS material for signing proxy)No .env file loading β credentials in config.json or environment variables.
command.py - Vehicle Commands
Execute commands on your Tesla. Vehicle is auto-selected if you only have one.
Usage
command.py [VEHICLE] [options]
VEHICLE - Vehicle name or VIN (optional if single vehicle)command.py honkcommand.py flash honk (vehicle "flash", command "honk")Climate Control
#### Start/Stop Climate
command.py climate start
command.py climate stop
command.py flash climate start # specific vehicle
#### Set Temperature
command.py climate temps [passenger_temp]
command.py climate temps 21 # both seats 21Β°C
command.py climate temps 22 20 # driver 22Β°C, passenger 20Β°C
#### Climate Keeper Mode
command.py climate keeper
Modes: off, keep, dog, campSeat Heater
command.py seat-heater --level [--position ]
command.py seat-heater -l [-p ]
Levels: | Value | Name | |-------|------| | 0 | off | | 1 | low | | 2 | medium | | 3 | high |
Positions:
| Value | Names |
|-------|-------|
| 0 | driver, front_left, fl |
| 1 | passenger, front_right, fr |
| 2 | rear_left, rl |
| 3 | rear_left_back |
| 4 | rear_center, rc |
| 5 | rear_right, rr |
| 6 | rear_right_back |
| 7 | third_left |
| 8 | third_right |
Examples:
command.py seat-heater -l high # driver (default)
command.py seat-heater -l medium -p passenger
command.py seat-heater --level low --position rear_left
command.py seat-heater -l 2 -p 4 # medium, rear center
command.py seat-heater -l off -p driver # turn off
Seat Cooler (Ventilation)
command.py seat-cooler --level [--position ]
command.py seat-cooler -l [-p ]
Same levels and positions as seat heater.
Examples:
command.py seat-cooler -l medium -p driver
command.py seat-cooler -l high -p passenger
Seat Auto Climate
command.py seat-climate [--position ]
command.py seat-climate [-p ]
Modes: auto, on, off
Examples:
command.py seat-climate auto # driver auto
command.py seat-climate -p passenger auto
command.py seat-climate -p driver off # disable auto
Steering Wheel Heater
command.py steering-heater
Examples:
command.py steering-heater on
command.py steering-heater off
Precondition Schedules
Modern API for scheduling departure preconditioning (replaces deprecated set_scheduled_departure).
#### Add Schedule
command.py precondition add --time [--days ] [--id ] [--one-time] [--disabled]
command.py precondition add -t [-d ] [--id ]
Days options:
| Value | Description |
|-------|-------------|
| all | Every day (default) |
| weekdays | Monday through Friday |
| weekends | Saturday and Sunday |
| mon,tue,wed,... | Specific days (comma-separated) |
Day names: sun, mon, tue, wed, thu, fri, sat (or full names)
Examples:
command.py precondition add -t 08:00 # every day at 8am
command.py precondition add -t 08:00 -d weekdays # Mon-Fri
command.py precondition add -t 07:30 -d mon,wed,fri
command.py precondition add -t 09:00 --one-time # one-time only
command.py precondition add -t 08:30 --id 123 # modify existing schedule
command.py precondition add -t 08:00 --disabled # create but disabled
#### Remove Schedule
command.py precondition remove --id
Examples:
command.py precondition remove --id 123
command.py precondition remove --id 1
Charging Control
#### Start/Stop Charging
command.py charge start
command.py charge stop
#### Set Charge Limit
command.py charge limit
Percent must be 50-100.
Examples:
command.py charge limit 80
command.py charge limit 90
command.py flash charge limit 70 # specific vehicle
Doors & Security
command.py lock # lock all doors
command.py unlock # unlock all doors
command.py honk # honk the horn
command.py flash # flash the lights
command.py wake # wake vehicle from sleep
With vehicle name:
command.py flash wake # wake vehicle named "flash"
command.py flash flash # flash lights on vehicle "flash"
vehicle_data.py - Read Vehicle Data
Fetch vehicle data with human-readable output by default.
Usage
vehicle_data.py [VEHICLE] [flags] [--json]
VEHICLE - Vehicle name or VIN (optional if single vehicle)--json = raw JSON outputFlags
| Flag | Long | Data |
|------|------|------|
| -c | --charge | Battery level, charge limit, charging status |
| -t | --climate | Interior/exterior temp, HVAC status |
| -d | --drive | Gear, speed, power, heading |
| -l | --location | GPS coordinates |
| -s | --state | Locks, doors, windows, odometer, software |
| -g | --gui | GUI settings (units, 24h time) |
| | --config-data | Vehicle config (model, color, wheels) |
Examples
# All data
vehicle_data.py
vehicle_data.py flashSpecific data
vehicle_data.py -c # charge only
vehicle_data.py -c -t # charge + climate
vehicle_data.py flash -c -l # charge + locationRaw JSON
vehicle_data.py --json
vehicle_data.py -c --json
Sample Output
π My Tesla (online)
VIN: 5YJ... (redacted)β‘ Charge State
ββββββββββββββββββββββββββββββββββββββββ
Battery: [ββββββββββββββββββββ] 78%
Limit: 80%
State: Charging
Power: 11 kW (16A Γ 234V Γ 3Ο)
Added: 37.2 kWh
Remaining: 10m
Range: 438 km (272 mi)
Cable: IEC
π‘οΈ Climate State
ββββββββββββββββββββββββββββββββββββββββ
Inside: 11.9Β°C
Outside: 6.0Β°C
Set to: 20.5Β°C
Climate: Off
auth.py - Authentication
Manage OAuth tokens and configuration.
Usage
auth.py [options]
Commands
#### Login (OAuth Flow)
auth.py login
Interactive: generates auth URL, prompts for code, exchanges for tokens.#### Exchange Code
auth.py exchange
Exchange authorization code for tokens (non-interactive).#### Refresh Tokens
auth.py refresh
Refresh access token. Note: refresh tokens rotate - the new one is saved automatically.#### Register Domain
auth.py register --domain
Register your app domain with Tesla (required for signed commands).After registration, enroll your virtual key:
https://tesla.com/_ak/
#### Show Config
auth.py config
Display current configuration (secrets redacted).#### Set Config
auth.py config set [options]
Options:
--client-id --client-secret --redirect-uri --audience --base-url --ca-cert --domain Examples:
# Initial setup
auth.py config set \
--client-id "abc123" \
--client-secret "secret" \
--redirect-uri "http://localhost:18080/callback"Configure proxy
auth.py config set \
--base-url "https://localhost:4443" \
--ca-cert "/path/to/tls-cert.pem"
tesla_fleet.py - List Vehicles
List vehicles with human-readable output.
python3 scripts/tesla_fleet.py vehicles
python3 scripts/tesla_fleet.py vehicles --json
Sample Output
π Name: My Tesla
π VIN: 5YJ... (redacted)
π’ Status: Online
π€ Access: Owner
Configuration / Proxy / File layout
All setup + configuration is documented in SETUP.md.
Regional Base URLs
| Region | Audience URL |
|--------|--------------|
| Europe | https://fleet-api.prd.eu.vn.cloud.tesla.com |
| North America | https://fleet-api.prd.na.vn.cloud.tesla.com |
| China | https://fleet-api.prd.cn.vn.cloud.tesla.cn |
OAuth token endpoint (all regions):
https://fleet-auth.prd.vn.cloud.tesla.com/oauth2/v3/token
Troubleshooting
"vehicle unavailable: vehicle is offline or asleep"
Wake the vehicle first:command.py wake
"command not signed" / "vehicle rejected"
Ensure the signing proxy is running and configured. See SETUP.md Β§ Proxy Setup.Token expired
auth.py refresh
Multiple vehicles
Specify vehicle by name or VIN:command.py flash climate start
command.py 5YJ... honk
Complete Command Reference
command.py
climate start|stop
climate temps [passenger]
climate keeper off|keep|dog|campseat-heater -l [-p ]
seat-cooler -l [-p ]
seat-climate [-p ] auto|on|off
steering-heater on|off
precondition add -t [-d ] [--id ] [--one-time]
precondition remove --id
charge start|stop
charge limit
lock
unlock
honk
flash
wake
vehicle_data.py
[VEHICLE] [-c] [-t] [-d] [-l] [-s] [-g] [--config-data] [--json]
auth.py
login
exchange
refresh
register --domain
config
config set [--client-id] [--client-secret] [--redirect-uri] [--audience] [--base-url] [--ca-cert] [--domain]
π‘ Examples
# All data
vehicle_data.py
vehicle_data.py flashSpecific data
vehicle_data.py -c # charge only
vehicle_data.py -c -t # charge + climate
vehicle_data.py flash -c -l # charge + locationRaw JSON
vehicle_data.py --json
vehicle_data.py -c --json
Sample Output
π My Tesla (online)
VIN: 5YJ... (redacted)β‘ Charge State
ββββββββββββββββββββββββββββββββββββββββ
Battery: [ββββββββββββββββββββ] 78%
Limit: 80%
State: Charging
Power: 11 kW (16A Γ 234V Γ 3Ο)
Added: 37.2 kWh
Remaining: 10m
Range: 438 km (272 mi)
Cable: IEC
π‘οΈ Climate State
ββββββββββββββββββββββββββββββββββββββββ
Inside: 11.9Β°C
Outside: 6.0Β°C
Set to: 20.5Β°C
Climate: Off
π Tips & Best Practices
"vehicle unavailable: vehicle is offline or asleep"
Wake the vehicle first:command.py wake
"command not signed" / "vehicle rejected"
Ensure the signing proxy is running and configured. See SETUP.md Β§ Proxy Setup.Token expired
auth.py refresh
Multiple vehicles
Specify vehicle by name or VIN:command.py flash climate start
command.py 5YJ... honk