Rate limits - Spacefast Docs
Rate limits
The per-credential and per-IP request budgets, the hourly publish and build limits per plan, and how to back off from a 429
Two layers of limits sit in front of the API: a general per-minute request budget, and hourly budgets on the expensive actions. After this page you can read the headers on any response and back off correctly when one trips.
The general budget
A fixed 60 second window on every /v1 request.
| Keyed by | Limit |
|---|---|
| Credential id, when the request authenticates | 600 requests per minute |
| Client IP, when it does not | 300 requests per minute |
Windows are fixed, not sliding, so the counter resets at the boundary rather than decaying. OPTIONS is exempt.
An API key also carries its own budget of 50,000 requests per rolling hour, independent of the per-minute window above.
Headers
Every rate-limited response carries three headers, whatever its status:
| Header | Value |
|---|---|
RateLimit-Limit |
The ceiling for the window that applied. |
RateLimit-Remaining |
Requests left in it. |
RateLimit-Reset |
Seconds until it resets. |
A 429 adds Retry-After, also in seconds.
When a stricter hourly limiter is the one that rejected you, these headers describe that limiter’s window rather than the per-minute one. So the number you see on a publish 429 is the publish window, and waiting that long is the right move.
Hourly limits on publishes, builds, and Spaces
These are abuse protection, not plan features. Each has two buckets, one for a single credential (the actor) and one for the whole account.
| Action | Bucket | free |
Go (personal or go) |
Plus (work or plus) |
enterprise |
|---|---|---|---|---|---|
| Publish | per credential | 120 | 600 | 1,800 | 6,000 |
| Publish | per account | 240 | 1,200 | 6,000 | 20,000 |
| Build | per credential | 20 | 100 | 500 | 2,000 |
| Build | per account | 60 | 300 | 2,000 | 10,000 |
| Space creation | per credential | 20 | 60 | 200 | 600 |
| Space creation | per account | 40 | 150 | 600 | 3,000 |
Go and Plus use either their old or new API plan code during the plan change. All windows are one hour. Space creation is metered separately from publishing because a Space is a site provision, and the general 600 per minute budget would allow 36,000 of them an hour.
A plan change takes effect for these limits within about five seconds.
Anonymous publishing
A credential-free POST /v1/publish pays its own budgets instead.
| Bucket | Limit |
|---|---|
| Per IP | 20 publishes per hour |
| Per network and user-agent fingerprint | 60 publishes per hour |
| Per unclaimed Space | 20 publishes per hour |
| Builds for one unclaimed Space | 20 per hour |
The first three fail with anonymous_publish_rate_limited.
What a 429 looks like
{
"type": "https://spacefast.com/docs/errors/rate_limited",
"title": "Rate limited",
"status": 429,
"detail": "Too many requests. Try again later.",
"code": "rate_limited",
"details": { "limit": 600, "resetSeconds": 24 },
"requestId": "01J8ZQ7WYX3M4N5P6R7S8T9V0W"
}
Publish, build, and Space-creation rejections use the same rate_limited code with a detail naming the action, for example “Too many publishes from this account. Try again later.” Anonymous publish rejections use anonymous_publish_rate_limited.
Backing off
Read Retry-After
It is the real remaining window in seconds. Sleep that long. Do not guess an interval and do not retry immediately.
Add jitter
When several workers share a credential they all get the same Retry-After, so they will all wake at the same instant. Spread the wake-up across a second or two.
Stay under the budget by watching RateLimit-Remaining
Slow down before you hit zero rather than absorbing 429s. On a bulk job, a small pause when RateLimit-Remaining drops below a tenth of RateLimit-Limit keeps the job moving.
Retry only what is safe
GET, HEAD, and OPTIONS are always safe to repeat. A POST is safe to repeat when it carries an Idempotency-Key. See Idempotency.
The TypeScript SDK implements this loop already. Opt in per call with { retry: { maxAttempts: 3 } } and it honours Retry-After, backs off exponentially with jitter, and retries only idempotent requests.
Last updated on September 23, 2026.