curl --request GET \
--url https://api.jup.ag/tokens/v2/verify/express/craft-txn \
--header 'x-api-key: <api-key>'import requests
url = "https://api.jup.ag/tokens/v2/verify/express/craft-txn"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.jup.ag/tokens/v2/verify/express/craft-txn', 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.jup.ag/tokens/v2/verify/express/craft-txn",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <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"
"net/http"
"io"
)
func main() {
url := "https://api.jup.ag/tokens/v2/verify/express/craft-txn"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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.jup.ag/tokens/v2/verify/express/craft-txn")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.jup.ag/tokens/v2/verify/express/craft-txn")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"transaction": "<string>",
"requestId": "<string>",
"receiverAddress": "<string>",
"mint": "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",
"amount": "<string>",
"tokenDecimals": 123,
"feeLamports": 123,
"feeMint": "<string>",
"feeTokenDecimals": 123,
"feeAmount": 123,
"totalTime": 123,
"code": 123,
"gasless": true,
"tokenUsdRate": 123,
"feeUsdAmount": 123,
"expireAt": "<string>",
"error": "<string>",
"inputMint": "<string>",
"inputDecimals": 123,
"quotedInputAmount": "<string>",
"maxInputAmount": "<string>"
}{
"status": 123,
"message": "<string>",
"error": "<string>"
}{
"status": 123,
"message": "<string>",
"error": "<string>"
}Craft Transaction
Craft an unsigned 1000 JUP payment transaction for express verification
curl --request GET \
--url https://api.jup.ag/tokens/v2/verify/express/craft-txn \
--header 'x-api-key: <api-key>'import requests
url = "https://api.jup.ag/tokens/v2/verify/express/craft-txn"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.jup.ag/tokens/v2/verify/express/craft-txn', 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.jup.ag/tokens/v2/verify/express/craft-txn",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <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"
"net/http"
"io"
)
func main() {
url := "https://api.jup.ag/tokens/v2/verify/express/craft-txn"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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.jup.ag/tokens/v2/verify/express/craft-txn")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.jup.ag/tokens/v2/verify/express/craft-txn")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"transaction": "<string>",
"requestId": "<string>",
"receiverAddress": "<string>",
"mint": "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",
"amount": "<string>",
"tokenDecimals": 123,
"feeLamports": 123,
"feeMint": "<string>",
"feeTokenDecimals": 123,
"feeAmount": 123,
"totalTime": 123,
"code": 123,
"gasless": true,
"tokenUsdRate": 123,
"feeUsdAmount": 123,
"expireAt": "<string>",
"error": "<string>",
"inputMint": "<string>",
"inputDecimals": 123,
"quotedInputAmount": "<string>",
"maxInputAmount": "<string>"
}{
"status": 123,
"message": "<string>",
"error": "<string>"
}{
"status": 123,
"message": "<string>",
"error": "<string>"
}Authorizations
Get API key via https://developers.jup.ag/portal
Query Parameters
Solana wallet address that will sign and pay for the transaction
Payment currency. Defaults to JUP (direct transfer). SOL/USDC/JUPUSD route through an Ultra swap to JUP. Accepted payment currency, given as a token symbol (not a mint address): JUP, SOL, USDC, or JUPUSD. All input currencies are converted to 1000 JUP. JUP transfers directly; SOL, USDC, and JUPUSD are swapped to 1000 JUP via Ultra.
JUP, SOL, USDC, JUPUSD "JUP"
Response
Unsigned payment transaction
Base64-encoded unsigned transaction
Unique request ID. Pass this to the execute endpoint.
Wallet address receiving the JUP payment
Mint address of the payment token (JUP)
"JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN"
JUP amount collected in smallest unit. JUP path transfers exactly 1000 JUP (1000000000); swap paths yield at least that.
Decimals of the payment token
Transaction fee in lamports
Mint address of the fee token
Decimals of the fee token
Fee amount in smallest unit
Time taken to craft the transaction in milliseconds
Status code (0 for success)
Whether the transaction is gasless
USD rate of the payment token at time of crafting
Transaction fee in USD
Expiry timestamp for the crafted transaction
Error message if crafting failed
Input token mint address (non-JUP paths)
Input token decimals (non-JUP paths)
Atomic input amount for the swap, sized to yield at least 1000 JUP (non-JUP paths)
Maximum atomic input amount for the swap; equal to quotedInputAmount on the current swap flow (non-JUP paths)
Was this page helpful?
