staticdata.dev
Menu
Datasets About Contact

Roman Numerals

The complete set of 13 symbols that form the basis of Roman numeral notation — 7 additive base symbols (I, V, X, L, C, D, M) plus 6 subtractive pairs (IV, IX, XL, XC, CD, CM). These are the unique tokens used by the standard algorithm to convert any integer to its Roman numeral representation and back.

v1.0.0 MIT 13 records Updated 2026-10-05 stable Source:  Roman numerals (Wikipedia)

Quick fetch

Stable URL. CORS-enabled. No auth.

bash
curl https://staticdata.dev/v1/roman-numerals.json

Or use as a typed import: import { romanNumerals } from "https://staticdata.dev/v1/roman-numerals.ts"

Formats

  • JSON 596 B

    /v1/roman-numerals.json

    Open

    min: 360 B · /v1/roman-numerals.min.json

  • CSV 101 B

    /v1/roman-numerals.csv

    Open
  • TypeScript 804 B

    /v1/roman-numerals.ts

    export const romanNumerals

    type RomanNumeral = (typeof romanNumerals)[number]

    Open

Schema

Each record in the dataset has the following shape.

Schema
Field Type Description Example
value number Integer value of the Roman numeral symbol 1000
numeral string Roman numeral symbol string M

Preview

First 10 records.

Data preview
valuenumeral
1I
4IV
5V
9IX
10X
40XL
50L
90XC
100C
400CD

Showing 10 of 13. View full data:  JSON · CSV

Fetch examples

Drop-in snippets in five languages.

curl
curl -sSL https://staticdata.dev/v1/roman-numerals.json | jq '.[0]'
JavaScript
import type { RomanNumeral } from "https://staticdata.dev/v1/roman-numerals.ts";

const res = await fetch("https://staticdata.dev/v1/roman-numerals.min.json");
if (!res.ok) throw new Error(`Fetch failed: ${res.status}`);
const romanNumerals: RomanNumeral[] = await res.json();
console.log(romanNumerals[0]);
Python
import urllib.request, json

with urllib.request.urlopen("https://staticdata.dev/v1/roman-numerals.min.json") as r:
    romanNumerals = json.load(r)

print(romanNumerals[0])
Go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
)

func main() {
	resp, err := http.Get("https://staticdata.dev/v1/roman-numerals.min.json")
	if err != nil { panic(err) }
	defer resp.Body.Close()

	var data []map[string]any
	if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
		panic(err)
	}
	fmt.Println(data[0])
}
Rust
use serde_json::Value;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let body = ureq::get("https://staticdata.dev/v1/roman-numerals.min.json").call()?.into_string()?;
    let data: Vec<Value> = serde_json::from_str(&body)?;
    println!("{:?}", data.first());
    Ok(())
}

Sources and methodology

Roman numerals use seven base letters — I (1), V (5), X (10), L (50), C (100), D (500), and M (1000) — combined with six subtractive pairs where a smaller symbol placed before a larger one represents the difference: IV (4), IX (9), XL (40), XC (90), CD (400), and CM (900). Together these 13 symbols are the atomic tokens of the standard (modern) Roman numeral notation, which is a convention rather than a formal standard, widely used in publishing, clocks, outlines, and numbering systems.

Subtractive forms appear in Roman inscriptions but were used inconsistently in antiquity (IIII for 4 is still common on clock faces); the consistent subtractive notation became the norm in the Middle Ages and early modern period and is the accepted modern convention. Each of the 13 entries in this dataset is a distinct, non-redundant token; the standard conversion algorithm iterates them from largest (M=1000) to smallest (I=1), greedily subtracting each symbol’s value and appending the symbol to the output string.

Versioning

URLs under /v1/ are stable: field names and types will not change in a way that breaks consumers. Values can be corrected or records added when the upstream source changes; schema-incompatible updates ship under a new version path. See the roman-numerals changelog for this dataset's history.

More Code datasets