JIRA SOAP to REST Migration Guide

JIRA's SOAP and XML-RPC remote APIs were removed in JIRA 7.0 for JIRA Server. Read the announcement for more information.

This guide will help you migrate to the JIRA REST APIs, by providing the Atlassian-recommend REST equivalents for the existing SOAP methods. Alternatively, if you prefer, you can browse the full JIRA REST API documentation by clicking the button below:

On this page:

Global configuration

SOAP method Recommended REST resource. REST method
getConfiguration(java.lang.String token)

/rest/api/2/configuration

REST method: GET

getServerInfo(java.lang.String token)

/rest/api/2/serverInfo

REST method: GET

getCustomFields(java.lang.String token)

/rest/api/2/field

REST method: GET

getIssueTypes(java.lang.String token) 

/rest/api/2/issuetype

REST method: GET

getPriorities(java.lang.String token) 

/rest/api/2/priority

REST method: GET

getProjectsNoSchemes(java.lang.String token) 

/rest/api/2/project

REST method: GET

getResolutions(java.lang.String token) 

/rest/api/2/resolution

REST method: GET

getStatuses(java.lang.String token) 

/rest/api/2/status

REST method: GET

refreshCustomFields(java.lang.String token) 

This method was intentionally omitted in REST and we do not intend to implement it in the future.

Rest method: n/a

Issues

SOAP method Recommended REST resource. REST method
addBase64EncodedAttachmentsToIssue(java.lang.String token, java.lang.String issueKey, java.lang.String[] fileNames, java.lang.String[] base64EncodedAttachmentData) 

/rest/api/2/issue/{issueIdOrKey}/attachments

REST method: POST

addComment(java.lang.String token, java.lang.String issueKey, RemoteComment remoteComment) 

/rest/api/2/issue/{issueIdOrKey}/comment

REST method: POST

createIssue(java.lang.String token, RemoteIssue rIssue) 

/rest/api/2/issue

REST method: POST

createIssueWithParent(java.lang.String token, RemoteIssue rIssue, java.lang.String parentIssueKey) 

Follow the documented instructions in /rest/api/2/issue  to create a sub-task

REST method: POST

createIssueWithSecurityLevel(java.lang.String token, RemoteIssue rIssue, java.lang.Long securityLevelId) 

/rest/api/2/issue

REST method:

createIssueWithParentWithSecurityLevel(java.lang.String token, RemoteIssue rIssue, java.lang.String parentIssueKey, java.lang.Long securityLevelId) 

/rest/api/2/issue

REST method: POST

deleteIssue(java.lang.String token, java.lang.String issueKey) 

/rest/api/2/issue/{issueIdOrKey}

REST method: DELETE

editComment(java.lang.String token, RemoteComment remoteComment) 

/rest/api/2/issue/{issueIdOrKey}/comment/{id}

REST method: PUT

getAttachmentsFromIssue(java.lang.String token, java.lang.String issueKey) 

/rest/api/2/issue/{issueIdOrKey}?fields=attachment

REST method: GET

getAvailableActions(java.lang.String token, java.lang.String issueKey) 

/rest/api/2/issue/{issueIdOrKey}/transitions

REST method: GET

getComment(java.lang.String token, java.lang.Long id) 

/rest/api/2/issue/{issueIdOrKey}/comment/{id}

REST method: GET

getComments(java.lang.String token, java.lang.String issueKey) 

/rest/api/2/issue/{issueIdOrKey}/comment

REST method: GET

getFieldsForAction(java.lang.String token, java.lang.String issueKey, java.lang.String actionIdString)  

/rest/api/2/issue/{issueIdOrKey}/transitions

REST method: GET

getFieldsForCreate(java.lang.String token, java.lang.String projectKey, java.lang.Long issueTypeId) 

/rest/api/2/issue/createmeta

REST method: GET

getFieldsForEdit(java.lang.String token, java.lang.String issueKey) 

/rest/api/2/issue/{issueIdOrKey}/editmeta

REST method: GET

getIssue(java.lang.String token, java.lang.String issueKey) 

/rest/api/2/issue/{issueIdOrKey}   

REST method: GET

getIssueById(java.lang.String token, java.lang.String issueId) 

/rest/api/2/issue/{issueIdOrKey}   

REST method: GET

getResolutionDateById(java.lang.String token, java.lang.Long issueId) 

/rest/api/2/issue/{issueIdOrKey}?fields=resolution

REST method: GET

getResolutionDateByKey(java.lang.String token, java.lang.String issueKey) 

/rest/api/2/issue/{issueIdOrKey}?fields=resolution

REST method: GET

getSecurityLevel(java.lang.String token, java.lang.String issueKey) 

/rest/api/2/issue/{issueIdOrKey}?fields=security

REST method: GET

progressWorkflowAction(java.lang.String token, java.lang.String issueKey, java.lang.String actionIdString, RemoteFieldValue[] actionParams) 

/rest/api/2/issue/{issueIdOrKey}/transitions

REST method: POST

updateIssue(java.lang.String token, java.lang.String issueKey, RemoteFieldValue[] actionParams) 

/rest/api/2/issue/{issueIdOrKey}   

REST method: PUT

Issue types

SOAP method Recommended REST resource. REST method
getIssueTypesForProject(java.lang.String token, java.lang.String projectId) 

/rest/api/2/issue/createmeta?project={projectIdOrKey}

REST method: GET

getSubTaskIssueTypes(java.lang.String token) 

/rest/api/2/issuetype

Supported only by filtering the response for all issue types.

REST method: GET

getSubTaskIssueTypesForProject(java.lang.String token, java.lang.String projectId) 

/rest/api/2/issue/createmeta?project= {projectIdOrKey}

Filter for subtasks.

REST method: GET

Login

SOAP method Recommended REST resource. REST method
login(java.lang.String username, java.lang.String password)

Intentionally omitted. JIRA will not support this.

Read about authentication.

REST method: n/a

logout(java.lang.String token) 

Intentionally omitted. JIRA will not support this.

REST method: n/a

Notifications

SOAP method Recommended REST resource. REST method
getAssociatedNotificationSchemes(java.lang.String token, RemoteProjectRole projectRole)  

/rest/api/2/project/{projectKeyOrId}/notificationscheme

 

Coming in JIRA 7.0 EAP

REST method: GET

getNotificationSchemes(java.lang.String token) 

/rest/api/2/notificationscheme

Coming in JIRA 7.0 EAP 

REST method: GET

Permissions

SOAP method

Recommended REST resource. REST method

addPermissionTo(java.lang.String token, RemotePermissionScheme permissionScheme, RemotePermission permission, RemoteEntity remoteEntity)  

/rest/api/2/permissionscheme/{schemeId}/permission

Coming in JIRA 7.0 EAP

REST method: POST

 

createPermissionScheme(java.lang.String token, java.lang.String name, java.lang.String description) 

/rest/api/2/permissionscheme

Coming in JIRA 7.0 EAP

REST method: POST

deletePermissionFrom(java.lang.String token, RemotePermissionScheme permissionSchemeName, RemotePermission permission, RemoteEntity remoteEntity) 

/rest/api/2/permissionscheme/{schemeId}/permission/{permissionId}

 

Coming in JIRA 7.0 EAP 

 

REST method: DELETE

deletePermissionScheme(java.lang.String token, java.lang.String permissionSchemeName) 

/rest/api/2/permissionscheme/{schemeId}

Coming in JIRA 7.0 EAP

REST method: DELETE

getAllPermissions(java.lang.String token) 

/rest/api/2/permissions OR /rest/api/2/mypermissions

Coming in JIRA 7.0 EAP

REST method: GET

getAssociatedPermissionSchemes(java.lang.String token, RemoteProjectRole projectRole) 

/rest/api/2/project/{projectKeyOrId}/permissionscheme

Coming in JIRA 7.0 EAP

REST method: GET

getPermissionSchemes(java.lang.String token) 

/rest/api/2/permissionscheme

 

Coming in JIRA 7.0 EAP 

REST method: GET

Projects

SOAP method Recommended REST resource. REST method
getComponents(java.lang.String token, java.lang.String projectKey)   

/rest/api/2/project/{projectIdOrKey}/components

REST method: GET

addVersion(java.lang.String token, java.lang.String projectKey, RemoteVersion remoteVersion) 

/rest/api/2/version

REST method: POST

archiveVersion(java.lang.String token, java.lang.String projectKey, java.lang.String versionName, boolean archive) 

/rest/api/2/version/{versionId}

In request body:

{"archived": true}

REST method: PUT

createProject(java.lang.String token, java.lang.String key, java.lang.String name, java.lang.String description, java.lang.String url, java.lang.String lead, RemotePermissionScheme permissionScheme, RemoteScheme notificationScheme, RemoteScheme issueSecurityScheme) 

/rest/api/2/project

Coming in JIRA 7.0 EAP

REST method: POST

 

createProjectFromObject(java.lang.String token, RemoteProject rproject) 

/rest/api/2/project

 Coming in JIRA 7.0 EAP

REST method: POST

deleteProject(java.lang.String token, java.lang.String projectKey) 

/rest/api/2/project/{projectId}

Coming in JIRA 7.0 EAP

REST method: DELETE

deleteProjectAvatar(java.lang.String token, long avatarId) 

/rest/api/2/project/{projectIdOrKey}/avatar/{id}

REST method: DELETE

getProjectAvatar(java.lang.String token, java.lang.String projectKey) 

/rest/api/2/project/{projectIdOrKey}/avatars

REST method: GET

getProjectAvatars(java.lang.String token, java.lang.String projectKey, boolean includeSystemAvatars) 

/rest/api/2/project/{projectIdOrKey}/avatars  

REST method: GET

getProjectById(java.lang.String token, java.lang.Long projectId) 

/rest/api/2/project/{projectIdOrKey}

REST method: GET

getProjectByKey(java.lang.String token, java.lang.String projectKey) 

/rest/api/2/project/{projectIdOrKey}    

REST method: GET

getVersions(java.lang.String token, java.lang.String projectKey) 

/rest/api/2/project/{projectIdOrKey}/versions

REST method: GET

releaseVersion(java.lang.String token, java.lang.String projectKey, RemoteVersion version) 

/rest/api/2/version/{id}

REST method: PUT

setNewProjectAvatar(java.lang.String token, java.lang.String projectKey, java.lang.String contentType, java.lang.String base64ImageData) 

/rest/api/2/project/{projectIdOrKey}/avatar/temporary

REST method: POST

setProjectAvatar(java.lang.String token, java.lang.String projectKey, java.lang.Long avatarId) 

/rest/api/2/project/{projectIdOrKey}/avatar    

REST method: PUT

getProjectWithSchemesById(java.lang.String token, java.lang.Long projectId) 

/rest/api/2/project/{projectIdOrKey}  

and calls to

/rest/api/2/project/{projectIdOrKey}/issuesecuritylevelscheme

/rest/api/2/project/{projectIdOrKey} /permissionscheme

/rest/api/2/project/{projectIdOrKey} /notificationscheme    

 Coming in JIRA 7.0 EAP

REST method: GET

 

Project roles

SOAP method Recommended REST resource. REST method
getProjectRole(java.lang.String token, java.lang.Long id) 

/rest/api/2/role/{id}

REST method: GET

getProjectRoleActors(java.lang.String token, RemoteProjectRole projectRole, RemoteProject project) 

/rest/api/2/project/{projectIdOrKey}/role/{id}

REST method: GET

getProjectRoles(java.lang.String token) 

/rest/api/2/role

REST method: GET

isProjectRoleNameUnique(java.lang.String token, java.lang.String name) 

Intentionally omitted from REST. You can calculate this from the /rest/api/2/role response.

REST method: n/a

removeActorsFromProjectRole(java.lang.String token, java.lang.String[] actors, RemoteProjectRole projectRole, RemoteProject project, java.lang.String actorType) 

/rest/api/2/project/{projectIdOrKey}/role/{id}

REST method: DELETE

removeAllRoleActorsByNameAndType(java.lang.String token, java.lang.String name, java.lang.String type) 

Can be done indirectly.

REST method: n/a

removeAllRoleActorsByProject(java.lang.String token, RemoteProject project) 

Can be done indirectly.

REST method: n/a

removeDefaultActorsFromProjectRole(java.lang.String token, java.lang.String[] actors, RemoteProjectRole projectRole, java.lang.String actorType) 

Can be done indirectly.

REST method: n/a

updateProject(java.lang.String token, RemoteProject rProject) 

/rest/api/2/project{projectIdOrKey}

 Coming in JIRA 7.0 EAP

REST method: PUT

 

updateProjectRole(java.lang.String token, RemoteProjectRole projectRole) 

/rest/api/2/project/{projectIdOrKey}/role/{id}

 Coming in JIRA 7.0 EAP

REST method: PUT

 

getDefaultRoleActors(java.lang.String token, RemoteProjectRole projectRole) 

/rest/api/2/project/{projectIdOrKey}/role/{id}

REST method: GET

addActorsToProjectRole(java.lang.String token, java.lang.String[] actors, RemoteProjectRole projectRole, RemoteProject project, java.lang.String actorType) 

/rest/api/2/project/{projectIdOrKey}/role/{id}

There is also PUT alternative

REST method: POST

addDefaultActorsToProjectRole(java.lang.String token, java.lang.String[] actors, RemoteProjectRole projectRole, java.lang.String type) 

/rest/api/2/project/{projectIdOrKey}/role/{id}

There is also PUT alternative

REST method: POST

createProjectRole(java.lang.String token, RemoteProjectRole projectRole) 

/rest/api/2/role

 Coming in JIRA 7.0 EAP

REST method: POST

deleteProjectRole(java.lang.String token, RemoteProjectRole projectRole, boolean confirm) 

/rest/api/2/role/{roleId}

 

 Coming in JIRA 7.0 EAP

REST method: DELETE

SOAP method Recommended REST resource.
getFavouriteFilters(java.lang.String token) 

/rest/api/2/filter/favourite

REST method: GET

getIssueCountForFilter(java.lang.String token, java.lang.String filterId) 

Retrieve filter's JQL from:

/rest/api/2/filter/{id}

then call:

/rest/api/2/search

REST method: GET

getIssuesFromFilter(java.lang.String token, java.lang.String filterId) 

Same as above.

REST method: GET

getIssuesFromFilterWithLimit(java.lang.String token, java.lang.String filterId, int offSet, int maxNumResults) 

Same as above.

REST method: GET

getIssuesFromJqlSearch(java.lang.String token, java.lang.String jqlSearch, int maxNumResults) 

/rest/api/2/search

REST method: GET

getIssuesFromTextSearch(java.lang.String token, java.lang.String searchTerms) 

Intentionally omitted. Use text ~ "foo" as a JQL query on /rest/api/2/search REST method: GET

getIssuesFromTextSearchWithLimit(java.lang.String token, java.lang.String searchTerms, int offSet, int maxNumResults) 

See above.

REST method: GET

getIssuesFromTextSearchWithProject(java.lang.String token, java.lang.String[] projectKeys, java.lang.String searchTerms, int maxNumResults) 

See above.

REST method: GET

getSavedFilters(java.lang.String token) 

/rest/api/2/filter/favourite

REST method:

Security

SOAP method Recommended REST resource. REST method
getSecurityLevels(java.lang.String token, java.lang.String projectKey) 

api/2/project/{projectKeyOrId}/securitylevel   

 Coming in JIRA 7.0 EAP

REST method: GET

getSecuritySchemes(java.lang.String token) 

api/2/issuesecurityschemes

 Coming in JIRA 7.0 EAP

REST method: GET

User management

SOAP method Recommended REST resource. REST method
removeUserFromGroup(java.lang.String token, RemoteGroup group, RemoteUser ruser) 

/rest/api/2/group/user

REST method: DELETE

setUserPassword(java.lang.String token, RemoteUser user, java.lang.String newPassword) 

/rest/api/2/user/password

REST method: PUT

addUserToGroup(java.lang.String token, RemoteGroup group, RemoteUser ruser) 

/rest/api/2/group/user

REST method: POST

createGroup(java.lang.String token, java.lang.String groupName, RemoteUser firstUser) 

/rest/api/2/group

REST method: POST

createUser(java.lang.String token, java.lang.String username, java.lang.String password, java.lang.String fullName, java.lang.String email) 

/rest/api/2/user

REST method: POST

deleteGroup(java.lang.String token, java.lang.String groupName, java.lang.String swapGroupName) 

/rest/api/2/group    

REST method: DELETE

deleteUser(java.lang.String token, java.lang.String username) 

/rest/api/2/user    

REST method: DELETE

getGroup(java.lang.String token, java.lang.String groupName) 

/rest/api/2/group    

REST method: GET

getUser(java.lang.String token, java.lang.String username) 

/rest/api/2/user    

REST method: GET

updateGroup(java.lang.String token, RemoteGroup group) 

/rest/api/2/group    

REST method: PUT

updateUser(java.lang.String token, RemoteUser user) 

/rest/api/2/user

 Coming in JIRA 7.0 EAP

REST method: PUT

 

Worklog

SOAP method Recommended REST resource. REST method
addWorklogAndAutoAdjustRemainingEstimate(java.lang.String token, java.lang.String issueKey, RemoteWorklog remoteWorklog) 

/rest/api/2/issue/{issueIdOrKey}/worklog

REST method: POST

addWorklogAndRetainRemainingEstimate(java.lang.String token, java.lang.String issueKey, RemoteWorklog remoteWorklog) 

/rest/api/2/issue/{issueIdOrKey}/worklog

See documentation on including leave parameter

REST method: POST

addWorklogWithNewRemainingEstimate(java.lang.String token, java.lang.String issueKey, RemoteWorklog remoteWorklog, java.lang.String newRemainingEstimate) 

/rest/api/2/issue/{issueIdOrKey}/worklog

See documentation on including new parameter

REST method: POST

deleteWorklogAndAutoAdjustRemainingEstimate(java.lang.String token, java.lang.String worklogId) 

/rest/api/2/issue/{issueIdOrKey}/worklog/{id}

REST method: DELETE

deleteWorklogAndRetainRemainingEstimate(java.lang.String token, java.lang.String worklogId) 

/rest/api/2/issue/{issueIdOrKey}/worklog/{id}

See documentation on including leave parameter

REST method: DELETE

deleteWorklogWithNewRemainingEstimate(java.lang.String token, java.lang.String worklogId, java.lang.String newRemainingEstimate) 

/rest/api/2/issue/{issueIdOrKey}/worklog/{id}

See documentation on including new parameter

REST method: DELETE

getWorklogs(java.lang.String token, java.lang.String issueKey) 

/rest/api/2/issue/{issueIdOrKey}/worklog

REST method: GET

hasPermissionToCreateWorklog(java.lang.String token, java.lang.String issueKey) 

/rest/api/2/mypermissions

REST method: GET

hasPermissionToDeleteWorklog(java.lang.String token, java.lang.String worklogId) 

/rest/api/2/mypermissions    

REST method: GET

hasPermissionToEditComment(java.lang.String token, RemoteComment remoteComment) 

/rest/api/2/mypermissions    

REST method: GET

hasPermissionToUpdateWorklog(java.lang.String token, java.lang.String worklogId) 

/rest/api/2/mypermissions    

REST method: GET

updateWorklogAndAutoAdjustRemainingEstimate(java.lang.String token, RemoteWorklog remoteWorklog) 

/rest/api/2/issue/{issueIdOrKey}/worklog/{id}

REST method: PUT

updateWorklogAndRetainRemainingEstimate(java.lang.String token, RemoteWorklog remoteWorklog) 

/rest/api/2/issue/{issueIdOrKey}/worklog/{id}

See documentation on including leave parameter

REST method: PUT

updateWorklogWithNewRemainingEstimate(java.lang.String token, RemoteWorklog remoteWorklog, java.lang.String newRemainingEstimate) 

/rest/api/2/issue/{issueIdOrKey}/worklog/{id}

See documentation on including new parameter

REST method: PUT

Note on session invalidation

SOAP used to throw an exception when user's session expired. The JIRA REST API returns an X-AUSERNAME header. The header's value will either be username of logged in user or 'anonymous'. 

Was this page helpful?

Have a question about this article?

See questions about this article

Powered by Confluence and Scroll Viewport