v1
Analyze Bundle
Parse and analyze a bundle source, returning a non-destructive preview.
POST
/
v1
/
bundles
/
analyze
Analyze Bundle
curl --request POST \
--url https://api.example.com/v1/bundles/analyze \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"source": "<string>",
"source_url": "<string>"
}
'import requests
url = "https://api.example.com/v1/bundles/analyze"
payload = {
"source": "<string>",
"source_url": "<string>"
}
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({source: '<string>', source_url: '<string>'})
};
fetch('https://api.example.com/v1/bundles/analyze', 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.example.com/v1/bundles/analyze",
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([
'source' => '<string>',
'source_url' => '<string>'
]),
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.example.com/v1/bundles/analyze"
payload := strings.NewReader("{\n \"source\": \"<string>\",\n \"source_url\": \"<string>\"\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.example.com/v1/bundles/analyze")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"source\": \"<string>\",\n \"source_url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/bundles/analyze")
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 \"source\": \"<string>\",\n \"source_url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"bundle": {
"name": "<string>",
"agents": [
{
"key": "<string>",
"name": "<string>",
"instruction": "",
"mcps": [
"<string>"
],
"model": "<string>",
"skills": [
"<string>"
]
}
],
"automations": [
{
"agent": "<string>",
"cron": "<string>",
"key": "<string>",
"prompt": "<string>",
"enabled": false,
"timezone": "UTC",
"type": "cron"
}
],
"channels": [
{
"agent": "<string>",
"key": "<string>",
"name": "<string>",
"bindings": {},
"enabled": false,
"prompt": "Handle the incoming message: {{ message_text }}",
"type": "telegram"
}
],
"description": "",
"display_name": "<string>",
"mcps": [
{
"json_spec": {},
"key": "<string>",
"name": "<string>",
"bindings": {}
}
],
"metadata": {
"capabilities": [
"<string>"
],
"category": "<string>",
"developer": "<string>",
"icon": "<string>",
"privacy_url": "<string>",
"terms_url": "<string>",
"website": "<string>"
},
"policies": [
{
"key": "<string>",
"target": "<string>",
"condition": "<string>",
"enabled": true,
"message": "<string>",
"params": {},
"priority": 0,
"subject": "workspace"
}
],
"schema_version": "0.1.0",
"setup": [
{
"key": "<string>",
"label": "<string>",
"default": null,
"help": "<string>",
"max": 123,
"min": 123,
"options": [
"<string>"
],
"required": false,
"type": "string"
}
],
"skills": [
{
"key": "<string>",
"name": "<string>",
"content": "<string>",
"source_type": "content",
"source_url": "<string>"
}
]
},
"installable": true,
"entities": [
{
"key": "<string>",
"name": "<string>",
"detail": "<string>"
}
],
"issues": [
{
"message": "<string>",
"entity_key": "<string>"
}
],
"setup": [
{
"key": "<string>",
"label": "<string>",
"default": null,
"help": "<string>",
"max": 123,
"min": 123,
"options": [
"<string>"
],
"required": false,
"type": "string"
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"ctx": {},
"input": "<unknown>"
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Analyze a bundle into an import preview.
Provide exactly one of source (pasted text) or source_url (a URL the
server fetches behind the SSRF guard). source_url is what a landing-page
deep-link (/bundles/import?src=<url>) uses for one-click installs.
Response
Successful Response
What the wizard renders before the user commits to installing.
The canonical, fully-inlined package object.
Show child attributes
Show child attributes
True when there are no blocking issues (setup may still be required).
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
⌘I
Analyze Bundle
curl --request POST \
--url https://api.example.com/v1/bundles/analyze \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"source": "<string>",
"source_url": "<string>"
}
'import requests
url = "https://api.example.com/v1/bundles/analyze"
payload = {
"source": "<string>",
"source_url": "<string>"
}
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({source: '<string>', source_url: '<string>'})
};
fetch('https://api.example.com/v1/bundles/analyze', 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.example.com/v1/bundles/analyze",
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([
'source' => '<string>',
'source_url' => '<string>'
]),
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.example.com/v1/bundles/analyze"
payload := strings.NewReader("{\n \"source\": \"<string>\",\n \"source_url\": \"<string>\"\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.example.com/v1/bundles/analyze")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"source\": \"<string>\",\n \"source_url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/bundles/analyze")
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 \"source\": \"<string>\",\n \"source_url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"bundle": {
"name": "<string>",
"agents": [
{
"key": "<string>",
"name": "<string>",
"instruction": "",
"mcps": [
"<string>"
],
"model": "<string>",
"skills": [
"<string>"
]
}
],
"automations": [
{
"agent": "<string>",
"cron": "<string>",
"key": "<string>",
"prompt": "<string>",
"enabled": false,
"timezone": "UTC",
"type": "cron"
}
],
"channels": [
{
"agent": "<string>",
"key": "<string>",
"name": "<string>",
"bindings": {},
"enabled": false,
"prompt": "Handle the incoming message: {{ message_text }}",
"type": "telegram"
}
],
"description": "",
"display_name": "<string>",
"mcps": [
{
"json_spec": {},
"key": "<string>",
"name": "<string>",
"bindings": {}
}
],
"metadata": {
"capabilities": [
"<string>"
],
"category": "<string>",
"developer": "<string>",
"icon": "<string>",
"privacy_url": "<string>",
"terms_url": "<string>",
"website": "<string>"
},
"policies": [
{
"key": "<string>",
"target": "<string>",
"condition": "<string>",
"enabled": true,
"message": "<string>",
"params": {},
"priority": 0,
"subject": "workspace"
}
],
"schema_version": "0.1.0",
"setup": [
{
"key": "<string>",
"label": "<string>",
"default": null,
"help": "<string>",
"max": 123,
"min": 123,
"options": [
"<string>"
],
"required": false,
"type": "string"
}
],
"skills": [
{
"key": "<string>",
"name": "<string>",
"content": "<string>",
"source_type": "content",
"source_url": "<string>"
}
]
},
"installable": true,
"entities": [
{
"key": "<string>",
"name": "<string>",
"detail": "<string>"
}
],
"issues": [
{
"message": "<string>",
"entity_key": "<string>"
}
],
"setup": [
{
"key": "<string>",
"label": "<string>",
"default": null,
"help": "<string>",
"max": 123,
"min": 123,
"options": [
"<string>"
],
"required": false,
"type": "string"
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"ctx": {},
"input": "<unknown>"
}
]
}