API Reference
The Clubspot API is organized around REST. Our API returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.
Authentication
The Clubspot API uses API keys to authenticate requests. You can request API access and/or obtain a new API key by contacting support@theclubspot.com.
API keys are scoped to one or more clubs that you manage. In addition to single-club use cases, this means that multi-club operators can obtain API keys that have access to any number of clubs, making data aggregation and bulk updates across a portfolio of clubs simple.
Your API keys are powerful, so be sure to keep them secure. Do not share your API keys in publicly accessible areas, or expose them on the client.
All API requests must be made over HTTPS, and API requests without authentication will fail. You must authenticate requests by passing a valid API key in the header of your request.
| Header | Required | Description |
|---|---|---|
api-key |
Yes | API key used to authorize the request and determine club access. |
idempotency-key |
No | Prevents duplicate processing for identical path + key combinations. |
Requests
Requests to the Clubspot API should be made to the base URL + the relevant endpoint. The base URL uses the following format:
https://api.theclubspot.com/api/v1/{endpoint}
Members
The Members API allows you to retrieve core member data.
Endpoint
GET /api/:version/members
Use query parameters with a GET request.
Parameters
| Name | Required | Type | Description |
|---|---|---|---|
club_id |
Yes | string | Club object ID. Must be included in your API key's allowed clubs. |
primary_only |
No | boolean | If truthy, only primary members are returned. |
skip |
No | number | Pagination offset. Defaults to 0. |
Example request
curl --request GET \ --url "https://api.theclubspot.com/api/v1/members?club_id=abc123&primary_only=true&skip=0" \ --header "api-key: sk_test_your_key"
Example response
{
"request_id": "j8kP2Y4mM1",
"code": "200",
"status": "succeeded",
"data": {
"members": [
{
"id": "mbr_123",
"first_name": "Emily",
"last_name": "Johnson",
"email": "emily@example.com",
"mobile_number": "+15555550100",
"primary": true,
"relationship": null,
"address": {
"street": "123 Main St",
"city": "Palo Alto",
"state": "CA",
"postal_code": "94301",
"country": "US"
},
"dob": 315532800,
"member_tags": ["Board"],
"membership": {
"id": "mshp_123",
"status": "active",
"category": "Golf",
"plan": "Full",
"member_number": "10293",
"start_date": 1704067200,
"end_date": null,
"notes": null
},
"created": 1709663212
}
],
"has_more": false
}
}
Member Portal Sessions
The Member Portal is a hosted, white-label interface for your club members to manage their accounts and access club services (eg. including bookings and reservations). By default, the Member Portal includes tabs for Member Billing (viewing and paying balances, managing payment methods, setting up autopay), Reservations, Member Data, and access to a virtual member card.
In most cases, members access the Member Portal directly from your club's website and/or member app (also powered by Clubspot). If you instead prefer to launch a Member Portal session from an external website or app, you can do so by making a POST request to the /member-portal/sessions endpoint.
Endpoint
POST/api/:version/member-portal/sessions
Creates a session for the Member Portal.
Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
membership_number | Yes | string | Member number to generate session for. |
initial_view | No | string | One of home, reservations, billing, account, members, stay. |
display_name | No | string | Overrides default session display name. |
Example request
curl --request POST \
--url "https://api.theclubspot.com/api/v1/member-portal/sessions" \
--header "api-key: sk_test_your_key" \
--header "Content-Type: application/json" \
--data '{ "membership_number": "K9728", "initial_view": "billing" }'
Example response
{
"data": {
"object": "member_portal_session",
"id": "mps_123",
"url": "https://club.example.com/start-member-portal-session/...",
"created": 1700000000,
"initial_view": "home",
"club": "club_id",
"membership": "membership_id",
"membership_number": "12345"
}
}
Membership Applications
Endpoint
POST/api/:version/membership-applications
Creates a membership application.
Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
club_id | Yes | string | Club object ID. |
plan_id | Yes | string | Membership plan ID for that club. |
applicant_data | Yes | array | Applicant payload array used to create application. |
Example request
curl --request POST \
--url "https://api.theclubspot.com/api/v1/membership-applications" \
--header "api-key: sk_test_your_key" \
--header "Content-Type: application/json" \
--data '{ "club_id":"abc123", "plan_id":"plan_123", "applicant_data":[{"first_name":"Michael","last_name":"Smith"}] }'
Example response
{
"request_id": "req_123",
"code": "200",
"status": "succeeded",
"data": {
"id": "app_123",
"first_name": "Michael",
"last_name": "Smith",
"status": "pending",
"created": 1711675969,
"club": "club_id",
"notes": null,
"applicants": [
{
"id": "appl_1",
"created": 1711675969,
"updated": 1711675970,
"application": {
"id": "app_123",
"status": "pending"
},
"club": {
"name": "Clubspot Country Club",
"id": "club_id"
},
"first_name": "Michael",
"last_name": "Smith",
"primary": true,
"email": "michael@example.com",
"mobile": "2144347216",
"address": {
"city": "Dallas",
"state": "TX",
"zip": "75201",
"country": "US",
"street": "123 Main St"
},
"custom_fields": [
{
"name": "Preferred Contact",
"response": "Email",
"type": "single_select",
"id": "cf_123"
}
]
}
]
}
}
Membership Applicants
Endpoint
GET/api/:version/membership-applicants
Retrieves membership applicants for a club over a date range.
Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
club_id | Yes | string | Club object ID. |
start_date | Yes | number | Unix timestamp (seconds) for range start. |
end_date | Yes | number | Unix timestamp (seconds) for range end. |
skip | No | number | Pagination offset (default 0). |
Example request
curl --request GET \ --url "https://api.theclubspot.com/api/v1/membership-applicants?club_id=abc123&start_date=1704067200&end_date=1706745600&skip=0" \ --header "api-key: sk_test_your_key"
Example response
{
"request_id": "req_124",
"code": "200",
"status": "succeeded",
"data": {
"membership_applicants": [
{
"id": "appl_1",
"created": 1711675969,
"updated": 1711675970,
"application": {
"id": "app_123",
"status": "pending"
},
"club": {
"name": "Clubspot Country Club",
"id": "club_id"
},
"first_name": "Olivia",
"last_name": "Brown",
"primary": true,
"email": "olivia@example.com",
"mobile": "2144347216",
"address": {
"city": "Dallas",
"state": "TX",
"zip": "75201",
"country": "US",
"street": "123 Main St"
},
"custom_fields": [
{
"name": "Preferred Contact",
"response": "Email",
"type": "single_select",
"id": "cf_123"
}
]
}
],
"has_more": false
}
}
Line Items
Retrieves a list of line items from the selected time period.
Endpoint
GET/api/:version/line-items
Retrieve line items from a selected time period.
Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
club_id | Yes | string | Club object ID. |
start_date | Yes | number | Unix timestamp (seconds) for range start. |
end_date | Yes | number | Unix timestamp (seconds) for range end. |
skip | No | number | Pagination offset (default 0). |
Example request
curl --request GET \ --url "https://api.theclubspot.com/api/v1/line-items?club_id=abc123&start_date=1704067200&end_date=1706745600&skip=0" \ --header "api-key: sk_test_your_key"
Example response
{
"request_id": "req_125",
"code": "200",
"status": "succeeded",
"data": {
"line_items": [
{
"club": {
"name": "Clubspot Country Club",
"id": "club_id"
},
"customer": {
"id": "cust_1",
"first_name": "Sarah",
"last_name": "Davis",
"email": "sarah@example.com"
},
"pos_location": {
"display_name": "Main Dining Room",
"id": "pos_1"
},
"table": "Table 12",
"staff_member": {
"id": "staff_1",
"name": "Robert Wilson"
},
"order": {
"id": "ord_123",
"order_number": "1042"
},
"product": {
"id": "prd_1",
"name": "Buffalo Chicken Potato Skins"
},
"option": {
"id": "opt_1",
"name": "Extra Sauce"
},
"description": "Buffalo Chicken Potato Skins",
"amount": 1000,
"tax": 82,
"discount": 100,
"total": 982,
"tip": 150,
"type": "product",
"quantity": 1,
"processing_fee": 34,
"payment_method_type": "card",
"is_default_gratuity": false,
"member_number": "G3784",
"channel": "pos",
"notes": "No onions",
"confirmed": 1711676000,
"created": 1711675900,
"invoice_number": "INV-0002",
"invoiced_at": 1711676500,
"id": "li_123",
"session": {
"name": "Session A",
"id": "sess_1"
},
"reversed_by": null,
"reverses_line_item": null,
"coupon_code": "SUMMER24",
"registration": {
"status": "CONFIRMED",
"id": "reg_1"
},
"refunds_and_reversals": 0,
"status": "Paid",
"member_revenue": true,
"paid_at": 1711676600,
"payout_details": {
"id": "po_1",
"paid_out_on": 1711762800,
"payout_available_on": 1711740000,
"payout_arrival_date": 1711762800
},
"class_name": null
}
],
"has_more": false
}
}
Orders
Endpoint
GET/api/:version/orders
Retrieve orders over a timestamp range.
Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
club_id | Yes | string | Club object ID. |
start_date | Yes | number | Unix timestamp (seconds). |
end_date | Yes | number | Unix timestamp (seconds). |
skip | No | number | Pagination offset (default 0). |
Example request
curl --request GET \ --url "https://api.theclubspot.com/api/v1/orders?club_id=abc123&start_date=1704067200&end_date=1706745600&skip=0" \ --header "api-key: sk_test_your_key"
Example response
{
"request_id": "req_126",
"code": "200",
"status": "succeeded",
"data": {
"orders": [
{
"id": "ord_123",
"order_number": "#1042",
"club": {
"name": "Clubspot Country Club",
"id": "club_id"
},
"customer": {
"id": "cust_1",
"first_name": "Sarah",
"last_name": "Davis",
"email": "sarah@example.com",
"receipt_email": "sarah@example.com",
"member_number": "G3784"
},
"requires_shipping": false,
"address": {
"street": null,
"apartment": null,
"city": null,
"state": null,
"zip": null,
"country": null
},
"staff_member": {
"id": "staff_1",
"name": "Robert Wilson"
},
"line_items": [
{
"product": {
"id": "prd_1",
"name": "Buffalo Chicken Potato Skins"
},
"option": {
"id": "opt_1",
"name": "Extra Sauce"
},
"description": "Buffalo Chicken Potato Skins",
"amount": 1000,
"tax": 82,
"discount": 100,
"total": 982,
"tip": 150,
"type": "product",
"quantity": 1,
"processing_fee": 34,
"is_default_gratuity": false,
"notes": null,
"confirmed": 1711676000,
"created": 1711675900,
"invoice_number": "INV-0002",
"invoiced_at": 1711676500,
"id": "li_123",
"session": {
"name": null,
"id": null
},
"reversed_by": null,
"reverses_line_item": null,
"coupon_code": "SUMMER24",
"registration": {
"status": "CONFIRMED",
"id": "reg_1"
},
"refunds_and_reversals": 0,
"status": "Paid",
"member_revenue": true,
"event_name": null,
"class_name": null
}
],
"currency": "USD",
"subtotal": 1000,
"total_line_discounts": 100,
"member_discount": 0,
"manual_discount": 0,
"order_level_discount": 0,
"tax": 82,
"tip": 150,
"auto_gratuity_label": "Auto-gratuity",
"auto_gratuity": 0,
"package_total_applied": 0,
"gift_card_applied": 0,
"prepaid_minimum_applied": 0,
"total": 1132,
"processing_passed_on": 0,
"surcharge": 0,
"processing_fee": 34,
"payment_method": "VISA *4242",
"status": "Paid",
"created": 1711675900,
"confirmed": 1711676000,
"pos_location": {
"display_name": "Main Dining Room",
"id": "pos_1"
},
"table": "Table 12",
"event_name": null,
"reciprocal_member": null,
"reciprocal_member_number": null,
"reciprocal_club": null,
"covers": 2,
"notes": null
}
],
"has_more": false
}
}
Aging Report
Endpoint
GET/api/:version/aging-report
Retrieve a membership aging report as of a timestamp.
Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
club_id | Yes | string | Club object ID. |
as_of_timestamp | Yes | number | Unix timestamp (seconds). |
Example request
curl --request GET \ --url "https://api.theclubspot.com/api/v1/aging-report?club_id=abc123&as_of_timestamp=1706745600" \ --header "api-key: sk_test_your_key"
Example response
{
"request_id": "req_127",
"code": "200",
"status": "succeeded",
"data": {
"as_of_timestamp": 1706745600,
"summary": {
"current": 1023400,
"thirty_days": 223400,
"sixty_days": 102000,
"ninety_days": 44000,
"over_ninety_days": 18000,
"total": 1410800
},
"memberships": [
{
"membership_id": "mshp_1",
"member_number": "G3784",
"member_name": "Sarah Davis",
"current": 1400,
"thirty_days": 300,
"sixty_days": 0,
"ninety_days": 0,
"over_ninety_days": 0,
"total": 1700
}
]
}
}
Tee Times
The Tee Times API allows you to retrieve tee times over a specific time period.
Endpoint
POST/api/:version/tee-times
Retrieve tee times in ascending order by date/time.
Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
club_id | Yes | string | Club object ID with API key access. |
start_date | Yes | number | Unix timestamp (seconds) for range start. |
end_date | Yes | number | Unix timestamp (seconds) for range end. |
skip | No | number | Pagination offset (default 0). |
Example request
curl --request POST \
--url "https://api.theclubspot.com/api/v1/tee-times" \
--header "api-key: sk_test_your_key" \
--header "Content-Type: application/json" \
--data '{ "club_id":"abc123","start_date":1733776459,"end_date":1733862859,"skip":0 }'
Example response
{
"request_id": "req_128",
"code": "200",
"status": "succeeded",
"data": {
"tee_times": [
{
"id": "tee_1",
"tee_time": 845,
"date_string": "Dec-9-2024",
"course": {
"course_id": "course_1",
"course_name": "North Course"
},
"players": [
[
{
"id": "p1",
"first_name": "Daniel",
"last_name": "Miller",
"number_of_holes": 18,
"checked_in": false,
"ghin_number": null,
"member_number": "K9728"
},
{
"id": "p2",
"first_name": "Emma",
"last_name": "Miller",
"number_of_holes": 18,
"checked_in": false,
"ghin_number": null,
"member_number": "K9728"
}
]
]
}
],
"has_more": false
}
}
Scores
The Scores API allows you to create regatta scores programmatically for regattas that you have access to manage.
Endpoint
POST/api/:version/scores
Create a score in the Clubspot scoring platform.
Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
finish_time | Yes | number | Timestamp value used to create score finish time. |
registration_id | Yes | string | Regatta registration object ID. |
race_number | Yes | number | Race number in the regatta. |
Example request
curl --request POST \
--url "https://api.theclubspot.com/api/v1/scores" \
--header "api-key: sk_test_your_key" \
--header "Content-Type: application/json" \
--data '{ "finish_time": 1744837962, "registration_id":"xyz", "race_number":1 }'
Example response
{
"request_id": "req_129",
"code": "200",
"status": "succeeded",
"data": {
"object": "score",
"id": "scr_123",
"created": 1711677000,
"registration": {
"id": "reg_123"
},
"regatta": {
"id": "regatta_1",
"name": "Spring Regatta"
},
"race": {
"id": "race_1",
"race_number": 1
}
}
}
Scan Event
Endpoint
POST/api/:version/scan_event
Creates a regatta scan event update.
Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
id | Yes | string | Wristband/scan identifier. |
status | Yes | string | Status value passed through to hosted handler. |
timestamp | Yes | number | Unix timestamp. |
regatta_id | Yes | string | Regatta object ID. |
Example request
curl --request POST \
--url "https://api.theclubspot.com/api/v1/scan_event" \
--header "api-key: sk_test_your_key" \
--header "Content-Type: application/json" \
--data '{ "id":"wb_123", "status":"checked_in", "timestamp":1706745600, "regatta_id":"reg_123" }'
Example response
{
"request_id": "req_130",
"code": "200",
"status": "succeeded",
"data": {
"success": true,
"id": "wb_123",
"status": "checked_in",
"timestamp": 1706745600,
"regatta_id": "reg_123",
"message": "Scan event processed."
}
}
Banquets
Endpoint
GET/api/:version/banquets
Retrieve banquet event orders over a timestamp range.
Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
club_id | Yes | string | Club object ID. |
start_date | Yes | number | Unix timestamp (seconds). |
end_date | Yes | number | Unix timestamp (seconds). |
skip | No | number | Pagination offset (default 0). |
Example request
curl --request GET \ --url "https://api.theclubspot.com/api/v1/banquets?club_id=abc123&start_date=1704067200&end_date=1706745600&skip=0" \ --header "api-key: sk_test_your_key"
Example response
{
"request_id": "req_131",
"code": "200",
"status": "succeeded",
"data": {
"banquets": [
{
"id": "evt_1",
"name": "Winter Member Dinner",
"first_name": "Olivia",
"last_name": "Smith",
"referred_by": "Board Referral",
"customer": "member",
"member_number": "M-1042",
"event_status": "confirmed",
"order_status": "finalized",
"type": "Wedding Reception",
"start_date": 1707242400,
"start_time": 1800,
"end_date": 1707256800,
"end_time": 2200,
"finalized_at": 1706832000,
"balance": 25000,
"total": 450000,
"food": 310000,
"beverage": 90000,
"other": 50000,
"amount_paid": 425000,
"amount_refunded": 0,
"net_amount_paid": 425000,
"tax": 25000,
"location": "Grand Ballroom, Terrace",
"guest_count": 140,
"version": "v2",
"created": 1704888000,
"updated": 1707260400
}
],
"has_more": false
}
}
Camp Registrations
Endpoint
GET/api/:version/camp-registrations
Retrieve camp registrations over a timestamp range.
Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
club_id | Yes | string | Club object ID. |
start_date | Yes | number | Unix timestamp (seconds). |
end_date | Yes | number | Unix timestamp (seconds). |
camp_id | No | string | Optional camp filter. |
skip | No | number | Pagination offset (default 0). |
Example request
curl --request GET \ --url "https://api.theclubspot.com/api/v1/camp-registrations?club_id=abc123&start_date=1704067200&end_date=1706745600&skip=0" \ --header "api-key: sk_test_your_key"
Example response
{
"request_id": "req_132",
"code": "200",
"status": "succeeded",
"data": {
"camp_registrations": [
{
"id": "camp_reg_1",
"created": "2024-01-10T12:00:00.000Z",
"status": "confirmed",
"camp": {
"camp_id": "camp_1",
"camp_name": "Junior Golf Camp"
},
"classes": [
{
"id": "class_1",
"name": "Beginner Golf"
}
],
"sessions": [
{
"id": "sess_1",
"name": "Week 1",
"start_date": 1717977600,
"end_date": 1718323200
}
],
"sessions_waitlisted": [],
"participants": [
{
"id": "part_1",
"first_name": "Olivia",
"last_name": "Brown",
"email": "olivia@example.com",
"mobile": "1231231234",
"parent_guardian_name": "Jennifer Wilson",
"parent_guardian_email": "jennifer@example.com",
"parent_guardian_mobile": "1231231234",
"parent_guardian_secondary_name": null,
"parent_guardian_secondary_email": null,
"parent_guardian_secondary_mobile": null
}
],
"billing_customer": {
"id": "cust_1",
"name": "Jennifer Wilson",
"email": "jennifer@example.com"
},
"membership": {
"id": "mshp_1",
"member_number": "G3784",
"first_name": "Jennifer",
"last_name": "Wilson"
},
"member": {
"id": "mem_1",
"first_name": "Jennifer",
"last_name": "Wilson",
"email": "jennifer@example.com",
"mobile": "2145550101",
"member_number": "G3784"
}
}
],
"has_more": false
}
}