Skip to content

API Reference

Base URL: https://api.siteskills.ai

All endpoints return JSON. Authenticated endpoints require either a session cookie or an API key in the Authorization: Bearer sk_live_xxx header.

Authentication

Register

POST /api/auth/register
FieldTypeRequiredDescription
emailstringYesValid email address
usernamestringYes3-50 chars, unique
passwordstringYesMin 8 chars

Rate limit: 5/min

Verify Email

POST /api/auth/verify-email
FieldTypeRequiredDescription
tokenstringYesToken from verification email

Rate limit: 10/min

Login

POST /api/auth/login
FieldTypeRequiredDescription
emailstringYesAccount email
passwordstringYesAccount password

Returns a session cookie. Rate limit: 10/min.

Logout

POST /api/auth/logout

Auth: Session required.

OAuth

GET /api/auth/github           # Redirect to GitHub OAuth
GET /api/auth/github/callback  # GitHub OAuth callback
GET /api/auth/google           # Redirect to Google OAuth
GET /api/auth/google/callback  # Google OAuth callback

Password Reset

POST /api/auth/forgot-password
FieldTypeRequired
emailstringYes

Rate limit: 3/min

POST /api/auth/reset-password
FieldTypeRequired
tokenstringYes
passwordstringYes

Rate limit: 5/min

Current User

GET /api/auth/me

Auth: Session required. Returns the authenticated user object.


Skills

GET /api/skills
ParamTypeDescription
qstringSearch query (full-text)
categorystringFilter by category
agentstringFilter by compatible agent
domainstringFilter by target domain
difficultystringeasy, medium, hard, expert
pricingstringfree, paid, freemium
sortstringpopular, newest, rating, success
pageintegerPage number (default: 1)
limitintegerResults per page (default: 20, max: 50)

Auth: None. Rate limit: 60/min.

Response:

json
{
  "skills": [
    {
      "slug": "amazon-add-to-cart",
      "display_name": "Amazon -- Add Product to Cart",
      "description": "...",
      "version": "1.2.0",
      "author": { "username": "siteskills-official", "display_name": "SiteSkills Official" },
      "categories": ["e-commerce"],
      "tags": ["amazon", "cart"],
      "difficulty": "medium",
      "pricing_model": "free",
      "download_count": 3245,
      "avg_rating": 4.7,
      "success_rate": 89.0,
      "published_at": "2026-02-10T00:00:00Z"
    }
  ],
  "total": 142,
  "page": 1,
  "pages": 8
}

Skill Detail

GET /api/skills/:slug

Auth: None. Rate limit: 60/min.

Returns full skill metadata including siteskills.json content, download stats, and scan score.

Download Skill

GET /api/skills/:slug/download

Auth: None. Rate limit: 30/min.

Returns a signed URL to download the skill zip file.

Response:

json
{
  "download_url": "https://cdn.siteskills.ai/skills/amazon-add-to-cart/1.2.0/abc123.zip?sig=...",
  "version": "1.2.0",
  "file_size_bytes": 12400,
  "sha256": "abc123..."
}

Upload Skill

POST /api/skills

Auth: Session required. Rate limit: 10/hr.

Content-Type: multipart/form-data

FieldTypeDescription
filefileZip file (max 5 MB)

The upload triggers the automated scan pipeline. Returns immediately with status pending.

Response (201):

json
{
  "skill": {
    "id": "uuid",
    "slug": "my-awesome-skill",
    "status": "pending"
  }
}

Update Skill (New Version)

PUT /api/skills/:slug

Auth: Session required (must be author). Rate limit: 10/hr.

Same multipart format as upload. The version in siteskills.json must be higher than the current version.

Delete Skill

DELETE /api/skills/:slug

Auth: Session required (author or admin).

Report Skill

POST /api/skills/:slug/report

Auth: Session required. Rate limit: 5/hr.

FieldTypeRequiredDescription
reasonstringYesReport category
descriptionstringNoDetails

List Versions

GET /api/skills/:slug/versions

Auth: None. Rate limit: 30/min.

List Reviews

GET /api/skills/:slug/reviews

Auth: None. Rate limit: 60/min.

Create Review

POST /api/skills/:slug/reviews

Auth: Session required. Rate limit: 10/hr. One review per user per skill.

FieldTypeRequiredDescription
ratingintegerYes1-5
titlestringNoMax 200 chars
bodystringNoReview text
execution_successbooleanNoDid the skill work?
agent_usedstringNoWhich agent was used

User Dashboard

All endpoints require session authentication.

MethodPathDescription
GET/api/user/dashboardDashboard overview data
PUT/api/user/profileUpdate profile
GET/api/user/skillsList my skills (all statuses)
GET/api/user/skills/:idMy skill detail + scan report
GET/api/user/notificationsList notifications
PUT/api/user/notifications/:id/readMark notification read
PUT/api/user/notifications/read-allMark all notifications read
GET/api/user/api-keysList API keys
POST/api/user/api-keysCreate API key
DELETE/api/user/api-keys/:idRevoke API key
GET/api/user/email-preferencesGet email preferences
PUT/api/user/email-preferencesUpdate email preferences

Admin

All endpoints require admin role.

MethodPathDescription
GET/api/admin/review-queuePending skills with scan scores
GET/api/admin/review/:idSkill detail + full scan report
POST/api/admin/review/:id/approveApprove skill
POST/api/admin/review/:id/rejectReject with reason
GET/api/admin/statsPlatform statistics
GET/api/admin/usersUser management list
PUT/api/admin/users/:id/banBan user
PUT/api/admin/users/:id/unbanUnban user
GET/api/admin/reportsCommunity reports queue
PUT/api/admin/reports/:idResolve report

Telemetry

Submit Execution Report

POST /api/telemetry/execution

Auth: API key required.

FieldTypeRequiredDescription
skill_slugstringYesSkill that was executed
skill_versionstringNoVersion that was executed
successbooleanYesWhether execution succeeded
steps_completedintegerNoSteps completed before stop
failure_stepintegerNoStep where failure occurred
failure_reasonstringNoWhat went wrong
failure_mode_idstringNoMatches failure mode ID from skill
execution_time_msintegerNoTotal execution time
agent_typestringNoAgent name
agent_versionstringNoAgent version
target_domainstringNoDomain the skill ran against

Health

GET /api/health

Auth: None. Returns status of database, Redis, and scanner.


Error Format

All errors follow this format:

json
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Human-readable description",
    "details": [
      { "field": "email", "message": "Invalid email format" }
    ]
  }
}

Error Codes

CodeHTTPDescription
VALIDATION_ERROR400Request validation failed
UNAUTHORIZED401No valid session or API key
EMAIL_NOT_VERIFIED401Email verification required
FORBIDDEN403Insufficient permissions
NOT_FOUND404Resource does not exist
CONFLICT409Duplicate email, username, slug, or hash
RATE_LIMITED429Too many requests
FILE_TOO_LARGE413Upload exceeds 5 MB
INVALID_FILE422Zip structure invalid
SCAN_FAILED422Scanner could not process skill
INTERNAL_ERROR500Unexpected server error

Built for the AI browser agent ecosystem