
Connect Jira Tempo Rest Api with PHP
Ezeelive Technologies2025-04-10T17:24:12+05:30Jira is well-known team planning and management application. Thousands of companies using Jira to assign work and team activities. Jira provides facilities to add the plugin as per your requirement.Jira Tempo Plugin (commonly referred to as Tempo Timesheets, Tempo Planner, or Tempo Budgets) is a powerful suite of add-ons for Atlassian Jira that helps teams with time tracking, resource planning, and financial management. It’s widely used by agile teams, project managers, and finance departments.

Here’s a breakdown of the main Jira Tempo plugins:
Tempo Timesheets
- Log time manually or through calendar integrations.
- View and approve timesheets.
- Generate reports based on billable vs. non-billable hours.
- Track time against Jira issues, projects, or accounts.
- Integration with Google Calendar, Outlook, and mobile apps.
Tempo Planner
- Plan team workload and capacity.
- Visualize resource allocation in calendar views.
- Align planning with Jira projects and issues.
- Forecast future resource needs.
Tempo Budgets (Now part of Cost Tracker)
- Monitor costs and budgets.
- Track CapEx vs. OpEx.
- Forecast financial performance.
- Integrate with logged work from Tempo Timesheets.
Tempo Restful API builds in Java. We have built Jira Class inPHP to use Tempo restful APIs.
Steps for connecting Jira tempo rest API with PHP
1. Make sure CURL is enabled in your server or php.ini file (PHP has phpinfo function to check server setting). Check curl is working with below php code.
function isCurlInstalled() { if (in_array ('curl', get_loaded_extensions())) { return true; } else { return false; }}if (isCurlInstalled()) { echo "installed";} else { echo "NOT installed";}
2. Create Jira Class (You can create as per your convenient), 3 Private method and CURL functions to connect Jira
class Jira { private static $url = "http://192.168.0.59/";// Jira Tempo URL setup in API TOKEN private static $credential = 'ezeelivetechnologies:test123';// Jira Username and Password private static $tempoApiToken = '15ezeelive-7f3f-40f2-a95f-4521918ba183';// Jira Tempo Token Key // Static function to Get Data private static function getCURL($rest_url, $https = FALSE, $return_format = FALSE, $full_url = FALSE) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); if (empty($full_url)) curl_setopt($ch, CURLOPT_URL, Jira::$url . $rest_url); else curl_setopt($ch, CURLOPT_URL, $rest_url); curl_setopt($ch, CURLOPT_USERPWD, Jira::$credential); if (!empty($https)) { curl_setopt($ch, CURLOPT_SSLVERSION, 3); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); } if (!empty($return_format) && $return_format == 'json') curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); curl_close($ch); return $data; } // Static function to POST Data private static function postCURL($rest_url, $data = FALSE, $https = FALSE, $return_format = FALSE) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_URL, Jira::$url . $rest_url); curl_setopt($ch, CURLOPT_USERPWD, Jira::$credential); if (!empty($https)) { curl_setopt($ch, CURLOPT_SSLVERSION, 3); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); } if (!empty($return_format) && $return_format == 'json') curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_POST, 1); if (!empty($data)) curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); curl_close($ch); return $data; } public static function getAllJiraProjectsKey() { $return_data = array(); $rest_url = "rest/api/2/project"; $data = Jira::getCURL($rest_url, FALSE, $return_format = 'json'); if (!empty($data)) { $data = json_decode($data, TRUE); foreach ($data as $k => $dt) { $return_data[] = $dt['key']; } } return $return_data; } //...... //......}
3. Now its time to get all the User list associated with Your Jira Project
public static function getJiraProjectUsers($proj_key) { $return_data = array(); $rest_url = "rest/api/2/project/{$proj_key}/role"; $data = Jira::getCURL($rest_url, FALSE, $return_format = 'json'); if (!empty($data)) { $data = json_decode($data, TRUE); foreach ($data as $k => $dt) { if (!is_array($dt)) { $role_data = json_decode(Jira::getCURL($dt, FALSE, $return_format = 'json', TRUE), true); if (!empty($role_data['actors'])) { foreach ($role_data['actors'] as $v) { if(!empty($v['displayName'])){ $return_data[] = array( 'disp_name' => $v['displayName'], 'uid' => !empty($v['id']) ?$v['id']:'', 'jira_auth' => $jauth, 'usr_name' => $v['name'], 'rates' => $rates, 'bill_ty' => $bill_type ); } } } } } } return $return_data; }
4. Once we get all the Associated details from Jira Project. We can get all the Worklog by Jira User or Project Key.
public static function getJiraUserWorklogs($jiraUserName,$fromDate,$toDate) {// By Jira UserName $return_data = array(); $rest_url = "plugins/servlet/tempo-getWorklog/?addUserDetails=true&dateFrom={$data['sdate']}&dateTo={$data['edate']}&format=xml&diffOnly=false&tempoApiToken=" . Jira::$tempoApiToken . "&addIssueDetails=true&userName={$jiraUserName}";$return_data = Jira::getCURL($rest_url); return $return_data; } public static function getJiraProjectWorklogs($prjkey,$fromDate,$toDate) {// By Jira Project Key $return_data = array(); $rest_url = "plugins/servlet/tempo-getWorklog/?addUserDetails=true&dateFrom={$data['sdate']}&dateTo={$data['edate']}&format=xml&diffOnly=false&tempoApiToken=" . Jira::$tempoApiToken . "&addIssueDetails=true&projectKey={$prjkey}";$return_data = Jira::getCURL($rest_url); return $return_data; }
5. Final the complete class looks like
class Jira { private static $url = "http://192.168.0.59/";// Tempo URL setup in API TOKEN private static $credential = 'ezeelivetechnologies:test123';// Jira Username and Password private static $tempoApiToken = '15ezeelive-7f3f-40f2-a95f-4521918ba183';// Tempo Token Key // Static function to Get Data private static function getCURL($rest_url, $https = FALSE, $return_format = FALSE, $full_url = FALSE) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); if (empty($full_url)) curl_setopt($ch, CURLOPT_URL, Jira::$url . $rest_url); else curl_setopt($ch, CURLOPT_URL, $rest_url); curl_setopt($ch, CURLOPT_USERPWD, Jira::$credential); if (!empty($https)) { curl_setopt($ch, CURLOPT_SSLVERSION, 3); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); } if (!empty($return_format) && $return_format == 'json') curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); curl_close($ch); return $data; } // Static function to POST Data private static function postCURL($rest_url, $data = FALSE, $https = FALSE, $return_format = FALSE) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_URL, Jira::$url . $rest_url); curl_setopt($ch, CURLOPT_USERPWD, Jira::$credential); if (!empty($https)) { curl_setopt($ch, CURLOPT_SSLVERSION, 3); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); } if (!empty($return_format) && $return_format == 'json') curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_POST, 1); if (!empty($data)) curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); curl_close($ch); return $data; } public static function getAllJiraProjectsKey() { $return_data = array(); $rest_url = "rest/api/2/project"; $data = Jira::getCURL($rest_url, FALSE, $return_format = 'json'); if (!empty($data)) { $data = json_decode($data, TRUE); foreach ($data as $k => $dt) { $return_data[] = $dt['key']; } } return $return_data; } public static function getJiraProjectUsers($proj_key) { $return_data = array(); $rest_url = "rest/api/2/project/{$proj_key}/role"; $data = Jira::getCURL($rest_url, FALSE, $return_format = 'json'); if (!empty($data)) { $data = json_decode($data, TRUE); foreach ($data as $k => $dt) { if (!is_array($dt)) { $role_data = json_decode(Jira::getCURL($dt, FALSE, $return_format = 'json', TRUE), true); if (!empty($role_data['actors'])) { foreach ($role_data['actors'] as $v) { if(!empty($v['displayName'])){ $return_data[] = array( 'disp_name' => $v['displayName'], 'uid' => !empty($v['id']) ?$v['id']:'', 'jira_auth' => $jauth, 'usr_name' => $v['name'], 'rates' => $rates, 'bill_ty' => $bill_type ); } } } } } } return $return_data; } public static function getJiraUserWorklogs($jiraUserName,$fromDate,$toDate) {// By Jira UserName $return_data = array(); $rest_url = "plugins/servlet/tempo-getWorklog/?addUserDetails=true&dateFrom={$data['sdate']}&dateTo={$data['edate']}&format=xml&diffOnly=false&tempoApiToken=" . Jira::$tempoApiToken . "&addIssueDetails=true&userName={$jiraUserName}";$return_data = Jira::getCURL($rest_url); return $return_data; } public static function getJiraProjectWorklogs($prjkey,$fromDate,$toDate) {// By Jira Project Key $return_data = array(); $rest_url = "plugins/servlet/tempo-getWorklog/?addUserDetails=true&dateFrom={$data['sdate']}&dateTo={$data['edate']}&format=xml&diffOnly=false&tempoApiToken=" . Jira::$tempoApiToken . "&addIssueDetails=true&projectKey={$prjkey}";$return_data = Jira::getCURL($rest_url); return $return_data; } }
Integrating Jira Tempo via API can offer various possibilities for automating workflows, extracting data, or creating custom solutions tailored to your organization’s needs. Tempo provides REST APIs that allow you to interact with Tempo’s functionalities programmatically.
If you have any query, suggestion or help on this Jira tempo rest API, please comment or mail us on info[at]ezeelive[dot]com.
Leave a ReplyCancel reply
RelatedPosts

Advantages of PHP Web Development
Now a day PHP has to turn out to be the most demanding web programming language for web development. There...read more

Advantages PHP Scripting Language in 2025
PHP is a server-side scripting language used to develop web applications and websites. PHP is world’s most popular programming language,...read more

Yii Framework 1.1 (PHP) Explained : A Practical Approach Yii 1 Framework
Hey friends..I’m using Yii 1.1 Framework for quite a few days now, and things which I found impressive about Yii...read more

Why developer love PHP Web Development in 2025?
We are back again with most famous technologies which I think all know in this software development technological world called...read more

10 Reasons why Codeigniter MVC framework is better than other PHP Frameworks
Highlights of Codeigniter MVC Framework: Simple and bother free relocation from server facilitating to server facilitating. Easy to learn, embrace...read more

PHP Future – Is PHP Scripting Language dying in 2025?
PHP Future - In 1995 PHP came into existence as one of the most renowned server-side scripting languages that were...read more

PHP Development Company India
HeadlinesWhy should hire PHP Development Company in Indiaread more

Create custom params file in yii framework
Create custom params in yii frameworkYii Framework comes with powerful inbuilt features special create custom params in yii framework...read more

What makes Doctrine ORM the best in 2025?
What is ORM? ORM stands for the object-relational mapping. ORM is a programming technique used to convert the data between incompatible...read more