diff --git a/gracedb/api.py b/gracedb/api.py
new file mode 100644
index 0000000000000000000000000000000000000000..286ef63177de4d689cf27c5ebb1b80d2760ea80e
--- /dev/null
+++ b/gracedb/api.py
@@ -0,0 +1,26 @@
+
+from django.http import HttpResponse, HttpResponseNotFound
+
+from gracedb.models import Event
+
+import os
+
+def download(request, graceid, filename=None):
+    #response = HttpResponse(buildVOEvent(event), content_type="application/xml")
+    if not filename:
+        response = HttpResponseNotFound("Not Implemented.")
+        response.status_code = 404
+    try:
+        event = Event.getByGraceid(graceid)
+        filepath = os.path.join(event.datadir(), filename)
+        if not os.path.exists(filepath):
+            response = HttpResponseNotFound("File does not exist")
+        elif not os.access(filepath, os.R_OK):
+            response = HttpResponseNotFound("File not readable")
+        else:
+            response = HttpResponse(open(filepath, "r"), content_type="application/octet-stream")
+            response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(filename)
+    except Event.DoesNotExist:
+        response = HttpResponseNotFound("Event does not exist")
+
+    return response
diff --git a/gracedb/models.py b/gracedb/models.py
index 49f793f99e3a716d1dbede2d97937ac76ee09231..4a2114b165dc803b9a46475e7bce5e673d268c5b 100644
--- a/gracedb/models.py
+++ b/gracedb/models.py
@@ -95,6 +95,10 @@ class Event(models.Model):
         #return "pcdev1.phys.uwm.edu:/archive/gracedb/data/%s" % self.graceid()
         return "file://pcdev1.phys.uwm.edu/archive/gracedb/data/%s" % self.graceid()
 
+    def datadir(self):
+        # Move to this.  Not the (more) ad hoc crap that's floating around.
+        return os.path.join(settings.GRACEDB_DATA_DIR, self.graceid(), "private")
+
     def ligoApproved(self):
         return self.approval_set.filter(approvingCollaboration='L').count()
 
diff --git a/gracedb/urls_rest.py b/gracedb/urls_rest.py
new file mode 100644
index 0000000000000000000000000000000000000000..a067ec3c18b2911e2a69a6a4e27bbf9773181253
--- /dev/null
+++ b/gracedb/urls_rest.py
@@ -0,0 +1,6 @@
+
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('gracedb.api',
+    url (r'^event/(?P<graceid>[\w\d]+)/files/(?P<filename>.+)?$', 'download', name="download"),
+)
diff --git a/urls.py b/urls.py
index 3f5836eba315011dc1e84b7a39d6d56b0d7c1c34..6684532c10dab2594ce0911542463c2ce27032bc 100644
--- a/urls.py
+++ b/urls.py
@@ -16,6 +16,7 @@ urlpatterns = patterns('',
 
     url (r'^$', 'gracedb.views.index', name="home"),
     (r'^events/', include('gracedb.urls')),
+    (r'^api/', include('gracedb.urls_rest')),
     (r'^options/', include('userprofile.urls')),
     (r'^cli/create', 'gracedb.views.create'),
     (r'^cli/ping', 'gracedb.views.ping'),