curl --request GET \
--url https://api.1club.ai/v1/platform/reports/revenue \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.1club.ai/v1/platform/reports/revenue"
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/revenue', 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/revenue",
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/revenue"
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/revenue")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/reports/revenue")
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>",
"currency": "<string>",
"totals": {
"revenue": 123,
"collected": 123,
"uncollected": 123,
"collectionRate": 123,
"sales": 123,
"averageSale": 123
},
"comparison": {
"kind": "previous_period",
"period": {
"from": "2023-12-25",
"to": "2023-12-25"
},
"totals": {
"revenue": 123,
"collected": 123,
"uncollected": 123,
"collectionRate": 123,
"sales": 123,
"averageSale": 123
},
"change": {
"revenue": {
"amount": 123,
"percent": 123
},
"collected": {
"amount": 123,
"percent": 123
},
"sales": {
"amount": 123,
"percent": 123
}
}
},
"byStream": [
{
"revenue": 123,
"collected": 123,
"sales": 123,
"share": 123,
"previousRevenue": 123,
"change": {
"amount": 123,
"percent": 123
},
"stream": "bookings"
}
],
"byClub": [
{
"revenue": 123,
"collected": 123,
"sales": 123,
"share": 123,
"previousRevenue": 123,
"change": {
"amount": 123,
"percent": 123
},
"clubId": 123,
"clubName": "<string>"
}
],
"byPaymentMethod": [
{
"method": "<string>",
"channel": "<string>",
"collected": 123,
"share": 123
}
],
"topItems": [
{
"revenue": 123,
"collected": 123,
"sales": 123,
"share": 123,
"previousRevenue": 123,
"change": {
"amount": 123,
"percent": 123
},
"stream": "<string>",
"label": "<string>"
}
],
"trend": {
"granularity": "day",
"points": [
{
"start": "2023-12-25",
"revenue": 123,
"collected": 123,
"sales": 123
}
]
},
"movers": [
{
"dimension": "stream",
"label": "<string>",
"revenue": 123,
"previousRevenue": 123,
"change": {
"amount": 123,
"percent": 123
}
}
]
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}Revenue report for a period
What the organization earned over a period, and from what, where and how it compares - in one request rather than a walk of the transactions list.
Revenue is recognised ex-tax on the day of the sale, on the organization’s own clock, net of refunds and of anything Wallet credit paid for. collected is the part of it already paid, on the same basis, so uncollected is what the period sold that has not been paid yet. These are the figures of the admin’s daily revenue chart for the same days.
The period is compared with the same number of days just before it (compare=previous_period, the default) or the same dates a year earlier (previous_year); every breakdown row then carries its revenue in that period and the change, and movers lists the streams, clubs and items that moved most. Breakdowns: by revenue stream (bookings, memberships, passes, drop-ins, products, other), by club (unless clubId narrows the report to one), by the payment method that collected the money, and the top items sold (a class or court, a plan, a product). trend buckets the period by day, week (starting Monday) or month - by default a month or less by day, up to six months by week, anything longer by month.
Amounts are in the organization’s currency. 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/revenue \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.1club.ai/v1/platform/reports/revenue"
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/revenue', 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/revenue",
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/revenue"
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/revenue")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/reports/revenue")
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>",
"currency": "<string>",
"totals": {
"revenue": 123,
"collected": 123,
"uncollected": 123,
"collectionRate": 123,
"sales": 123,
"averageSale": 123
},
"comparison": {
"kind": "previous_period",
"period": {
"from": "2023-12-25",
"to": "2023-12-25"
},
"totals": {
"revenue": 123,
"collected": 123,
"uncollected": 123,
"collectionRate": 123,
"sales": 123,
"averageSale": 123
},
"change": {
"revenue": {
"amount": 123,
"percent": 123
},
"collected": {
"amount": 123,
"percent": 123
},
"sales": {
"amount": 123,
"percent": 123
}
}
},
"byStream": [
{
"revenue": 123,
"collected": 123,
"sales": 123,
"share": 123,
"previousRevenue": 123,
"change": {
"amount": 123,
"percent": 123
},
"stream": "bookings"
}
],
"byClub": [
{
"revenue": 123,
"collected": 123,
"sales": 123,
"share": 123,
"previousRevenue": 123,
"change": {
"amount": 123,
"percent": 123
},
"clubId": 123,
"clubName": "<string>"
}
],
"byPaymentMethod": [
{
"method": "<string>",
"channel": "<string>",
"collected": 123,
"share": 123
}
],
"topItems": [
{
"revenue": 123,
"collected": 123,
"sales": 123,
"share": 123,
"previousRevenue": 123,
"change": {
"amount": 123,
"percent": 123
},
"stream": "<string>",
"label": "<string>"
}
],
"trend": {
"granularity": "day",
"points": [
{
"start": "2023-12-25",
"revenue": 123,
"collected": 123,
"sales": 123
}
]
},
"movers": [
{
"dimension": "stream",
"label": "<string>",
"revenue": 123,
"previousRevenue": 123,
"change": {
"amount": 123,
"percent": 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 clock.
Last day of the period, inclusive.
Only the revenue of this club - its bookings, plans, check-ins and the sales rung up there.
Only the revenue of this selling company, for an organization that trades through more than one.
What to compare the period with.
previous_period, previous_year, none How trend buckets the period. Chosen from the period's length when omitted.
day, week, month How many items topItems lists.
1 <= x <= 50Response
The revenue report
Show child attributes
Show child attributes
The clock the days are read on.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Absent when the report is narrowed to one club.
Show child attributes
Show child attributes
What collected the money. A sale paid by several methods counts under the one that paid most; 'Unattributed' is collected with no real-money payment behind it.
Show child attributes
Show child attributes
What sold most: a class or court, a plan, a product.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The streams, clubs and items whose revenue moved most against the comparison period, largest move first. Empty without a comparison.
Show child attributes
Show child attributes
Was this page helpful?