Rate Limits And Credits
ReformCode uses tier-aware rate limits to keep CODE, REFORM, public search, and developer automations reliable. Limits apply to browser sessions and API-key traffic.
Current Limits
| Tier | Search/hr | Analysis/hr | Transform/hr | Burst/min |
|---|---|---|---|---|
| Free | 100 | 30 | 20 | 20 |
| Pro | 300 | 90 | 60 | 60 |
| Team | 1000 | 300 | 200 | 200 |
Search is public but still rate-limited by IP or API key fingerprint. Authenticated analysis and transform requests are tier-adjusted and distributed through Redis when REDIS_URL is configured.
Response Headers
Every versioned API response includes versioning headers, and rate-limited surfaces include:
X-RateLimit-Identifier: search
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
X-RateLimit-Reset: 2026-05-18T16:00:00.000Z
Retry-After: 42
Treat Retry-After as authoritative after a 429 response.
Credit Behavior
Rate limits protect platform capacity. Credits meter AI cost.
| Operation | Typical Credits |
|---|---|
| Search | 0 |
| Code analysis stream | 1 |
| Transform snippet | 2 |
| Framework transform | 5 |
| Repo analysis | 2-5 |
| Reform Wizard session | 5-10 |
When an AI stream fails after credits are deducted, the route attempts a refund through the credit transaction system.
Automation Guidance
- Use one API key per integration, environment, or CI pipeline.
- Prefer small batches with retry/backoff over large synchronized bursts.
- Cache public search and score data when running recurring jobs.
- Keep one key for local IDE use and separate keys for production automation.
- Upgrade to Team when multiple users or bots need shared higher throughput.
Handling 429s
async function reformcodeFetch(input: RequestInfo, init?: RequestInit) {
const response = await fetch(input, init)
if (response.status === 429) {
const retryAfter = Number(response.headers.get('Retry-After') ?? '60')
throw new Error(`ReformCode rate limit hit. Retry after ${retryAfter}s.`)
}
return response
}
For long-running CI jobs, retry at most a few times and surface the rate-limit reset time in the job summary.