Orders
Exchange a signed SIWE message for a short-lived scoped API key
Consumes the challenge nonce, verifies the signature, resolves the Kairos user that owns the wallet, and mints an API-key triple with scopes trade:execute, trade:read, position:read. Unauthenticated.
Expiry and rotation. The key expires at expires_at (RFC3339 UTC), EXTERNAL_SIGNING_SIWE_KEY_TTL_SECS after minting (24h by default); after that every request with it is rejected as 401. The key is bound to the signing wallet, and minting one revokes every other active key of the same user bound to that wallet, so only the newest SIWE key per wallet works. Re-run challenge + verify before expires_at and switch to the new triple immediately. POST /v2/wallets/revoke revokes all of a wallet’s SIWE keys at once.
POST
/
v2
/
auth
/
siwe
/
verify
Exchange a signed SIWE message for a short-lived scoped API key
curl --request POST \
--url https://execution.kairos.trade/v2/auth/siwe/verify \
--header 'Content-Type: application/json' \
--data '
{
"message": "<string>",
"signature_hex": "<string>"
}
'import requests
url = "https://execution.kairos.trade/v2/auth/siwe/verify"
payload = {
"message": "<string>",
"signature_hex": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({message: '<string>', signature_hex: '<string>'})
};
fetch('https://execution.kairos.trade/v2/auth/siwe/verify', 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://execution.kairos.trade/v2/auth/siwe/verify",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'message' => '<string>',
'signature_hex' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://execution.kairos.trade/v2/auth/siwe/verify"
payload := strings.NewReader("{\n \"message\": \"<string>\",\n \"signature_hex\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://execution.kairos.trade/v2/auth/siwe/verify")
.header("Content-Type", "application/json")
.body("{\n \"message\": \"<string>\",\n \"signature_hex\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://execution.kairos.trade/v2/auth/siwe/verify")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"message\": \"<string>\",\n \"signature_hex\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"client_id": "<string>",
"api_key": "<string>",
"api_secret": "<string>",
"scopes": [
"<string>"
],
"address": "<string>",
"expires_at": "2023-11-07T05:31:56Z"
}{
"error": "Insufficient scope",
"code": "<string>"
}{
"error": "Insufficient scope",
"code": "<string>"
}Body
application/json
Was this page helpful?
⌘I
Exchange a signed SIWE message for a short-lived scoped API key
curl --request POST \
--url https://execution.kairos.trade/v2/auth/siwe/verify \
--header 'Content-Type: application/json' \
--data '
{
"message": "<string>",
"signature_hex": "<string>"
}
'import requests
url = "https://execution.kairos.trade/v2/auth/siwe/verify"
payload = {
"message": "<string>",
"signature_hex": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({message: '<string>', signature_hex: '<string>'})
};
fetch('https://execution.kairos.trade/v2/auth/siwe/verify', 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://execution.kairos.trade/v2/auth/siwe/verify",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'message' => '<string>',
'signature_hex' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://execution.kairos.trade/v2/auth/siwe/verify"
payload := strings.NewReader("{\n \"message\": \"<string>\",\n \"signature_hex\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://execution.kairos.trade/v2/auth/siwe/verify")
.header("Content-Type", "application/json")
.body("{\n \"message\": \"<string>\",\n \"signature_hex\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://execution.kairos.trade/v2/auth/siwe/verify")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"message\": \"<string>\",\n \"signature_hex\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"client_id": "<string>",
"api_key": "<string>",
"api_secret": "<string>",
"scopes": [
"<string>"
],
"address": "<string>",
"expires_at": "2023-11-07T05:31:56Z"
}{
"error": "Insufficient scope",
"code": "<string>"
}{
"error": "Insufficient scope",
"code": "<string>"
}
