OpenCourt Developers
API ReferenceCustomers

List customers

GET/v1/customers

Returns the club's managed customer list (each ClubUser), oldest relationship first. Cursor-paginate by passing the id of the last customer you received as starting_after. This list is scoped to the club tied to your API key. Note: it covers customers with a club relationship — it does not include one-off guests who never became customers.

Active by default. Archived customers are omitted unless you pass ?include=archived. Retrieving one by id always works, archived or not, so a stored link never breaks.

Finding one person. Pass ?email= to narrow to a single exact address — the lookup to do before deciding whether to create someone. It is matched case-insensitively (the same way the platform decides whether an address is already taken) and is an exact match, never a pattern: % and _ are compared literally.

Authorization

bearerAuth
AuthorizationBearer <token>

Your club API key. Send it as Authorization: Bearer oc_live_….

In: header

Query Parameters

limit?integer

Number of results, 1–100 (default 25).

Range1 <= value <= 100
starting_after?string

Cursor: the id of the last customer from the previous page.

email?string

Exact email address, matched case-insensitively. Returns the one customer with that address, or an empty list. Archived customers are still excluded unless you also pass ?include=archived. An empty value is rejected rather than ignored.

include?string

Comma-separated opt-ins. archived adds archived customers (each with a non-null archived_at); ended_subscriptions adds ended / cancelled / expired subscriptions. Combine them: ?include=archived,ended_subscriptions. Unknown values are ignored.

Response Body

application/json

application/json

application/json

application/json

curl -X GET "https://api.getopencourt.com/v1/customers"
{
  "object": "list",
  "data": [
    {
      "id": "3f29c4a1-7b6d-4e52-9c81-2a4b6d8e0f13",
      "object": "customer",
      "email": "sarah.chen@gmail.com",
      "first_name": "Sarah",
      "last_name": "Chen",
      "phone": "+15551234567",
      "first_became_customer_at": "2026-01-15T14:30:00.000Z",
      "updated_at": "2026-02-02T09:12:00.000Z",
      "archived_at": null,
      "subscriptions": [
        {
          "id": "a1b2c3d4-5e6f-4708-9192-a3b4c5d6e7f8",
          "object": "subscription",
          "customer_id": "3f29c4a1-7b6d-4e52-9c81-2a4b6d8e0f13",
          "type": "membership",
          "status": "active",
          "product": {
            "id": "d4c3b2a1-6f5e-4807-8291-f8e7d6c5b4a3",
            "name": "Gym Access Membership",
            "slug": "gym-access"
          },
          "plan": {
            "id": "f8e7d6c5-b4a3-4019-8273-6f5e4d3c2b1a",
            "name": "Gym Access — Monthly"
          },
          "current_period_end": "2026-07-09T00:00:00.000Z",
          "trial_end": null,
          "next_payment_at": "2026-07-09T00:00:00.000Z",
          "cancel_at_period_end": false,
          "frozen_until": null,
          "started_at": "2026-01-09T00:00:00.000Z",
          "canceled_at": null,
          "updated_at": "2026-06-14T17:03:10.000Z"
        }
      ]
    }
  ],
  "has_more": true,
  "url": "string"
}
{
  "error": {
    "type": "string",
    "code": "string",
    "message": "string",
    "param": "string",
    "request_id": "string"
  }
}
{
  "error": {
    "type": "string",
    "code": "string",
    "message": "string",
    "param": "string",
    "request_id": "string"
  }
}
{
  "error": {
    "type": "string",
    "code": "string",
    "message": "string",
    "param": "string",
    "request_id": "string"
  }
}