DaallIndex
Daall Index · API

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)".

GETJSON · CSVCORS openNo authenticationVersion v1

Use

One GET per file · same files the site renders

Every 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
PathContentsFrequencyHistoryCSV twin
/api/v1/catalog.jsonEvery file, its asof date, licence and attributionPer refresh——
/api/v1/series/DGI.jsonDGI level, trailing award value and daily awarded valueDaily pointsFrom 1 Jan 2023dgi.csv
/api/v1/series/{CODE}.jsonSector series; CODE is one of CAPG, CPS, SOFT, CONS, TRAN, UTIL, TELE, HLTHMonthly pointsFrom Dec 2022sectors.csv
/api/v1/listed.jsonAward value by Tadawul and Nomu issuer, with identifiersPer refreshAs stated in the file (calendar 2025 at publication)listed.csv
/api/v1/backlog.jsonExpected government revenue by issuer and quarter, beside reported revenueQuarterly pointsAs stated in the filebacklog.csv
/api/v1/research.jsonResearch notes: findings with grades, implications, sources, verificationPer refreshAll notes—
/api/v1/evidence.jsonPre-registered tests of the indices and their resultsPer refreshAll 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
FieldTypeMeaning
versionstringAPI version, "v1"
generateddateDay the files were generated, YYYY-MM-DD
asofdateLatest data date across the files
refreshstring"With the site, at least monthly"
licencestring"Free with attribution"
attributionstringThe attribution line to use
endpoints[]arrayOne entry per file
endpoints[].idstringShort id: DGI, CAPG, listed, backlog, research, evidence
endpoints[].pathstringPath of the JSON file
endpoints[].csvstring | nullPath of the CSV twin, where one exists
endpoints[].titlestringName of the series or table
endpoints[].frequencystringdaily, monthly, quarterly or refresh
endpoints[].fromdate | nullFirst data date
endpoints[].asofdateLatest 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
FieldTypeMeaning
symbolstring"DAALL:DGI"
namestringIndex name
unitstringUnit of level: index points, 2023 average = 100
frequencystring"daily"
from · asofdateFirst and latest point
methodology_versionstringVersion under which the series was built, see methodology §9
preliminary_fromdatePoints on or after this date are provisional (latest 45 days)
base_sar_bnnumber2023 average of the trailing sum, SAR bn; one point = base ÷ 100
cap.sharenumberSingle-award cap as a share of the prior 12 months, 0.1
cap.awards_cappedintegerAwards bound by the DGI cap at asof (0 at 30 Sep 2026)
cap.removed_sar_bnnumberValue removed by the cap at asof, SAR bn
points[].datedateAward date the point is dated by
points[].levelnumberIndex level, 2 decimals
points[].trailing_sar_bnnumberCapped award value of the 365 days to date, SAR bn, VAT included
points[].awarded_sar_mnumber | nullValue 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
FieldTypeMeaning
symbolstring"DGI.CAPG" and so on
codestringCAPG, CPS, SOFT, CONS, TRAN, UTIL, TELE or HLTH
namestringTadawul industry group
unitstring"SAR bn, trailing 12 months, after cap"
frequencystring"monthly"
from · asofdateFirst and latest month end
methodology_versionstringVersion the series was built under
mappingstring"draft" while the Etimad-to-Tadawul mapping is a draft
points[].datedateMonth end, YYYY-MM-DD
points[].value_sar_bnnumberAward value of the preceding 12 months mapped to the sector, after the sector cap
points[].rebasednumbervalue ÷ 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
FieldTypeMeaning
yearintegerCalendar year of the window, by award date
asofdateLatest award date read
total_sar_mnumberValue won by all matched issuers, SAR m, VAT included
issuers_nintegerIssuers with at least one award
share_of_all_awards_pctnumberListed share of all award value in the window, per cent
issuers[].tickerstringFour-digit Tadawul ticker
issuers[].name · name_arstringRegistered name, English and Arabic
issuers[].marketstring"TADAWUL" (Main Market) or "NOMU"
issuers[].isinstringISIN
issuers[].value_sar_mnumberAward value in the window, SAR m; 0 where no value is published
issuers[].awardsintegerAwards in the window
issuers[].share_of_listednumberShare 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
FieldTypeMeaning
asofdateLatest award date read
methodstringHow awards are spread over quarters, in one paragraph
issuers[].tickerstringFour-digit Tadawul ticker
issuers[].name · name_arstringRegistered name, English and Arabic
issuers[].gov_share_ttmnumber | nullExpected government revenue of the last 4 reported quarters ÷ reported revenue of those quarters; null where revenue is not reported
issuers[].quarters[].qstringQuarter, "2024Q1"
issuers[].quarters[].expected_gov_rev_sar_mnumberAward value spread into the quarter, SAR m, VAT included
issuers[].quarters[].reported_rev_sar_mnumber | nullRevenue 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
FieldTypeMeaning
asofdateGeneration date
notes[].idstringSlug; the note's anchor on the research page
notes[].title · summarystringTitle and 3–4 sentence summary
notes[].datedatePublication date
notes[].verified_ondate | nullDate the findings were checked against their sources; null if not yet
notes[].findings[].textstringOne claim with its number or source named
notes[].findings[].gradestringA: peer-reviewed or official statistics · B: working paper or official document · C: news, industry or vendor
notes[].findings[].statusstring"verified" or "corrected"
notes[].implications[]stringWhat Daall Index does or measures as a result
notes[].sources[]objecttitle, url, type, grade
notes[].verificationobjectchecked, 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
FieldTypeMeaning
asofdateLatest data date used in the results
registereddateDate the tests and their criteria were registered, before results were computed
notestringProtocol note
tests[].id · titlestringShort id and title
tests[].questionstringWhat the test asks
tests[].targetstringThe Daall series tested
tests[].datastringThe independent data it is tested against
tests[].horizonstringWindow or lead/lag tested
tests[].criterionstringPass threshold, fixed at registration
tests[].result.metric · value · nstring · number · integerStatistic, its value and the observations
tests[].result.verdictstring"pass", "fail" or "inconclusive"
tests[].detailstringWhat was done and what it showed
tests[].tableobject | nullcols: 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
FileColumnsOne row per
/data/csv/dgi.csvdate, level, trailing_sar_bn, awarded_sar_mDay, from 2023-01-01
/data/csv/sectors.csvdate, code, name, value_sar_bn, rebasedSector and month end; 8 sectors in one file
/data/csv/listed.csvticker, name, name_ar, market, isin, value_sar_m, awards, share_of_listedIssuer
/data/csv/backlog.csvticker, name, q, expected_gov_rev_sar_m, reported_rev_sar_mIssuer 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 files

Refresh

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.