curl --request GET \
--url https://api.sumvin.com/v0/agent-identities \
--header 'x-juno-jwt: <api-key>'import requests
url = "https://api.sumvin.com/v0/agent-identities"
headers = {"x-juno-jwt": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-juno-jwt': '<api-key>'}};
fetch('https://api.sumvin.com/v0/agent-identities', 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.sumvin.com/v0/agent-identities",
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-juno-jwt: <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.sumvin.com/v0/agent-identities"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-juno-jwt", "<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.sumvin.com/v0/agent-identities")
.header("x-juno-jwt", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sumvin.com/v0/agent-identities")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-juno-jwt"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"_links": {
"disconnect": {
"description": "Disconnect one of the listed agents.",
"href": "/v0/agent-identities/{id}",
"method": "DELETE",
"templated": true
},
"first": {
"href": "/v0/agent-identities?offset=0&limit=50"
},
"last": {
"href": "/v0/agent-identities?offset=0&limit=50"
},
"self": {
"href": "/v0/agent-identities?offset=0&limit=50"
}
},
"data": [
{
"client_id": "app_2rKq8vN4TzYb",
"created_at": 1704067200000,
"generation": 0,
"id": "agid-4f9c1d2e8a7b40f1a3c5e7d9b1f3a5c7",
"status": "active"
}
],
"limit": 50,
"offset": 0,
"total": 1
}{
"detail": "No wallet found with ID 12345 for this user.",
"error_code": "WAL-404-001",
"instance": "/v0/wallets/12345",
"status": 404,
"title": "Wallet Not Found",
"trace_id": "abc123-def456-ghi789",
"type": "https://api.sumvin.com/errors/wal-404-001"
}{
"detail": "No wallet found with ID 12345 for this user.",
"error_code": "WAL-404-001",
"instance": "/v0/wallets/12345",
"status": 404,
"title": "Wallet Not Found",
"trace_id": "abc123-def456-ghi789",
"type": "https://api.sumvin.com/errors/wal-404-001"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}List connected agents
List the agents connected to the calling user’s account. Each entry carries its identifier, the application it was authorised for, whether it is still live, and when it was connected. Nothing about the connection’s key is returned. Only the account owner may list their connected agents — from the Sumvin app or the CLI. Anything acting on their behalf is refused, so one connected agent cannot discover another.
curl --request GET \
--url https://api.sumvin.com/v0/agent-identities \
--header 'x-juno-jwt: <api-key>'import requests
url = "https://api.sumvin.com/v0/agent-identities"
headers = {"x-juno-jwt": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-juno-jwt': '<api-key>'}};
fetch('https://api.sumvin.com/v0/agent-identities', 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.sumvin.com/v0/agent-identities",
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-juno-jwt: <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.sumvin.com/v0/agent-identities"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-juno-jwt", "<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.sumvin.com/v0/agent-identities")
.header("x-juno-jwt", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sumvin.com/v0/agent-identities")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-juno-jwt"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"_links": {
"disconnect": {
"description": "Disconnect one of the listed agents.",
"href": "/v0/agent-identities/{id}",
"method": "DELETE",
"templated": true
},
"first": {
"href": "/v0/agent-identities?offset=0&limit=50"
},
"last": {
"href": "/v0/agent-identities?offset=0&limit=50"
},
"self": {
"href": "/v0/agent-identities?offset=0&limit=50"
}
},
"data": [
{
"client_id": "app_2rKq8vN4TzYb",
"created_at": 1704067200000,
"generation": 0,
"id": "agid-4f9c1d2e8a7b40f1a3c5e7d9b1f3a5c7",
"status": "active"
}
],
"limit": 50,
"offset": 0,
"total": 1
}{
"detail": "No wallet found with ID 12345 for this user.",
"error_code": "WAL-404-001",
"instance": "/v0/wallets/12345",
"status": 404,
"title": "Wallet Not Found",
"trace_id": "abc123-def456-ghi789",
"type": "https://api.sumvin.com/errors/wal-404-001"
}{
"detail": "No wallet found with ID 12345 for this user.",
"error_code": "WAL-404-001",
"instance": "/v0/wallets/12345",
"status": 404,
"title": "Wallet Not Found",
"trace_id": "abc123-def456-ghi789",
"type": "https://api.sumvin.com/errors/wal-404-001"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Session JWT from the identity provider that signed the user in — Dynamic Labs, Privy, or Clerk (consumer sign-in). Send it in the x-juno-jwt header on every authenticated request. An Authorization: Bearer <jwt> header carrying the same JWT is also accepted, and takes precedence when both are present.
Headers
Tenant org ID for multi-tenant auth
Controls how timestamp fields are serialized in JSON response bodies.
Default (header omitted or any other value): epoch milliseconds as integers.
iso8601: UTC ISO 8601 strings of the form YYYY-MM-DDTHH:MM:SSZ.
Example: with X-Timestamp-Format: iso8601, the field value 1704067200000 becomes "2024-01-01T00:00:00Z".
Affected fields (recursively, in dicts and arrays): any field whose name ends in _at, plus the literal field names timestamp, period_start, and period_end. All other fields are passed through unchanged.
Only iso8601 is recognized. Any other value (or omitting the header) yields the default epoch-ms representation; the server does not reject unknown values, so this is documented as an example rather than an enum to keep generated clients permissive.
"iso8601"
Query Parameters
Return only connections in this state. Whether a connected agent is being set up, live, could not be set up, or has been disconnected.
pending, active, failed, retired Pagination offset
x >= 0Pagination limit
1 <= x <= 100Response
Connected agents retrieved
The agents connected to the calling user's account.
HAL-style hypermedia links for navigation and available actions.
Show child attributes
Show child attributes
Page of connected agents.
Show child attributes
Show child attributes
Number of items skipped from the beginning of the result set.
Maximum number of items returned per page (1-100).
Total number of items across all pages.