Skip to content

Skills API Reference ​

Naming ​

Skills follow a GitHub-style owner/name naming convention:

  • Frontmatter name: The short skill name (e.g., concise-answers) — must match the AgentSkills.io spec: lowercase alphanumeric + hyphens, 1-64 chars.
  • slug / fullName: The canonical identity {alias}/{name} (e.g., snowtimber/concise-answers) — used in URLs, API identifiers, and display.

Two different users can each own a skill named concise-answers — they are distinguished by their owner/name slug, just like GitHub repos.

Endpoints ​

MethodPathAuthDescription
POST/skills/createRequiredCreate a new skill
PUT/skills/updateRequiredUpdate a skill (by ID or slug)
POST/skills/deleteRequiredDelete a skill (by ID or slug)
GET/skills/listOptionalList skills
GET/skills/{skillId}OptionalGet skill by ID
GET/skills/s/{owner}/{slug}OptionalGet skill by slug
GET/skills/{skillId}/SKILL.mdPublic*Raw SKILL.md content
GET/skills/s/{owner}/{slug}/SKILL.mdPublic*Raw SKILL.md by slug

* Public skills are readable without auth; private skills require owner's bearer token.

Create Skill ​

POST /skills/create

Request Body ​

FieldTypeRequiredDescription
skillMdstringYesFull SKILL.md content (YAML frontmatter + markdown body)
descriptionstringNoOverride description (defaults to frontmatter description)
visibilitystringNo"public" (default) or "private"

Response (201) ​

json
{
  "data": {
    "message": "Skill created",
    "skill": {
      "skillId": "uuid",
      "skillName": "concise-answers",
      "fullName": "snowtimber/concise-answers",
      "description": "Keep responses short...",
      "slug": "snowtimber/concise-answers",
      "rawUrl": "https://api.universalapi.co/skills/s/snowtimber/concise-answers/SKILL.md",
      "visibility": "public",
      "status": "active"
    }
  }
}

Update Skill ​

PUT /skills/update

Request Body ​

FieldTypeRequiredDescription
skillIdstringOne of skillId/slugSkill UUID to update
slugstringOne of skillId/slugOwner/name slug (e.g., snowtimber/concise-answers)
skillMdstringNoNew SKILL.md content
descriptionstringNoNew description
visibilitystringNo"public" or "private"

Example — update by slug ​

bash
curl -X PUT https://api.universalapi.co/skills/update \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"slug": "snowtimber/concise-answers", "visibility": "private"}'

Delete Skill ​

POST /skills/delete

Request Body ​

FieldTypeRequiredDescription
skillIdstringOne of skillId/slugSkill UUID to delete
slugstringOne of skillId/slugOwner/name slug (e.g., snowtimber/concise-answers)

Deleting a skill removes its slug from the index, so the same name can be recreated.

List Skills ​

GET /skills/list?visibility={all|public|private}

Returns all skills visible to the caller. Anonymous users see only public skills.

Raw SKILL.md ​

GET /skills/s/{owner}/{slug}/SKILL.md

Returns the raw SKILL.md content as text/markdown; charset=utf-8 with a 5-minute cache header. This is the URL you pass to Skill.from_url() in your agent code.

Universal API - The agentic entry point to the universe of APIs