Skip to main content

Setup

Set up your payment handler in just 3 lines:
import { payer } from "@faremeter/rides";

const { PAYER_KEYPAIR } = process.env;
if (!PAYER_KEYPAIR) throw new Error("PAYER_KEYPAIR must be set");

await payer.addLocalWallet(PAYER_KEYPAIR);
@faremeter/rides automatically detects your network, looks up USDC, and sets up payments using your existing wallet. All examples below use payer.fetch().

Example: Get Ultra Swap Order

Get a swap order from Jupiter Ultra API to swap SOL for USDC:
const url = "https://jupiter.api.corbits.dev/ultra/v1/order";
const params = new URLSearchParams({
  inputMint: "So11111111111111111111111111111111111111112",
  outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  amount: "20000000", // 0.02 SOL
  taker: keypair.publicKey.toString(),
});

const response = await payer.fetch(`${url}?${params}`, {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
  },
});

if (!response.ok) {
  const text = await response.text().catch(() => "");
  throw new Error(`HTTP ${response.status} ${response.statusText} ${text}`);
}

const data = await response.json();
console.log("Order:", data);
Response:
{
  "inputMint": "So11111111111111111111111111111111111111112",
  "outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "inAmount": "20000000",
  "outAmount": "3950208",
  "otherAmountThreshold": "3950208",
  "swapMode": "ExactIn",
  "slippageBps": 0,
  "priceImpactPct": "-0.00008643424321743619",
  "routePlan": [
    {
      "swapInfo": {
        "ammKey": "CDg3bPoM21fSXEzrXWHWyJR33JHX6xaYboq5p7s4uo48",
        "label": "JupiterZ",
        "inputMint": "So11111111111111111111111111111111111111112",
        "outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
        "inAmount": "20000000",
        "outAmount": "3950208",
        "feeAmount": "0",
        "feeMint": "11111111111111111111111111111111"
      },
      "percent": 100,
      "bps": 10000
    }
  ],
  "feeBps": 2,
  "transaction": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAIABwymr6yEAmkOIXpp3AcyvWL/QB2KoDZDEZAXeMYvfP7cvX2GccTyUv/8NNJu0NSB5SoWS7JIhaa9zHr78G5uBMUEDiUHiMuOTEfv/7RvoyR8p3lT/6Mq87vOJ1wZbQZg8PAPZvgVNXGQR4l/GibNBPjRJtllQ2kqGDcrpjCUaFKkdTEoCcIAOijQ/K6XL/DomekHphWz3DtasCDmpm6oSYyoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBkZv5SEXMv/srbpyw5vnvIzlu8X3EmssQ5s6QAAAAAabiFf+q4GE+2h/Y0YYwDXaxDncGus7VZig8AAAAAABBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKlKWEn7cqO76R/cWw5qV/Y8Why0WyBnpu0MrNNjlcihAoyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZxvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWEgcFbMjomQuxE8wLgAmQ52risWV1DEwveq74wTerSZqgQGAAkDLR8AAAAAAAAGAAUC7lwAAAoGAQQBCwUIAQEJCwEACQIEAwcICwgFI6hgt6NcCiigAC0xAQAAAACARjwAAAAAABobAWkAAAAAAgAAAA==",
  "gasless": true,
  "signatureFeeLamports": 10000,
  "signatureFeePayer": "CDg3bPoM21fSXEzrXWHWyJR33JHX6xaYboq5p7s4uo48",
  "prioritizationFeeLamports": 190,
  "prioritizationFeePayer": "CDg3bPoM21fSXEzrXWHWyJR33JHX6xaYboq5p7s4uo48",
  "rentFeeLamports": 2039280,
  "rentFeePayer": "9SzsCg5UDKUEErgTwtD1HShi48zhMVpp955XN58e4dZD",
  "requestId": "1b34afec-da95-7bc6-ec12-d9c2e58980b6",
  "swapType": "rfq",
  "router": "jupiterz",
  "taker": "9SzsCg5UDKUEErgTwtD1HShi48zhMVpp955XN58e4dZD",
  "inUsdValue": 3.949731158798133,
  "outUsdValue": 3.94938976677451,
  "priceImpact": -0.008643424321743618,
  "mode": "ultra"
}
The response includes:
  • transaction: Base64 encoded transaction ready to sign
  • requestId: Unique identifier for this order
  • inAmount/outAmount: Input and output token amounts
  • routePlan: The swap route through DEXs
  • gasless: Whether Jupiter pays transaction fees
  • rentFeeLamports: Account rent cost (paid by taker)
  • taker: Wallet address executing the swap

Payment Flow

When you make a request, the following happens automatically:
  1. Initial Request: Client sends swap order request
  2. 402 Response: Proxy returns payment requirements
{
  "accepts": [{
    "network": "solana-mainnet-beta",
    "maxAmountRequired": 10000,
    "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "payTo": "9f8qtNZUwqr1ZWZmm6ETec6wmQmaxiPahERnzVRrZ98i"
  }]
}
  1. Payment: Payment handler processes USDC transfer (0.01 USDC)
  2. Success: Proxy fulfills original request with 200 OK
All of this is handled automatically by payer.fetch() or fetchWithPayer!

External Resources