diff --git a/session_limit.api.php b/session_limit.api.php
new file mode 100644
index 0000000..e9ac7cf
--- /dev/null
+++ b/session_limit.api.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @file
+ * This file contains no working PHP code; it exists to provide additional
+ * documentation for doxygen as well as to document hooks in the standard
+ * Drupal manner.
+ */
+
+/**
+ * Prevent session limitation checks at page load.
+ *
+ * Session limit module checks for active sessions during hook_init. If
+ * a particular path or page load or context may mean that session
+ * checks should not occur.
+ *
+ * @return bool
+ *   TRUE if the current page request should bypass session limitation
+ *   restrictions.
+ */
+function hook_session_limit_bypass() {
+  if ((arg(0) == 'session' && arg(1) == 'limit') || arg(0) == 'logout') {
+    return TRUE;
+  }
+}
+
+/**
+ * Notify other modules that a session imitation event has occured.
+ *
+ * When a session limit is reached, this hook is invoked. There are
+ * two types of event. Collision events happen when a new session
+ * causes an old session to close. Disconnect events happen when
+ * a new session is prevented by an existing session.
+ *
+ * @param string $sid
+ *   The session id of the session which caused the event. In a
+ *   collision, this is not the session which was ended.
+ * @param string $op
+ *   Either 'disconnect' or 'collision'.
+ */
+function hook_session_limit($sid, $op) {
+  global $user;
+  rules_invoke_event('session_limit_' . $op, $user, $sid);
+}
diff --git a/session_limit.module b/session_limit.module
index 6666560..a8c86ce 100644
--- a/session_limit.module
+++ b/session_limit.module
@@ -234,8 +234,9 @@ function session_limit_init() {
   if ($user->uid > 1 && !isset($_SESSION['session_limit'])) {
 
     // Exclude from the redirect.
-    if ((arg(0) == 'session' && arg(1) == 'limit') || arg(0) == 'logout') {
-      return;
+    if (_session_limit_bypass()) {
+      // Bypass the session limitation on this page callback.
+       return;
     }
 
     if (module_exists('masquerade') && variable_get('session_limit_masquerade_ignore', FALSE)) {
@@ -633,3 +634,33 @@ function rules_session_limit($sid, $op) {
   global $user;
   rules_invoke_event('session_limit_' . $op, $user, $sid);
 }
+
+/**
+ * Implements hook_session_limit_bypass().
+ *
+ * @return bool
+ *   TRUE if the page request should bypass session limitation restrictions.
+ */
+function session_limit_session_limit_bypass() {
+  if ((arg(0) == 'session' && arg(1) == 'limit') || arg(0) == 'logout') {
+    return TRUE;
+  }
+}
+
+/**
+ * Execute the session limit bypass hook.
+ *
+ * Allow other modules to prevent session limits in their own requirements.
+ *
+ * @return bool
+ *   TRUE if session limitation should be bypassed.
+ */
+function _session_limit_bypass() {
+  foreach (module_invoke_all('session_limit_bypass') as $bypass) {
+    if (!empty($bypass)) {
+      return TRUE;
+    }
+  }
+
+  return FALSE;
+}
