FullSkill API

Build production-quality AI agent skills programmatically. Submit a skill description, monitor the 44-step build pipeline, and download the finished skill -- all from your terminal or CI/CD.

Getting Started

The FullSkill API lets you build AI agent skills without a browser. Here is how to get up and running in under a minute.

1

Get an API key

Sign in at fullskill.ai/dashboard/api-keys and create a key.

2

Buy credits

$12/skill, $90 for 10, or $500/mo unlimited.

3

Make your first API call

Submit a build request and watch it run through all 44 steps.

Base URL
https://fullskill.ai/api/v1

All endpoints are prefixed with /api/v1. Responses are JSON unless otherwise noted.

Authentication

Include your API key as a Bearer token in the Authorization header. Keys are prefixed with fs_live_.

Header format
Authorization: Bearer fs_live_your_key_here

API keys are created and managed at /dashboard/api-keys. You can create multiple keys and revoke them individually. Keys cannot be used to create or revoke other keys -- that requires a browser session.

Security

Treat your API key like a password. Do not commit it to version control. Use environment variables in CI/CD pipelines.

Build a Skill

POST/api/v1/buildsAuth required

Submit a skill specification and start the 44-step build pipeline. This deducts 1 credit from your account.

Request Body

description
stringrequired
What the skill does (2-3 sentences).
problem
stringrequired
What problem it solves. What is painful about doing this without the skill?
audience
stringrequired
Who is the target audience?
use_cases
string[]required
3+ specific scenarios where the skill would be activated.
quality
string
Quality target: "personal", "team", or "marketplace" (default).
reference_materials
string[]
Optional domain references, examples, or notes.
output_examples
string[]
Optional examples of ideal output.

Response (201)

JSON
{
  "build_id": "uuid",
  "status": "building",
  "current_phase": 2,
  "current_step": 1,
  "poll_url": "/api/v1/builds/{id}",
  "events_url": "/api/v1/builds/{id}/events",
  "created_at": "2026-02-28T12:00:00.000Z"
}

Examples

curl
curl -X POST https://fullskill.ai/api/v1/builds \
  -H "Authorization: Bearer fs_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "description": "A skill that helps AI agents write production-ready API documentation following OpenAPI standards.",
    "problem": "Without this skill, API docs are inconsistent, miss edge cases, and lack proper schema definitions.",
    "audience": "Backend developers who need to document REST APIs.",
    "use_cases": [
      "When I need to document a new REST endpoint",
      "When I need to generate OpenAPI specs from code",
      "When I need to review existing API docs for completeness"
    ],
    "quality": "marketplace"
  }'
Python
import requests

response = requests.post(
    "https://fullskill.ai/api/v1/builds",
    headers={
        "Authorization": "Bearer fs_live_your_key_here",
        "Content-Type": "application/json",
    },
    json={
        "description": "A skill that helps AI agents write production-ready API documentation.",
        "problem": "API docs are inconsistent and miss edge cases.",
        "audience": "Backend developers documenting REST APIs.",
        "use_cases": [
            "When I need to document a new REST endpoint",
            "When I need to generate OpenAPI specs from code",
            "When I need to review existing API docs for completeness",
        ],
        "quality": "marketplace",
    },
)

data = response.json()
print(f"Build started: {data['build_id']}")
print(f"Poll status at: {data['poll_url']}")
TypeScript
const response = await fetch("https://fullskill.ai/api/v1/builds", {
  method: "POST",
  headers: {
    "Authorization": "Bearer fs_live_your_key_here",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    description: "A skill that helps AI agents write production-ready API documentation.",
    problem: "API docs are inconsistent and miss edge cases.",
    audience: "Backend developers documenting REST APIs.",
    use_cases: [
      "When I need to document a new REST endpoint",
      "When I need to generate OpenAPI specs from code",
      "When I need to review existing API docs for completeness",
    ],
    quality: "marketplace",
  }),
});

const data = await response.json();
console.log(`Build started: ${data.build_id}`);

Check Build Status

GET/api/v1/builds/:idAuth required

Poll this endpoint to check the status of a build. Returns phase/step progress, completion percentage, and file count.

Response (200)

JSON
{
  "build_id": "uuid",
  "status": "building",
  "current_phase": 4,
  "current_step": 2,
  "skill_name": "api-doc-writer",
  "completion_pct": 45,
  "steps": {
    "total": 24,
    "completed": 11,
    "running": 1,
    "pending": 12
  },
  "file_count": 3,
  "created_at": "2026-02-28T12:00:00.000Z",
  "updated_at": "2026-02-28T12:05:30.000Z"
}

The status field transitions through: discovery building review complete. If something goes wrong, it will be error.

Examples

curl
curl https://fullskill.ai/api/v1/builds/{build_id} \
  -H "Authorization: Bearer fs_live_your_key_here"
Python
response = requests.get(
    f"https://fullskill.ai/api/v1/builds/{build_id}",
    headers={"Authorization": "Bearer fs_live_your_key_here"},
)

build = response.json()
print(f"Status: {build['status']} ({build['completion_pct']}%)")
TypeScript
const response = await fetch(`https://fullskill.ai/api/v1/builds/${buildId}`, {
  headers: { "Authorization": "Bearer fs_live_your_key_here" },
});

const build = await response.json();
console.log(`Status: ${build.status} (${build.completion_pct}%)`);

Get Build Files

GET/api/v1/builds/:id/filesAuth required

Retrieve all generated files as JSON. Available when the build status is complete or review.

Response (200)

JSON
{
  "build_id": "uuid",
  "skill_name": "api-doc-writer",
  "files": [
    {
      "path": "SKILL.md",
      "content": "---\nname: api-doc-writer\n...",
      "line_count": 320
    },
    {
      "path": "references/openapi-patterns.md",
      "content": "# OpenAPI Patterns\n...",
      "line_count": 85
    }
  ]
}

Examples

curl
curl https://fullskill.ai/api/v1/builds/{build_id}/files \
  -H "Authorization: Bearer fs_live_your_key_here"
Python
response = requests.get(
    f"https://fullskill.ai/api/v1/builds/{build_id}/files",
    headers={"Authorization": "Bearer fs_live_your_key_here"},
)

for file in response.json()["files"]:
    print(f"{file['path']} ({file['line_count']} lines)")
    with open(file["path"], "w") as f:
        f.write(file["content"])
TypeScript
const response = await fetch(
  `https://fullskill.ai/api/v1/builds/${buildId}/files`,
  { headers: { "Authorization": "Bearer fs_live_your_key_here" } },
);

const { files } = await response.json();
for (const file of files) {
  console.log(`${file.path} (${file.line_count} lines)`);
}

Download ZIP

GET/api/v1/builds/:id/downloadAuth required

Download all generated files as a ZIP archive. Available when the build status is complete or review.

Returns a binary ZIP file with Content-Type: application/zip. The archive contains all skill files nested under the skill name directory.

Examples

curl
curl -o skill.zip https://fullskill.ai/api/v1/builds/{build_id}/download \
  -H "Authorization: Bearer fs_live_your_key_here"
Python
response = requests.get(
    f"https://fullskill.ai/api/v1/builds/{build_id}/download",
    headers={"Authorization": "Bearer fs_live_your_key_here"},
)

with open("skill.zip", "wb") as f:
    f.write(response.content)

print(f"Downloaded {len(response.content)} bytes")
TypeScript
const response = await fetch(
  `https://fullskill.ai/api/v1/builds/${buildId}/download`,
  { headers: { "Authorization": "Bearer fs_live_your_key_here" } },
);

const blob = await response.blob();
// In Node.js, write to file:
const buffer = Buffer.from(await blob.arrayBuffer());
require("fs").writeFileSync("skill.zip", buffer);

Stream Events (SSE)

GET/api/v1/builds/:id/eventsAuth required

Subscribe to real-time build progress via Server-Sent Events. The stream emits events as each step starts, progresses, and completes. The connection closes automatically when the build finishes or errors.

Event Types

step_start
event
A build step has started. Includes phase and step numbers.
step_progress
event
A step emitted progress info.
step_complete
event
A step finished successfully.
phase_complete
event
An entire phase has completed.
file_generated
event
A new file was generated.
build_complete
event
The build finished successfully. Stream closes after this event.
build_error
event
The build encountered a fatal error. Stream closes after this event.

Event Format

SSE
data: {"type":"step_start","phase":3,"step":1,"message":"Designing architecture"}

data: {"type":"step_complete","phase":3,"step":1,"message":"Architecture complete"}

data: {"type":"file_generated","phase":4,"step":2,"message":"Generated SKILL.md"}

data: {"type":"build_complete","message":"Build complete"}

Examples

curl
curl -N https://fullskill.ai/api/v1/builds/{build_id}/events \
  -H "Authorization: Bearer fs_live_your_key_here" \
  -H "Accept: text/event-stream"
Python
import sseclient
import requests

response = requests.get(
    f"https://fullskill.ai/api/v1/builds/{build_id}/events",
    headers={"Authorization": "Bearer fs_live_your_key_here"},
    stream=True,
)

client = sseclient.SSEClient(response)
for event in client.events():
    data = json.loads(event.data)
    print(f"[{data['type']}] {data.get('message', '')}")
TypeScript
const response = await fetch(
  `https://fullskill.ai/api/v1/builds/${buildId}/events`,
  { headers: { "Authorization": "Bearer fs_live_your_key_here" } },
);

const reader = response.body!.getReader();
const decoder = new TextDecoder();

while (true) {
  const { done, value } = await reader.read();
  if (done) break;

  const text = decoder.decode(value);
  for (const line of text.split("\n")) {
    if (line.startsWith("data: ")) {
      const event = JSON.parse(line.slice(6));
      console.log(`[${event.type}] ${event.message || ""}`);
    }
  }
}

Browse Catalog

GET/api/v1/catalogPublic

Browse the public skill catalog. No authentication required. Returns a paginated list of published skills.

Query Parameters

category
string
Filter by category (e.g., "writing", "development").
search
string
Full-text search across name, description, and tags.
limit
number
Results per page (default: 20, max: 100).
offset
number
Pagination offset (default: 0).

Response (200)

JSON
{
  "skills": [
    {
      "slug": "api-doc-writer",
      "name": "API Doc Writer",
      "description": "Write production-ready API documentation following OpenAPI standards.",
      "category": "development",
      "tags": ["api", "documentation", "openapi"],
      "file_count": 8,
      "line_count": 420,
      "download_count": 156,
      "price_cents": 0
    }
  ],
  "total": 42,
  "limit": 20,
  "offset": 0
}

Examples

curl
# Browse all skills
curl https://fullskill.ai/api/v1/catalog

# Filter by category
curl "https://fullskill.ai/api/v1/catalog?category=development"

# Search
curl "https://fullskill.ai/api/v1/catalog?search=api+documentation"
Python
response = requests.get(
    "https://fullskill.ai/api/v1/catalog",
    params={"category": "development", "limit": 10},
)

for skill in response.json()["skills"]:
    print(f"{skill['name']} - {skill['description']}")
TypeScript
const response = await fetch(
  "https://fullskill.ai/api/v1/catalog?category=development&limit=10",
);

const { skills } = await response.json();
skills.forEach((s: any) => console.log(`${s.name}: ${s.description}`));

Skill Details

GET/api/v1/catalog/:slugPublic

Get full details for a specific published skill, including a preview of the SKILL.md content.

Response (200)

JSON
{
  "slug": "api-doc-writer",
  "name": "API Doc Writer",
  "description": "Write production-ready API documentation following OpenAPI standards.",
  "category": "development",
  "tags": ["api", "documentation", "openapi"],
  "skill_md_preview": "---\nname: api-doc-writer\ndescription: >\n  ...",
  "file_count": 8,
  "line_count": 420,
  "download_count": 156,
  "price_cents": 0,
  "created_at": "2026-02-28T12:00:00.000Z"
}

Examples

curl
curl https://fullskill.ai/api/v1/catalog/api-doc-writer
Python
response = requests.get(
    "https://fullskill.ai/api/v1/catalog/api-doc-writer",
)

skill = response.json()
print(f"{skill['name']}: {skill['file_count']} files, {skill['line_count']} lines")
TypeScript
const response = await fetch(
  "https://fullskill.ai/api/v1/catalog/api-doc-writer",
);

const skill = await response.json();
console.log(`${skill.name}: ${skill.file_count} files`);

Install Skill

GET/api/v1/catalog/:slug/installPublic

Download a published skill as a ZIP archive for direct installation into your AI agent. Returns a binary ZIP file.

Returns Content-Type: application/zip. Only free or purchased skills can be downloaded. The download count is incremented on each successful request.

Examples

curl
# Download and extract to Claude Code skills directory
curl -o skill.zip https://fullskill.ai/api/v1/catalog/api-doc-writer/install
unzip skill.zip -d ~/.claude/skills/
Python
import zipfile
import io

response = requests.get(
    "https://fullskill.ai/api/v1/catalog/api-doc-writer/install",
)

with zipfile.ZipFile(io.BytesIO(response.content)) as z:
    z.extractall("~/.claude/skills/")
TypeScript
const response = await fetch(
  "https://fullskill.ai/api/v1/catalog/api-doc-writer/install",
);

const buffer = Buffer.from(await response.arrayBuffer());
require("fs").writeFileSync("skill.zip", buffer);
// Then: unzip skill.zip -d ~/.claude/skills/

Error Codes

All errors return a JSON body with an error field.

StatusMeaningCommon Causes
400Bad RequestMissing required fields, invalid JSON, build not ready for download.
401UnauthorizedMissing or invalid API key. Key may have been revoked.
402Payment RequiredNo credits remaining. Purchase a plan at fullskill.ai.
404Not FoundBuild or skill does not exist, or does not belong to you.
500Internal ErrorSomething went wrong on our end. Retry with exponential backoff.

Error Response Format

JSON
{
  "error": "Missing required fields: description, use_cases"
}

Rate Limiting

The API is not currently rate-limited, but we reserve the right to add rate limits in the future. Design your integrations to handle 429 Too Many Requests responses with exponential backoff.

Need help? Email support@fullskill.ai. Machine-readable spec available at /openapi.json.