diff --git a/config/urls.py b/config/urls.py
index fd180cc31f4bf7130b84eeb8cf37014f842f2a4a..34f7aebe9e3c56e7d8e5ea7d2c600f619dd6bc86 100644
--- a/config/urls.py
+++ b/config/urls.py
@@ -42,12 +42,12 @@ urlpatterns = [
     url(r'^search/$', search.views.search, name="mainsearch"),
 
     # API URLs
+    url(r'^apibasic/', include('events.api.urls', app_name="api",
+        namespace="basic")),
     url(r'^apiweb/', include('events.api.urls', app_name="api",
         namespace="shib")),
     url(r'^api/', include('events.api.urls', app_name="api",
         namespace="x509")),
-    url(r'^apibasic/', include('events.api.urls', app_name="api",
-        namespace="basic")),
 
     # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
     # to INSTALLED_APPS to enable admin documentation:
diff --git a/gracedb/events/view_utils.py b/gracedb/events/view_utils.py
index 2d341f3ff419c7ea6b46ef3b25827ce3b30e3264..0ec4b92c4767ca1e97be1e5acac1cb16a0445979 100644
--- a/gracedb/events/view_utils.py
+++ b/gracedb/events/view_utils.py
@@ -8,6 +8,7 @@ from django.utils.safestring import mark_safe
 
 from .models import SingleInspiral, Event, Search, Group
 
+from core.urls import build_absolute_uri
 from core.vfile import VersionedFile
 from .permission_utils import is_external
 from django.db.models import Q
@@ -103,17 +104,25 @@ def reverse(name, *args, **kw):
   
       # This probably only works if you give app_names which are the same
       # and namespaces that are different.
-  
-      if kw.get('request', None) is not None and 'current_app' not in kw:
-          request = kw['request']
+      request = kw.get('request', None)
+      if request is not None and 'current_app' not in kw:
           # For some reason, resolve() does not seem to like the script_prefix.
           # So, remove it.
           prefix = get_script_prefix()
           path = request.path.replace(prefix, '/')
           current_app = resolve(path).namespace
           kw['current_app'] = current_app
-  
-      return rest_framework_reverse(name, *args, **kw)
+
+      # FIXME:
+      # Temporary fix to provide absolute URL even in cases where
+      # request is not available; needed for issuing alerts
+      # Defaults to /api/ since that is the lowest defined
+      # api namespace in config/urls.py
+      url = rest_framework_reverse(name, *args, **kw)
+      if request is None:
+          url = build_absolute_uri(url)
+
+      return url
 
 
 #---------------------------------------------------------------------------------------
@@ -356,25 +365,26 @@ def eventLogToDict(log, request=None):
     uri = None
     taglist_uri = None
     file_uri = None
-    if request:
-        uri = reverse("eventlog-detail",
-                args=[log.event.graceid(), log.N],
-                request=request)
-        taglist_uri = reverse("eventlogtag-list",
-                args=[log.event.graceid(), log.N],
-                request=request)
-        if log.filename:
-            actual_filename = log.filename
-            if log.file_version >= 0:
-                actual_filename += ',%d' % log.file_version
-            # NOTE: the reverse function will return a urlquoted
-            # result, so we don't need urlquote here. Effectively
-            # escaping twice results in wrong urls. 
-            #filename = urlquote(actual_filename)
-            filename = actual_filename
-            file_uri = reverse("files",
-                args=[log.event.graceid(), filename],
-                request=request)
+
+    # Get some links
+    uri = reverse("eventlog-detail",
+            args=[log.event.graceid(), log.N],
+            request=request)
+    taglist_uri = reverse("eventlogtag-list",
+            args=[log.event.graceid(), log.N],
+            request=request)
+    if log.filename:
+        actual_filename = log.filename
+        if log.file_version >= 0:
+            actual_filename += ',%d' % log.file_version
+        # NOTE: the reverse function will return a urlquoted
+        # result, so we don't need urlquote here. Effectively
+        # escaping twice results in wrong urls. 
+        #filename = urlquote(actual_filename)
+        filename = actual_filename
+        file_uri = reverse("files",
+            args=[log.event.graceid(), filename],
+            request=request)
 
     # This is purely for convenience in working with the web interface.
     tag_names = [tag.name for tag in log.tags.all() ];
@@ -457,11 +467,9 @@ def embbEventLogToDict(eel, request=None):
 
 # EMObservation serializer.
 def emObservationToDict(emo, request=None):
-      uri = None
-      if request:
-          uri = reverse("emobservation-detail",
-                  args=[emo.event.graceid(), emo.N],
-                  request=request)
+      uri = reverse("emobservation-detail",
+          args=[emo.event.graceid(), emo.N],
+          request=request)
       
       return {
                   "N"               : emo.N,
@@ -505,11 +513,9 @@ def emFootprintToDict(emf, request=None):
 # XXX Eventually hope to remove this
 # EMObservation serializer for the skymap Viewer
 def skymapViewerEMObservationToDict(emo, request=None):
-    uri = None
-    if request:
-        uri = reverse("emobservation-detail",
-                args=[emo.event.graceid(), emo.N],
-                request=request)
+    uri = reverse("emobservation-detail",
+        args=[emo.event.graceid(), emo.N],
+        request=request)
 
     # Keys we want:
     # comment - empty
@@ -568,15 +574,12 @@ def voeventToDict(voevent, request=None):
     #filename = urlquote('%s,%d' % (voevent.filename, voevent.file_version))
     filename = '%s,%d' % (voevent.filename, voevent.file_version)
 
-    uri = None
-    file_uri = None
-    if request:
-        uri = reverse("voevent-detail",
-                args=[voevent.event.graceid(), voevent.N],
-                request=request)
-        file_uri = reverse("files",
-            args=[voevent.event.graceid(), filename],
-            request=request)
+    uri = reverse("voevent-detail",
+        args=[voevent.event.graceid(), voevent.N],
+        request=request)
+    file_uri = reverse("files",
+        args=[voevent.event.graceid(), filename],
+        request=request)
 
     issuer = voevent.issuer.username
     links = {