curl --request GET \
--url https://api.sumvin.com/v0/user/me/mandate-key \
--header 'x-juno-jwt: <api-key>'import requests
url = "https://api.sumvin.com/v0/user/me/mandate-key"
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/user/me/mandate-key', 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/user/me/mandate-key",
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/user/me/mandate-key"
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/user/me/mandate-key")
.header("x-juno-jwt", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sumvin.com/v0/user/me/mandate-key")
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": {
"self": {
"href": "/v0/user/me/mandate-key"
}
},
"stage": "not_provisioned"
}{
"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": {}
}
]
}{
"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"
}Check mandate key setup
Report how far setting up the signed-in account holder’s mandate key has got. The mandate key is the wallet key they sign spending mandates with; it can sign once it has been added as an owner of their smart wallet.
stage is one of:
not_provisioned: there is no wallet key for this account yet.awaiting_claim: the wallet key exists but must be claimed first.pending: setup is under way.active: the key can sign.failed: the last attempt failed and may be retried;error_codeanderror_reasonsay why.blocked: setup cannot proceed;blocked_reasonsays why.
Only active is settled. While pending, check again every few seconds, and wait longer between attempts after a 429. Stop checking on blocked or not_provisioned, and claim the key on awaiting_claim.
Call this from the account holder’s own signed-in browser session. Personal access tokens, agent tokens and connector access tokens are refused.
curl --request GET \
--url https://api.sumvin.com/v0/user/me/mandate-key \
--header 'x-juno-jwt: <api-key>'import requests
url = "https://api.sumvin.com/v0/user/me/mandate-key"
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/user/me/mandate-key', 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/user/me/mandate-key",
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/user/me/mandate-key"
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/user/me/mandate-key")
.header("x-juno-jwt", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sumvin.com/v0/user/me/mandate-key")
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": {
"self": {
"href": "/v0/user/me/mandate-key"
}
},
"stage": "not_provisioned"
}{
"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": {}
}
]
}{
"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"
}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
Network to report on. Defaults to the account's primary network. A signing key is only set up on the primary network, so on another supported network it does not become active and usually reports blocked. A network the service does not operate on is a 400.
Response
Where mandate key setup stands
Where setting up the account holder's mandate key stands.
The mandate key is the wallet key the account holder signs spending mandates with. Before it can sign, it has to be added as an owner of their smart wallet.
HAL-style hypermedia links for navigation and available actions.
Show child attributes
Show child attributes
How far setup has got. active is the only settled stage: the key can sign. pending: setup is under way — check again every few seconds. failed: the last attempt failed and may be retried; error_code and error_reason say why. blocked: setup cannot proceed yet; blocked_reason says why — stop checking. awaiting_claim: the wallet key exists but has not been claimed; claim it first. not_provisioned: there is no wallet key for this account yet.
not_provisioned, awaiting_claim, pending, active, failed, blocked Why setup cannot proceed, set only when stage is blocked. activation_disabled: mandate key setup is not available to this account. kyc_not_verified: identity verification is not complete. chain_not_deployable: a mandate key is never set up on the requested network. safe_not_deployed: the smart wallet has not been created yet. address_conflict: this key's address is already used on the account in another role.
activation_disabled, kyc_not_verified, chain_not_deployable, safe_not_deployed, address_conflict The mandate key's address, lowercased. Absent until a wallet key exists.
The network this reading is for. Absent when the account has no network a smart wallet can be set up on.
1329, 1328 Machine-readable cause of the last failed attempt. Set only when stage is failed.
Human-readable cause of the last failed attempt. Set only when stage is failed.