Overview

SkillSafe is the verified registry for AI agent skills. Unlike open registries where anyone can upload unscanned code, SkillSafe scans every skill before sharing and independently re-verifies on install. Cryptographic tree hashes ensure that what the publisher uploaded is byte-for-byte identical to what you receive.

For AI tool integration, your agent can read the machine-readable skill definition at /skill.md.

What are Skills?

Skills are reusable instruction sets that teach AI agents (like Claude Code, Cursor, Windsurf, Codex, Gemini, OpenCode, OpenClaw, Cline, Roo, Goose, Copilot, Kiro, Trae, AMP, Aider, VS Code, Antigravity, Droid, and Kilo Code) new capabilities — from code review to deployment automation. Each skill is a directory containing a SKILL.md definition file and any supporting scripts. SkillSafe provides a verified registry where you can save, share, and install skills with security scanning and cryptographic verification.

Quick Start

1. Install SkillSafe

Send this to your AI agent:

Create skillsafe skill from https://skillsafe.ai/skill.md

Your AI agent reads the skill definition and sets up SkillSafe automatically. All operations use the REST API — no CLI installation needed.

2. Scan a Skill

curl -X POST https://api.skillsafe.ai/v1/scan/github \
  -H "Content-Type: application/json" \
  -d '{"url":"https://github.com/owner/repo"}'

Scan any GitHub-hosted skill for security issues. No installation required — just curl. Analyzes Python, JavaScript, TypeScript, and Markdown files for malicious patterns, credential theft, and prompt injection.

3. Search & Browse

curl "https://api.skillsafe.ai/v1/skills/search?q=code-review&sort=popular"

Search the registry for skills. All read operations (search, info, scan) require no authentication.

4. Install

curl "https://api.skillsafe.ai/v1/skills/@skillsafe/code-review/download/1.0.0"

No registration required for public skills. Returns a file manifest — download each blob via the API. New to SkillSafe? Tell your AI agent: install @skillsafe/code-review from skillsafe.ai

Authentication

Sign-In Methods

SkillSafe supports multiple sign-in methods:

  • Google Sign-In — One-click OAuth via Google account
  • GitHub Sign-In — OAuth via GitHub account
  • Email & Password — Sign in with email verification
  • API Device FlowPOST /v1/auth/cli creates a session, user approves in browser, agent polls for API key

API Keys (CLI)

CLI and programmatic requests use a Bearer token:

Authorization: Bearer sk_your_api_key_here

API keys are hashed with SHA-256 before storage. The server never stores plaintext keys. Browser sessions use HttpOnly cookies instead of Bearer tokens.

⚠️ Never commit API keys to source control. Use environment variables instead.

🔒 Never share your API keys. Keep them secret and rotate them immediately if compromised.

Key Limits

  • All tiers: max 20 active keys per account

Manage keys at /account/keys.

Saving & Sharing

Saving a Skill

Skills are saved privately by default. No email verification or scan report required.

POST /v1/skills/@{namespace}/{name}
Content-Type: multipart/form-data

Fields:
  metadata     — JSON with version, description, category, tags, changelog, github_repo_url, file_manifest
  scan_report  — JSON scan report (optional for save)
  file_*       — individual skill files (one per form field, filename carries relative path)

Creating a Share Link

Sharing creates a link others can use to download and verify a saved version. Requires email verification and a scan report.

POST /v1/skills/@{namespace}/{name}/versions/{version}/share

Body (JSON):
  visibility   — "private" (link-only) or "public" (discoverable via search)
  expires_in   — "1d", "7d", "30d", or "never"
  allow_reshare — boolean (optional) — whether the recipient may reshare

Metadata Field Limits

  • description: max 2,000 characters
  • category: max 100 characters
  • tags: max 1,000 characters
  • changelog: max 5,000 characters

Size Limits

  • Max upload: 15 MB per version (v2 format: 10 MB total file content)
  • Free: 50 MB total account storage | Paid: 5 GB | Enterprise: 10 GB

Daily Publish Limits

Version saves are rate-limited per account on a rolling 24-hour window:

  • Free: 50 versions / 24h
  • Paid: 200 versions / 24h
  • Enterprise: 1,000 versions / 24h

Agent Limits

  • Free: 1 agent, 5 snapshots per agent, 1 MB per snapshot
  • Paid: 5 agents, 50 snapshots per agent, 10 MB per snapshot
  • Enterprise: unlimited agents & snapshots, 50 MB per snapshot

Installing a Skill

No account required to install public skills. Tell your AI agent: install @namespace/name from skillsafe.ai. Or use the API directly:

# Get file manifest
curl "https://api.skillsafe.ai/v1/skills/@ns/name/download/1.0.0"
# Download individual files
curl "https://api.skillsafe.ai/v1/blobs/sha256:abc..."

Public skills require no authentication. Private skills require a Bearer token in the Authorization header.

Verification Model

SkillSafe uses dual-side verification.

verified

Reports match. Safe to install.

divergent

Reports disagree. Review before installing.

critical

Tree hashes mismatch. Do not install.

CLI Utilities

The SkillSafe CLI is a single-file Python script (stdlib only, no pip dependencies). It is open source on GitHub — you can audit the scanner rules, verification logic, and every HTTP call it makes.

whoami — Check authentication status

skillsafe whoami

Displays your local configuration (username, namespace, masked API key, config file path) and verifies your credentials against the server. Useful for confirming you are signed in and your API key is valid.

list — List installed skills

skillsafe list

Shows all skills installed locally across all 20 supported tool directories (Claude Code, Cursor, Windsurf, Codex, Gemini, OpenCode, OpenClaw, Cline, Roo, Goose, Copilot, Kiro, Trae, AMP, Aider, VS Code, Antigravity, ClawdBot, Droid, Kilo Code). Each entry includes the skill name, version, and installation path.

yank — Mark a version unsafe

skillsafe yank @myname/my-skill --version 1.0.0

Marks a specific version as unsafe and hides it from future downloads. Yanked versions are blocked for new installs but do not affect skills already installed. Use this if you discover a security issue in a version you published. Requires authentication and must be the skill owner.

import — Import a skill from a URL

skillsafe import github.com/owner/repo
skillsafe import https://clawhub.ai/owner/skill

Import a skill from a GitHub repository or ClawHub URL into the registry as a public placeholder. Requires authentication and email verification.

lint — Validate a manifest

skillsafe lint
skillsafe lint ./my-skill

Validates a skillsafe.yaml manifest against the schema. Reports errors and warnings before you attempt to save or share.

demo — Upload a demo recording

skillsafe demo recording.json @myname/my-skill --version 1.0.0
skillsafe demo recording.json @myname/my-skill --version 1.0.0 --title "My demo"

Upload a demo JSON recording (skillsafe-demo/1 schema) for a skill version. Demos are shown on the skill page. Requires authentication.

eval — Upload eval results

skillsafe eval @myname/my-skill --version 1.0.0 --eval-json results.json
skillsafe eval @myname/my-skill --version 1.0.0 --pass-rate 92.5 --test-cases 40 --pass-count 37

Upload automated eval results for a skill version. Accepts a skill-creator eval JSON file or raw pass-rate metrics. Results appear on the skill page and power the /v1/badge/:ns/:name/eval badge.

benchmark — Upload benchmark results

skillsafe benchmark @myname/my-skill --version 1.0.0 --runs 5

Upload benchmark performance results for a skill version. Use alongside eval for comprehensive quality data.

update — Upgrade a skill or the CLI

skillsafe update @skillsafe/code-review   # upgrade one skill
skillsafe update --all                    # upgrade all installed skills
skillsafe update skillsafe                # upgrade the CLI itself
skillsafe self-update                     # alias for: update skillsafe

Upgrades an installed skill to the latest version, upgrades all skills with --all, or updates the CLI itself. Add --dry-run to preview changes without applying them. self-update is a shorthand alias for update skillsafe.

bom — Bill of Materials

skillsafe bom ./my-skill

Generate a capability inventory for a local skill directory. Lists all files, detected capabilities (network, shell, filesystem, etc.), and the overall risk surface. Useful for auditing what a skill can do before saving or sharing.

demo-from-session — Convert a session to a demo

skillsafe demo-from-session session.jsonl @myname/my-skill --version 1.0.0 --title "My demo"

Convert a Claude Code session JSONL file into a SkillSafe demo recording and upload it. Automatically extracts conversation turns into the skillsafe-demo/1 schema format.

claim — Claim a skill from another registry

skillsafe claim github.com/owner/repo

Claim ownership of a skill imported from GitHub or another registry. Verifies you control the source repository. Requires authentication and email verification.

API Reference

Base URL: https://api.skillsafe.ai. All public endpoints are listed below. Admin-only endpoints are excluded.

API endpoints reference
MethodPathAuthDescription
Account
GET/v1/accountYesOwn profile, tier, and storage stats
PATCH/v1/accountYesUpdate own profile (display name only)
POST/v1/account/verify-emailYesSend email verification link
POST/v1/account/claimNoVerify email via claim token
GET/v1/account/usageYesStorage and API usage statistics
GET/v1/account/skillsYesAll own skills (private + public)
GET/v1/account/keysYesList active API keys
POST/v1/account/keysYesGenerate a new API key
DELETE/v1/account/keys/{id}YesRevoke an API key
DELETE/v1/account/keysYesRevoke all API keys (emergency panic button)
DELETE/v1/account/dataYesPurge all skills and data (keep account)
DELETE/v1/accountYes (verified)Schedule account deletion (24 h grace period)
GET/v1/users/{username}NoPublic profile for a user (skills, bio)
Auth
POST/v1/auth/googleNoGoogle Sign-In; sets HttpOnly session cookie
POST/v1/auth/githubNoGitHub OAuth; sets HttpOnly session cookie
POST/v1/auth/logoutNoLog out and clear session cookie
POST/v1/auth/key-exchangeYesExchange Bearer token for HttpOnly session cookie
POST/v1/auth/cliNoCreate CLI auth session (device flow)
GET/v1/auth/cli/{id}NoPoll session status; returns API key when approved
POST/v1/auth/cli/{id}/approveYesApprove CLI session from browser
POST/v1/auth/email/send-codeNoSend 6-digit sign-in code to email
POST/v1/auth/email/verify-codeNoVerify code and create session
POST/v1/auth/email/loginNoSign in with email and password
POST/v1/auth/email/set-passwordYesSet or change account password
POST/v1/auth/email/register/send-codeNoSend registration verification code
POST/v1/auth/email/register/verifyNoVerify code and create account with password
POST/v1/auth/email/forgot-passwordNoSend password-reset code to email
POST/v1/auth/email/reset-passwordNoVerify reset code and set new password
Skills
POST/v1/skills/batch/versionsOptionalCheck latest versions for multiple installed skills at once
POST/v1/skills/@{ns}/{name}YesSave a new skill version (multipart: archive + metadata)
GET/v1/skills/@{ns}/{name}OptionalSkill metadata, latest version, star count
DELETE/v1/skills/@{ns}/{name}YesDelete a skill
GET/v1/skills/@{ns}/{name}/versionsOptionalList all versions (paginated)
GET/v1/skills/@{ns}/{name}/versions/{version}OptionalVersion details including tree hash and scan report
GET/v1/skills/@{ns}/{name}/download/{version}OptionalDownload skill file manifest
POST/v1/skills/@{ns}/{name}/negotiateYesDelta upload: determine which files need uploading (v2)
POST/v1/skills/@{ns}/{name}/current-versionYesPin the displayed current version
POST/v1/skills/@{ns}/{name}/versions/{version}/yankYes (verified)Yank a version (marks it unsafe, hides from downloads)
POST/v1/skills/@{ns}/{name}/starYesStar a skill
DELETE/v1/skills/@{ns}/{name}/starYesUnstar a skill
GET/v1/skills/@{ns}/{name}/relatedOptionalOther skills from the same GitHub repository
GET/v1/skills/@{ns}/{name}/childrenOptionalChild skills in a skillset (paginated)
GET/v1/skills/@{ns}/{name}/readmeOptionalCached GitHub README in markdown
GET/v1/skills/@{ns}/{name}/versions/{version}/bomOptionalBill of Materials: capability inventory for a version
GET/v1/blobs/{hash}OptionalDownload blob by SHA-256 hash (content-addressable, immutable)
GET/v1/skills/searchNoFull-text search; sort by popular/recent/verified/trending/hot/stars/installs/eval_score/relevance/updated/newest
POST/v1/skills/import-githubYes (verified)Import a GitHub repo as a public placeholder skill
POST/v1/skills/import-github/batchYes (verified)Batch import multiple sub-skills from a monorepo
POST/v1/skills/discover-githubYes (verified)Discover SKILL.md files in a GitHub repository
POST/v1/skills/import-urlYes (verified)Import a skill from any URL (GitHub or ClawHub)
Sharing
POST/v1/skills/@{ns}/{name}/versions/{version}/shareYes (verified)Create share link (requires email verification + scan report)
GET/v1/skills/@{ns}/{name}/versions/{version}/sharesYesList share links for a version
GET/v1/share/{shareId}NoShare link metadata (skill, version, expiry, access count)
GET/v1/share/{shareId}/downloadOptionalDownload via share link (increments access counter)
DELETE/v1/share/{shareId}YesRevoke a share link
Verification
POST/v1/skills/@{ns}/{name}/versions/{version}/verifyYesSubmit consumer scan report; returns verdict (verified/divergent/critical)
Organizations
POST/v1/orgsYes (verified)Create organization (requires email verification)
GET/v1/orgsYesList organizations you belong to
GET/v1/orgs/{orgId}YesOrganization details (members only)
PATCH/v1/orgs/{orgId}YesUpdate org display name (owner only)
PATCH/v1/orgs/{orgId}/nameYesRename org namespace (owner only)
DELETE/v1/orgs/{orgId}YesDelete organization (owner only)
GET/v1/orgs/{orgId}/skillsYesList org skills (members only)
GET/v1/orgs/{orgId}/membersYesList org members (paginated)
POST/v1/orgs/{orgId}/members/inviteYesInvite member by email (admin+ only)
PATCH/v1/orgs/{orgId}/members/{accountId}YesChange member role (admin+ only)
DELETE/v1/orgs/{orgId}/members/{accountId}YesRemove member (admin+ only)
GET/v1/orgs/{orgId}/invitationsYesList pending invitations (admin+ only)
DELETE/v1/orgs/{orgId}/invitations/{invId}YesRevoke invitation (admin+ only)
POST/v1/orgs/invitations/{invId}/acceptYesAccept email invitation
POST/v1/orgs/{orgId}/join-linkYesCreate or regenerate join link (admin+ only)
DELETE/v1/orgs/{orgId}/join-linkYesRevoke join link (admin+ only)
GET/v1/orgs/join/{linkId}NoOrg info for join page (name, member count)
POST/v1/orgs/join/{linkId}/acceptYesJoin organization via link
POST/v1/orgs/{orgId}/domainYesSet domain for verification (owner only)
POST/v1/orgs/{orgId}/domain/verifyYesVerify domain via DNS TXT record (owner only)
DELETE/v1/orgs/{orgId}/domainYesRemove domain (owner only)
Billing
GET/v1/billing/configYesStripe publishable key for frontend checkout
GET/v1/billing/pricesYesAvailable plan prices (paid/enterprise, monthly/yearly)
GET/v1/billing/balanceYesCustomer credit balance
POST/v1/billing/checkoutYes (verified)Create Stripe Checkout session (requires email verification)
GET/v1/billing/portalYes (verified)Stripe Customer Portal session URL
GET/v1/billing/subscriptionYes (verified)Current subscription plan, status, and renewal date
GET/v1/billing/invoicesYes (verified)Invoice history (paginated)
GET/v1/billing/payment-methodsYes (verified)List saved payment methods
POST/v1/billing/payment-methodsYes (verified)Create SetupIntent for adding a new card
DELETE/v1/billing/payment-methods/{id}Yes (verified)Detach payment method
POST/v1/billing/payment-methods/{id}/defaultYes (verified)Set default payment method
POST/v1/billing/cancelYes (verified)Cancel subscription at period end
POST/v1/billing/reactivateYes (verified)Reactivate cancelled subscription
POST/v1/billing/upgrade-clickYesTrack upgrade button click (analytics)
Backup
GET/v1/backup/connectionsYesList connected backup accounts (e.g. Dropbox)
GET/v1/backup/connect/dropboxYesStart Dropbox OAuth connection flow
GET/v1/backup/callback/dropboxNoDropbox OAuth callback (handles redirect)
PATCH/v1/backup/connections/dropboxYesUpdate backup preferences (auto-backup, frequency)
DELETE/v1/backup/connections/dropboxYesDisconnect Dropbox backup
POST/v1/backup/triggerYesTrigger a manual backup to connected provider
GET/v1/backup/jobsYesList backup jobs (paginated)
GET/v1/backup/jobs/{jobId}YesGet backup job status and details
Demos
POST/v1/skills/@{ns}/{name}/versions/{version}/demosYesUpload a demo recording for a skill version
GET/v1/skills/@{ns}/{name}/demosOptionalList demos for a skill (paginated)
GET/v1/demosOptionalBrowse all public demos (paginated, filterable)
GET/v1/demos/{demoId}OptionalDemo metadata (title, tool, model, star count)
GET/v1/demos/{demoId}/contentOptionalFull demo recording content (messages, tool calls)
PATCH/v1/demos/{demoId}YesUpdate demo title or visibility (owner only)
DELETE/v1/demos/{demoId}YesDelete a demo (owner only)
POST/v1/demos/{demoId}/starYesStar a demo
DELETE/v1/demos/{demoId}/starYesUnstar a demo
POST/v1/demos/{demoId}/viewNoTrack a demo view (increments view counter)
POST/v1/demos/{demoId}/eval-linkYesLink an eval result to a demo
DELETE/v1/demos/{demoId}/eval-link/{evalId}YesUnlink an eval result from a demo
POST/v1/skills/@{ns}/{name}/pin-demoYesPin or unpin a demo on the skill page (owner only)
Evals & Benchmarks
POST/v1/skills/@{ns}/{name}/versions/{version}/evalYesUpload eval results for a skill version
GET/v1/skills/@{ns}/{name}/evalNoList all eval results across versions (paginated)
GET/v1/skills/@{ns}/{name}/versions/{version}/evalNoEval results for a specific version
Badges
GET/v1/badge/@{ns}/{name}/verifiedNoSVG badge: verification status
GET/v1/badge/@{ns}/{name}/installsNoSVG badge: total install count
GET/v1/badge/@{ns}/{name}/scanNoSVG badge: scan report result
GET/v1/badge/@{ns}/{name}/evalNoSVG badge: latest eval pass rate
Security Scanning
POST/v1/scan/githubNoScan a public GitHub repo for security issues (returns scan ID)
GET/v1/scan/githubNoScan a GitHub repo via GET (query params: url, ref)
GET/v1/scan/{scanId}NoGet scan results by scan ID
GET/v1/scan/github/bomNoBill of Materials for a GitHub repo
GET/v1/scan/github/badgeNoSVG badge for GitHub repo scan status
POST/v1/mcp/scanNoScan an MCP server configuration for security issues
Stats & Other
GET/v1/statsNoPlatform counts: skills, publishers, scan reports
GET/v1/healthNoAPI and database health check
GET/v1/cli/versionNoLatest CLI version and download URLs
Demo Comments
GET/v1/demos/{demoId}/commentsNoList comments on a demo
POST/v1/demos/{demoId}/commentsYesPost a comment
DELETE/v1/demos/{demoId}/comments/{commentId}YesDelete own comment
POST/v1/demos/{demoId}/comments/{commentId}/voteYesToggle upvote on a comment
Agents
POST/v1/agentsYesCreate an agent identity
GET/v1/agentsYesList your agents (paginated)
GET/v1/agents/{agentId}YesAgent details and metadata
PATCH/v1/agents/{agentId}YesUpdate agent metadata
DELETE/v1/agents/{agentId}YesDelete an agent and all snapshots
POST/v1/agents/{agentId}/snapshotsYesSave a snapshot (multipart: files + metadata)
GET/v1/agents/{agentId}/snapshotsYesList snapshots (paginated)
GET/v1/agents/{agentId}/snapshots/latestYesGet the latest snapshot
GET/v1/agents/{agentId}/snapshots/tagged/{versionTag}YesGet snapshot by version tag
GET/v1/agents/{agentId}/snapshots/{snapshotId}YesGet a specific snapshot
PATCH/v1/agents/{agentId}/snapshots/{snapshotId}YesUpdate snapshot metadata (version_tag)
DELETE/v1/agents/{agentId}/snapshots/{snapshotId}YesDelete a snapshot
GET/v1/agents/{agentId}/snapshots/{snapshotId}/files/*YesGet file content from a snapshot
GET/v1/agents/{agentId}/diffYesDiff two snapshots
GET/v1/agents/{agentId}/snapshots/{snapshotId}/downloadYesDownload all snapshot files
POST/v1/agents/{agentId}/snapshots/{snapshotId}/scanYesScan a snapshot for security issues
GET/v1/agents/{agentId}/snapshots/{snapshotId}/scanYesGet scan report for a snapshot
Publishers
GET/v1/publishers/{platform}/{owner}NoPublisher profile (public)
GET/v1/publishers/{platform}/{owner}/skillsNoList publisher's skills (public)
POST/v1/publishers/claimYesClaim a publisher identity
GET/v1/account/publishersYesList your claimed publishers
Feedback
POST/v1/feedbackOptionalSubmit feedback or bug report

Response Format

All API responses use a standard JSON envelope.

Success

{
  "ok": true,
  "data": { ... },
  "meta": {
    "request_id": "req_...",
    "timestamp": "2024-01-01T00:00:00.000Z"
  }
}

Paginated responses include meta.pagination with has_more and optionally next_cursor, total_count, and total_pages.

Error

{
  "ok": false,
  "error": {
    "code": "not_found",
    "message": "Skill not found.",
    "status": 404,
    "details": {}
  },
  "meta": {
    "request_id": "req_...",
    "timestamp": "2024-01-01T00:00:00.000Z"
  }
}

Error Codes

  • unauthorized (401) — Missing or invalid API key / session
  • forbidden (403) — Insufficient permissions for the resource (also returned when email verification is required)
  • not_found (404) — Resource does not exist
  • conflict (409) — Duplicate resource (e.g., version already exists, or max API keys reached)
  • invalid_request (400) — Missing required fields, invalid format, or malformed request body
  • invalid_version (400) — Semver version string is invalid or does not meet requirements
  • validation_error (400) — Input failed schema or business-rule validation
  • rate_limited (429) — Too many requests; check Retry-After header
  • storage_limit_exceeded (413) — Account storage quota exceeded; upgrade to a paid plan
  • link_revoked (410) — Share link has been revoked by the owner
  • link_expired (410) — Share link has passed its expiry date
  • agent_limit_exceeded (403) — Maximum number of agents reached for this tier
  • snapshot_limit_exceeded (403) — Maximum number of snapshots reached for this agent
  • storage_error (500) — R2 storage operation failed; retry the request
  • service_degraded (502/503) — A dependent service (email, billing) is unavailable
  • internal_error (500) — Unexpected server error

Rate Limits

Per-IP Sliding Window Limits

All API requests are rate-limited per IP address using a sliding window. Limits vary by endpoint group:

  • Auth (/v1/auth/*): 10 req/min
  • GitHub import, discover, import-url, verify (/v1/skills/import-github, /v1/skills/import-url, /v1/skills/discover-github, */verify): 10 req/min
  • Batch import (/v1/skills/import-github/batch): 5 req/min
  • Agent create, scan, delete (POST /v1/agents, */scan, DELETE /v1/agents/*): 10 req/min
  • Agent snapshot upload (POST /v1/agents/*/snapshots): 20 req/min
  • Billing, backup (/v1/billing/*, /v1/backup/*): 30 req/min
  • Demo list (GET /v1/skills/:ns/:name/demos): 40 req/min
  • Skill save (POST /v1/skills/@{ns}/{name}): 60 req/min
  • Skill download (GET /v1/skills/.../download/*): 60 req/min
  • Search (GET /v1/skills/search): 60 req/min
  • Share, orgs, webhooks, agent read, demo detail/content/comments: 60 req/min each
  • All other endpoints (/v1/*): 120 req/min

Rate limit status is returned in response headers:

  • X-RateLimit-Limit — Maximum requests allowed in the window
  • X-RateLimit-Remaining — Requests remaining in the current window
  • X-RateLimit-Reset — Unix timestamp when the window resets
  • X-RateLimit-Window — Window identifier: "minute", "hour", or "day"

When the limit is exceeded, the API returns a 429 status with a Retry-After header indicating how many seconds to wait.

Per-Hour Limits

Some sensitive endpoints have stricter per-hour limits:

  • Google/GitHub sign-in: 5 req/hour each
  • Email send-code (/v1/auth/email/send-code, /v1/auth/email/register/send-code): 5 req/hour
  • Feedback (POST /v1/feedback): 5 req/hour

Strict Per-Minute Limits

  • Panic key revoke (DELETE /v1/account/keys): 5 req/min

Feature-Specific Limits

  • Demo upload: 20 req/min
  • Demo update (PATCH /v1/demos/:demoId): 20 req/min
  • Demo comments: 20 req/min (post/delete), 30 req/min (vote)
  • Demo view tracking: 10 req/min
  • Demo pin: 10 req/min
  • Demo eval-link: 20 req/min
  • Agent snapshot download: 30 req/min
  • Badges (GET /v1/badge/*): 60 req/min

Demos

Demos are recorded AI agent sessions uploaded to a skill's page. They show the skill in action and help users understand what to expect before installing.

Uploading a demo

skillsafe demo recording.json @myname/my-skill --version 1.0.0

The recording must conform to the skillsafe-demo/1 JSON schema. The demo is attached to the specified skill version and appears on the skill page. You can pin one demo per skill as the featured demo.

Browsing demos via API

GET /v1/demos?sort=views&limit=20
GET /v1/skills/@{ns}/{name}/demos
GET /v1/demos/{demoId}
GET /v1/demos/{demoId}/content

The /v1/demos/:demoId/content endpoint returns the full recording (messages, tool calls, model). Use /v1/demos/:demoId for lightweight metadata only.

Evals & Benchmarks

Evals let publishers attach automated quality metrics to a skill version. Results are shown on the skill page and power the eval badge.

Uploading eval results

skillsafe eval @myname/my-skill --version 1.0.0 --eval-json results.json
skillsafe eval @myname/my-skill --version 1.0.0 --pass-rate 92.5 --test-cases 40

Pass a skill-creator eval JSON file with --eval-json, or supply raw numbers (--pass-rate, --test-cases, --pass-count). Optionally specify --model to record which model was evaluated.

Viewing eval results via API

GET /v1/skills/@{ns}/{name}/eval
GET /v1/skills/@{ns}/{name}/versions/{version}/eval

Eval results include pass rate, test case counts, model name, and a regression flag if the score decreased from the previous version.

Badges

Embed live SVG badges in your README or documentation. All badge endpoints return image/svg+xml and are publicly accessible without authentication.

GET /v1/badge/@{ns}/{name}/verified   — verification status
GET /v1/badge/@{ns}/{name}/installs   — total install count
GET /v1/badge/@{ns}/{name}/scan       — scan report result
GET /v1/badge/@{ns}/{name}/eval       — latest eval pass rate

Example Markdown for a README:

![Verified](https://api.skillsafe.ai/v1/badge/@{ns}/{name}/verified)
![Installs](https://api.skillsafe.ai/v1/badge/@{ns}/{name}/installs)
![Scan](https://api.skillsafe.ai/v1/badge/@{ns}/{name}/scan)
![Eval](https://api.skillsafe.ai/v1/badge/@{ns}/{name}/eval)

Agents

Agent Identity lets you save and version your AI agent's configuration files (CLAUDE.md, .cursorrules, etc.) as immutable snapshots. Track changes over time, diff between versions, and scan snapshots for security issues.

Saving a snapshot

POST /v1/agents/:agentId/snapshots — Upload agent configuration files as a multipart form. Each snapshot gets a tree hash (SHA-256) for integrity verification. Optionally tag with a version string.

Diffing snapshots

GET /v1/agents/:agentId/diff?from={snapshotId}&to={snapshotId} — Compare two snapshots to see what files were added, removed, or modified between versions.

Scanning

POST /v1/agents/:agentId/snapshots/:snapshotId/scan — Run a security scan on a snapshot's files. Returns a scan report with findings categorized by severity.

Publishers

Publishers represent the source of imported skills — typically a GitHub user or organization. Claim your publisher identity to manage how your skills appear on SkillSafe.

Claiming a publisher

POST /v1/publishers/claim — Claim a publisher identity. For GitHub publishers, this verifies you control the GitHub account. Requires authentication.

Publisher profiles

GET /v1/publishers/:platform/:owner — Public publisher profile showing metadata, skill count, and verification status. No authentication required.

Security Model

  • Integrity verification: SHA-256 tree hashes per version
  • Tree hashes: Immutable per-version
  • Dual verification: Independent sharer + consumer scans
  • API key hashing: SHA-256 before storage

Report issues: security@skillsafe.ai