{"openapi":"3.1.0","info":{"title":"Dubai Setup Index HTTP API","version":"1.0.0","summary":"Sourced, dated facts on UAE free zones, the Dubai mainland route and business activities.","description":"Dubai Setup Index publishes guides to setting up a company in Dubai and the UAE. These endpoints serve the same facts as data.\n\nFree, with nothing to sign up for: no API key, no account, no quota. Read them straight away.\n\nAgents should prefer the MCP server at https://dubaisetupindex.com/api/mcp, which exposes the same records as typed tools plus cost estimators. Its manifest is at https://dubaisetupindex.com/.well-known/mcp.json.\n\nQUOTING: a starting price is not a full setup total. Unknown facts stay unknown — never fill or sum around them. The mainland licence estimate is licence fees only. Every record carries a prebuilt citation; use it."},"servers":[{"url":"https://dubaisetupindex.com","description":"Production"}],"externalDocs":{"description":"The same surfaces, in prose","url":"https://dubaisetupindex.com/docs/api"},"x-mcp":{"description":"The Model Context Protocol server over the same records, plus cost estimators. Streamable HTTP, read-only tools. Every request is authenticated with OAuth 2.1; dynamic client registration is open, so a client registers itself and a person approves one consent screen.","endpoint":"https://dubaisetupindex.com/api/mcp","manifest":"https://dubaisetupindex.com/.well-known/mcp.json","documentation":"https://dubaisetupindex.com/docs/mcp"},"x-onboarding":{"freeTier":true,"apiKeyRequired":false,"accountRequired":false,"selfServe":true,"rateLimited":false,"notes":"These HTTP endpoints need no credential. The MCP server needs an OAuth token, obtainable end to end by a client through dynamic registration plus one human consent."},"paths":{"/{page}":{"get":{"operationId":"getPageAsMarkdown","summary":"Any page as markdown","description":"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.","parameters":[{"name":"page","in":"path","required":true,"description":"Any page path from /sitemap.xml, e.g. `free-zones/ifza`.","schema":{"type":"string"}},{"name":"Accept","in":"header","required":true,"description":"`text/markdown`. A header that accepts neither HTML nor markdown answers 406.","schema":{"type":"string","enum":["text/markdown"]}}],"responses":{"200":{"description":"Any page as markdown","content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"description":"No such page or record."},"406":{"description":"The Accept header admits neither text/html nor text/markdown."}}}},"/md/{page}":{"get":{"operationId":"getMarkdownMirror","summary":"Any page as markdown, at its own URL","description":"The same markdown, addressable without an Accept header. Marked noindex; cite the canonical page URL, not this one.","parameters":[{"name":"page","in":"path","required":true,"description":"A page path from /sitemap.xml.","schema":{"type":"string"}}],"responses":{"200":{"description":"Any page as markdown, at its own URL","content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"description":"No such page or record."}}}},"/data/free-zones.json":{"get":{"operationId":"listFreeZones","summary":"Every UAE free zone, one summary row each","description":"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`.","parameters":[],"responses":{"200":{"description":"Every UAE free zone, one summary row each","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}}}}}},"/data/free-zones/{file}":{"get":{"operationId":"getFreeZone","summary":"One free zone","description":"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`.","parameters":[{"name":"file","in":"path","required":true,"description":"The free zone slug followed by `.json`, e.g. the last segment of its page URL plus `.json`. Slugs are listed in /sitemap.xml.","schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*\\.json$"}}],"responses":{"200":{"description":"One free zone","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}}},"404":{"description":"No such page or record."}}}},"/data/mainland.json":{"get":{"operationId":"getMainland","summary":"The Dubai mainland (DET) route","description":"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`.","parameters":[],"responses":{"200":{"description":"The Dubai mainland (DET) route","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}}}}}},"/data/activities/{file}":{"get":{"operationId":"getActivity","summary":"One business activity","description":"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`.","parameters":[{"name":"file","in":"path","required":true,"description":"The activity slug followed by `.json`, e.g. the last segment of its page URL plus `.json`. Slugs are listed in /sitemap.xml.","schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*\\.json$"}}],"responses":{"200":{"description":"One business activity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}}},"404":{"description":"No such page or record."}}}},"/activities/search-index.json":{"get":{"operationId":"searchActivities","summary":"The activity search index","description":"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.","parameters":[],"responses":{"200":{"description":"The activity search index","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/data/comparisons/{file}":{"get":{"operationId":"getComparison","summary":"A side-by-side route comparison","description":"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`.","parameters":[{"name":"file","in":"path","required":true,"description":"The comparison slug followed by `.json`, e.g. the last segment of its page URL plus `.json`. Slugs are listed in /sitemap.xml.","schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*\\.json$"}}],"responses":{"200":{"description":"A side-by-side route comparison","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}}},"404":{"description":"No such page or record."}}}},"/data/countries/{file}":{"get":{"operationId":"getCountryGuide","summary":"Setup notes for founders from one country","description":"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`.","parameters":[{"name":"file","in":"path","required":true,"description":"The country slug followed by `.json`, e.g. the last segment of its page URL plus `.json`. Slugs are listed in /sitemap.xml.","schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*\\.json$"}}],"responses":{"200":{"description":"Setup notes for founders from one country","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}}},"404":{"description":"No such page or record."}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","summary":"What this site covers and how to use it","description":"The agent index: coverage, when to use and not use this site, every surface and the quoting rules.","parameters":[],"responses":{"200":{"description":"What this site covers and how to use it","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/skill.md":{"get":{"operationId":"getSkill","summary":"The agent skill","description":"When to reach for this site, how to call it and how to quote from it, as a skill file with front matter.","parameters":[],"responses":{"200":{"description":"The agent skill","content":{"text/markdown":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Record":{"title":"Record","type":"object","required":["id","type","title","url","data","attribution"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["free-zone","mainland","activity","comparison","country"]},"title":{"type":"string"},"url":{"type":"string","format":"uri","description":"The canonical page. Cite this."},"updatedOn":{"type":["string","null"],"format":"date"},"publish":{"type":["object","null"],"description":"`status: noindex` marks a page below the publication gate, with the reasons."},"links":{"type":"object","properties":{"html":{"type":"string","format":"uri"},"markdown":{"type":"string","format":"uri"},"json":{"type":"string","format":"uri"}}},"data":{"type":"object","description":"The page's facts. Facts are `FactCell`s."},"attribution":{"$ref":"#/components/schemas/Attribution"}}},"FactCell":{"title":"FactCell","description":"One fact. Either known (`money`, `duration`, `count`, `text`, `boolean`, with a `value`) or `unknown` with a `detail` saying what was checked. An unknown is not a zero and must not be estimated.","type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["money","duration","count","text","boolean","unknown"]},"value":{},"note":{"type":"string"},"detail":{"type":"string"}},"additionalProperties":true},"Attribution":{"title":"Attribution","description":"A prebuilt citation. Copy `citation` or `citationMarkdown` verbatim rather than composing your own; the link is the part that must survive.","type":"object","required":["citation","url"],"properties":{"required":{"type":"boolean"},"publisher":{"type":"string"},"url":{"type":"string","format":"uri"},"license":{"type":"string","format":"uri"},"citation":{"type":"string"},"citationMarkdown":{"type":"string"},"note":{"type":"string"}}},"Problem":{"title":"Problem","description":"RFC 9457 problem details.","type":"object","required":["type","title","status","code","hint"],"properties":{"type":{"type":"string","format":"uri","const":"https://dubaisetupindex.com/docs/api#errors"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"code":{"type":"string"},"hint":{"type":"string"}}}}}}