Getting startedHow do I get an API key?
Sign in with Google on your
dashboard and create a key. Free keys start
gapi_test_, live keys start
gapi_live_. The full key is shown once and never again — we store a SHA-256 hash, not the key.
Getting startedWhat does my first request look like?
A plain HTTPS GET with the key in a header:
curl "https://api.greyhoundapi.com/v1/racecards/today?region=GB" -H "X-API-Key: $GAPI_KEY"
No OAuth, no request signing.
Getting startedIs there a free tier?
Yes, and it doesn't expire. A free key reaches 7 endpoints across every GB and AU track, over a rolling window from 24 hours to 7 days old, at 60 requests a minute and 500 a day. No card required.
Getting startedDo you have SDKs?
Keys & authI lost my API key — can you resend it?
No, and that's deliberate: we only store a SHA-256 hash, so nobody at our end can read your key either. Create a new one from your dashboard and revoke the old one.
Keys & authHow do I rotate a key without downtime?
Press Rotate on the key row. You get the new key immediately and the old one keeps working for 24 more hours, so you can deploy the replacement without a gap.
Keys & authI'm getting 401 unauthorized
The key is missing, mistyped, or revoked. Check the header is exactly X-API-Key, and that your shell variable is actually set — an unset $GAPI_KEY sends an empty header and looks identical to a bad key.
Keys & authWhat does key_suspended mean?
The key is intact but the account behind it is suspended — usually a failed payment. Settle billing on your dashboard and the key resumes without needing to be recreated.
LimitsWhat are the rate limits?
Free: 60 a minute, 500 a day. Live: 120 a minute, 250,000 a month. Live Plus: 180 a minute, 600,000 a month. Every response carries X-RateLimit-* headers so you can back off before you hit them.
LimitsI'm getting 429 rate_limited
You've exceeded the per-minute rate. The response includes
Retry-After in seconds — wait that long rather than retrying immediately. If it's constant, you're likely polling where a
WebSocket or
webhook would do.
LimitsWhat is quota_exceeded?
Different from 429 — you've used your monthly or daily allowance rather than the per-minute rate. It resets at the start of the next period. Usage per key is on your dashboard.
LimitsDo streamed events count against my quota?
No. A request is one successful API call. Events delivered over the WebSocket stream or by webhook don't consume quota.
DataHow fresh is the data?
Results typically land about 8 minutes after a race finishes. Every response carries meta.data_as_of — the last successful pipeline run — so you can tell how current the answer is rather than guessing.
DataWhy is my request returning an empty list?
Usually the date window. On a free key nothing inside the last 24 hours exists, and nothing older than 7 days. Check the region too — region=GB excludes Australian racing entirely.
DataWhat does outside_sandbox_window mean?
A free key asked for racing outside its 24-hour to 7-day window — usually today's card. Live-day data and the full archive need a live key.
DataHow do you handle timezones between GB and AU?
Every timestamp is UTC, and race times also carry a track-local value. Date filters are resolved in the track's own timezone, so "races on the 14th" means the 14th where the race ran. See
Timezones & dates.
DataHow far back does the archive go?
Over three years of GB and AU racing, with results, starting prices and sectionals where published. The free key sees a rolling 7-day window; live keys reach the whole archive.
DataDo you sell predictions or tips?
No. It's race data — results, form, times and prices. What you build on top is yours.
DeliveryWhen should I use webhooks instead of polling?
Whenever you care about results landing promptly. Polling burns quota and still lags; a webhook fires the moment a result is logged. Up to 10 endpoints, signed with HMAC-SHA256 in X-GAPI-Signature.
DeliveryHow do I verify a webhook signature?
X-GAPI-Signature equals 'sha256=' . HMAC-SHA256(raw request body, your signing secret). Hash the raw body before any JSON parsing, and compare with a timing-safe function.
DeliveryMy webhook stopped receiving events
Check the Webhooks tab on your dashboard — failed deliveries show the HTTP status your endpoint returned. We retry with backoff for 24 hours, then stop. A paused endpoint is skipped, not queued.
DeliveryHow many WebSocket connections can I open?
Two concurrent connections on a live plan. The stream carries results and race status changes; channels and replay are covered in the
WebSocket guide.
BillingHow do I cancel?
From your dashboard, any time. Access continues to the end of the period you've already paid for. Nothing is charged after that.
BillingDo you offer refunds?
Fees are non-refundable and partial periods aren't pro-rated, except where the law requires otherwise. If something has genuinely gone wrong, use the
refund review form — that's the only channel for it.
BillingWhat's the difference between Live and Live Plus?
Live reaches 35 endpoints with live-day data and the full archive. Live Plus adds the three statistics endpoints — dog, trainer and owner splits by distance, trap, track, grade and going — plus more headroom at 180 a minute and 600,000 a month.
BillingCan I switch plans mid-month?
Yes. Upgrades take effect immediately and Stripe prorates the difference. Your existing keys gain the new endpoints without being recreated.
AccountI can't sign in with Google
Open a ticket using the "I can't sign in" category — that route doesn't require an account, and we'll verify by email instead.
AccountCan I have more than one key?
Yes — up to five live keys and one free key per account. Separate keys per environment make revoking one safe.
AccountIs there a status page?
Yes —
status.greyhoundapi.com shows pipeline, stream and REST health with 30-day uptime, and
/status.json is machine-readable if you want to alert on it.
No answer for that yet
That's useful to know — the search is logged, so it goes on the list to write.
In the meantime, open a ticket and we'll answer it directly.
Open a ticket about this