curl --request POST \
--url https://api.duvo.ai/v2/teams/{teamId}/invites/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"members": [
{
"email": "jsmith@example.com",
"role": "<string>"
}
],
"frontendUrl": "<string>"
}
'import requests
url = "https://api.duvo.ai/v2/teams/{teamId}/invites/bulk"
payload = {
"members": [
{
"email": "jsmith@example.com",
"role": "<string>"
}
],
"frontendUrl": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
members: [{email: 'jsmith@example.com', role: '<string>'}],
frontendUrl: '<string>'
})
};
fetch('https://api.duvo.ai/v2/teams/{teamId}/invites/bulk', 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.duvo.ai/v2/teams/{teamId}/invites/bulk",
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([
'members' => [
[
'email' => 'jsmith@example.com',
'role' => '<string>'
]
],
'frontendUrl' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.duvo.ai/v2/teams/{teamId}/invites/bulk"
payload := strings.NewReader("{\n \"members\": [\n {\n \"email\": \"jsmith@example.com\",\n \"role\": \"<string>\"\n }\n ],\n \"frontendUrl\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.duvo.ai/v2/teams/{teamId}/invites/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"members\": [\n {\n \"email\": \"jsmith@example.com\",\n \"role\": \"<string>\"\n }\n ],\n \"frontendUrl\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/teams/{teamId}/invites/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"members\": [\n {\n \"email\": \"jsmith@example.com\",\n \"role\": \"<string>\"\n }\n ],\n \"frontendUrl\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"succeeded": 123,
"skipped": 123,
"failed": 123
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Bulk Create Team Invites
Invite several people to a team in one call, emailing each invitation immediately. Returns per-batch counts: succeeded were invited, skipped were already on the team, already had a pending invitation, or were a duplicate of an earlier entry in the same batch, failed could not be emailed (those invitations are rolled back). The accept link is always built from the server-configured app origin.
curl --request POST \
--url https://api.duvo.ai/v2/teams/{teamId}/invites/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"members": [
{
"email": "jsmith@example.com",
"role": "<string>"
}
],
"frontendUrl": "<string>"
}
'import requests
url = "https://api.duvo.ai/v2/teams/{teamId}/invites/bulk"
payload = {
"members": [
{
"email": "jsmith@example.com",
"role": "<string>"
}
],
"frontendUrl": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
members: [{email: 'jsmith@example.com', role: '<string>'}],
frontendUrl: '<string>'
})
};
fetch('https://api.duvo.ai/v2/teams/{teamId}/invites/bulk', 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.duvo.ai/v2/teams/{teamId}/invites/bulk",
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([
'members' => [
[
'email' => 'jsmith@example.com',
'role' => '<string>'
]
],
'frontendUrl' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.duvo.ai/v2/teams/{teamId}/invites/bulk"
payload := strings.NewReader("{\n \"members\": [\n {\n \"email\": \"jsmith@example.com\",\n \"role\": \"<string>\"\n }\n ],\n \"frontendUrl\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.duvo.ai/v2/teams/{teamId}/invites/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"members\": [\n {\n \"email\": \"jsmith@example.com\",\n \"role\": \"<string>\"\n }\n ],\n \"frontendUrl\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/teams/{teamId}/invites/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"members\": [\n {\n \"email\": \"jsmith@example.com\",\n \"role\": \"<string>\"\n }\n ],\n \"frontendUrl\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"succeeded": 123,
"skipped": 123,
"failed": 123
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Authorizations
API key authentication. Get your API key from the Duvo dashboard.
Path Parameters
Body
People to invite, at most 50 per request. An email already on the team, or already holding a pending invitation, is skipped rather than failing the batch.
50Show child attributes
Show child attributes
Deprecated. Accepted for backward compatibility and IGNORED: the accept link is always built from the server-configured app origin, so a caller cannot point invitation emails at another host.
Was this page helpful?