79trust / 100

Quote

by FortiSwap in Onchain & crypto

x402 APIPassing, checked 2 h ago

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.

POST
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

Run a free test callHow to call it

Reliability

All checks passedSome failedAll failedNot checked

Status and outage history · Atom feed

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

ParameterTypeRequiredDescription
amountInstringNoraw base units of inputMint (exactIn)
amountOutstringNoraw base units of outputMint (exactOut — GROSS target)
inputMintstringYesbase58 X1 mint address
maxHopsnumberNodefault 4; clamped to 1-8 by the pathfinder. Keep ≤ 6 so /api/tx/build (on-chain router, max 6 legs) executes the same route.
modestringNodefault 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.
outputMintstringYesbase58 X1 mint address
payerstringNobase58 payer for simulate:true
simulatebooleanNosimulate the build (needs payer)
slippageBpsnumberNoexplicit 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 --decode
JavaScript: 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

WhenResultHTTPTimePrice
2 h agoPassed402568 ms$0.001
7 h agoPassed402418 ms$0.001
11 h agoPassed402434 ms$0.001
15 h agoPassed402506 ms$0.001
19 h agoPassed402445 ms$0.001
Show 10 older checks
23 h agoPassed402408 ms$0.001
27 h agoPassed402439 ms$0.001
31 h agoPassed402433 ms$0.001
34 h agoPassed402426 ms$0.001
38 h agoPassed402484 ms$0.001
42 h agoPassed402403 ms$0.001
46 h agoPassed402386 ms$0.001
2 days agoPassed402389 ms$0.001
2 days agoPassed402475 ms$0.001
2 days agoPassed402439 ms$0.001