quranlab/quran
QuranLab — Verse-Aligned Multilingual Quran Corpus A unified, verse-aligned multilingual Quran corpus spanning 79 languages and 185 translations. Every recension and translation is a separate config (subset), all row-aligned on the canonical 6,236-ayah verse_key (Hafs ʿan ʿAsim reading, 114 surahs). The corpus also contains 111 tafsir configs: verse-grain classical and openly licensed Arabic works, plus the native-passage and verse-expanded views of Diyanet's Turkish Kur'an Yolu… See the full description on the dataset page: https://huggingface.co/datasets/quranlab/quran.
QuranLab — Verse-Aligned Multilingual Quran Corpus
A unified, verse-aligned multilingual Quran corpus spanning 79 languages and 185 translations. Every recension and translation is a separate config (subset), all row-aligned on the canonical 6,236-ayah verse_key (Hafs ʿan ʿAsim reading, 114 surahs).
The corpus also contains 111 tafsir configs: verse-grain classical and openly licensed Arabic works, plus the native-passage and verse-expanded views of Diyanet's Turkish Kur'an Yolu commentary.
⚠️ Scope — Ahl al-Sunnah only. This corpus deliberately includes only translations within mainstream Sunni orthodoxy (Ahl al-Sunnah wa'l-Jamāʿah). Translations that are Quranist/hadith-rejecting, Shīʿa, Aḥmadiyya, or otherwise outside Sunni orthodoxy are intentionally excluded. Theological classification is documented in metadata/translations.csv.QuranLab is a volunteer effort. Our aim is to present these works carefully and at high quality, and to help them travel faithfully — in the spirit in which they were written — not to claim them as ours.
The text here reaches you through the work of Tanzil Project, fawazahmed0/quran-api, QuranEnc.com, Tafsir Center for Quranic Studies and Quranic Universal Library (QUL), among others. Who to thank, and what we consulted without ever quoting, is set out in `SOURCES.md`.
At a glance
Usage
from datasets import load_dataset
ar = load_dataset("quranlab/quran") # default: arabic-uthmani
en = load_dataset("quranlab/quran", "en-pickthall", split="train")
tr = load_dataset("quranlab/quran", "tr-diyanet", split="train")
par = load_dataset("quranlab/quran", "parallel", split="train") # PD/CC aligned
taf = load_dataset("quranlab/quran", "tafsir-kuranyolu-tr", split="train") # Kur'an Yolu tafsir (passages)For agents and pipelines
Deterministic facts an automated consumer needs, so nothing has to be inferred from a sample.
- Config naming:
{lang}-{translator}for translations,arabic-{recension},tafsir-{work}-{lang},morphology-ar,parallel - Join key:
verse_keyon every config;morphology-arjoins one ayah to many segment rows - Default config:
arabic-uthmani - Format: Parquet, one directory per config, split
train. - Terms and credit are per config in
metadata/, never per row — join on the config name when you need them. - Do not assume a config is complete. Where a source lacks a verse the cell is empty on purpose; filter on it rather than treating it as a bug.
- The
parallelconfig is the only pre-joined wide table and holds public-domain / CC editions only.
Inspect it without downloading the data:
# every config and split
curl https://datasets-server.huggingface.co/splits?dataset=quranlab/quran
# a first page of rows
curl "https://datasets-server.huggingface.co/first-rows?dataset=quranlab/quran&config=tr-diyanet&split=train"
# machine-readable schema and provenance (Croissant JSON-LD)
curl https://huggingface.co/api/datasets/quranlab/quran/croissantQuery it in place with SQL — no full download:
hf datasets sql quranlab/quran "SELECT * FROM 'tr-diyanet' LIMIT 5"import duckdb
duckdb.sql("SELECT count(*) FROM 'hf://datasets/quranlab/quran/tr-diyanet/*.parquet'")Schema (per translation/recension config)
verse_key (str, e.g. "1:1") · surah · ayah · ayah_global (1–6236) · juz · hizb · hizb_quarter · page · ruku · manzil · sajda (bool) · sajda_type · surah_name_ar · surah_name_en · surah_name_en_translation · revelation_place · revelation_order · text · lang · translation_id
Per-edition credits and terms are not repeated on every row — they are in metadata/translations.csv (one row per config) and LICENSES.md.
All configs share the same verse_key spine, so cross-language alignment is a join on verse_key. The parallel config is a curated wide table of the license-clean (PD/CC) editions only.
Tafsir (passage-grouped) configs
The tafsir-* configs hold passage-grouped commentary (Diyanet Kur'an Yolu) — one row per commentary passage spanning an ayah range, plus per-sura intro blocks — so they do not use the 6,236-verse spine. Columns: passage_id · section (tefsir/intro) · title · surah · ayah_start · ayah_end · n_ayahs · verse_key_start · verse_key_end · juz · surah_name_ar/surah_name_en · revelation_place · volume · text · text_html · lang · translation_id · kind. Join back to any verse config on a verse_key in [verse_key_start .. verse_key_end]. A verse-expanded convenience view (tafsir-kuranyolu-tr-verses, one row per ayah with the passage text repeated plus verse_key_from/verse_key_to) is also provided for plain verse joins.
Word-by-word morphology (morphology-ar)
The morphology-ar config is sub-verse: one row per morphological segment (~130k rows) from the Quranic Arabic Corpus (corpus.quran.com, GPL, kept verbatim). Columns: location (surah:ayah:word:segment, unique) · verse_key (join key) · surah · ayah · word_index · segment_index · ayah_global · form (Arabic vocalized segment) · tag (coarse N/P/V) · pos (fine part-of-speech) · seg_type (STEM/PREF/SUF) · lemma · root · features (the raw QAC annotation, full fidelity). Join to any verse config on verse_key (one ayah → many segment rows).
Configs by language
Arabic (ar) — 72 config(s)
English (en) — 27 config(s)
Turkish (tr) — 24 config(s)
Achinese (ace) — 1 config(s)
Afar (aa) — 1 config(s)
Afrikaans (af) — 1 config(s)
Albanian (sq) — 4 config(s)
Amharic (am) — 1 config(s)
Assamese (as) — 2 config(s)
Azerbaijani (az) — 4 config(s)
Bambara (bm) — 2 config(s)
Bengali (bn) — 4 config(s)
Bosnian (bs) — 5 config(s)
Bulgarian (bg) — 1 config(s)
Burmese (my) — 3 config(s)
Chichewa (ny) — 2 config(s)
Chinese (zh) — 6 config(s)
Dagbani (dag) — 1 config(s)
Divehi (dv) — 1 config(s)
Dutch (nl) — 1 config(s)
Filipino (fil) — 3 config(s)
French (fr) — 5 config(s)
Fulah (ff) — 2 config(s)
German (de) — 4 config(s)
Gujarati (gu) — 1 config(s)
Hausa (ha) — 2 config(s)
Hebrew (he) — 1 config(s)
Hindi (hi) — 4 config(s)
Hungarian (hu) — 1 config(s)
Indonesian (id) — 7 config(s)
Italian (it) — 2 config(s)
Japanese (ja) — 2 config(s)
Kannada (kn) — 1 config(s)
Kazakh (kk) — 2 config(s)
Khmer (km) — 2 config(s)
Kinyarwanda (rw) — 2 config(s)
Korean (ko) — 2 config(s)
Kurdish (ku) — 3 config(s)
Kyrgyz (ky) — 2 config(s)
Lingala (ln) — 1 config(s)
Macedonian (mk) — 2 config(s)
Malay (ms) — 1 config(s)
Malayalam (ml) — 4 config(s)
Maltese (mt) — 1 config(s)
Marathi (mr) — 1 config(s)
Nepali (ne) — 1 config(s)
Oromo (om) — 1 config(s)
Pashto (ps) — 3 config(s)
Persian (fa) — 5 config(s)
Portuguese (pt) — 2 config(s)
Russian (ru) — 4 config(s)
Serbian (sr) — 2 config(s)
Shona (sn) — 1 config(s)
Sindhi (sd) — 1 config(s)
Sinhala (si) — 3 config(s)
Somali (so) — 3 config(s)
Sotho (st) — 1 config(s)
Spanish (es) — 5 config(s)
Swahili (sw) — 2 config(s)
Tajik (tg) — 2 config(s)
Tamil (ta) — 3 config(s)
Tatar (tt) — 1 config(s)
Telugu (te) — 3 config(s)
Thai (th) — 3 config(s)
Twi (tw) — 1 config(s)
Ukrainian (uk) — 3 config(s)
Urdu (ur) — 8 config(s)
Uyghur (ug) — 3 config(s)
Uzbek (uz) — 5 config(s)
Vietnamese (vi) — 3 config(s)
Xhosa (xh) — 1 config(s)
Yoruba (yo) — 1 config(s)
Zulu (zu) — 1 config(s)
ilp (ilp) — 1 config(s)
luy (luy) — 1 config(s)
mrw (mrw) — 1 config(s)
prs (prs) — 1 config(s)
run (run) — 1 config(s)
yuw (yuw) — 1 config(s)
The QuranLab family
These datasets are built by the same volunteers and are meant to be used together; they join on shared keys — verse_key on the Qur'an side, hadith_key on the Sunnah side.
You are reading the card for `quranlab/quran`. Corrections, additions, and removal requests are welcome on any of them through the Community tab.
Quality, and how to check it yourself
Nothing is released until the integrity gate passes. Every claim below is something you can re-run rather than take on trust — here on the published data, not in our build tree:
from datasets import load_dataset
ar = load_dataset("quranlab/quran", "arabic-uthmani", split="train")
tr = load_dataset("quranlab/quran", "tr-diyanet", split="train")
assert ar["verse_key"] == tr["verse_key"] # one spine, every config
assert len(ar) == 6236 and ar[0]["verse_key"] == "1:1"
assert ar[-1]["verse_key"] == "114:6"Where a source is genuinely missing, the row is published empty and labelled rather than filled by guessing from a neighbouring entry. Coverage numbers in this card count only real content.
How it was built
We assembled this corpus ourselves: each edition is the work of its translator, aligned by hand-checked rules onto the canonical 6,236-ayah spine, then validated (114 surahs · 6,236 ayahs · juz/hizb/page/ruku/manzil/sajda structure · identical verse_key spine across every config · no empty cells) before release. The Arabic is Tanzil's Uthmani and Simple-Clean text, kept verbatim. Per-edition details — translator, edition, school, and terms — are in metadata/translations.csv and LICENSES.md.
Notes
Public-domain and CC texts are kept verbatim; everything else is included with full credit to its author or publisher. If you hold rights to a work here and would like it removed, open a discussion on the Community tab — we take it down promptly, no questions asked.
Citation
@misc{quranlab_quran_2026,
title = {QuranLab — Verse-Aligned Multilingual Quran Corpus},
author = {QuranLab},
year = {2026},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/datasets/quranlab/quran}}
}