Clubin API v2

Clubin API v2

Manage club members and their memberships programmatically — create users, look them up, update details, renew or cancel a membership, and list a club's members. This API powers the official Clubin app for Make.com and any server-to-server integration.

Base /webapi/v2 Auth Bearer API key Format JSON over HTTPS Timezone Asia/Jerusalem
Base URL. v2 identifies your club from the API key, not from the host — every request is scoped by the key. api.clubin.co.il is the stable, dedicated API host.

Authentication

One API key per club, sent as a Bearer token

Every request must carry your club's API key in the Authorization header. Find your key in Club settings → Automations → API v2. It identifies your club, and every request is automatically scoped to it — you can only read or change your own club's members.

Authorization header
Authorization: Bearer clb_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Keep your key secret. Treat it like a password — never put it in client-side code or a public repository. If a key leaks, click Regenerate key: the old key is revoked immediately.

Conventions

How requests and responses are shaped

Requests. GET endpoints read parameters from the query string; POST endpoints read a JSON body and require Content-Type: application/json.

Success responses always include "status": "success" alongside the endpoint's data. Dates are YYYY-MM-DD strings, or null when unset — a permanent membership has no expiry date. Membership state uses the underlying 'y'/'n' and 0/1 values, documented per endpoint.

Errors

Standard HTTP status codes with a JSON body

Errors return the matching status code and a body of the form { "status": "error", "message": "…" }. The message names the specific problem.

StatusMeaning
400Missing or invalid input — the message says which field.
401Missing or invalid API key.
404The user does not exist, or is not a member of your club.
405Wrong HTTP method for this endpoint.
409The change collides with existing data (e.g. an email already in use).
500Unexpected server error.
GET/me
Club info

Return basic information about the authenticated club. Handy for validating a key when an integration is first set up.

Response 200
{
  "status": "success",
  "club": { "id": 999, "name": "Clubin", "subdomain": "clubin999" }
}
POST/users/
Create a user

Create a new user and assign them to your club. If a user with that email already exists, they're assigned to your club instead of being recreated — so the call is safe to repeat.

FieldTypeRequiredDescription
emailstringrequiredThe user's email — the unique identifier.
namestringnew usersRequired when creating a new user; ignored for existing ones.
phonestringoptionalPhone number.
addressstringoptionalStreet address.
citystringoptionalCity.
send_signup_mailbooleandefault trueEmail the auto-generated password to the user.
Request
curl -X POST https://api.clubin.co.il/webapi/v2/users/ \
  -H "Authorization: Bearer clb_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "name": "Dana Levi",
    "phone": "0500000000"
  }'
Response 201 / 200
{
  "status": "success",
  "user": {
    "id": 35057,
    "email": "[email protected]",
    "name": "Dana Levi",
    "phone": "0500000000"
  },
  "already_existed": false,
  "club_id": 999
}

201 for a newly created user, 200 when the user already existed and was assigned to your club.

GET/users/
Get a user

Look up one member of your club by email or ID, including their membership status. Returns 404 if the user isn't a member of your club.

ParameterTypeRequiredDescription
emailstringone ofLook up by email.
idintegerone ofLook up by user ID.
Request
curl "https://api.clubin.co.il/webapi/v2/users/\
[email protected]" \
  -H "Authorization: Bearer clb_your_key"
Response 200
{
  "status": "success",
  "user": {
    "id": 35057, "email": "[email protected]",
    "name": "Dana Levi", "phone": "0500000000",
    "city": "Tel Aviv", "address": "Herzl 1"
  },
  "membership": {
    "active": "y",
    "is_expire": 0,
    "membership_start": "2026-09-01",
    "expire_date": null
  }
}

active: 'y' active, 'n' cancelled. is_expire: 0 permanent, 1 temporary. expire_date is null for a permanent membership.

POST/users/update/
Update a user

Update an existing member's details. Only the fields you send are changed; omitted or empty fields are left untouched.

FieldTypeRequiredDescription
id / emailint / stringone ofIdentifies the user.
namestringoptionalNew name.
phonestringoptionalNew phone.
citystringoptionalNew city.
addressstringoptionalNew address.
new_emailstringoptionalChange the user's email (must not already be in use).
Request
curl -X POST \
  https://api.clubin.co.il/webapi/v2/users/update/ \
  -H "Authorization: Bearer clb_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "phone": "0521111111",
    "city": "Tel Aviv"
  }'
Response 200
{
  "status": "success",
  "user": {
    "id": 35057, "email": "[email protected]",
    "name": "Dana Levi", "phone": "0521111111",
    "city": "Tel Aviv", "address": "Herzl 1"
  },
  "updated_fields": ["phone", "city"]
}

Returns 409 if new_email already belongs to another user.

POST/users/cancel/
Cancel a membership

Cancel a user's membership in your club (sets it inactive). The user record itself is not deleted, and memberships in other clubs are unaffected. Safe to repeat.

FieldTypeRequiredDescription
id / emailint / stringone ofIdentifies the user.
Request
curl -X POST \
  https://api.clubin.co.il/webapi/v2/users/cancel/ \
  -H "Authorization: Bearer clb_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "email": "[email protected]" }'
Response 200
{
  "status": "success",
  "user": {
    "id": 35057, "email": "[email protected]",
    "name": "Dana Levi"
  },
  "club_id": 999,
  "was_active": true,
  "active": "n"
}

was_active is false if the membership was already inactive before this call.

GET/users/list/
List users

List your club's members, paginated. Request pages in sequence until page reaches total_pages. In Make this maps to a Search module, which iterates the pages for you.

ParameterTypeRequiredDescription
pageintegerdefault 1Page number.
per_pageintegerdefault 50, max 200Results per page.
activestringoptionalFilter by status: y (active) or n (inactive).
Request
curl "https://api.clubin.co.il/webapi/v2/users/list/\
?page=1&per_page=50&active=y" \
  -H "Authorization: Bearer clb_your_key"
Response 200
{
  "status": "success",
  "users": [
    {
      "id": 35057, "email": "[email protected]",
      "name": "Dana Levi", "phone": "0500000000",
      "active": "y", "is_expire": 0,
      "membership_start": "2026-09-01",
      "expire_date": null
    }
  ],
  "pagination": {
    "page": 1, "per_page": 50,
    "total": 128, "total_pages": 3
  }
}
POST/users/renew/
Renew a subscription

Reactivate a member and extend their membership. With days, the expiry extends from the later of now or the current expiry — so consecutive renewals stack rather than overwrite. Without days, the membership becomes permanent.

FieldTypeRequiredDescription
id / emailint / stringone ofIdentifies the user.
daysintegeroptionalExtend by N days (stacks on existing expiry). Omit or 0 = permanent.
send_access_mailbooleandefault falseReset the password and email new access details.
Request
curl -X POST \
  https://api.clubin.co.il/webapi/v2/users/renew/ \
  -H "Authorization: Bearer clb_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "days": 30
  }'
Response 200
{
  "status": "success",
  "user": {
    "id": 35057, "email": "[email protected]",
    "name": "Dana Levi"
  },
  "membership": {
    "active": "y",
    "is_expire": 1,
    "expire_date": "2026-10-07"
  },
  "club_id": 999
}
Unlike the legacy webapi/users/recurring endpoint, renewal does not reset the password unless send_access_mail is true.
POST/courses/access/
Manage course access

Open, change, or remove a user's access to a single course. Access is permanent or temporary (with an expiry), and both the opening date and the closing date can be set.

FieldTypeRequiredDescription
emailstringrequiredThe user (must be a member of the club).
book_idintegerrequiredThe course id (alias: course_id).
accessstringrequiredpermanent, temporary, or remove.
start_datestringoptionalOpening date YYYY-MM-DD.
expire_datestringtemporaryClosing date YYYY-MM-DD (for temporary access).
daysintegeroptionalFor temporary access, expire in N days (used if expire_date omitted; defaults to +1 year).
Request
curl -X POST \
  https://api.clubin.co.il/webapi/v2/courses/access/ \
  -H "Authorization: Bearer clb_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "book_id": 123,
    "access": "temporary",
    "expire_date": "2027-09-08"
  }'
Response 200
{
  "status": "success",
  "user": { "id": 35057, "email": "[email protected]" },
  "course": { "id": 123, "name": "Advanced Course" },
  "access": "temporary",
  "is_expire": 1,
  "start_date": "2026-09-08",
  "expire_date": "2027-09-08",
  "club_id": 999
}

access: permanent (is_expire 0, no expiry), temporary (is_expire 1, expire_date set), or removed when revoked. Returns 404 if the user is not a member of this club, or the course does not belong to it.

GET/users/new/
New members — trigger source

Returns the club's most recently added members, newest first. Powers the Make Watch New Members polling trigger. Members added through the app are source: "manual"; members created via this API are source: "api" — filter with source to watch, for example, only manual additions (which also avoids trigger loops from API-created users).

ParameterTypeRequiredDescription
limitintegerdefault 50, max 200Max members returned per poll.
sourcestringoptionalmanual (UI additions only), api, or omitted (all).
Request
curl "https://api.clubin.co.il/webapi/v2/users/new/\
?limit=50&source=manual" \
  -H "Authorization: Bearer clb_your_key"
Response 200
{
  "status": "success",
  "items": [
    {
      "user_id": 35057,
      "email": "[email protected]",
      "name": "Dana Levi",
      "phone": "0500000000",
      "active": "y",
      "source": "manual",
      "added_at": "2026-09-09T14:30:00+03:00",
      "added_ts": 1788900000
    }
  ]
}

Items are ordered by join date (newest first). In Make this maps to a Trigger module that emits each new member once.

GET/users/removed/
Removed members — trigger source

Returns members that were deleted from the club, most recent first. Powers the Make Watch Removed Members polling trigger. Backed by a removal log, so it captures the deletion event even though the membership row is already gone.

ParameterTypeRequiredDescription
limitintegerdefault 50, max 200Max removals returned per poll.
sourcestringoptionalmanual (admin "delete member" action) or omitted (all).
Request
curl "https://api.clubin.co.il/webapi/v2/users/removed/\
?limit=50&source=manual" \
  -H "Authorization: Bearer clb_your_key"
Response 200
{
  "status": "success",
  "items": [
    {
      "removal_id": 412,
      "user_id": 35057,
      "email": "[email protected]",
      "source": "manual",
      "removed_at": "2026-09-10T09:15:00+03:00",
      "removed_ts": 1789000000
    }
  ]
}

Each removal carries a unique removal_id (the trigger key). This fires only on a full member deletion — not on membership deactivation or whole-club cancellation.

POST/posts/
Add & approve a post

Add a post to the club's feed, attributed to a member, and publish it immediately (approved) or leave it pending. Approval is an admin action — it runs under the club's API key, so a regular member cannot approve; email only sets the post's author.

FieldTypeRequiredDescription
emailstringrequiredThe author (must be a member of the club).
bodystringrequiredThe post text.
urlstringoptionalAn attached link or image URL.
approvebooleandefault truetrue publishes it (active y); false leaves it pending (n).
Request
curl -X POST \
  https://api.clubin.co.il/webapi/v2/posts/ \
  -H "Authorization: Bearer clb_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "body": "Welcome to the new season!",
    "approve": true
  }'
Response 201
{
  "status": "success",
  "post": {
    "id": 9021,
    "body": "Welcome to the new season!",
    "url": "",
    "active": "y",
    "approved": true,
    "add_date": "2026-09-15T10:00:00+03:00"
  },
  "user": { "id": 35057, "email": "[email protected]" },
  "club_id": 999
}

active: y published, n pending approval. Returns 404 if the author is not a member of this club.

Roadmap

Recommended enhancements

Not yet implemented — the additions that would bring v2 to the standard integrators expect from a mature SaaS, roughly in order of value.

1

metadata & external_id on users

Let an integrator attach their own identifiers (CRM, store, spreadsheet row) to a Clubin user and look the user up by them. The single most useful addition for real integrations.

2

Machine-readable error codes

Add a stable code (e.g. "code": "user_not_found") alongside message, so integrations branch on a code instead of parsing prose.

3

Idempotency keys

Accept an Idempotency-Key header on create and renew so a retried request can't create or charge twice.

4

Full timestamps & audit fields

Return ISO 8601 datetimes with offset, and expose created_at / updated_at on each user and membership.

5

request_id in every response

A per-request identifier the caller can quote to support so the exact request is found in the logs.

6

Richer list filtering

Add a name/email search (q) and an expiry-date range to GET /users/list/, beyond the current active filter.

7

Webhooks

Emit events (user.created, membership.cancelled, membership.renewed) so integrations react in real time — this is what unlocks Make.com triggers.

Clubin API v2 · reference maintained alongside the codebase in docs/.