Skip to end of metadata
Go to start of metadata

JIRA's SOAP and XML-RPC remote APIs were deprecated in JIRA 6.0.

Read the announcement for more information.


JIRA 3.0 and later


JIRA ships with the JIRA XML-RPC plugin which enables remote access through XML-RPC and SOAP. Using this feature with XML-RPC is easy with some help from the Apache XML-RPCpackage.In this tutorial, we write a basic XML-RPC client (using Apache XML-RPC) that logs in, retrieves projects and then logs out again. A Python client is also demonstrated.You may also be interested in the Creating a JIRA SOAP Client. More methods are exposed via SOAP than XML-RPC.

Getting the latest XML-RPC client


You can download the latest XML-RPC client with the Atlassian Plugin SDK – see Developing with the Atlassian Plugin SDK.

The methods exposed via XML-RPC are listed in the RPC plugin Javadoc for the XmlRpcService class. The JIRA XML-RPC Overview has more information (though not guaranteed to be up to date).

To run the Java client in this tutorial, you'll need to download the Apache XML-RPC libraries and make them available in your classpath.

Enabling the RPC plugin

To invoke JIRA operations remotely, you should ensure that the RPC plugin is enabled on the JIRA installation you are targeting. If you simply want to create a client to then you can skip this step. First you need to check if the Accept Remote API Calls has been enabled in 'General Configuration' under 'Global Settings' in the left-hand menu:

Then you need to enable the JIRA RPC Plugin in 'Plugins' under 'System' in the left-hand menu:

(warning) To get the source code of the RPC plugin, see

Your server should now be ready to accept remote procedure calls.

Now that your server is ready to accept remote procedure calls, we begin creating a Java XML-RPC client.

Building a Python XML-RPC client

XML-RPC in Python is very easy. Here is a sample client that creates test issues on

Building a Java client

The goal of this tutorial is to create a client that makes three simple remote calls to JIRA. Here we log in, retrieve the project information and then log out again. You can take a look at the full source code here (xmlrpc-2.x) or here (xmlrpc-3.x).

The first step is to configure your details.

All XML-RPC calls are invoked at with the path /rpc/xmlrpc by default. You need to configure your username and password appropriately.

Method calls to JIRA via XML-RPC need to be prefixed with "jira1.". Parameters to methods are passed as sequenced Objects in a Vector. In the above code, we log into We receive back a loginToken which will need to be passed to all subsequent method calls.

The RPC client calls the getProjectsNoSchemes() method passing the loginToken. This returns with a Vector of projects which are represented by HashTable objects. For information on what methods are available as well as what properties are available on returned projects, you'll again need to look at the JIRA XML-RPC API Spec.

Lastly, we log out of the system, again passing the loginToken in a Vector form.

There it is! A simple client for JIRA XML-RPC. If you wish to extend or customise the JIRA XML-RPC plugin itself, you can download the latest source from the repository.

Building a Perl client

Here's an XML-RPC client that uses the XMLRPC::Lite module (distributed with ActivePerl and available for free on CPAN).

XMLRPC::Lite is poorly documented. Using it for this simple example required reading the code. We do not recommend it for newbie Perl hackers.


Creating a JIRA SOAP Client

  • No labels


  1. I've created a Java client for the Jira XMLRPC that is strongly typed and open source so it can be included in other open source and proprietary projects.


  2. Added a new tool to the set that makes reporting from Jira as easy as it could possibly be. You only need to supply a Velocity template. Works with XML-RPC or RSS.

    To try it out:

    Try this:

    $ wget
    $ java -jar swizzle-jirareport-1.0-nodep.jar
    $ java -jar swizzle-jirareport-1.0-nodep.jar

  3. Any one knows if it is possible to connect to jira trught XML RPC when jira is on https?

    Are there any problems to do it?

    1. Probably, It can require certificate installation (adding to keystore) or use this string:

              System.setProperty("", "<path to certificate *.jks>");


    It would be nice if your examples actually worked.

    Python script as written doesn't update custom field values for me. I've tried everything... Am I the only one who can't update customfields via xmlrpc?

    Using soap is not an option for me (sad)


    Python script does work, but only if you associate correct screen type for that issue for that custom field. Otherwise xmlrpc happily ignores the update. Took me forever to chase it down. How come I can change a customfield from inside my java plugin but not via xmlrpc? Sounds like a bug to me.

    1. Anonymous

      You made my day! After I associated my custom field to the "new screen" updating custom fields started working.

      That errors are silently ignored seems quite nasty to me.

  5. Hi to all,

        Can anybody help me to create isssue in JIRA through XML-RPC client In JAVA.It was working before assing Custom field  in JIRA.

    But after adding custom field its throwinig the Infrastructure Exception....

    Can any body tell me  the code  *or  *indentify the errors in this code...

    -------------------------------------------------------------------------------------------------------------------------------String proj=new String("MP");
    String typ=new String("1");String summ=new String("Created after reducing JAR file");
    String pri=new String("2");String rep=new String("amitmitra83");
    String desc=new String("test for error");String asign=new String("amitmitra83");
    String cstid0=new String("customfield_10000");String cstid1=new String("customfield_10001");String cstid2=new String("customfield_10002");
    String cstval0=new String("Always");String cstval1=new String("S3");
    String cstval2=new String("234"); Hashtable issue = new Hashtable();
    issue.put("project",proj);issue.put("type", typ);
    issue.put("summary", summ);issue.put("priority", pri);
    issue.put("reporter",rep);issue.put("description",desc);issue.put("assignee", asign); Vector cust_fld=new Vector();
    Hashtable Custom_fields = new Hashtable();Custom_fields.put("customfieldId",cstid0);Custom_fields.put("values",cstval0);

    Custom_fields = new Hashtable();

    Custom_fields = new Hashtable();

    issue.put("customFieldValues", cust_fld); Vector NewParams=new Vector();

    NewParams.add(issue);Object objIssues = rpcClient.execute("jira1.createIssue", NewParams);System.out.println("Returned issue key: " + objIssues);

    Please Help..................................

    Thanks in Advance

    1. Amit,

      Not sure if this will help, but... 

       Try assigning customfields the same way you assign summary, so issue.put("customfield_10210", new String("you custom string value"))

      Hope this helps. Also see my comment above - to be able to update customfield via xmlrpc it seems like you need to associate correct screens with it for your issue.

    2. customFieldValues Solution

      Hey Amit, I had the same problem but was able to figure it out by looking at the source code. Apparently a String[] is needed for the "values" key. If you change your code to the following it should work:


      The following code listed below is what worked for me:

  6. Anonymous

    Hello All,

    Is is possible to download the files attached to an issue using JIRA-RPC plugin?


    1. I found an answer.  The file needs to be read as binary and then b64 encoded.  After that it can be added.  There is a list of file fileNames and matching list of lists of file contents.  (Note the [[ on the file_contents, it is intentional)

  7. Anonymous

    Can someone tell me what is going wrong here?  I have python xmlrpc code like this:

    My output is this:

    Both 10690 and 10734 are legal version ids

    Enterprise Edition, Version: 3.6-#153

    What am I doing wrong?

    1. When updating an issue from a XML-RPC client, you must refer to the affects versions field as "versions" instead of "affectsVersion".

      For the JIRA issue associated with this behaviour can be found here JRA-12300.

  8. Anonymous

    Hello out there!
    Is there anyone having a working PHP SOAP-Client with some functionality?
    I can connect, get Filters and do some "basic" operations, but don't know how to handle the returned objects.

    Would be very nice if someone could help me out with some code...
    => count78 (at) hotmail (dot) de

    Thanks for your answers!


  9. Any reason why the XML-RPC docs are not kept up to date? I'm trying to add an attachment to an issue and I'm not sure if it is simply not supported by XML-RPC or I'm getting something wrong in my call.

    1. I ran into that as well.  SOAP is the only way I found to add an attachement.  Below is a stripped down version of how I did it.  I had a class and I've placed the relevant bits below.

  10. Anonymous


    How do I add a comment to an issue I just created using the perl xml-rpc client? for example: I use the code provided above to create an issue, how do I add a comment to that same issue?



    1. When you say above, does it mean in the body itself?

      You use the addComment(String token, String issueKey, String comment) method to add a comment. (smile)


      1. Anonymous

        Thank you for your reply tim.

        So i would like to add a comment to the issue during the issue creation. I tried the addComment but that didn't work. Perhaps i'm not using it correctly..definitely a possibility since it isn't working (smile) . I've tried the following

        my $comment = $jira->call("jira1.addComment", "Test-3", "My comment");

        That didn't work.

        Any ideas?

        Thanks in advance.


        1. Anonymous

          actually I got it working when i explicitly specify the issue key. but when I try to do the following I get an error:

          use XMLRPC::Lite;
          use Data::Dumper;
          my $jira = XMLRPC::Lite->proxy('http://localhost:8080/rpc/xmlrpc');
          my $auth = $jira->call("jira1.login", "testuser", "testuser")->result();
          my $call = $jira->call("jira1.createIssue", $auth, {
              'project' => 'UB',
              'type' => 1,
              'summary' => 'Issue created via XMLRPC',
              'description' => 'Created with a Perl client',
          my $comment = $jira->call("jira1.addComment", $auth, $call->

          Unknown macro: {'issueKey'}

          , "This is another test adding a comment");
          #my $issueKey = $call->

          Unknown macro: {'issueey'}

          my $fault = $call->fault();
          if (defined $fault) {
              die $call->faultstring();
          } else {
              print "issue created:\n";
              print Dumper($call->result());
              $fault = $comment->fault();
              if (defined $fault)

          Unknown macro: {        die $comment->faultstring();    }


          Unknown macro: {        print "issue commented}


          I get this error:

          "java.lang.Exception: com.atlassian.jira.rpc.exception.RemotePermissionException:  This issue does not exist or you don't have permission to view it. "

          any ideas?

          Thanks again in advance

          1. Anonymous

            sorry, here is the code again

            Thanks again!

            1. Hi,

              Could you please try posting your question in the Developers Forum?

              Kind Regards,

  11. Anonymous

    Is there any ways to use xml-RPC client in .NET . If any body know it . please help me ... it there a sample code in .NET ? HELP HELP .


    1. Your best chance is to check out the resources available at:
      They should have a list of available implementations that should be compatible.

      I can't vouch for any of the implementations, but it is a pretty common standard.


  12. Anonymous

    Hi All, i am newbie in xml-rpc,

    how to create and update issues in using Java Client.Thanks.


  13. Hi Team,

    I need to update the Status of JIRA from Resolved to QA-Testing, for it i am using C# code and calling JIRA webservice with SOAP-RPC

    in order to update the status i am writing following code :

    soap.progressWorkflowAction(token, "JIRA-123", actionIDString , RemotefieldValue)

    RemotefieldValue =  id = resolution and value = 10146 (10146 i.e. QA-Testing)

    Here in the above code what should be actionIDString.

    When i am passing actionIDString as 3 then my JIRA is promoted to Reopened status.But it should be prompoted to QA-Testing.However when i pass in actionID as 10146 that is says this actionid is not supported in workflow for the current JIRA.and exception as follows :

     Kindly suggest me to fulfill my requirement and how can we achieve that.Thanks!.

    Waiting for your reply....

    com.atlassian.jira.rpc.exception.RemoteException: java.lang.IllegalArgumentException: No workflow action with id '10146' available for issue JIRA-123
     at com.atlassian.jira.workflow.WorkflowTransitionUtilImpl.getActionDescriptor(
     at com.atlassian.jira.rpc.soap.service.IssueServiceImpl.getWorkflowTransitionUtil(
     at com.atlassian.jira.rpc.soap.service.IssueServiceImpl.progressWorkflowAction(
     at com.atlassian.jira.rpc.soap.service.IssueServiceImpl.progressWorkflowAction(
     at com.atlassian.jira.rpc.soap.JiraSoapServiceImpl.progressWorkflowAction(
     at sun.reflect.GeneratedMethodAccessor764.invoke(Unknown Source)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(
     at java.lang.reflect.Method.invoke(
     at org.apache.axis.strategies.InvocationStrategy.visit(
     at org.apache.axis.SimpleChain.doVisiting(
     at org.apache.axis.SimpleChain.invoke(
     at org.apache.axis.handlers.soap.SOAPService.invoke(
     at org.apache.axis.server.AxisServer.invoke(
     at org.apache.axis.transport.http.AxisServlet.doPost(
     at javax.servlet.http.HttpServlet.service(
     at org.apache.axis.transport.http.AxisServletBase.service(
     at javax.servlet.http.HttpServlet.service(
     at com.atlassian.jira.web.servlet.rpc.LazyAxisDecoratorServlet.service(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at com.zlatkovic.servlet.RedirectFilter.doFilter(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at com.atlassian.jira.web.filters.AccessLogFilter.doFilter(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at com.atlassian.seraph.filter.SecurityFilter.doFilter(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at com.atlassian.seraph.filter.TrustedApplicationsFilter.doFilter(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at com.atlassian.seraph.filter.BaseLoginFilter.doFilter(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at com.atlassian.util.profiling.filters.ProfilingFilter.doFilter(
     at com.atlassian.jira.web.filters.JIRAProfilingFilter.doFilter(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at com.atlassian.jira.web.filters.ActionCleanupDelayFilter.doFilter(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at com.atlassian.jira.web.filters.RequestCleanupFilter.doFilter(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at com.atlassian.johnson.filters.AbstractJohnsonFilter.doFilter(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at com.atlassian.gzipfilter.GzipFilter.doFilter(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at com.atlassian.core.filters.AbstractEncodingFilter.doFilter(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at com.atlassian.jira.appconsistency.db.DatabaseCompatibilityEnforcerFilter.doFilter(
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(
     at org.apache.catalina.core.StandardWrapperValve.invoke(
     at org.apache.catalina.core.StandardContextValve.invoke(
     at org.apache.catalina.core.StandardHostValve.invoke(
     at org.apache.catalina.valves.ErrorReportValve.invoke(
     at org.apache.catalina.core.StandardEngineValve.invoke(
     at org.apache.catalina.valves.AccessLogValve.invoke(
     at org.apache.catalina.connector.CoyoteAdapter.service(
     at org.apache.coyote.http11.Http11Processor.process(
     at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(
     at org.apache.tomcat.util.threads.ThreadPool$

  14. Hi,

    I'm trying to re-assign an issue in Python. Basically I do this:

    issue = l.jira1.getIssue(token, issuekey)


    l.jira1.updateIssue(token, issuekey, issue)

    And I get the following error:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/", line 1199, in _call_
        return self._send(self._name, args)
      File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/", line 1489, in __request
      File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/", line 1253, in request
        return self._parse_response(h.getfile(), sock)
      File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/", line 1392, in _parse_response
        return u.close()
      File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/", line 838, in close
        raise Fault(**self._stack[0])
    xmlrpclib.Fault: <Fault 0: 'java.lang.Exception: java.lang.ClassCastException: java.lang.String'>

    Any suggestions?

    1. Anonymous

      Kudos! What a neat way of tnhiking about it.

  15. Anonymous


    I'm working with a simple example to create issues.


    # Sample Python client accessing JIRA via XML-RPC. Methods requiring
    # more than basic user-level access are commented out.
    # Refer to the XML-RPC Javadoc to see what calls are available:
    import xmlrpclib
    s = xmlrpclib.ServerProxy('' )
    auth = s.jira1.login('suport.otpica.ctti', 'q1w2e3r4')
    newissue = s.jira1.createIssue(auth,

    Unknown macro: { 'project'}

    print "Created %s/browse/%s" % (s.jira1.getServerInfo(auth)['baseUrl'], newissue['key'])
    print "Commenting on issue.."
    # s.jira1.addComment(auth, newissue['key'], 'Comment added with XML-RPC')
    print "Done!"

    import xmlrpclib

    s = xmlrpclib.ServerProxy('http://IP:PORT/rpc/xmlrpc' )

    auth = s.jira1.login('USER', 'PASSWD')

    newissue = s.jira1.createIssue(auth,

    Unknown macro: { 'project'}


    print "Created %s/browse/%s" % (s.jira1.getServerInfo(auth)['baseUrl'], newissue['key'])

    print "Commenting on issue.."

    # s.jira1.addComment(auth, newissue['key'], 'Comment added with XML-RPC')

    print "Done!"


    And I get:

    File "/usr/lib/python2.5/", line 1147, in _call_
        return self._send(self._name, args)
      File "/usr/lib/python2.5/", line 1437, in __request
      File "/usr/lib/python2.5/", line 1201, in request
        return self._parse_response(h.getfile(), sock)
      File "/usr/lib/python2.5/", line 1340, in _parse_response
        return u.close()
      File "/usr/lib/python2.5/", line 787, in close
        raise Fault(**self._stack[0])
    xmlrpclib.Fault: <Fault 0: 'java.lang.Exception: com.atlassian.jira.InfrastructureException: Could not create RemoteIssue from struct?'>

    Can you help me?


    1. Hi,

      Could you please try posting your question in the Developers Forum?

      Kind Regards,

  16. Hi,

    Anybody any idea why issueupdate is not working in below script?


    use strict;
    use warnings;
    use XMLRPC::Lite;
    use Data::Dumper;

    my $jira  = XMLRPC::Lite->proxy('');
    my $auth  = $jira->call("jira1.login", "o194061", "XXXXXXXXXX")->result() || die "Error - $! \n";
    my $call  = $jira->call("jira1.getIssue", $auth,'IPT-407');
    my $hashref;

    my $fault = $call->fault();
    if (defined $fault) {
    die $call->faultstring();
    } else {
    $hashref = $call->result();


    Unknown macro: {'summary'}

    = "Perl Script";

    $jira->call("jira1.logout", $auth);
    sleep 5;


    $auth  = $jira->call("jira1.login", "o194061", "XXXXXXXXXX")->result() || die "Error - $! \n";
    $call  = $jira->call("jira1.updateIssue",$auth,'IPT-407',$hashref);

    if (defined $fault)

    Unknown macro: {die $call->faultstring();} else  print "issue updated}

    $jira->call("jira1.logout", $auth);

    1. Hello there,

      Could you please try posting your question in the Developers Forum, which you can also access via the forums link below?

      Kind Regards,
      Giles Gaskell.

  17. Anonymous


    I am trying to create an XML-RPC Client from .Net but cannot see any reference to xmlRpcClient. I have RPC Plugin enabled.

    Could anybody please help to show any resource to connect to JIRA from .Net. My requirement is to get all open issues from JIRA and transfer to another table in MS Access.

    Thanks for help.


    1. Hello,

      You may want to look at the LinqToJira provider. In order to get all the open issues you can do:

      Let me know if you have any questions or feedback.

  18. Anonymous

    Why the XML-RPC is not as up-to-date as the Soap interface.

    I am using Python to work but unfortunately SOAP is not the good way (not maintained and old py). XML-RPC is the right way. One of the very usefull method to use is the 


    only available now under soap. When we can have it with xml-rpc