First prototype
diff --git a/inc/api.php b/inc/api.php
new file mode 100644
index 0000000..fd9b40f
--- /dev/null
+++ b/inc/api.php
@@ -0,0 +1,106 @@
+<?php
+class api {
+  private function writeJSON($array) {
+    echo json_encode($array);
+  }
+
+  private function error($error = null) {
+    self::writeJSON(["status" => "error", "error" => $error]);
+    exit();
+  }
+
+  private function returnData($data) {
+    self::writeJSON(["status" => "ok", "data" => $data]);
+    exit();
+  }
+
+  private function transformRouteShortName($name) {
+    if ($name == "L9N") return "L9";
+    if ($name == "L10N") return "L10";
+    return $name;
+  }
+
+  public static function handleRequest() {
+    global $_GET, $_POST, $conf;
+
+    header("Content-Type: application/json");
+
+    if (!isset($_GET["action"])) self::error("actionNotProvided");
+
+    $gtfs = new gtfs();
+
+    switch ($_GET["action"]) {
+      case "routes":
+      self::returnData($gtfs->getRoutes());
+      break;
+
+      case "trips":
+      if (!isset($_GET["route"])) self::error("missingArguments");
+      $route = $_GET["route"];
+
+      self::returnData($gtfs->getTrips($route));
+      break;
+
+      case "stations":
+      self::returnData($gtfs->getStations(true));
+
+      /*$estacionsFull = tmbApi::request("transit/linies/metro/".$linia."/estacions");
+      if ($estacionsFull === false || !isset($estacionsFull["features"])) self::error("unexpected");
+
+      $estacions = [];
+      foreach ($estacionsFull["features"] as $estacio) {
+        if (!isset($estacio["properties"])) self::error("unexpected");
+        $estacions[] = [
+          "id" => $estacio["properties"]["CODI_ESTACIO"] ?? null,
+          "nom" => $estacio["properties"]["NOM_ESTACIO"] ?? "",
+          "color" => $estacio["properties"]["COLOR_LINIA"] ?? "000",
+          "ordre" => $estacio["properties"]["ORDRE_ESTACIO"] ?? 0
+        ];
+      }
+
+      usort($estacions, function ($a, $b) {
+        return $a["ordre"] - $b["ordre"];
+      });*/
+      break;
+
+      case "getTimes":
+      if (!isset($_GET["stop"])) self::error("missingArguments");
+
+      $stop = $gtfs->getStop($_GET["stop"]);
+      $times = $gtfs->getStopTimes($_GET["stop"]);
+
+      $schedules = [];
+      $routes = [];
+      foreach ($times as $time) {
+        if ($time["trip_headsign"] == $stop["stop_name"]) continue;
+        $schedules[] = [
+          "destination" => $time["trip_headsign"],
+          "arrivalTime" => gtfs::time2seconds($time["arrival_time"]),
+          "departureTime" => gtfs::time2seconds($time["departure_time"]),
+          "route" => self::transformRouteShortName($time["route_short_name"]),
+          "color" => $time["route_color"],
+          "textColor" => $time["route_text_color"]
+        ];
+
+        if (!in_array($time["route_short_name"], $routes)) $routes[] = $time["route_short_name"];
+      }
+
+      $timeSinceMidnight = gtfs::timeSinceMidnight();
+
+      usort($schedules, function($a, $b) use ($timeSinceMidnight) {
+        return ($a["departureTime"] - $b["departureTime"]) % (24*60*60);
+      });
+
+      $data = [
+        "schedules" => $schedules,
+        "numRoutes" => count($routes)
+      ];
+
+      self::returnData($data);
+      break;
+
+      default:
+      self::error("actionNotImplemented");
+    }
+  }
+}