diff --git a/models/issue.go b/models/issue.go
index ca01ffe2fac50..c740d8fec46dc 100644
--- a/models/issue.go
+++ b/models/issue.go
@@ -7,6 +7,7 @@ package models
 import (
 	"errors"
 	"fmt"
+	"path"
 	"sort"
 	"strings"
 	"time"
@@ -200,6 +201,11 @@ func (issue *Issue) GetIsRead(userID int64) error {
 	return nil
 }
 
+// APIURL returns the absolute APIURL to this issue.
+func (issue *Issue) APIURL() string {
+	return issue.Repo.APIURL() + "/" + path.Join("issues", fmt.Sprint(issue.ID))
+}
+
 // HTMLURL returns the absolute URL to this issue.
 func (issue *Issue) HTMLURL() string {
 	var path string
@@ -246,6 +252,7 @@ func (issue *Issue) APIFormat() *api.Issue {
 
 	apiIssue := &api.Issue{
 		ID:       issue.ID,
+		URL:      issue.APIURL(),
 		Index:    issue.Index,
 		Poster:   issue.Poster.APIFormat(),
 		Title:    issue.Title,
diff --git a/models/issue_test.go b/models/issue_test.go
index 646a1a5a9ad58..a6da80917e106 100644
--- a/models/issue_test.go
+++ b/models/issue_test.go
@@ -33,3 +33,12 @@ func TestIssue_ReplaceLabels(t *testing.T) {
 	testSuccess(1, []int64{1, 2})
 	testSuccess(1, []int64{})
 }
+
+func TestIssueAPIURL(t *testing.T) {
+	assert.NoError(t, PrepareTestDatabase())
+	issue := AssertExistsAndLoadBean(t, &Issue{ID: 1}).(*Issue)
+	err := issue.LoadAttributes()
+
+	assert.NoError(t, err)
+	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/issues/1", issue.APIURL())
+}
diff --git a/models/repo.go b/models/repo.go
index d72d3d1da295c..8361780bfda83 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -264,6 +264,11 @@ func (repo *Repository) HTMLURL() string {
 	return setting.AppURL + repo.FullName()
 }
 
+// APIURL returns the repository API URL
+func (repo *Repository) APIURL() string {
+	return setting.AppURL + path.Join("api/v1/repos", repo.FullName())
+}
+
 // APIFormat converts a Repository to api.Repository
 func (repo *Repository) APIFormat(mode AccessMode) *api.Repository {
 	cloneLink := repo.CloneLink()
diff --git a/models/repo_test.go b/models/repo_test.go
index 7c0e94a5aed59..a538d44c0ea52 100644
--- a/models/repo_test.go
+++ b/models/repo_test.go
@@ -125,3 +125,10 @@ func TestForkRepository(t *testing.T) {
 	assert.Error(t, err)
 	assert.True(t, IsErrRepoAlreadyExist(err))
 }
+
+func TestRepoAPIURL(t *testing.T) {
+	assert.NoError(t, PrepareTestDatabase())
+	repo := AssertExistsAndLoadBean(t, &Repository{ID: 10}).(*Repository)
+
+	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user12/repo10", repo.APIURL())
+}