API Documentation
192 curated skills, 16 categories, 8 AI tools. Full JSON API with filtering, search, and format conversion. No signup required.
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⎘{ "success": boolean, "data": ..., "meta"?: ... }
Rate Limits
The API uses per-IP rate limiting via Cloudflare's CF-Connecting-IP header.
| Parameter | Type | Description |
|---|---|---|
General | 120 req/min | All GET requests (pages + API) |
Submissions | 5 req/hour | POST /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.comhttps://skills.findutils.comhttp://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."
}⎘| Parameter | Type | Description |
|---|---|---|
200 | Success | Request completed successfully |
400 | Bad Request | Invalid parameters or missing required fields |
404 | Not Found | Skill or resource does not exist |
405 | Method Not Allowed | Only GET and POST are supported |
429 | Rate Limited | Too many requests — retry after 60 seconds |
500 | Server Error | Internal 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
| Parameter | Type | Description |
|---|---|---|
tool | string | Filter by AI tool: claude-code, cursor, copilot, windsurf, cline, aider, codex, gemini-cli |
category | string | Filter by category: web-development, backend, mobile, devops, ... |
q | string | Full-text search (matches title, description, tags, category) |
quality | string | Filter by tier: featured, recommended, community |
limit | number | Max results per page (default: 100, max: 200) |
offset | number | Skip 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
| Field | Type | Description |
|---|---|---|
slug | string | URL-safe unique identifier |
title | string | Human-readable skill name |
description | string | One-line summary |
content | string | Full skill rules and instructions (the actual prompt) |
tools | string[] | Compatible AI tools |
category | string | Category slug |
tags | string[] | Search/discovery tags |
quality | string | Quality tier: featured, recommended, or community |
author | string | Skill author attribution |
sourceUrl | string? | Optional link to the original source |
updatedAt | string | ISO date of last update |
lastVerified | object? | Verification data (featured skills): { date, against } |
qualityScore | object? | 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...",
...
}
}⎘Search
The q parameter on /api/skills performs weighted full-text search:
- Title match: 10 points per term
- Description match: 5 points per term
- Tag match: 3 points per term
- Category match: 2 points per term
Results are sorted by relevance score (highest first). Multi-word queries match each term independently.
# Search for "react hooks"
GET /api/skills?q=react+hooks
# Combine with tool filter
GET /api/skills?q=typescript&tool=cursor⎘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.
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
| Parameter | Type | Description |
|---|---|---|
stack | string | Comma-separated skill slugs (required) |
tool | string | Output 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:
| Tool | Output File | Location | Docs |
|---|---|---|---|
| Claude Code | CLAUDE.md | CLAUDE.md (project root) | Docs ↗ |
| Cursor | .mdc | .cursor/rules/{name}.mdc | Docs ↗ |
| GitHub Copilot | copilot-instructions.md | .github/copilot-instructions.md | Docs ↗ |
| Windsurf | .windsurfrules | .windsurf/rules/ or .windsurfrules | Docs ↗ |
| Cline | .clinerules | .clinerules (project root) | Docs ↗ |
| Aider | .aider.conf.yml | .aider.conf.yml or CONVENTIONS.md | Docs ↗ |
| Codex / OpenAI | AGENTS.md | AGENTS.md (project root) | Docs ↗ |
| Gemini CLI | GEMINI.md | GEMINI.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.mdcformat - Copilot:
# Title\n\ncontentin.github/copilot-instructions.md - Windsurf / Cline: Raw content only (no wrapper)
- Aider:
# Title\n\ncontentasCONVENTIONS.md+.aider.conf.ymlreference - Codex:
# Title\n\ncontentasAGENTS.md - Gemini CLI:
# Title\n\ncontentasGEMINI.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
| Parameter | Type | Description |
|---|---|---|
title | string | Skill name (max 100 chars) |
description | string | One-line summary (max 300 chars) |
content | string | Full skill rules and instructions (min 50 chars, max 10,000 chars) |
category | string | One of the 16 category slugs |
tools | string[] | At least 1 compatible tool (max 8) |
Optional Fields
| Parameter | Type | Description |
|---|---|---|
tags | string[] | Discovery tags (max 10) |
author | string | Attribution name (max 50 chars, default: "Anonymous") |
sourceUrl | string | Link 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.
/llms.txt endpoint for a machine-readable overview, or the /marketplace.json for structured data.