API
14 static files under /api/v1/, 4 CSV twins under /data/csv/. No key, no quota, no sign-up. The files hold the aggregates shown on this site and are regenerated when the site is refreshed, at least monthly. Free with the attribution "Source: Daall Index (index.daall.sa)".
Use
One GET per file · same files the site rendersEvery endpoint is a file. Request it with any HTTP client; there is no query string, no pagination and no key. Responses are application/json with Access-Control-Allow-Origin: *, so a browser page on another origin can read them directly.
Start with catalog.json: it lists every file with its asof date, so a client can tell whether anything changed before fetching the rest. Files are cached for a day at the edge; a refresh of the site replaces them in place under the same paths.
What this API is not: there is no endpoint over award-level rows, no filtering by buyer, supplier or date, and no authenticated access. Those needs are met by the award-level dataset under licence, delivered manually.
curl -s https://index.daall.sa/api/v1/series/DGI.json | head -c 600
{
"symbol": "DAALL:DGI",
"name": "Daall Saudi Government Demand Index",
"unit": "index points, 2023 average = 100",
"frequency": "daily",
"from": "2023-01-01",
"asof": "2026-09-30",
"methodology_version": "0.1",
"preliminary_from": "2026-08-17",
"base_sar_bn": 95.14,
"cap": {"share": 0.1, "awards_capped": 0, "removed_sar_bn": 0},
"points": [
{"date": "2023-01-01", "level": 88.1, "trailing_sar_bn": 83.8, "awarded_sar_m": 12.4},
…
Response excerpt. Field values are illustrative of shape; the live file is the reference.
Endpoints
14 JSON files · 4 CSV twins| Path | Contents | Frequency | History | CSV twin |
|---|---|---|---|---|
| /api/v1/catalog.json | Every file, its asof date, licence and attribution | Per refresh | — | — |
| /api/v1/series/DGI.json | DGI level, trailing award value and daily awarded value | Daily points | From 1 Jan 2023 | dgi.csv |
| /api/v1/series/{CODE}.json | Sector series; CODE is one of CAPG, CPS, SOFT, CONS, TRAN, UTIL, TELE, HLTH | Monthly points | From Dec 2022 | sectors.csv |
| /api/v1/listed.json | Award value by Tadawul and Nomu issuer, with identifiers | Per refresh | As stated in the file (calendar 2025 at publication) | listed.csv |
| /api/v1/backlog.json | Expected government revenue by issuer and quarter, beside reported revenue | Quarterly points | As stated in the file | backlog.csv |
| /api/v1/research.json | Research notes: findings with grades, implications, sources, verification | Per refresh | All notes | — |
| /api/v1/evidence.json | Pre-registered tests of the indices and their results | Per refresh | All tests | — |
All paths are relative to https://index.daall.sa. Sector codes follow the Tadawul industry groups listed in the methodology.
catalog.json
The index of the API| Field | Type | Meaning |
|---|---|---|
| version | string | API version, "v1" |
| generated | date | Day the files were generated, YYYY-MM-DD |
| asof | date | Latest data date across the files |
| refresh | string | "With the site, at least monthly" |
| licence | string | "Free with attribution" |
| attribution | string | The attribution line to use |
| endpoints[] | array | One entry per file |
| endpoints[].id | string | Short id: DGI, CAPG, listed, backlog, research, evidence |
| endpoints[].path | string | Path of the JSON file |
| endpoints[].csv | string | null | Path of the CSV twin, where one exists |
| endpoints[].title | string | Name of the series or table |
| endpoints[].frequency | string | daily, monthly, quarterly or refresh |
| endpoints[].from | date | null | First data date |
| endpoints[].asof | date | Latest data date in that file |
curl -s https://index.daall.sa/api/v1/catalog.json
{
"version": "v1",
"generated": "2026-10-29",
"asof": "2026-09-30",
"refresh": "With the site, at least monthly",
"licence": "Free with attribution",
"attribution": "Source: Daall Index (index.daall.sa)",
"endpoints": [
{"id": "DGI", "path": "/api/v1/series/DGI.json", "csv": "/data/csv/dgi.csv",
"title": "Daall Saudi Government Demand Index", "frequency": "daily",
"from": "2023-01-01", "asof": "2026-09-30"},
{"id": "CAPG", "path": "/api/v1/series/CAPG.json", "csv": "/data/csv/sectors.csv",
"title": "Capital Goods", "frequency": "monthly", "from": "2022-12-31", "asof": "2026-09-30"},
…
]
}
series/DGI.json
Daily · 1 Jan 2023 to asof · index points and SAR| Field | Type | Meaning |
|---|---|---|
| symbol | string | "DAALL:DGI" |
| name | string | Index name |
| unit | string | Unit of level: index points, 2023 average = 100 |
| frequency | string | "daily" |
| from · asof | date | First and latest point |
| methodology_version | string | Version under which the series was built, see methodology §9 |
| preliminary_from | date | Points on or after this date are provisional (latest 45 days) |
| base_sar_bn | number | 2023 average of the trailing sum, SAR bn; one point = base ÷ 100 |
| cap.share | number | Single-award cap as a share of the prior 12 months, 0.1 |
| cap.awards_capped | integer | Awards bound by the DGI cap at asof (0 at 30 Sep 2026) |
| cap.removed_sar_bn | number | Value removed by the cap at asof, SAR bn |
| points[].date | date | Award date the point is dated by |
| points[].level | number | Index level, 2 decimals |
| points[].trailing_sar_bn | number | Capped award value of the 365 days to date, SAR bn, VAT included |
| points[].awarded_sar_m | number | null | Value awarded on that day, SAR m, before the cap |
curl -s https://index.daall.sa/api/v1/series/DGI.json \ | python3 -c "import json,sys; d=json.load(sys.stdin); p=d['points'][-1]; print(p['date'], p['level'])"
2026-09-30 85.12
Levels within 45 days of asof are provisional and rise as late awards arrive; see the revisions policy.
series/{CODE}.json
Monthly · Dec 2022 to asof · SAR bn after the cap| Field | Type | Meaning |
|---|---|---|
| symbol | string | "DGI.CAPG" and so on |
| code | string | CAPG, CPS, SOFT, CONS, TRAN, UTIL, TELE or HLTH |
| name | string | Tadawul industry group |
| unit | string | "SAR bn, trailing 12 months, after cap" |
| frequency | string | "monthly" |
| from · asof | date | First and latest month end |
| methodology_version | string | Version the series was built under |
| mapping | string | "draft" while the Etimad-to-Tadawul mapping is a draft |
| points[].date | date | Month end, YYYY-MM-DD |
| points[].value_sar_bn | number | Award value of the preceding 12 months mapped to the sector, after the sector cap |
| points[].rebased | number | value ÷ the sector's 2023 average × 100, for comparison only |
for c in CAPG CPS SOFT CONS TRAN UTIL TELE HLTH; do curl -s "https://index.daall.sa/api/v1/series/$c.json" -o "$c.json" done
{
"symbol": "DGI.HLTH",
"code": "HLTH",
"name": "Health Care Equipment & Services",
"unit": "SAR bn, trailing 12 months, after cap",
"frequency": "monthly",
"from": "2022-12-31",
"asof": "2026-09-30",
"methodology_version": "0.1",
"mapping": "draft",
"points": [
{"date": "2022-12-31", "value_sar_bn": 1.37, "rebased": 95.1},
…
listed.json
Award value by listed issuer · the table on the listed exposure page| Field | Type | Meaning |
|---|---|---|
| year | integer | Calendar year of the window, by award date |
| asof | date | Latest award date read |
| total_sar_m | number | Value won by all matched issuers, SAR m, VAT included |
| issuers_n | integer | Issuers with at least one award |
| share_of_all_awards_pct | number | Listed share of all award value in the window, per cent |
| issuers[].ticker | string | Four-digit Tadawul ticker |
| issuers[].name · name_ar | string | Registered name, English and Arabic |
| issuers[].market | string | "TADAWUL" (Main Market) or "NOMU" |
| issuers[].isin | string | ISIN |
| issuers[].value_sar_m | number | Award value in the window, SAR m; 0 where no value is published |
| issuers[].awards | integer | Awards in the window |
| issuers[].share_of_listed | number | Share of total_sar_m, per cent |
curl -s https://index.daall.sa/api/v1/listed.json
{
"year": 2025,
"asof": "2026-09-30",
"total_sar_m": 8491.5,
"issuers_n": 78,
"share_of_all_awards_pct": 8.7,
"issuers": [
{"ticker": "8010", "name": "The Company for Cooperative Insurance",
"name_ar": "الشركة التعاونية للتأمين", "market": "TADAWUL", "isin": "SA000A0DPSH3",
"value_sar_m": 1951.5, "awards": 7, "share_of_listed": 22.98},
…
Registered-name match; subsidiaries are not consolidated, so an issuer's figure is a floor. Method and measured accuracy: methodology §6.
backlog.json
Expected government revenue by issuer and quarter · the table on the contracted backlog page| Field | Type | Meaning |
|---|---|---|
| asof | date | Latest award date read |
| method | string | How awards are spread over quarters, in one paragraph |
| issuers[].ticker | string | Four-digit Tadawul ticker |
| issuers[].name · name_ar | string | Registered name, English and Arabic |
| issuers[].gov_share_ttm | number | null | Expected government revenue of the last 4 reported quarters ÷ reported revenue of those quarters; null where revenue is not reported |
| issuers[].quarters[].q | string | Quarter, "2024Q1" |
| issuers[].quarters[].expected_gov_rev_sar_m | number | Award value spread into the quarter, SAR m, VAT included |
| issuers[].quarters[].reported_rev_sar_m | number | null | Revenue reported by the issuer for the quarter, SAR m; null where not yet reported |
curl -s https://index.daall.sa/api/v1/backlog.json \ | python3 -c "import json,sys; d=json.load(sys.stdin); print(d['asof'], len(d['issuers']), 'issuers')"
{
"asof": "2026-09-30",
"method": "Each award is spread evenly over the quarters of its stated term …",
"issuers": [
{"ticker": "7200", "name": "Al Moammar Information Systems Co.",
"name_ar": "شركة المعمر لأنظمة المعلومات", "gov_share_ttm": 0.42,
"quarters": [
{"q": "2024Q1", "expected_gov_rev_sar_m": 118.0, "reported_rev_sar_m": 322.5},
…
{"q": "2027Q2", "expected_gov_rev_sar_m": 96.0, "reported_rev_sar_m": null}
]},
…
Expected government revenue is an allocation of award value, not a forecast of what the issuer will report. Reported revenue is the issuer's total, all customers.
research.json
The notes on the research page| Field | Type | Meaning |
|---|---|---|
| asof | date | Generation date |
| notes[].id | string | Slug; the note's anchor on the research page |
| notes[].title · summary | string | Title and 3–4 sentence summary |
| notes[].date | date | Publication date |
| notes[].verified_on | date | null | Date the findings were checked against their sources; null if not yet |
| notes[].findings[].text | string | One claim with its number or source named |
| notes[].findings[].grade | string | A: peer-reviewed or official statistics · B: working paper or official document · C: news, industry or vendor |
| notes[].findings[].status | string | "verified" or "corrected" |
| notes[].implications[] | string | What Daall Index does or measures as a result |
| notes[].sources[] | object | title, url, type, grade |
| notes[].verification | object | checked, corrected, removed: integer counts |
curl -s https://index.daall.sa/api/v1/research.json
{
"asof": "2026-10-30",
"notes": [
{"id": "procurement-leading-indicator",
"title": "Contract-award data as a leading indicator …",
"date": "2026-10-29", "verified_on": "2026-10-30",
"findings": [
{"text": "Ramey (NBER WP 15464): …", "grade": "B", "status": "verified"},
…
],
"implications": ["…"],
"sources": [{"title": "…", "url": "https://…", "type": "working paper", "grade": "B"}],
"verification": {"checked": 8, "corrected": 1, "removed": 0}},
…
evidence.json
The tests on the evidence page| Field | Type | Meaning |
|---|---|---|
| asof | date | Latest data date used in the results |
| registered | date | Date the tests and their criteria were registered, before results were computed |
| note | string | Protocol note |
| tests[].id · title | string | Short id and title |
| tests[].question | string | What the test asks |
| tests[].target | string | The Daall series tested |
| tests[].data | string | The independent data it is tested against |
| tests[].horizon | string | Window or lead/lag tested |
| tests[].criterion | string | Pass threshold, fixed at registration |
| tests[].result.metric · value · n | string · number · integer | Statistic, its value and the observations |
| tests[].result.verdict | string | "pass", "fail" or "inconclusive" |
| tests[].detail | string | What was done and what it showed |
| tests[].table | object | null | cols: string[] · rows: any[][] |
curl -s https://index.daall.sa/api/v1/evidence.json \ | python3 -c "import json,sys; [print(t['id'], t['result']['verdict']) for t in json.load(sys.stdin)['tests']]"
dgi-mof-goods-services pass sector-hlth-issuer-revenue fail …
CSV twins
/data/csv/ · UTF-8 · header row · comma separated · ISO dates| File | Columns | One row per |
|---|---|---|
| /data/csv/dgi.csv | date, level, trailing_sar_bn, awarded_sar_m | Day, from 2023-01-01 |
| /data/csv/sectors.csv | date, code, name, value_sar_bn, rebased | Sector and month end; 8 sectors in one file |
| /data/csv/listed.csv | ticker, name, name_ar, market, isin, value_sar_m, awards, share_of_listed | Issuer |
| /data/csv/backlog.csv | ticker, name, q, expected_gov_rev_sar_m, reported_rev_sar_m | Issuer and quarter; empty cell where revenue is not reported |
curl -s https://index.daall.sa/data/csv/dgi.csv | head -3 date,level,trailing_sar_bn,awarded_sar_m 2023-01-01,88.10,83.8,12.4 2023-01-02,88.40,84.1,290.6
Refresh and licence
Read before building on the filesRefresh
The files are regenerated manually when the site is refreshed, at least monthly. Each file carries its own asof; catalog.json carries them all. There is no fixed day of the month and no push notification.
Caching
Files are served with a one-day cache. After a refresh a client may see the previous file for up to a day; compare asof rather than the calendar.
Versioning
The path carries the version. A change that breaks a file's fields would appear under a new version path.
Provisional values
Points within 45 days of asof are provisional and rise as late awards arrive. Published levels are not yet archived; each refresh recomputes the series from the current record.
Licence
Free for any use, commercial included, with the attribution "Source: Daall Index (index.daall.sa)" wherever the figures appear. No warranty. The figures are information, not investment advice.
Not available
No award-level rows, no filtering, no authentication, no automated daily feed and no MCP server. Award-level data is delivered under licence, manually.