curl --request POST \
--url https://api.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy \
--header 'Content-Type: application/json' \
--data '
{
"poly_address": "<string>",
"poly_signature": "<string>",
"poly_timestamp": "<string>",
"poly_nonce": "<string>"
}
'import requests
url = "https://api.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy"
payload = {
"poly_address": "<string>",
"poly_signature": "<string>",
"poly_timestamp": "<string>",
"poly_nonce": "<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({
poly_address: '<string>',
poly_signature: '<string>',
poly_timestamp: '<string>',
poly_nonce: '<string>'
})
};
fetch('https://api.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy', 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.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy",
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([
'poly_address' => '<string>',
'poly_signature' => '<string>',
'poly_timestamp' => '<string>',
'poly_nonce' => '<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://api.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy"
payload := strings.NewReader("{\n \"poly_address\": \"<string>\",\n \"poly_signature\": \"<string>\",\n \"poly_timestamp\": \"<string>\",\n \"poly_nonce\": \"<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://api.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy")
.header("Content-Type", "application/json")
.body("{\n \"poly_address\": \"<string>\",\n \"poly_signature\": \"<string>\",\n \"poly_timestamp\": \"<string>\",\n \"poly_nonce\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy")
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 \"poly_address\": \"<string>\",\n \"poly_signature\": \"<string>\",\n \"poly_timestamp\": \"<string>\",\n \"poly_nonce\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Wallet Derive Credentials Via Proxy
Forward locally-signed Polymarket L1 auth headers from a non-blocked IP.
curl --request POST \
--url https://api.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy \
--header 'Content-Type: application/json' \
--data '
{
"poly_address": "<string>",
"poly_signature": "<string>",
"poly_timestamp": "<string>",
"poly_nonce": "<string>"
}
'import requests
url = "https://api.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy"
payload = {
"poly_address": "<string>",
"poly_signature": "<string>",
"poly_timestamp": "<string>",
"poly_nonce": "<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({
poly_address: '<string>',
poly_signature: '<string>',
poly_timestamp: '<string>',
poly_nonce: '<string>'
})
};
fetch('https://api.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy', 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.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy",
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([
'poly_address' => '<string>',
'poly_signature' => '<string>',
'poly_timestamp' => '<string>',
'poly_nonce' => '<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://api.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy"
payload := strings.NewReader("{\n \"poly_address\": \"<string>\",\n \"poly_signature\": \"<string>\",\n \"poly_timestamp\": \"<string>\",\n \"poly_nonce\": \"<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://api.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy")
.header("Content-Type", "application/json")
.body("{\n \"poly_address\": \"<string>\",\n \"poly_signature\": \"<string>\",\n \"poly_timestamp\": \"<string>\",\n \"poly_nonce\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.simmer.markets/api/sdk/wallet/credentials/derive-via-proxy")
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 \"poly_address\": \"<string>\",\n \"poly_signature\": \"<string>\",\n \"poly_timestamp\": \"<string>\",\n \"poly_nonce\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Body
Pre-signed Polymarket L1 auth headers for proxy-derive of CLOB creds.
External-wallet users on residential / Cloudflare-blocked IPs cannot reach Polymarket's POST /auth/api-key endpoint directly. The SDK signs the L1 challenge locally with the EOA private key (the key never leaves the user's machine) and POSTs only the resulting four headers here. The backend forwards them to Polymarket from a non-blocked IP, encrypts and stores the returned creds. The signature is bound to address + timestamp + nonce, so it cannot be replayed as a transaction.
EOA address — must match the authenticated user's wallet_address
^0x[0-9a-fA-F]{40}$L1 auth signature: 0x + 130 hex chars (65 bytes: r,s,v)
^0x[0-9a-fA-F]{130}$Unix timestamp in seconds (10 digits) used in the signature
^\d{10}$Nonce used in the signature (decimal digits, default 0)
^\d{1,20}$Response
Successful Response
