Rate Limits
Request quotas, burst limits, and how to handle 429 responses.
The UpHunt API enforces per-key rate limits to protect Upwork integrity and keep the platform responsive for everyone.
Limits by endpoint
| Endpoint | Limit | Notes |
|---|---|---|
POST /apply | 60/min, 1,000/day | One credit burned only on success. |
GET /status | 300/min | Poll freely — cheap and idempotent. |
GET /applied-jobs | 60/min | Cache results on your side where possible. |
POST /generate-proposal | 30/min, 500/day | High reasoning effort counts the same. |
GET /external/freelancers | 30/min | Cache for at least 5 minutes. |
GET /api/jobs/by-ciphertext | 60/min | Authenticated read; no credit cost. Cache results. |
GET /api/clients/:companyId/jobs | 60/min | Authenticated read; no credit cost. Cache results. |
Limits are per API key. If you run multiple environments (staging / production), generate a separate key per environment so their quotas don't share.
The old /api/v1/* Bearer ("Data API") key system and its shared 10,000/billing-period quota have been retired. The data reads now use your x-api-key and aren't separately metered against a monthly quota. The /api/v1/* and /api/v2/* paths still resolve — they forward to the unversioned /api/* endpoints.
Response headers
Every response includes three headers you can use to pace yourself:
X-RateLimit-Limit— the ceiling for the current window.X-RateLimit-Remaining— requests left in the window.X-RateLimit-Reset— Unix seconds when the window rolls over.
When you hit 0 remaining, subsequent requests return 429 with a Retry-After header (seconds).
Handling 429
Blindly retrying on 429 will keep you rate-limited. Always respect Retry-After or back off exponentially with jitter.
Requesting higher limits
Shipping high-volume agency traffic? Contact support from the Dashboard — we can raise limits on a case-by-case basis for verified accounts.