cURL
curl --request GET \
--url https://api.nekt.ai/api/v1/invitations/ \
--header 'x-api-key: <api-key>'import requests
url = "https://api.nekt.ai/api/v1/invitations/"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.nekt.ai/api/v1/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.nekt.ai/api/v1/invitations/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <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"
"net/http"
"io"
)
func main() {
url := "https://api.nekt.ai/api/v1/invitations/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.nekt.ai/api/v1/invitations/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nekt.ai/api/v1/invitations/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body[
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"email": "jsmith@example.com",
"sent_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"accepted_at": "2023-11-07T05:31:56Z",
"revoked_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"created_by": {
"id": 123,
"first_name": "<string>",
"last_name": "<string>",
"email": "jsmith@example.com",
"picture": "<string>",
"role": "<string>",
"functional_area": "data_analytics",
"other_functional_area": "<string>",
"date_joined": "2023-11-07T05:31:56Z",
"last_login": "2023-11-07T05:31:56Z",
"is_active": false,
"is_pending": false
},
"first_name": "<string>",
"last_name": "<string>",
"role": "member",
"functional_area": "data_analytics",
"other_functional_area": "<string>"
}
]Invitations
List Invitations
The invitations still waiting on a reply.
GET
/
api
/
v1
/
invitations
/
cURL
curl --request GET \
--url https://api.nekt.ai/api/v1/invitations/ \
--header 'x-api-key: <api-key>'import requests
url = "https://api.nekt.ai/api/v1/invitations/"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.nekt.ai/api/v1/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.nekt.ai/api/v1/invitations/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <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"
"net/http"
"io"
)
func main() {
url := "https://api.nekt.ai/api/v1/invitations/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.nekt.ai/api/v1/invitations/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nekt.ai/api/v1/invitations/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body[
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"email": "jsmith@example.com",
"sent_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"accepted_at": "2023-11-07T05:31:56Z",
"revoked_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"created_by": {
"id": 123,
"first_name": "<string>",
"last_name": "<string>",
"email": "jsmith@example.com",
"picture": "<string>",
"role": "<string>",
"functional_area": "data_analytics",
"other_functional_area": "<string>",
"date_joined": "2023-11-07T05:31:56Z",
"last_login": "2023-11-07T05:31:56Z",
"is_active": false,
"is_pending": false
},
"first_name": "<string>",
"last_name": "<string>",
"role": "member",
"functional_area": "data_analytics",
"other_functional_area": "<string>"
}
]Returns the invitations that are still outstanding: not yet accepted, not revoked, and — for an expired one — still the most recent invitation sent to that address.
Once somebody accepts, they stop being an invitation and become a member, so they drop off this list. To see them after that, read the member list in the app under Members.
One row per address. Resending does not create a second invitation, so an address you have chased three times still appears once, with the latest
expires_at.Response
An array of invitation objects. This endpoint is not paginated.[
{
"id": "c1f0a9d4-5b62-4e18-9a73-2d8e4f6b0c51",
"email": "analyst@example.com",
"first_name": "",
"last_name": "",
"role": "member",
"sent_at": "2026-09-24T10:14:02Z",
"expires_at": "2026-10-01T10:14:02Z",
"accepted_at": null,
"revoked_at": null
}
]
Find what has gone stale
An expired invitation still holds every group and grant attached to it — the link stopped working, the access did not. Resending re-opens it without re-granting anything.from datetime import datetime, timezone
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.nekt.ai"
headers = {"x-api-key": API_KEY, "Content-Type": "application/json"}
now = datetime.now(timezone.utc)
invitations = requests.get(f"{BASE_URL}/api/v1/invitations/", headers=headers).json()
for invitation in invitations:
expires_at = datetime.fromisoformat(invitation["expires_at"].replace("Z", "+00:00"))
if expires_at < now:
print(f"{invitation['email']} expired on {expires_at:%Y-%m-%d} — resending")
requests.post(
f"{BASE_URL}/api/v1/invitations/",
headers=headers,
json={"email": invitation["email"], "role": invitation["role"]},
)
Related
- Invite User — inviting and resending.
- Revoke an Invitation — for the ones that are never coming.
Authorizations
API Key authentication. Format: 'x-api-key: api_key'
Response
200 - application/json
Maximum string length:
254Show child attributes
Show child attributes
Maximum string length:
150Maximum string length:
150Defaults to member. You cannot invite somebody to a role above your own, and on the Free plan only owners can be invited.
owner- Owneradmin- Adminmember- Member
Available options:
owner, admin, member data_analytics- Data & Analyticssales- Salescustomer_support- Customer Supportoperations- Operationsmarketing- Marketingfinance- Financeproduct_development- Product Developmentgrowth- Growthexecutive_leadership- Executive Leadershipother- Other
Available options:
data_analytics, sales, customer_support, operations, marketing, finance, product_development, growth, executive_leadership, other Maximum string length:
128Was this page helpful?