diff --git a/server/routes.ts b/server/routes.ts
index 7a40615..e440b28 100644
--- a/server/routes.ts
+++ b/server/routes.ts
@@ -1,4 +1,4 @@
-import type { Express, Request, Response } from "express";
+import type { Express, Request, Response, NextFunction } from "express";
import { createServer, type Server } from "http";
import { storage } from "./storage";
import axios from "axios";
@@ -7,6 +7,7 @@ import { ZodError } from "zod";
import { fromZodError } from "zod-validation-error";
const CITES_BASE_URL = "https://api.speciesplus.net/api/v1";
+const IUCN_BASE_URL = "https://apiv3.iucnredlist.org/api/v3";
export async function registerRoutes(app: Express): Promise {
// API Token routes
@@ -212,6 +213,191 @@ export async function registerRoutes(app: Express): Promise {
}
});
+ // IUCN Red List API routes
+ app.get("/api/iucn/species", async (req: Request, res: Response) => {
+ try {
+ const { name } = req.query;
+
+ if (!name) {
+ return res.status(400).json({
+ success: false,
+ message: "Species name is required"
+ });
+ }
+
+ const apiKey = process.env.IUCN_API_KEY;
+ if (!apiKey) {
+ return res.status(401).json({
+ success: false,
+ message: "IUCN API key is not configured"
+ });
+ }
+
+ try {
+ const response = await axios.get(`${IUCN_BASE_URL}/species/name/${name}`, {
+ params: { token: apiKey }
+ });
+
+ res.json({
+ success: true,
+ data: response.data
+ });
+ } catch (error) {
+ if (axios.isAxiosError(error) && error.response) {
+ return res.status(error.response.status).json({
+ success: false,
+ message: error.response.data?.message || "Error from IUCN Red List API",
+ status: error.response.status
+ });
+ }
+ throw error;
+ }
+ } catch (error) {
+ res.status(500).json({
+ success: false,
+ message: "Failed to retrieve IUCN species data"
+ });
+ }
+ });
+
+ app.get("/api/iucn/threats", async (req: Request, res: Response) => {
+ try {
+ const { name } = req.query;
+
+ if (!name) {
+ return res.status(400).json({
+ success: false,
+ message: "Species name is required"
+ });
+ }
+
+ const apiKey = process.env.IUCN_API_KEY;
+ if (!apiKey) {
+ return res.status(401).json({
+ success: false,
+ message: "IUCN API key is not configured"
+ });
+ }
+
+ try {
+ const response = await axios.get(`${IUCN_BASE_URL}/threats/species/name/${name}`, {
+ params: { token: apiKey }
+ });
+
+ res.json({
+ success: true,
+ data: response.data
+ });
+ } catch (error) {
+ if (axios.isAxiosError(error) && error.response) {
+ return res.status(error.response.status).json({
+ success: false,
+ message: error.response.data?.message || "Error from IUCN Red List API",
+ status: error.response.status
+ });
+ }
+ throw error;
+ }
+ } catch (error) {
+ res.status(500).json({
+ success: false,
+ message: "Failed to retrieve IUCN threats data"
+ });
+ }
+ });
+
+ app.get("/api/iucn/habitats", async (req: Request, res: Response) => {
+ try {
+ const { name } = req.query;
+
+ if (!name) {
+ return res.status(400).json({
+ success: false,
+ message: "Species name is required"
+ });
+ }
+
+ const apiKey = process.env.IUCN_API_KEY;
+ if (!apiKey) {
+ return res.status(401).json({
+ success: false,
+ message: "IUCN API key is not configured"
+ });
+ }
+
+ try {
+ const response = await axios.get(`${IUCN_BASE_URL}/habitats/species/name/${name}`, {
+ params: { token: apiKey }
+ });
+
+ res.json({
+ success: true,
+ data: response.data
+ });
+ } catch (error) {
+ if (axios.isAxiosError(error) && error.response) {
+ return res.status(error.response.status).json({
+ success: false,
+ message: error.response.data?.message || "Error from IUCN Red List API",
+ status: error.response.status
+ });
+ }
+ throw error;
+ }
+ } catch (error) {
+ res.status(500).json({
+ success: false,
+ message: "Failed to retrieve IUCN habitats data"
+ });
+ }
+ });
+
+ app.get("/api/iucn/measures", async (req: Request, res: Response) => {
+ try {
+ const { name } = req.query;
+
+ if (!name) {
+ return res.status(400).json({
+ success: false,
+ message: "Species name is required"
+ });
+ }
+
+ const apiKey = process.env.IUCN_API_KEY;
+ if (!apiKey) {
+ return res.status(401).json({
+ success: false,
+ message: "IUCN API key is not configured"
+ });
+ }
+
+ try {
+ const response = await axios.get(`${IUCN_BASE_URL}/measures/species/name/${name}`, {
+ params: { token: apiKey }
+ });
+
+ res.json({
+ success: true,
+ data: response.data
+ });
+ } catch (error) {
+ if (axios.isAxiosError(error) && error.response) {
+ return res.status(error.response.status).json({
+ success: false,
+ message: error.response.data?.message || "Error from IUCN Red List API",
+ status: error.response.status
+ });
+ }
+ throw error;
+ }
+ } catch (error) {
+ res.status(500).json({
+ success: false,
+ message: "Failed to retrieve IUCN conservation measures data"
+ });
+ }
+ });
+
const httpServer = createServer(app);
return httpServer;
}