Developer API

Build tools on top of Paragon using the public read endpoints below. Trading actions (buying/canceling) are on-chain and must be executed via a user's wallet.

Base URL

https://paragon-otc.com

Example: GET https://paragon-otc.com/api/listings

API key (free)

Generate a key tied to your wallet (maximum 1 active key per wallet). This keeps the API free while protecting the marketplace from abusive polling.

Built something cool (bot, app, dashboard)? Share it with us - standout projects built on Paragon can be highlighted on our socials.

Your API key (1 per wallet)

Generate a free key tied to your wallet. Use it as x-paragon-dev-key.

Connect your wallet to generate a key.

Integration examples

JavaScript / TypeScript

const API_BASE_URL = "https://paragon-otc.com";

async function getListings() {
  const res = await fetch(`${API_BASE_URL}/api/listings`, {
    headers: {
      // Optional: increases the rate-limit tier
      "x-paragon-dev-key": "YOUR_KEY",
    },
  });
  if (!res.ok) throw new Error(await res.text());
  return res.json();
}

Endpoints (read)

  • GET /api/listings
  • GET /api/tokens
  • GET /api/prices?token=0x...
  • POST /api/prices/batch
  • GET /api/dex-pair?token=0x...
  • GET /api/stats
  • GET /api/wallet-tokens?address=0x...

On-chain trading

Buying and canceling go directly to the escrow contract. Paragon does not provide a buy-for-me HTTP endpoint.

0x022dDa2c225f37F8cB053bB25BBE3f71239800d7

View verified escrow contract on Basescan (opens in new tab)

Example: auto-sniper scan

The snippet below is a *read-only* scanner. To actually buy, call the escrow contract from the user's wallet (see on-chain trading note above).

async function autoSniperScan() {
  const listingsRes = await fetch(`${API_BASE_URL}/api/listings`);
  const { listings } = await listingsRes.json();

  // Pull market prices in one request (cheap + fast)
  const tokenAddresses = [...new Set(listings.map(l => l.token.toLowerCase()))];
  const pricesRes = await fetch(`${API_BASE_URL}/api/prices/batch`, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "x-paragon-dev-key": "YOUR_KEY",
    },
    body: JSON.stringify({ addresses: tokenAddresses }),
  });
  const { prices } = await pricesRes.json();

  // Compare Paragon listing price vs DEX market price.
  // Note: listing.totalAmount is in token base units; use listing.decimals.
  for (const l of listings) {
    if (!l.active) continue;
    if (l.amountRemaining === "0" || BigInt(l.amountRemaining) <= 0n) continue;

    const market = prices[l.token.toLowerCase()];
    if (!market?.priceEth) continue;

    const totalTokens = Number(l.totalAmount) / 10 ** l.decimals;
    const listingPricePerTokenEth =
      Number(l.priceInEth) / totalTokens;

    const targetDiscount = 0.05; // 5%
    const marketPricePerTokenEth = market.priceEth;

    const isCheap = listingPricePerTokenEth < marketPricePerTokenEth * (1 - targetDiscount);
    if (isCheap) {
      // Execute on-chain from the user wallet:
      // - Standard: buyListing(listingId)
      // - Crowdfunding: buyPartial(listingId, tokenAmount)
      console.log("Opportunity:", l.id);
    }
  }
}

This API is free to use, but it is rate-limited to protect Paragon's upstream providers and keep the marketplace fast for everyone.