curl --request GET \
--url https://api.dexploit.dev/swaps/{signature} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.dexploit.dev/swaps/{signature}"
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.dexploit.dev/swaps/{signature}', 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.dexploit.dev/swaps/{signature}",
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.dexploit.dev/swaps/{signature}"
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.dexploit.dev/swaps/{signature}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dexploit.dev/swaps/{signature}")
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{
"signature": "2B9pP1c1imNEcyCPBBnE9La3UYCkBMxzNehRLXNV4Hj7y2ZqB46JwopqYgsnTkRaajgs4x5aso5CdLGBJsNK4W22",
"total": 2,
"swaps": [
{
"timestamp": 1791398356000,
"slot": 454305668,
"signature": "2B9pP1c1imNEcyCPBBnE9La3UYCkBMxzNehRLXNV4Hj7y2ZqB46JwopqYgsnTkRaajgs4x5aso5CdLGBJsNK4W22",
"token_address": "DU6JbpQshZU821X1JKQtcFfj4WRm34WFoixs2p8jnuBL",
"pair_address": "A7dPgUPsoEEG56ZopxsfyqvvMJ3tdAXM1ub86wEEFUJm",
"user": "FajP2FjmdGDxPwbhVStVVEkMQ2sC2nEayypBztviPfNM",
"is_buy": false,
"sol_amount": 54609143,
"token_amount": 479835144917,
"virtual_sol_reserves": 60499422171,
"virtual_token_reserves": 532071201487917,
"fee": 518787,
"price_per_token": 0.00011380813510324691,
"dex": 1,
"real_sol_reserves": 30499422171,
"real_token_reserves": 252171201487917,
"creator_fee": 163828,
"fee_bps": 95,
"creator_fee_bps": 30,
"price_impact_bps": -9,
"base_decimals": 9,
"quote_decimals": 6,
"pool_price": 1.137055003199114e-7,
"transfer_fee_in": 0,
"transfer_fee_out": 0,
"cashback": 0,
"cashback_bps": 0,
"ix_index": 0,
"block_tx_index": 157,
"time_source": 1,
"agent_trade": 1
},
{
"timestamp": 1791398356000,
"slot": 454305668,
"signature": "2B9pP1c1imNEcyCPBBnE9La3UYCkBMxzNehRLXNV4Hj7y2ZqB46JwopqYgsnTkRaajgs4x5aso5CdLGBJsNK4W22",
"token_address": "8sGfh5FLDenW2uSDbStnzAE2RaZYtvh81WdRChJTpump",
"pair_address": "4r6FqXB4wbMxtgBMFBKQBuEFEvg9LJrgQLqvsWHGKnAK",
"user": "FajP2FjmdGDxPwbhVStVVEkMQ2sC2nEayypBztviPfNM",
"is_buy": true,
"sol_amount": 53260767,
"token_amount": 1880897675995,
"virtual_sol_reserves": 30217928086,
"virtual_token_reserves": 1065261652305393,
"fee": 505978,
"price_per_token": 0.00002831667436232272,
"dex": 1,
"real_sol_reserves": 217928086,
"real_token_reserves": 785361652305393,
"creator_fee": 159783,
"fee_bps": 95,
"creator_fee_bps": 30,
"price_impact_bps": -17,
"base_decimals": 9,
"quote_decimals": 6,
"pool_price": 2.8366672188568576e-8,
"transfer_fee_in": 0,
"transfer_fee_out": 0,
"cashback": 0,
"cashback_bps": 0,
"ix_index": 1,
"block_tx_index": 157,
"time_source": 1,
"agent_trade": 1
}
],
"price_semantics": "pool_price=RAW vault ratio, uncorrected (not a tradeable price); price_impact_bps=CORRECTED at read time, null where not computed; for an executed price use price_per_token. See https://docs.dexploit.dev/concepts/coverage"
}{
"error": "not_found",
"message": "Swap not found: 43nGAPtVqZxiar6cbdqBg4DRTkG6gM2EsPzPz1igqWkLraYDZcygonrGXkAynXkFr8QocyG4BnefMBzVXMkbDYX2"
}{
"error": "not_found",
"message": "Swap not found: 43nGAPtVqZxiar6cbdqBg4DRTkG6gM2EsPzPz1igqWkLraYDZcygonrGXkAynXkFr8QocyG4BnefMBzVXMkbDYX2"
}Swaps of one transaction, by signature
Look up the swaps emitted by a specific Solana transaction.
A signature names a transaction, and a transaction can hold more than one swap (a multi-hop route, or swaps on several venues), so the response is an envelope: swaps holds every swap of the transaction and total counts them. A transaction with one swap gives a one-element swaps array. The swaps are never paged, and they come back in a fixed order (see swaps in the response).
This route used to return one swap object with no envelope, which for a transaction with several swaps was one of them, chosen arbitrarily. See the changelog.
curl --request GET \
--url https://api.dexploit.dev/swaps/{signature} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.dexploit.dev/swaps/{signature}"
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.dexploit.dev/swaps/{signature}', 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.dexploit.dev/swaps/{signature}",
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.dexploit.dev/swaps/{signature}"
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.dexploit.dev/swaps/{signature}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dexploit.dev/swaps/{signature}")
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{
"signature": "2B9pP1c1imNEcyCPBBnE9La3UYCkBMxzNehRLXNV4Hj7y2ZqB46JwopqYgsnTkRaajgs4x5aso5CdLGBJsNK4W22",
"total": 2,
"swaps": [
{
"timestamp": 1791398356000,
"slot": 454305668,
"signature": "2B9pP1c1imNEcyCPBBnE9La3UYCkBMxzNehRLXNV4Hj7y2ZqB46JwopqYgsnTkRaajgs4x5aso5CdLGBJsNK4W22",
"token_address": "DU6JbpQshZU821X1JKQtcFfj4WRm34WFoixs2p8jnuBL",
"pair_address": "A7dPgUPsoEEG56ZopxsfyqvvMJ3tdAXM1ub86wEEFUJm",
"user": "FajP2FjmdGDxPwbhVStVVEkMQ2sC2nEayypBztviPfNM",
"is_buy": false,
"sol_amount": 54609143,
"token_amount": 479835144917,
"virtual_sol_reserves": 60499422171,
"virtual_token_reserves": 532071201487917,
"fee": 518787,
"price_per_token": 0.00011380813510324691,
"dex": 1,
"real_sol_reserves": 30499422171,
"real_token_reserves": 252171201487917,
"creator_fee": 163828,
"fee_bps": 95,
"creator_fee_bps": 30,
"price_impact_bps": -9,
"base_decimals": 9,
"quote_decimals": 6,
"pool_price": 1.137055003199114e-7,
"transfer_fee_in": 0,
"transfer_fee_out": 0,
"cashback": 0,
"cashback_bps": 0,
"ix_index": 0,
"block_tx_index": 157,
"time_source": 1,
"agent_trade": 1
},
{
"timestamp": 1791398356000,
"slot": 454305668,
"signature": "2B9pP1c1imNEcyCPBBnE9La3UYCkBMxzNehRLXNV4Hj7y2ZqB46JwopqYgsnTkRaajgs4x5aso5CdLGBJsNK4W22",
"token_address": "8sGfh5FLDenW2uSDbStnzAE2RaZYtvh81WdRChJTpump",
"pair_address": "4r6FqXB4wbMxtgBMFBKQBuEFEvg9LJrgQLqvsWHGKnAK",
"user": "FajP2FjmdGDxPwbhVStVVEkMQ2sC2nEayypBztviPfNM",
"is_buy": true,
"sol_amount": 53260767,
"token_amount": 1880897675995,
"virtual_sol_reserves": 30217928086,
"virtual_token_reserves": 1065261652305393,
"fee": 505978,
"price_per_token": 0.00002831667436232272,
"dex": 1,
"real_sol_reserves": 217928086,
"real_token_reserves": 785361652305393,
"creator_fee": 159783,
"fee_bps": 95,
"creator_fee_bps": 30,
"price_impact_bps": -17,
"base_decimals": 9,
"quote_decimals": 6,
"pool_price": 2.8366672188568576e-8,
"transfer_fee_in": 0,
"transfer_fee_out": 0,
"cashback": 0,
"cashback_bps": 0,
"ix_index": 1,
"block_tx_index": 157,
"time_source": 1,
"agent_trade": 1
}
],
"price_semantics": "pool_price=RAW vault ratio, uncorrected (not a tradeable price); price_impact_bps=CORRECTED at read time, null where not computed; for an executed price use price_per_token. See https://docs.dexploit.dev/concepts/coverage"
}{
"error": "not_found",
"message": "Swap not found: 43nGAPtVqZxiar6cbdqBg4DRTkG6gM2EsPzPz1igqWkLraYDZcygonrGXkAynXkFr8QocyG4BnefMBzVXMkbDYX2"
}{
"error": "not_found",
"message": "Swap not found: 43nGAPtVqZxiar6cbdqBg4DRTkG6gM2EsPzPz1igqWkLraYDZcygonrGXkAynXkFr8QocyG4BnefMBzVXMkbDYX2"
}Authorizations
Preferred for swaps-api endpoints (/swaps/*, /stats/*, /trending, /pool-events).
Path Parameters
Response
Every swap of the transaction
Every swap of one transaction, returned by GET /swaps/{signature}.
The transaction signature that was requested.
Number of swaps in swaps. The swaps of one transaction are never paged, so this is always swaps.length.
Every swap the transaction emitted, at least one. A transaction with one swap gives a one-element array. The order is fixed: ascending slot, block_tx_index and ix_index, then dex (the venue id), with a fixed final tie-break, so the same request always returns the same order. ix_index is numbered per decoder (see its description), so the order is the order the swaps ran in only among swaps read by the same decoder; across venues it is deterministic but not execution order.
Show child attributes
Show child attributes
A short, machine-readable note on how the price fields in this response are derived. Emitted on every response so a client never has to infer it from the docs. Treat it as informational text, not a stable enum — the wording may change as derivations change.

