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.