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.
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 'https://universalis.app/api/v2/aggregated/Chaos/5'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);import requests
res = requests.get("https://universalis.app/api/v2/aggregated/Chaos/5", timeout=20)
res.raise_for_status()
print(res.json()){
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
worldDcRegion | path segment | Required | A world name (`Cerberus`), data centre (`Chaos`) or region (`Europe`). Determines the scope of the aggregation. Chaos |
itemIds | path segment | Required | One item id, or several comma-separated in a single request. 5 |
listings | query | Optional | On the per-world endpoint, how many current listings to return. 10 |
entries | query | Optional | How many recent sale history entries to return. 5 |
hq | query | Optional | Restrict 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
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
Percentage Change Calculator
Work out the percentage increase or decrease between an old and a new value. See the absolute change and whether it went up or down, instantly and privately.
Timestamp Converter
Convert timestamps to human-readable dates and dates back to timestamps. Auto-detects seconds vs milliseconds, shows local, UTC and ISO 8601 formats.
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.