curl --request POST \
--url https://api.zivio.net/api/v4/projects/{id}/invitations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'zivio-tenant-id: <api-key>' \
--data '
{
"supplier_id": 45,
"supplier_list_id": 7,
"message": "We would value your proposal — submissions close in two weeks."
}
'import requests
url = "https://api.zivio.net/api/v4/projects/{id}/invitations"
payload = {
"supplier_id": 45,
"supplier_list_id": 7,
"message": "We would value your proposal — submissions close in two weeks."
}
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({
supplier_id: 45,
supplier_list_id: 7,
message: 'We would value your proposal — submissions close in two weeks.'
})
};
fetch('https://api.zivio.net/api/v4/projects/{id}/invitations', 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}/invitations",
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([
'supplier_id' => 45,
'supplier_list_id' => 7,
'message' => 'We would value your proposal — submissions close in two weeks.'
]),
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}/invitations"
payload := strings.NewReader("{\n \"supplier_id\": 45,\n \"supplier_list_id\": 7,\n \"message\": \"We would value your proposal — submissions close in two weeks.\"\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}/invitations")
.header("Authorization", "Bearer <token>")
.header("zivio-tenant-id", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"supplier_id\": 45,\n \"supplier_list_id\": 7,\n \"message\": \"We would value your proposal — submissions close in two weeks.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zivio.net/api/v4/projects/{id}/invitations")
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 \"supplier_id\": 45,\n \"supplier_list_id\": 7,\n \"message\": \"We would value your proposal — submissions close in two weeks.\"\n}"
response = http.request(request)
puts response.read_body{
"message": "Supplier 45 invited to project 123",
"already_invited": false,
"invitation": {
"id": 9,
"supplier": {
"id": 45,
"name": "Acme Consulting"
},
"match_type": "invite",
"proposal_submitted": false
}
}{
"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_invitations:write",
"provided_scopes": [
"welcome:read"
]
}{
"message": "Supplier not found"
}{
"message": "supplier_id or supplier_list_id is required"
}Invite a supplier — or a whole supplier list (talent pool) — to bid on a project
Sends an invitation to tender on an open project (state new), mirroring the web UI invite actions. Pass supplier_id to invite one supplier directly, or supplier_list_id (a supplier list / talent pool id from GET /supplier_lists) to bulk-invite every supplier in the list — suppliers whose risk level exceeds the project’s threshold are skipped and reported back. An optional message is included in the invitation. Inviting an already-invited supplier is safe: the response flags already_invited instead of duplicating.
curl --request POST \
--url https://api.zivio.net/api/v4/projects/{id}/invitations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'zivio-tenant-id: <api-key>' \
--data '
{
"supplier_id": 45,
"supplier_list_id": 7,
"message": "We would value your proposal — submissions close in two weeks."
}
'import requests
url = "https://api.zivio.net/api/v4/projects/{id}/invitations"
payload = {
"supplier_id": 45,
"supplier_list_id": 7,
"message": "We would value your proposal — submissions close in two weeks."
}
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({
supplier_id: 45,
supplier_list_id: 7,
message: 'We would value your proposal — submissions close in two weeks.'
})
};
fetch('https://api.zivio.net/api/v4/projects/{id}/invitations', 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}/invitations",
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([
'supplier_id' => 45,
'supplier_list_id' => 7,
'message' => 'We would value your proposal — submissions close in two weeks.'
]),
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}/invitations"
payload := strings.NewReader("{\n \"supplier_id\": 45,\n \"supplier_list_id\": 7,\n \"message\": \"We would value your proposal — submissions close in two weeks.\"\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}/invitations")
.header("Authorization", "Bearer <token>")
.header("zivio-tenant-id", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"supplier_id\": 45,\n \"supplier_list_id\": 7,\n \"message\": \"We would value your proposal — submissions close in two weeks.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zivio.net/api/v4/projects/{id}/invitations")
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 \"supplier_id\": 45,\n \"supplier_list_id\": 7,\n \"message\": \"We would value your proposal — submissions close in two weeks.\"\n}"
response = http.request(request)
puts response.read_body{
"message": "Supplier 45 invited to project 123",
"already_invited": false,
"invitation": {
"id": 9,
"supplier": {
"id": 45,
"name": "Acme Consulting"
},
"match_type": "invite",
"proposal_submitted": false
}
}{
"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_invitations:write",
"provided_scopes": [
"welcome:read"
]
}{
"message": "Supplier not found"
}{
"message": "supplier_id or supplier_list_id is required"
}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
Body
Supplier to invite directly. Provide this or supplier_list_id.
45
Supplier list (talent pool) whose members should all be invited. Provide this or supplier_id.
7
Optional message included in the invitation to the supplier(s).
"We would value your proposal — submissions close in two weeks."
Response
Invitation(s) sent; direct invites return the invitation, list invites a summary
The response is of type object.

