Skip to content

Market data

All routes on this page are public. Set $API as in the quickstart. No session or signing key is required.

Route Use
GET /v1/collections Discover collections
GET /v1/collections/{slug}/assets Browse a collection’s assets
GET /v1/artists Discover artists
GET /v1/assets/{asset} Read an asset’s metadata
GET /v1/assets/{asset}/book Read listings, price levels, offers, and trades

Use the returned collection slug and canonical asset ID in later requests. Asset IDs and subasset display names are not interchangeable.

Terminal window
curl -sS "$API/v1/collections/rare-pepe/assets?limit=20"
curl -sS "$API/v1/assets/RAREPEPE/book"

An asking price is a seller’s requested price, not a completed sale. A floor price is the cheapest available listing. Use the book for current asking prices, and fills for trading activity.

Offers sharing funding_slot_id can fund only one purchase. Deduplicate by that ID when calculating liquidity; eligible targets are not independent buying capacity. See Offers.

Terminal window
curl -sS "$API/v1/events?kind=sales&limit=20"
curl -sS "$API/v1/fills?collection=rare-pepe&limit=20"
curl -sS "$API/v1/analytics"

GET /v1/events covers listings, offers, and sales. GET /v1/fills is the trade history. GET /v1/analytics provides aggregate market metrics, daily sales, and sampled market depth. Check each response’s status and time fields when deciding what to count as settled volume.

Read Events for feed semantics and deduplication. Your private account feed is separate and requires your address’s session.

Paged routes return result, result_count, and next_cursor. Follow the cursor until it is null; the first page is not necessarily the full result. Keep filters unchanged while paging. Start without a cursor when you change them. Limits and available filters are listed per endpoint in the reference.

Using standard JavaScript fetch:

let cursor;
do {
const url = new URL("https://api.digirare.com/v1/fills");
url.searchParams.set("limit", "50");
if (cursor) url.searchParams.set("cursor", cursor);
const response = await fetch(url);
if (!response.ok) throw new Error(`HTTP ${response.status}: stop and check the response before retrying`);
const page = await response.json();
for (const fill of page.result) {
// Store or display the fill. Deduplicate when polling overlapping pages.
}
cursor = page.next_cursor;
} while (cursor);

Public reads can be cached, and confirmed Bitcoin transactions take time to appear in Counterparty’s indexed balances. A book snapshot does not guarantee that a listing is still available. Request a fresh quote before signing; the API verifies availability again at submission.

Reuse results while rendering a page, avoid polling each card separately, and honor Retry-After on 429. See Limits and errors for request budgets and indexing delays.