curl --request POST \
--url https://dust.tt/api/v1/w/{wId}/skills \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form files=@example-file \
--form 'names=<string>' \
--form editors=jsmith@example.comimport requests
url = "https://dust.tt/api/v1/w/{wId}/skills"
files = { "files": ("example-file", open("example-file", "rb")) }
payload = {
"names": "<string>",
"editors": "jsmith@example.com"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('files', '<string>');
form.append('names', '<string>');
form.append('editors', 'jsmith@example.com');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://dust.tt/api/v1/w/{wId}/skills', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://dust.tt/api/v1/w/{wId}/skills",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"names\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"editors\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://dust.tt/api/v1/w/{wId}/skills"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"names\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"editors\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://dust.tt/api/v1/w/{wId}/skills")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"names\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"editors\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://dust.tt/api/v1/w/{wId}/skills")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"names\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"editors\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"imported": [
{
"sId": "skill_abc123",
"createdAt": 123,
"updatedAt": 123,
"editedBy": 123,
"status": "active",
"name": "Customer Support",
"agentFacingDescription": "Use this skill to answer customer support questions.",
"userFacingDescription": "Answers support questions with the right workspace context.",
"icon": "ActionRobotIcon",
"source": "web_app",
"sourceMetadata": {
"repoUrl": "https://github.com/dust-tt/skills",
"filePath": "support/SKILL.md"
},
"reinforcement": "auto",
"lastReinforcementAnalysisAt": "<string>",
"requestedSpaceIds": [
"<string>"
],
"manuallyRequestedSpaceIds": [
"<string>"
],
"fileAttachments": [
{
"fileId": "<string>",
"fileName": "<string>"
}
],
"canRead": true,
"canWrite": true,
"isDefault": true,
"availability": "editors",
"instructions": "<string>",
"instructionsHtml": "<string>",
"tools": [
{
"isRestrictedToSkills": false,
"id": 123,
"sId": "mcp_sv_abc123",
"name": "My Custom MCP Server",
"description": "This MCP server handles customer data operations",
"createdAt": 1625097600,
"updatedAt": 1625184000,
"spaceId": "spc_xyz789",
"serverType": "remote",
"server": {
"sId": "mcp_srv_def456",
"name": "Customer Data Server",
"version": "1.0.0",
"description": "Handles customer data operations and queries",
"icon": "database",
"authorization": {
"provider": "github",
"supported_use_cases": [
"platform_actions"
],
"scope": "repo:read"
},
"tools": [
{
"name": "query_customers",
"description": "Query customer database for information",
"inputSchema": {
"type": "object",
"properties": {
"customerId": {
"type": "string"
}
}
},
"readOnlyHint": true
}
],
"availability": "production",
"allowMultipleInstances": false,
"documentationUrl": "https://docs.example.com/mcp-server"
},
"oAuthUseCase": "platform_actions",
"editedByUser": {
"editedAt": 1625184000,
"fullName": "John Doe",
"imageUrl": "https://example.com/profile/johndoe.jpg"
}
}
]
}
],
"updated": [
{
"sId": "skill_abc123",
"createdAt": 123,
"updatedAt": 123,
"editedBy": 123,
"status": "active",
"name": "Customer Support",
"agentFacingDescription": "Use this skill to answer customer support questions.",
"userFacingDescription": "Answers support questions with the right workspace context.",
"icon": "ActionRobotIcon",
"source": "web_app",
"sourceMetadata": {
"repoUrl": "https://github.com/dust-tt/skills",
"filePath": "support/SKILL.md"
},
"reinforcement": "auto",
"lastReinforcementAnalysisAt": "<string>",
"requestedSpaceIds": [
"<string>"
],
"manuallyRequestedSpaceIds": [
"<string>"
],
"fileAttachments": [
{
"fileId": "<string>",
"fileName": "<string>"
}
],
"canRead": true,
"canWrite": true,
"isDefault": true,
"availability": "editors",
"instructions": "<string>",
"instructionsHtml": "<string>",
"tools": [
{
"isRestrictedToSkills": false,
"id": 123,
"sId": "mcp_sv_abc123",
"name": "My Custom MCP Server",
"description": "This MCP server handles customer data operations",
"createdAt": 1625097600,
"updatedAt": 1625184000,
"spaceId": "spc_xyz789",
"serverType": "remote",
"server": {
"sId": "mcp_srv_def456",
"name": "Customer Data Server",
"version": "1.0.0",
"description": "Handles customer data operations and queries",
"icon": "database",
"authorization": {
"provider": "github",
"supported_use_cases": [
"platform_actions"
],
"scope": "repo:read"
},
"tools": [
{
"name": "query_customers",
"description": "Query customer database for information",
"inputSchema": {
"type": "object",
"properties": {
"customerId": {
"type": "string"
}
}
},
"readOnlyHint": true
}
],
"availability": "production",
"allowMultipleInstances": false,
"documentationUrl": "https://docs.example.com/mcp-server"
},
"oAuthUseCase": "platform_actions",
"editedByUser": {
"editedAt": 1625184000,
"fullName": "John Doe",
"imageUrl": "https://example.com/profile/johndoe.jpg"
}
}
]
}
],
"skipped": [
{
"name": "<string>",
"message": "<string>"
}
]
}Import skills from uploaded files
Imports skills from uploaded files or ZIP archives into the workspace.
curl --request POST \
--url https://dust.tt/api/v1/w/{wId}/skills \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form files=@example-file \
--form 'names=<string>' \
--form editors=jsmith@example.comimport requests
url = "https://dust.tt/api/v1/w/{wId}/skills"
files = { "files": ("example-file", open("example-file", "rb")) }
payload = {
"names": "<string>",
"editors": "jsmith@example.com"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('files', '<string>');
form.append('names', '<string>');
form.append('editors', 'jsmith@example.com');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://dust.tt/api/v1/w/{wId}/skills', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://dust.tt/api/v1/w/{wId}/skills",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"names\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"editors\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://dust.tt/api/v1/w/{wId}/skills"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"names\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"editors\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://dust.tt/api/v1/w/{wId}/skills")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"names\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"editors\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://dust.tt/api/v1/w/{wId}/skills")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"names\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"editors\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"imported": [
{
"sId": "skill_abc123",
"createdAt": 123,
"updatedAt": 123,
"editedBy": 123,
"status": "active",
"name": "Customer Support",
"agentFacingDescription": "Use this skill to answer customer support questions.",
"userFacingDescription": "Answers support questions with the right workspace context.",
"icon": "ActionRobotIcon",
"source": "web_app",
"sourceMetadata": {
"repoUrl": "https://github.com/dust-tt/skills",
"filePath": "support/SKILL.md"
},
"reinforcement": "auto",
"lastReinforcementAnalysisAt": "<string>",
"requestedSpaceIds": [
"<string>"
],
"manuallyRequestedSpaceIds": [
"<string>"
],
"fileAttachments": [
{
"fileId": "<string>",
"fileName": "<string>"
}
],
"canRead": true,
"canWrite": true,
"isDefault": true,
"availability": "editors",
"instructions": "<string>",
"instructionsHtml": "<string>",
"tools": [
{
"isRestrictedToSkills": false,
"id": 123,
"sId": "mcp_sv_abc123",
"name": "My Custom MCP Server",
"description": "This MCP server handles customer data operations",
"createdAt": 1625097600,
"updatedAt": 1625184000,
"spaceId": "spc_xyz789",
"serverType": "remote",
"server": {
"sId": "mcp_srv_def456",
"name": "Customer Data Server",
"version": "1.0.0",
"description": "Handles customer data operations and queries",
"icon": "database",
"authorization": {
"provider": "github",
"supported_use_cases": [
"platform_actions"
],
"scope": "repo:read"
},
"tools": [
{
"name": "query_customers",
"description": "Query customer database for information",
"inputSchema": {
"type": "object",
"properties": {
"customerId": {
"type": "string"
}
}
},
"readOnlyHint": true
}
],
"availability": "production",
"allowMultipleInstances": false,
"documentationUrl": "https://docs.example.com/mcp-server"
},
"oAuthUseCase": "platform_actions",
"editedByUser": {
"editedAt": 1625184000,
"fullName": "John Doe",
"imageUrl": "https://example.com/profile/johndoe.jpg"
}
}
]
}
],
"updated": [
{
"sId": "skill_abc123",
"createdAt": 123,
"updatedAt": 123,
"editedBy": 123,
"status": "active",
"name": "Customer Support",
"agentFacingDescription": "Use this skill to answer customer support questions.",
"userFacingDescription": "Answers support questions with the right workspace context.",
"icon": "ActionRobotIcon",
"source": "web_app",
"sourceMetadata": {
"repoUrl": "https://github.com/dust-tt/skills",
"filePath": "support/SKILL.md"
},
"reinforcement": "auto",
"lastReinforcementAnalysisAt": "<string>",
"requestedSpaceIds": [
"<string>"
],
"manuallyRequestedSpaceIds": [
"<string>"
],
"fileAttachments": [
{
"fileId": "<string>",
"fileName": "<string>"
}
],
"canRead": true,
"canWrite": true,
"isDefault": true,
"availability": "editors",
"instructions": "<string>",
"instructionsHtml": "<string>",
"tools": [
{
"isRestrictedToSkills": false,
"id": 123,
"sId": "mcp_sv_abc123",
"name": "My Custom MCP Server",
"description": "This MCP server handles customer data operations",
"createdAt": 1625097600,
"updatedAt": 1625184000,
"spaceId": "spc_xyz789",
"serverType": "remote",
"server": {
"sId": "mcp_srv_def456",
"name": "Customer Data Server",
"version": "1.0.0",
"description": "Handles customer data operations and queries",
"icon": "database",
"authorization": {
"provider": "github",
"supported_use_cases": [
"platform_actions"
],
"scope": "repo:read"
},
"tools": [
{
"name": "query_customers",
"description": "Query customer database for information",
"inputSchema": {
"type": "object",
"properties": {
"customerId": {
"type": "string"
}
}
},
"readOnlyHint": true
}
],
"availability": "production",
"allowMultipleInstances": false,
"documentationUrl": "https://docs.example.com/mcp-server"
},
"oAuthUseCase": "platform_actions",
"editedByUser": {
"editedAt": 1625184000,
"fullName": "John Doe",
"imageUrl": "https://example.com/profile/johndoe.jpg"
}
}
]
}
],
"skipped": [
{
"name": "<string>",
"message": "<string>"
}
]
}Authorizations
Your DUST API key is a Bearer token.
Path Parameters
Unique string identifier for the workspace
Body
Skill files or ZIP archives to import. Skill names must be at most 256 characters.
Optional skill names to import from the uploaded files.
Strategy applied when a skill with the same name already exists in the workspace. error rejects the whole import, skip skips the skill and reports it in skipped, override updates the existing skill. Defaults to error.
error, skip, override Optional editor email addresses to add to imported or updated skills. Editors must be active workspace members. Existing skills keep their current editors.
Optional availability to apply to imported or updated skills. editors is unpublished, workspace_users is published, and users_and_agents is discoverable. New skills default to editors and existing skills keep their current availability when omitted.
editors, workspace_users, users_and_agents