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": "compatible"
},
"delivery": "package",
"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>"
}
]
}
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}List installed marketplace plugins
The installed inventory.
Shaped {"installed": [...]}.
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 {status, reason} verdict of the row’s declared
tai42-contract range against the running contract (a row the plugin layer
leaves out for that range reads incompatible with the same reason). 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 (a stored spec that no longer validates, a malformed
stored ref, an unparsable stored version) as a 500 naming the row — 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.
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": "compatible"
},
"delivery": "package",
"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>"
}
]
}
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}
