3.8 KiB
3.8 KiB
Home Assistant REST API Reference
Authentication
All requests require the Authorization header:
Authorization: Bearer <long-lived-access-token>
Base Endpoints
| Endpoint | Method | Description |
|---|---|---|
/api/ |
GET | API status and HA version |
/api/config |
GET | Current configuration |
/api/states |
GET | All entity states |
/api/states/<entity_id> |
GET | Single entity state |
/api/states/<entity_id> |
POST | Set entity state |
/api/services |
GET | Available services |
/api/services/<domain>/<service> |
POST | Call a service |
/api/events |
GET | Available events |
/api/events/<event_type> |
POST | Fire an event |
/api/history/period/<timestamp> |
GET | State history |
/api/logbook/<timestamp> |
GET | Logbook entries |
Common Services
Lights
# Turn on with options
POST /api/services/light/turn_on
{
"entity_id": "light.living_room",
"brightness": 255, # 0-255
"color_temp": 370, # Mireds (153-500 typically)
"rgb_color": [255, 0, 0], # RGB array
"transition": 2 # Seconds
}
# Turn off
POST /api/services/light/turn_off
{"entity_id": "light.living_room"}
Climate
# Set temperature
POST /api/services/climate/set_temperature
{
"entity_id": "climate.thermostat",
"temperature": 22,
"hvac_mode": "heat" # heat, cool, auto, off
}
# Set preset
POST /api/services/climate/set_preset_mode
{
"entity_id": "climate.thermostat",
"preset_mode": "away"
}
Media Player
# Play/pause
POST /api/services/media_player/media_play_pause
{"entity_id": "media_player.tv"}
# Set volume (0.0-1.0)
POST /api/services/media_player/volume_set
{"entity_id": "media_player.tv", "volume_level": 0.5}
# Play media
POST /api/services/media_player/play_media
{
"entity_id": "media_player.tv",
"media_content_type": "music",
"media_content_id": "spotify:playlist:xyz"
}
Cover (Blinds/Garage)
POST /api/services/cover/open_cover
{"entity_id": "cover.garage"}
POST /api/services/cover/close_cover
{"entity_id": "cover.garage"}
POST /api/services/cover/set_cover_position
{"entity_id": "cover.blinds", "position": 50} # 0=closed, 100=open
Notifications
POST /api/services/notify/mobile_app_phone
{
"message": "Motion detected!",
"title": "Security Alert",
"data": {
"image": "/local/camera_snapshot.jpg"
}
}
Entity State Object
{
"entity_id": "light.living_room",
"state": "on",
"attributes": {
"brightness": 255,
"color_temp": 370,
"friendly_name": "Living Room Light",
"supported_features": 63
},
"last_changed": "2024-01-15T10:30:00+00:00",
"last_updated": "2024-01-15T10:30:00+00:00"
}
Webhooks (Inbound to HA)
Trigger automations via webhook:
POST /api/webhook/<webhook_id>
{"custom": "data"}
Create webhook trigger in automation:
automation:
trigger:
- platform: webhook
webhook_id: my_webhook_id
allowed_methods:
- POST
WebSocket API
For real-time updates, use the WebSocket API at ws://ha-url/api/websocket.
Connection flow:
- Connect to WebSocket
- Receive
auth_required - Send
{"type": "auth", "access_token": "TOKEN"} - Receive
auth_ok - Subscribe to events:
{"id": 1, "type": "subscribe_events", "event_type": "state_changed"}
Error Responses
| Code | Meaning |
|---|---|
| 400 | Bad request (invalid JSON or missing fields) |
| 401 | Unauthorized (invalid/missing token) |
| 404 | Entity or service not found |
| 405 | Method not allowed |
Rate Limits
Home Assistant doesn't enforce strict rate limits, but avoid:
- Polling faster than every 1 second
- Bulk updates without batching
Use WebSocket for real-time state tracking instead of polling.