{risAT}: Climate change in asylum-related decisions of the Austrian Federal Administrative Court (BVwG)
Austria
risAT
asylum
climate
Using {risAT} to search Austrian Federal Administrative Court (BVwG) asylum decisions for references to climate change (Klimawandel).
Author
Roland Schmidt
Published
6 Aug 2026
Modified
6 Aug 2026
Just the results, please
Annual BVwG decision texts returned for the AsylG norm filter, split by Klimawandel matches
Annual share of Klimawandel matches among BVwG decision texts returned for the AsylG norm filter
1 Context
A few years ago, I had the privilege of contributing to a paper on the relevance of climate-change-related consequences—such as floods, droughts, and famines—to the Austrian Federal Administrative Court’s case law on subsidiary protection and asylum.1 The study was part of a research project on climate-change-related migration and whether, or to what extent, a legal concept of the “climate refugee” is emerging. My task was modest: to retrieve the full body of relevant case law, scan it for certain key terms, extract the relevant sections, and do some number crunching. The resulting dataset then served as the basis for case studies conducted by legal scholars.
I really enjoyed working on this project. In retrospect, however, my approach was somewhat clumsy, particularly given the tools available to us today, such as {httr2}. I suspect that this occasionally protracted process was one of my motivations for writing the {risAT} package, which I introduced in my previous blog post. After all, the beauty of an R package is that it allows you to encapsulate a complex workflow in an easy-to-use function and have it at your fingertips. Some progress, you might say.
Given the current heatwave in Austria and across Europe, I thought this might be a good opportunity to revisit the topic and demonstrate some of {risAT}’s features—albeit without the same level of detail or legal expertise, given time constraints and other priorities.
The questions I came up with are:
How often does the term Klimawandel appear in the BVwG’s asylum-related decisions?
How does the frequency of these references change over time?
Although this approach is admittedly crude and the results come with several caveats, as I explain later, it provides a useful demonstration of {risAT}. The analysis involves four steps:
Query all BVwG decisions with a reference to AsylG in their Norm field.
Query all BVwG decisions that mention Klimawandel in their text.
Identify which decisions returned by the second query also appear in the first.
Calculate the share of matching decisions for each year.
2 Get asylum decisions
To start with, I need all BVwG decisions which refer to the Austrian Asylum Act (AsylG) in their Norm field. These decisions form the denominator for the subsequent analysis. I retrieve them separately for each year from 2014 to 2025. This keeps the individual requests reasonably small, while {furrr} allows me to run several of them in parallel. Note that this can take quite a while. Note also that I set search_decision_text = TRUE and search_legal_principles = FALSE when specifying the query. I am interested only in the decision texts themselves, not the legal principles, which generally summarize the legal gist of a decision. Including both would produce duplicate records.
Fetch BVwG asylum-norm records year by year (parallel)
In the next step, I search all BVwG decision texts from the same period for the term Klimawandel. {risAT} makes this straightforward: I simply supply the search term through the query argument. I also restrict the search to the same date range as above. The result is a list of all BVwG decisions which contain the term Klimawandel in their text.
Classify AsylG decision texts by Klimawandel match
bvwg_asyl_norm_records <- bvwg_asyl_records %>%mutate(mentions_klimawandel =as.character(id) %in%as.character(bvwg_klimawandel_results$id) )# The Klimawandel query covers all BVwG decisions; 3,003 also match AsylG.stopifnot(sum(bvwg_asyl_norm_records$mentions_klimawandel) ==3003L)bvwg_asyl_norm_climate_year <- bvwg_asyl_norm_records %>%count(year, mentions_klimawandel, name ="records") %>%complete(year =2014:2025,mentions_klimawandel =c(FALSE, TRUE),fill =list(records =0L) ) %>%mutate(climate_group =factor(if_else( mentions_klimawandel,"Matches Klimawandel search","No Klimawandel search match" ),levels =c("No Klimawandel search match", "Matches Klimawandel search") ) ) %>%mutate(total =sum(records),share =if_else(total >0, records / total, 0),.by = year )
4 Results
Let’s first look at the absolute numbers. Figure 1 shows the annual number of distinct BVwG decision texts returned for norm = "AsylG". The highlighted part of each bar indicates how many of these decisions also contain the term Klimawandel.
Plot annual asylum-norm records by Klimawandel mention
bvwg_asyl_norm_totals <- bvwg_asyl_norm_climate_year %>%distinct(year, total)bvwg_asyl_norm_climate_counts <- bvwg_asyl_norm_climate_year %>%filter(mentions_klimawandel) %>%select(year, records, total)bvwg_asyl_norm_climate_year %>%ggplot(aes(x = year, y = records, fill = climate_group)) +geom_col(width =0.72, key_glyph = draw_key_point) +geom_text(data = bvwg_asyl_norm_totals,aes(x = year, y = total, label = scales::comma(total)),inherit.aes =FALSE,vjust =-1.5,color ="black",size = gg_annot_size,family = gg_plot_family ) +geom_text(data = bvwg_asyl_norm_climate_counts,aes(x = year, y = total, label =paste0("(", records, ")")),inherit.aes =FALSE,vjust =-0.3,color ="#4D4D4D",size = gg_annot_size *0.85,family = gg_plot_family ) +scale_x_continuous(breaks =c(2014, 2015, 2020, 2025)) +scale_y_continuous(labels = scales::comma, expand =expansion(mult =c(0, 0.2))) +scale_fill_manual(values =c("No Klimawandel search match"="#7f7f7f","Matches Klimawandel search"="#e69f00" ),name =NULL ) +labs(title ="How often does ‘Klimawandel’ appear in BVwG decisions referencing AsylG?",subtitle =paste0("Annual distinct BVwG decision texts returned by RIS for norm = “AsylG”, 2014–2025; ","highlighted texts also match the text search “Klimawandel”. A match indicates term occurrence ","only—not legal relevance or use in the court’s reasoning. Labels show the annual total and matching subset." ),x ="Year",y ="RIS records",caption = ris_graph_caption ) +ris_plot_theme()
Figure 1: Annual BVwG decision texts returned for the AsylG norm filter, split by Klimawandel matches.
What stands out to me is that there is not a single match before 2018. The term first appears in 2018 and is present in every year thereafter, although the numbers fluctuate quite substantially.
To make the comparison between years a bit easier, Figure 2 shows the same result as a share of all decisions returned for the AsylG filter. The share reaches 4.1 per cent in 2023, falls to 2.6 per cent in 2024, and then increases to 8.3 per cent in 2025. This is by far the highest value in the period covered here.
Plot the annual Klimawandel share among asylum-norm records
bvwg_asyl_norm_climate_year %>%filter(mentions_klimawandel) %>%ggplot(aes(x = year, y = share)) +geom_line(color ="#1185FE") +geom_point(color ="#1185FE") +geom_text(aes(label = scales::percent(share, accuracy =0.1)),nudge_y =0.006,color ="black",size = gg_annot_size,family = gg_plot_family ) +scale_x_continuous(breaks =c(2014, 2015, 2020, 2025)) +scale_y_continuous(labels = scales::percent_format(accuracy =1),expand =expansion(mult =c(0.05, 0.12)) ) +labs(title ="What share of BVwG decisions referencing AsylG mention ‘Klimawandel’?",subtitle =paste0("Annual share of distinct BVwG decision texts returned by RIS for norm = “AsylG” ","that also match the text search “Klimawandel”, 2014–2025. A match indicates term occurrence ","only—not legal relevance or use in the court’s reasoning." ),x ="Year",y =NULL,caption = ris_graph_caption ) +ris_plot_theme()
Figure 2: Annual share of Klimawandel matches among BVwG decision texts returned for the AsylG norm filter.
There is, however, an important caveat. A match only tells us that the word Klimawandel appears somewhere in a decision returned for the AsylG filter. It does not tell us whether climate change was central to the case, whether it played a role in the court’s reasoning, or whether the decision ultimately turned on it. The graphs therefore show how often the term appears, not how often climate change was legally relevant.
Most of these matches are likely located in the country-of-origin information (COI) section, which forms part of the decision text and summarizes general conditions in an applicant’s country of origin. However, these results do not tell us whether a match also featured in the court’s reasoning. In other words, the growing number of climate-change mentions in asylum decisions does not, by itself, mean that climate change played an increasingly important role in decisions on asylum applications. Establishing that would require a robust method for identifying the section in which each match occurs and determining whether it forms part of the court’s reasoning.
5 Wrap-up
For now, I hope the example also demonstrates how {risAT} can be used to move from a legal norm to a searchable collection of decisions. As always, if you spot an error, have a question, or want to suggest a follow-up, feel free to contact me via direct message on Bluesky or the {risAT} GitHub discussion board.