curl --request GET \
--url https://api.1club.ai/v1/platform/reports/members \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.1club.ai/v1/platform/reports/members"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.1club.ai/v1/platform/reports/members', 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.1club.ai/v1/platform/reports/members",
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.1club.ai/v1/platform/reports/members"
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.1club.ai/v1/platform/reports/members")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/reports/members")
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{
"period": {
"from": "2023-12-25",
"to": "2023-12-25",
"days": 123
},
"timezone": "<string>",
"current": {
"members": 123,
"dropIns": 123,
"billableMembers": 123,
"byType": [
{
"type": "contact",
"count": 123
}
]
},
"totals": {
"newCustomers": 123,
"newMembers": 123
},
"comparison": {
"kind": "previous_period",
"period": {
"from": "2023-12-25",
"to": "2023-12-25"
},
"totals": {
"newCustomers": 123,
"newMembers": 123
},
"change": {
"newCustomers": {
"amount": 123,
"percent": 123
},
"newMembers": {
"amount": 123,
"percent": 123
}
}
},
"trend": {
"granularity": "day",
"points": [
{
"start": "2023-12-25",
"members": 123,
"dropIns": 123,
"billableMembers": 123
}
]
},
"lifecycle": {
"upgrades": 123,
"downgrades": 123,
"lapsed": 123,
"wonBack": 123
}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}Members report for a period
The organization’s customers over a period: how many Members (holding a recurring membership or season pass) and Drop-ins (holding a pass, or visiting, without one) it has now, with how many contacts hold each contact type (current.byType, leads and lapsed included), how many became a customer or a Member for the first time in the period, and how the counts moved.
newCustomers is the admin Members dashboard’s New customers: contacts who became a Member or a Drop-in for the first time, so a regular coming back after a quiet month is not new. newMembers is the same rule for Members alone, so a Drop-in taking their first membership counts. trend is the dashboard’s growth chart, the counts at the end of each day (a month or less) or week. With contacts:read as well, lifecycle adds the Customer lifecycle report’s moves between contact types: upgrades, downgrades, lapses and win-backs.
Organization-wide: a contact belongs to the organization, not to one of its clubs. Days are the club’s own calendar days, on the organization’s clock. A period may span at most 366 days. Reports have their own limit of 20 requests a minute, on top of the platform’s.
curl --request GET \
--url https://api.1club.ai/v1/platform/reports/members \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.1club.ai/v1/platform/reports/members"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.1club.ai/v1/platform/reports/members', 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.1club.ai/v1/platform/reports/members",
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.1club.ai/v1/platform/reports/members"
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.1club.ai/v1/platform/reports/members")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/reports/members")
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{
"period": {
"from": "2023-12-25",
"to": "2023-12-25",
"days": 123
},
"timezone": "<string>",
"current": {
"members": 123,
"dropIns": 123,
"billableMembers": 123,
"byType": [
{
"type": "contact",
"count": 123
}
]
},
"totals": {
"newCustomers": 123,
"newMembers": 123
},
"comparison": {
"kind": "previous_period",
"period": {
"from": "2023-12-25",
"to": "2023-12-25"
},
"totals": {
"newCustomers": 123,
"newMembers": 123
},
"change": {
"newCustomers": {
"amount": 123,
"percent": 123
},
"newMembers": {
"amount": 123,
"percent": 123
}
}
},
"trend": {
"granularity": "day",
"points": [
{
"start": "2023-12-25",
"members": 123,
"dropIns": 123,
"billableMembers": 123
}
]
},
"lifecycle": {
"upgrades": 123,
"downgrades": 123,
"lapsed": 123,
"wonBack": 123
}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}Authorizations
Organization-scoped bearer credential: a customer API key (1club_sk_live_...) or an MCP OAuth access token.
Query Parameters
First day of the period (YYYY-MM-DD), on the organization's own clock.
Last day of the period, inclusive.
What to compare the period with.
previous_period, previous_year, none How trend steps through the period. By day for a month or less, by week beyond, when omitted.
day, week Response
The report
Show child attributes
Show child attributes
The clock the days are read on: the organization's timezone, as on the admin analytics dashboards.
Right now, whatever the period.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The counts at the end of each day or week.
Show child attributes
Show child attributes
Moves between contact types in the period. Null when the caller lacks contacts:read.
Show child attributes
Show child attributes
Was this page helpful?