Universalis is a crowdsourced market board API for Final Fantasy XIV, aggregating item listings, prices, and sale history submitted by the game's own community-plugin ecosystem across every data center and world. It exposes a keyless REST API alongside a WebSocket feed for real-time listing updates, both free to use. The old `/docs/index.html` path now permanently redirects to a dedicated documentation site.
Universalis is a crowdsourced Final Fantasy XIV market board API, aggregating item listings and sale history submitted by the game's own community-plugin ecosystem. A live GET this run against /Chaos/5?listings=1&entries=1 (a world name plus an item ID as path segments, not query params) returned a genuine 2,230 B listing object at HTTP 200, content-type: application/json; charset=utf-8, access-control-allow-origin: *.
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSON, WebSocketResponses can be requested as JSON or WebSocket.
GreatAPIs Score
Score100out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs20/20Machine-readable spec file bundled
Formats15/15Supports 2 response formats
Freshness20/20Verified within 6 months
Embed this badge
<a href="https://greatapis.com/api/universalis/"><img src="https://greatapis.com/badge/universalis.svg" alt="Scored 100 on greatapis.com"></a>
Auth quickstart
No API key, signup, or credit card required — the live GET above returned real, current listing data with no auth header of any kind attached.
Stored keyNo key stored
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Endpoints
Available data centers1
GET/api/v2/data-centersReturns all data centers supported by the API.
Responses
Status
Description
Schema
200
Success
—
Available worlds1
GET/api/v2/worldsReturns the IDs and names of all worlds supported by the API.
Responses
Status
Description
Schema
200
Success
—
Current item price1
GET/api/v2/aggregated/{worldDcRegion}/{itemIds}Retrieves aggregated market board data for the given items.
Up to 100 item IDs can be comma-separated in order to retrieve data for multiple items at once.
AverageSalePrice and DailySaleVelocity are calculated based on sales of the last 4 days.
This API uses only cached values and is therefore strongly preferred over CurrentlyShown if individual sales/listings are not required.
The world/DC or item requested is invalid. When requesting multiple items at once, an invalid item ID
will not trigger this. Instead, the returned list of unresolved item IDs will contain the invalid item ID or IDs.
Microsoft.AspNetCore.Mvc.ProblemDetails
Game entities1
GET/api/v2/extra/content/{contentId}Returns the content object associated with the provided content ID. Please note that this endpoint is largely untested,
and may return inconsistent data at times.
GET/api/v2/extra/stats/least-recently-updatedGet the least-recently updated items on the specified world or data center, along with the upload times for each item.
GET/api/v2/{worldDcRegion}/{itemIds}Retrieves the data currently shown on the market board for the requested item and world or data center.
Up to 100 item IDs can be comma-separated in order to retrieve data for multiple items at once.
The world/DC or item requested is invalid. When requesting multiple items at once, an invalid item ID
will not trigger this. Instead, the returned list of unresolved item IDs will contain the invalid item ID or IDs.
Microsoft.AspNetCore.Mvc.ProblemDetails
Market board sale history1
GET/api/v2/history/{worldDcRegion}/{itemIds}Retrieves the history data for the requested item and world or data center.
Up to 100 item IDs can be comma-separated in order to retrieve data for multiple items at once.
The world/DC or item requested is invalid. When requesting multiple items at once, an invalid item ID
will not trigger this. Instead, the returned list of unresolved item IDs will contain the invalid item ID or IDs.
Microsoft.AspNetCore.Mvc.ProblemDetails
Market tax rates1
GET/api/v2/tax-ratesRetrieves the current tax rate data for the specified world. This data is provided by the Retainer Vocate in each major city.
Parameters
Name
In
Required
Type
world
query
no
string
User-Agent
header
no
string
Responses
Status
Description
Schema
200
Data retrieved successfully.
Universalis.Application.Views.V1.TaxRatesView
404
The world requested is invalid.
Microsoft.AspNetCore.Mvc.ProblemDetails
Marketable items1
GET/api/v2/marketableReturns the set of marketable item IDs.
Responses
Status
Description
Schema
200
Success
—
Most-recently updated items1
GET/api/v2/extra/stats/most-recently-updatedGet the most-recently updated items on the specified world or data center, along with the upload times for each item.
GET/api/v2/extra/stats/recently-updatedReturns a list of some of the most recently updated items on the website. This endpoint
is a legacy endpoint and does not include any data on which worlds or data centers the updates happened on.
Errors are application/problem+json (RFC 9110), the only one of Games & Comics' quickstarted APIs to use it — a live GET this run against /nosuchthing returned HTTP 404 with content-type: application/problem+json; charset=utf-8 and a 162 B body: {"type":"https://tools.ietf.org/html/rfc9110#section-15.5.5","title":"Not Found","status":404,"traceId":"..."}. The traceId is unique per request — pin the stable type/title/status fields in tests, not the trace id.
Several endpoints return a bare JSON array at the top level, not an object envelope — live GETs this run against /worlds (3,690 B, e.g. [{"id":21,"name":"Ravana"},...]), /data-centers (1,389 B, e.g. [{"name":"Elemental","region":"Japan","worlds":[...]}...]), and /marketable (96,815 B, a bare array of 16,843 integer item IDs) all confirm this — code that assumes every response is {...} will fail to iterate these three.
A comma-separated item-ID list changes the top-level shape from a single object to a map — a live GET this run against /Chaos/5,6?listings=1&entries=1 (4,586 B) returned {itemIDs, items, dcName, unresolvedItems} with per-item data nested under items, not the flat single-item shape the plain /Chaos/5 request above returns. Branch on how many IDs you requested before parsing the response.
World/item/data-center identifiers are addressed as path segments, not query parameters — confirmed live above with /Chaos/5 (world-or-DC name, then item ID, both in the URL path). A real-time WebSocket feed at wss://universalis.app/api/ws exists alongside this REST API for listing updates, so a fully real-time integration isn't limited to polling.
Availability
Uptime100%
Median latency351.5 ms
Last checkUp · 200 · Sep 2026
4 checks since Aug 2026. A person runs this check by hand, not an automated monitor.