Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.crewship.ai/llms.txt

Use this file to discover all available pages before exploring further.


Skills

Skills are reusable capabilities that can be assigned to agents. They may include system prompt snippets, MCP server configurations, credential requirements, and tool definitions.

List Skills

GET /api/v1/skills?workspace_id={workspaceId}
Auth: Session or CLI token + workspace membership Query Parameters: (internal/api/skills.go:99)
ParameterTypeDescription
categorystringFilter by category
sourcestringFilter by source
searchstringSearch in name, display_name, and description
vendorstringFilter by vendor
maturitystringFilter by maturity (OFFICIAL, CURATED, COMMUNITY, EXPERIMENTAL)
runtimestringFilter by runtime
installedstringSet to "1" to return only skills assigned to at least one agent in the workspace
installed_for_agent_idstringNarrow the list to skills assigned to a specific agent
Response: 200 OK
[
  {
    "id": "skill_abc",
    "name": "github-pr-review",
    "slug": "github-pr-review",
    "display_name": "GitHub PR Review",
    "description": "Review pull requests and suggest improvements",
    "version": "1.0.0",
    "author": "Crewship",
    "category": "coding",
    "source": "BUNDLED",
    "icon": "git-pull-request",
    "verification": "VERIFIED",
    "downloads": 1250,
    "rating_avg": 4.8,
    "rating_count": 45,
    "tags": "[\"github\", \"code-review\", \"pr\"]",
    "featured": true,
    "pricing_tier": "FREE",
    "tool_count": 3,
    "created_at": "2024-01-01T00:00:00Z",
    "updated_at": "2024-01-15T00:00:00Z"
  }
]

Skill Fields

FieldTypeDescription
idstringSkill ID
namestringInternal name
slugstringURL-safe identifier
display_namestringHuman-readable name
descriptionstring?Description
versionstringSemantic version
authorstring?Author name
categorystringCategory
sourcestringOrigin source
iconstring?Lucide icon name
verificationstringVerification status
downloadsintegerDownload count
rating_avgnumber?Average rating
rating_countintegerNumber of ratings
tagsstring?JSON array of tag strings
featuredbooleanWhether skill is featured
pricing_tierstringPricing tier
tool_countinteger?Number of tools provided
vendorstring?Vendor name
homepagestring?Homepage URL
spdx_licensestring?SPDX license identifier
runtimestringSkill runtime
maturitystringOFFICIAL, CURATED, COMMUNITY, or EXPERIMENTAL
scan_statusstringSecurity scan status
description_qualitystring?Description quality rating
installed_onarray?Per-agent install metadata (agent + crew info); always populated

Get Skill

GET /api/v1/skills/{skillId}?workspace_id={workspaceId}
Returns full skill details including content, credential requirements, and MCP configuration. Response: 200 OK Additional fields beyond the list response:
FieldTypeDescription
contentstring?Skill content (system prompt, SKILL.md)
credential_requirementsstring?JSON of required credentials
mcp_server_commandstring?MCP server command
mcp_server_imagestring?MCP server Docker image
mcp_transportstring?MCP transport type
dependenciesstring?JSON of dependencies
licensestring?License identifier
agent_countintegerNumber of agents using this skill
security_scoreinteger?Security score (0-100)
allowed_domainsstring?JSON of allowed domains
changelogstring?Changelog text
StatusCondition
404Skill not found

Import Skill

POST /api/v1/workspaces/{workspaceId}/skills/import
Import a skill from a URL (GitHub raw content) or raw SKILL.md content. Auth: OWNER, ADMIN, or MANAGER role Request Body: Provide exactly one of url or content. (internal/api/skills.go:351)
FieldTypeRequiredDescription
urlstringConditionalURL to fetch SKILL.md from
contentstringConditionalRaw SKILL.md content
allow_unsafe_licensebooleanNoOpt-in to import skills whose SPDX license is flagged as unsafe (default false)
{
  "url": "https://raw.githubusercontent.com/org/repo/main/SKILL.md"
}
or
{
  "content": "---\nname: my-skill\n---\n# My Custom Skill\n..."
}
URLs are validated against SSRF attacks (private IP ranges are blocked). Response: 201 Created — imported skill object.
StatusCondition
400Invalid JSON, no url/content, both provided, invalid URL, parse error
403Insufficient role

Generate Skill

POST /api/v1/workspaces/{workspaceId}/skills/generate
Authors a SKILL.md from a natural-language intent by calling Anthropic with a condensed skill-creator prompt, then inserts it with source = 'GENERATED'. The user can edit the body via the skills detail page afterwards. (internal/api/skills_generate.go:94) Auth: OWNER, ADMIN, or MANAGER role (canRole(role, "create")). This endpoint spends real Anthropic tokens against the workspace’s API key on every call. Prerequisite: Workspace must have an ACTIVE credential with provider = ANTHROPIC and type = API_KEY (not AI_CLI_TOKEN). OAuth bearer tokens from claude CLI login won’t work against the Messages API. Request Body:
FieldTypeRequiredDefaultDescription
slugstringYesDesired skill slug (will be slugified)
promptstringYesNatural-language intent describing what the skill should do
modelstringNo"claude-sonnet-4-6"Override the Anthropic model used for authoring
{
  "slug": "extract-pdf-tables",
  "prompt": "Use this when the user wants to extract tables from PDF documents into CSV."
}
Response: 201 Created
{
  "skill_id": "sk_a1b2c3d4e5f60718",
  "slug": "extract-pdf-tables",
  "content": "---\nname: extract-pdf-tables\n...\n---\n# Extract PDF Tables\n...",
  "scan_status": "CLEAN",
  "scan_reason": "",
  "description_quality": "good"
}
StatusCondition
400Missing slug/prompt, invalid JSON, or missing workspaceId path value
403Insufficient role
409Insert conflict (slug already exists in this workspace)
412No active Anthropic API_KEY credential available in the workspace
502Anthropic call failed, frontmatter missing, or parser rejected the model’s output

Bulk Import Skills

POST /api/v1/workspaces/{workspaceId}/skills/bulk-import
Walks a remote git repository for SKILL.md files and upserts each through the same v65-aware path used by Import, including SPDX license gating and the content scanner. Per-skill rejections are returned in the skipped array rather than failing the whole batch. (internal/api/skills_bulk_import.go:106) Auth: OWNER, ADMIN, or MANAGER role (canRole(role, "create")) Request Body:
FieldTypeRequiredDefaultDescription
git_urlstringYesHTTPS git URL. Private IPs, localhost, and embedded user-info are rejected.
git_refstringNorepo defaultBranch, tag, or commit to clone
pathsstring[]No[]Optional sub-paths inside the repo to scan
vendorstringNorepo hostOverride the vendor column written on each row
allow_unsafe_licensebooleanNofalseImport skills whose SPDX license is flagged unsafe
dry_runbooleanNofalseWalk and validate without writing to the database
local_path is intentionally not part of the HTTP surface (it would turn the endpoint into an arbitrary host-FS read primitive).
{
  "git_url": "https://github.com/example/skills-pack.git",
  "git_ref": "main",
  "allow_unsafe_license": false,
  "dry_run": false
}
Response: 200 OK
{
  "source": "https://github.com/example/skills-pack.git@main",
  "total_found": 12,
  "total_imported": 10,
  "imported": [
    { "skill_id": "sk_abc", "slug": "code-reviewer", "created": true },
    { "skill_id": "sk_def", "slug": "release-notes", "created": false }
  ],
  "skipped": [
    { "path": "skills/internal/SKILL.md", "slug": "internal", "reason": "license GPL-3.0 blocked; pass allow_unsafe_license=true to override" }
  ],
  "truncated": false
}
truncated is true when the walker hit its per-batch cap before reaching the end of the source tree.
StatusCondition
400Invalid JSON, missing git_url, or missing workspaceId path value
403Insufficient role
502Validation rejected (private/internal IP, malformed URL) or git clone failed

Delete Skill

DELETE /api/v1/workspaces/{workspaceId}/skills/{skillId}
Permanently deletes a non-bundled skill (internal/api/skills.go:519). Auth: OWNER or ADMIN role (canRole(role, "manage")) Response: 200 OK
{ "deleted": true, "skill_id": "skill_abc" }
StatusCondition
403Insufficient role, or attempt to delete a BUNDLED skill (re-seeded on server start)
404Skill not found

Proposed Skills (memory → Skills bridge)

When the memory consolidator runs in proposal mode it stages auto-promoted SKILL.md files under .memory/{crew-slug}/topics/.proposed/skill-*.md. These endpoints are the HITL surface for reviewing those stagings. The handler is stateless against the database — disk is the source of truth, and approve/reject emit EntryMemorySkillApproved / EntryMemorySkillRejected journal entries. (internal/api/skills_proposed_handler.go) Auth (all three): OWNER, ADMIN, or MANAGER role — same threshold as canonical skill import.

List Proposed Skills

GET /api/v1/skills/proposed?crew_id={crewId}
Lists skill files staged for review under the given crew. Returns an empty array when no .proposed directory exists for the crew. Query Parameters:
ParameterTypeRequiredDescription
crew_idstringYesCrew whose .proposed/ directory should be inspected
Response: 200 OK
[
  {
    "file_name": "skill-release-notes.md",
    "name": "release-notes",
    "description": "Use when the user asks to summarise commits between two tags.",
    "description_quality": "good",
    "category": "automation"
  }
]
A file that fails the SKILL.md parser is still surfaced with description_quality set to "parse error: <reason>" so an operator can manually reject it.
StatusCondition
400Missing crew_id
401No workspace context on the request
403Insufficient role
404Crew not found in this workspace
503Server has no crew-memory root configured

Approve Proposed Skill

POST /api/v1/skills/proposed/approve
Imports the staged SKILL.md through the canonical skills importer (same path as URL/paste import), then removes the staging file on success. Note: The router pattern is /skills/proposed/approve (body-based), not a path-parameter /{id}/approve form. Request Body:
FieldTypeRequiredDescription
crew_idstringYesCrew the file lives under
file_namestringYesBare basename returned by List (must match skill-*.md; path traversal is rejected)
{ "crew_id": "crew_123", "file_name": "skill-release-notes.md" }
Response: 200 OK
{
  "skill_id": "sk_a1b2c3d4e5f60718",
  "slug": "release-notes",
  "created": true,
  "file_name": "skill-release-notes.md"
}
StatusCondition
400Invalid JSON, missing crew_id/file_name, or unsafe file_name
403Insufficient role
404Crew not found, or staged file missing
422Staged content failed the importer (frontmatter malformed, license rejected)
503Server has no crew-memory root configured

Reject Proposed Skill

POST /api/v1/skills/proposed/reject
Deletes the staging file and emits an audit entry. Idempotent: calling reject twice returns 200 with removed: false on the second call. Request Body: Same shape as Approve (crew_id, file_name). Response: 200 OK
{ "file_name": "skill-release-notes.md", "removed": true }
StatusCondition
400Invalid JSON, missing fields, or unsafe file_name
403Insufficient role
404Crew not found
503Server has no crew-memory root configured

Skill Sources

SourceDescription
BUNDLEDShips with Crewship
MANAGEDMaintained by the Crewship team
MARKETPLACECommunity-contributed
CUSTOMWorkspace-scoped (user-imported)

Skill Categories

coding, messaging, automation, data, devops, support, sales, custom

Workflow Templates

Workflow templates define reusable task structures for missions.

List Templates

GET /api/v1/templates?workspace_id={workspaceId}
Auth: Session or CLI token + workspace membership Response: 200 OK — array of template objects.

Create Template

POST /api/v1/templates?workspace_id={workspaceId}
Auth: OWNER, ADMIN, or MANAGER role Response: 201 Created

Get Template

GET /api/v1/templates/{templateId}?workspace_id={workspaceId}
Response: 200 OK
StatusCondition
404Template not found

Update Template

PATCH /api/v1/templates/{templateId}?workspace_id={workspaceId}
Auth: OWNER, ADMIN, or MANAGER role Response: 200 OK

Delete Template

DELETE /api/v1/templates/{templateId}?workspace_id={workspaceId}
Auth: OWNER, ADMIN, or MANAGER role Response: 204 No Content

Crew Templates (Blueprints)

Crew templates are pre-configured crew blueprints that can be deployed to create a fully set up crew with agents, skills, and credentials.

List Crew Templates

GET /api/v1/crew-templates?workspace_id={workspaceId}
Response: 200 OK — array of crew template objects.

Get Crew Template

GET /api/v1/crew-templates/{slug}?workspace_id={workspaceId}
Response: 200 OK — full template details including agents and configuration.

Deploy Crew Template

POST /api/v1/crew-templates/{slug}/deploy?workspace_id={workspaceId}
Deploys the template, creating:
  • A new crew with the template’s configuration
  • All agents defined in the template
  • Auto-assignment of credentials and skills
Auth: OWNER, ADMIN, or MANAGER role Response: 201 Created — the created crew and agents.

AI Crew Wizard

POST /api/v1/crew-ai-suggest?workspace_id={workspaceId}
Uses AI to suggest a crew configuration based on a natural language description. Auth: OWNER, ADMIN, or MANAGER role Response: 200 OK — suggested crew configuration.

Agent Skills (Per-Agent)

See the Agents page for per-agent skill management:
EndpointMethodDescription
GET /api/v1/agents/{agentId}/skillsGETList skills assigned to agent
POST /api/v1/agents/{agentId}/skillsPOSTAssign skill to agent
DELETE /api/v1/agents/{agentId}/skills/{skillId}DELETERemove skill from agent