diff --git a/api/custom/version.go b/api/custom/version.go
new file mode 100644
index 0000000000000000000000000000000000000000..5715f78ea95f019c78da95200c12f5607a7ec3de
--- /dev/null
+++ b/api/custom/version.go
@@ -0,0 +1,18 @@
+package custom
+
+import (
+	"net/http"
+
+	"github.com/turt2live/matrix-media-repo/api"
+	"github.com/turt2live/matrix-media-repo/common/rcontext"
+	"github.com/turt2live/matrix-media-repo/common/version"
+)
+
+func GetVersion(r *http.Request, rctx rcontext.RequestContext, user api.UserInfo) interface{} {
+	return &api.DoNotCacheResponse{
+		Payload: map[string]string{
+			"Version":   version.Version,
+			"GitCommit": version.GitCommit,
+		},
+	}
+}
diff --git a/api/webserver/webserver.go b/api/webserver/webserver.go
index b54cb2a8b18ff40fa5e1b1b753d53140e2a50322..a657c4e37972c82195e5b0a4e10ad3befa8849de 100644
--- a/api/webserver/webserver.go
+++ b/api/webserver/webserver.go
@@ -71,10 +71,14 @@ func Init() *sync.WaitGroup {
 	startImportHandler := handler{api.RepoAdminRoute(custom.StartImport), "start_import", counter, false}
 	appendToImportHandler := handler{api.RepoAdminRoute(custom.AppendToImport), "append_to_import", counter, false}
 	stopImportHandler := handler{api.RepoAdminRoute(custom.StopImport), "stop_import", counter, false}
+	versionHandler := handler{api.AccessTokenOptionalRoute(custom.GetVersion), "get_version", counter, false}
 
 	routes := make(map[string]route)
 	versions := []string{"r0", "v1", "unstable"} // r0 is typically clients and v1 is typically servers. v1 is deprecated.
 
+	// Things that don't need a version
+	routes["/_matrix/media/version"] = route{"GET", versionHandler}
+
 	for _, version := range versions {
 		// Standard routes we have to handle
 		routes["/_matrix/media/"+version+"/upload"] = route{"POST", uploadHandler}