Public API · preview

Observed listings, ready to integrate.

Read the same confirmed Spirit Vale market snapshot used by ValeMarket. Public reads need no API key during preview.

market-api.spiritvalers.com
$ curl "https://market-api.spiritvalers.com/v2/markets/global/listings?snapshot=2&sort=price-asc&limit=2"

    
AccessNo key required
Snapshot15-minute edge cache
FormatJSON over HTTPS
CoverageObserved active listings

Quickstart

One URL. No setup.

Use the global market and request no more than 100 rows per page. Continue increasing offset until a page contains fewer rows than limit.

const url = new URL("https://market-api.spiritvalers.com/v2/markets/global/listings");
url.search = new URLSearchParams({
  snapshot: "2",
  sort: "price-asc",
  limit: "100",
  offset: "0"
});

const response = await fetch(url);
if (!response.ok) throw new Error(`ValeMarket ${response.status}`);
const snapshot = await response.json();
Public preview. Read endpoints do not currently require an Authorization header. The contributor upload token is a separate credential and is not a developer API key.

Endpoints

Read the market.

GET/v2/markets/{marketId}/listingsCurrent listings

Returns confirmed, fresh observations across the market. Use global as the current market ID.

  • minPriceMinimum unit price
  • maxPriceMaximum unit price
  • statStat name filter
  • sortprice-asc or price-desc
  • offset0–100,000
  • limit1–100; default 50
  • snapshotCurrent browser contract: 2
GET/v2/markets/{marketId}/items/{itemType}/{itemId}One item

Returns current observations for one numeric item type and item ID. It accepts the same filters and pagination parameters as the market listing route.

/v2/markets/global/items/1/Flax?limit=100
GET/v2/markets/{marketId}/items/{itemType}/{itemId}/historyObservation history

Returns up to 100 confirmed historical observations for one item. This endpoint does not accept query parameters.

/v2/markets/global/items/1/Flax/history
GET/healthService health

Returns service status and the current observation protocol version. Use this for diagnostics, not frequent polling.

{"status":"ok","protocolVersion":2}

Response

Fields that matter.

Listing responses contain marketId, generatedAt, and a listings array. Item routes also echo itemType and itemId.

FieldTypeMeaning
generatedAtISO 8601When this cached API snapshot was generated.
listingKeystringStable public identity for the observed listing.
itemType / itemIdinteger / stringSpirit Vale item identifiers.
displayNamestring | nullObserved display name when available.
unitPrice / quantityintegerObserved unit price and quantity.
statsarrayPublic item roll fields: type, optional name/value, and percent flag.
firstSeenAt / lastSeenAtISO 8601Bounds of confirmed observation time.
expiresAtISO 8601 | nullKnown listing expiry. Filter rows where this time has passed.
Privacy boundary. Responses never contain seller, buyer, account, character, shop, installation-path, or raw-packet data.

Freshness

Share the snapshot.

Cloudflare caches public responses for 15 minutes. The snapshot limits database work and gives every integration a consistent view of recently confirmed observations.

  1. Honor Cache-Control and ETag. Do not add cache-busting query values or poll faster than the shared snapshot interval.
  2. Use generatedAt for snapshot age. Your local request time does not describe data freshness.
  3. Filter expiresAt locally. A listing can expire during the 15-minute cache window.
  4. Treat rows as observations, not sales. ValeMarket does not report completed transactions or guarantee that a listing remains available.

Errors

Handle status, then JSON.

StatusMeaningAction
304Not modifiedReuse the representation associated with your ETag.
400Invalid path or queryRead the JSON error and correct the request.
404Unknown routeCheck the endpoint and path identifiers.
429Traffic limitedBack off. Do not rotate addresses or add cache-busting parameters.
503Reads temporarily disabledHonor Retry-After when present.

Developer access

Building something public?

Tell us what you are integrating and the traffic you expect. Reads remain keyless during preview; access requests help shape managed keys, quotas, and change notifications before they become necessary.

Request developer access ↗