Start from the evidence on who is displaced where and why, choose the populations to identify, review the customised questions, and download the questionnaire with its instructions, derivation rules and translation template. The questions and response options never change; what varies by country is the examples, the office and the document named — and everything that varies is shown in blue and can be edited.
Who is displaced in each country, how many, and what displaced them; where international-protection claims are lodged. Open a country for its drafting brief — which populations to identify, which options need local examples, the areas and the office and document to name — and build the questionnaire from it.
Start from the evidence →Choose the country and the populations to identify (the IRRS and IRIS categories); the forced-to-flee and international-protection questions are customised from the evidence and every blue value can be edited. Test the routing with respondent profiles, then download the questionnaire, the coordinator and interviewer instructions, the derivation rules with code, and a translation template — in six languages, with a link that reopens the exact set-up.
Build a questionnaire →For each of the eight forced-to-flee options: 66 real-world mechanisms in words a respondent might use, and the 68 source-database categories they were mapped from — including the ones that fit badly.
Open the crosswalk →Where human rights research documents displacement that no statistical agency counts — the case for keeping options 3 and 7 even where the data look empty.
Open the comparison →Built from six sources — UCDP, ACLED, IDMC, UNHCR, IOM DTM and V-Dem — cross-referenced country by country. What each one contributes and how it was pulled in is below; the response options themselves never change, only which of them the evidence supports showing, and what local example illustrates each.
It does not localise the instrument. The response options stay identical everywhere, or IRIS comparability is gone and the data cannot be pooled. What varies by country is the enumerator support material — which options get a worked example, and what that example is. It also does not establish causation: “61% of this country’s displacement is drought-attributed” describes co-occurrence in administrative statistics, not why any individual left.
UCDP, IDMC, UNHCR, IOM DTM and V-Dem. Each requires citation; see the repository. ACLED event counts are omitted from this published copy — their terms restrict republishing, and the analysis runs on UCDP alone. Anyone running the pipeline themselves gets the ACLED layer back.
Worth knowing before trusting a refresh date: only one source has a confirmed, working API connection — IOM DTM. IDMC has since issued an API key too, not yet run live. Everything else is a manual export or an offline package, so the figures are pinned to a download date rather than live.
| IOM DTM | API, with a free subscription key, via IOM’s own
dtmapi client |
| UCDP GED | bulk CSV download — no key needed. An API token was requested for reproducible refresh, not for first results |
| IDMC | manual export (default). Disaggregated data exists only from 2023, one year per download; the long 2008–2025 series distinguishes only conflict vs disaster. An API key has since been issued; not yet confirmed to carry the same detail as the manual disaggregated file |
| ACLED | manual export, six regional files. Counts stripped from this published copy on licence grounds |
| UNHCR | the refugees R package, which ships the data
offline — no network call |
| V-Dem | file from the vdemdata repository |
github.com/mitrovif/idq-map — R analysis with a Python visualisation layer. No source data is bundled; every input is downloaded from its publisher, which is a licence requirement rather than a preference.
Full instructions, including which download goes where and the figures to check your run against: docs/reproduce.md. The short version, once the downloads are in place:
python3 -m pip install -r prototype-python/requirements.txt IDQ_ROOT=$(pwd) python3 prototype-python/run_all.py
Fifteen steps, about three minutes. Each prints what it read and wrote, and a step whose input is missing says so and is skipped rather than failing the run.