Limits and errors
Request rate limits, the monthly AI usage allowance and every error the GymUp MCP server returns.
Request rate limit
| Account | Limit |
|---|---|
| With a subscription | 120 requests per minute |
| Without a subscription | 30 requests per minute |
Every authenticated HTTP request counts, initialize and tools/list included; a 401 does not. The window is a fixed minute that starts at your first request. Past the limit, the server answers HTTP 429 with Retry-After: 60 and the body {"error":"Rate limit exceeded"}. The real wait is the rest of the current minute, so 60 seconds is the longest you need to wait.
AI usage allowance
Each subscription includes a monthly AI usage allowance, shared by the in-app coach and the MCP server. It is a spending cap, not a number of calls. The app shows the share used in Account, then Settings, then Monthly usage. It resets at the start of each billing period.
Two MCP tools depend on it:
propose_exercisesranks its options with a model and draws on the allowance. Once it is spent, the tool still answers: the options come from the coach's own ranking, withprobability: null.generate_smart_programcalls no model and costs nothing, but it stops once the allowance is spent and answersrateLimiteduntil the reset.
Errors
| Response | Meaning | What to do |
|---|---|---|
HTTP 401, JSON-RPC error -32000 | No valid access token | Reconnect the server; see Authentication. |
HTTP 429, {"error":"Rate limit exceeded"} | Request rate limit reached | Wait for the next minute. |
{ success: false, requiresSubscription: true, message } | The account has no active subscription | Subscribe in the app, or sign in with the account that has one. |
{ success: false, rateLimited: true, message } | generate_smart_program after the monthly allowance is spent | The message gives the reset date. |
{ success: false, error_code, message } | The tool refused the call: unknown id, invalid date, an exercise not on that day, a later change in the way | Read error_code and suggested_tool. A refused call writes nothing. |
Tool result with isError: true | Unexpected server error | Retry; if it persists, contact support. |
Tool-level responses arrive as a normal tool result whose text is the JSON object above.