diff --git a/src/Apsis.php b/src/Apsis.php
index 923bd35..bfafa79 100644
--- a/src/Apsis.php
+++ b/src/Apsis.php
@@ -95,23 +95,28 @@ class Apsis {
    *   Array containing all mailing lists.
    */
   public function getMailingLists() {
-    // Request options.
-    $method = 'post';
-    $path = '/mailinglists/v2/all';
-    $args = [
-      'headers' => [
-        'Content-length' => 0,
-      ],
-    ];
-
-    // Get request content.
-    $contents = $this->request($method, $path, $args);
-    // Populate array for settings.
-    $list = [];
-    if (!empty($contents)) {
-      foreach ($contents->Result as $result) {
-        $list[$result->Id] = $result->Name;
+    $key = __FUNCTION__;
+    if (!($list = $this->cacheGet($key))) {
+      // Request options.
+      $method = 'post';
+      $path = '/mailinglists/v2/all';
+      $args = [
+        'headers' => [
+          'Content-length' => 0,
+        ],
+      ];
+
+      // Get request content.
+      $contents = $this->request($method, $path, $args);
+      // Populate array for settings.
+      $list = [];
+      if (!empty($contents)) {
+        foreach ($contents->Result as $result) {
+          $list[$result->Id] = $result->Name;
+        }
       }
+
+      $this->cacheSet($key, $list);
     }
 
     return $list;
@@ -121,20 +126,25 @@ class Apsis {
    * Get mailing list name from list id.
    */
   public function getMailingListInfo($list_id) {
-    // Request options.
-    $method = 'get';
-    $path = '/v1/mailinglists/' . $list_id;
-    $args = [
-      'headers' => [
-        'Content-length' => 0,
-      ],
-    ];
-
-    // Get request content.
-    $contents = $this->request($method, $path, $args);
-
-    // Get result.
-    $result = $contents->Result;
+    $key = __FUNCTION__ . ':' . $list_id;
+    if (!($result = $this->cacheGet($key))) {
+      // Request options.
+      $method = 'get';
+      $path = '/v1/mailinglists/' . $list_id;
+      $args = [
+        'headers' => [
+          'Content-length' => 0,
+        ],
+      ];
+
+      // Get request content.
+      $contents = $this->request($method, $path, $args);
+
+      // Get result.
+      $result = $contents->Result;
+
+      $this->cacheSet($key, $result);
+    }
 
     return $result;
   }
@@ -146,17 +156,21 @@ class Apsis {
    *   Apsis mailing list id.
    */
   public function getSubscribers($id) {
-    // Request options.
-    $method = 'post';
-    $path = '/v1/mailinglists/' . $id . '/subscribers/all';
-    $args = [
-      'json' => [
-        'AllDemographics' => TRUE,
-      ],
-    ];
-
-    // @todo This REST method uses queueing, must figure out how to handle it.
-    $contents = $this->request($method, $path, $args);
+    $key = __FUNCTION__ . ':' . $id;
+    if (!($contents = $this->cacheGet($key))) {
+      // Request options.
+      $method = 'post';
+      $path = '/v1/mailinglists/' . $id . '/subscribers/all';
+      $args = [
+        'json' => [
+          'AllDemographics' => TRUE,
+        ],
+      ];
+
+      // @todo This REST method uses queueing, must figure out how to handle it.
+      $contents = $this->request($method, $path, $args);
+      $this->cacheSet($key, $contents);
+    }
 
     return $contents;
   }
@@ -165,13 +179,18 @@ class Apsis {
    * Get mailing lists by subscriber.
    */
   public function getSubscriberMailingLists($id) {
-    // Request options.
-    $method = 'get';
-    $path = '/v1/subscribers/' . $id . '/mailinglists';
-
-    $contents = $this->request($method, $path);
+    $key = __FUNCTION__ . ':' . $id;
+    if (!($return = $this->cacheGet($key))) {
+      // Request options.
+      $method = 'get';
+      $path = '/v1/subscribers/' . $id . '/mailinglists';
+
+      $contents = $this->request($method, $path);
+      $return = $contents ? $contents->Result : NULL;
+      $this->cacheSet($key, $return);
+    }
 
-    return $contents ? $contents->Result : NULL;
+    return $return;
   }
 
   /**
@@ -181,17 +200,22 @@ class Apsis {
    *   An email address.
    */
   public function getSubscriberIdByEmail($email) {
-    // Request options.
-    $method = 'post';
-    $path = '/subscribers/v2/email';
-    $args = [
-      'json' => $email,
-    ];
-
-    // Do request.
-    $contents = $this->request($method, $path, $args);
+    $key = __FUNCTION__ . ':' . $email;
+    if (!($return = $this->cacheGet($key))) {
+      // Request options.
+      $method = 'post';
+      $path = '/subscribers/v2/email';
+      $args = [
+        'json' => $email,
+      ];
+
+      // Do request.
+      $contents = $this->request($method, $path, $args);
+      $return = $contents ? $contents->Result : NULL;
+      $this->cacheSet($return);
+    }
 
-    return $contents ? $contents->Result : NULL;
+    return $return;
   }
 
   /**
@@ -267,4 +291,48 @@ class Apsis {
     return $contents;
   }
 
+  /**
+   * Get a cached result.
+   *
+   * @param string $key
+   *   The key to get cache for.
+   *
+   * @return mixed
+   *   The cached result, or FALSE if not found in caches.
+   */
+  protected function cacheGet($key) {
+    $cid = 'apsis_mail:api:' . $key;
+
+    // First check static cache, before querying the cache backend.
+    $data = &drupal_static($cid, FALSE);
+    if (!$data) {
+
+      // The check the cache backend.
+      if ($cache = \Drupal::cache()->get($cid)) {
+        $data = $cache->data;
+      }
+    }
+
+    return $data;
+  }
+
+  /**
+   * Set a cached result.
+   *
+   * @param string $key
+   *   The key to set cache for.
+   * @param mixed $data
+   *   The data to set in cache.
+   */
+  protected function cacheSet($key, $data) {
+    $cid = 'apsis_mail:api:' . $key;
+
+    // Make sure that static cache is set.
+    $data_static = &drupal_static($cid, FALSE);
+    $data_static = $data;
+
+    // Cache results for 30 seconds.
+    \Drupal::cache()->set($cid, $data, time() + 30);
+  }
+
 }
