Free Roman numeral API
A static JSON endpoint for every number from 1 to 3999. No key, no rate limit, no catch. Build a bot, a game or a plugin on top of it.
Endpoint
Each number has its own file. Request it directly and you get back JSON with the numeral and the words.
GET https://romanize.net/api/roman/{number}.jsonhttpExample request
curl https://romanize.net/api/roman/2026.jsonbashExample response
{
"number": 2026,
"roman": "MMXXVI",
"words": "two thousand twenty-six",
"valid": true
}jsonFrom JavaScript
const res = await fetch("https://romanize.net/api/roman/49.json");
const data = await res.json();
console.log(data.roman); // "XLIX"jsFrom Python
import urllib.request, json
url = "https://romanize.net/api/roman/49.json"
with urllib.request.urlopen(url) as res:
data = json.load(res)
print(data["roman"]) # XLIXpythonFrom PHP
<?php
$url = "https://romanize.net/api/roman/49.json";
$data = json_decode(file_get_contents($url), true);
echo $data["roman"]; // XLIXphpFrom Ruby
require "net/http"
require "json"
url = URI("https://romanize.net/api/roman/49.json")
data = JSON.parse(Net::HTTP.get(url))
puts data["roman"] # XLIXrubyEvery one of these is a plain GET against a static file. There is no authentication step to add, no SDK to install, and no response shape to negotiate: the file at /api/roman/{n}.json is the whole contract. It is served with Content-Type: application/json and Access-Control-Allow-Origin: *, so a browser fetch from any origin works as well as a server-side one.
Fields
| Field | Type | Meaning |
|---|---|---|
| number | integer | The input number, 1 to 3999. |
| roman | string | The Roman numeral, e.g. MMXXVI. |
| words | string | The number spelled out in English. |
| valid | boolean | Always true for numbers in range. |
Usage and fair play
The API is served as static files from a content delivery network, so it is fast and resilient, but please cache responses on your side rather than fetching the same number repeatedly. Attribution is appreciated but not required. If you build something with it, we would love to hear about it on the contact page.
Frequently asked questions
Is the Roman numeral API really free?
Yes. It is a set of static JSON files served from a CDN, so there is no key, no sign up and no rate limit. Please cache responses rather than hammering the endpoint.
What range does the API cover?
Every whole number from 1 to 3999, which is the full standard Roman numeral range. Each file returns the numeral and the number spelled out in English.
Can I use it from the browser?
Yes. The files are plain JSON served with permissive caching, so a client-side fetch works from any origin.
The rejected forms, as a second dataset
The API returns what is valid. The other half is published separately: every malformed numeral form with the reason it fails and its canonical correction, as CSV and JSON under CC BY 4.0. See the rejected forms dataset.
Prefer to embed the UI?
If you want the converter itself rather than raw data, use the embeddable widget. Romanize keeps both free.
Last updated July 22, 2026. Reviewed for accuracy against the standard rules for Roman numerals. How we check accuracy.