/rest/api/3/search/jql isn't returning results. I know my jql should do

My API calls have started failing, as I’m apparently using a discontinued API. I’m trying to update my calls to use the suggested API endpoint: /rest/api/3/search/jql

My calls are returning no results, even though the same jql on the filters UI returns results:

Sprint = ${sprint.id} AND statusCategory=Done AND resolutionDate <= “${sprintEnd}”

The sprint Id is correct, as are the status category and resolution dates (e.g. Sprint = 986 AND statusCategory=Done AND resolutionDate <= “2025-08-18 09:18” returns results within the UI, but not the API.

I’m authenticated with my own user and token and I’m not getting an error. Response code is 200 and responseText is “OK”, but I’m getting:

{ issues: [ ], isLast: true }

How are people working with these new API endpoints. Have others seem similar issues?

Hello @AndyRouse

I switched over to the newer Search for issues using JQL enhanced search endpoint (the GET version, not the POST version) months ago and it’s been working perfectly for me, and the results for any particular JQL query are identical to the older endpoint and the UI.

I suggest you look closer at exactly how you are sending the authentication to that endpoint and the format / structure of the request itself (how you’re declaring the parameter values in the path or the body etc), as you may just have a simple typo somewhere.

Also, I recommend you add more context to your question, such as HOW you are making the request (using what language / tool / library / framework etc) and what testing you did making the same request + authentication with your API test tool.

Thanks for your response, @sunnyape - Apologies, I know I should have provided more info. Sometimes I fall afoul of the “too much detail can distract” worry.

I’m doing the call from within a node.js script using axios. My call is as follows:

const response = await axios.get(`${this.baseUrl}/rest/api/3/search/jql`,
        {params: { jql, maxResults: 100  } }, 
        { auth: this.auth }
      );

Where auth is:

this.auth = {
      username: '{{My username}}',
      password: '{{email:{API Token} - Converted into base 64 using this technique https://developer.atlassian.com/cloud/jira/platform/basic-auth-for-rest-apis/#supply-basic-auth-headers}}',
    };

This was auth approach was working without issue on the previous endpoint and I’m not getting any auth errors with this current approach.

Axios URL encodes the params, so I can see in the response that the request is being sent as:

/rest/api/3/search/jql?jql=Sprint%3D986+AND+statusCategory%3DDone+AND+resolutionDate%3C%3D%222025-08-18+09:18%22&maxResults=100 

I was getting errors previously (with auth and responses) with other approaches as I was converting over, so I think I can say this approach appears to be authenticating and sending JQL that the end-point can parse.

The request looks valid and if the same auth method and token work with the prior endpoint, then it should work the with the new endpoint (there is no ‘conversion’ required for the authentication).

As first I thought it was an invalid jql parameter string, as JQL doesn’t use plus signs as delimiters, it uses spaces, but the endpoint seems to be accepting and parsing that (well, the version of the endpoint in my region anyhow).

Do you get the same result if you don’t use Axios to encode the jql parameter string and declare it directly in the URL path as either:

jql=Sprint=986 AND statusCategory=Done AND resolutionDate<=“2025-08-18 09:18”

or

jql=Sprint%3D986%20AND%20statusCategory%3DDone%20AND%20resolutionDate%3C%3D%222025-08-18%2009:18%22

Do you get all the issues if you do a really simple JQL search like:

jql=issueType=story

If you use an API test tool like Postman, do you get identical results to what you’re seeing via your Node.js method?

I am also having same issue. Was working with the old API endpoint before but trying to switch to the new one.

Getting 200 response back with empty response {}. Is the new api end point broken?

Tried a new API token that is permanently "Last Accessed: Never accessed” despite getting 200 responses back ( empty response ). Tried the most simple JQL query and barebones parameters with no luck.

DEBUG: Starting search with JQL: project = REDACTED
DEBUG: Processing page 1 with token: ‘’
DEBUG: API Endpoint: rest/api/3/search/jql
DEBUG: Request body:
{
“expand”: “names,changelog”,
“fields”: [
“id”
],
“fieldsByKeys”: true,
“jql”: “project = REDACTED”,
“maxResults”: 100
}
DEBUG: HTTP Status Code: 200
DEBUG: Response body:
{
“isLast”: true
}
DEBUG: Response issues count: 0
DEBUG: Response nextPageToken: ‘’
DEBUG: Page 1 returned 0 issues
DEBUG: No more pages (nextPageToken is empty)
DEBUG: Total issues collected: 0 across 1 pages

postman worked. wondering if something changed with the auth

@KevinLiang - I’m seeing the same behaviour - Postman returns results, but my node.js code doesn’t. Interesting point about the token. I’ve noticed the same. My fuller JS makes another call before hand (which accesses the token and can be seen to have done so), but if I call just the 2nd endpoint with the same auth as the first, the token does not appear to have been used.

I will look at the documentation to understand if the auth needs to be different, but it’s confusing as I think I’m doing the same auth with Postman (which is working).

@sunnyape - Thank you for your help. I eventually got it working, but I had to avoid using the “params” element of axios and just write in my jql.

It appears that axios does something in the parameters that the endpoint doesn’t like (though it’s unclear what)

The following worked for me:

const response = await axios.get(`${this.baseUrl}/rest/api/3/search/jql?jql=Sprint=${sprint.id} AND statusCategory=Done AND resolutionDate <="${nextSprintStart}"&maxResult=100&fields=["id"]`,
        { auth: this.auth }
      );

I also didn’t need to change anything with the auth, @KevinLiang - So consider if there’s something in how your params are being submitted?

1 Like

I’m having the same problems you guys are having. I’m using python requests (with it’s version of parameters so that could be a problem). But then I switched to postman and it STILL doesn’t work!

My url is /rest/api/3/search/jql?jql=project=REDACTED and I get a 200 OK. I know there are 80 issues in the project. I’ve tried various searches such as “issuetype=STORY” and “summary~cert” (with and without URLencoding — we don’t need that anymore!? Wow) and I never get any issues.
I’m not easily stumped but I’m stumped on this one. If it doesn’t work with a simple jql in postman, what do you do?
Any suggestions about what I might try here?

Hello @DaveMenconi

Joining onto a thread that’s already closed and marked as solved doesn’t add any value to the original post, neither does essentially saying “Me too”.

Start a new thread, explain exactly how you are performing the request, provide full code samples, and explain all the testing you’ve done to confirm that your auth method is working correctly and you’re not just making the mistake of confusing the default 200 OK response and empty result set with the expected behaviour of making an unauthenticated / faulty authenticated request to that endpoint… irrespective of what is or isn’t in your JQL statement.

had same issue and im using python request. I was get response.status of 200 thinking that authentication is working but I checked if the api token on Atlassian account I configured was working. I then noticed that tokens now have an expiration date associated. I recreated a new token with a 6month expiration and api calls are now showing correctly and response I’m getting is {“issues”:[{“id”:“223344”}],“isLast”:true}