Import skills from uploaded files
curl --request POST \
--url https://dust.tt/api/v1/w/{wId}/skills \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'files=<string>' \
--form 'names=<string>' \
--form editors=jsmith@example.com \
--form files.items='@example-file'import requests
url = "https://dust.tt/api/v1/w/{wId}/skills"
files = { "files.items": ("example-file", open("example-file", "rb")) }
payload = {
"files": "<string>",
"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');
form.append('files.items', '{
"fileName": "example-file"
}');
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\"\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\r\nContent-Disposition: form-data; name=\"files.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\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\"\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\r\nContent-Disposition: form-data; name=\"files.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\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\"\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\r\nContent-Disposition: form-data; name=\"files.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\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\"\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\r\nContent-Disposition: form-data; name=\"files.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\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",
"sourceMetadata": {
"repoUrl": "https://github.com/dust-tt/skills",
"filePath": "support/SKILL.md"
},
"lastReinforcementAnalysisAt": "<string>",
"requestedSpaceIds": [
"<string>"
],
"fileAttachments": [
{
"fileId": "<string>",
"fileName": "<string>"
}
],
"canWrite": true,
"isDefault": true,
"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"
}
}
}
}
],
"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",
"sourceMetadata": {
"repoUrl": "https://github.com/dust-tt/skills",
"filePath": "support/SKILL.md"
},
"lastReinforcementAnalysisAt": "<string>",
"requestedSpaceIds": [
"<string>"
],
"fileAttachments": [
{
"fileId": "<string>",
"fileName": "<string>"
}
],
"canWrite": true,
"isDefault": true,
"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"
}
}
}
}
],
"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>"
}
]
}Skills
Import skills from uploaded files
Imports skills from uploaded files or ZIP archives into the workspace.
POST
/
api
/
v1
/
w
/
{wId}
/
skills
Import skills from uploaded files
curl --request POST \
--url https://dust.tt/api/v1/w/{wId}/skills \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'files=<string>' \
--form 'names=<string>' \
--form editors=jsmith@example.com \
--form files.items='@example-file'import requests
url = "https://dust.tt/api/v1/w/{wId}/skills"
files = { "files.items": ("example-file", open("example-file", "rb")) }
payload = {
"files": "<string>",
"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');
form.append('files.items', '{
"fileName": "example-file"
}');
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\"\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\r\nContent-Disposition: form-data; name=\"files.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\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\"\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\r\nContent-Disposition: form-data; name=\"files.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\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\"\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\r\nContent-Disposition: form-data; name=\"files.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\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\"\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\r\nContent-Disposition: form-data; name=\"files.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\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",
"sourceMetadata": {
"repoUrl": "https://github.com/dust-tt/skills",
"filePath": "support/SKILL.md"
},
"lastReinforcementAnalysisAt": "<string>",
"requestedSpaceIds": [
"<string>"
],
"fileAttachments": [
{
"fileId": "<string>",
"fileName": "<string>"
}
],
"canWrite": true,
"isDefault": true,
"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"
}
}
}
}
],
"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",
"sourceMetadata": {
"repoUrl": "https://github.com/dust-tt/skills",
"filePath": "support/SKILL.md"
},
"lastReinforcementAnalysisAt": "<string>",
"requestedSpaceIds": [
"<string>"
],
"fileAttachments": [
{
"fileId": "<string>",
"fileName": "<string>"
}
],
"canWrite": true,
"isDefault": true,
"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"
}
}
}
}
],
"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
multipart/form-data
Skill files or ZIP archives to import.
Optional skill names to import from the uploaded files.
Conflict handling strategy. Defaults to error.
Available options:
error, skip, override Optional editor email addresses to add to imported or updated skills. Editors must be active workspace builders. 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.
Available options:
editors, workspace_users, users_and_agents ⌘I