curl --request GET \
--url https://api.cal.id/teams/{teamId}/memberships \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.cal.id/teams/{teamId}/memberships"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.cal.id/teams/{teamId}/memberships', 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.cal.id/teams/{teamId}/memberships",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.cal.id/teams/{teamId}/memberships"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.cal.id/teams/{teamId}/memberships")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.id/teams/{teamId}/memberships")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": [
{
"id": 9101,
"teamId": 812,
"userId": 4021,
"acceptedInvitation": true,
"role": "OWNER",
"impersonation": false,
"createdAt": "2026-01-22T08:15:00.000Z",
"updatedAt": "2026-03-04T09:02:44.000Z",
"user": {
"id": 4021,
"name": "Jordan Lee",
"email": "jordan.lee@example.com",
"username": "jordan-lee",
"avatarUrl": "https://cal.id/avatar/jordan-lee.png",
"timeZone": "Europe/London"
},
"team": {
"id": 812,
"name": "Acme Sales",
"slug": "acme-sales"
}
},
{
"id": 9102,
"teamId": 812,
"userId": 4088,
"acceptedInvitation": true,
"role": "ADMIN",
"impersonation": false,
"createdAt": "2026-01-22T08:15:00.000Z",
"updatedAt": "2026-03-04T09:02:44.000Z",
"user": {
"id": 4088,
"name": "Priya Sharma",
"email": "priya.sharma@example.com",
"username": "priya-sharma",
"avatarUrl": "https://cal.id/avatar/priya-sharma.png",
"timeZone": "Asia/Kolkata"
},
"team": {
"id": 812,
"name": "Acme Sales",
"slug": "acme-sales"
}
},
{
"id": 9103,
"teamId": 812,
"userId": 4152,
"acceptedInvitation": false,
"role": "MEMBER",
"impersonation": false,
"createdAt": "2026-01-22T08:15:00.000Z",
"updatedAt": "2026-03-04T09:02:44.000Z",
"user": {
"id": 4152,
"name": "Sam Okafor",
"email": "sam.okafor@example.com",
"username": "sam-okafor",
"avatarUrl": "https://cal.id/avatar/sam-okafor.png",
"timeZone": "Africa/Lagos"
},
"team": {
"id": 812,
"name": "Acme Sales",
"slug": "acme-sales"
}
}
],
"message": "Team memberships retrieved",
"meta": {
"pagination": {
"page": 1,
"limit": 10,
"total": 3,
"totalPages": 1
}
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "Rate limit exceeded",
"error": {
"code": "TOO_MANY_REQUESTS",
"message": "Too many requests. Please retry after the rate limit window resets."
}
}List team members
Lists the team roster: each membership carries its role (MEMBER, ADMIN or OWNER), the acceptedInvitation flag, and embedded user (name, email, username, timezone, avatar) and team objects. Paginated through page/limit. Invitations that have been sent but not accepted appear here with acceptedInvitation: false, so filter on that field before assuming someone is an active host.
curl --request GET \
--url https://api.cal.id/teams/{teamId}/memberships \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.cal.id/teams/{teamId}/memberships"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.cal.id/teams/{teamId}/memberships', 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.cal.id/teams/{teamId}/memberships",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.cal.id/teams/{teamId}/memberships"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.cal.id/teams/{teamId}/memberships")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.id/teams/{teamId}/memberships")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": [
{
"id": 9101,
"teamId": 812,
"userId": 4021,
"acceptedInvitation": true,
"role": "OWNER",
"impersonation": false,
"createdAt": "2026-01-22T08:15:00.000Z",
"updatedAt": "2026-03-04T09:02:44.000Z",
"user": {
"id": 4021,
"name": "Jordan Lee",
"email": "jordan.lee@example.com",
"username": "jordan-lee",
"avatarUrl": "https://cal.id/avatar/jordan-lee.png",
"timeZone": "Europe/London"
},
"team": {
"id": 812,
"name": "Acme Sales",
"slug": "acme-sales"
}
},
{
"id": 9102,
"teamId": 812,
"userId": 4088,
"acceptedInvitation": true,
"role": "ADMIN",
"impersonation": false,
"createdAt": "2026-01-22T08:15:00.000Z",
"updatedAt": "2026-03-04T09:02:44.000Z",
"user": {
"id": 4088,
"name": "Priya Sharma",
"email": "priya.sharma@example.com",
"username": "priya-sharma",
"avatarUrl": "https://cal.id/avatar/priya-sharma.png",
"timeZone": "Asia/Kolkata"
},
"team": {
"id": 812,
"name": "Acme Sales",
"slug": "acme-sales"
}
},
{
"id": 9103,
"teamId": 812,
"userId": 4152,
"acceptedInvitation": false,
"role": "MEMBER",
"impersonation": false,
"createdAt": "2026-01-22T08:15:00.000Z",
"updatedAt": "2026-03-04T09:02:44.000Z",
"user": {
"id": 4152,
"name": "Sam Okafor",
"email": "sam.okafor@example.com",
"username": "sam-okafor",
"avatarUrl": "https://cal.id/avatar/sam-okafor.png",
"timeZone": "Africa/Lagos"
},
"team": {
"id": 812,
"name": "Acme Sales",
"slug": "acme-sales"
}
}
],
"message": "Team memberships retrieved",
"meta": {
"pagination": {
"page": 1,
"limit": 10,
"total": 3,
"totalPages": 1
}
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "Rate limit exceeded",
"error": {
"code": "TOO_MANY_REQUESTS",
"message": "Too many requests. Please retry after the rate limit window resets."
}
}Authorizations
Use the Authorization header with Bearer scheme.
Examples:
- API Key: Authorization: Bearer calid_xxxxx
Path Parameters
Numeric team identifier.
x > 142
Query Parameters
Page number for paginated team membership results.
x >= 11
Maximum number of memberships returned per page.
1 <= x <= 10010
Field used to sort team memberships.
id, role, acceptedInvitation, createdAt "createdAt"
Sorting direction for team memberships.
asc, desc "desc"
Filter memberships by team role.
MEMBER, ADMIN, OWNER "MEMBER"
Filter memberships by invitation acceptance status.
true
Was this page helpful?