Publish a package, or a new version of one
curl --request POST \
--url https://api.doers.sh/v2/packages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"files": [
{
"path": "<string>",
"content": "<string>"
}
],
"name": "<string>",
"slug": "<string>",
"changelog": "",
"emoji": "<string>",
"permissions": [],
"summary": ""
}
'import requests
url = "https://api.doers.sh/v2/packages"
payload = {
"files": [
{
"path": "<string>",
"content": "<string>"
}
],
"name": "<string>",
"slug": "<string>",
"changelog": "",
"emoji": "<string>",
"permissions": [],
"summary": ""
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
files: [{path: '<string>', content: '<string>'}],
name: '<string>',
slug: '<string>',
changelog: '',
emoji: '<string>',
permissions: [],
summary: ''
})
};
fetch('https://api.doers.sh/v2/packages', 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://api.doers.sh/v2/packages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'files' => [
[
'path' => '<string>',
'content' => '<string>'
]
],
'name' => '<string>',
'slug' => '<string>',
'changelog' => '',
'emoji' => '<string>',
'permissions' => [
],
'summary' => ''
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api.doers.sh/v2/packages"
payload := strings.NewReader("{\n \"files\": [\n {\n \"path\": \"<string>\",\n \"content\": \"<string>\"\n }\n ],\n \"name\": \"<string>\",\n \"slug\": \"<string>\",\n \"changelog\": \"\",\n \"emoji\": \"<string>\",\n \"permissions\": [],\n \"summary\": \"\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.doers.sh/v2/packages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"files\": [\n {\n \"path\": \"<string>\",\n \"content\": \"<string>\"\n }\n ],\n \"name\": \"<string>\",\n \"slug\": \"<string>\",\n \"changelog\": \"\",\n \"emoji\": \"<string>\",\n \"permissions\": [],\n \"summary\": \"\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.doers.sh/v2/packages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"files\": [\n {\n \"path\": \"<string>\",\n \"content\": \"<string>\"\n }\n ],\n \"name\": \"<string>\",\n \"slug\": \"<string>\",\n \"changelog\": \"\",\n \"emoji\": \"<string>\",\n \"permissions\": [],\n \"summary\": \"\"\n}"
response = http.request(request)
puts response.read_body{
"package": {
"id": "<string>",
"kind": "agent",
"slug": "<string>",
"name": "<string>",
"emoji": "<string>",
"summary": "<string>",
"latestVersion": 0,
"fileCount": 0,
"published": true,
"createdAt": 123,
"updatedAt": 123
},
"url": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}Packages
Publish a package, or a new version of one
Publishing to a slug you already used adds a version to that package rather than creating a second one, and un-retires it if it had been taken down. The public address is returned once, on the first publish: only a hash of its token is stored.
POST
/
v2
/
packages
Publish a package, or a new version of one
curl --request POST \
--url https://api.doers.sh/v2/packages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"files": [
{
"path": "<string>",
"content": "<string>"
}
],
"name": "<string>",
"slug": "<string>",
"changelog": "",
"emoji": "<string>",
"permissions": [],
"summary": ""
}
'import requests
url = "https://api.doers.sh/v2/packages"
payload = {
"files": [
{
"path": "<string>",
"content": "<string>"
}
],
"name": "<string>",
"slug": "<string>",
"changelog": "",
"emoji": "<string>",
"permissions": [],
"summary": ""
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
files: [{path: '<string>', content: '<string>'}],
name: '<string>',
slug: '<string>',
changelog: '',
emoji: '<string>',
permissions: [],
summary: ''
})
};
fetch('https://api.doers.sh/v2/packages', 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://api.doers.sh/v2/packages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'files' => [
[
'path' => '<string>',
'content' => '<string>'
]
],
'name' => '<string>',
'slug' => '<string>',
'changelog' => '',
'emoji' => '<string>',
'permissions' => [
],
'summary' => ''
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api.doers.sh/v2/packages"
payload := strings.NewReader("{\n \"files\": [\n {\n \"path\": \"<string>\",\n \"content\": \"<string>\"\n }\n ],\n \"name\": \"<string>\",\n \"slug\": \"<string>\",\n \"changelog\": \"\",\n \"emoji\": \"<string>\",\n \"permissions\": [],\n \"summary\": \"\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.doers.sh/v2/packages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"files\": [\n {\n \"path\": \"<string>\",\n \"content\": \"<string>\"\n }\n ],\n \"name\": \"<string>\",\n \"slug\": \"<string>\",\n \"changelog\": \"\",\n \"emoji\": \"<string>\",\n \"permissions\": [],\n \"summary\": \"\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.doers.sh/v2/packages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"files\": [\n {\n \"path\": \"<string>\",\n \"content\": \"<string>\"\n }\n ],\n \"name\": \"<string>\",\n \"slug\": \"<string>\",\n \"changelog\": \"\",\n \"emoji\": \"<string>\",\n \"permissions\": [],\n \"summary\": \"\"\n}"
response = http.request(request)
puts response.read_body{
"package": {
"id": "<string>",
"kind": "agent",
"slug": "<string>",
"name": "<string>",
"emoji": "<string>",
"summary": "<string>",
"latestVersion": 0,
"fileCount": 0,
"published": true,
"createdAt": 123,
"updatedAt": 123
},
"url": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}Authorizations
A pc_… token generated from Settings > API & MCP.
Body
application/json
Required array length:
1 - 64 elementsShow child attributes
Show child attributes
An agent and its notes, a note on its own, or a folder of them.
Available options:
agent, note, folder Required string length:
1 - 200Required string length:
1 - 80Maximum string length:
10000Maximum string length:
200Chosen explicitly. Omitted means unlicensed: nothing is licensed on the author's behalf.
Available options:
mit, cc-by-4.0 Operation ids this version asks to be allowed to call, by name (listTasks). Enforced by the server at every execution boundary, never by the package. An id this API does not have is a 400.
Maximum array length:
32Maximum string length:
10000