curl --request POST \
--url https://api.zivio.net/api/v4/bids/{id}/cost_score_override \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'zivio-tenant-id: <api-key>' \
--data '
{
"cost_score_override_percentage": 15
}
'import requests
url = "https://api.zivio.net/api/v4/bids/{id}/cost_score_override"
payload = { "cost_score_override_percentage": 15 }
headers = {
"Authorization": "Bearer <token>",
"zivio-tenant-id": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'zivio-tenant-id': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({cost_score_override_percentage: 15})
};
fetch('https://api.zivio.net/api/v4/bids/{id}/cost_score_override', 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/bids/{id}/cost_score_override",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'cost_score_override_percentage' => 15
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.zivio.net/api/v4/bids/{id}/cost_score_override"
payload := strings.NewReader("{\n \"cost_score_override_percentage\": 15\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("zivio-tenant-id", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.zivio.net/api/v4/bids/{id}/cost_score_override")
.header("Authorization", "Bearer <token>")
.header("zivio-tenant-id", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"cost_score_override_percentage\": 15\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zivio.net/api/v4/bids/{id}/cost_score_override")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["zivio-tenant-id"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"cost_score_override_percentage\": 15\n}"
response = http.request(request)
puts response.read_body{
"message": "Cost score override set to 15.0% for proposal 9",
"capped_to_allocation": false,
"proposal": {
"bid_id": 9,
"cost_score_percentage": 15,
"cost_score_source": "override",
"total_score_percentage": 79
}
}{
"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:write",
"provided_scopes": [
"welcome:read"
]
}{
"error": "invalid_parameter",
"message": "cost_score_override_percentage must be a percentage between 0 and 100 (got \"high\")"
}Override (moderate) a proposal's automatically calculated cost score
Replaces the automatic, price-relative cost score with a moderated percentage, mirroring the web UI’s cost score override. The value is a percentage of the total available score and is capped at the project’s cost score allocation — the response reports the stored value and whether it was capped. Send null to clear the override and fall back to the automatic score. Requires cost-score moderation permission on the project.
curl --request POST \
--url https://api.zivio.net/api/v4/bids/{id}/cost_score_override \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'zivio-tenant-id: <api-key>' \
--data '
{
"cost_score_override_percentage": 15
}
'import requests
url = "https://api.zivio.net/api/v4/bids/{id}/cost_score_override"
payload = { "cost_score_override_percentage": 15 }
headers = {
"Authorization": "Bearer <token>",
"zivio-tenant-id": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'zivio-tenant-id': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({cost_score_override_percentage: 15})
};
fetch('https://api.zivio.net/api/v4/bids/{id}/cost_score_override', 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/bids/{id}/cost_score_override",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'cost_score_override_percentage' => 15
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.zivio.net/api/v4/bids/{id}/cost_score_override"
payload := strings.NewReader("{\n \"cost_score_override_percentage\": 15\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("zivio-tenant-id", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.zivio.net/api/v4/bids/{id}/cost_score_override")
.header("Authorization", "Bearer <token>")
.header("zivio-tenant-id", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"cost_score_override_percentage\": 15\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zivio.net/api/v4/bids/{id}/cost_score_override")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["zivio-tenant-id"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"cost_score_override_percentage\": 15\n}"
response = http.request(request)
puts response.read_body{
"message": "Cost score override set to 15.0% for proposal 9",
"capped_to_allocation": false,
"proposal": {
"bid_id": 9,
"cost_score_percentage": 15,
"cost_score_source": "override",
"total_score_percentage": 79
}
}{
"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:write",
"provided_scopes": [
"welcome:read"
]
}{
"error": "invalid_parameter",
"message": "cost_score_override_percentage must be a percentage between 0 and 100 (got \"high\")"
}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
Bid ID
Body
Cost score as a percentage (0-100), capped at the project's cost score allocation. null clears the override.
15
Response
Override stored; the proposal's recalculated scorecard is returned
The response is of type object.

