Platform
Chatbot Builder Bulk Messaging Team Inbox Mini CRM API & Webhooks AI Integration WhatsApp Flows
Industries
E-commerce & D2C Real Estate Education Healthcare Finance & BFSI Logistics Hospitality Retail
Integrations 📚 Learn 📝 Blog 🗂 Codex Pricing Start Free Trial →
HomeConnect › Connect Jira to WhatsApp
Jira Integration Guide · Support / Helpdesk

Connect Jira to WhatsApp

Let customers check the status of their Jira issues over WhatsApp, or create new issues straight from a WhatsApp conversation. Search by JQL, fetch by issue key, and post structured bug reports or feature requests into any Jira Cloud project.

Published 23 June 2026  ·  8 min read  ·  Support / Helpdesk

Before following this guide, read the External API Request step foundation guide. It covers every field in the step interface so this guide can stay focused on Jira-specific values.

Description field requires ADF, not plain text

Jira REST API v3 uses Atlassian Document Format (ADF) for the description field, not a plain string. Sending plain text returns a 400 error. This guide shows the minimal ADF wrapper for plain-text descriptions so you can create issues without learning the full ADF spec.

API tokens expire after one year

Jira Cloud API tokens have a one-year expiry with no auto-renewal and no warning via the API. Set a calendar reminder to regenerate the token before it lapses, or your automation will silently start returning 401 errors.

Step 1: Generate a Jira API token

Jira Cloud uses Basic Auth with your email address and an API token, not your password. Passwords are deprecated for API use.

1
Go to id.atlassian.com, log in, and open Security → API tokens.
2
Click Create API token. Give it a label such as "WA.Expert Bot".
3
Copy the token immediately. It is shown only once. Store it securely.
4
Note your Jira domain from your Jira URL. If your Jira is acme.atlassian.net, your domain is acme.
Official docs

Jira Cloud REST API v3: developer.atlassian.com

Step 2: Compute the Authorization header

Jira Basic Auth encodes your email and API token together in Base64. The format is identical to Freshdesk, except here the password is the actual API token, not the letter X.

Computing the Jira Authorization header
String to encode:  your@email.com:YOUR_API_TOKEN
                   (email + colon + api token)

Base64 result:     eW91ckBlbWFpbC5jb206QVBJX1RPS0VO

Authorization header:
  Authorization: Basic eW91ckBlbWFpbC5jb206QVBJX1RPS0VO

Tools: any online Base64 encoder — input email:token, copy the output,
prepend 'Basic '.

Step 3: Search issues with JQL

JQL (Jira Query Language) is how you filter issues. Pass it as a URL parameter to the stable v3 search endpoint. Store the customer's email or issue key as a variable first, then use it in the query.

External API Request Step · WA.Expert
Select Method
GET
Request URL
https://YOUR-DOMAIN.atlassian.net/rest/api/3/search?jql=project%3DSUPPORT%20AND%20reporter%3D{{{{customer_email}}}}%20AND%20status%21%3DDone%20ORDER%20BY%20created%20DESC&maxResults=5
Select Auth Type
No Auth (Basic Auth manually in header)
Header Parameters
AuthorizationBasic BASE64_OF_EMAIL_COLON_TOKEN
Acceptapplication/json
Content-Typeapplication/json
Select Body Type
None (GET request, no body)
Choose Response Type
JSON

Field-by-field breakdown

FieldValueNotes
Select MethodGETReading issues, no body needed.
Request URLhttps://YOUR-DOMAIN.atlassian.net/rest/api/3/search?jql=...&maxResults=5Replace YOUR-DOMAIN. The jql parameter is URL-encoded. maxResults limits the result set.
AuthorizationBasic BASE64_OF_EMAIL_COLON_TOKENCompute once from email:api_token. Paste the full 'Basic ...' string.
Acceptapplication/jsonTells Jira to return JSON. Required.
Content-Typeapplication/jsonStandard; include on all Jira calls.

Useful JQL patterns

What you wantJQL query string
Open issues by reporter emailproject=SUPPORT AND reporter=priya@example.com AND status!=Done ORDER BY created DESC
Issues by issue key listissuekey in (PROJ-1, PROJ-2, PROJ-3)
High-priority open bugsproject=PROJ AND issuetype=Bug AND priority=High AND status=Open
Issues assigned to a userproject=PROJ AND assignee=accountId:5b10a2844c20165700ede21g
Issues updated in last 7 daysproject=PROJ AND updated >= -7d ORDER BY updated DESC

URL-encode spaces as %20 and = as %3D when passing JQL as a GET parameter. Most HTTP clients do this automatically if you pass jql as a named parameter.

Step 4: Map the response to WhatsApp variables

A successful Jira issue search response looks like this:

Jira REST API v3 — GET /search response
{
  "total": 2,
  "issues": [
    {
      "id": "10001",
      "key": "SUPPORT-42",
      "fields": {
        "summary": "WhatsApp chatbot not responding after midnight",
        "status":   { "name": "In Progress" },
        "priority": { "name": "High" },
        "assignee": { "displayName": "Rahul Mehta",
                      "accountId":   "5b10a2844c20165700ede21g" },
        "created":  "2026-06-20T10:30:00.000+0530"
      }
    }
  ]
}

Map: issues[0].key, issues[0].fields.summary,
     issues[0].fields.status.name, issues[0].fields.priority.name

Map these paths in the External API Request step:

Variable nameResponse pathExample value
issue_keyissues[0].keySUPPORT-42
issue_summaryissues[0].fields.summaryChatbot not responding
issue_statusissues[0].fields.status.nameIn Progress
issue_priorityissues[0].fields.priority.nameHigh
issue_assigneeissues[0].fields.assignee.displayNameRahul Mehta
issue_totaltotal2

issue_total tells the customer how many open issues exist. If total is 0 or issues is empty, add a conditions branch with a 'no open issues found' reply.

Bonus A: look up a single issue by key

If the customer knows their issue key (SUPPORT-42), fetch it directly. Ask them to type the key in WhatsApp, store it as {{issue_key}}, then use it in the URL:

Direct issue lookup — GET /rest/api/3/issue/{{issue_key}}
GET https://YOUR-DOMAIN.atlassian.net/rest/api/3/issue/{{issue_key}}
Authorization: Basic BASE64_OF_EMAIL_COLON_TOKEN
Accept: application/json

Response:
{{
  "key": "SUPPORT-42",
  "fields": {{
    "summary":  "Chatbot not responding after midnight",
    "status":   {{"name": "In Progress"}},
    "priority": {{"name": "High"}},
    "assignee": {{"displayName": "Rahul Mehta"}}
  }}
}}

Map: key, fields.summary, fields.status.name, fields.assignee.displayName

Bonus B: create a Jira issue from WhatsApp

When a customer reports a bug in WhatsApp, your bot can open a Jira issue automatically. The description must use Atlassian Document Format (ADF). Here is the minimal wrapper for plain text:

Create a Jira issue — POST /rest/api/3/issue
POST https://YOUR-DOMAIN.atlassian.net/rest/api/3/issue
Authorization: Basic BASE64_OF_EMAIL_COLON_TOKEN
Content-Type: application/json
Accept: application/json

Body:
{{
  "fields": {{
    "project":     {{"key": "SUPPORT"}},
    "summary":     "WhatsApp: {{{{customer_issue_summary}}}}",
    "issuetype":   {{"name": "Bug"}},
    "priority":    {{"name": "Medium"}},
    "description": {{
      "type":    "doc",
      "version": 1,
      "content": [{{
        "type": "paragraph",
        "content": [{{
          "type": "text",
          "text": "Customer WhatsApp message: {{{{customer_message}}}}"
        }}]
      }}]
    }}
  }}
}}

Response:
{{"id": "10002", "key": "SUPPORT-43", "self": "https://..."}}

Map: key -> new_issue_key
Bot replies: "Issue {{{{new_issue_key}}}} created. Our team will respond within 24 hours."
ADF for plain text: always use this wrapper

The minimal ADF for a plain-text description is: {type: doc, version: 1, content: [{type: paragraph, content: [{type: text, text: YOUR TEXT HERE}]}]}. Sending a bare string for description returns a 400 Bad Request. Copy this wrapper exactly and substitute your text.

Worked example: issue status bot

Chatbot flow — Jira issue lookup by email
Customer: "What is the status of my support request?"

Bot asks: "Please share the email on your Atlassian account, or your issue key."
Customer: priya@example.com
Stored as {{customer_email}}.

External API Request step:
GET https://acme.atlassian.net/rest/api/3/search
  ?jql=project%3DSUPPORT%20AND%20reporter%3Dpriya%40example.com
       %20AND%20status%21%3DDone%20ORDER%20BY%20created%20DESC
  &maxResults=1
Authorization: Basic ZW1haWw6dG9rZW4=

Response mapped:
  issue_key     = "SUPPORT-42"
  issue_summary = "Chatbot not responding after midnight"
  issue_status  = "In Progress"
  issue_total   = "2"

Conditions: if issue_total = 0 -> 'No open issues found for this email.'

Bot replies (if found):
"Hi Priya, I found 2 open issues on your account.

Most recent:
SUPPORT-42: Chatbot not responding after midnight
Status: In Progress

Reply KEY to check any other issue by its key number."

Troubleshooting

SymptomLikely causeFix
401 UnauthorizedWrong email, wrong token, or wrong Base64 formatRecompute: Base64(your@email.com:api_token). Check that 'Basic ' prefix is present. Confirm you are using the API token, not your account password.
404 on issue that existsAccount behind the token lacks Browse Projects permissionAsk your Jira admin to add the account to the project's permission scheme under Browse Projects. A 404 from Jira often means permission denied, not missing resource.
400 on issue creationDescription not in ADF formatWrap the description in the ADF structure shown above. Sending a plain string for description always returns 400 in v3.
0 results from JQL searchReporter email not matching Atlassian accountJira matches the reporter field to the Atlassian account email. If the customer used a different email to raise the issue, the query returns 0. Try searching by issue key instead.
Token stopped workingAPI token expired after 1 yearRegenerate a new API token at id.atlassian.com and update the Base64 header value.
Username/key parameter not recognisedUsing deprecated v2 user params in v3Jira v3 uses accountId, not username or key. For reporter/assignee filters in JQL, use the accountId value.

Common questions

What format does Jira v3 use for descriptions?
+
Atlassian Document Format (ADF), not plain text. Wrap any plain text in: {type: doc, version: 1, content: [{type: paragraph, content: [{type: text, text: YOUR TEXT}]}]}. Sending a bare string returns 400.
Where do I get a Jira API token?
+
id.atlassian.com > Security > API tokens > Create. Copy it immediately; it is shown only once. Tokens expire after one year.
What is JQL?
+
Jira Query Language: the filter syntax for the search endpoint. Example: project=SUPPORT AND status!=Done ORDER BY created DESC. Pass URL-encoded as the jql parameter in GET /rest/api/3/search.
Why do I get a 404 even with correct credentials?
+
Jira returns 404 when the account has no Browse Projects permission. Ask your admin to add the API-token account to the project permission scheme.
Can I look up by issue key directly?
+
Yes. GET /rest/api/3/issue/{{issue_key}} returns the full issue. Ask the customer to type their key (e.g. SUPPORT-42) and pass it in the URL.
Does this incur extra WA.Expert charges?
+
One automation action per External API Request call. Included on the Complete plan. Starter: from Rs. 49 per 1,000 actions.

Connect Zendesk to WhatsApp

Zendesk Support API: OAuth 2.0, ticket search and creation.

Read guide →

Connect Freshdesk to WhatsApp

Freshdesk API: Basic Auth with API key, ticket lookup.

Read guide →

External API Request Step

Master every field in WA.Expert's HTTP action step.

Read foundation guide →

Connect Jira to WhatsApp today

Free trial, no credit card. And if you get stuck, we are the only platform in India that answers you live on WhatsApp.

Start Free Trial → Book a Demo
1