Skip to main content
GET
/
api
/
skills
/
search
Search Skills
curl --request GET \
  --url https://api.example.com/v1/api/skills/search \
  --header 'x-api-key: <api-key>'
{
  "data": [
    {
      "skill_id": "sk-001",
      "Skill": "Docker",
      "sub_skill_id": "sub-001",
      "master_skill_id": "ms-001"
    },
    {
      "skill_id": "sk-042",
      "Skill": "Docker Compose",
      "sub_skill_id": "sub-001",
      "master_skill_id": "ms-001"
    }
  ],
  "page": 1,
  "limit": 10,
  "count": 2
}
This is probably the endpoint you’ll use most. Type a keyword, get back a list of matching skills. Simple. Results are paginated — you get up to 10 per page, and you can go up to page 5. If you need to go deeper than that, you might want to use a more specific keyword instead.

Query Parameters

keyword
string
required
What you’re searching for. Has to be at least 3 characters — single letters and two-character queries are rejected. Also can’t be entirely made up of special characters like *** or ???.
page
integer
default:"1"
Which page you want. Must be between 1 and 5. Defaults to 1 if you leave it out.

Response

data
array
The matching skills. Empty array if nothing matched — not a 404.
page
integer
The page you’re on
limit
integer
How many results per page (always 10)
count
integer
How many results came back on this page

Examples

curl "http://localhost:5000/api/skills/search?keyword=docker&page=1"
{
  "data": [
    {
      "skill_id": "sk-001",
      "Skill": "Docker",
      "sub_skill_id": "sub-001",
      "master_skill_id": "ms-001"
    },
    {
      "skill_id": "sk-042",
      "Skill": "Docker Compose",
      "sub_skill_id": "sub-001",
      "master_skill_id": "ms-001"
    }
  ],
  "page": 1,
  "limit": 10,
  "count": 2
}

A note on security

This endpoint is public, so it has a few extra protections layered on:
  1. Rate limit — 15 requests per minute per IP. That’s enough for normal use.
  2. Regex sanitization — your keyword is escaped before it hits the database query. This prevents ReDoS attacks.
  3. Scraping detection — if an IP makes more than 30 requests in a 5-minute window, it gets blocked. The threshold is in middleware/detectScraping.js if you need to tune it.