APIs
Overview
Kinetic exposes APIs for routing, swap transaction building, user profiles and portfolios
Services
Base URL
Authentication:
https://auth.kinetic.xyzServices:
https://api.kinetic.xyz
💡 Naming Convensions
REST: camelCase
gRPC: snake_case
Authentication
Kinetic uses a two-step model:
API Key → JWT exchange (gRPC needs to call
Auth.IssueToken)Bearer token in
Kinetic-Authheader for subsequent requests
HTTP Header / gRPC Metadata
Kinetic-Auth: Bearer <access_token>Issue Token
POST https://auth.kinetic.xyz/v1/token → exchange API key for a short-lived JWT.
Request Body
apiKey
string
✅
Your issued API key
api_key
string
✅
Your issued API key
200 Response
accessToken
string
JWT to use as Bearer token
tokenType
string
e.g., "bearer"
expiresIn
number
Lifetime in seconds
issuedAt
string
RFC3339
expiresAt
string
RFC3339
access_token
string
JWT to use as Bearer token
token_type
string
e.g., "bearer"
expires_in
number
Lifetime in seconds
issued_at
string
RFC3339
expires_at
string
RFC3339
Samples
curl --location 'auth.kinetic.xyz/v1/token' \
--header 'Content-Type: application/json' \
--data '{
"apiKey": "[apiKey]"
}'const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
const raw = JSON.stringify({
"apiKey": "[apiKey]"
});
const requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("auth.kinetic.xyz/v1/token", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.error(error));import requests
import json
url = "auth-dev.kinetic.xyz/v1/token"
payload = json.dumps({
"apiKey": "[apiKey]"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Sample 200 Response (REST)
{
"accessToken": "<JWT>",
"tokenType": "bearer",
"expiresIn": 3600,
"issuedAt": "2025-10-02T00:00:00Z",
"expiresAt": "2025-10-02T01:00:00Z"
}Routing
Get optimal quotes.
Get Quote
POST routings/v3/quote -> Quote
Request Body
inputToken
string
✅
Input mint (e.g., So1111…)
outputToken
string
✅
Output mint
amount
number
✅
Amount in base units (lamports, etc.)
slippageBps
number
Max slippage (e.g., 100 = 1%)
includedAmms
string[]
e.g., ["RAYDIUM","PHOENIX"]
input_token
string
✅
Input mint (e.g., So1111…)
output_token
string
✅
Output mint
amount
number
✅
Amount in base units (lamports, etc.)
slippage_bps
number
Max slippage (e.g., 100 = 1%)
included_amms
string[]
e.g., ["RAYDIUM","PHOENIX"]
200 Response
Quote
inputMint
string
JWT to use as Bearer token
inAmount
string
e.g., "bearer"
outputMint
number
Lifetime in seconds
outAmount
string
Space-separated scopes
otherAmountThreshold
string
RFC3339
swapMode
enum
SWAP_MODE_EXACT_IN SWAP_MODE_EXACT_OUT
slippageBps
float
e.g., 100
apiVersion
string
e.g., "v1"
input_mint
string
JWT to use as Bearer token
in_amount
string
e.g., "bearer"
output_mint
number
Lifetime in seconds
out_amount
string
Space-separated scopes
other_amount_threshold
string
RFC3339
swap_mode
enum
SWAP_MODE_EXACT_IN SWAP_MODE_EXACT_OUT
slippage_bps
float
e.g., 100
api_version
string
e.g., "v1"
RoutePlan
percent
float
The percentage of this route. E.g., 100
SwapInfo
amm_key
string
label
string
input_mint
string
output_mint
string
in_amount
string
out_amount
string
Samples
curl --location 'https://api-dev.kinetic.xyz/routing/v3/quote' \
--header 'Content-Type: application/json' \
--data '{
"inputToken": "So11111111111111111111111111111111111111112",
"outputToken": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"amount": "10000",
"slippageBps": 1000
}'const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
const raw = JSON.stringify({
"inputToken": "So11111111111111111111111111111111111111112",
"outputToken": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"amount": "10000",
"slippageBps": 1000
});
const requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://api-dev.kinetic.xyz/routing/v3/quote", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.error(error));import requests
import json
url = "https://api-dev.kinetic.xyz/routing/v3/quote"
payload = json.dumps({
"inputToken": "So11111111111111111111111111111111111111112",
"outputToken": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"amount": "10000",
"slippageBps": 1000
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Sample 200 Response (REST)
{
"input_mint": "So11111111111111111111111111111111111111112",
"in_amount": "1000000",
"output_mint": "<mint>",
"out_amount": "173240000",
"other_amount_threshold": "171500000",
"swap_mode": "SWAP_MODE_EXACT_IN",
"slippage_bps": 100,
"route_plan": [
{ "swap_info": { "amm": "RAYDIUM" }, "percent": 100 }
],
"api_version": "v1"
}Transactions
Build a base64 swap transaction (with optional dynamic fees).
Build Swap Transaction
POST transaction/v1/swap
Request Body
userPublicKey
string
✅
User wallet pubkey
priorityFeeLamports
number
Desired base priority fee
dynamicPrioritFfee
boolean
Let server adjust priority
dynamicSlippage
object
{ "min_bps": 50, "max_bps": 300 }
jitoTipLamports
number
Base tip to builders
dynamicJitoTip
boolean
Let server adjust Jito tip
platformFee
boolean
Apply platform fee if true
user_public_key
string
✅
User wallet pubkey
quote_response
object
✅
Quote (see above)
priority_fee_lamports
number
Desired base priority fee
dynamic_priority_fee
boolean
Let server adjust priority
dynamic_slippage
object
{ "min_bps": 50, "max_bps": 300 }
jito_tip_lamports
number
Base tip to builders
dynamic_jito_tip
boolean
Let server adjust Jito tip
platform_fee
boolean
Apply platform fee if true
200 Response
swapTransaction
string
Base64 encoded transaction
priorityFeeLamports
integer
jitoTipLamports
number
swap_transaction
string
Base64 encoded transaction
priority_fee_lamports
integer
jito_tip_lamports
number
DynamicSlippageReport
slippage_bps
float
other_amount
string
Samples
curl --location 'https://api-dev.kinetic.xyz/transaction/v1/swap' \
--header 'Content-Type: application/json' \
--data '{
"userPublicKey": "[userPublicKey]",
"priorityFeeLamports": 1000,
"dynamicPriorityFee": true,
"dynamicJito_Tip": true,
"dynamicSlippage": {
"minBps": 1,
"maxBps": 1000
},
"quoteResponse": {
"inputMint": "So11111111111111111111111111111111111111112",
"inAmount": "10000",
"outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"outAmount": "1955",
"otherAmountThreshold": "1760",
"swapMode": "SWAP_MODE_EXACT_IN",
"slippageBps": 1000,
"routePlan": [
{
"swapInfo": {
"ammKey": "CYbD9RaToYMtWKA7QZyoLahnHdWq553Vm62Lh6qWtuxq",
"label": "Raydium CLMM",
"inputMint": "So11111111111111111111111111111111111111112",
"outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"inAmount": "10000",
"outAmount": "1955"
},
"percent": 100
}
],
"apiVersion": "1.0"
}
}'const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
const raw = JSON.stringify({
"userPublicKey": "[userPublicKey]",
"priorityFeeLamports": 1000,
"dynamicPriorityFee": true,
"dynamicJito_Tip": true,
"dynamicSlippage": {
"minBps": 1,
"maxBps": 1000
},
"quoteResponse": {
"inputMint": "So11111111111111111111111111111111111111112",
"inAmount": "10000",
"outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"outAmount": "1955",
"otherAmountThreshold": "1760",
"swapMode": "SWAP_MODE_EXACT_IN",
"slippageBps": 1000,
"routePlan": [
{
"swapInfo": {
"ammKey": "CYbD9RaToYMtWKA7QZyoLahnHdWq553Vm62Lh6qWtuxq",
"label": "Raydium CLMM",
"inputMint": "So11111111111111111111111111111111111111112",
"outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"inAmount": "10000",
"outAmount": "1955"
},
"percent": 100
}
],
"apiVersion": "1.0"
}
});
const requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://api-dev.kinetic.xyz/transaction/v1/swap", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.error(error));import requests
import json
url = "https://api-dev.kinetic.xyz/transaction/v1/swap"
payload = json.dumps({
"userPublicKey": "[userPublicKey]",
"priorityFeeLamports": 1000,
"dynamicPriorityFee": True,
"dynamicJito_Tip": True,
"dynamicSlippage": {
"minBps": 1,
"maxBps": 1000
},
"quoteResponse": {
"inputMint": "So11111111111111111111111111111111111111112",
"inAmount": "10000",
"outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"outAmount": "1955",
"otherAmountThreshold": "1760",
"swapMode": "SWAP_MODE_EXACT_IN",
"slippageBps": 1000,
"routePlan": [
{
"swapInfo": {
"ammKey": "CYbD9RaToYMtWKA7QZyoLahnHdWq553Vm62Lh6qWtuxq",
"label": "Raydium CLMM",
"inputMint": "So11111111111111111111111111111111111111112",
"outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"inAmount": "10000",
"outAmount": "1955"
},
"percent": 100
}
],
"apiVersion": "1.0"
}
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
200 Response (REST)
{
"swap_transaction": "<base64>",
"priority_fee_lamports": 52000,
"jito_tip_lamports": 12000,
"dynamic_slippage_report": {
"slippage_bps": 180,
"other_amount": "200"
}
}Orders
Submit a signed or unsigned transaction and stream status back.
gRPC
SendTransaction(stream SendTransactionRequest) → (stream SendTransactionResponse)
Send Transaction
POST /v1/sendTransaction — responds with a stream (SSE).
Request Body
serializedUnsignedTx
string
Base64 encoded transaction
serializedSignedTx
string
Base64 encoded signed transaction
confirmConfig
object
e.g., { "skipPreflight": false }
isJitoEnabled
boolean
serialized_unsigned_tx
string
Base64 encoded transaction
serialized_signed_tx
string
Base64 encoded signed transaction
confirm_config
object
e.g., { "skip_preflight": false }
is_jito_enabled
boolean
Metadata
wallet_address
string
User's wallet address
user_id
string
Kinetic user ID
reward_type
string
e.g. REWARD_TYPE_TOKEN_SWAP
from_token_address
string
from_token_amount
string
to_token_address
string
200 Response
In a streamline of
Simulation status (if
skipPreflightistrue)Transaction hash
Transaction statuses
WalletTransactionInfo when the transaction is confirmed
Samples
curl --location 'https://api-dev.kinetic.xyz/v1/sendTransaction' \
--header 'Content-Type: application/json' \
--data '{
"serializedUnsignedTx": "[serializedUnsignedTx]",
"serializedSignedTx": "[serializedSignedTx]",
"confirmConfig": {
"skipPreflight": false
},
"metadata": {
"userId": "[userId]",
"walletAddress": "[walletAddress]",
"rewardType": "REWARD_TYPE_TOKEN_SWAP",
"fromTokenAddress": "So11111111111111111111111111111111111111112",
"fromTokenAmount": "100000",
"toTokenAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
},
"isJitoEnabled": false
}'const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
const raw = JSON.stringify({
"serializedUnsignedTx": "[serializedUnsignedTx]",
"serializedSignedTx": "[serializedSignedTx]",
"confirmConfig": {
"skipPreflight": false
},
"metadata": {
"userId": "[userId]",
"walletAddress": "[walletAddress]",
"rewardType": "REWARD_TYPE_TOKEN_SWAP",
"fromTokenAddress": "So11111111111111111111111111111111111111112",
"fromTokenAmount": "100000",
"toTokenAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
},
"isJitoEnabled": false
});
const requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://api-dev.kinetic.xyz/v1/sendTransaction", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.error(error));import requests
import json
url = "https://api-dev.kinetic.xyz/v1/sendTransaction"
payload = json.dumps({
"serializedUnsignedTx": "[serializedUnsignedTx]",
"serializedSignedTx": "[serializedSignedTx]",
"confirmConfig": {
"skipPreflight": False
},
"metadata": {
"userId": "[userId]",
"walletAddress": "[walletAddress]",
"rewardType": "REWARD_TYPE_TOKEN_SWAP",
"fromTokenAddress": "So11111111111111111111111111111111111111112",
"fromTokenAmount": "100000",
"toTokenAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
},
"isJitoEnabled": False
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
200 Response (REST)
[{
"status": "simulationSuccess"
}
,{
"txHash": "5nYEJn79FurGNJ3LaeWKZ7iPpdjZ4LubfEAhSfhSmTjSQxxhKu3aBmWgbK49sX595XsALLRSQJRGC4ytVTfupTGe"
}
,{
"status": "processed"
}
,{
"status": "confirmed"
}
,{
"walletTransactionInfo": {
"volumeUsd": "99.9946088322",
"walletAddress": "[walletAddress]",
"txHash": "[txHash]",
"timestamp": 1760253181,
"fromToken": {
"mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"quantity": "100",
"priceUsd": "0.999946088322"
},
"toToken": {
"mint": "So11111111111111111111111111111111111111112",
"quantity": "0.548159167",
"priceUsd": "182.406794581"
},
"platformFeeSol": "0"
}
}
]
Changelog
2025-10-07: Stripe-style reference authored for GitBook; REST mappings are examples and should be updated to match your gateway paths.
Last updated

