Developer API

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}.json
http

Example request

curl https://romanize.net/api/roman/2026.json
bash

Example response

{
  "number": 2026,
  "roman": "MMXXVI",
  "words": "two thousand twenty-six",
  "valid": true
}
json

From JavaScript

const res = await fetch("https://romanize.net/api/roman/49.json");
const data = await res.json();
console.log(data.roman); // "XLIX"
js

From 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"])  # XLIX
python

From PHP

<?php
$url = "https://romanize.net/api/roman/49.json";
$data = json_decode(file_get_contents($url), true);

echo $data["roman"]; // XLIX
php

From 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"] # XLIX
ruby

Every 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

FieldTypeMeaning
numberintegerThe input number, 1 to 3999.
romanstringThe Roman numeral, e.g. MMXXVI.
wordsstringThe number spelled out in English.
validbooleanAlways true for numbers in range.
There is also a discovery file at /api/roman/index.json describing the range and fields.

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.