curl --request GET \
--url https://api.zivio.net/api/v4/projects/{id}/evaluations \
--header 'Authorization: Bearer <token>' \
--header 'zivio-tenant-id: <api-key>'import requests
url = "https://api.zivio.net/api/v4/projects/{id}/evaluations"
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/projects/{id}/evaluations', 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/projects/{id}/evaluations",
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/projects/{id}/evaluations"
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/projects/{id}/evaluations")
.header("Authorization", "Bearer <token>")
.header("zivio-tenant-id", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zivio.net/api/v4/projects/{id}/evaluations")
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{
"project_id": 123,
"project_title": "Website Redesign",
"state": "new",
"criteria_weightings_valid": true,
"last_evaluated_at": "2026-07-01T12:00:00Z",
"criteria_groups": [
{
"id": 5,
"name": "Cost",
"type": "cost",
"weighting": 20,
"criteria": []
},
{
"id": 6,
"name": "Quality",
"type": "evaluated",
"weighting": 80,
"criteria": [
{
"id": 11,
"description": "Technical Approach",
"weighting": 100
}
]
}
],
"proposals": [
{
"bid_id": 9,
"rank": 1,
"supplier": {
"id": 45,
"name": "Acme Consulting"
},
"total_score_percentage": 84,
"quality_score_percentage": 64,
"cost_score_percentage": 20,
"cost_score_source": "auto",
"scores": [
{
"criterion_id": 11,
"criterion": "Technical Approach",
"score": 8,
"max_score": 10,
"notes": "Strong discovery phase.",
"weighted_score": 80
}
],
"unscored_criteria": []
}
]
}{
"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": "bid_evaluations:read",
"provided_scopes": [
"welcome:read"
]
}{
"error": "scoring_disabled",
"message": "Quality scoring is not enabled for project 123"
}Evaluation scorecards for every proposal on a project (scores, weightings, ranking)
Returns the project’s award criteria — the cost group and each evaluated group with its weighting and sub-criteria — together with every active proposal’s scorecard: the reviewer score and notes per criterion, the quality/cost/total score percentages, and the resulting rank (highest total score first). Use this to compare proposals against the evaluation criteria, to see which criteria still need scoring (unscored_criteria), and to find the criterion_id values needed to submit scores with POST /bids//scores.
curl --request GET \
--url https://api.zivio.net/api/v4/projects/{id}/evaluations \
--header 'Authorization: Bearer <token>' \
--header 'zivio-tenant-id: <api-key>'import requests
url = "https://api.zivio.net/api/v4/projects/{id}/evaluations"
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/projects/{id}/evaluations', 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/projects/{id}/evaluations",
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/projects/{id}/evaluations"
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/projects/{id}/evaluations")
.header("Authorization", "Bearer <token>")
.header("zivio-tenant-id", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zivio.net/api/v4/projects/{id}/evaluations")
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{
"project_id": 123,
"project_title": "Website Redesign",
"state": "new",
"criteria_weightings_valid": true,
"last_evaluated_at": "2026-07-01T12:00:00Z",
"criteria_groups": [
{
"id": 5,
"name": "Cost",
"type": "cost",
"weighting": 20,
"criteria": []
},
{
"id": 6,
"name": "Quality",
"type": "evaluated",
"weighting": 80,
"criteria": [
{
"id": 11,
"description": "Technical Approach",
"weighting": 100
}
]
}
],
"proposals": [
{
"bid_id": 9,
"rank": 1,
"supplier": {
"id": 45,
"name": "Acme Consulting"
},
"total_score_percentage": 84,
"quality_score_percentage": 64,
"cost_score_percentage": 20,
"cost_score_source": "auto",
"scores": [
{
"criterion_id": 11,
"criterion": "Technical Approach",
"score": 8,
"max_score": 10,
"notes": "Strong discovery phase.",
"weighted_score": 80
}
],
"unscored_criteria": []
}
]
}{
"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": "bid_evaluations:read",
"provided_scopes": [
"welcome:read"
]
}{
"error": "scoring_disabled",
"message": "Quality scoring is not enabled for project 123"
}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.
Path Parameters
Project ID
Response
Criteria and ranked proposal scorecards
The response is of type object.

