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

ParameterRequiredTypeDescription
membership_numberYesstringMember number to generate session for.
initial_viewNostringOne of home, reservations, billing, account, members, stay.
display_nameNostringOverrides 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

ParameterRequiredTypeDescription
club_idYesstringClub object ID.
plan_idYesstringMembership plan ID for that club.
applicant_dataYesarrayApplicant 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

ParameterRequiredTypeDescription
club_idYesstringClub object ID.
start_dateYesnumberUnix timestamp (seconds) for range start.
end_dateYesnumberUnix timestamp (seconds) for range end.
skipNonumberPagination 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

ParameterRequiredTypeDescription
club_idYesstringClub object ID.
start_dateYesnumberUnix timestamp (seconds) for range start.
end_dateYesnumberUnix timestamp (seconds) for range end.
skipNonumberPagination 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

ParameterRequiredTypeDescription
club_idYesstringClub object ID.
start_dateYesnumberUnix timestamp (seconds).
end_dateYesnumberUnix timestamp (seconds).
skipNonumberPagination 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

ParameterRequiredTypeDescription
club_idYesstringClub object ID.
as_of_timestampYesnumberUnix 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

ParameterRequiredTypeDescription
club_idYesstringClub object ID with API key access.
start_dateYesnumberUnix timestamp (seconds) for range start.
end_dateYesnumberUnix timestamp (seconds) for range end.
skipNonumberPagination 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

ParameterRequiredTypeDescription
finish_timeYesnumberTimestamp value used to create score finish time.
registration_idYesstringRegatta registration object ID.
race_numberYesnumberRace 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

ParameterRequiredTypeDescription
idYesstringWristband/scan identifier.
statusYesstringStatus value passed through to hosted handler.
timestampYesnumberUnix timestamp.
regatta_idYesstringRegatta 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

ParameterRequiredTypeDescription
club_idYesstringClub object ID.
start_dateYesnumberUnix timestamp (seconds).
end_dateYesnumberUnix timestamp (seconds).
skipNonumberPagination 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

ParameterRequiredTypeDescription
club_idYesstringClub object ID.
start_dateYesnumberUnix timestamp (seconds).
end_dateYesnumberUnix timestamp (seconds).
camp_idNostringOptional camp filter.
skipNonumberPagination 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
  }
}