curl --request POST \
--url https://api.zivio.net/api/v4/projects/{id}/questions/{question_id}/approve \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'zivio-tenant-id: <api-key>' \
--data '
{
"response": "<string>",
"visibility": "shared"
}
'import requests
url = "https://api.zivio.net/api/v4/projects/{id}/questions/{question_id}/approve"
payload = {
"response": "<string>",
"visibility": "shared"
}
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({response: '<string>', visibility: 'shared'})
};
fetch('https://api.zivio.net/api/v4/projects/{id}/questions/{question_id}/approve', 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}/questions/{question_id}/approve",
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([
'response' => '<string>',
'visibility' => 'shared'
]),
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/projects/{id}/questions/{question_id}/approve"
payload := strings.NewReader("{\n \"response\": \"<string>\",\n \"visibility\": \"shared\"\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/projects/{id}/questions/{question_id}/approve")
.header("Authorization", "Bearer <token>")
.header("zivio-tenant-id", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"response\": \"<string>\",\n \"visibility\": \"shared\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zivio.net/api/v4/projects/{id}/questions/{question_id}/approve")
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 \"response\": \"<string>\",\n \"visibility\": \"shared\"\n}"
response = http.request(request)
puts response.read_body{
"public_id": 4,
"ref": "Q-4",
"status": "approved",
"visibility": "shared",
"shared_with_all_suppliers": true
}{
"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": "project_questions:write",
"provided_scopes": [
"welcome:read"
]
}{
"message": "No question Q-4 on project 123"
}{
"error": "validation_failed",
"errors": [
"Response can't be blank"
]
}Approve a supplier question's answer — and optionally share it with all suppliers
Approves a responded question so its answer becomes visible to the asking supplier, mirroring the web UI approval step. Set visibility to shared to publish the answer to all invited suppliers. Approving a still-pending question with a response answers and approves in one call. Requires Q&A approval permission on the project. question_id is the per-project public question number (the “Q-N” value).
curl --request POST \
--url https://api.zivio.net/api/v4/projects/{id}/questions/{question_id}/approve \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'zivio-tenant-id: <api-key>' \
--data '
{
"response": "<string>",
"visibility": "shared"
}
'import requests
url = "https://api.zivio.net/api/v4/projects/{id}/questions/{question_id}/approve"
payload = {
"response": "<string>",
"visibility": "shared"
}
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({response: '<string>', visibility: 'shared'})
};
fetch('https://api.zivio.net/api/v4/projects/{id}/questions/{question_id}/approve', 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}/questions/{question_id}/approve",
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([
'response' => '<string>',
'visibility' => 'shared'
]),
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/projects/{id}/questions/{question_id}/approve"
payload := strings.NewReader("{\n \"response\": \"<string>\",\n \"visibility\": \"shared\"\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/projects/{id}/questions/{question_id}/approve")
.header("Authorization", "Bearer <token>")
.header("zivio-tenant-id", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"response\": \"<string>\",\n \"visibility\": \"shared\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zivio.net/api/v4/projects/{id}/questions/{question_id}/approve")
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 \"response\": \"<string>\",\n \"visibility\": \"shared\"\n}"
response = http.request(request)
puts response.read_body{
"public_id": 4,
"ref": "Q-4",
"status": "approved",
"visibility": "shared",
"shared_with_all_suppliers": true
}{
"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": "project_questions:write",
"provided_scopes": [
"welcome:read"
]
}{
"message": "No question Q-4 on project 123"
}{
"error": "validation_failed",
"errors": [
"Response can't be blank"
]
}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
Per-project public question number (the N in "Q-N").
Body
Response
The approved question
The response is of type object.

