Skip to main content
The Express Verification API lets you submit tokens for Jupiter VRFD verification and update token metadata programmatically. This is the same Express flow available on the VRFD UI, exposed as an API for launchpads, agents, and projects that need to integrate verification into their token creation pipelines. Each submission costs 1000 JUP, sent via a Solana transaction. The JUP is sent to a multisig wallet and burned periodically. There is also a free standard submission flow on the VRFD site. You can request verification and metadata updates together. Each is reviewed independently, so a metadata update can proceed even if verification is declined.

Prerequisites

  1. Get an API key at portal.jup.ag. All requests require the x-api-key header.
  2. The submitting wallet needs at least 1000 JUP. Transactions are gasless, so no SOL is required for fees.

Flow

The API is a three-step flow: check eligibility, craft a payment transaction, sign it, then execute.

Step 1: Check Eligibility (Optional)

Check if the token can be submitted for verification and/or metadata updates. This step is optional since the execute step also rejects ineligible tokens before charging payment, but it keeps your flow clean and avoids unnecessary transaction crafting. The most common reason for ineligibility is an existing pending submission for the token.
const response = await fetch(
  'https://api.jup.ag/tokens/v2/verify/express/check-eligibility?tokenId=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
  {
    headers: { 'x-api-key': 'YOUR_API_KEY' },
  }
);
const eligibility = await response.json();
{
  "tokenExists": true,
  "isVerified": false,
  "canVerify": true,
  "canMetadata": false,
  "metadataError": "A premium metadata update request for this token already exists"
}
FieldTypeDescription
tokenExistsbooleanWhether Jupiter recognizes the token
isVerifiedbooleanWhether the token is already verified
canVerifybooleanWhether a verification request can be submitted
canMetadatabooleanWhether a metadata update can be submitted
verificationErrorstringWhy verification cannot proceed (only present when there is a specific error)
metadataErrorstringWhy metadata cannot proceed (only present when there is a specific error)
If both canVerify and canMetadata are false, the submission will be rejected before any payment is charged.

Step 2: Craft the Payment Transaction

This returns an unsigned Solana transaction that transfers 1000 JUP. Save the requestId from the response, you need it in the next step.
const craftResponse = await fetch(
  `https://api.jup.ag/tokens/v2/verify/express/craft-txn?senderAddress=${walletAddress}`,
  {
    headers: { 'x-api-key': 'YOUR_API_KEY' },
  }
);
const { transaction, requestId } = await craftResponse.json();
The response includes the base64-encoded unsigned transaction and a requestId that links this payment to your execute request.
FieldTypeDescription
transactionstringBase64-encoded unsigned transaction
requestIdstringUnique ID for this payment. Pass to /execute.
mintstringPayment token mint (JUP)
amountstringPayment amount in smallest unit (1000000000 = 1000 JUP)
expireAtstringTransaction expiry timestamp
gaslessbooleanWhether the transaction is gasless

Step 3: Sign and Execute

Sign the transaction from Step 2 with your wallet, then submit it along with the token details and metadata.
import { VersionedTransaction } from '@solana/web3.js';

// Deserialize and sign the transaction
const txBuffer = Buffer.from(transaction, 'base64');
const tx = VersionedTransaction.deserialize(txBuffer);
tx.sign([wallet]); // wallet is a Keypair

// Serialize the signed transaction back to base64
const signedTransaction = Buffer.from(tx.serialize()).toString('base64');

// Submit
const executeResponse = await fetch(
  'https://api.jup.ag/tokens/v2/verify/express/execute',
  {
    method: 'POST',
    headers: {
      'x-api-key': 'YOUR_API_KEY',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      transaction: signedTransaction,
      requestId,
      senderAddress: wallet.publicKey.toBase58(),
      tokenId: 'YOUR_TOKEN_MINT_ADDRESS',
      twitterHandle: 'https://x.com/yourproject',
      description: 'Submitting for verification because...',
      tokenMetadata: {
        tokenId: 'YOUR_TOKEN_MINT_ADDRESS',
        website: 'https://yourproject.io',
        twitter: 'https://x.com/yourproject',
        discord: 'https://discord.gg/yourproject',
      },
    }),
  }
);
const result = await executeResponse.json();
{
  "status": "Success",
  "signature": "5UfDuX...",
  "totalTime": 1234,
  "verificationCreated": true,
  "metadataCreated": true
}
FieldTypeDescription
status"Success" | "Failed"Whether the transaction executed
signaturestringOn-chain transaction signature (on success)
verificationCreatedbooleanWhether a verification request was created
metadataCreatedbooleanWhether a metadata update request was created
After submission, track your request status at verified.jup.ag/tokens/browse.

Token Metadata Fields

The tokenMetadata object in the execute request is optional. Include it to update metadata alongside your verification submission. Only tokenId is required, all other fields are optional.
FieldTypeDescription
tokenIdstringToken mint address (required)
namestringToken display name
symbolstringToken ticker symbol
iconstringURL to token icon image
websitestringProject website URL
twitterstringTwitter/X profile URL
twitterCommunitystringTwitter/X community URL
telegramstringTelegram group URL
discordstringDiscord invite URL
instagramstringInstagram profile URL
tiktokstringTikTok profile URL
tokenDescriptionstringShort description of the token
circulatingSupplystringCirculating supply value
circulatingSupplyUrlstringURL to a live circulating supply endpoint
coingeckoCoinIdstringCoinGecko coin ID for price data
otherUrlstringAny other relevant URL

Known Projects and Launchpads

If you are a known project or launchpad on Solana, DM @jup_vrfd from your organization account on X. This lets the VRFD team connect your Jupiter Portal OrgId, which adds credibility and supports your submissions.

API Reference

Check Eligibility

Check if a token can be verified

Craft Transaction

Get an unsigned 1000 JUP payment transaction

Execute

Submit signed transaction with token details