curl --request POST \
--url https://app.sideshift.app/api/oauth/v1/team/invites/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "jsmith@example.com",
"inviteCode": "<string>",
"companyName": "<string>",
"role": "<string>"
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/team/invites/send"
payload = {
"email": "jsmith@example.com",
"inviteCode": "<string>",
"companyName": "<string>",
"role": "<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({
email: 'jsmith@example.com',
inviteCode: '<string>',
companyName: '<string>',
role: '<string>'
})
};
fetch('https://app.sideshift.app/api/oauth/v1/team/invites/send', 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://app.sideshift.app/api/oauth/v1/team/invites/send",
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([
'email' => 'jsmith@example.com',
'inviteCode' => '<string>',
'companyName' => '<string>',
'role' => '<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://app.sideshift.app/api/oauth/v1/team/invites/send"
payload := strings.NewReader("{\n \"email\": \"jsmith@example.com\",\n \"inviteCode\": \"<string>\",\n \"companyName\": \"<string>\",\n \"role\": \"<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://app.sideshift.app/api/oauth/v1/team/invites/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jsmith@example.com\",\n \"inviteCode\": \"<string>\",\n \"companyName\": \"<string>\",\n \"role\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/team/invites/send")
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 \"email\": \"jsmith@example.com\",\n \"inviteCode\": \"<string>\",\n \"companyName\": \"<string>\",\n \"role\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"success": true,
"message": "<string>",
"inviteLink": "<string>",
"attempts": 123
}
}{
"error": {
"code": "unauthorized",
"message": "Missing bearer access token",
"requestId": "req_..."
}
}{
"error": {
"code": "insufficient_scope",
"message": "Requires scope 'campaigns:write'",
"requestId": "req_..."
}
}{
"error": {
"code": "not_found",
"message": "Resource not found",
"requestId": "req_..."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded",
"requestId": "req_..."
}
}Resend a team invite
resend a pending team invitation email. Requires the team:write scope.
curl --request POST \
--url https://app.sideshift.app/api/oauth/v1/team/invites/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "jsmith@example.com",
"inviteCode": "<string>",
"companyName": "<string>",
"role": "<string>"
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/team/invites/send"
payload = {
"email": "jsmith@example.com",
"inviteCode": "<string>",
"companyName": "<string>",
"role": "<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({
email: 'jsmith@example.com',
inviteCode: '<string>',
companyName: '<string>',
role: '<string>'
})
};
fetch('https://app.sideshift.app/api/oauth/v1/team/invites/send', 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://app.sideshift.app/api/oauth/v1/team/invites/send",
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([
'email' => 'jsmith@example.com',
'inviteCode' => '<string>',
'companyName' => '<string>',
'role' => '<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://app.sideshift.app/api/oauth/v1/team/invites/send"
payload := strings.NewReader("{\n \"email\": \"jsmith@example.com\",\n \"inviteCode\": \"<string>\",\n \"companyName\": \"<string>\",\n \"role\": \"<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://app.sideshift.app/api/oauth/v1/team/invites/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jsmith@example.com\",\n \"inviteCode\": \"<string>\",\n \"companyName\": \"<string>\",\n \"role\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/team/invites/send")
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 \"email\": \"jsmith@example.com\",\n \"inviteCode\": \"<string>\",\n \"companyName\": \"<string>\",\n \"role\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"success": true,
"message": "<string>",
"inviteLink": "<string>",
"attempts": 123
}
}{
"error": {
"code": "unauthorized",
"message": "Missing bearer access token",
"requestId": "req_..."
}
}{
"error": {
"code": "insufficient_scope",
"message": "Requires scope 'campaigns:write'",
"requestId": "req_..."
}
}{
"error": {
"code": "not_found",
"message": "Resource not found",
"requestId": "req_..."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded",
"requestId": "req_..."
}
}Authorizations
OAuth 2.1 authorization code + PKCE (S256). Tokens are tenant-bound (company_id) and scoped. Discover endpoints via /.well-known/oauth-authorization-server.
Body
Resend a pending team-invite email. companyId is injected from the token tenant and must NOT be supplied. Required (validated in the use-case): email, inviteCode. Source: lib/api/team/send-invite.usecase.ts + create.body in lib/mcp/tools/team.ts send_team_invite. The route zod (SendInviteInput) is .passthrough().
Email address of the pending invitee (must match the invite's email).
The invite code to resend.
1Company name shown in the email (defaults to 'A company').
Role shown in the email (defaults to 'team member').
Response
Result of resending the invite email: status message, the invite link, and the delivery attempt count.
Resend-invite result. Source: SendInviteResult (lib/api/team/send-invite.usecase.ts).
Show child attributes
Show child attributes