curl --request GET \
--url https://api.zivio.net/api/v4/tasks \
--header 'Authorization: Bearer <token>' \
--header 'zivio-tenant-id: <api-key>'import requests
url = "https://api.zivio.net/api/v4/tasks"
headers = {
"Authorization": "Bearer <token>",
"zivio-tenant-id": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {Authorization: 'Bearer <token>', 'zivio-tenant-id': '<api-key>'}
};
fetch('https://api.zivio.net/api/v4/tasks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.zivio.net/api/v4/tasks",
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>",
"zivio-tenant-id: <api-key>"
],
]);
$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.zivio.net/api/v4/tasks"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("zivio-tenant-id", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.zivio.net/api/v4/tasks")
.header("Authorization", "Bearer <token>")
.header("zivio-tenant-id", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zivio.net/api/v4/tasks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
request["zivio-tenant-id"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"tasks": [
{
"id": 101,
"name": "Acme Corporation",
"description": "Complete redesign of corporate website with modern UX",
"status": "completed",
"due_on": "2024-01-16",
"overdue": false,
"taskable_type": "Example taskable_type",
"taskable_id": 501,
"taskable_scope": "Example taskable_scope",
"subject": {
"type": "JobTriggeredApprovalStep",
"id": 55,
"resource": {
"type": "Project",
"id": 123
},
"project_id": 123,
"project_title": "Website Redesign",
"supplier_name": "Acme Consulting"
},
"api_actions": [
{
"method": "POST",
"path": "/api/v4/projects/123/approve"
}
],
"completed_at": "2024-01-16T10:30:00+00:00",
"completed_by": {
"id": 7,
"name": "Jane Doe"
},
"assignees": [
{
"id": 7,
"name": "Jane Doe",
"dismissed": false
}
],
"dismissed": false,
"ui_path": "/hiring/projects/123",
"created_at": "2024-01-16T10:30:00+00:00",
"updated_at": "2024-01-16T10:30:00+00:00"
},
{
"id": 102,
"name": "Global Services Ltd",
"description": "Native iOS and Android application",
"status": "cancelled",
"due_on": "2024-01-17",
"overdue": false,
"taskable_type": "Example taskable_type",
"taskable_id": 502,
"taskable_scope": "Example taskable_scope",
"subject": {
"type": "JobTriggeredApprovalStep",
"id": 55,
"resource": {
"type": "Project",
"id": 123
},
"project_id": 123,
"project_title": "Website Redesign",
"supplier_name": "Acme Consulting"
},
"api_actions": [
{
"method": "POST",
"path": "/api/v4/projects/123/approve"
}
],
"completed_at": "2024-01-17T10:30:00+00:00",
"completed_by": {
"id": 7,
"name": "Jane Doe"
},
"assignees": [
{
"id": 7,
"name": "Jane Doe",
"dismissed": false
}
],
"dismissed": false,
"ui_path": "/hiring/projects/123",
"created_at": "2024-01-17T10:30:00+00:00",
"updated_at": "2024-01-17T10:30:00+00:00"
}
]
}List Tasks
The acting user’s work queue: the outstanding tasks (to-do items, things that need their attention) the system has assigned to them — project approvals, questions to answer, invoices, milestones and variation orders to review, documents to check. By default returns only active tasks (pending and not dismissed by the user), ordered by due date; use filter[state]=all|completed|dismissed to widen it and filter[overdue]=true to triage. Each task carries subject (the record and project it is about) and api_actions (the V4 operations that action it); actioning the underlying record completes the task automatically a few seconds later, so a just-actioned task may briefly still read pending. Start with GET /tasks/summary for counts.
Filtering
Use the filter[<attribute>] parameter to filter results. Multiple filters are combined with AND logic.
Basic Examples
# Equality (implicit)
GET /api/v4/tasks?filter[status]=pending
# Multiple values (implicit IN)
GET /api/v4/tasks?filter[status]=pending,cancelled
# With explicit operator
GET /api/v4/tasks?filter[created_at][gte]=2024-01-01
# Range query
GET /api/v4/tasks?filter[completed_by_id][between]=10,100
# Multiple filters (AND)
GET /api/v4/tasks?filter[status]=pending&filter[completed_by_id][gte]=10
Available Attributes
| Attribute | Type | Operators | Permitted Values |
|---|---|---|---|
| completed_at | datetime | eq, not_eq, gt, gte, lt, lte, between | - |
| completed_by_id | integer | eq, not_eq, in, not_in, gt, gte, lt, lte, between | - |
| created_at | datetime | eq, not_eq, gt, gte, lt, lte, between | - |
| description | string | eq, not_eq, in, not_in, like, not_like | - |
| dismissed | boolean | eq | true, false |
| due_on | date | eq, not_eq, gt, gte, lt, lte, between | - |
| id | integer | eq, not_eq, in, not_in, gt, gte, lt, lte, between | - |
| name | string | eq, not_eq, in, not_in, like, not_like | - |
| overdue | boolean | eq | true, false |
| state | string | eq | active, all, completed, dismissed |
| status | string | eq, not_eq, in, not_in | pending, completed, cancelled |
| taskable_id | integer | eq, not_eq, in, not_in, gt, gte, lt, lte, between | - |
| taskable_scope | string | eq, not_eq, in, not_in, like, not_like | - |
| taskable_type | string | eq, not_eq, in, not_in, like, not_like | - |
| updated_at | datetime | eq, not_eq, gt, gte, lt, lte, between | - |
OR Conditions
Use or[group] to combine filter groups with OR logic. Filters within a group are ANDed:
# Simple OR
GET /api/v4/tasks?or[1][status]=completed&or[2][status]=pending
# Complex OR (status=completed AND completed_by_id>=10) OR (status=pending)
GET /api/v4/tasks?or[1][status]=completed&or[1][completed_by_id][gte]=10&or[2][status]=pending
Sorting
Use sort[<attribute>] to order results. Default direction is ascending.
# Ascending (implicit)
GET /api/v4/tasks?sort[created_at]=
# Descending
GET /api/v4/tasks?sort[created_at]=desc
# Combined with filters
GET /api/v4/tasks?filter[status]=pending&sort[created_at]=desc
curl --request GET \
--url https://api.zivio.net/api/v4/tasks \
--header 'Authorization: Bearer <token>' \
--header 'zivio-tenant-id: <api-key>'import requests
url = "https://api.zivio.net/api/v4/tasks"
headers = {
"Authorization": "Bearer <token>",
"zivio-tenant-id": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {Authorization: 'Bearer <token>', 'zivio-tenant-id': '<api-key>'}
};
fetch('https://api.zivio.net/api/v4/tasks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.zivio.net/api/v4/tasks",
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>",
"zivio-tenant-id: <api-key>"
],
]);
$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.zivio.net/api/v4/tasks"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("zivio-tenant-id", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.zivio.net/api/v4/tasks")
.header("Authorization", "Bearer <token>")
.header("zivio-tenant-id", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zivio.net/api/v4/tasks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
request["zivio-tenant-id"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"tasks": [
{
"id": 101,
"name": "Acme Corporation",
"description": "Complete redesign of corporate website with modern UX",
"status": "completed",
"due_on": "2024-01-16",
"overdue": false,
"taskable_type": "Example taskable_type",
"taskable_id": 501,
"taskable_scope": "Example taskable_scope",
"subject": {
"type": "JobTriggeredApprovalStep",
"id": 55,
"resource": {
"type": "Project",
"id": 123
},
"project_id": 123,
"project_title": "Website Redesign",
"supplier_name": "Acme Consulting"
},
"api_actions": [
{
"method": "POST",
"path": "/api/v4/projects/123/approve"
}
],
"completed_at": "2024-01-16T10:30:00+00:00",
"completed_by": {
"id": 7,
"name": "Jane Doe"
},
"assignees": [
{
"id": 7,
"name": "Jane Doe",
"dismissed": false
}
],
"dismissed": false,
"ui_path": "/hiring/projects/123",
"created_at": "2024-01-16T10:30:00+00:00",
"updated_at": "2024-01-16T10:30:00+00:00"
},
{
"id": 102,
"name": "Global Services Ltd",
"description": "Native iOS and Android application",
"status": "cancelled",
"due_on": "2024-01-17",
"overdue": false,
"taskable_type": "Example taskable_type",
"taskable_id": 502,
"taskable_scope": "Example taskable_scope",
"subject": {
"type": "JobTriggeredApprovalStep",
"id": 55,
"resource": {
"type": "Project",
"id": 123
},
"project_id": 123,
"project_title": "Website Redesign",
"supplier_name": "Acme Consulting"
},
"api_actions": [
{
"method": "POST",
"path": "/api/v4/projects/123/approve"
}
],
"completed_at": "2024-01-17T10:30:00+00:00",
"completed_by": {
"id": 7,
"name": "Jane Doe"
},
"assignees": [
{
"id": 7,
"name": "Jane Doe",
"dismissed": false
}
],
"dismissed": false,
"ui_path": "/hiring/projects/123",
"created_at": "2024-01-17T10:30:00+00:00",
"updated_at": "2024-01-17T10:30:00+00:00"
}
]
}Authorizations
OAuth 2.0 client credentials. The access token from POST /oauth/token is sent as a bearer token. Request only the scopes you need.
Your Zivio organisation identifier. The regional API endpoints serve every Zivio organisation, so each request must identify yours.
Query Parameters
Page number for pagination
Number of results per page (max 100)
x <= 100Filterable attributes:
integer (operators: eq, not_eq, in, not_in, gt, gte, lt, lte, between): completed_by_id, id, taskable_id datetime (operators: eq, not_eq, gt, gte, lt, lte, between): completed_at, created_at, updated_at string (operators: eq, not_eq, in, not_in, like, not_like): description, name, state (one of: active = pending and not dismissed by you (the default, and the UI's task list); all = every task ever assigned to you, whatever its status; completed = completed tasks; dismissed = tasks you have dismissed from your list), status (one of: pending = still to be actioned; completed = actioned, by any assignee or automatically when the underlying work was done; cancelled = no longer relevant (the underlying record moved on)), taskable_scope, taskable_type date (operators: eq, not_eq, gt, gte, lt, lte, between): due_on boolean (operators: eq): dismissed (one of: true = dismissed from your list (other assignees still see it); false = still on your list), overdue (one of: true = pending and past its due date; false = not overdue (due today or later, no due date, or no longer pending))
Note: like is a case-insensitive substring match — pass the bare term (filter[title][like]=redesign). Do not add % wildcards; they are not needed.
OR condition groups. Filters within a group are ANDed; groups are ORed.
Syntax: or[group_key][<attribute>]=value or or[group_key][<attribute>][operator]=value
Examples:
- Simple OR:
or[1][state]=draft&or[2][state]=pending - Complex:
or[1][state]=draft&or[1][budget][gte]=50000&or[2][state]=closed - With custom fields:
or[1][cf][priority]=high&or[2][state]=pending
Group keys can be any string (1, 2, a, b, etc.) - they just need to be unique.
Sort results by attribute. Direction defaults to ascending.
Syntax: sort[<attribute>]= (ascending) or sort[<attribute>]=desc (descending)
Sortable attributes: completed_at, completed_by_id, created_at, description, dismissed, due_on, id, name, overdue, state, status, taskable_id, taskable_scope, taskable_type, updated_at
Examples:
- Ascending:
sort[created_at]=orsort[created_at]=asc - Descending:
sort[created_at]=desc
Response
List of tasks
Show child attributes
Show child attributes

