External developer preview · Content is versioned and source-traceable, but not yet scholar-reviewed.

Licence and attribution

OpenDua’s independently authored English, transliteration, editorial metadata and dataset structure are licensed under CC BY 4.0. OpenDua makes no ownership claim over the underlying Quranic, hadith or supplication text. The recitation was recorded for OpenDua under a separate written agreement and is not offered under the dataset licence. Credit Hisn al-Muslim as the collection and paste the attribution below when reusing OpenDua material.

attribution.txt
OpenDua dataset v0.0.2 (https://opendua.org), by Ihsan Labs at the Human Development Fund. Based on Hisn al-Muslim by Sa'id ibn Ali ibn Wahf al-Qahtani. OpenDua editorial text and dataset structure are licensed CC BY 4.0. Recitation by Muhammad Juma for OpenDua. OpenDua makes no ownership claim over the underlying religious texts.

Endpoints

base https://api.staging.opendua.org
GET /v1/duas All 267 duas, paginated
GET /v1/duas/{slug} A single dua
GET /v1/collections/{slug} A collection in order
GET /v1/search?q= Arabic, transliteration or English
Example request
curl
curl https://api.staging.opendua.org/v1/duas/when-you-wake-up-1
Example response
200 OK · application/json
{
  "id": "OD-001",
  "slug": "when-you-wake-up-1",
  "title": "Supplications for when you wake up (1 of 4)",
  "arabic": "الْحَمْدُ للَّهِ الَّذِي أَحْيَانَا بَعْدَ مَا أَمَاتَنَا، وَإِلَيْهِ النُّشُورُ",
  "form": "dua",
  "rubric": null,
  "closing": null,
  "parts": [],
  "asides": null,
  "countRubric": null,
  "note": null,
  "noteArabic": null,
  "arabicScript": "imlaei",
  "incipit": "الْحَمْدُ للَّهِ الَّذِي أَحْيَانَا بَعْدَ مَا أَمَاتَنَا،",
  "transliteration": "Al-ḥamdu li-llāhi alladhī aḥyānā baʿda mā amātanā, wa ilayhi an-nushūr",
  "transliterationSource": "open-dua",
  "translation": "All praise is for Allah who gave us life after having taken it from us and unto Him is the resurrection.",
  "translationSource": "open-dua",
  "source": "Hisn al-Muslim 1",
  "grading": null,
  "gradingNote": "Reference as printed in Hisn al-Muslim; grading pending review",
  "footnotes": [
    "البخاري مع الفتح، 11/ 113، برقم 6314، ومسلم، 4/ 2083، برقم 2711."
  ],
  "virtues": null,
  "repetition": 1,
  "categories": [
    "when-you-wake-up"
  ],
  "tags": [
    "hisn-al-muslim",
    "sleep-and-waking"
  ],
  "audio": {
    "objectKey": "hisn/v0.0.1/OD-001.mp3",
    "durationSeconds": 16,
    "sampleRateHz": 24000,
    "reciter": "Muhammad Juma"
  },
  "review": {
    "status": "sourced",
    "by": "Hisn al-Muslim, publisher's edition (hisnmuslim.com)",
    "date": "2026-09-07"
  },
  "contentVersion": 2,
  "rightsProfile": "hisn-open-dua-modern",
  "contentHash": "sha256:7f0ca8eaf4ee1e9eedefbb81fc8020265827daaf892dac99b2a3c4a2f8a4361e"
}

Response schema

FieldTypeNotes
id string Stable identifier, e.g. OD-003. Never reused.
slug string URL segment. Stable across versions.
title string Human-readable entry title.
arabic string The words to say. Full tashkeel, Uthmani or Imlaei as the source requires.
form string dua (words to recite), quran (a passage), instruction (an act, not words) or report (a hadith quoted).
rubric object | null kind, text, transliteration, translation and translationSource for framing before the recited words. Instructions have no transliteration. null when absent.
closing object | null The same shape as rubric, for framing the source prints after or between the words. null when there is none.
parts object[] Distinct recitations within one numbered entry: label, Arabic, transliteration, translation, repetition, count, rubric and an independently addressable audio object. Empty for a single recitation.
asides object | null Arabic and OpenDua English for an aside inside the words that is not recited. Its transliteration array is empty.
note string | null Reserved nullable field. Publisher prose notes are omitted from the public release.
noteArabic string | null The source's own Arabic for the note where it prints one in both scripts. null otherwise.
arabicScript string uthmani or imlaei, used to select the Arabic typeface.
incipit string Short Arabic opening used in compact listings.
countRubric object | null ar and en: the count the source prints after the words where it says more than repetition. null otherwise.
transliteration string Generated by OpenDua from recited Arabic; empty for instructions.
transliterationSource string open-dua for recitations; none for instructions and reports.
translation string OpenDua English. Uses “Allah” throughout.
translationSource string open-dua when English is present; none when the field is empty.
source string Collection and number, as printed.
grading object | null null for Quranic text. by is an array so disputed gradings carry both scholars.
gradingNote string | null Explains why no settled grading is published when applicable.
virtues object | null Narrated benefit with its own source. null when none is recorded.
footnotes string[] Source citations retained for traceability, in source order.
repetition integer Times narrated. 1 when not specified; 0 where the text carries more than one count.
categories string[] Category slugs. A dua may sit in more than one.
tags string[] Tag slugs: the source collection, the form of the text, and its themes.
audio object objectKey, durationSeconds, sampleRateHz and reciter. The object key is immutable and environment-neutral; all values are empty/zero where no recording is required.
review object status, by and date. Staging entries may be source-traceable but not reviewed.
contentVersion integer Entry-level content revision used to invalidate review and audio.
rightsProfile string Key into the published field-group rights registry.
contentHash string SHA-256 of the canonical public entry excluding this hash field.

Limits and errors

60 requests a minute Per IP, unauthenticated, across all read endpoints. Exceed it and you get a 429 with a Retry-After header. Need more? Bundle the dataset instead.
Errors are JSON
404 { "error": "not_found",
      "slug": "ayat-al-kurse" }
Same envelope for 400 and 429. No HTML error pages.
Caching Responses carry an ETag and a long max-age. Pin a version and the payload never changes under you.