curl --request GET \
--url https://api.example.com/api/marketplace/installed \
--header 'x-api-key: <api-key>'import requests
url = "https://api.example.com/api/marketplace/installed"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.example.com/api/marketplace/installed', 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/api/marketplace/installed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/marketplace/installed"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/api/marketplace/installed")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/marketplace/installed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"installed": [
{
"compat": {
"reason": "<string>",
"status": "<string>"
},
"delivery": "<string>",
"incompatible_newer": "<string>",
"installed_at": "<string>",
"items": [
{
"kind": "<string>",
"name": "<string>"
}
],
"latest": "<string>",
"missing_upstream": true,
"ref": "<string>",
"route_mounts": {},
"source": "<string>",
"update_available": true,
"version": "<string>"
}
],
"quarantined": [
{
"name": "<string>",
"reason": "<string>"
}
]
}
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}List installed marketplace plugins
The installed inventory + the boot-quarantined plugins, in one body:
{"installed": [...], "quarantined": [{"name", "reason"}, ...]}.
Each installed row carries the update picture computed from the registry’s
version rows against the RUNNING contract: latest (newest published
version, or null with none), update_available (a newer COMPATIBLE
version exists — an incompatible newer version never advertises as an
update), incompatible_newer (the newest such blocked version, so “an
update exists but needs a newer core” is visible, or null), and
compat — the live {status, reason} verdict of the row’s installed
distribution against the running contract. A per-row not-found — the
upstream listing vanished or was suspended — is row STATE, not a route
failure: that row answers latest: null, update_available: false,
missing_upstream: true, so one dead listing never fails the whole
inventory. A transport/garbled-upstream failure still surfaces as a 502,
and a garbled LOCAL row (an unparsable stored version) as a 500 — serving
rows without their update picture would be a silent degrade of the spec’d
shape.
Each row also carries items — the {kind, name} of every item its
stored spec provides (from LOCAL truth, never the registry). Studio joins
these against the manifest’s mcp entry titles to render an
installer-written entry read-only.
Each row also carries route_mounts — the persisted {item_name: base}
mount the row is installed at (empty means every item at its declared base),
so Studio seeds its update flow and renders routes at the ACTUAL mounted base.
Each row also carries delivery — package for a pip-installed plugin,
descriptor for a descriptor-only plugin whose stored spec names no package.
quarantined mirrors the boot pass’s plugin-quarantine registry — the
plugins this worker SKIPPED (incompatible or import-broken) with the
human-readable reason each.
curl --request GET \
--url https://api.example.com/api/marketplace/installed \
--header 'x-api-key: <api-key>'import requests
url = "https://api.example.com/api/marketplace/installed"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.example.com/api/marketplace/installed', 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/api/marketplace/installed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/marketplace/installed"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/api/marketplace/installed")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/marketplace/installed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"installed": [
{
"compat": {
"reason": "<string>",
"status": "<string>"
},
"delivery": "<string>",
"incompatible_newer": "<string>",
"installed_at": "<string>",
"items": [
{
"kind": "<string>",
"name": "<string>"
}
],
"latest": "<string>",
"missing_upstream": true,
"ref": "<string>",
"route_mounts": {},
"source": "<string>",
"update_available": true,
"version": "<string>"
}
],
"quarantined": [
{
"name": "<string>",
"reason": "<string>"
}
]
}
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}
