curl --request GET \
--url https://api.projectcor.com/v1/hours \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.projectcor.com/v1/hours"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.projectcor.com/v1/hours', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://api.projectcor.com/v1/hours';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.projectcor.com/v1/hours",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.projectcor.com/v1/hours"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"total_hours": "4.0000000000000000",
"total_cost": 4714.285714285714,
"data": [
{
"id": 39517591,
"start": "2026-02-06 00:00:00",
"stop": "2026-02-06 02:00:00",
"duration": "2.0000000000000000",
"cost": 2357.142857142857,
"user_id": 8546,
"task_log_id": 11122850,
"project_id": null,
"client_id": null,
"created_at": "2026-02-06 12:50:12",
"status": "pending",
"status_changed_by": null,
"status_changed_at": null,
"type": "TASK",
"task_log_rework_id": null,
"comments": null,
"user": {
"id": 8546,
"first_name": "Daniel",
"last_name": "Guzman",
"picture": "https://user-images.projectcor.com/production/Upload/ProfilePictures/50x50/c-2336-248213441263.jpeg",
"remaining_hours": 88,
"timezone": "America/Buenos_Aires",
"gmt": "-03:00"
},
"client": null,
"project": null,
"task": {
"id": 11122850,
"title": "Armado de contenido v1",
"project_id": 878491,
"task_father": null,
"status": "nueva",
"father": null,
"project": {
"id": 878491,
"name": "Creacion de Contenido",
"client_id": 31405,
"contract_id": null,
"client": {
"id": 31405,
"name": "Cloud Solution",
"client_status_id": 1
},
"has_expired_contract": false
},
"labels": []
},
"userPosition": null,
"billInput": null
}
],
"total": "1",
"perPage": 20,
"page": "1",
"lastPage": 1
}Get Hours
Retrieves a paginated list of time entries. By default, responses are paginated with 20 items per page.
curl --request GET \
--url https://api.projectcor.com/v1/hours \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.projectcor.com/v1/hours"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.projectcor.com/v1/hours', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://api.projectcor.com/v1/hours';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.projectcor.com/v1/hours",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.projectcor.com/v1/hours"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"total_hours": "4.0000000000000000",
"total_cost": 4714.285714285714,
"data": [
{
"id": 39517591,
"start": "2026-02-06 00:00:00",
"stop": "2026-02-06 02:00:00",
"duration": "2.0000000000000000",
"cost": 2357.142857142857,
"user_id": 8546,
"task_log_id": 11122850,
"project_id": null,
"client_id": null,
"created_at": "2026-02-06 12:50:12",
"status": "pending",
"status_changed_by": null,
"status_changed_at": null,
"type": "TASK",
"task_log_rework_id": null,
"comments": null,
"user": {
"id": 8546,
"first_name": "Daniel",
"last_name": "Guzman",
"picture": "https://user-images.projectcor.com/production/Upload/ProfilePictures/50x50/c-2336-248213441263.jpeg",
"remaining_hours": 88,
"timezone": "America/Buenos_Aires",
"gmt": "-03:00"
},
"client": null,
"project": null,
"task": {
"id": 11122850,
"title": "Armado de contenido v1",
"project_id": 878491,
"task_father": null,
"status": "nueva",
"father": null,
"project": {
"id": 878491,
"name": "Creacion de Contenido",
"client_id": 31405,
"contract_id": null,
"client": {
"id": 31405,
"name": "Cloud Solution",
"client_status_id": 1
},
"has_expired_contract": false
},
"labels": []
},
"userPosition": null,
"billInput": null
}
],
"total": "1",
"perPage": 20,
"page": "1",
"lastPage": 1
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Page number (default: 1). Set to false to disable pagination.
Number of items per page (default: 20).
URL-encoded JSON object with filter criteria. Available fields: dateStart (YYYY-MM-DD), dateDeadline (YYYY-MM-DD), clients (array), projects (array), users (array), labels (array), teams (array).
URL-encoded JSON object for sorting. Example: {"by":"start","order":"ASC"}.
Response
Paginated list of time entries
Paginated response for time entries list
Total hours summed across all entries matching the query
Total cost summed across all entries matching the query
Total number of time entries
Number of items per page
Current page number
Last available page number
Array of time entries for the current page
Show child attributes
Show child attributes
Was this page helpful?

