curl --request GET \
--url https://api.sumvin.com/v0/mandate-ceremonies/current/statusimport requests
url = "https://api.sumvin.com/v0/mandate-ceremonies/current/status"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.sumvin.com/v0/mandate-ceremonies/current/status', 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/mandate-ceremonies/current/status",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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/mandate-ceremonies/current/status"
req, _ := http.NewRequest("GET", url, nil)
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/mandate-ceremonies/current/status")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sumvin.com/v0/mandate-ceremonies/current/status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"_links": {
"self": {
"href": "/v0/mandate-ceremonies/current/status"
}
},
"expires_at": 1757337600000,
"status": "proposed"
}{
"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 where a mandate approval stands
Report whether the account holder has answered an approval link yet, and when it lapses. Send the ticket from the link in the x-sumvin-ceremony-ticket header. The ticket is a secret, so never put it in a URL.
No sign-in is needed. The ticket is enough to learn where the approval stands and nothing more: the authorisation itself, and the decision, stay behind the account holder’s own session. This endpoint can be called from any origin, without credentials, so a page embedded elsewhere can watch for the outcome.
status is one of:
proposed: still waiting for the account holder.stamped: they authorised it.declined: they refused it, or it was withdrawn before they answered.expired: the window closed with no answer.
stamped, declined and expired are final, so stop checking once one arrives. While the approval is proposed, check every few seconds, and wait longer between attempts after a 429.
A 404 means the ticket is unknown, including a link that a newer request for the same mandate has replaced. Use the newest link.
Send x-timestamp-format: iso8601 to receive expires_at as an ISO 8601 string instead of epoch milliseconds.
curl --request GET \
--url https://api.sumvin.com/v0/mandate-ceremonies/current/statusimport requests
url = "https://api.sumvin.com/v0/mandate-ceremonies/current/status"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.sumvin.com/v0/mandate-ceremonies/current/status', 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/mandate-ceremonies/current/status",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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/mandate-ceremonies/current/status"
req, _ := http.NewRequest("GET", url, nil)
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/mandate-ceremonies/current/status")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sumvin.com/v0/mandate-ceremonies/current/status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"_links": {
"self": {
"href": "/v0/mandate-ceremonies/current/status"
}
},
"expires_at": 1757337600000,
"status": "proposed"
}{
"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"
}Headers
Ticket from the approval link. Treat it as a secret: it addresses a live spending authorisation, carries exactly one decision, and stays usable until that decision is made or the approval window closes.
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"
Response
Where the approval stands
Where an approval stands, and nothing that could be signed.
HAL-style hypermedia links for navigation.
Show child attributes
Show child attributes
Where the approval stands. proposed is still awaiting the account holder. stamped means they authorised it, declined means they refused it or it was withdrawn first, and expired means the window closed with no answer. The last three are final.
proposed, stamped, declined, expired When this approval lapses, in epoch milliseconds. After it, nothing can be signed.