curl --request POST \
--url https://api.orbit.devotel.io/api/v1/marketplace \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "agent_template",
"name": "Tier-1 support triage",
"description": "Answers billing and delivery questions, escalates everything else to a human.",
"config": {
"systemPrompt": "You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.",
"model": "claude-sonnet-4-6",
"tools": [
"search_knowledge_base",
"create_ticket"
]
}
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/marketplace"
payload = {
"type": "agent_template",
"name": "Tier-1 support triage",
"description": "Answers billing and delivery questions, escalates everything else to a human.",
"config": {
"systemPrompt": "You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.",
"model": "claude-sonnet-4-6",
"tools": ["search_knowledge_base", "create_ticket"]
}
}
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({
type: 'agent_template',
name: 'Tier-1 support triage',
description: 'Answers billing and delivery questions, escalates everything else to a human.',
config: {
systemPrompt: 'You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.',
model: 'claude-sonnet-4-6',
tools: ['search_knowledge_base', 'create_ticket']
}
})
};
fetch('https://api.orbit.devotel.io/api/v1/marketplace', 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.orbit.devotel.io/api/v1/marketplace",
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([
'type' => 'agent_template',
'name' => 'Tier-1 support triage',
'description' => 'Answers billing and delivery questions, escalates everything else to a human.',
'config' => [
'systemPrompt' => 'You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.',
'model' => 'claude-sonnet-4-6',
'tools' => [
'search_knowledge_base',
'create_ticket'
]
]
]),
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.orbit.devotel.io/api/v1/marketplace"
payload := strings.NewReader("{\n \"type\": \"agent_template\",\n \"name\": \"Tier-1 support triage\",\n \"description\": \"Answers billing and delivery questions, escalates everything else to a human.\",\n \"config\": {\n \"systemPrompt\": \"You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.\",\n \"model\": \"claude-sonnet-4-6\",\n \"tools\": [\n \"search_knowledge_base\",\n \"create_ticket\"\n ]\n }\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.orbit.devotel.io/api/v1/marketplace")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"agent_template\",\n \"name\": \"Tier-1 support triage\",\n \"description\": \"Answers billing and delivery questions, escalates everything else to a human.\",\n \"config\": {\n \"systemPrompt\": \"You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.\",\n \"model\": \"claude-sonnet-4-6\",\n \"tools\": [\n \"search_knowledge_base\",\n \"create_ticket\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/marketplace")
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 \"type\": \"agent_template\",\n \"name\": \"Tier-1 support triage\",\n \"description\": \"Answers billing and delivery questions, escalates everything else to a human.\",\n \"config\": {\n \"systemPrompt\": \"You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.\",\n \"model\": \"claude-sonnet-4-6\",\n \"tools\": [\n \"search_knowledge_base\",\n \"create_ticket\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "<string>",
"status": 429,
"retry_after": 2
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}Create a marketplace listing
Publish something your organization built to the developer marketplace. type and name are required. The listing starts in draft and stays out of the public catalog until you submit it for review and a platform reviewer approves it. config is the payload another tenant receives on install, and it is readable by anyone once the listing is live — never put API keys or other secrets in it. Requires the owner, admin, or developer role.
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/marketplace \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "agent_template",
"name": "Tier-1 support triage",
"description": "Answers billing and delivery questions, escalates everything else to a human.",
"config": {
"systemPrompt": "You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.",
"model": "claude-sonnet-4-6",
"tools": [
"search_knowledge_base",
"create_ticket"
]
}
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/marketplace"
payload = {
"type": "agent_template",
"name": "Tier-1 support triage",
"description": "Answers billing and delivery questions, escalates everything else to a human.",
"config": {
"systemPrompt": "You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.",
"model": "claude-sonnet-4-6",
"tools": ["search_knowledge_base", "create_ticket"]
}
}
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({
type: 'agent_template',
name: 'Tier-1 support triage',
description: 'Answers billing and delivery questions, escalates everything else to a human.',
config: {
systemPrompt: 'You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.',
model: 'claude-sonnet-4-6',
tools: ['search_knowledge_base', 'create_ticket']
}
})
};
fetch('https://api.orbit.devotel.io/api/v1/marketplace', 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.orbit.devotel.io/api/v1/marketplace",
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([
'type' => 'agent_template',
'name' => 'Tier-1 support triage',
'description' => 'Answers billing and delivery questions, escalates everything else to a human.',
'config' => [
'systemPrompt' => 'You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.',
'model' => 'claude-sonnet-4-6',
'tools' => [
'search_knowledge_base',
'create_ticket'
]
]
]),
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.orbit.devotel.io/api/v1/marketplace"
payload := strings.NewReader("{\n \"type\": \"agent_template\",\n \"name\": \"Tier-1 support triage\",\n \"description\": \"Answers billing and delivery questions, escalates everything else to a human.\",\n \"config\": {\n \"systemPrompt\": \"You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.\",\n \"model\": \"claude-sonnet-4-6\",\n \"tools\": [\n \"search_knowledge_base\",\n \"create_ticket\"\n ]\n }\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.orbit.devotel.io/api/v1/marketplace")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"agent_template\",\n \"name\": \"Tier-1 support triage\",\n \"description\": \"Answers billing and delivery questions, escalates everything else to a human.\",\n \"config\": {\n \"systemPrompt\": \"You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.\",\n \"model\": \"claude-sonnet-4-6\",\n \"tools\": [\n \"search_knowledge_base\",\n \"create_ticket\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/marketplace")
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 \"type\": \"agent_template\",\n \"name\": \"Tier-1 support triage\",\n \"description\": \"Answers billing and delivery questions, escalates everything else to a human.\",\n \"config\": {\n \"systemPrompt\": \"You are a tier-1 support agent. Answer billing and delivery questions from the knowledge base; hand off anything else.\",\n \"model\": \"claude-sonnet-4-6\",\n \"tools\": [\n \"search_knowledge_base\",\n \"create_ticket\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "<string>",
"status": 429,
"retry_after": 2
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}Authorizations
Dashboard JWT token from Clerk
Headers
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
1 - 255Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.
true, false Body
What you are publishing: agent_template, flow_template, integration, or agent_tool.
Listing name shown in the marketplace catalog.
What the listing does and who it is for, shown on the listing detail page.
The installable payload — the agent definition, flow graph, integration settings, or tool definition. Publicly readable once the listing is published, so it must not contain secrets.
Response
The created listing in draft status, wrapped in the standard { data, meta } envelope. Use data.id to update, submit, or delete it.
The created listing in draft status, wrapped in the standard { data, meta } envelope. Use data.id to update, submit, or delete it.