curl --request GET \
--url https://api.zivio.net/api/v4/variation_orders/summary \
--header 'Authorization: Bearer <token>' \
--header 'zivio-tenant-id: <api-key>'import requests
url = "https://api.zivio.net/api/v4/variation_orders/summary"
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/variation_orders/summary', 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/variation_orders/summary",
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/variation_orders/summary"
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/variation_orders/summary")
.header("Authorization", "Bearer <token>")
.header("zivio-tenant-id", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zivio.net/api/v4/variation_orders/summary")
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{
"summary": {
"resource": "variation_orders",
"group_by": [
"status"
],
"measures": [
"rate"
],
"groups": [
{
"dimensions": [
{
"key": "status",
"id": "accepted",
"label": "Accepted"
}
],
"rate": {
"amount": "30000.00",
"currency": "GBP",
"cents": 3000000
},
"share": 100,
"variation_order_count": 4
}
],
"totals": {
"rate": {
"amount": "30000.00",
"currency": "GBP",
"cents": 3000000
},
"variation_order_count": 4
}
}
}{
"error": "invalid_token",
"error_description": "The access token provided is expired, revoked, malformed, or invalid for other reasons"
}{
"error": "insufficient_scope",
"error_description": "The request requires higher privileges than provided by the access token",
"required_scope": "variation_orders:read",
"provided_scopes": [
"welcome:read"
]
}{
"error": "measure 'sales_rate' is not permitted"
}Aggregate variation order value grouped by one or more dimensions
Pagination-free aggregation computed in SQL over the variation orders you are permitted to see, grouped by one or more dimensions and (always) currency. Returns exact per-currency subtotals plus optional converted roll-ups. Reuses the standard filter[...] grammar, including projects-backed drill-down filters filter[supplier|category|subcategory|tier3|owner|org]=<id>. Forbidden or unknown measures/dimensions/filters return 422.
curl --request GET \
--url https://api.zivio.net/api/v4/variation_orders/summary \
--header 'Authorization: Bearer <token>' \
--header 'zivio-tenant-id: <api-key>'import requests
url = "https://api.zivio.net/api/v4/variation_orders/summary"
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/variation_orders/summary', 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/variation_orders/summary",
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/variation_orders/summary"
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/variation_orders/summary")
.header("Authorization", "Bearer <token>")
.header("zivio-tenant-id", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zivio.net/api/v4/variation_orders/summary")
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{
"summary": {
"resource": "variation_orders",
"group_by": [
"status"
],
"measures": [
"rate"
],
"groups": [
{
"dimensions": [
{
"key": "status",
"id": "accepted",
"label": "Accepted"
}
],
"rate": {
"amount": "30000.00",
"currency": "GBP",
"cents": 3000000
},
"share": 100,
"variation_order_count": 4
}
],
"totals": {
"rate": {
"amount": "30000.00",
"currency": "GBP",
"cents": 3000000
},
"variation_order_count": 4
}
}
}{
"error": "invalid_token",
"error_description": "The access token provided is expired, revoked, malformed, or invalid for other reasons"
}{
"error": "insufficient_scope",
"error_description": "The request requires higher privileges than provided by the access token",
"required_scope": "variation_orders:read",
"provided_scopes": [
"welcome:read"
]
}{
"error": "measure 'sales_rate' is not permitted"
}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
One or more dimensions, comma-separated (max 4). Permitted: category, subcategory, tier3, supplier, owner, org, status, month, quarter, year.
Comma-separated measures (defaults per role if omitted): rate, original_rate, sales_rate, variation_order_count.
Date column used for month/quarter/year buckets.
created_at, submitted_at, approved_at, accepted_at, sent_at, due_on Optional ISO currency code for an indicative converted roll-up (per-currency subtotals remain exact).
Standard filter grammar, e.g. filter[status]=accepted, plus projects-backed drill-down filter[supplier]=88 / filter[category]=42 (comma for multiple).
Filter by the parent Project's tenant-defined custom-field values. Same operator grammar as cf: cf_project[cost_center]=CC-001, cf_project[department][in]=a,b, cf_project[po][exists]=.
Response
Variation order value summary grouped by the requested dimensions and currency
The response is of type object.

