BYTETOOLS

Universalis API

Free Final Fantasy XIV market board API with no key: crowdsourced listings, recent sales, average prices and sale velocity per data centre and world. Tested example included.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the Universalis API?

Universalis is a free, key-free API for Final Fantasy XIV market board data. It aggregates crowdsourced listings and sale history from player clients, exposing current minimum listings, recent purchases, average sale prices and daily sale velocity for any item on any world or data centre.

Square Enix publishes no market board API, so the FFXIV economy would be invisible to tooling if not for Universalis. Data is uploaded by players running compatible clients, then aggregated per world, data centre and region — which is why coverage is excellent on busy servers and thinner on quiet ones.

The `/aggregated` endpoint used below is the one worth knowing. Instead of returning thousands of raw listings, it hands back four condensed figures per item — minimum listing, most recent purchase, average sale price and daily sale velocity — each split by world, data centre and region, and each separated into normal quality and high quality. That is almost exactly the set of numbers a crafting-profit calculator needs, in a single small response.

Quick facts

Base URL
https://universalis.app/api/v2
Authentication
No API key for reads. Uploading market data requires a key, but consuming it does not.
Rate limit
Approximately 25 requests per second per IP, with a burst allowance.
Pricing
Free, community-funded and open source.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the Universalis API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Aggregated market data for item 5 on the Chaos data centre

GET https://universalis.app/api/v2/aggregated/Chaos/5

curl
curl 'https://universalis.app/api/v2/aggregated/Chaos/5'
JavaScript (fetch)
const res = await fetch("https://universalis.app/api/v2/aggregated/Chaos/5");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://universalis.app/api/v2/aggregated/Chaos/5", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200
{
  "results": [
    {
      "itemId": 5,
      "nq": {
        "minListing": {
          "dc": {
            "price": 17,
            "worldId": 39
          },
          "region": {
            "price": 17,
            "worldId": 39
          }
        },
        "recentPurchase": {
          "dc": {
            "price": 43,
            "timestamp": 1787268444000,
            "worldId": 71
          },
          "region": {
            "price": 43,
            "timestamp": 1787268444000,
            "worldId": 71
          }
        },
        "averageSalePrice": {
          "dc": {
            "price": 31.29146852709298
          },
          "region": {
            "price": 33.94655511754546
          }
        },
        "dailySaleVelocity": {
          "dc": {
            "quantity": 19878.564109065406
          },
          "region": {
            "quantity": 54190.60492139792
          }
        }
      },
      "hq": {
        "minListing": {},
        "recentPurchase": {},
        "averageSalePrice": {},
        "dailySaleVelocity": {}
      },
      "worldUploadTimes": [
        {
          "worldId": 39,
          "timestamp": 1787261604769
        }
      ]
    }
  ],
  "failedItems": []
}

Parameters

ParameterTypeRequiredDescription
worldDcRegionpath segmentRequiredA world name (`Cerberus`), data centre (`Chaos`) or region (`Europe`). Determines the scope of the aggregation. Chaos
itemIdspath segmentRequiredOne item id, or several comma-separated in a single request. 5
listingsqueryOptionalOn the per-world endpoint, how many current listings to return. 10
entriesqueryOptionalHow many recent sale history entries to return. 5
hqqueryOptionalRestrict results to high-quality items only. true

Response fields

results[].itemIdinteger
The FFXIV item id the block describes.
results[].nq / hqobject
Normal-quality and high-quality figures, kept separate because HQ items routinely sell for several times the NQ price.
minListingobject
Cheapest current listing, broken down by `world`, `dc` and `region`, each with `price` and the `worldId` it is on.
recentPurchaseobject
Most recent completed sale with `price`, `timestamp` in milliseconds and `worldId` — the best single indicator of what an item actually sells for.
averageSalePriceobject
Mean sale price over the recent window, which smooths out undercutting wars.
dailySaleVelocityobject
Units sold per day. A high price with near-zero velocity means the item is listed, not selling.

What you can build with the Universalis API

  • Build a crafting profit calculator comparing material cost against sale price
  • Alert when an item drops below a target price on your data centre
  • Find which world in a data centre has the cheapest listing for a shopping run
  • Track market trends for gatherers deciding what to farm

Common errors and how to fix them

400

Unknown world, data centre or region name.

Fix: Names are case-sensitive and must match FFXIV's own spelling. Fetch `/data-centers` and `/worlds` once and cache them.

404

The item id does not exist or is untradeable.

Fix: Untradeable items never appear on the market board. Cross-check ids against XIVAPI.

Empty results

No recent data uploaded for that item on that world.

Fix: Widen the scope from world to data centre or region — quiet worlds have sparse coverage because the data is crowdsourced.

Universalis API — frequently asked questions

Is the Universalis API free?

Yes, reading market data is free with no API key. Universalis is a community-run, open-source project; only uploading market data requires credentials.

Where does Universalis get FFXIV market data?

From players. Compatible third-party clients upload market board contents as players browse them, and Universalis aggregates those uploads. That means data freshness tracks player activity — busy items on busy worlds update constantly, obscure items on quiet worlds can be days old.

What is the difference between the aggregated and listings endpoints?

`/aggregated` returns four summary numbers per item — minimum listing, recent purchase, average price and sale velocity — in a small response. The per-world endpoint returns the raw listings and sale history, which is much larger but lets you see the full order book.

Why is the price high but nothing is selling?

Check `dailySaleVelocity`. A high `minListing` with a velocity near zero means someone has listed an item nobody is buying. `recentPurchase` and `averageSalePrice` are far better guides to what an item is actually worth.

Tools that pair with this API

Universalis is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.