Developers

Braille JSON API

The full braille tables as static JSON — both codes this site publishes. No key, no rate limit, CORS open. It is a file on a CDN, so it is as fast and as reliable as this page.

Endpoints

All endpoints are GET, return JSON, and allow cross-origin requests
EndpointContents
/api/alphabet.jsonThe 26 letters with dot numbers, Unicode characters and decade.
/api/numbers.jsonThe ten digits and the number sign.
/api/punctuation.jsonPunctuation and symbols, including multi-cell forms.
/api/contractions.jsonGrade 2 wordsigns and groupsigns with position rules.
/api/full.jsonEverything above in one document.

Spanish braille

Spanish braille is a separate code, not a translation of this one. The 26 basic letters match; the accented letters, the capital sign, the full stop, the brackets and the decimal comma do not. Merging the two documents produces text a Spanish reader cannot read, so they are served as two documents.

Every letter in the Spanish tables carries a uebSameCell field saying what English braille does with the identical cell — the cell Spanish reads as ñ is the one English reads as er.

Spanish braille, grade 1 — verified at 100% against liblouis es-g1
EndpointContents
/api/es/alphabet.jsonThe 33 letters, with what English braille makes of the same cell.
/api/es/numbers.jsonThe ten digits and the Spanish number sign.
/api/es/punctuation.jsonPunctuation, including ¿ and ¡, which share a cell with the closing mark.
/api/es/full.jsonEverything above, plus the indicators and the coverage statement.

Every document carries a codes array naming all five codes this API publishes and where to fetch each, so a consumer that starts at any one can find the rest. The Spanish reference is at /es/alphabet/.

Portuguese braille

Portugal and Brazil unified their grafia braille and publish it jointly, so this is one code rather than two. It has thirteen letters outside a-z, and its number run stays open through the decimal comma where Spanish closes it — the same digits, a different rule.

Two signs here disagree with liblouis on purpose, because the published Grafia Braille says otherwise. Both are named in coverage.divergesFromReference with their sources, so a consumer diffing against the reference implementation learns why rather than concluding this is broken.

Portuguese braille, grade 1 — measured against liblouis pt-pt-g1
EndpointContents
/api/pt/alphabet.jsonThe 39 letters, with what English and Spanish braille make of the same cell.
/api/pt/numbers.jsonThe ten digits and the number sign that holds through a decimal comma.
/api/pt/punctuation.jsonPunctuation, including the two signs where this site follows the standard over liblouis.
/api/pt/full.jsonEverything above, plus indicators and the coverage statement.

Arabic braille

Arabic shares nothing with the other three but the six dots. It is written left to right like all braille, though Arabic script runs right to left, so the cells in these documents are in logical order — first letter first. There is no capital sign, because Arabic has no letter case.

Two rules have no equivalent in the Latin codes and both are in the payload: the shadda is written BEFORE the consonant it doubles while every other haraka follows its letter, and lam followed by alif is a single cell, the one place two characters share one.

Arabic braille, grade 1 — measured against liblouis ar-ar-g1
EndpointContents
/api/ar/alphabet.jsonThe 28 letters and the 8 other forms, each flagged, with the English reading of the same cell.
/api/ar/harakat.jsonThe eight harakat, and the shadda's placement rule.
/api/ar/numbers.jsonThe digits, the number sign, and the letter sign that keeps a letter from being read as one.
/api/ar/punctuation.jsonPunctuation, Arabic marks and their Latin lookalikes.
/api/ar/full.jsonEverything above, plus indicators, the ligature and the coverage statement.

Four gaps in the reference implementation are named in coverage.divergesFromReference, each with the line in the table source to check. The Arabic reference is at /ar/alphabet/.

Hindi braille

Bharati Braille — one code shared across Devanagari, Bengali, Gujarati, Kannada, Malayalam, Oriya, Tamil and Telugu. There is no capital sign, because Devanagari has no letter case.

Three rules have no equivalent in the four codes above, and all three are in the payload. The halant is written BEFORE the consonant it silences, where print writes it after. A vowel and its matra are the same cell, separated by position, with dot 1 written in front of an independent vowel that follows a consonant. And the nukta is a cell of its own — dot 5, in front of the letter it changes.

One thing to check before you diff this against your own tables: these documents follow Bharati Braille 2.1, released 4 January 2026. liblouis revised its Devanagari table to match on 26 February 2026, but the table shipped with liblouis 3.29.0 is still the 2014 one. The two disagree on 250 of the 5,000 commonest Hindi words, mostly because of the consonant . The whole comparison travels in coverage.supersededByRevision.

Hindi braille, grade 1 — Bharati Braille 2.1
EndpointContents
/api/hi/alphabet.jsonThe consonants, vowels and both single-cell conjuncts, each flagged by kind, with the English reading of the same cell.
/api/hi/matras.jsonThe matras, the vowel each one writes, and the rule that separates a matra from its vowel.
/api/hi/numbers.jsonThe digits and the number sign — and why nothing closes a number in this code.
/api/hi/punctuation.jsonPunctuation, the danda and the Latin marks Hindi prose mixes with it.
/api/hi/full.jsonEverything above, plus the nukta letters, the signs, the indicators and the coverage statement.

Four gaps in the reference implementation are named in coverage.divergesFromReference, and the cells more than one character can produce are in coverage.ambiguousCells rather than left for you to discover. The Hindi reference is at /hi/alphabet/.

Example

fetch("https://braillechart.com/api/alphabet.json")
  .then(r => r.json())
  .then(data => console.log(data.letters[0]));

// { "letter": "a", "dots": "1", "char": "⠁", "decade": 1, ... }

Terms

Use it for anything. The tables are public-domain facts. A link back is appreciated but not required.

If you want the translator itself rather than the data, there is an embeddable widget.