HTTP API
Every guide as markdown or JSON over plain GET requests. Free, with no key, no account and no quota.
Endpoints
The machine-readable description is https://dubaisetupindex.com/openapi.json (OpenAPI 3.1).
| Request | Returns | Cache |
|---|---|---|
| GET /{page} with Accept: text/markdown | Any page as markdown. Every content page answers in markdown at its own canonical URL when the request prefers `text/markdown`. Same sections, figures and caveats as the HTML, plus a citation footer. Use this to read a page; use the JSON records to compute with one. | Not cached (varies on Accept) |
| GET /md/{page} | Any page as markdown, at its own URL. The same markdown, addressable without an Accept header. Marked noindex; cite the canonical page URL, not this one. | Cached 1 hour, 1 day at the edge |
| GET /data/free-zones.json | Every UAE free zone, one summary row each. Name, emirate, regulator, the no-visa starting price and the lowest published price for each zone, with a link to its full record. Start here to shortlist. The record is the same object the page at `url` renders: unknown facts keep `{ "kind": "unknown", "detail" }` and are never filled in. Quote with `attribution.citation`. | Prerendered; cached 1 hour, 1 day at the edge |
| GET /data/free-zones/{file} | One free zone. Packages and prices by visa count and term, setup steps and timing, documents, licence and facility types, visa options, renewal, nationality rules, sources and known gaps. The record is the same object the page at `url` renders: unknown facts keep `{ "kind": "unknown", "detail" }` and are never filled in. Quote with `attribution.citation`. | Prerendered; cached 1 hour, 1 day at the edge |
| GET /data/mainland.json | The Dubai mainland (DET) route. The official Invest in Dubai licence estimate examples and activity scopes, the preparation process, dated provider research and the editorial guide. The licence estimate is licence fees only, never a full setup total. The record is the same object the page at `url` renders: unknown facts keep `{ "kind": "unknown", "detail" }` and are never filled in. Quote with `attribution.citation`. | Prerendered; cached 1 hour, 1 day at the edge |
| GET /data/activities/{file} | One business activity. Which setup lanes (IFZA, Ajman Free Zone, Dubai mainland) list the activity, with codes, facility and approval requirements, documents and regulation level; and where else it is catalogued. The record is the same object the page at `url` renders: unknown facts keep `{ "kind": "unknown", "detail" }` and are never filled in. Quote with `attribution.citation`. | Prerendered; cached 1 hour, 1 day at the edge |
| GET /activities/search-index.json | The activity search index. Every activity with its name, lanes and facets, for matching a business description to activity slugs. Fetch the full record for anything you will quote. | Prerendered; cached 1 hour |
| GET /data/comparisons/{file} | A side-by-side route comparison. Rows of facts (prices by visa count, timelines, renewal, licence and facility types) with one cell per subject, in subject order. The record is the same object the page at `url` renders: unknown facts keep `{ "kind": "unknown", "detail" }` and are never filled in. Quote with `attribution.citation`. | Prerendered; cached 1 hour, 1 day at the edge |
| GET /data/countries/{file} | Setup notes for founders from one country. Common motivations, documents to prepare and travel notes for founders from that country. The record is the same object the page at `url` renders: unknown facts keep `{ "kind": "unknown", "detail" }` and are never filled in. Quote with `attribution.citation`. | Prerendered; cached 1 hour, 1 day at the edge |
| GET /llms.txt | What this site covers and how to use it. The agent index: coverage, when to use and not use this site, every surface and the quoting rules. | Cached 1 hour |
| GET /skill.md | The agent skill. When to reach for this site, how to call it and how to quote from it, as a skill file with front matter. | Cached 1 hour |
Markdown
Ask any page for markdown and it answers at its own URL, with the same figures and a citation block:
curl -H "Accept: text/markdown" https://dubaisetupindex.com/free-zones/ifza
Responses vary on Accept. A header that admits neither HTML nor markdown gets 406.
Records
curl https://dubaisetupindex.com/data/free-zones/ifza.json
A record carries the page's facts under data, its canonical url, its updatedOn date, its publication status and a prebuilt attribution. Facts are FactCells: a known value with its unit, or { kind: "unknown", detail } — an unknown is not a zero.
Errors
JSON surfaces answer failures as RFC 9457 problem details (application/problem+json) with a machine code and a hint saying what to do next. Codes: not_found, bad_request, unauthorized, rate_limited, not_acceptable, server_error. Markdown surfaces answer a 404 in markdown with links to where to look instead.