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.
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.

