Quote
by FortiSwap in Onchain & crypto
Best swap route on X1 across XDEX and Degen pools for exact-in or exact-out, with live-verified reserves, price impact, dynamic slippage, fee disclosure (25 bps taken on-chain by the FortiBlox Router), route legs, alternatives and a quote expiry slot. Amounts are raw base units. Call before /api/tx/build.
https://app.fortiblox.com/api/quote- Price
- $0.001
- per call in USDC
- Uptime
- 100%
- last 30 days
- Response time
- 434 ms
- 524 ms slowest 5%
- Last check
- Passed
- 2 h ago, next any minute now
Reliability
How to call it
POST https://app.fortiblox.com/api/quote
Each call costs $0.001 in USDC on Base, paid with the request over x402.
Run a free test callOne unpaid request, the way an agent sends it. You see the payment challenge it gets back. Nothing is charged.
Example request
From the listing.
POST https://app.fortiblox.com/api/quote
content-type: application/json
{
"amountIn": "1000000",
"inputMint": "B69chRzqzDCmdB5WYB8NRu5Yv5ZA95ABiZcdzCgGm9Tq",
"mode": "exactIn",
"outputMint": "So11111111111111111111111111111111111111112"
}Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
amountIn | string | No | raw base units of inputMint (exactIn) |
amountOut | string | No | raw base units of outputMint (exactOut — GROSS target) |
inputMint | string | Yes | base58 X1 mint address |
maxHops | number | No | default 4; clamped to 1-8 by the pathfinder. Keep ≤ 6 so /api/tx/build (on-chain router, max 6 legs) executes the same route. |
mode | string | No | default exactIn. exactOut is served as a reverse-quoted exact-in: amountIn = the required input (spent exactly; maxAmountIn echoes it), amountOut/amountOutNet/minimumAmountOut are the forward quote at that input, requestedAmountOut is your target One of: exactIn, exactOut. |
outputMint | string | Yes | base58 X1 mint address |
payer | string | No | base58 payer for simulate:true |
simulate | boolean | No | simulate the build (needs payer) |
slippageBps | number | No | explicit slippage in bps (clamped); omitted = dynamic |
Example response
The provider's example. We can't check it without paying.
Example response, 253 lines
{
"alternatives": [
{
"amountIn": "1000000",
"amountOut": "2003332716",
"guard": {
"hardExcluded": false,
"maxPriceDeviationPct": 1.04741094,
"minPoolTvlXnt": 586.8,
"penaltyBps": 50,
"thin": false,
"worstTradeReservePct": 0.68942644
},
"legs": [
{
"address": "5uGVSgMoRQTN5uabJswdKpUnj8VZhiQtYYGf75kHzSGx",
"amountIn": "1000000",
"amountOut": "27347948",
"feePpm": 2800,
"inMint": "B69chRzqzDCmdB5WYB8NRu5Yv5ZA95ABiZcdzCgGm9Tq",
"outMint": "DyNnmUs5ubatV2937iF7GhkwKLFbuju4gJnHNQ9kmWng",
"priceImpactPct": 0.271099,
"venue": "xdex"
},
{
"address": "GzJ48LyE9SPWg9sxWNhGH71NcsN3D6FhQpivK12YLWX5",
"amountIn": "27347948",
"amountOut": "2003332716",
"feePpm": 2800,
"inMint": "DyNnmUs5ubatV2937iF7GhkwKLFbuju4gJnHNQ9kmWng",
"outMint": "So11111111111111111111111111111111111111112",
"priceImpactPct": 0.68942643,
"venue": "xdex"
}
],
"priceImpactPct": 0.96052543,
"requiresGuard": false
}
],
"amountIn": "1000000",
"amountOut": "2049354266",
"amountOutNet": "2044230880",
"asOfSlot": 73463565,
"blocked": false,
"candidates": [
{
"amountIn": "1000000",
"amountOut": "2049354266",
"confidence": {
"band": "excellent",
"level": "high",
"score": 100
},
"guard": {
"hardExcluded": false,
"maxPriceDeviationPct": 0,
"minPoolTvlXnt": 65884.29,
"penaltyBps": 0,
"thin": false,
"worstTradeReservePct": 0.00623893
},
"hops": 1,
"legs": [
{
"address": "CAJeVEoSm1QQZccnCqYu9cnNF7TTD2fcUA3E5HQoxRvR",
"amountIn": "1000000",
"amountOut": "2049354266",
"feePpm": 2800,
"inMint": "B69chRzqzDCmdB5WYB8NRu5Yv5ZA95ABiZcdzCgGm9Tq",
"outMint": "So11111111111111111111111111111111111111112",
"priceImpactPct": 0.00623892,
"venue": "xdex"
}
],
"priceImpactPct": 0.00623892,
"requiresGuard": false
},
{
"amountIn": "1000000",
"amountOut": "2003332716",
"confidence": {
"band": "good",
"level": "high",
"score": 83
},
"guard": {
"hardExcluded": false,
"maxPriceDeviationPct": 1.04741094,
"minPoolTvlXnt": 586.8,
"penaltyBps": 50,
"thin": false,
"worstTradeReservePct": 0.68942644
},
"hops": 2,
"legs": [
{
"address": "5uGVSgMoRQTN5uabJswdKpUnj8VZhiQtYYGf75kHzSGx",
"amountIn": "1000000",
"amountOut": "27347948",
"feePpm": 2800,
"inMint": "B69chRzqzDCmdB5WYB8NRu5Yv5ZA95ABiZcdzCgGm9Tq",
"outMint": "DyNnmUs5ubatV2937iF7GhkwKLFbuju4gJnHNQ9kmWng",
"priceImpactPct": 0.271099,
"venue": "xdex"
},
{
"address": "GzJ48LyE9SPWg9sxWNhGH71NcsN3D6FhQpivK12YLWX5",
"amountIn": "27347948",
"amountOut": "2003332716",
"feePpm": 2800,
"inMint": "DyNnmUs5ubatV2937iF7GhkwKLFbuju4gJnHNQ9kmWng",
"outMint": "So11111111111111111111111111111111111111112",
"priceImpactPct": 0.68942643,
"venue": "xdex"
}
],
"priceImpactPct": 0.96052543,
"requiresGuard": false
}
],
"computeUnits": 210000,
"confidence": {
"band": "excellent",
"level": "high",
"score": 100
},
"executable": null,
"expiresAt": 1787411961284,
"explanation": {
"aggregatePriceImpactPct": 0.00623892,
"hopCount": 1,
"hops": [
{
"amountIn": "1000000",
"amountOut": "2049354266",
"feeBps": 28,
"inMint": "B69chRzqzDCmdB5WYB8NRu5Yv5ZA95ABiZcdzCgGm9Tq",
"index": 0,
"inputTransferFee": null,
"outMint": "So11111111111111111111111111111111111111112",
"outputTransferFee": null,
"poolId": "CAJeVEoSm1QQZccnCqYu9cnNF7TTD2fcUA3E5HQoxRvR",
"priceImpactPct": 0.00623892,
"venue": "xdex"
}
],
"legFees": [
{
"feeBps": 28,
"poolId": "CAJeVEoSm1QQZccnCqYu9cnNF7TTD2fcUA3E5HQoxRvR"
}
],
"protocolFee": {
"amount": "5123386",
"bps": 25,
"enforcedOnChain": true,
"net": "2044230880",
"pct": 0.25
},
"requiresGuard": false,
"simulated": null,
"whyThisRoute": {
"considered": 20,
"summary": "Best net output of 20 routes.",
"tieBreak": "net-output",
"tieEpsilonBps": 1,
"tiedWithinEpsilon": 1
}
},
"fee": {
"amount": "5123386",
"bps": 25,
"enforcedOnChain": true,
"net": "2044230880",
"pct": 0.25
},
"freshnessVerified": true,
"graphUpdatedAt": 1787411834465,
"guard": {
"hardExcluded": false,
"maxPriceDeviationPct": 0,
"minPoolTvlXnt": 65884.29,
"penaltyBps": 0,
"thin": false,
"worstTradeReservePct": 0.00623893
},
"highImpact": false,
"hops": 1,
"inputMint": "B69chRzqzDCmdB5WYB8NRu5Yv5ZA95ABiZcdzCgGm9Tq",
"minimumAmountOut": "2041777802",
"mode": "exactIn",
"outputMint": "So11111111111111111111111111111111111111112",
"parts": [
{
"legs": [
{
"address": "CAJeVEoSm1QQZccnCqYu9cnNF7TTD2fcUA3E5HQoxRvR",
"amountIn": "1000000",
"amountOut": "2049354266",
"feePpm": 2800,
"inMint": "B69chRzqzDCmdB5WYB8NRu5Yv5ZA95ABiZcdzCgGm9Tq",
"outMint": "So11111111111111111111111111111111111111112",
"priceImpactPct": 0.00623892,
"venue": "xdex"
}
],
"percent": 100
}
],
"platformFee": {
"amountToken": "5123386",
"bps": 25,
"percent": "0.25"
},
"priceImpactPct": 0.00623892,
"quoteMs": 225,
"repricedAtExecution": true,
"requiresGuard": false,
"route": [
{
"address": "CAJeVEoSm1QQZccnCqYu9cnNF7TTD2fcUA3E5HQoxRvR",
"amountIn": "1000000",
"amountOut": "2049354266",
"feePpm": 2800,
"inMint": "B69chRzqzDCmdB5WYB8NRu5Yv5ZA95ABiZcdzCgGm9Tq",
"outMint": "So11111111111111111111111111111111111111112",
"priceImpactPct": 0.00623892,
"venue": "xdex"
}
],
"safety": {
"level": "safe",
"reasons": []
},
"savingsVsDirectPct": null,
"selection": {
"considered": 20,
"summary": "Best net output of 20 routes.",
"tieBreak": "net-output",
"tieEpsilonBps": 1,
"tiedWithinEpsilon": 1
},
"simulated": null,
"slippageBps": 12,
"slippageDynamic": true,
"split": null,
"splitAmountOut": null,
"thinLiquidity": false,
"ttlMs": 17000,
"ttlSlots": 45,
"validUntilSlot": 73463610,
"warnings": []
}Call it from code
The curl command shows the payment challenge. The JavaScript and Python versions pay and call, and never pay more than $0.001.
curl: see the payment challenge
# bash or zsh: see the payment challenge. Nothing is charged.
curl -sS -g -i -X POST 'https://app.fortiblox.com/api/quote' \
-H 'content-type: application/json' \
--data-raw '{"amountIn":"1000000","inputMint":"B69chRzqzDCmdB5WYB8NRu5Yv5ZA95ABiZcdzCgGm9Tq","mode":"exactIn","outputMint":"So11111111111111111111111111111111111111112"}'
# x402 v2 sends the challenge base64-encoded in the PAYMENT-REQUIRED header (v1 sends it in the body).
# To read the header:
curl -sS -g -o /dev/null -D - -X POST 'https://app.fortiblox.com/api/quote' \
-H 'content-type: application/json' \
--data-raw '{"amountIn":"1000000","inputMint":"B69chRzqzDCmdB5WYB8NRu5Yv5ZA95ABiZcdzCgGm9Tq","mode":"exactIn","outputMint":"So11111111111111111111111111111111111111112"}' \
| grep -i '^payment-required:' | cut -d' ' -f2 | tr -d '\r' | base64 --decodeJavaScript: pay and call
// npm i @x402/fetch @x402/evm viem
import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
// Pays at most $0.001 per call.
const client = new x402Client().setSpendControls({ maxAmountPerPayment: "$0.001" });
registerExactEvmScheme(client, { signer: privateKeyToAccount(process.env.EVM_PRIVATE_KEY) });
const pay = wrapFetchWithPayment(fetch, client);
// Not sure it's safe to pay? ToolVet checks it first for $0.005. Pay for that from a separate
// client: this one is capped at $0.001 per payment. GET https://toolvet.app/api/v1/check?url=https%3A%2F%2Fapp.fortiblox.com%2Fapi%2Fquote&method=POST
const res = await pay("https://app.fortiblox.com/api/quote", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
"amountIn": "1000000",
"inputMint": "B69chRzqzDCmdB5WYB8NRu5Yv5ZA95ABiZcdzCgGm9Tq",
"mode": "exactIn",
"outputMint": "So11111111111111111111111111111111111111112"
}),
});
console.log(res.status, await res.text());Python: pay and call
# pip install "x402[requests,evm]"
import os
from eth_account import Account
from x402 import x402ClientSync
from x402.http.clients import x402_requests
from x402.mechanisms.evm import EthAccountSigner
from x402.mechanisms.evm.exact.register import register_exact_evm_client
# Pays at most $0.001 per call.
client = x402ClientSync().set_spend_controls({"max_amount_per_payment": "$0.001"})
register_exact_evm_client(client, EthAccountSigner(Account.from_key(os.environ["EVM_PRIVATE_KEY"])))
with x402_requests(client) as session:
res = session.post(
"https://app.fortiblox.com/api/quote",
json={
"amountIn": "1000000",
"inputMint": "B69chRzqzDCmdB5WYB8NRu5Yv5ZA95ABiZcdzCgGm9Tq",
"mode": "exactIn",
"outputMint": "So11111111111111111111111111111111111111112",
},
)
print(res.status_code, res.text)Security scan
No findings
We scan names, descriptions and tool definitions for hidden instructions and other prompt-injection patterns.
Recent checks
| When | Result | HTTP | Time | Price |
|---|---|---|---|---|
| 2 h ago | Passed | 402 | 568 ms | $0.001 |
| 7 h ago | Passed | 402 | 418 ms | $0.001 |
| 11 h ago | Passed | 402 | 434 ms | $0.001 |
| 15 h ago | Passed | 402 | 506 ms | $0.001 |
| 19 h ago | Passed | 402 | 445 ms | $0.001 |
Show 10 older checks
| 23 h ago | Passed | 402 | 408 ms | $0.001 |
| 27 h ago | Passed | 402 | 439 ms | $0.001 |
| 31 h ago | Passed | 402 | 433 ms | $0.001 |
| 34 h ago | Passed | 402 | 426 ms | $0.001 |
| 38 h ago | Passed | 402 | 484 ms | $0.001 |
| 42 h ago | Passed | 402 | 403 ms | $0.001 |
| 46 h ago | Passed | 402 | 386 ms | $0.001 |
| 2 days ago | Passed | 402 | 389 ms | $0.001 |
| 2 days ago | Passed | 402 | 475 ms | $0.001 |
| 2 days ago | Passed | 402 | 439 ms | $0.001 |