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)
POST/api/tokensrequired

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"
}
GET/api/tokensrequired

List your API tokens (prefix and metadata only, not the full token)

DELETE/api/tokens/:idrequired

Revoke a token

Create a Skill

POST/api/skillsoptional

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

FieldRequiredDescription
contentconditionalMarkdown content (max 500 KB). Required if files is not provided.
filesconditionalArray of {path, content} objects. Alternative to content for multi-file skills.
titlenoDisplay title (max 255 chars)
slugnoURL slug — requires auth
skill_namenoInstall directory name (alphanumeric, hyphens, underscores)
formatnoSkill format: claude, cursor, windsurf, copilot, codex, or cline. Defaults to claude.
visibilitynopublic, 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/api/skills/:nanoid

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/api/skills/:nanoid/raw

Get raw markdown content (text/markdown)

curl -s https://skillb.in/api/skills/aBc12345/raw > SKILL.md
GET/api/skills/u/:username/:slug

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.

GET/api/skills/u/:username/:slug/raw

Raw markdown by username and slug

GET/api/skills/u/:username/:slug/v/:version

Get a specific version of a skill

GET/api/skills/u/:username/:slug/v/:version/raw

Raw markdown for a specific version

GET/api/skills/u/:username/:slug/versions

List all versions of a skill (version number and created_at)

Update & Delete

PATCH/api/skills/u/:username/:slugrequired

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/api/skills/u/:username/:slugrequired

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/api/users/:username

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.

FormatSource LocationInstall 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/
codexAGENTS.mdProject root
cline.clinerules/*.md.clinerules/

CLI Helpers

GET/upload

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/).

GET/install/:nanoid

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 content or files, 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/:version and /v/:version/raw.
  • List all versions via the /u/:username/:slug/versions endpoint.

Errors

Error responses return JSON with an error field and optional issues array.

StatusMeaning
400Invalid request body or parameters
401Missing or invalid authentication
403Not authorized to modify this resource
404Resource not found (or private and not authorized)
413Content 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.