Skip to main content
POST
/
express
/
execute
Execute express verification
curl --request POST \
  --url https://api.jup.ag/tokens/v2/verify/express/execute \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: <api-key>' \
  --data '
{
  "transaction": "<string>",
  "requestId": "<string>",
  "senderAddress": "<string>",
  "tokenId": "<string>",
  "twitterHandle": "<string>",
  "description": "<string>",
  "senderTwitterHandle": "<string>",
  "paymentCurrency": "JUP",
  "paymentAmount": "<string>",
  "jupOutputAmount": "<string>"
}
'
import requests

url = "https://api.jup.ag/tokens/v2/verify/express/execute"

payload = {
"transaction": "<string>",
"requestId": "<string>",
"senderAddress": "<string>",
"tokenId": "<string>",
"twitterHandle": "<string>",
"description": "<string>",
"senderTwitterHandle": "<string>",
"paymentCurrency": "JUP",
"paymentAmount": "<string>",
"jupOutputAmount": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
transaction: '<string>',
requestId: '<string>',
senderAddress: '<string>',
tokenId: '<string>',
twitterHandle: '<string>',
description: '<string>',
senderTwitterHandle: '<string>',
paymentCurrency: 'JUP',
paymentAmount: '<string>',
jupOutputAmount: '<string>'
})
};

fetch('https://api.jup.ag/tokens/v2/verify/express/execute', 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/execute",
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([
'transaction' => '<string>',
'requestId' => '<string>',
'senderAddress' => '<string>',
'tokenId' => '<string>',
'twitterHandle' => '<string>',
'description' => '<string>',
'senderTwitterHandle' => '<string>',
'paymentCurrency' => 'JUP',
'paymentAmount' => '<string>',
'jupOutputAmount' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)

func main() {

url := "https://api.jup.ag/tokens/v2/verify/express/execute"

payload := strings.NewReader("{\n \"transaction\": \"<string>\",\n \"requestId\": \"<string>\",\n \"senderAddress\": \"<string>\",\n \"tokenId\": \"<string>\",\n \"twitterHandle\": \"<string>\",\n \"description\": \"<string>\",\n \"senderTwitterHandle\": \"<string>\",\n \"paymentCurrency\": \"JUP\",\n \"paymentAmount\": \"<string>\",\n \"jupOutputAmount\": \"<string>\"\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("x-api-key", "<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://api.jup.ag/tokens/v2/verify/express/execute")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"transaction\": \"<string>\",\n \"requestId\": \"<string>\",\n \"senderAddress\": \"<string>\",\n \"tokenId\": \"<string>\",\n \"twitterHandle\": \"<string>\",\n \"description\": \"<string>\",\n \"senderTwitterHandle\": \"<string>\",\n \"paymentCurrency\": \"JUP\",\n \"paymentAmount\": \"<string>\",\n \"jupOutputAmount\": \"<string>\"\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.jup.ag/tokens/v2/verify/express/execute")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"transaction\": \"<string>\",\n \"requestId\": \"<string>\",\n \"senderAddress\": \"<string>\",\n \"tokenId\": \"<string>\",\n \"twitterHandle\": \"<string>\",\n \"description\": \"<string>\",\n \"senderTwitterHandle\": \"<string>\",\n \"paymentCurrency\": \"JUP\",\n \"paymentAmount\": \"<string>\",\n \"jupOutputAmount\": \"<string>\"\n}"

response = http.request(request)
puts response.read_body
{
  "status": "Success",
  "signature": "5UfDuX...",
  "totalTime": 1234,
  "verificationCreated": true,
  "metadataCreated": true
}
{
"status": 123,
"message": "<string>",
"error": "<string>"
}
{
"status": 123,
"message": "<string>",
"error": "<string>"
}
{
"status": 123,
"message": "<string>",
"error": "<string>"
}

Authorizations

x-api-key
string
header
required

Body

application/json
transaction
string
required

Base64-encoded signed transaction from the craft-txn step

requestId
string
required

requestId returned by craft-txn

senderAddress
string
required

Solana wallet address of the sender

tokenId
string
required

Token mint address to verify

twitterHandle
string
required

Twitter/X handle of the token project

description
string
required

Reason for verification request

senderTwitterHandle
string

Twitter/X handle of the submitter (optional)

tokenMetadata
object

Optional token metadata to submit alongside verification

paymentCurrency
enum<string>

Payment currency. Defaults to JUP (direct transfer). SOL/USDC/JUPUSD execute the Ultra swap crafted in the previous step.

Available options:
JUP,
SOL,
USDC,
JUPUSD
Example:

"JUP"

paymentAmount
string

Atomic input amount paid. Required when paymentCurrency is not JUP.

jupOutputAmount
string

Atomic JUP output from the craft quote (CraftTxnResponse.amount), echoed back so revenue tracks the actual JUP collected on swap paths.

Response

Submission result

status
enum<string>
required

Whether the transaction was executed successfully

Available options:
Success,
Failed
totalTime
number
required

Time taken to execute in milliseconds

verificationCreated
boolean
required

Whether a verification request was created

metadataCreated
boolean
required

Whether a metadata update request was created

signature
string

Transaction signature on-chain (present on success)

error
string

Error message (present on failure)

code
number

Error code (present on failure)