diff --git a/src/main/java/com/lincfusion/udyamlinc/apex/ApexController.java b/src/main/java/com/lincfusion/udyamlinc/apex/ApexController.java
index aabb883..17d7d17 100644
--- a/src/main/java/com/lincfusion/udyamlinc/apex/ApexController.java
+++ b/src/main/java/com/lincfusion/udyamlinc/apex/ApexController.java
@@ -4,7 +4,9 @@ import com.lincfusion.udyamlinc.common.ApiResponse;
import com.lincfusion.udyamlinc.security.TenantContext;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.LinkedHashMap;
@@ -57,6 +59,32 @@ public class ApexController {
return ApiResponse.ok(apexService.bySector());
}
+ /**
+ * India → zone → state → district.
+ *
+ *
The narrowing parameters come from the caller because they select a
+ * view, not an entitlement: an apex user may read every zone, so being able
+ * to name one grants nothing. Contrast the institution id, which is never
+ * accepted from a request.
+ */
+ @GetMapping("/geography")
+ public ApiResponse>> geography(
+ TenantContext tenant,
+ @RequestParam(defaultValue = "ZONE") String level,
+ @RequestParam(required = false) String zone,
+ @RequestParam(required = false) String state) {
+ requireApex(tenant);
+ return ApiResponse.ok(apexService.geography(level, zone, state));
+ }
+
+ /** One partner bank, broken down by branch. The deepest this tier goes. */
+ @GetMapping("/banks/{code}/branches")
+ public ApiResponse>> bankBranches(
+ TenantContext tenant, @PathVariable String code) {
+ requireApex(tenant);
+ return ApiResponse.ok(apexService.bankBranches(code));
+ }
+
@GetMapping("/digest")
public ApiResponse