// Kuvola Institutional Data API — Java starter (no Maven artifact published; copy this file) import java.net.URI; import java.net.http.*; public class KuvolaClient { private static final String BASE_URL = "https://kuvola.ao"; private final String apiKey; private final HttpClient http = HttpClient.newHttpClient(); public KuvolaClient(String apiKey) { this.apiKey = apiKey; } public String v2ListMarkets() throws Exception { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(BASE_URL + "/api/v2/markets")) .header("Authorization", "Bearer " + apiKey) .GET() .build(); HttpResponse response = http.send(request, HttpResponse.BodyHandlers.ofString()); if (response.statusCode() == 429) { throw new RuntimeException("Rate limited. Reset: " + response.headers().firstValue("X-RateLimit-Reset").orElse("unknown")); } if (response.statusCode() >= 400) { throw new RuntimeException("Kuvola API error " + response.statusCode() + ": " + response.body()); } return response.body(); // JSON string — parse with your preferred library; response.pagination has totalPages } // Usage: new KuvolaClient("kv_live_...").v2ListMarkets(); }