Caleb Palmquist
Caleb Palmquist

Reputation: 458

Retrieving labels from multiple JIRA Subtasks via JIRA API

I am creating a reporting dashboard with the intent of getting multiple tickets/issues for a project. As most of you probably know, a JIRA issue can have subtasks. These subtasks can have labels.

I want to retrive all labels for every subtask.

I already have the project API request implemented which returns the parent ticket ids along with the issue/ticket number of all subtasks. The problem is the data returned from this request does not include the labels for the subtasks themselves.

I can loop over each subtask number and make an additional API request for each one to get the labels, however this would result in a large number of requests.

Looking through JIRA's API I cannot find a better way of doing this. Google seems to return a lot of results about plugins and version differences with Cloud vs. Server but I have not found a better solution.

Their API makes reference to an expand option but I have yet to figure out a way to make that work for subtask labels (I might be missing something obvious).

If anyone has experience with a similar situation I would appreciate hearing any advice you could offer. Thanks!

What I have currently:

Project API Request:

https://ourcompanyhere.atlassian.net/rest/api/2/search

with an additional parameter added for the JQL string of:

project=PROJECTNAME AND fixversion=version

This returns all the tickets in the project with subtasks but not the subtask labels.

I can loop over the returned data from the above request and make an additional request for each:

https://ourcompanyhere.atlassian.net/rest/api/2/issue/ticketNumberHere

JSON Response

Here is the partial JSON response back (full response is huge and I've removed key information) however this is the complete information for a ticket, with a subtask which has labels. As you can see the labels section of the subtask is completely missing.

ErrorDetail=,
   Mimetype=application/json,
   Statuscode=200 OK,
   Filecontent=   {
      "expand":"schema,names",
      "startAt":0,
      "maxResults":50,
      "total":3,
      "issues":[
         {
            "expand":"operations,versionedRepresentations,editmeta,changelog,renderedFields",
            "id":"24209",
            "self":"https://[instance].atlassian.net/rest/api/latest/issue/24209",
            "key":"DEV-3089",
            "fields":{
               "issuetype":{
                  "self":"https://[instance].atlassian.net/rest/api/2/issuetype/10005",
                  "id":"10005",
                  "description":"A new feature of the product, which has yet to be developed.",
                  "iconUrl":"https://[instance].atlassian.net/secure/viewavatar?size=xsmall&avatarId=10311&avatarType=issuetype",
                  "name":"New Feature",
                  "subtask":false,
                  "avatarId":10311
               },
               "project":{
                  "self":"https://[instance].atlassian.net/rest/api/2/project/10000",
                  "id":"10000",
                  "key":"DEV",
                  "name":"Development Queue",
                  "avatarUrls":{                  
                  }
               },
               "customfield_11000":null,
               "fixVersions":[
                  {
                     "self":"https://[instance].atlassian.net/rest/api/2/version/14600",
                     "id":"14600",
                     "description":"",
                     "name":"",
                     "archived":false,
                     "released":true,
                     "releaseDate":"2017-09-15"
                  }
               ],
               "resolution":{
                  "self":"https://[instance].atlassian.net/rest/api/2/resolution/10000",
                  "id":"10000",
                  "description":"Work has been completed on this issue.",
                  "name":"Done"
               },
               "customfield_10500":"",
               "customfield_10700":null,
               "customfield_10900":null,
               "resolutiondate":"2017-09-15T09:19:37.000-0400",
               "workratio":-1,
               "watches":{
                  "self":"https://[instance].atlassian.net/rest/api/2/issue/DEV-3089/watchers",
                  "watchCount":2,
                  "isWatching":true
               },
               "lastViewed":null,
               "created":"2017-05-02T10:15:08.000-0400",
               "customfield_10022":null,
               "customfield_10100":null,
               "priority":{
                  "self":"https://[instance].atlassian.net/rest/api/2/priority/3",
                  "iconUrl":"https://[instance].atlassian.net/images/icons/priorities/medium.svg",
                  "name":"Medium",
                  "id":"3"
               },
               "customfield_10300":null,
               "labels":[
                  "[label1]",
                  "[label2]",
                  "[label3]",
                  "[label4]",
                  "[label5]",
                  "[label6]"
               ],
               "customfield_10016":null,
               "customfield_10017":null,
               "versions":[

               ],
               "issuelinks":[

               ],
               "assignee":{
                  "self":"https://[instance].atlassian.net/rest/api/2/user?username=",
                  "name":"[name]",
                  "key":"[name]",
                  "accountId":"[account]",
                  "emailAddress":"[email]",
                  "avatarUrls":{
                  },
                  "displayName":"[name]",
                  "active":true,
                  "timeZone":"America/New_York"
               },
               "updated":"2017-09-15T09:19:36.000-0400",
               "status":{
                  "self":"https://[instance].atlassian.net/rest/api/2/status/6",
                  "description":"The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.",
                  "iconUrl":"https://[instance].atlassian.net/images/icons/statuses/closed.png",
                  "name":"Closed",
                  "id":"6",
                  "statusCategory":{
                     "self":"https://[instance].atlassian.net/rest/api/2/statuscategory/3",
                     "id":3,
                     "key":"done",
                     "colorName":"green",
                     "name":"Done"
                  }
               },
               "components":[

               ],
               "description":"[description]",
               "customfield_10010":null,
               "customfield_10011":null,
               "customfield_11100":null,
               "customfield_10012":null,
               "customfield_10013":null,
               "customfield_10015":"",
               "customfield_10005":null,
               "customfield_10006":null,
               "customfield_10600":null,
               "customfield_10007":null,
               "customfield_10008":null,
               "customfield_10800":null,
               "customfield_10009":null,
               "summary":"[summary]",
               "creator":{
                  "self":"https://[instance].atlassian.net/rest/api/2/user?username=",
                  "name":"",
                  "key":"",
                  "accountId":"",
                  "emailAddress":"",
                  "avatarUrls":{
                  },
                  "displayName":"",
                  "active":true,
                  "timeZone":"America/New_York"
               },
               "subtasks":[
                  {
                     "id":"30213",
                     "key":"DEV-4118",
                     "self":"https://[instance].atlassian.net/rest/api/2/issue/30213",
                     "fields":{
                        "summary":"",
                        "status":{
                           "self":"https://[instance].atlassian.net/rest/api/2/status/6",
                           "description":"The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.",
                           "iconUrl":"https://[instance].atlassian.net/images/icons/statuses/closed.png",
                           "name":"Closed",
                           "id":"6",
                           "statusCategory":{
                              "self":"https://[instance].atlassian.net/rest/api/2/statuscategory/3",
                              "id":3,
                              "key":"done",
                              "colorName":"green",
                              "name":"Done"
                           }
                        },
                        "priority":{
                           "self":"https://[instance].atlassian.net/rest/api/2/priority/3",
                           "iconUrl":"https://[instance].atlassian.net/images/icons/priorities/medium.svg",
                           "name":"Medium",
                           "id":"3"
                        },
                        "issuetype":{
                           "self":"https://[instance].atlassian.net/rest/api/2/issuetype/10009",
                           "id":"10009",
                           "description":"",
                           "iconUrl":"https://[instance].atlassian.net/secure/viewavatar?size=xsmall&avatarId=10303&avatarType=issuetype",
                           "name":"Testing Issue",
                           "subtask":true,
                           "avatarId":10303
                        }
                     }
                  }
               "reporter":{
                  "self":"https://[instance].atlassian.net/rest/api/2/user?username=",
                  "name":"",
                  "key":"",
                  "accountId":"",
                  "emailAddress":"",
                  "avatarUrls":{

                  },
                  "displayName":"",
                  "active":true,
                  "timeZone":"America/New_York"
               },
               "customfield_10000":"2017-09-01T12:35:54.706-0400",
               "customfield_10001":null,
               "customfield_10200":null,
               "customfield_10400":null,
               "customfield_10004":null,
               "environment":null,
               "duedate":null,
               "votes":{
                  "self":"https://[instance].atlassian.net/rest/api/2/issue/DEV-3089/votes",
                  "votes":0,
                  "hasVoted":false
               }
            }
         }
      ]
   }

Upvotes: 1

Views: 1571

Answers (3)

David Ciran
David Ciran

Reputation: 21

For more efficient navigation try this simple add-on Subtasks Navigation for Jira | Atlassian Marketplace (https://marketplace.atlassian.com/apps/1215057/subtasks-navigation-for-jira?tab=overview&hosting=cloud). In our company it helped us to streamline our workflow and achieve greater productivity. Hope this might help you as well.

Upvotes: 2

Caleb Palmquist
Caleb Palmquist

Reputation: 458

After doing some further research I found a better way to do this. I'm still not getting the subtask labels back but instead of looping over each subtask and sending a separate request for each, you can do one API call using JQL like this:

https://[instance].atlassian.net/rest/api/latest/search?jql=project=[project] AND KEY IN ([comma separated list of tickets])&fields=labels'

The

&fields=labels

part drastically reduces the amount of information returned. So now I can just do a total of two calls and get everything I need. :)

Wanted to post this in case anyone runs into a similar situation.

Upvotes: 1

rorschach
rorschach

Reputation: 2947

Inspect the response for the /search endpoint again. On a completely empty JIRA Cloud instance I created a Project, one Issue and added a Sub-task for it. Calling the /search endpoint returns a list with two Issues (so, the Issue itself and its Sub-task) and for both there's a field called labels with an array of all the Labels attached to it.

The following is an abbreviated response with all unrelated data removed.

{
  "startAt": 0,
  "maxResults": 50,
  "total": 2,
  "issues": [
    {
      "key": "TEST-1",
      "fields": {
        "labels": []
      }
    },
    {
      "key": "TEST-2",
      "fields": {
        "parent": {
          "key": "TEST-1"
        },
        "labels": [
          "VOILA"
        ]
      }
    }
  ]
}

EDIT

After looking at the response then yes, the array in subtasks is really simple and cannot be separately expanded. You need to do the search, then parse out all the subtasks that you're interested in and either do

  • a separate /issue/[key] request for each one
  • a /search for those specific keys

Upvotes: 1

Related Questions