How to get comments from Jira using Python

Jira, a popular project management and ticketing platform, presents users with robust APIs, which provide the ability to engage with the platform in a programmatic manner. 

This opens up the potential for automating various tasks—and pulling comments from tickets might be at the top of your list.

Pulling comments and adding them to other applications can help your teams stay on top of customer feedback, track issues, and monitor progress in real-time, leading to faster and more effective responses. 

To help you get comments from Jira, we’ll walk through how you can set up authentication for the Jira API and make get requests in Python.

Authenticating with Jira

Before you can pull comments from the Jira API, you'll need to authenticate your requests. 

To do this, you’ll need to include an `Authorization` header in the format `Authorization: Basic {Email Address}:{API-KEY}` in your request. 

Using this format, `{Email Address}` should be replaced with the email address you use for your Jira account, and `{API-KEY}` should be replaced with your Jira API key. Both of these values should be encoded in Base64.

Related: What you need to do to get attachments from the Jira API

Pulling comments from Jira

To pull comments from the Jira API via Python, you’ll need to make two separate API calls. One to fetch the ticket ids and then another to fetch the comments related to those tickets. 

The following script first fetches the ticket ids by sending a GET request to the Jira search API. It then iterates over the returned ticket ids to fetch the comments related to each ticket by sending a GET request to the Jira issue comment API. The comments are then printed to the console.

```python import requests import base64 import json # Authentication email = 'YOUR_EMAIL' api_key = 'YOUR_API_KEY' domain = 'YOUR_DOMAIN' auth_str = '{}:{}'.format(email, api_key) base64_auth_str = base64.b64encode(auth_str.encode()).decode() headers = { 'Authorization': 'Basic {}'.format(base64_auth_str), 'Accept': 'application/json' } # Fetch tickets url = 'https://{}.atlassian.net/rest/api/3/search'.format(domain) query = {'fields': 'comment', 'maxResults': 50, 'startAt': 0} response = requests.get(url, headers=headers, params=query) tickets = json.loads(response.text)['issues'] # Fetch comments for ticket in tickets: ticket_id = ticket['id'] url = 'https://{}.atlassian.net/rest/api/3/issue/{}/comment'.format(domain, ticket_id) query = {'expand': 'renderedBody', 'maxResults': 50, 'startAt': 0} response = requests.get(url, headers=headers, params=query) comments = json.loads(response.text)['comments'] for comment in comments: print(comment['body']) ```

Replace `'YOUR_EMAIL'`, `'YOUR_API_KEY'`, and `'YOUR_DOMAIN'` with your actual email, API key, and domain associated with your Jira account. The `maxResults` query parameter is set to 50 as per the instructions, and `startAt` is initially set to 0 and should be incremented by 50 for each subsequent request to handle pagination.

Here’s an example of an individual item returned by this API endpoint:

{
    "self": "https://jira.example.com/rest/api/2/issue/10001/comment/1",
    "id": "1",
    "author": {
        "self": "https://jira.example.com/rest/api/2/user?username=jsmith",
        "accountId": "5b109f2e9729b51fdf808842",
        "emailAddress": "jsmith@example.com",
        "avatarUrls": {
            "48x48": "https://avatar.example.com/user/avatar/48",
            "24x24": "https://avatar.example.com/user/avatar/24",
            "16x16": "https://avatar.example.com/user/avatar/16",
            "32x32": "https://avatar.example.com/user/avatar/32"
        },
        "displayName": "John Smith",
        "active": true,
        "timeZone": "America/Los_Angeles",
        "accountType": "atlassian"
    },
    "body": {
        "version": 1,
        "type": "doc",
        "content": [
            {
                "type": "paragraph",
                "content": [
                    {
                        "type": "text",
                        "text": "This is a comment on the issue"
                    }
                ]
            }
        ]
    },
    "renderedBody": "

This is a comment on the issue

", "updateAuthor": { "self": "https://jira.example.com/rest/api/2/user?username=jsmith", "accountId": "5b109f2e9729b51fdf808842", "emailAddress": "jsmith@example.com", "avatarUrls": { "48x48": "https://avatar.example.com/user/avatar/48", "24x24": "https://avatar.example.com/user/avatar/24", "16x16": "https://avatar.example.com/user/avatar/16", "32x32": "https://avatar.example.com/user/avatar/32" }, "displayName": "John Smith", "active": true, "timeZone": "America/Los_Angeles", "accountType": "atlassian" }, "created": "2019-05-15T14:00:00.000+0000", "updated": "2019-05-15T14:00:00.000+0000", "jsdPublic": true }

Related: The steps for fetching projects from the Jira API

Best practices for testing your Jira integration

Even when everything seems perfect with your Jira integration in the development stage, unexpected challenges can emerge when it's deployed in a production environment. These challenges could vary widely, from connectivity issues to permission conflicts to unexpected data formats.

To proactively identify and address these potential pitfalls, consider implementing these strategies:

  • Set up a testing environment. Creating a dedicated testing environment is crucial to mimic real-world scenarios without affecting your production system. You can set this up by duplicating your production environment, ensuring a realistic and controlled testing platform.
  • Perform a variety of test cases: It’s essential to cover all bases by testing various scenarios, including edge cases and typical user behaviors. For instance, test how the integration handles large data sets or reacts to invalid input.
  • Leverage API testing solutions: Integrating robust API testing tools is key to ensuring smooth operation. Explore options like Postman or SoapUI, which are popular for their comprehensive testing capabilities.
  • Automate the tests: Automation not only saves time but also ensures consistency in testing. Utilize scripting or tools like Selenium to automate your test cases, which allows for frequent and efficient testing cycles.
  • Test for security and compliance: Ensuring that your integration adheres to security standards and compliance regulations is non-negotiable. Regularly test for vulnerabilities and compliance to safeguard your data and operations.

Final thoughts

Your clients might utilize ticketing systems that extend beyond Jira.

You have the flexibility to integrate with numerous other ticketing platforms, such as Asana, Zendesk, ClickUp, ServiceNow, by building to Merge’s Ticketing Unified API

Learn more about Merge’s Ticketing Unified API, the platform’s management and maintenance capabilities, and much more by scheduling a demo with our team of integration specialists.

But Merge isn’t just a Unified 
API product. Merge is an integration platform to also manage customer integrations.  gradient text
“It was the same process, go talk to their team, figure out their API. It was taking a lot of time. And then before we knew it, there was a laundry list of HR integrations being requested for our prospects and customers.” gradient text
“It was the same process, go talk to their team, figure out their API. It was taking a lot of time. And then before we knew it, there was a laundry list of HR integrations being requested for our prospects and customers.” gradient text
“It was the same process, go talk to their team, figure out their API. It was taking a lot of time. And then before we knew it, there was a laundry list of HR integrations being requested for our prospects and customers.” gradient text

Heading 1

Heading 2

Heading 3

Heading 4

Heading 5
Heading 6
“It was the same process, go talk to their team, figure out their API. It was taking a lot of time. And then before we knew it, there was a laundry list of HR integrations being requested for our prospects and customers.”

Daniel Marashlian - Co-Founder & CTO

This is a link inside of a rich text

  • List item
  • List item
  • List item
  1. List item
  2. List item
  3. List item
Caption goes here
This is some text inside of a div block.
Table of contents
Add hundreds of integrations to your product through Merge’s Unified API
Get a demo

How to get comments from Jira using Python

Jon Gitlin
Senior Content Marketing Manager
@Merge

Jira, a popular project management and ticketing platform, presents users with robust APIs, which provide the ability to engage with the platform in a programmatic manner. 

This opens up the potential for automating various tasks—and pulling comments from tickets might be at the top of your list.

Pulling comments and adding them to other applications can help your teams stay on top of customer feedback, track issues, and monitor progress in real-time, leading to faster and more effective responses. 

To help you get comments from Jira, we’ll walk through how you can set up authentication for the Jira API and make get requests in Python.

Authenticating with Jira

Before you can pull comments from the Jira API, you'll need to authenticate your requests. 

To do this, you’ll need to include an `Authorization` header in the format `Authorization: Basic {Email Address}:{API-KEY}` in your request. 

Using this format, `{Email Address}` should be replaced with the email address you use for your Jira account, and `{API-KEY}` should be replaced with your Jira API key. Both of these values should be encoded in Base64.

Related: What you need to do to get attachments from the Jira API

Pulling comments from Jira

To pull comments from the Jira API via Python, you’ll need to make two separate API calls. One to fetch the ticket ids and then another to fetch the comments related to those tickets. 

The following script first fetches the ticket ids by sending a GET request to the Jira search API. It then iterates over the returned ticket ids to fetch the comments related to each ticket by sending a GET request to the Jira issue comment API. The comments are then printed to the console.

```python import requests import base64 import json # Authentication email = 'YOUR_EMAIL' api_key = 'YOUR_API_KEY' domain = 'YOUR_DOMAIN' auth_str = '{}:{}'.format(email, api_key) base64_auth_str = base64.b64encode(auth_str.encode()).decode() headers = { 'Authorization': 'Basic {}'.format(base64_auth_str), 'Accept': 'application/json' } # Fetch tickets url = 'https://{}.atlassian.net/rest/api/3/search'.format(domain) query = {'fields': 'comment', 'maxResults': 50, 'startAt': 0} response = requests.get(url, headers=headers, params=query) tickets = json.loads(response.text)['issues'] # Fetch comments for ticket in tickets: ticket_id = ticket['id'] url = 'https://{}.atlassian.net/rest/api/3/issue/{}/comment'.format(domain, ticket_id) query = {'expand': 'renderedBody', 'maxResults': 50, 'startAt': 0} response = requests.get(url, headers=headers, params=query) comments = json.loads(response.text)['comments'] for comment in comments: print(comment['body']) ```

Replace `'YOUR_EMAIL'`, `'YOUR_API_KEY'`, and `'YOUR_DOMAIN'` with your actual email, API key, and domain associated with your Jira account. The `maxResults` query parameter is set to 50 as per the instructions, and `startAt` is initially set to 0 and should be incremented by 50 for each subsequent request to handle pagination.

Here’s an example of an individual item returned by this API endpoint:

{
    "self": "https://jira.example.com/rest/api/2/issue/10001/comment/1",
    "id": "1",
    "author": {
        "self": "https://jira.example.com/rest/api/2/user?username=jsmith",
        "accountId": "5b109f2e9729b51fdf808842",
        "emailAddress": "jsmith@example.com",
        "avatarUrls": {
            "48x48": "https://avatar.example.com/user/avatar/48",
            "24x24": "https://avatar.example.com/user/avatar/24",
            "16x16": "https://avatar.example.com/user/avatar/16",
            "32x32": "https://avatar.example.com/user/avatar/32"
        },
        "displayName": "John Smith",
        "active": true,
        "timeZone": "America/Los_Angeles",
        "accountType": "atlassian"
    },
    "body": {
        "version": 1,
        "type": "doc",
        "content": [
            {
                "type": "paragraph",
                "content": [
                    {
                        "type": "text",
                        "text": "This is a comment on the issue"
                    }
                ]
            }
        ]
    },
    "renderedBody": "

This is a comment on the issue

", "updateAuthor": { "self": "https://jira.example.com/rest/api/2/user?username=jsmith", "accountId": "5b109f2e9729b51fdf808842", "emailAddress": "jsmith@example.com", "avatarUrls": { "48x48": "https://avatar.example.com/user/avatar/48", "24x24": "https://avatar.example.com/user/avatar/24", "16x16": "https://avatar.example.com/user/avatar/16", "32x32": "https://avatar.example.com/user/avatar/32" }, "displayName": "John Smith", "active": true, "timeZone": "America/Los_Angeles", "accountType": "atlassian" }, "created": "2019-05-15T14:00:00.000+0000", "updated": "2019-05-15T14:00:00.000+0000", "jsdPublic": true }

Related: The steps for fetching projects from the Jira API

Best practices for testing your Jira integration

Even when everything seems perfect with your Jira integration in the development stage, unexpected challenges can emerge when it's deployed in a production environment. These challenges could vary widely, from connectivity issues to permission conflicts to unexpected data formats.

To proactively identify and address these potential pitfalls, consider implementing these strategies:

  • Set up a testing environment. Creating a dedicated testing environment is crucial to mimic real-world scenarios without affecting your production system. You can set this up by duplicating your production environment, ensuring a realistic and controlled testing platform.
  • Perform a variety of test cases: It’s essential to cover all bases by testing various scenarios, including edge cases and typical user behaviors. For instance, test how the integration handles large data sets or reacts to invalid input.
  • Leverage API testing solutions: Integrating robust API testing tools is key to ensuring smooth operation. Explore options like Postman or SoapUI, which are popular for their comprehensive testing capabilities.
  • Automate the tests: Automation not only saves time but also ensures consistency in testing. Utilize scripting or tools like Selenium to automate your test cases, which allows for frequent and efficient testing cycles.
  • Test for security and compliance: Ensuring that your integration adheres to security standards and compliance regulations is non-negotiable. Regularly test for vulnerabilities and compliance to safeguard your data and operations.

Final thoughts

Your clients might utilize ticketing systems that extend beyond Jira.

You have the flexibility to integrate with numerous other ticketing platforms, such as Asana, Zendesk, ClickUp, ServiceNow, by building to Merge’s Ticketing Unified API

Learn more about Merge’s Ticketing Unified API, the platform’s management and maintenance capabilities, and much more by scheduling a demo with our team of integration specialists.

“It was the same process, go talk to their team, figure out their API. It was taking a lot of time. And then before we knew it, there was a laundry list of HR integrations being requested for our prospects and customers.”

Name
Position
Jon Gitlin
Senior Content Marketing Manager
@Merge

Jon Gitlin is the Managing Editor of Merge's blog. He has several years of experience in the integration and automation space; before Merge, he worked at Workato, an integration platform as a service (iPaaS) solution, where he also managed the company's blog. In his free time he loves to watch soccer matches, go on long runs in parks, and explore local restaurants.

Read more

How to GET tasks from the Asana API in Python

Engineering

How to GET folders from the Dropbox API in Python

Engineering

10 critical REST API interview questions for 2025—answered

Engineering

Subscribe to the Merge Blog

Subscribe to the Merge Blog

Subscribe

Make integrations your competitive advantage

Stay in touch to learn how Merge can unlock hundreds of integrations in days, not years

Get a demo

Make integrations your competitive advantage

Stay in touch to learn how Merge can unlock hundreds of integrations in days, not years

Get a demo

Get our best content every week

Our weekly newsletter provides the best practices you need to build high performing product integrations.

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.