Troubleshooting
If requests fail, run zero doctor check-connector --env-name ATLASSIAN_TOKEN or zero doctor check-connector --url https://your-domain.atlassian.net/rest/api/3/myself --method GET
Jira — User
Get Current User
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/myself" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Search Users
curl -s -G "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/user/search" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json" \
--data-urlencode "query=john"
Jira — Projects
List Projects
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/project" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Get Project
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/project/<project-key>" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Jira — Issues
Search Issues (JQL)
curl -s -X POST "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/search/jql" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-d "{\"jql\": \"project = PROJ AND status != Done ORDER BY created DESC\", \"maxResults\": 10, \"fields\": [\"key\", \"summary\", \"status\", \"assignee\", \"priority\"]}"
Common JQL: project = PROJ, assignee = currentUser(), status = 'In Progress', created >= -7d, labels = bug, priority = High.
Get Issue
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/issue/<issue-key>" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Create Issue
Jira v3 uses Atlassian Document Format (ADF) for rich text fields.
curl -s -X POST "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/issue" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-d "{\"fields\": {\"project\": {\"key\": \"PROJ\"}, \"summary\": \"Bug: Login button not responding\", \"description\": {\"type\": \"doc\", \"version\": 1, \"content\": [{\"type\": \"paragraph\", \"content\": [{\"type\": \"text\", \"text\": \"The login button is not responding.\"}]}]}, \"issuetype\": {\"name\": \"Bug\"}, \"priority\": {\"name\": \"High\"}, \"labels\": [\"mobile\"]}}"
Update Issue
curl -s -X PUT "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/issue/<issue-key>" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-d "{\"fields\": {\"summary\": \"Updated summary\", \"priority\": {\"name\": \"Highest\"}}}"
Delete Issue
curl -s -X DELETE "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/issue/<issue-key>" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN"
Assign Issue
curl -s -X PUT "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/issue/<issue-key>/assignee" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Content-Type: application/json" \
-d "{\"accountId\": \"<account-id>\"}"
Get Transitions
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/issue/<issue-key>/transitions" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Transition Issue (Change Status)
curl -s -X POST "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/issue/<issue-key>/transitions" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Content-Type: application/json" \
-d "{\"transition\": {\"id\": \"31\"}}"
Add Comment
curl -s -X POST "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/issue/<issue-key>/comment" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Content-Type: application/json" \
-d "{\"body\": {\"type\": \"doc\", \"version\": 1, \"content\": [{\"type\": \"paragraph\", \"content\": [{\"type\": \"text\", \"text\": \"Found the root cause. Working on a fix.\"}]}]}}"
Get Comments
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/issue/<issue-key>/comment" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Add Labels
curl -s -X PUT "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/issue/<issue-key>" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Content-Type: application/json" \
-d "{\"update\": {\"labels\": [{\"add\": \"urgent\"}, {\"add\": \"backend\"}]}}"
Add Attachment
curl -s -X POST "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/issue/<issue-key>/attachments" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "X-Atlassian-Token: no-check" \
-F "file=@screenshot.png"
Get Worklogs
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/issue/<issue-key>/worklog" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Add Worklog
curl -s -X POST "https://$ATLASSIAN_DOMAIN.atlassian.net/rest/api/3/issue/<issue-key>/worklog" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Content-Type: application/json" \
-d "{\"timeSpentSeconds\": 3600, \"comment\": {\"type\": \"doc\", \"version\": 1, \"content\": [{\"type\": \"paragraph\", \"content\": [{\"type\": \"text\", \"text\": \"Investigated and fixed the issue.\"}]}]}}"
Confluence — Spaces (v2)
List Spaces
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/spaces?limit=25" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Get Space
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/spaces/<space-id>" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
List Pages in Space
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/spaces/<space-id>/pages?limit=25" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Get Space Labels
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/spaces/<space-id>/labels" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Get Space Permissions
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/spaces/<space-id>/permissions" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Confluence — Pages (v2)
List Pages
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/pages?limit=25" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Params: space-id, title, status (current/draft/archived), body-format (storage/atlas_doc_format/view), limit, cursor.
Get Page
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/pages/<page-id>?body-format=storage" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Body format: storage (XHTML), atlas_doc_format (ADF), view (rendered HTML).
Create Page
curl -s -X POST "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/pages" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Content-Type: application/json" \
-d "{\"spaceId\": \"<space-id>\", \"status\": \"current\", \"title\": \"My New Page\", \"body\": {\"representation\": \"storage\", \"value\": \"<p>Page content in <strong>XHTML</strong> format.</p>\"}}"
Create Child Page
curl -s -X POST "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/pages" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Content-Type: application/json" \
-d "{\"spaceId\": \"<space-id>\", \"status\": \"current\", \"title\": \"Child Page\", \"parentId\": \"<parent-page-id>\", \"body\": {\"representation\": \"storage\", \"value\": \"<p>Child page content.</p>\"}}"
Update Page
Requires current version number (increment by 1).
curl -s -X PUT "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/pages/<page-id>" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Content-Type: application/json" \
-d "{\"id\": \"<page-id>\", \"status\": \"current\", \"title\": \"Updated Title\", \"body\": {\"representation\": \"storage\", \"value\": \"<p>Updated content.</p>\"}, \"version\": {\"number\": 2, \"message\": \"Updated via API\"}}"
Delete Page
curl -s -X DELETE "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/pages/<page-id>" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN"
Get Page Children
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/pages/<page-id>/children" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Get Page Labels
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/pages/<page-id>/labels" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Get Page Versions
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/pages/<page-id>/versions" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Get Page Attachments
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/pages/<page-id>/attachments" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Get Page Ancestors
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/pages/<page-id>/ancestors" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Confluence — Comments (v2)
List Footer Comments
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/pages/<page-id>/footer-comments" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Create Footer Comment
curl -s -X POST "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/footer-comments" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Content-Type: application/json" \
-d "{\"pageId\": \"<page-id>\", \"body\": {\"representation\": \"storage\", \"value\": \"<p>This is a comment.</p>\"}}"
Update Comment
curl -s -X PUT "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/footer-comments/<comment-id>" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Content-Type: application/json" \
-d "{\"version\": {\"number\": 2}, \"body\": {\"representation\": \"storage\", \"value\": \"<p>Updated comment.</p>\"}}"
Delete Comment
curl -s -X DELETE "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/footer-comments/<comment-id>" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN"
Confluence — Blog Posts (v2)
List Blog Posts
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/blogposts?limit=25" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Get Blog Post
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/blogposts/<blogpost-id>?body-format=storage" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Create Blog Post
curl -s -X POST "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/blogposts" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Content-Type: application/json" \
-d "{\"spaceId\": \"<space-id>\", \"status\": \"current\", \"title\": \"Release Notes v2.0\", \"body\": {\"representation\": \"storage\", \"value\": \"<p>What's new in v2.0.</p>\"}}"
Update Blog Post
curl -s -X PUT "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/blogposts/<blogpost-id>" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Content-Type: application/json" \
-d "{\"id\": \"<blogpost-id>\", \"status\": \"current\", \"title\": \"Release Notes v2.0 (Updated)\", \"body\": {\"representation\": \"storage\", \"value\": \"<p>Updated content.</p>\"}, \"version\": {\"number\": 2}}"
Delete Blog Post
curl -s -X DELETE "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/blogposts/<blogpost-id>" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN"
Confluence — Labels (v2)
List Labels
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/labels" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Get Pages by Label
curl -s "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/api/v2/labels/<label-id>/pages" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json"
Confluence — Search (v1)
Note: CQL search is only available via the v1 API. There is no v2 equivalent.
Search Content (CQL)
curl -s -G "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/rest/api/search" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "Accept: application/json" \
--data-urlencode "cql=type=page AND space=DEV AND text~\"deployment guide\"" \
--data-urlencode "limit=10"
Common CQL: type=page AND space=DEV, text~"search term", creator=currentUser(), lastModified >= "2026-01-01", label="meeting-notes", ancestor=12345.
Confluence — Attachments (v1)
Upload Attachment
curl -s -X POST "https://$ATLASSIAN_DOMAIN.atlassian.net/wiki/rest/api/content/<page-id>/child/attachment" \
-u "$ATLASSIAN_EMAIL:$ATLASSIAN_TOKEN" \
--header "X-Atlassian-Token: nocheck" \
-F "file=@document.pdf"
Atlassian Document Format (ADF)
Jira API v3 uses ADF for rich text fields (description, comment.body):
{
"type": "doc",
"version": 1,
"content": [
{
"type": "paragraph",
"content": [
{"type": "text", "text": "Plain text"},
{"type": "text", "text": "Bold", "marks": [{"type": "strong"}]},
{"type": "text", "text": "Code", "marks": [{"type": "code"}]}
]
}
]
}
Confluence Storage Format (XHTML)
Confluence uses XHTML for page bodies: <p>, <h1>-<h6>, <strong>, <em>, <ul>/<ol>, <table>, <ac:structured-macro>.
Guidelines
- JQL for Jira searches: Powerful filtering by any field combination.
- CQL for Confluence searches: Full-text search, space filtering, label queries. Uses v1 endpoint.
- Check transitions first: Before changing issue status, get available transitions.
- Version required for page updates: Always get and increment the current version number.
- ADF for Jira rich text: v3 API requires Atlassian Document Format for description and comments.
- XHTML for Confluence: Use XHTML storage format for page content (representation: "storage").
- Account IDs: Jira Cloud uses account IDs (not usernames) for user references.
- Pagination: Jira uses
startAt+maxResults. Confluence v2 uses cursor-based pagination withcursorandlimit. - Rate limits: Back off on 429 responses.
- Confluence v2 API: This skill uses
/wiki/api/v2for pages, spaces, comments, blog posts. CQL search and attachments still use v1 (/wiki/rest/api).
How to Look Up More API Details
- Jira REST API v3: https://developer.atlassian.com/cloud/jira/platform/rest/v3/
- Confluence REST API v2: https://developer.atlassian.com/cloud/confluence/rest/v2/
- JQL Reference: https://support.atlassian.com/jira-service-management-cloud/docs/use-advanced-search-with-jira-query-language-jql/
- CQL Reference: https://developer.atlassian.com/cloud/confluence/advanced-searching-using-cql/
- ADF Reference: https://developer.atlassian.com/cloud/jira/platform/apis/document/structure/