API
Create, read, and manage skills programmatically.
Quick Start
Upload a skill in one command — no account required. The response gives you a shareable URL and a one-liner install command.
1. Upload
curl -X POST https://skillb.in/api/skills \ -H "Content-Type: text/markdown" \ --data-binary @SKILL.md
2. Response includes
{
"url": "https://skillb.in/s/aBc12345",
"install": "curl -fsSL https://skillb.in/install/aBc12345 | sh"
}3. Install
curl -fsSL https://skillb.in/install/aBc12345 | sh
Base URL
https://skillb.in
All endpoints below are relative to this base. Responses are JSON unless noted otherwise.
Authentication
Most read endpoints work without authentication. Creating skills linked to your account, managing tokens, and accessing private skills require a Bearer token.
Authorization: Bearer <your-token>
How to get a token:
- Sign in with GitHub on the web UI
- Your session API token is shown on the homepage when signed in
- For durable tokens: create one via
POST /api/tokens(see below)
Create a new API token
Request body (JSON):
{
"name": "my-ci-token",
"expires_in_days": 90 // optional, null = never expires
}Response (201):
{
"token": "a1b2c3d4...", // full token — only shown once
"id": "uuid",
"name": "my-ci-token",
"prefix": "a1b2c3d4",
"expires_at": "2026-08-10T00:00:00.000Z",
"created_at": "2026-05-12T00:00:00.000Z"
}List your API tokens (prefix and metadata only, not the full token)
Revoke a token
Create a Skill
Upload a new skill. Accepts JSON or raw markdown.
Option 1: JSON body
curl -X POST https://skillb.in/api/skills \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"content": "# My Skill\n\nDoes things.",
"title": "My Skill",
"slug": "my-skill",
"skill_name": "my-skill",
"visibility": "public"
}'Option 2: Raw markdown
curl -X POST https://skillb.in/api/skills \ -H "Content-Type: text/markdown" \ -H "X-Skill-Name: my-skill" \ -H "Authorization: Bearer <token>" \ --data-binary @SKILL.md
JSON fields
| Field | Required | Description |
|---|---|---|
| content | conditional | Markdown content (max 500 KB). Required if files is not provided. |
| files | conditional | Array of {path, content} objects. Alternative to content for multi-file skills. |
| title | no | Display title (max 255 chars) |
| slug | no | URL slug — requires auth |
| skill_name | no | Install directory name (alphanumeric, hyphens, underscores) |
| format | no | Skill format: claude, cursor, windsurf, copilot, codex, or cline. Defaults to claude. |
| visibility | no | public, unlisted, or private — requires auth for non-public |
Response (201)
{
"id": 42,
"nanoid": "aBc12345",
"url": "https://skillb.in/u/alice/my-skill",
"install": "curl -fsSL https://skillb.in/install/aBc12345 | sh",
"user_id": "uuid-here",
"title": "My Skill",
"skill_name": "my-skill",
"slug": "my-skill",
"format": "claude",
"visibility": "public",
"files": [{"path": "SKILL.md", "content": "# My Skill\n\nDoes things."}],
"static_safety": "safe",
"version": 1,
"latest_version": 1,
"created_at": "2026-05-12T00:00:00.000Z"
}Anonymous skills (no auth) return a /s/:nanoid URL. Authenticated skills with a slug return a /u/:username/:slug URL.
Read Skills
Get a skill by its short ID
Returns full skill metadata, files, and safety info.
{
"id": 42,
"nanoid": "aBc12345",
"user_id": null,
"slug": null,
"skill_name": "my-skill",
"format": "claude",
"visibility": "public",
"title": "My Skill",
"files": [{"path": "SKILL.md", "content": "# My Skill\n\nDoes things."}],
"static_safety": "safe",
"llm_safety": null,
"latest_version": 1,
"created_at": "2026-05-12T00:00:00.000Z",
"updated_at": "2026-05-12T00:00:00.000Z"
}Get raw markdown content (text/markdown)
curl -s https://skillb.in/api/skills/aBc12345/raw > SKILL.md
Get a skill by username and slug — includes user info and version number
Same response shape as /api/skills/:nanoid, plus version and user fields.
Raw markdown by username and slug
Get a specific version of a skill
Raw markdown for a specific version
List all versions of a skill (version number and created_at)
Update & Delete
Update a skill's content, files, title, or visibility
If content or files changes, a new version is created automatically. Metadata-only changes (title, visibility) do not create a new version.
Accepts content (string) or files (array of {path, content} objects), plus optional title and visibility.
curl -X PATCH https://skillb.in/api/skills/u/alice/my-skill \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{ "content": "# Updated\n\nNew content.", "title": "Updated Skill" }'Delete a skill and all its versions
Returns 204 No Content on success.
curl -X DELETE https://skillb.in/api/skills/u/alice/my-skill \ -H "Authorization: Bearer <token>"
User Profile
Get a user's profile and list of skills
Returns public skills for anyone, plus unlisted and private skills if you are the owner.
Formats
SkillBin supports skills for multiple agent tools. The format field determines how skills are stored and installed.
| Format | Source Location | Install Target |
|---|---|---|
| claude | .claude/skills/*/SKILL.md | ~/.claude/skills/ or .claude/skills/ |
| cursor | .cursor/rules/*.mdc | .cursor/rules/ |
| windsurf | .windsurf/rules/*.md | .windsurf/rules/ |
| copilot | .github/instructions/*.instructions.md | .github/instructions/ |
| codex | AGENTS.md | Project root |
| cline | .clinerules/*.md | .clinerules/ |
CLI Helpers
Returns a shell script to upload skills from your local skill directories
curl -fsSL https://skillb.in/upload | sh
Query params: skills=name1,name2 (preselect skills), token=<token> (authenticate). Scans for skills across Claude (.claude/skills/), Cursor (.cursor/rules/), Windsurf (.windsurf/rules/), Copilot (.github/instructions/), Codex (AGENTS.md), and Cline (.clinerules/).
Returns a shell script to install a skill locally
curl -fsSL https://skillb.in/install/aBc12345 | sh
Query params: scope=global|project (skip prompt, Claude format only), token=<token> (for private skills). Installs to the correct directory based on the skill's format — e.g., .cursor/rules/ for Cursor skills, ~/.claude/skills/ for Claude skills.
Versioning
- Account-linked skills are automatically versioned starting at 1.
- When you PATCH with new
contentorfiles, a new version is created. - Metadata-only changes (title, visibility) do not create a new version.
- Each version's content is immutable once created.
- Fetch specific versions via
/u/:username/:slug/v/:versionand/v/:version/raw. - List all versions via the
/u/:username/:slug/versionsendpoint.
Errors
Error responses return JSON with an error field and optional issues array.
| Status | Meaning |
|---|---|
| 400 | Invalid request body or parameters |
| 401 | Missing or invalid authentication |
| 403 | Not authorized to modify this resource |
| 404 | Resource not found (or private and not authorized) |
| 413 | Content exceeds 500 KB size limit |
Example error response:
{"error": "Validation error", "issues": [{"message": "Either files or content is required"}]}Rate Limits
There are currently no strict rate limits. Please be respectful — if you need to make bulk requests, add a short delay between calls. Abusive usage may result in temporary blocks.