Clone wiki

Atlassian.Net SDK / Home

Atlassian.NET SDK

Contains utilities for interacting with Atlassian JIRA.



This project is licensed under BSD.

Dependencies & Requirements


  • This project began in 2010 during a ShipIt day at Atlassian with provider to query Jira issues using LINQ syntax. Over time it grew to add many more operations on top of the JIRA SOAP API. Support of REST API was added on v4.0 and support of SOAP API was dropped on v8.0.

Related Projects

  • VS Jira, a VisualStudio Extension that adds tools to interact with JIRA servers.

Signed Version

The Atlassian.SDK.Signed package contains a signed version of the assembly, however it has the following limitations:

  • It references the RestSharpSigned package, which is not up-to-date to the official RestSharp package.
  • It only supports net452 framework (does not support .netcore).


Query Issues

A LinqToJIRA provider allows to query a JIRA server using Linq syntax:

 // create a connection to JIRA using the Rest client
 var jira = Jira.CreateRestClient("http://<your_jira_server>", "<user>", "<password>");

 // use LINQ syntax to retrieve issues
 var issues = from i in jira.Issues.Queryable
              where i.Assignee == "admin" && i.Priority == "Major"
              orderby i.Created
              select i;

By default, string comparisons are translated using the JIRA contains operator ('~'). A literal match can be forced by wrapping the string with the LiteralMatch class:

 var issues = from i in jira.Issues.Queryable
              where i.Summary == new LiteralMatch("My Title")
              select i;

See the JQL Page for a list of supported fields and operators.

Create Issue

var issue = jira.CreateIssue("My Project");
issue.Type = "Bug";
issue.Priority = "Major";
issue.Summary = "Issue Summary";

await issue.SaveChangesAsync();

Update Issue

var issue = await jira.Issues.GetIssueAsync("TST-5");
issue.Summary = "Updated Summary";

await issue.SaveChangesAsync();

Auto fetch field values

var issue = await jira.Issues.GetIssueAsync("TST-5");

Console.WriteLine(issue.Priority.Name);      // returns the string of the priority field, for example "Critical"
Console.WriteLine(issue.Type.Name);          // returns the string of the issue type field, for example "Bug"
Console.WriteLine(issue["My CustomField"]);  // returns the string of the custom field named "My CustomField"

Custom Fields

var issue = (from i in jira.Issues.Queryable
              where i["My CustomField"] == "Custom Field Value"
              select i).First();

issue["My CustomField"] = "Updated Field";  // No need to know the id of the custom field.
issue.CustomFields.AddArray("Custom Labels Field", "label1", "label2"); // Adds an array value to a custom field.
issue.CustomFields.AddCascadingSelectField("Custom Cascading Select Field", "Option3"); // Adds a value to a cascading select field.

await issue.SaveChangesAsync();

var cascadingSelect = issue.CustomFields.GetCascadingSelectField("Custom Cascading Select Field"); // Gets the value of a cascading field.

For more information and advanced scenarios see the Custom Fields page.


var issue = await jira.Issues.GetIssueAsync("TST-5");

// get attachments
var attachments = await issue.GetAttachmentsAsync();

// download an attachment
var tempFile = Path.GetTempFileName();
// upload an attachment
await issue.AddAttachmentsAsync("fileToAdd.txt");


var issue = await jira.Issues.GetIssueAsync("TST-5");

// get comments
var comments = await issue.GetCommentsAsync();

// add comment
await issue.AddCommentAsync("new comment");


var issue = await jira.Issues.GetIssueAsync("TST-5");

// add a worklog
await issue.AddWorklogAsync("1h");

// add worklog with new remaining estimate
await issue.AddWorklogAsync("1m", WorklogStrategy.NewRemainingEstimate, "4h");

// retrieve worklogs
var worklogs = await issue.GetWorklogsAsync();

Create Sub-Task

var issue = jira.CreateIssue("My Project", "PARENTISSUE-1");
issue.Type = "5"; // the id of the sub-task issue type
issue.Summary = "A sub task";

await issue.SaveChangesAsync();

Workflow transitions

var issue = await jira.Issues.GetIssueAsync("TST-5");
issue.Resolution = "Won't Fix";

await issue.WorkflowTransitionAsync(WorkflowActions.Resolve);

How to Debug Problems

See the debug page for more information.

How to Run Integration Tests

See the integration tests page for more information.


All features tested on JIRA v7.1. If you run into problems using a previous version of JIRA let me know.

Please open an issue if you encounter a bug, have suggestions or feature requests. I'll do my best to address them.

Federico Silva Armas