Rate Limits & Quotas
Community: 200 billable requests/day per key (Forecast, Hours, PV, Flex, Decision, Weather, โฆ). Basic without key: 60/h per IP. Professional: 600/h per account. OEM: 3000/h. Telemetry has a separate softcap and does not eat the Fair Use / hourly budget.
SpotpriceAPI limits how often you can call productive endpoints so the service stays fair for everyone.
Everyday example
Community account: 200 billable calls per day. Polling every minute would hit the limit in a few hours. Polling once per hour for Forecast + PV (~48 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 (logging vs billable)
| Class | Endpoints | Counts against Fair Use / hourly pool? |
|---|---|---|
| decision (and NULL) | Forecast, Decision, Windows, Hours (mode=decide) | Yes |
| pv | GET /v1/plant/pv-forecast | Yes (same pool) |
| weather | GET /v1/plant/weather | Yes (same pool) |
| telemetry | Plant Telemetry, Hours (mode=telemetry) | No (separate softcap) |
| duplicate | Coalesced identical double-GET | No (second call not billed; also free at Fair Use ceiling โ no 429) |
| status | /v1/status, /health | No |
| access_denied | Basic/anon Hours/Windows/PV/Weather not_available | No (no reserve) |
Limits per product tier
| Tier | Billable limit | Telemetry softcap |
|---|---|---|
basic (anonymous) | 60 / hour per IP | Not available |
community | 200 / day per key | 2000 / day |
full_active (Professional) | 600 / hour per account | 10000 / day |
full_active (OEM / enterprise) | 3000 / hour per account | 10000 / day |
| Home legacy | 120 / hour per key | โ |
Exact numbers may change โ on HTTP 429 the response body and headers show the active limit. Ops kill-switch: QUOTA_UNIFIED_BILLABLE=0 restores legacy PV/Weather softcaps (48/288). Override Community day cap: RATE_LIMIT_COMMUNITY_PER_DAY.
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/PV 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 โ separate softcap
Register for Community or code samples with your personal key.