curl --request POST \
--url https://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer \
--header 'Content-Type: application/json' \
--header 'KALSHI-ACCESS-KEY: <api-key>' \
--header 'KALSHI-ACCESS-SIGNATURE: <api-key>' \
--header 'KALSHI-ACCESS-TIMESTAMP: <api-key>' \
--data '
{
"amount": 123,
"client_transfer_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_exchange_shard": 0,
"destination_exchange_shard": 0,
"source_subaccount": 0,
"destination_subaccount": 0
}
'import requests
url = "https://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer"
payload = {
"amount": 123,
"client_transfer_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_exchange_shard": 0,
"destination_exchange_shard": 0,
"source_subaccount": 0,
"destination_subaccount": 0
}
headers = {
"KALSHI-ACCESS-KEY": "<api-key>",
"KALSHI-ACCESS-SIGNATURE": "<api-key>",
"KALSHI-ACCESS-TIMESTAMP": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'KALSHI-ACCESS-KEY': '<api-key>',
'KALSHI-ACCESS-SIGNATURE': '<api-key>',
'KALSHI-ACCESS-TIMESTAMP': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amount: 123,
client_transfer_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
source_exchange_shard: 0,
destination_exchange_shard: 0,
source_subaccount: 0,
destination_subaccount: 0
})
};
fetch('https://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer', 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://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer",
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([
'amount' => 123,
'client_transfer_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'source_exchange_shard' => 0,
'destination_exchange_shard' => 0,
'source_subaccount' => 0,
'destination_subaccount' => 0
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"KALSHI-ACCESS-KEY: <api-key>",
"KALSHI-ACCESS-SIGNATURE: <api-key>",
"KALSHI-ACCESS-TIMESTAMP: <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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer"
payload := strings.NewReader("{\n \"amount\": 123,\n \"client_transfer_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"source_exchange_shard\": 0,\n \"destination_exchange_shard\": 0,\n \"source_subaccount\": 0,\n \"destination_subaccount\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("KALSHI-ACCESS-KEY", "<api-key>")
req.Header.Add("KALSHI-ACCESS-SIGNATURE", "<api-key>")
req.Header.Add("KALSHI-ACCESS-TIMESTAMP", "<api-key>")
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://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer")
.header("KALSHI-ACCESS-KEY", "<api-key>")
.header("KALSHI-ACCESS-SIGNATURE", "<api-key>")
.header("KALSHI-ACCESS-TIMESTAMP", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 123,\n \"client_transfer_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"source_exchange_shard\": 0,\n \"destination_exchange_shard\": 0,\n \"source_subaccount\": 0,\n \"destination_subaccount\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["KALSHI-ACCESS-KEY"] = '<api-key>'
request["KALSHI-ACCESS-SIGNATURE"] = '<api-key>'
request["KALSHI-ACCESS-TIMESTAMP"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 123,\n \"client_transfer_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"source_exchange_shard\": 0,\n \"destination_exchange_shard\": 0,\n \"source_subaccount\": 0,\n \"destination_subaccount\": 0\n}"
response = http.request(request)
puts response.read_body{
"transfer_id": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}Intra Account Transfer
Transfers funds within the same account.
When source_exchange_shard and destination_exchange_shard are the same, Kalshi treats the request as a subaccount transfer. The returned transfer ID appears in the subaccount transfer history.
Cross-exchange-index subaccount transfers run in up to three non-atomic steps. If a later step fails, completed steps are not undone, so funds may remain in the primary account on the source or destination exchange index.
curl --request POST \
--url https://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer \
--header 'Content-Type: application/json' \
--header 'KALSHI-ACCESS-KEY: <api-key>' \
--header 'KALSHI-ACCESS-SIGNATURE: <api-key>' \
--header 'KALSHI-ACCESS-TIMESTAMP: <api-key>' \
--data '
{
"amount": 123,
"client_transfer_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_exchange_shard": 0,
"destination_exchange_shard": 0,
"source_subaccount": 0,
"destination_subaccount": 0
}
'import requests
url = "https://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer"
payload = {
"amount": 123,
"client_transfer_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_exchange_shard": 0,
"destination_exchange_shard": 0,
"source_subaccount": 0,
"destination_subaccount": 0
}
headers = {
"KALSHI-ACCESS-KEY": "<api-key>",
"KALSHI-ACCESS-SIGNATURE": "<api-key>",
"KALSHI-ACCESS-TIMESTAMP": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'KALSHI-ACCESS-KEY': '<api-key>',
'KALSHI-ACCESS-SIGNATURE': '<api-key>',
'KALSHI-ACCESS-TIMESTAMP': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amount: 123,
client_transfer_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
source_exchange_shard: 0,
destination_exchange_shard: 0,
source_subaccount: 0,
destination_subaccount: 0
})
};
fetch('https://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer', 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://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer",
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([
'amount' => 123,
'client_transfer_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'source_exchange_shard' => 0,
'destination_exchange_shard' => 0,
'source_subaccount' => 0,
'destination_subaccount' => 0
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"KALSHI-ACCESS-KEY: <api-key>",
"KALSHI-ACCESS-SIGNATURE: <api-key>",
"KALSHI-ACCESS-TIMESTAMP: <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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer"
payload := strings.NewReader("{\n \"amount\": 123,\n \"client_transfer_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"source_exchange_shard\": 0,\n \"destination_exchange_shard\": 0,\n \"source_subaccount\": 0,\n \"destination_subaccount\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("KALSHI-ACCESS-KEY", "<api-key>")
req.Header.Add("KALSHI-ACCESS-SIGNATURE", "<api-key>")
req.Header.Add("KALSHI-ACCESS-TIMESTAMP", "<api-key>")
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://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer")
.header("KALSHI-ACCESS-KEY", "<api-key>")
.header("KALSHI-ACCESS-SIGNATURE", "<api-key>")
.header("KALSHI-ACCESS-TIMESTAMP", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 123,\n \"client_transfer_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"source_exchange_shard\": 0,\n \"destination_exchange_shard\": 0,\n \"source_subaccount\": 0,\n \"destination_subaccount\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://external-api.kalshi.com/trade-api/v2/portfolio/intra_exchange_instance_transfer")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["KALSHI-ACCESS-KEY"] = '<api-key>'
request["KALSHI-ACCESS-SIGNATURE"] = '<api-key>'
request["KALSHI-ACCESS-TIMESTAMP"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 123,\n \"client_transfer_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"source_exchange_shard\": 0,\n \"destination_exchange_shard\": 0,\n \"source_subaccount\": 0,\n \"destination_subaccount\": 0\n}"
response = http.request(request)
puts response.read_body{
"transfer_id": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}Authorizations
Your API key ID
Base64 signature of the pre-sign text (timestamp + method + path) made with the API key's algorithm - RSA-PSS with SHA-256 for RSA keys, Ed25519 for Ed25519 keys
Request timestamp in milliseconds
Body
The source exchange instance
event_contract, margined The destination exchange instance
event_contract, margined The amount to transfer in centicents
Client ID for duplicate prevention. Reuse only for identical requests. Scoped to the user and both exchange instances and shards. Accepted transfers cannot be repeated with the same ID on the same route. Only supported for primary accounts. Transfers involving numbered subaccounts reject this field. If omitted, each request creates a new transfer.
Source exchange shard index (default 0)
0 <= x <= 100Destination exchange shard index (default 0)
0 <= x <= 100Source subaccount number (default 0 for the primary account). Only supported for event contract to event contract transfers.
Destination subaccount number (default 0 for the primary account). Only supported for event contract to event contract transfers.
Response
Transfer request accepted. The transfer is processed asynchronously.
The ID of the transfer that was created