API Documentation

192 curated skills, 16 categories, 8 AI tools. Full JSON API with filtering, search, and format conversion. No signup required.

🔍
🔎No sections match your search.
Try a different keyword.

Quick Start

Get the full skills catalog with a single request. No API key, no signup, no rate limit worries.

curl https://skills.findutils.com/api/skills

# Filter by tool
curl https://skills.findutils.com/api/skills?tool=cursor

# Search
curl https://skills.findutils.com/api/skills?q=react

# Get a single skill
curl https://skills.findutils.com/api/skills/react-typescript-best-practices

From JavaScript — CORS is enabled for all origins:

const res = await fetch('https://skills.findutils.com/api/skills?tool=claude-code&quality=featured');
const { data, meta } = await res.json();
console.log(`${meta.total} skills found`);
data.forEach(s => console.log(s.title, s.category));

Browse the catalog at skills.findutils.com or use the API endpoints below.

Base URL

All API endpoints are served from a single base URL on Cloudflare's edge network.

https://skills.findutils.com
Response format: All endpoints return JSON with a consistent envelope: { "success": boolean, "data": ..., "meta"?: ... }
Cache: HTML pages are cached for 5 minutes. API responses are cached for 5 minutes. SEO files (robots.txt, sitemap.xml, llms.txt) are cached for 1 hour.

Rate Limits

The API uses per-IP rate limiting via Cloudflare's CF-Connecting-IP header.

ParameterTypeDescription
General120 req/minAll GET requests (pages + API)
Submissions5 req/hourPOST /api/submit only

When rate limited, the API returns HTTP 429 with a Retry-After: 60 header.

Every response includes an X-RateLimit-Remaining header so you can track your quota.

CORS Policy

API routes (/api/*) allow requests from any origin — they serve public, read-only data.

HTML pages restrict CORS to:

  • https://findutils.com
  • https://skills.findutils.com
  • http://localhost:* (development)

Preflight OPTIONS requests return 204 with appropriate headers.

Error Handling

All errors follow a consistent JSON structure:

{
  "success": false,
  "error": "Skill not found."
}
ParameterTypeDescription
200SuccessRequest completed successfully
400Bad RequestInvalid parameters or missing required fields
404Not FoundSkill or resource does not exist
405Method Not AllowedOnly GET and POST are supported
429Rate LimitedToo many requests — retry after 60 seconds
500Server ErrorInternal error — generic message returned

List Skills

GET /api/skills

Returns a paginated list of all skills. Supports filtering by tool, category, quality tier, and full-text search.

Query Parameters

ParameterTypeDescription
toolstringFilter by AI tool: claude-code, cursor, copilot, windsurf, cline, aider, codex, gemini-cli
categorystringFilter by category: web-development, backend, mobile, devops, ...
qstringFull-text search (matches title, description, tags, category)
qualitystringFilter by tier: featured, recommended, community
limitnumberMax results per page (default: 100, max: 200)
offsetnumberSkip N results for pagination

Response

{
  "success": true,
  "data": [
    {
      "slug": "react-typescript-best-practices",
      "title": "React + TypeScript Best Practices",
      "description": "Modern React 19 patterns with TypeScript strict mode, Server...",
      "content": "You are an expert in...",
      "tools": ["claude-code","cursor","copilot"],
      "category": "web-development",
      "tags": ["react","typescript","react-19","server-components"],
      "quality": "featured",
      "author": "FindUtils",
      "updatedAt": "2026-04-05"
    }
  ],
  "meta": {
    "total": 192,
    "limit": 100,
    "offset": 0
  }
}

Response Fields

FieldTypeDescription
slugstringURL-safe unique identifier
titlestringHuman-readable skill name
descriptionstringOne-line summary
contentstringFull skill rules and instructions (the actual prompt)
toolsstring[]Compatible AI tools
categorystringCategory slug
tagsstring[]Search/discovery tags
qualitystringQuality tier: featured, recommended, or community
authorstringSkill author attribution
sourceUrlstring?Optional link to the original source
updatedAtstringISO date of last update
lastVerifiedobject?Verification data (featured skills): { date, against }
qualityScoreobject?Five-dimension quality score (featured skills)

Example: Combine Filters

# Featured React skills for Claude Code, page 2
GET /api/skills?tool=claude-code&category=web-development&quality=featured&limit=10&offset=10

Get Single Skill

GET /api/skills/:slug

Returns a single skill by its unique slug. Returns 404 if the slug doesn't exist.

GET /api/skills/react-typescript-best-practices

// Response:
{
  "success": true,
  "data": {
    "slug": "react-typescript-best-practices",
    "title": "React + TypeScript Best Practices",
    "content": "You are an expert in...",
    ...
  }
}

List Categories

GET /api/categories

Returns all 16 categories with their skill counts.

{
  "success": true,
  "data": [
    { "slug": "web-development", "label": "Web Development", "icon": "🌐", "description": "React, Next.js, Vue, Svelte, Astro, Tail...", "skillCount": 30 },
    { "slug": "backend", "label": "Backend", "icon": "⚙️", "description": "Node.js, Python, Go, Rust, Ruby, PHP, Ja...", "skillCount": 20 },
    { "slug": "mobile", "label": "Mobile", "icon": "📱", "description": "React Native, Flutter, Swift, Kotlin, an...", "skillCount": 10 }
    ...
  ]
}

List Supported Tools

GET /api/tools

Returns all 8 supported AI tools with compatibility counts.

{
  "success": true,
  "data": [
    { "slug": "claude-code", "label": "Claude Code", "filename": "CLAUDE.md", "filepath": "CLAUDE.md (project root)", "docsUrl": "...", "color": "#d97706", "skillCount": 192 },
    { "slug": "cursor", "label": "Cursor", "filename": ".mdc", "filepath": ".cursor/rules/{name}.mdc", "docsUrl": "...", "color": "#3b82f6", "skillCount": 192 },
    { "slug": "copilot", "label": "GitHub Copilot", "filename": "copilot-instructions.md", "filepath": ".github/copilot-instructions.md", "docsUrl": "...", "color": "#22c55e", "skillCount": 192 }
    ...
  ]
}

Collections

Collections are curated bundles of related skills. Currently available via HTML pages only:

# Browse all collections
GET /collections

# View a specific collection
GET /collections/full-stack-react

There are currently 10 collections including Full Stack React, Python Data Stack, AI Engineer, DevOps Engineer, Security Hardened, and more.

API endpoint coming soon: GET /api/collections will return collections as JSON with skill slugs and metadata.

Compose Stack

GET /api/compose?stack=slug1,slug2,...&tool=claude-code

Merges multiple skills into a single combined output. Detects conflicts between skills automatically.

Query Parameters

ParameterTypeDescription
stackstringComma-separated skill slugs (required)
toolstringOutput format tool (default: claude-code)

Response

{
  "success": true,
  "data": {
    "skills": [
      { "slug": "react-typescript-best-practices", "title": "React + TypeScript Best Practices" },
      { "slug": "nextjs-app-router", "title": "Next.js 15 App Router Patterns" }
    ],
    "content": "# Stack: React + TypeScript Best Practices + ...\n\n## React + TypeScript...\n\n...",
    "conflicts": [],
    "shareUrl": "https://skills.findutils.com/compose?stack=react-typescript-best-practices,nextjs-app-router"
  }
}

Interactive UI: skills.findutils.com/compose

Marketplace JSON

GET /marketplace.json

Returns the full skills marketplace catalog in a format suitable for plugin registries and CLI tools.

{
  "name": "findutils-skills",
  "description": "Curated AI coding skills directory...",
  "version": "1.0.0",
  "homepage": "https://skills.findutils.com",
  "skills": [
    {
      "id": "react-typescript-best-practices",
      "name": "React + TypeScript Best Practices",
      "version": "1.0.0",
      "category": "web-development",
      "tags": ["react", "typescript"],
      "quality": "featured",
      "tools": ["claude-code", "cursor", ...],
      "install": "https://skills.findutils.com/api/skills/react-typescript-best-practices"
    }
  ],
  "categories": [...],
  "totalSkills": 192
}

Cached for 1 hour. Includes only featured and recommended skills.

Format URLs

Each skill page supports pre-selecting a format via URL path:

/skills/{slug}/{tool}

# Examples:
/skills/react-typescript-best-practices/claude-code
/skills/react-typescript-best-practices/cursor
/skills/react-typescript-best-practices/copilot
/skills/react-typescript-best-practices/windsurf
/skills/react-typescript-best-practices/cline
/skills/react-typescript-best-practices/aider
/skills/react-typescript-best-practices/codex
/skills/react-typescript-best-practices/gemini-cli

The page renders with the selected tool's format tab active and its converted output pre-rendered.

Format Table

Each tool has a specific output filename and filepath convention:

ToolOutput FileLocationDocs
Claude CodeCLAUDE.mdCLAUDE.md (project root)Docs ↗
Cursor.mdc.cursor/rules/{name}.mdcDocs ↗
GitHub Copilotcopilot-instructions.md.github/copilot-instructions.mdDocs ↗
Windsurf.windsurfrules.windsurf/rules/ or .windsurfrulesDocs ↗
Cline.clinerules.clinerules (project root)Docs ↗
Aider.aider.conf.yml.aider.conf.yml or CONVENTIONS.mdDocs ↗
Codex / OpenAIAGENTS.mdAGENTS.md (project root)Docs ↗
Gemini CLIGEMINI.mdGEMINI.md or .gemini/Docs ↗

Conversion Logic

Format conversion transforms the raw skill content into tool-specific output:

  • Claude Code: # Title\n\ncontent (Markdown heading + content)
  • Cursor: YAML frontmatter (description, globs, alwaysApply) + content in .mdc format
  • Copilot: # Title\n\ncontent in .github/copilot-instructions.md
  • Windsurf / Cline: Raw content only (no wrapper)
  • Aider: # Title\n\ncontent as CONVENTIONS.md + .aider.conf.yml reference
  • Codex: # Title\n\ncontent as AGENTS.md
  • Gemini CLI: # Title\n\ncontent as GEMINI.md

The conversion happens both server-side (for initial page render) and client-side (for tab switching).

Submit a Skill

POST /api/submit
Content-Type: application/json

{
  "title": "My Custom Skill",
  "description": "One-line description of what this skill does",
  "content": "You are an expert in...\n\nKey Principles:\n- Rule one\n- Rule two",
  "category": "web-development",
  "tools": ["claude-code", "cursor"],
  "tags": ["react", "typescript"],
  "author": "Your Name",
  "sourceUrl": "https://github.com/..."
}

Required Fields

ParameterTypeDescription
titlestringSkill name (max 100 chars)
descriptionstringOne-line summary (max 300 chars)
contentstringFull skill rules and instructions (min 50 chars, max 10,000 chars)
categorystringOne of the 16 category slugs
toolsstring[]At least 1 compatible tool (max 8)

Optional Fields

ParameterTypeDescription
tagsstring[]Discovery tags (max 10)
authorstringAttribution name (max 50 chars, default: "Anonymous")
sourceUrlstringLink to original source (must start with http)

Response

{
  "success": true,
  "message": "Skill submitted for review."
}

Submission Rules

  • Rate limited to 5 submissions per IP per hour
  • All submissions are reviewed before publishing — not auto-published
  • A honeypot field (website) is checked — if present, the request is rejected as spam
  • HTML and JavaScript in content is sanitized (script/iframe/object/embed tags stripped)
  • Content must be at least 50 characters

JavaScript

// Fetch all featured React skills
const res = await fetch('https://skills.findutils.com/api/skills?tool=claude-code&quality=featured&category=web-development');
const { data } = await res.json();

// Display each skill
for (const skill of data) {
  console.log(`${skill.title} (${skill.quality})`);
  console.log(`  Tags: ${skill.tags.join(', ')}`);
  console.log(`  Tools: ${skill.tools.join(', ')}`);
  console.log();
}

// Compose a stack
const stack = 'react-typescript-best-practices,nextjs-app-router,tailwind-css-patterns';
const compose = await fetch(`https://skills.findutils.com/api/compose?stack=${stack}&tool=cursor`);
const { data: composed } = await compose.json();
console.log(composed.content);

Python

import requests

# List all skills for a tool
resp = requests.get("https://skills.findutils.com/api/skills", params={
    "tool": "claude-code",
    "quality": "featured",
    "limit": 20,
})
skills = resp.json()["data"]

for skill in skills:
    print(f"{skill['title']} - {skill['category']}")

# Get a single skill
skill = requests.get("https://skills.findutils.com/api/skills/react-typescript-best-practices").json()["data"]
print(skill["content"][:200])

Go

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
)

type SkillsResponse struct {
    Success bool `json:"success"`
    Data    []struct {
        Slug     string   `json:"slug"`
        Title    string   `json:"title"`
        Category string   `json:"category"`
        Tools    []string `json:"tools"`
    } `json:"data"`
}

func main() {
    resp, _ := http.Get("https://skills.findutils.com/api/skills?tool=cursor&quality=featured")
    defer resp.Body.Close()

    var result SkillsResponse
    json.NewDecoder(resp.Body).Decode(&result)

    for _, s := range result.Data {
        fmt.Printf("%s (%s)\n", s.Title, s.Category)
    }
}

Bash / cURL

# List all skills
curl -s https://skills.findutils.com/api/skills | jq '.data | length'

# Search for React skills
curl -s 'https://skills.findutils.com/api/skills?q=react&quality=featured' | jq '.data[].title'

# Get a skill and save to file
curl -s https://skills.findutils.com/api/skills/react-typescript-best-practices \
  | jq -r '.data.content' > CLAUDE.md

# Compose a stack and download
curl -s 'https://skills.findutils.com/api/compose?stack=react-typescript-best-practices,tailwind-css-patterns&tool=cursor' \
  | jq -r '.data.content' > .cursor/rules/combined-stack.mdc

PHP

<?php
// List featured skills
$response = file_get_contents('https://skills.findutils.com/api/skills?quality=featured&limit=10');
$result = json_decode($response, true);

foreach ($result['data'] as $skill) {
    echo $skill['title'] . ' (' . $skill['category'] . ')' . PHP_EOL;
}

// Get a single skill content
$skill = json_decode(
    file_get_contents('https://skills.findutils.com/api/skills/react-typescript-best-practices'),
    true
);
file_put_contents('CLAUDE.md', '# ' . $skill['data']['title'] . "\n\n" . $skill['data']['content']);
?>

llms.txt

AI-readable overview of the skills directory at:

GET /llms.txt

Contains: overview, category list, featured skills, API endpoints, and page links. Designed for LLMs and AI agents to understand the directory structure.

Sitemap

GET /sitemap.xml

Dynamic XML sitemap with all pages: homepage, categories, collections, individual skills, and static pages. Updated on every deploy.

Robots.txt

GET /robots.txt

Allows all crawlers including AI bots (GPTBot, ClaudeBot, PerplexityBot, Google-Extended). Links to the sitemap.

OpenAPI Spec (Coming)

An OpenAPI 3.1 specification is planned for a future release. It will document all API endpoints with request/response schemas, enabling automatic client generation.

In the meantime: Use the /llms.txt endpoint for a machine-readable overview, or the /marketplace.json for structured data.