Base URL
Authentication
Most of the API is wide open — no tokens, no sign-in. The only exception is the admin routes.| Route | Auth? |
|---|---|
GET /api/skills/* | No |
GET /api/selected-skills/* | No |
POST /api/selected-skills | No |
DELETE /api/selected-skills/* | No |
GET /api/admin/* | Yes — API key required |
Admin API key
Pass your key in thex-api-key header:
ADMIN_API_KEY environment variable. Don’t hardcode it anywhere, don’t log it, and definitely don’t commit it.
Rate limiting
There are three layers of rate limiting in place:| What’s limited | Cap | Window |
|---|---|---|
| Every route (global) | 100 requests / IP | 15 minutes |
GET /api/skills/search | 15 requests / IP | 1 minute |
Scraping detection on /api/skills/* | 30 requests / IP | 5 minutes rolling |
429:
Errors
The API returns standard HTTP status codes. Here’s what each one means in context:| Code | What happened |
|---|---|
400 | Something in your request didn’t pass validation — missing field, keyword too short, page out of range |
403 | You hit an admin route without a valid API key |
404 | The resource you’re referencing doesn’t exist |
409 | You tried to add a skill a user already has |
429 | You’ve been rate limited or flagged for scraping |
500 | Something unexpected broke on the server — check the logs |
error instead of message:

