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.
Get an API key
Sign in at fullskill.ai/dashboard/api-keys and create a key.
Buy credits
$12/skill, $90 for 10, or $500/mo unlimited.
Make your first API call
Submit a build request and watch it run through all 44 steps.
https://fullskill.ai/api/v1All 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_.
Authorization: Bearer fs_live_your_key_hereAPI 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
/api/v1/buildsAuth requiredSubmit a skill specification and start the 44-step build pipeline. This deducts 1 credit from your account.
Request Body
descriptionproblemaudienceuse_casesquality"personal", "team", or "marketplace" (default).reference_materialsoutput_examplesResponse (201)
{
"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 -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"
}'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']}")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
/api/v1/builds/:idAuth requiredPoll this endpoint to check the status of a build. Returns phase/step progress, completion percentage, and file count.
Response (200)
{
"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 https://fullskill.ai/api/v1/builds/{build_id} \
-H "Authorization: Bearer fs_live_your_key_here"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']}%)")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
/api/v1/builds/:id/filesAuth requiredRetrieve all generated files as JSON. Available when the build status is complete or review.
Response (200)
{
"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 https://fullskill.ai/api/v1/builds/{build_id}/files \
-H "Authorization: Bearer fs_live_your_key_here"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"])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
/api/v1/builds/:id/downloadAuth requiredDownload 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 -o skill.zip https://fullskill.ai/api/v1/builds/{build_id}/download \
-H "Authorization: Bearer fs_live_your_key_here"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")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)
/api/v1/builds/:id/eventsAuth requiredSubscribe 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_startstep_progressstep_completephase_completefile_generatedbuild_completebuild_errorEvent Format
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 -N https://fullskill.ai/api/v1/builds/{build_id}/events \
-H "Authorization: Bearer fs_live_your_key_here" \
-H "Accept: text/event-stream"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', '')}")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
/api/v1/catalogPublicBrowse the public skill catalog. No authentication required. Returns a paginated list of published skills.
Query Parameters
category"writing", "development").searchlimitoffsetResponse (200)
{
"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
# 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"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']}")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
/api/v1/catalog/:slugPublicGet full details for a specific published skill, including a preview of the SKILL.md content.
Response (200)
{
"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 https://fullskill.ai/api/v1/catalog/api-doc-writerresponse = 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")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
/api/v1/catalog/:slug/installPublicDownload 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
# 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/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/")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.
| Status | Meaning | Common Causes |
|---|---|---|
400 | Bad Request | Missing required fields, invalid JSON, build not ready for download. |
401 | Unauthorized | Missing or invalid API key. Key may have been revoked. |
402 | Payment Required | No credits remaining. Purchase a plan at fullskill.ai. |
404 | Not Found | Build or skill does not exist, or does not belong to you. |
500 | Internal Error | Something went wrong on our end. Retry with exponential backoff. |
Error Response Format
{
"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.