Errors
REST errors use a consistent body:
{ "error": { "code": "rate_limited", "message": "Limit is 2 request(s)/second on Hobby.", "retryAfterMs": 380 } }
| HTTP | code |
Meaning | Fix |
|---|---|---|---|
| 400 | invalid_filter |
Unknown sport, market or bad parameter. | Check the REST reference. |
| 401 | missing_key |
No key sent. | Send x-api-key. |
| 401 | invalid_key |
Unknown or revoked key. | Create a new key in the dashboard. |
| 403 | sport_not_in_plan |
Sport not included in your plan. | Choose sports in the dashboard or upgrade. |
| 403 | plan_lacks_ws |
Free plan opened a WebSocket. | Upgrade to Hobby or above. |
| 403 | plan_lacks_history |
Closing lines on Free/Hobby. | Upgrade to Builder. |
| 403 | plan_lacks_raw |
format: "raw" below Pro. |
Use normalized. |
| 404 | not_found |
Event finished or not in your filters. | |
| 429 | rate_limited |
Too many requests per second. | Wait Retry-After seconds. |
| 429 | daily_quota |
Free daily quota used. | Wait for 00:00 UTC or upgrade. |
| 429 | connection_limit |
Too many WebSocket connections. | Close one or upgrade. |
| 500 | internal |
Our fault. | Retry with backoff; contact support if it persists. |
WebSocket errors arrive as {"type":"error","code":"...","message":"..."} frames and use the same codes. Close codes are listed in the WebSocket protocol.
Service status#
GET https://pinnfeed.io/health returns the feed status, the upstream lag and counts of events and markets. It returns 503 when the upstream feed is degraded.