curl --request POST \
--url https://api.exowpee.com/v1/team/invitation-organizations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "jsmith@example.com",
"profile_ids": [
"<string>"
],
"pseudo": "<string>"
}
'import requests
url = "https://api.exowpee.com/v1/team/invitation-organizations"
payload = {
"email": "jsmith@example.com",
"profile_ids": ["<string>"],
"pseudo": "<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', profile_ids: ['<string>'], pseudo: '<string>'})
};
fetch('https://api.exowpee.com/v1/team/invitation-organizations', 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.exowpee.com/v1/team/invitation-organizations",
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',
'profile_ids' => [
'<string>'
],
'pseudo' => '<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.exowpee.com/v1/team/invitation-organizations"
payload := strings.NewReader("{\n \"email\": \"jsmith@example.com\",\n \"profile_ids\": [\n \"<string>\"\n ],\n \"pseudo\": \"<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.exowpee.com/v1/team/invitation-organizations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jsmith@example.com\",\n \"profile_ids\": [\n \"<string>\"\n ],\n \"pseudo\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.exowpee.com/v1/team/invitation-organizations")
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 \"profile_ids\": [\n \"<string>\"\n ],\n \"pseudo\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"email": "<string>",
"pseudo": "<string>",
"expired_at": "2023-11-07T05:31:56Z",
"profile_ids": [
"<unknown>"
],
"status": "<string>",
"accepted_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"message": "<string>",
"errors": {}
}Invite a member (organization)
Invites someone by email to join the organization with chosen access profiles; the invitation is valid for 7 days. Inviting the same email again renews the pending invitation.
curl --request POST \
--url https://api.exowpee.com/v1/team/invitation-organizations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "jsmith@example.com",
"profile_ids": [
"<string>"
],
"pseudo": "<string>"
}
'import requests
url = "https://api.exowpee.com/v1/team/invitation-organizations"
payload = {
"email": "jsmith@example.com",
"profile_ids": ["<string>"],
"pseudo": "<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', profile_ids: ['<string>'], pseudo: '<string>'})
};
fetch('https://api.exowpee.com/v1/team/invitation-organizations', 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.exowpee.com/v1/team/invitation-organizations",
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',
'profile_ids' => [
'<string>'
],
'pseudo' => '<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.exowpee.com/v1/team/invitation-organizations"
payload := strings.NewReader("{\n \"email\": \"jsmith@example.com\",\n \"profile_ids\": [\n \"<string>\"\n ],\n \"pseudo\": \"<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.exowpee.com/v1/team/invitation-organizations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jsmith@example.com\",\n \"profile_ids\": [\n \"<string>\"\n ],\n \"pseudo\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.exowpee.com/v1/team/invitation-organizations")
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 \"profile_ids\": [\n \"<string>\"\n ],\n \"pseudo\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"email": "<string>",
"pseudo": "<string>",
"expired_at": "2023-11-07T05:31:56Z",
"profile_ids": [
"<unknown>"
],
"status": "<string>",
"accepted_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"message": "<string>",
"errors": {}
}invitations.create
Conditions
- The caller must be a member; agent accounts are refused.
- The email must be a valid address (format and domain checked).
- The person must not already be a member of the current organization (an inactive member counts).
- profile_ids must contain at least one distinct identifier; each profile must belong to the current space and be a custom profile or the built-in read only profile. The administrator profile cannot be given by invitation.
- pseudo, when sent, must be non-empty, at most 250 characters and not used (ignoring case and surrounding spaces) by a member or by another pending invitation of the space; the pending invitation for the same email does not conflict.
- Creates a pending invitation valid for 7 days.
- When a pending, unexpired invitation already exists for the same email, it is renewed instead (same record, new 7-day expiry, pseudo and profile_ids replaced); links sent earlier stop working.
- Unaccepted invitations for the same email that are expired are marked expired; accepted ones are kept.
- After the transaction commits, emails an invitation link to the organization frontend; the link carries a token and whether the person already has an account.
- When the email already has an account, also sends the person an in-app notification.
- Reserves the pseudo, if given, until the invitation is accepted, expires or is deleted.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Response mode. Default none; none answers 204 No Content.
none, resource Comma-separated JSON keys of the root resource (id is always rendered). Available: id, email, pseudo, expired_at, profile_ids, status, accepted_at, created_at, updated_at.
Comma-separated include paths, each optionally followed by its fields in parentheses: units(id,sku),units.uomUnit(id,name). Max depth 6, max 40 paths. Available: .
Body
Email address to invite. A person who is already a member of the space cannot be invited. Inviting an address that has a pending invitation renews that invitation.
Identifiers (27-character KSUID strings) of the profiles the person receives when accepting. At least one; no duplicates. Each must be a custom profile of the current space or the built-in read only profile.
127Display name the person gets as a member once the invitation is accepted, at most 250 characters, surrounding spaces removed. Optional, but when sent it cannot be empty. It must be unique among the members and pending invitations of the space; a pending invitation for the same email does not conflict with its own pseudo.
250Response
Resource (only with response=resource).
Identifier of the invitation (27-character KSUID string).
Email address the invitation was sent to.
Display name reserved for the member the invitation creates, or null when none was given (the member is then named after their first and last name).
Date and time the invitation expires (ISO 8601, UTC), 7 days after it was sent or renewed.
Identifiers of the profiles the person receives when accepting.
Effective status: pending (waiting and not past expired_at), accepted, or expired (marked expired, or past expired_at without being accepted).
Date and time the invitation was accepted (ISO 8601, UTC); null until then.
Date and time the record was created (ISO 8601, UTC).
Date and time the record was last changed (ISO 8601, UTC).