Turn :use into :require / :refer :all -- I think this simplifies things for students: always use :require and either provide an alias (:as) or bring in all the names (:refer :all).
Simplify expression to avoid keyword-as-function in the middle, since get-in can navigate through the :results into the first (0) desired item (key).
Use lower-case for constants instead of UPPER-CASE for better Clojure style (everything is a constant, no need to learn a different naming convention).
Function actually returns a map, not a "json object".
Simpler / more idiomatic condition:

* (not (nil? v)) is just v
* (contains? country-ids (:id k)) is just (country-ids (:id k))

The sorted-indicator-map function is the densest piece of code in the whole thing - it already has several nested calls, a for comprehension with destructuring and a :when qualifier, a sort-by with both a key function and a comparator (I had to go look in the docs to see how that worked!) and a sequence of vector pairs being poured into an empty map.

Using the more idiomatic condition reduces the amount of code and the nested of parentheses and is in keeping with the level of sophistication elsewhere in the function.

I'd probably break this function up (but I'm not going to submit a PR for that until I've seen your feedback on changing the condition).
Consistency: (into {} (for [..] [.. ..])) is used in sorted-indicator-map so it makes sense to use it here as well. It's easiest to read and explain than map with an anonymous function.
(for [..] ..) is easier to read / explain than (map (fn [..] ..) ..)
(for [..] ..) is easier to read / explain than (map (fn [..] ..) ..)

In addition, since the app already uses (for [[k v] inds] ...) in sorted-indicator-map, I suggest using (for [[country value] indicators] ...) here and getting rid of the `let` altogether. Thoughts?