API Explorer

Trade Ledger API

Endpoint: /api/trade-ledgers

This API endpoint returns all Trade Ledger information and collection details from the database.

export async function GET() {
  try {
    const tradeLedgers = await prisma.tradeLedgerCreated.findMany({
      orderBy: { timestamp: 'desc' }
    });
    const serializedTradeLedgers = tradeLedgers.map((ledger) => ({
      id: ledger.ledger_id,
      collectionId: ledger.collection_id,
      collectionName: ledger.name || ledger.collection_id,
      currencyType: ledger.currency_type,
      createdAt: ledger.timestamp,
      currentSupply: ledger.current_supply,
      maxSupply: ledger.max_supply,
      isMutable: ledger.is_mutable,
      hasDenyListAuthority: ledger.has_deny_list_authority,
      denyListSize: ledger.deny_list_size,
      description: ledger.description,
      uri: ledger.uri,
      logoUri: ledger.logo_uri,
      creator: ledger.creator
    }));
    return new NextResponse(JSON.stringify(serializedTradeLedgers), {
      status: 200,
      headers: {
        'Access-Control-Allow-Origin': '*',
        'Content-Type': 'application/json'
      }
    });
  } catch (error) {
    console.error("[TradeLedger API] Error:", error);
    return new NextResponse(JSON.stringify([]), { status: 500 });
  }
}

No data fetched yet.

The UI below shows the active trading pools by calling the API and rendering the TradeTable component.

DEX

Trade Events API

Endpoint: /api/trade-events?ledgerId=YOUR_LEDGER_ID

This API endpoint returns trade events (sell and buy price history) for a given ledger ID.

export async function GET(request: Request) {
  try {
    const { searchParams } = new URL(request.url);
    const ledgerId = searchParams.get('ledgerId');
    if (!ledgerId) {
      return NextResponse.json({ error: 'ledgerId is required' }, { status: 400 });
    }
    // Fetch OfferAccepted events
    const offerAcceptedEvents = await prisma.offerAccepted.findMany({
      where: { ledger_id: ledgerId },
      orderBy: { timestamp: 'asc' },
      select: {
        requested_amount: true,
        timestamp: true,
        offered_asset_ids: true
      }
    });
    // Fetch BuyOfferAccepted events
    const buyOfferAcceptedEvents = await prisma.buyOfferAccepted.findMany({
      where: { ledger_id: ledgerId },
      orderBy: { timestamp: 'asc' },
      select: {
        offered_amount: true,
        timestamp: true,
        requested_asset_count: true
      }
    });
    // Process events and format response
    const sellPriceHistory = offerAcceptedEvents
      .filter(event => event.timestamp && event.requested_amount &&
        Array.isArray(event.offered_asset_ids) && event.offered_asset_ids.length > 0)
      .map(event => ({
        timestamp: event.timestamp,
        requested_amount: event.requested_amount,
        offered_asset_ids: event.offered_asset_ids,
        volume: event.offered_asset_ids.length,
        type: 'sell'
      }));
    const buyPriceHistory = buyOfferAcceptedEvents
      .filter(event => event.timestamp && event.offered_amount &&
        event.requested_asset_count && parseInt(event.requested_asset_count, 10) > 0)
      .map(event => ({
        timestamp: event.timestamp,
        offered_amount: event.offered_amount,
        requested_asset_count: event.requested_asset_count,
        volume: parseInt(event.requested_asset_count, 10),
        type: 'buy'
      }));
    const apiResponse = { sellPriceHistory, buyPriceHistory };
    return NextResponse.json(apiResponse);
  } catch (error: any) {
    console.error('[API] Error fetching trade events:', error);
    return NextResponse.json({ error: 'Failed to fetch trade events' }, { status: 500 });
  }
}

No data fetched yet.

No data to display.

Trade Chart Interface (Events API)

Endpoint: /api/trade-events?ledgerId=YOUR_LEDGER_ID

This API endpoint returns trade events (sell and buy price history) for the given ledger ID.

export async function GET(request: Request) {
  try {
    const { searchParams } = new URL(request.url);
    const ledgerId = searchParams.get('ledgerId');
    if (!ledgerId) {
      return NextResponse.json({ error: 'ledgerId is required' }, { status: 400 });
    }
    // Fetch OfferAccepted events
    const offerAcceptedEvents = await prisma.offerAccepted.findMany({
      where: { ledger_id: ledgerId },
      orderBy: { timestamp: 'asc' },
      select: {
        requested_amount: true,
        timestamp: true,
        offered_asset_ids: true
      }
    });
    // Fetch BuyOfferAccepted events
    const buyOfferAcceptedEvents = await prisma.buyOfferAccepted.findMany({
      where: { ledger_id: ledgerId },
      orderBy: { timestamp: 'asc' },
      select: {
        offered_amount: true,
        timestamp: true,
        requested_asset_count: true
      }
    });
    // Process and format response
    const sellPriceHistory = offerAcceptedEvents
      .filter(event => event.timestamp && event.requested_amount &&
        Array.isArray(event.offered_asset_ids) && event.offered_asset_ids.length > 0)
      .map(event => ({
        timestamp: event.timestamp,
        requested_amount: event.requested_amount,
        offered_asset_ids: event.offered_asset_ids,
        volume: event.offered_asset_ids.length,
        type: 'sell'
      }));
    const buyPriceHistory = buyOfferAcceptedEvents
      .filter(event => event.timestamp && event.offered_amount &&
        event.requested_asset_count && parseInt(event.requested_asset_count, 10) > 0)
      .map(event => ({
        timestamp: event.timestamp,
        offered_amount: event.offered_amount,
        requested_asset_count: event.requested_asset_count,
        volume: parseInt(event.requested_asset_count, 10),
        type: 'buy'
      }));
    const apiResponse = { sellPriceHistory, buyPriceHistory };
    return NextResponse.json(apiResponse);
  } catch (error: any) {
    console.error('[API] Error fetching trade events:', error);
    return NextResponse.json({ error: 'Failed to fetch trade events' }, { status: 500 });
  }
}

No data fetched yet.

The TradeChart below is rendered using the selected ledger ID.

Last Price

0.00

24h Volume

0.00

Open

0.00

High

0.00

Close

0.00

Buy Offers/Best Offers API

Endpoint: /api/buy-offers/best-offers?limit=10&ledgerId=YOUR_LEDGER_ID&includeDetails=true

This API endpoint returns the best buy offers (for sellers to accept) for the given ledger ID.

export async function GET(request: Request) {
  try {
    const { searchParams } = new URL(request.url);
    const ledgerId = searchParams.get('ledgerId');
    const limit = searchParams.get('limit');
    // Fetch best buy offers from the database
    const response = await prisma.buyOfferAccepted.findMany({
      where: { ledger_id: ledgerId },
      orderBy: { timestamp: 'asc' },
      select: {
        offer_id: true,
        buyer: true,
        collection_id: true,
        requested_asset_count: true,
        original_quantity: true,
        offered_currency: true,
        offered_amount: true,
        status: true,
        timestamp: true,
        ledger_id: true,
        collection: { select: { name: true } }
      }
    });
    // Format response
    const offers = response.map((offer) => ({
      offer_id: offer.offer_id,
      buyer: offer.buyer,
      collection_id: offer.collection_id,
      requested_asset_count: offer.requested_asset_count,
      original_quantity: offer.original_quantity || offer.requested_asset_count,
      offered_currency: offer.offered_currency,
      offered_amount: offer.offered_amount,
      status: offer.status,
      timestamp: offer.timestamp,
      ledger_id: offer.ledger_id,
      collection: { name: offer.collection?.name }
    }));
    return NextResponse.json({ offers });
  } catch (error) {
    console.error('Error fetching buy offers:', error);
    return NextResponse.json({ error: 'Failed to fetch offers' }, { status: 500 });
  }
}

No data fetched yet.

No data available.

Trade Offers/Best Offers API

Endpoint: /api/trade-offers/best-offers?limit=10&ledgerId=YOUR_LEDGER_ID

This API endpoint returns sell offers (for buyers to purchase) for the given ledger ID.

export async function GET(request: Request) {
  try {
    const { searchParams } = new URL(request.url);
    const ledgerId = searchParams.get('ledgerId');
    const limit = searchParams.get('limit');
    // Fetch sell offers from the database
    const response = await prisma.offerCreated.findMany({
      where: { ledger_id: ledgerId },
      orderBy: { timestamp: 'asc' },
      select: {
        offer_id: true,
        offerer: true,
        collection_id: true,
        offered_asset_ids: true,
        requested_currency: true,
        requested_amount: true,
        original_quantity: true,
        status: true,
        timestamp: true,
        ledger_id: true,
        collection: { select: { name: true } }
      }
    });
    const offers = response.map((offer) => ({
      offer_id: offer.offer_id,
      offerer: offer.offerer,
      collection_id: offer.collection_id,
      offered_asset_ids: offer.offered_asset_ids,
      requested_currency: offer.requested_currency,
      requested_amount: offer.requested_amount,
      original_quantity: offer.original_quantity || String(offer.offered_asset_ids.length),
      status: offer.status,
      timestamp: offer.timestamp,
      ledger_id: offer.ledger_id,
      collection: { name: offer.collection?.name }
    }));
    return NextResponse.json({ offers });
  } catch (error) {
    console.error('Error fetching sell offers:', error);
    return NextResponse.json({ error: 'Failed to fetch offers' }, { status: 500 });
  }
}

No data fetched yet.

No active offers available.

User Offers API

Endpoint: /api/user-offers/[address]

This API endpoint returns all offers (buy/sell/partially_filled) by user

// File: /api/user-offers/[address]/route.ts
import { NextResponse } from 'next/server';
import prisma from '../../lib/prisma';

function serializeBigInts(obj: any): any {
  if (typeof obj === 'bigint') return obj.toString();
  if (Array.isArray(obj)) return obj.map(serializeBigInts);
  if (obj !== null && typeof obj === 'object') {
    const newObj: any = {};
    for (const key in obj) {
      newObj[key] = serializeBigInts(obj[key]);
    }
    return newObj;
  }
  return obj;
}

export async function GET(request: Request, { params }: { params: { address: string } }) {
  try {
    console.log("[/api/user-offers] Fetching offers for address:", params.address);
    // Fetch ledger metadata.
    const tradeLedgers = await prisma.tradeLedgerCreated.findMany({
      select: { ledger_id: true, collection_id: true, name: true, currency_type: true },
    });
    // Fetch sell offers (user is the offerer).
    const sellOffers = await prisma.offerCreated.findMany({
      where: { offerer: params.address, status: { in: ['OPEN', 'PARTIALLY_FILLED'] } },
      orderBy: { timestamp: 'desc' },
    });
    // Fetch buy offers (user is the buyer).
    const buyOffers = await prisma.buyOfferCreated.findMany({
      where: { buyer: params.address, status: { in: ['OPEN', 'PARTIALLY_FILLED'] } },
      orderBy: { timestamp: 'desc' },
    });
    const markedSellOffers = sellOffers.map((offer) => ({ ...offer, type: 'sell' }));
    const markedBuyOffers = buyOffers.map((offer) => ({ ...offer, type: 'buy' }));
    const allOffers = [...markedSellOffers, ...markedBuyOffers];
    const enrichedOffers = allOffers.map((offer: any) => {
      const ledger = tradeLedgers.find((l) => l.ledger_id === offer.ledger_id);
      if (offer.type === 'sell') {
        return {
          id: offer.offer_id,
          type: 'sell',
          user: offer.offerer,
          collection: {
            id: ledger?.collection_id || '',
            name: ledger?.name || 'Unknown Collection',
          },
          requested_amount: offer.requested_amount,
          status: offer.status,
          timestamp: offer.timestamp,
          trade_ledger_id: offer.ledger_id,
          tradeOfferAssets: offer.offered_asset_ids,
        };
      } else {
        return {
          id: offer.offer_id,
          type: 'buy',
          user: offer.buyer,
          collection: {
            id: ledger?.collection_id || '',
            name: ledger?.name || 'Unknown Collection',
          },
          offered_amount: offer.offered_amount,
          status: offer.status,
          timestamp: offer.timestamp,
          ledger_id: offer.ledger_id,
        };
      }
    });
    return NextResponse.json({ success: true, offers: serializeBigInts(enrichedOffers) });
  } catch (error) {
    console.error("[/api/user-offers] Error:", error);
    return NextResponse.json(
      { success: false, error: error instanceof Error ? error.message : "Unknown error" },
      { status: 500 }
    );
  }
}

No data fetched yet.

No offers found.

Transaction History API

Endpoint: /api/transaction-history/$0x9470585d9b80a03d6e86a4615d5a51e9c687cfa0bd1cd162fe8184e89be77087?page=$page

This API endpoint returns sell offers (for buyers to purchase) for the given ledger ID.

export async function GET(request: Request) {
  try {
    const { searchParams } = new URL(request.url);
    const ledgerId = searchParams.get('ledgerId');
    const limit = searchParams.get('limit');
    // Fetch sell offers from the database
    const response = await prisma.offerCreated.findMany({
      where: { ledger_id: ledgerId },
      orderBy: { timestamp: 'asc' },
      select: {
        offer_id: true,
        offerer: true,
        collection_id: true,
        offered_asset_ids: true,
        requested_currency: true,
        requested_amount: true,
        original_quantity: true,
        status: true,
        timestamp: true,
        ledger_id: true,
        collection: { select: { name: true } }
      }
    });
    const offers = response.map((offer) => ({
      offer_id: offer.offer_id,
      offerer: offer.offerer,
      collection_id: offer.collection_id,
      offered_asset_ids: offer.offered_asset_ids,
      requested_currency: offer.requested_currency,
      requested_amount: offer.requested_amount,
      original_quantity: offer.original_quantity || String(offer.offered_asset_ids.length),
      status: offer.status,
      timestamp: offer.timestamp,
      ledger_id: offer.ledger_id,
      collection: { name: offer.collection?.name }
    }));
    return NextResponse.json({ offers });
  } catch (error) {
    console.error('Error fetching sell offers:', error);
    return NextResponse.json({ error: 'Failed to fetch offers' }, { status: 500 });
  }
}

No data fetched yet.

Transaction History

No transactions found.

  • Previous
  • 1(current)
  • Next