Gumloop Skills API
The Skills API from Gumloop — 3 operation(s) for skills.
The Skills API from Gumloop — 3 operation(s) for skills.
openapi: 3.0.0
info:
title: Public Agents Skills API
version: 1.0.0
servers:
- url: https://api.gumloop.com/api/v1
tags:
- name: Skills
paths:
/skills:
get:
summary: List skills
description: List skills the caller has access to. Filter by team, search by name, or narrow to a specific creator, related MCP server, or agent.
operationId: listSkills
tags:
- Skills
x-codeSamples:
- lang: bash
label: cURL
source: "curl 'https://api.gumloop.com/api/v1/skills?team_id=YOUR_TEAM_ID' \\\n -H 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n"
- lang: python
label: Python
source: "from gumloop import Gumloop\n\nclient = Gumloop(access_token=\"YOUR_ACCESS_TOKEN\")\n\nresponse = client.skills.list(team_id=\"YOUR_TEAM_ID\")\nfor skill in response.skills:\n print(skill.id, skill.name)\n"
parameters:
- in: query
name: team_id
required: false
schema:
type: string
description: Scope the listing to a single team. When omitted, returns skills owned by the authenticated user.
- in: query
name: search_query
required: false
schema:
type: string
description: Case-insensitive substring match against the skill name.
- in: query
name: sort_order
required: false
schema:
type: string
enum:
- newest
- popular
- most_used
default: newest
description: Sort order for the returned skills.
- in: query
name: page_size
required: false
schema:
type: integer
default: 20
minimum: 1
maximum: 100
description: Number of skills per page. Clamped between 1 and 100.
- in: query
name: cursor
required: false
schema:
type: string
description: Opaque pagination cursor returned in `next_cursor` from a prior page.
- in: query
name: creator_user_id
required: false
schema:
type: string
description: Filter to skills created by this user ID.
- in: query
name: related_server_id
required: false
schema:
type: string
description: Filter to skills that reference this MCP server ID in their metadata.
- in: query
name: agent_id
required: false
schema:
type: string
description: Filter to skills attached to this agent.
- in: query
name: unused
required: false
schema:
type: string
description: When set, filters to skills that have not been used.
responses:
'200':
description: Skills matching the provided filters.
content:
application/json:
schema:
type: object
properties:
skills:
type: array
items:
type: object
properties:
id:
type: string
description: Unique skill identifier.
example: skill_x7y8z9
name:
type: string
example: Lead enrichment
description:
type: string
example: Enriches inbound leads with firmographics.
team_id:
type: string
description: ID of the team that owns the skill.
example: team_4f8c92ab
created_at:
type: string
format: date-time
nullable: true
description: ISO 8601 timestamp of when the skill was created.
example: '2026-05-15T14:32:00Z'
updated_at:
type: string
format: date-time
nullable: true
description: ISO 8601 timestamp of when the skill was last updated.
example: '2026-05-16T09:10:00Z'
metadata:
type: object
description: User-defined metadata. May include `related_server_ids` (array of MCP server IDs the skill references).
default: {}
usage_count:
type: integer
nullable: true
example: 42
view_count:
type: integer
nullable: true
example: 117
last_used_at:
type: string
format: date-time
nullable: true
example: '2026-05-18T22:01:00Z'
version_id:
type: string
nullable: true
description: ID of the version exposed by this payload (the current draft, by default).
example: sv_a1b2c3d4
major_version:
type: integer
nullable: true
example: 3
is_deployed:
type: boolean
nullable: true
example: true
version_created_at:
type: string
format: date-time
nullable: true
example: '2026-05-16T09:10:00Z'
creator:
type: object
nullable: true
description: Creator of the skill. `null` when no creator is recorded.
properties:
id:
type: string
nullable: true
first_name:
type: string
nullable: true
last_name:
type: string
nullable: true
email:
type: string
nullable: true
profile_picture:
type: string
nullable: true
next_cursor:
type: string
nullable: true
description: Opaque cursor for the next page, or `null` when there are no more results.
total_count:
type: integer
nullable: true
description: Total number of skills matching the filters across all pages.
examples:
multiple:
summary: Multiple skills
value:
skills:
- id: skill_x7y8z9
name: Lead enrichment
description: Enriches inbound leads with firmographics.
team_id: team_4f8c92ab
created_at: '2026-05-15T14:32:00Z'
updated_at: '2026-05-16T09:10:00Z'
metadata:
related_server_ids:
- apollo
usage_count: 42
view_count: 117
last_used_at: '2026-05-18T22:01:00Z'
version_id: sv_a1b2c3d4
major_version: 3
is_deployed: true
version_created_at: '2026-05-16T09:10:00Z'
creator:
id: user_2b9d71f0
first_name: Ada
last_name: Lovelace
email: ada@example.com
profile_picture: null
- id: skill_p4q5r6
name: Ticket triage
description: Classifies and routes support tickets.
team_id: team_4f8c92ab
created_at: '2026-04-02T09:11:00Z'
updated_at: '2026-04-02T09:11:00Z'
metadata: {}
usage_count: 0
view_count: 5
last_used_at: null
version_id: sv_e5f6g7h8
major_version: 1
is_deployed: false
version_created_at: '2026-04-02T09:11:00Z'
creator:
id: user_2b9d71f0
first_name: Ada
last_name: Lovelace
email: ada@example.com
profile_picture: null
next_cursor: null
total_count: 2
empty:
summary: No matches
value:
skills: []
next_cursor: null
total_count: 0
'400':
description: Bad request — invalid query parameter (for example, non-integer `page_size`).
'401':
description: Unauthorized — missing or invalid API key.
'403':
description: Forbidden — the caller does not have skill access on the requested team.
'500':
description: Internal server error.
security:
- bearerAuth: []
post:
summary: Create skill
description: Upload a skill package and create a new skill. The package must include a `SKILL.md` with `name` and `description` frontmatter; uploads may be a single `.md` file (stored as `SKILL.md`), or a `.zip` / `.skill` archive containing `SKILL.md` at its root. The initial version is created automatically. Maximum upload size is 10 MB.
operationId: createSkill
tags:
- Skills
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X POST 'https://api.gumloop.com/api/v1/skills' \\\n -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \\\n -F 'team_id=YOUR_TEAM_ID' \\\n -F 'files=@./lead-enrichment.skill;type=application/zip'\n"
- lang: python
label: Python
source: "from gumloop import Gumloop\n\nclient = Gumloop(access_token=\"YOUR_ACCESS_TOKEN\")\n\nwith open(\"lead-enrichment.skill\", \"rb\") as fh:\n response = client.skills.create(\n files=[(\"lead-enrichment.skill\", fh.read(), \"application/zip\")],\n team_id=\"YOUR_TEAM_ID\",\n )\nprint(response.skill.id)\n"
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
files:
type: array
description: One or more file parts. Accepts a single `.md` file (stored as `SKILL.md`), a `.zip` / `.skill` archive containing `SKILL.md` at its root, or loose files that together include a `SKILL.md`. Total upload must not exceed 10 MB.
items:
type: string
format: binary
team_id:
type: string
description: Team that should own the skill. When omitted, the skill is owned by the authenticated user.
required:
- files
responses:
'201':
description: Skill created.
content:
application/json:
schema:
type: object
properties:
skill:
type: object
properties:
id:
type: string
description: Unique skill identifier.
example: skill_x7y8z9
name:
type: string
example: Lead enrichment
description:
type: string
example: Enriches inbound leads with firmographics.
team_id:
type: string
description: ID of the team that owns the skill.
example: team_4f8c92ab
created_at:
type: string
format: date-time
nullable: true
description: ISO 8601 timestamp of when the skill was created.
example: '2026-05-19T09:00:00Z'
updated_at:
type: string
format: date-time
nullable: true
description: ISO 8601 timestamp of when the skill was last updated.
example: '2026-05-19T09:00:00Z'
metadata:
type: object
description: User-defined metadata. May include `related_server_ids` (array of MCP server IDs the skill references).
default: {}
usage_count:
type: integer
nullable: true
example: 0
view_count:
type: integer
nullable: true
example: 0
last_used_at:
type: string
format: date-time
nullable: true
example: null
version_id:
type: string
nullable: true
description: ID of the version exposed by this payload (the current draft, by default).
example: sv_a1b2c3d4
major_version:
type: integer
nullable: true
example: 1
is_deployed:
type: boolean
nullable: true
example: false
version_created_at:
type: string
format: date-time
nullable: true
example: '2026-05-19T09:00:00Z'
creator:
type: object
nullable: true
description: Creator of the skill. `null` when no creator is recorded.
properties:
id:
type: string
nullable: true
first_name:
type: string
nullable: true
last_name:
type: string
nullable: true
email:
type: string
nullable: true
profile_picture:
type: string
nullable: true
examples:
created:
summary: Newly created skill
value:
skill:
id: skill_x7y8z9
name: Lead enrichment
description: Enriches inbound leads with firmographics.
team_id: team_4f8c92ab
created_at: '2026-05-19T09:00:00Z'
updated_at: '2026-05-19T09:00:00Z'
metadata: {}
usage_count: 0
view_count: 0
last_used_at: null
version_id: sv_a1b2c3d4
major_version: 1
is_deployed: false
version_created_at: '2026-05-19T09:00:00Z'
creator:
id: user_2b9d71f0
first_name: Ada
last_name: Lovelace
email: ada@example.com
profile_picture: null
'400':
description: Bad request — missing or invalid `SKILL.md`, unsafe archive, or malformed metadata.
'401':
description: Unauthorized — missing or invalid API key.
'403':
description: Forbidden — the caller cannot create skills on the requested team.
'413':
description: Upload too large — request body exceeded 10 MB.
'500':
description: Internal server error.
security:
- bearerAuth: []
/skills/{skill_id}:
patch:
summary: Update skill
description: Replace a skill's files with a new upload. Reparses `SKILL.md` to update the skill's `name`, `description`, and `metadata`, and creates a new version. Maximum upload size is 10 MB.
operationId: updateSkill
tags:
- Skills
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X PATCH 'https://api.gumloop.com/api/v1/skills/skill_x7y8z9' \\\n -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \\\n -F 'files=@./lead-enrichment.skill;type=application/zip'\n"
- lang: python
label: Python
source: "from gumloop import Gumloop\n\nclient = Gumloop(access_token=\"YOUR_ACCESS_TOKEN\")\n\nwith open(\"lead-enrichment.skill\", \"rb\") as fh:\n response = client.skills.update(\n \"skill_x7y8z9\",\n files=[(\"lead-enrichment.skill\", fh.read(), \"application/zip\")],\n )\nprint(response.skill.version_id)\n"
parameters:
- in: path
name: skill_id
required: true
schema:
type: string
description: ID of the skill to update.
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
files:
type: array
description: One or more file parts containing the new skill contents. Same shape as the create endpoint — must include a `SKILL.md`. Total upload must not exceed 10 MB.
items:
type: string
format: binary
required:
- files
responses:
'200':
description: Skill updated. The returned `version_id` and `major_version` reflect the new version that was created.
content:
application/json:
schema:
type: object
properties:
skill:
type: object
properties:
id:
type: string
description: Unique skill identifier.
example: skill_x7y8z9
name:
type: string
example: Lead enrichment
description:
type: string
example: Enriches inbound leads with firmographics and intent signals.
team_id:
type: string
description: ID of the team that owns the skill.
example: team_4f8c92ab
created_at:
type: string
format: date-time
nullable: true
description: ISO 8601 timestamp of when the skill was created.
example: '2026-05-15T14:32:00Z'
updated_at:
type: string
format: date-time
nullable: true
description: ISO 8601 timestamp of when the skill was last updated.
example: '2026-05-19T11:42:00Z'
metadata:
type: object
description: User-defined metadata. May include `related_server_ids` (array of MCP server IDs the skill references).
default: {}
usage_count:
type: integer
nullable: true
example: 42
view_count:
type: integer
nullable: true
example: 117
last_used_at:
type: string
format: date-time
nullable: true
example: '2026-05-18T22:01:00Z'
version_id:
type: string
nullable: true
description: ID of the version exposed by this payload (the newly created version).
example: sv_b9c8d7e6
major_version:
type: integer
nullable: true
example: 4
is_deployed:
type: boolean
nullable: true
example: false
version_created_at:
type: string
format: date-time
nullable: true
example: '2026-05-19T11:42:00Z'
creator:
type: object
nullable: true
description: Creator of the skill. `null` when no creator is recorded.
properties:
id:
type: string
nullable: true
first_name:
type: string
nullable: true
last_name:
type: string
nullable: true
email:
type: string
nullable: true
profile_picture:
type: string
nullable: true
examples:
updated:
summary: Skill after update
value:
skill:
id: skill_x7y8z9
name: Lead enrichment
description: Enriches inbound leads with firmographics and intent signals.
team_id: team_4f8c92ab
created_at: '2026-05-15T14:32:00Z'
updated_at: '2026-05-19T11:42:00Z'
metadata:
related_server_ids:
- apollo
usage_count: 42
view_count: 117
last_used_at: '2026-05-18T22:01:00Z'
version_id: sv_b9c8d7e6
major_version: 4
is_deployed: false
version_created_at: '2026-05-19T11:42:00Z'
creator:
id: user_2b9d71f0
first_name: Ada
last_name: Lovelace
email: ada@example.com
profile_picture: null
'400':
description: Bad request — missing or invalid `SKILL.md`, unsafe archive, or malformed metadata.
'401':
description: Unauthorized — missing or invalid API key.
'403':
description: Forbidden — the caller cannot update this skill.
'404':
description: Skill not found.
'413':
description: Upload too large — request body exceeded 10 MB.
'500':
description: Internal server error.
security:
- bearerAuth: []
delete:
summary: Delete skill
description: Permanently delete a skill. This is a soft-delete — the skill will no longer appear in listings or be usable by agents.
operationId: deleteSkill
tags:
- Skills
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X DELETE 'https://api.gumloop.com/api/v1/skills/skill_x7y8z9' \\\n -H 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n"
- lang: python
label: Python
source: 'from gumloop import Gumloop
client = Gumloop(access_token="YOUR_ACCESS_TOKEN")
response = client.skills.delete("skill_x7y8z9")
print(response.deleted)
'
parameters:
- in: path
name: skill_id
required: true
schema:
type: string
description: ID of the skill to delete.
responses:
'200':
description: Skill deleted successfully.
content:
application/json:
schema:
type: object
properties:
deleted:
type: boolean
description: Whether the skill was successfully deleted.
example: true
examples:
deleted:
summary: Skill deleted
value:
deleted: true
'401':
description: Unauthorized — missing or invalid API key.
'403':
description: Forbidden — the caller cannot delete this skill.
'404':
description: Skill not found.
'500':
description: Internal server error.
security:
- bearerAuth: []
/skills/{skill_id}/download:
get:
summary: Download skill
description: Generate a signed URL to download a skill's contents as a `.skill` archive (ZIP). When `version_id` is provided, returns that exact version; otherwise returns the current draft.
operationId: downloadSkill
tags:
- Skills
x-codeSamples:
- lang: bash
label: cURL
source: "curl 'https://api.gumloop.com/api/v1/skills/skill_x7y8z9/download' \\\n -H 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n"
- lang: python
label: Python
source: 'from gumloop import Gumloop
client = Gumloop(access_token="YOUR_ACCESS_TOKEN")
response = client.skills.download("skill_x7y8z9")
print(response.download_url)
'
parameters:
- in: path
name: skill_id
required: true
schema:
type: string
description: ID of the skill to download.
- in: query
name: version_id
required: false
schema:
type: string
description: Specific version to download. When omitted, the current draft is returned.
responses:
'200':
description: Signed download URL for the requested skill archive.
content:
application/json:
schema:
type: object
properties:
download_url:
type: string
description: Short-lived signed URL pointing at the `.skill` archive in object storage.
filename:
type: string
description: Suggested filename for the archive (`<skill name>.skill`).
media_type:
type: string
enum:
- application/zip
description: Media type of the archive at `download_url`.
size:
type: integer
nullable: true
description: Size of the archive in bytes.
id:
type: string
description: ID of the skill the archive was generated for.
version_id:
type: string
nullable: true
description: Version that was archived, or `null` if the skill has no current version.
major_version:
type: integer
nullable: true
description: Major version number of the archived version, or `null` if unavailable.
examples:
download:
summary: Signed download URL
value:
download_url: https://storage.googleapis.com/gumloop-skills/skill_x7y8z9/Lead%20enrichment.skill?X-Goog-Signature=...
filename: Lead enrichment.skill
media_type: application/zip
size: 18432
id: skill_x7y8z9
version_id: sv_a1b2c3d4
major_version: 3
'401':
description: Unauthorized — missing or invalid API key.
'403':
description: Forbidden — the caller cannot read this skill.
'404':
description: Skill, version, or skill files not found.
'502':
description: Failed to generate a signed download URL from object storage.
security:
- bearerAuth: []
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: A personal API key or an [OAuth 2.0](/api-reference/oauth) access token. Personal API keys also require the `x-auth-key` header with your user ID.