Uploads a .zip archive as multipart/form-data to create a new Skill resource.
Request headers
|
Header |
Required |
Description |
|
|
Yes |
Bearer PAT — see |
|
|
No |
|
Request body (multipart/form-data)
|
Field |
Type |
Required |
Description |
|
|
file |
Yes |
The Skill content packaged as a |
|
|
string |
No |
Skill name. If omitted, the value is read from the |
|
|
string |
No |
Skill type. One of |
|
|
string |
No |
Skill description. |
Zip archive layout
The archive must contain a SKILL.md file in the following format:
---
name: my-skill
description: Skill description
version: 1.0.0
---
# Skill title
## Steps
1. Step one
2. Step two
Example request
# Prepare the Skill content directory
mkdir my-skill && cat > my-skill/SKILL.md << 'EOF'
---
name: my-custom-skill
description: Custom Skill example
version: 1.0.0
---
# My Custom Skill
## Steps
1. Do action A
2. Do action B
## Verification
Confirm the actions complete successfully.
EOF
# Package the directory as a zip
cd my-skill && zip ../my-skill.zip SKILL.md && cd ..
# Upload and create the Skill
curl -X POST "https://api.qoder.com.cn/api/v1/cloud/skills" \
-H "Authorization: Bearer $QODER_PAT" \
-F "name=my-custom-skill" \
-F "type=custom" \
-F "description=Custom Skill example" \
-F "file=@my-skill.zip"
Example response
HTTP 201 Created
{
"id": "skill_019e3bba474b73cfaf19eae9b5f5e66d",
"type": "skill",
"name": "my-custom-skill",
"description": "Custom Skill example",
"skill_type": "custom",
"status": "active",
"version": 1,
"content_size": 309,
"content_sha256": "f253cb7d35790025f85917c0c239422cff1de067d00278db8897c585a3f28d94",
"metadata": {},
"created_at": "2026-05-18T15:35:24.248164Z",
"updated_at": "2026-05-18T15:35:24.248164Z"
}
Response fields
|
Field |
Type |
Description |
|
|
string |
Unique Skill identifier, prefixed with |
|
|
string |
Resource type. Always |
|
|
string |
Skill name. |
|
|
string |
Skill description. |
|
|
string |
Skill type: |
|
|
string |
Skill status. Currently always |
|
|
integer |
Current version number, starting at 1. |
|
|
integer |
Zip content size in bytes. |
|
|
string |
SHA-256 hash of the zip content. |
|
|
object |
User-defined metadata. |
|
|
string |
Creation timestamp (ISO 8601). |
|
|
string |
Last-updated timestamp (ISO 8601). |
Errors
|
HTTP |
Type |
Trigger |
|
400 |
|
Request is not multipart or the body is too large: |
|
400 |
|
The |
|
400 |
|
Uploaded file is not a zip: |
|
401 |
|
Missing or invalid authentication token. |
Notes
-
Skill names are not required to be unique — you can create multiple Skills that share a name.
-
If
nameis not sent in the form, the value is read from theSKILL.mdfrontmatter inside the archive. -
If
descriptionis not sent in the form, the value is read from theSKILL.mdfrontmatter inside the archive. -
When
nameordescriptionis present in both the form and the SKILL.md frontmatter, the frontmatter value wins. -
The initial version is 1.
-
JSON
Content-Typeis not accepted — you must usemultipart/form-data.
For the full error envelope, see Errors.