curl --request POST \
--url https://api.opper.ai/management/v1/invites \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "<string>"
}
'import requests
url = "https://api.opper.ai/management/v1/invites"
payload = { "email": "<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: '<string>'})
};
fetch('https://api.opper.ai/management/v1/invites', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": {
"accepted": true,
"email": "<string>",
"email_sent": true,
"id": 123,
"invite_url": "<string>",
"role": "<string>",
"token": "<string>",
"accepted_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z"
},
"meta": {}
}{
"data": {
"accepted": true,
"email": "<string>",
"email_sent": true,
"id": 123,
"invite_url": "<string>",
"role": "<string>",
"token": "<string>",
"accepted_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z"
},
"meta": {}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
},
"meta": {}
}{
"error": "<string>",
"required_scope": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
},
"meta": {}
}Invite a member
Invites an address into the organization and emails the invitation. The response carries the acceptance token and link as well, so a caller that would rather deliver it itself can, and email_sent reports whether the mail was queued. A live invitation for the same address is resent rather than duplicated: the token stays valid, the expiry moves out, and the reply is 200 instead of 201. Send idempotency_key to retry safely after an uncertain result. A replay answers 200 with the same invitation and meta.idempotency_replayed, mails nobody and leaves the expiry where it was; the same key with different arguments is 409. Omit it when you mean to resend. role is available on Enterprise; elsewhere the invitee joins with the plan’s default member role. Treat token and invite_url as secrets: anyone holding one can join the organization. Requires the members:write scope.
curl --request POST \
--url https://api.opper.ai/management/v1/invites \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "<string>"
}
'import requests
url = "https://api.opper.ai/management/v1/invites"
payload = { "email": "<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: '<string>'})
};
fetch('https://api.opper.ai/management/v1/invites', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": {
"accepted": true,
"email": "<string>",
"email_sent": true,
"id": 123,
"invite_url": "<string>",
"role": "<string>",
"token": "<string>",
"accepted_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z"
},
"meta": {}
}{
"data": {
"accepted": true,
"email": "<string>",
"email_sent": true,
"id": 123,
"invite_url": "<string>",
"role": "<string>",
"token": "<string>",
"accepted_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z"
},
"meta": {}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
},
"meta": {}
}{
"error": "<string>",
"required_scope": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
},
"meta": {}
}Authorizations
Management API authentication. Pass an op-mak-… management token as a Bearer token. Runtime op-… API keys are rejected with 403 — they belong on the data-plane endpoints. Mint a management key from the platform UI under Settings → API keys.
Body
The address to invite.
Makes a retry safe: a repeat with the same key returns the first call's invitation without emailing again or moving the expiry. 1 to 128 letters, digits, dots, underscores, colons or hyphens. Omit it when you mean to resend.
The role the invitee joins with: a built-in role or one of the organization's custom roles. Enterprise only; on other plans omit it and the plan's default member role applies.