Rate Limits & Quotas
Community: 120 decision-class requests/day per key. Basic without key: 60/h per IP. Professional: 600/h per account. Telemetry, PV, and Weather have separate softcaps โ they do not eat Decision quota.
SpotpriceAPI limits how often you can call price/decision endpoints so the service stays fair for everyone.
Everyday example
Community account: 120 forecast/decision calls per day. Polling every minute would hit the limit in two hours. Polling once per hour (24 calls) is fine. Better: use Webhooks and skip most polls.
When to use this page
- Getting HTTP 429
rate_limit_exceeded - Planning poll frequency for Loxone or an EMS
- Deciding if Professional tier is needed
Quota classes
| Class | Endpoints | Counts against daily/hourly limit? |
|---|---|---|
| decision | Forecast, Decision, Windows, Hours (mode=decide) | Yes |
| telemetry | Plant Telemetry, Hours (mode=telemetry) | No (separate softcap) |
| pv | GET /v1/plant/pv-forecast | No โ Community 48/day, else 288/day |
| weather | GET /v1/plant/weather | No โ Community 48/day, else 288/day |
| status | /v1/status, /health | No |
Limits per tier
| Tier | Decision limit | Telemetry softcap |
|---|---|---|
basic | 60 / hour per IP | Not available |
community | 120 / day per key | 2000 / day |
full_active (Professional) | 600 / hour per account | 10000 / day |
full_active (OEM / enterprise) | 3000 / hour per account | 10000 / day |
Exact numbers may change โ on HTTP 429 the response body and headers show the active limit.
Response headers
X-RateLimit-* headers are emitted on successful /v1/* responses and on HTTP 429:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Your limit for this call type |
X-RateLimit-Remaining | Calls left in the window (0 on 429) |
X-RateLimit-Reset | Unix epoch when the window resets |
X-RateLimit-Scope | ip / api_key / api_key_day / account |
Retry-After | Seconds to wait (429 only) |
curl -i https://api.spotpriceapi.com/v1/forecast \
-H "X-API-Key: sf_live_YOUR_KEY"
On 429, wait for Retry-After before retrying.
Step by step: use quota wisely
1. Poll Forecast/Decision hourly, not every minute โ data updates about hourly anyway. 2. Register Webhooks for push on changes. 3. Send telemetry on SOC steps (e.g. every 10 %), not every second. 4. Call Hours Demand decide when the plan should change (day-ahead published, big SOC swing) โ not on every telemetry ping. 5. On 429, wait for Retry-After before retrying.
Common mistakes
- Loxone fetch every 10 seconds โ will hit Community daily cap
- Using decision calls for telemetry โ use
POST /v1/plant/telemetryormode: telemetry - Ignoring 429 /
Retry-Afteruntil the client is stuck
EMS integration tips
- Telemetry: every 15 min or on 10 % SOC change
- Decide: hourly at :00 (Loxone I8; :05 fallback) or after day-ahead (~13:00 Vienna)
- Webhooks: best for servers; Loxone uses Virtual Output polling instead
Next steps
- Webhooks โ reduce polling
- Authentication โ upgrade tier
- Errors โ 429 handling
- Plant Telemetry โ free quota class
Register for Community or code samples with your personal key.