MCP App Store
by KeenEthics

Overview

1club Admin lets the owners and staff of sports clubs, gyms and studios that run on 1club manage their business from ChatGPT. Review the class schedule and rosters, find a member's bookings and remaining sessions, book courts and classes, record attendance, keep memberships and the product catalogue up to date, and edit your website as a draft you preview before publishing. Sign in with your 1club account and choose which business to connect; you decide which kinds of access to grant, and every action is limited to that business and to the access you granted.

Tools

add_booking_participant

ChatGPT
Add another player to a booking - for example the other three players on a doubles court. The contact must already exist (use search_contacts or create_contact). The total, counting the person the booking is for, is capped by the area type's maximum players. Reaches the same bookings as cancel_booking: any of the organization's over an OAuth connection, and only the ones it created itself with a developer-managed API key. Requires the 'bookings:write' scope.

add_contact_tags

ChatGPT
Put tags on contacts, keeping every tag they already carry. A name no tag has becomes a new manual tag, so check the spelling against list_tags first. Smart and interest tags are refused: they are applied from the organization's rules, which would undo a hand-made change. Returns each contact's tags as they now stand. Requires the 'contacts:write' scope.

add_website_section

ChatGPT
Add one section to a page, leaving the sections already on it alone. Appends it, or inserts it at position (0-based; a position past the end appends). Use it for a single addition - a FAQ under the pricing, a gallery at the end; to rebuild or reorder a page, send the whole list with update_website_page instead, which is one request and cannot leave the page half-built. Call get_website_section_types first for the valid types and the config fields each one takes - an invented type is refused and an invented field renders wrong. Refused when the page has reached its section limit. Returns the page with the section in place; sections after it shift down by one, so re-read indexes from that before using update_website_section or remove_website_section. Edits the draft; call publish_website to make it live. Requires the 'website:write' scope.

apply_notification_settings

ChatGPT
Write a role's saved notification settings onto every person in the role, replacing the choices they made themselves. Use it only when the user wants everyone to get exactly the saved settings, and say how many people that is (userCount from get_notification_settings) - it is not undone by changing the setting back. Limit it with categories. Requires the 'notifications:write' scope.

archive_contact

ChatGPT
Retire a contact who has left the club. Nothing is destroyed - the contact is archived, so their charges and payments survive, but they disappear from search_contacts and cannot be booked or sold to. It also cancels their active memberships and every future booking they hold, and restoring the contact in 1club does not bring those back, so list what you are about to destroy first and confirm with the user before calling this. list_memberships and list_bookings both take a contactId, but neither is a complete preview: list_bookings shows only bookings the contact organized, not ones they are an additional player on (those are released too), and it defaults to a 7-day window - pass from and to to look further ahead. Never call this to "clean up" a duplicate; merging is done in 1club. Requires the 'contacts:delete' scope, which is separate from 'contacts:write' for that reason. It is refused for a staff member or owner with admin access, an instructor with upcoming classes, and a contact paying part of a split bill - all resolved in 1club first; an ordinary member with a portal login archives normally. A 409 with code CANCELLATION_CHARGE_DECISION_REQUIRED means a future booking was paid: ask the user whether to refund it in full or apply the cancellation terms, then call again with keepCancellationCharge. A 409 with code ARCHIVE_INCOMPLETE means the opposite of the others: the contact IS archived and only the release is unfinished, so call again with the same arguments to reconcile it.

assign_pay_rate_policy_instructors

ChatGPT
Add coaches to a pay rate policy, leaving the ones already on it alone. A pay rate is what the GYM PAYS THE COACH. An instructor's hourlyRate is what a MEMBER PAYS for an hour with them. Never set one when the user meant the other. Use this when the user wants to put one or more coaches on an existing policy - it is the additive counterpart of update_pay_rate_policy, whose instructorIds replaces the whole list, so prefer this for "also cover X". Adding the first coach to a policy that named none narrows it: an empty list meant every coach without a policy of their own, so it stops being the organization-wide default - confirm that with the user first. A coach already covered by another policy for the same work comes back as a conflict naming that policy; the fix is to take them off the other one, not to retry. Returns the policy with its coaches as they now stand. Requires the 'instructors:write' scope.

book_class

ChatGPT
Enrol one customer in a class occurrence - the booking the club's staff make when they add someone to a class from the admin portal, through the same pipeline: the class's capacity, its booking policy, an existing waitlist entry (converted into this booking) and the 'already on this class' check all apply, and the seat takes the class's time, club and price. Use it when the user asks to put someone on a class; resolve the occurrence id with list_classes (one row per session) and the customer with search_contacts. Identify the customer with exactly one of contactId or an inline customer matched by email and created if new; prefer contactId. payment.status 'paid' records the seat as settled against a payment method named after the connection (no card is charged); 'unpaid' leaves it outstanding. With 'unpaid' and no amount, a membership of the customer's that covers the class is used - one session is spent and nothing is owed - and otherwise the class price is recorded as owed; so leave amount out unless the user named a price. A full class, a cancelled class and one that has already run are refused, and nothing here overrides that - tell the user rather than retrying; a customer already booked on, teaching or checked in to the class is refused too. Read the roster afterwards with list_class_bookings. Requires the 'bookings:write' scope.

cancel_booking

ChatGPT
Cancel a booking by its 1club booking ID. Over an OAuth connection this covers any of the organization's bookings, whichever channel created it; a developer-managed API key can only cancel the bookings it created itself. Requires the 'bookings:write' scope. Refunds follow the money: on a booking this API created the caller collected it, so 1club moves nothing but records what was given back - with a developer-managed API key everything collected unless refund.amount says otherwise (send what was actually returned when the partner kept a share, 0 when it kept it all); over an OAuth connection nothing is recorded unless refund is sent. On a booking taken through 1club the club is cancelling: an unpaid booking owes nothing, and a paid one needs keepCancellationCharge (refund in full, or apply the cancellation terms) - ask the user. A booking that has already been checked in cannot be cancelled. The customer is told unless you set notifyCustomer false - except on a booking this API created, where they are not told unless you set it true. Idempotent.

cancel_event

ChatGPT
Cancel an event. This CANCELS EVERY ACTIVE BOOKING for it (and any tournament played at it) and cannot be undone - a cancelled event cannot be published again. Nobody is refunded automatically; refunds stay with staff in the 1club admin portal. Tell the user how many bookings it has (bookedCount from get_event) and get their explicit confirmation first. Requires the 'events:write' scope.

copy_system_template

ChatGPT
Create the club's own editable copy of a system email, seeded with the built-in subject and body. From then on the copy is what gets sent, so edit it with update_template right after; deleting it restores the built-in email. One copy per email: if one exists the call fails with its id (also shown as overrideTemplateId by list_system_templates) - edit that one instead. Not available on Free. Requires the 'templates:write' scope. Pass idempotencyKey so a retry cannot fail on the copy it just made.

create_area

ChatGPT
Add a bookable area - a court, a studio, a lane - to one of the organization's clubs. Resolve clubId with get_club and areaTypeId with list_area_types first; both must belong to this organization, and the area type is what makes the new area bookable for a sport, so never guess it. A new area defaults to active and publicly visible and appears in availability immediately. Requires the 'areas:write' scope, the same one that blocks and unblocks areas - an OAuth connection made before this tool shipped will not have it until the user reconnects. Pass idempotencyKey so a retry cannot create the area twice.

create_area_block

ChatGPT
Close a court, or a whole club, for a time range. Requires the 'areas:write' scope. Send areaId to close one court (its club is derived), or clubId with areaId omitted to close every court in that club with a single record - use the club-wide form for holidays and camps rather than creating one block per court. Existing bookings in the window are NOT cancelled; the block only stops new ones. Pass idempotencyKey so a retry cannot create the block twice.

create_area_type

ChatGPT
Add a kind of space the organization books, so create_area has a type to hang courts on. Call list_area_types first and only create one if nothing fits - a second "Padel court" splits inventory that should be one group. Give it sports: a type with none produces areas nobody can book for anything. Requires the 'areas:write' scope, the same one that creates areas. Pass idempotencyKey so a retry cannot create the type twice.

create_booking

ChatGPT
Create a booking on an area (e.g. a padel court), optionally with an instructor leading the session. Identify the customer either with contactId - resolve it first via search_contacts, or create them with create_contact - or with an inline customer object matched to a contact by email and created if new. Pass exactly one of the two; prefer contactId whenever the contact can be resolved. payment.status is 'paid' (money already collected, recorded against a payment method named after the API key so the club can reconcile it) or 'unpaid' (outstanding); amount is the price the customer paid, before any fee the caller kept, and defaults to the area's price for the slot plus the instructor's hourly rate when an instructor is attached. With 'paid', payment.reference carries the caller's own payment id and payment.fee its commission - the sale is recorded at amount, the fee is for reconciliation. 1club's member-facing booking policy (minimum notice, maximum days in advance, operating hours, slots already in the past) is not enforced for this API, so an existing or historical schedule can be recorded as-is - but a real double-booking, the area's capacity, and instructor bookability are always enforced. Requires the 'bookings:write' scope. Pass idempotencyKey so a retry cannot create the booking twice.

create_booking_policy

ChatGPT
Create a booking policy. name and clubIds are required; everything else defaults to free cancellation, no forced payment and every flag off, governing every booking for everyone. A policy is scoped on WHAT it governs (validFor: classes, areas and/or instructors, optionally narrowed to types; empty = every booking) and WHO (audience: contact types, tags, plans held; null = everyone), and narrowed to clubIds (empty = every club). When several apply, the most specific wins - club-specific first, then what+who, what, who, then the unscoped default; a tie goes to the newest. So a new policy can take over bookings another policy governed - check get_effective_booking_policy before and after. Every id must belong to the organization. Policies are live as soon as they are written: new bookings follow them at once (existing bookings keep the cancellation terms they were made under). Confirm with the user first, and check the outcome with get_effective_booking_policy. Requires the 'booking-policies:write' scope. Pass idempotencyKey so a retry cannot create the policy twice.

create_checkin

ChatGPT
Record attendance, in one of two ways - send exactly one of bookingId or contactId. (1) An existing booking: pass bookingId (resolve it with list_bookings or list_class_bookings first). The booking must be confirmed or pending, inside its configured check-in window, paid when policy requires it, and not already checked in. (2) A member walking in with no booking: pass contactId and clubId, and the member is checked in at that club on their membership, the way the front desk's direct check-in does, spending one session from it. Leave out membershipId and externalProgramId to use the member's own covering membership (one with nothing owed is preferred), name the membership with membershipId (from list_memberships), or record the visit against a zero-fee external program with externalProgramId - at most one of the two. The membership must not be limited to particular classes, areas or instructors, must have sessions left, and must have nothing owed on it: a membership that still owes money is refused, so tell the user to check the member in at the front desk where staff can see what is owed. Nothing is charged. To check someone into a class or onto a court, book it first (book_class or create_booking) and check that booking in. Pass idempotencyKey so a retry cannot record attendance twice. Requires the 'checkins:write' scope.

create_class

ChatGPT
Create a class: its club, time, capacity, area, and instructors. Use list_areas and search_instructors to resolve IDs first. Times need an explicit offset. For a class that repeats, pass recurrence - one call then creates the whole series, so do NOT call this once per occurrence. Requires the 'classes:write' scope. Pass idempotencyKey so a retry cannot create the class twice.

create_class_type

ChatGPT
Add a kind of class the organization runs. Call list_class_types first: a gym rarely wants two types meaning the same thing, and this tool will happily create a duplicate name, after which half its classes are filed under one and half under the other. Only name is required - leave the rest out unless the user described that behaviour, since the defaults (one person per booking, no self-cancellation, the default revenue account) are what most types want. Requires the 'classes:write' scope. Pass idempotencyKey so a retry cannot create the type twice.

create_contact

ChatGPT
Create a contact (customer) in the organization. Search first with search_contacts (by name and by phone) - creating a contact whose email already exists fails, as does one with the same name and phone number as an existing contact (the error names that contact's id - use it), and duplicate people are hard to merge afterwards. At least one of email or phone is required. Requires the 'contacts:write' scope. Pass idempotencyKey to make a retry safe.

create_content

ChatGPT
Create a content item - a blog post, an FAQ entry, a reusable website block, a signable document, or a how-to guide. Requires the 'content:write' scope. Send the body as contentBlocks (preferred) or contentHtml, not both. The returned slug may differ from one you asked for, since a clash gets a numeric suffix - use what comes back, especially when pointing a website block section at it. To publish the same item in another language, create it again with the slug that came back and a language - same slug, different language, and the site serves each visitor the right one. When a user asks for a waiver or agreement and gives no wording, write sensible default clauses rather than refusing.

create_custom_field

ChatGPT
Add a custom field to the organization's contacts. Pick the type that fits (select with options for a fixed list). It is staff-only unless the user wants members to see it; a field the sign-up form must ask needs requireOnSignup and a member-visible visibility. Requires the 'contacts:write' scope. Pass idempotencyKey so a retry cannot create it twice.

create_document_rule

ChatGPT
Make one or more documents something matching members are asked to read and accept. documentIds are content items of type "document" (find or create them with list_content / create_content). Leaving filters out asks EVERY member. A mandatory rule (the default) blocks members from finishing account setup until they accept; set mandatoryToAccept false for an optional one such as a marketing consent. requiresTypedNameAcceptance and requiredForEntry only exist on a mandatory rule, consentChannel only on an optional one - asking for the wrong combination is refused rather than silently dropped. requiredForEntry stops unsigned members checking themselves in as soon as the rule is saved, so confirm it with the user first. Requires the 'document-rules:write' scope. Pass idempotencyKey so a retry cannot create the rule twice.

create_event

ChatGPT
Create an event. It is always created as a DRAFT that members cannot see; call publish_event afterwards, once the user has confirmed it. The club, coaches, areas and each ticket's revenue account must belong to the organization, and the club must still be taking events. To sell places, add tickets. Requires the 'events:write' scope. Pass idempotencyKey so a retry cannot create the event twice.

create_form

ChatGPT
Create a form. IMPORTANT: it is LIVE immediately at the returned publicUrl - there is no draft - so show the user what you are about to create and get their go-ahead first. createsAccount is required and can never be changed: true makes a sign-up form, which registers whoever completes it and sells what it offers (completing one with a plan creates a real membership, or takes payment for a plan paid up front); false makes a fill-in form that only collects answers and turns an unknown visitor into a lead. Resolve plans with search_plans and products with search_products first; only active, publicly visible ones are accepted. After creating a fill-in form, add its questions with set_form_questions. Read slug and publicUrl from the result; a null publicUrl means the club has no member portal or live website switched on, so tell the user nobody can open the form until they turn one on. To send people to a sign-up form from the website's header or footer button, set signupFormSlug with update_website_layout. Requires the 'forms:write' scope, which is new: an OAuth connection made before it shipped has to be reconnected. Pass idempotencyKey so a retry cannot create the form twice.

create_instructor

ChatGPT
Add an instructor (a coach) to the organization. They must already exist as a contact, so call search_contacts first and create_contact if they are new, then pass that contactId here. IMPORTANT: this does NOT invite them to the staff portal - it creates a bookable coach with no login, no role and no invitation email, and sending sendInvitation, organizationUserId, role or color is rejected. If the user wants their coach to be able to sign in, tell them to invite them from the 1club admin portal. hourlyRate here is what a MEMBER pays for an hour with them; what the gym pays the coach is a separate thing, set with create_pay_rate_policy. A contact who already has an instructor profile is a conflict naming that profile - use update_instructor on it, including to bring an inactive coach back. Requires the 'instructors:write' scope, which is new: an OAuth connection made before it shipped has to be reconnected before this works. Pass idempotencyKey so a retry cannot create the instructor twice.

create_instructor_type

ChatGPT
Add a kind of coach. Call list_instructor_types first and only create one if nothing there fits - most organizations already have a type per sport, and a near-duplicate splits the roster. Only name is required. Requires the 'instructors:write' scope. Pass idempotencyKey so a retry cannot create the type twice.

create_media

ChatGPT
Add an already-hosted image or video to the organization's media library so a website section or content item can use it. Requires the 'media:write' scope. This does NOT upload a file - the file must already be reachable at a public https URL; if the user has a file on their computer, tell them to upload it in the admin dashboard instead. Give it a descriptive name, since that is what list_media searches. Registering a URL the library already has updates its details and returns the existing item.

create_membership

ChatGPT
Put a customer on a plan. Resolve the customer with search_contacts and the plan with search_plans first. The plan is snapshotted onto the membership exactly as it is when sold in 1club, so allowance and coverage behave identically. payment.status is 'paid' (money already collected, recorded against a payment method named after the API key with no card charged; payment.reference and payment.fee carry the caller's own payment id and commission for reconciliation) or 'unpaid' (left outstanding). The plan supplies the price, joining fee, billing frequency, session allowance and minimum term, so a normal sale sends nothing but the customer, the plan and the payment status. How long it runs follows from the plan too: it starts at startDate and its end date cannot be set here. Use overrides only for a negotiated sale or when migrating a partly-used pass. Collection and refunds stay with you. Requires the 'memberships:write' scope. Pass idempotencyKey so a retry cannot create the membership twice.

create_message_draft

ChatGPT
Write a DRAFT email, SMS or WhatsApp Message. It is NOT sent: there is no way to send through this tool set. The draft waits in the 1club admin app (Messages, drafts) for a member of staff to review and send it - tell the user that. type is email, sms or whatsapp (push notifications cannot be drafted). An email needs a subject. Name the audience with exactly one of contactIds or segment. With an API key the draft is attributed to the person who created the key. Requires the 'messages:write' scope. Pass idempotencyKey so a retry cannot write the draft twice.

create_pay_rate_policy

ChatGPT
Create a rule for what the club pays its coaches. A pay rate is what the GYM PAYS THE COACH. An instructor's hourlyRate is what a MEMBER PAYS for an hour with them. Never set one when the user meant the other. Set earnings.kind to "individual" for one-to-one sessions or "class" for group classes; the rate fields differ and the wrong ones are rejected. instructorIds is required: name the coaches, and send an empty list only when the user genuinely means every coach - that makes this the gym-wide default and re-prices everyone. Two policies cannot claim the same coach for overlapping work: that comes back as a conflict listing which coaches are already on which policy, and the fix is to change one of them, not to retry. Requires the 'instructors:write' scope, which is new - an OAuth connection made before it shipped has to be reconnected. Pass idempotencyKey so a retry cannot create the policy twice.

create_payment_method

ChatGPT
Add a payment method staff can record payments with, e.g. "Bank transfer" or "Voucher". Call list_payment_methods first: Cash and POS Terminal already exist for every organization, so do not add them again. It is staff-only (Private) unless the user wants members to pick it when paying for a booking. Requires the 'payment-methods:write' scope. Pass idempotencyKey so a retry cannot create it twice.

create_plan

ChatGPT
Create a membership plan. A normal plan needs a name, price, billing frequency, and validFor scopes describing which bookings it covers. Set validFor.scopes to classes, areas, and/or instructors; an empty validFor creates a generic direct-entry plan. Requires the 'plans:write' scope. Pass idempotencyKey so retries cannot create duplicates.

create_plan_category

ChatGPT
Add a membership plan category. Omit sortOrder and it goes to the end of the list, which is what you want unless the user is rebuilding the whole ordering. Check list_plan_categories first - a gym rarely wants two headings meaning the same thing, and this tool will happily create a duplicate name. Requires the 'plans:write' scope.

create_pricing_rule

ChatGPT
Add a rule to the club's price list. adjustmentType and scopes are required: say what the rule does to the price and which resources it prices (an empty scopes list means EVERY area, coach and class - only when the user means that). Send only the amount field the type reads: percentageAdjustment for percentage, fixedAmountAdjustment for fixed and absolute. Every id must belong to the organization. A member rate is a "plan" condition naming the plan; a peak band is a "weekdays-time" condition. Rules are live as soon as they are written: every new quote and booking uses them (existing bookings keep their price). Confirm the change with the user first, then check it with quote_booking_price. Requires the 'pricing-rules:write' scope. Pass idempotencyKey so a retry cannot create the rule twice.

create_product

ChatGPT
Add a product to the catalogue. Only name and price are required. Resolve categoryId with list_product_categories first if the user named a category - a category from another organization is rejected, and so are clubId, brandId, taxRateId and revenueAccountId that do not belong to this one. A barcode or SKU already used by another product, package, plan or access card is refused, because a scanned code has to mean exactly one thing. Creating a product does not give it stock; putting units on the shelf is done in the 1club dashboard, so tell the user to do that there. Requires the 'products:write' scope. Pass idempotencyKey so a retry cannot create the product twice.

create_product_category

ChatGPT
Add a product category. Omit sortOrder and it goes to the end of the list, which is what you want unless the user is rebuilding the whole ordering. Check list_product_categories first - a gym rarely wants two categories meaning the same thing, and this tool will happily create a duplicate name. Requires the 'products:write' scope.

create_revenue_account

ChatGPT
Add an account to the organization's chart of accounts. This is bookkeeping, not configuration: the code and name are what the club's accountant reconciles against, so call list_revenue_accounts first and only add one the user actually asked for, with the code they gave you. A duplicate code is refused. Requires the 'revenue-accounts:write' scope, which nothing else grants - an OAuth connection made before this tool shipped will not have it until the user reconnects. Pass idempotencyKey so a retry cannot create the account twice.

create_tag

ChatGPT
Create a manual tag staff can put on contacts, e.g. "VIP" or "Corporate". Check list_tags first: a name another manual tag has is refused, and one a smart tag has would confuse the two. You do not need this before add_contact_tags, which creates a tag it is given by a new name. Requires the 'contacts:write' scope.

create_template

ChatGPT
Create a reusable message template. Call list_template_variables for the type first: every {{variable}} in the subject, preview text and body must be one it lists, or the template is refused (an unknown variable would reach recipients as literal text). Not available on Free. To customize one of the emails 1club sends automatically (booking confirmation, welcome email...), use copy_system_template instead. Creating a template sends nothing. Requires the 'templates:write' scope. Pass idempotencyKey so a retry cannot create the template twice.

create_transaction

ChatGPT
Record a settlement: revenue collected outside 1club, reported as one sum for a club (for example a period's takings for bookings recorded at 0). amount is what was collected, tax included; the tax is taken out at the revenue account's rate. Recorded as a paid charge of type settlement on the club, on a payment method named after the API key, and not split across bookings or customers. A payment.reference already recorded is refused (409 DUPLICATE_REFERENCE) - correct a figure with refund_transaction instead. Requires the 'transactions:write' scope.

create_website_page

ChatGPT
Add a page to the website. Requires the 'website:write' scope. The slug becomes the page's URL path (lowercase letters, numbers and hyphens). Adding a page does not link to it - follow up with update_website_layout to add it to the header navigation and the footer, or visitors will never find it. Edits the draft; call publish_website to make it live.

delete_area_block

ChatGPT
Delete an area block, reopening the court(s) it covered for booking. Requires the 'areas:write' scope. Use list_area_blocks to find the block id.

delete_booking_policy

ChatGPT
Permanently delete a booking policy. The bookings it governed fall to the next most specific policy, or to none - which means free cancellation and no forced payment. Existing bookings keep the cancellation terms they were made under. Check get_effective_booking_policy for the affected clubs first, and only delete when the user asks for it. Requires the 'booking-policies:write' scope.

delete_class

ChatGPT
Delete a class occurrence. For a recurring class, scope=all_future deletes this and later occurrences. Deletion fails while affected future classes have active bookings or waitlist entries. Requires the 'classes:write' scope.

delete_content

ChatGPT
Permanently delete a content item. Requires the 'content:write' scope. Prefer setting status to 'draft' with update_content - that hides it from the public and is reversible. Never delete a document that members have signed: the signed wording goes with it. A website block section pointing at a deleted block renders nothing.

delete_custom_field

ChatGPT
Delete a contact custom field and every value recorded in it, on every contact. To stop using a field but keep the values, update it with isActive false instead - offer that first. Requires the 'contacts:delete' scope.

delete_document_rule

ChatGPT
Delete a document rule. Members stop being asked for its documents under it (another rule may still ask for the same document), and an entry rule stops refusing self check-in. Signatures already made and the documents themselves are kept. To pause a rule instead, use update_document_rule with isActive false, which is reversible. Requires the 'document-rules:write' scope.

delete_event

ChatGPT
Permanently delete an event nobody has ever booked (typically an unwanted draft). An event with any booking, even a cancelled one, is refused - use cancel_event for it instead. Confirm with the user first. Requires the 'events:write' scope.

delete_media

ChatGPT
Permanently delete a file from the media library. Requires the 'media:delete' scope, which is separate from 'media:write' precisely because this cannot be undone - the file itself is destroyed, and any website section or content item still pointing at it will show a broken image. Check what uses the image first, and confirm with the user.

delete_message_draft

ChatGPT
Permanently delete a draft Message. A Message that was sent stays on record and cannot be deleted. With an API key only drafts written through the API can be deleted. Confirm with the user first. Requires the 'messages:write' scope.

delete_payment_method

ChatGPT
Delete a payment method nobody has paid with yet. One that payments were recorded with is refused, because those payments would lose their tender: offer to make it Private instead, which stops members choosing it. Requires the 'payment-methods:write' scope.

delete_plan

ChatGPT
Permanently delete an unused membership plan. This fails if memberships or other records reference it; use update_plan with isActive=false to retire an in-use plan. Requires the 'plans:write' scope.

delete_pricing_rule

ChatGPT
Permanently delete a pricing rule. New quotes and bookings stop using it at once; existing bookings keep their price. Prefer update_pricing_rule with isActive false, which is reversible - delete only when the user asks for the rule to be gone. Requires the 'pricing-rules:write' scope.

delete_tag

ChatGPT
Delete a manual tag and take it off every contact carrying it - list_tags shows how many that is, so say the number before you delete. Creating the tag again does not put it back on them. Smart tags cannot be deleted; switch their category off in the smart tag rules instead. Requires the 'contacts:delete' scope.

delete_template

ChatGPT
Delete a message template: it stops being listed and offered, while messages already sent from it keep their record. Deleting the club's copy of a system email puts the built-in email back in use. Requires the 'templates:write' scope.

delete_website_page

ChatGPT
Delete a page from the website. Requires the 'website:write' scope. A website must keep at least one page, so the last one cannot be deleted - delete the website itself instead. The homepage cannot be deleted while other pages remain - make another page the homepage first. Remove the page from the header and footer links afterwards. Edits the draft, so the page stays live until you publish.

duplicate_booking_policy

ChatGPT
Copy a booking policy, clubs and rules included, as "<name> (copy)". The copy is as specific as the original and newer, so it governs those bookings from now on - edit its scope or rules straight away with update_booking_policy. Policies are live as soon as they are written: new bookings follow them at once (existing bookings keep the cancellation terms they were made under). Confirm with the user first, and check the outcome with get_effective_booking_policy. Requires the 'booking-policies:write' scope. Pass idempotencyKey so a retry cannot make two copies.

duplicate_event

ChatGPT
Copy an event into a new draft titled "<title> (copy)" with the same schedule, description, tickets, coaches and areas but no bookings. Then change its dates and title with update_event and publish it. This is how a cancelled or past event is run again. Requires the 'events:write' scope. Pass idempotencyKey so a retry cannot make two copies.

get_account

ChatGPT
Return the organization this connection (OAuth or 1club API key) belongs to, the scopes it was granted, and the catalog of available platform resources. Use this to verify the connection and discover what data you can access. Judge what you may call by effectiveScopes, not scopes: a full-access key reports scopes: ["*"], and fullAccess: true with every scope listed in effectiveScopes.

get_activity_report

ChatGPT
How busy the organization was over a period, in one call - reach for this, not list_bookings or list_checkins, whenever the question is how many bookings, cancellations, check-ins or visitors there were, or how full classes, courts and coaches were. Returns: totals (bookings starting in the period and not cancelled, of them confirmed and pending, cancelled bookings, check-ins, and visitors - the distinct contacts with either); utilization in percent (class seats taken of seats offered, court and room hours booked of hours open, coach hours booked of hours available; null when there was nothing to fill); a comparison with the previous period of the same length or the same dates last year; a trend by day, week or month; and the average day of each weekday. The figures of the admin's Historical dashboard for the same days. Days are the club's own calendar days, on the organization's clock. A period may span at most 366 days. Requires the 'analytics:read' scope.

get_area

ChatGPT
Get one area by its 1club ID, whatever its state. list_areas shows only what can be booked today, so this is how you read back an area that is under maintenance, closed with status inactive, or not publicly visible - including one you just created or edited. Check status and visibility on the result. Requires the 'areas:read' scope.

get_area_type

ChatGPT
Get one area type by its 1club ID, including how many areas are of it. Use it to read back a type you just created or edited. Requires the 'areas:read' scope.

get_booking

ChatGPT
Get a booking's current state by its 1club booking ID: status, the area or the class occurrence it is on (areaId / classId), instructor, contact, payment, the channel that created it (source), its notes and when it was created. Works for any of the organization's bookings, whichever channel created it - the same set list_bookings returns. Use include for its money, its cancellation, or its customer. Requires the 'bookings:read' scope.

get_booking_policy

ChatGPT
Get one booking policy with its clubs, scope and every rule. Read it before update_booking_policy: lists and the validFor and audience objects are replaced whole when sent. Requires the 'booking-policies:read' scope.

get_checkin

ChatGPT
Get one attendance record by its 1club check-in ID. Requires the 'checkins:read' scope.

get_class

ChatGPT
Get a single class occurrence by its id - scheduling, club and area, class type, assigned instructors, capacity and bookedCount, price, recurrence series, and import provenance. Use list_class_bookings for its roster. Requires the 'classes:read' scope.

get_class_type

ChatGPT
Get one class type by its 1club ID, including how many classes are run as it. Use it to read back a type you just created or edited. Requires the 'classes:read' scope.

get_club

ChatGPT
Get details for one of your organization's active clubs by slug, including amenities, rating, images and its booking labels. Find the slug with list_clubs. Requires the 'clubs:read' scope.

get_club_availability

ChatGPT
Get the open slots of every bookable area (court, room) in one call - the whole calendar grid, instead of one get_platform_area_availability call per area. Use it to answer 'what is free on Saturday morning' or 'which padel courts are open at 18:00' across a club. Narrow it with clubId and/or sport. Each area carries its operating hours, its busy intervals (with what holds them: a member booking, a class, an event, or an area block the club set), and computed slots with capacity, remaining and bookable; times are in the club's timezone, which the response reports. Busy intervals say what holds a court but not who - use list_bookings for the bookings themselves. The window is required and may span at most 31 days. The top-level cursor is where to start list_availability_changes. Requires the 'areas:read' scope.

get_contact

ChatGPT
Get a contact by its 1club contact ID, with an 'overview' of what staff see on the contact's profile before serving them. 'overview.alerts' lists, most pressing first, what has to be resolved with the person (error) or is worth mentioning (warning): an Amount Due, a Wallet below its Required Deposit, rented gear overdue or still out, a required document unsigned, a required profile field missing, access suspended, archived. 'overview.money' is the Amount Due (what has fallen due and is still unpaid, never reduced by the Wallet balance) with upcomingAmountDue beside it (unpaid charges not due yet: a booking whose visit has not started, a charge dated later), the Wallet balance and the deposit against it, what was billed and paid to date, and how many charges they have. 'overview.activity' has the last visit and counts of bookings, check-ins and plans; 'overview.missingContactDetails' names a missing phone or email. Money needs the 'transactions:read' scope and gear 'products:read'; without them the rest still comes back and 'overview.withheld' says what was left out, so never read a withheld family as nothing to report. For why money is owed, follow with list_transactions(contactId) or get_booking(include money). Requires the 'contacts:read' scope.

get_contact_custom_field_values

ChatGPT
Read the custom field values recorded on one contact. Requires the 'contacts:read' scope.

get_content

ChatGPT
Get a single published content item in your organization by slug. Requires the 'content:read' scope.

get_custom_field

ChatGPT
Get one contact custom field by its id. Requires the 'contacts:read' scope.

get_document_rule

ChatGPT
Get one document rule by id: its documents, the members its filters select, and how they must accept. Requires the 'document-rules:read' scope.

get_effective_booking_policy

ChatGPT
Find the ONE booking policy that governs a booking, resolved exactly as booking, check-in and cancellation resolve it. Give the clubId plus what is booked: areaId (court/room), instructorId (coach; with an area it is judged as the coach's booking) or classId (alone). Add contactId to include policies whose audience that person is in. Or give clubId with eventId alone to get the policy that decides what that event's tickets refund. Returns { policy } - null when nothing applies (for a booking: free cancellation, no forced payment). Every id must belong to the organization and an area or class must be at that club. Requires the 'booking-policies:read' scope.

get_event

ChatGPT
Get one event with its tickets (each with soldCount, so remaining places are capacity - soldCount), coaches, areas and bookedCount. Call it before update_event to get the ticket ids you must resend. The attendee list is not available here. Requires the 'events:read' scope.

get_form

ChatGPT
Get one form with its questions in order. Call this right before set_form_questions and keep every question's id: questions are changed by resending the ones you keep with their ids. The answers people gave are not available here. Requires the 'forms:read' scope.

get_instructor

ChatGPT
Get a single instructor by its 1club instructor ID, including hourly rate, bookability, visibility, and availability schedule. Retired coaches resolve here too - check isActive before offering one, since search_instructors hides them by default. Requires the 'instructors:read' scope.

get_instructor_type

ChatGPT
Get one instructor type by its 1club ID, including how many coaches are filed under it. Use it to read back a type you just created or edited. Requires the 'instructors:read' scope.

get_invoice

ChatGPT
Get one invoice by its 1club id, with its line items and the payments recorded against it. Resolve the id with list_invoices. Requires the 'invoices:read' scope.

get_invoice_summary

ChatGPT
How much the organization invoiced over a range of days - today when no dates are given. Use it for questions like 'how much did we invoice today' or 'this week'. Returns invoiced (count, net, tax and gross per currency, void and cancelled invoices excluded; an empty list means nothing was invoiced), byStatus (every status, void and cancelled included), overdue (unpaid and past due) and byBillingEntity (the same totals per issuing billing entity). Days are read on the organization's own clock, named in timezone. Totals in different currencies are never added together - report each one separately. Pro-forma invoices are not counted. Invoices belong to the organization and its billing entities, not to a single club, so there is no club filter. Requires the 'invoices:read' scope.

get_media

ChatGPT
Get one item from the organization's media library by its id: its url, name, alt text, caption and media type. Use it to confirm the details of an image you already have the id of - from list_media, or from a website section or content item that references it - before pointing something at it. To find an image by what it shows, use list_media with search instead. Requires the 'media:read' scope.

get_members_report

ChatGPT
The organization's customers over a period, in one call - reach for this, not search_contacts, whenever the question is how many members or customers there are, how many new ones joined, or how the count grew. Returns: Members (holding a recurring membership or season pass), Drop-ins (holding a pass, or visiting, without one) and all customers right now, with how many contacts hold each contact type (contact, lead, drop-in, member, lapsed); newCustomers (became a Member or Drop-in for the first time in the period, so a regular coming back is not new) and newMembers (became a Member for the first time, a Drop-in taking their first membership included); a comparison with the previous period or the same dates last year; and the counts at the end of each day or week. With 'contacts:read' as well, lifecycle adds the period's upgrades (Drop-in to Member), downgrades, lapses and win-backs. Organization-wide: contacts belong to the organization, not to a club. Days are the club's own calendar days, on the organization's clock. A period may span at most 366 days. Requires the 'analytics:read' scope.

get_membership

ChatGPT
Get one membership by its 1club ID, including plan, status, dates, price, remaining session allowance, and when its minimum commitment ends (commitmentEndsAt; the member cannot cancel online before it). Requires the 'memberships:read' scope.

get_memberships_report

ChatGPT
How memberships moved over a period, in one call - reach for this, not list_memberships, whenever the question is how many memberships, passes or drop-ins were added or cancelled, how many are active, or how many members cancelled. Returns, for recurring Memberships, Passes and Drop-Ins apart (byKind) and together (totals): added (created in the period, a checkout still awaiting its first payment aside), cancelled (cancellations recorded in the period, immediate or at the end of the paid period), active at the start and at the end (now, for a period still running), and the cancellation rate - the percent of those active at the start that were cancelled in it. Also the plans that moved most (byPlan), a comparison with the previous period or the same dates last year, and a trend of additions and cancellations. No money: what memberships earned is in get_revenue_report. Days are the club's own calendar days, on the organization's clock. A period may span at most 366 days. Requires the 'analytics:read' scope.

get_message

ChatGPT
Get one Message with its body and recipients, each with deliveryStatus (queued until sent; then delivered, bounced, ...; or skipped with a skippedReason) and engagementStatus (open, click, unsubscribe, spamreport). A segment draft has no recipients until staff send it. Requires the 'messages:read' scope.

get_notification_settings

ChatGPT
Read which notifications each role gets by default and on which channels (app, email, sms), and whether each is locked so people cannot change it themselves. Members' categories begin user_ - user_booking is their booking confirmations, changes and cancellations, user_billing their payment receipts, user_membership their plan updates. Defaults reach everyone who has not chosen for themselves; overriddenUserCount says how many have. Read this before update_notification_setting. Requires the 'notifications:read' scope.

get_pay_rate_policy

ChatGPT
Get one pay rate policy by its id: the rates it pays, and the coaches, class types and entrance routes it covers. A pay rate is what the GYM PAYS THE COACH. An instructor's hourlyRate is what a MEMBER PAYS for an hour with them. Never set one when the user meant the other. Requires the 'instructors:read' scope.

get_payment_method

ChatGPT
Get one of the organization's own payment methods by its 1club ID. Requires 'transactions:read' or 'payment-methods:write'.

get_plan

ChatGPT
Get one membership plan by its 1club ID, including price, joining fee, billing frequency, session allowance, and whether it still sells. Retired plans resolve here too - check isActive before offering one, since search_plans hides them by default. A plan with a seasonId is a SEASON plan and is not sellable from here at all: its price is 0 because a Season Pass costs the sum of the Season Slots the buyer picks, so never create a membership against one. search_plans excludes them; this resolves one so an existing membership can be explained. Requires the 'plans:read' scope.

get_plan_category

ChatGPT
Get one membership plan category by its id: its name, its place in the display order, and how many membership plans sit in it. Use it to check a category before renaming it or before moving membership plans into it, or to see whether a category is empty. To find a category by name, use list_plan_categories, which returns them all. Requires the 'plans:read' scope.

get_platform_area_availability

ChatGPT
Get a bookable area's operating hours and the busy (already-booked) intervals over a date range, so you can compute open slots. Requires the 'areas:read' scope.

get_pricing_rule

ChatGPT
Get one pricing rule with its scopes and conditions. Read it before update_pricing_rule: scopes and conditions are replaced whole when sent. Requires the 'pricing-rules:read' scope.

get_product

ChatGPT
Get one product by its 1club ID, including price, cost price, category, brand, SKU, barcode and whether it is on sale. This is the catalogue entry only - call get_product_availability to see how many can still be sold. Requires the 'products:read' scope.

get_product_availability

ChatGPT
How many units of a product can be sold right now, at each club. This is the only view of stock available here - receiving deliveries and correcting counts stay in the 1club admin portal, so tell the user to do those there. It is also not simply the shelf count: a product assembled from a recipe has no shelf, and its figure is the limit its scarcest ingredient imposes. An 'available' of null means the product is not stock-tracked at that club and the till will sell it freely - not that it has run out. Requires the 'products:read' scope.

get_product_category

ChatGPT
Get one product category by its id: its name, its place in the display order, and how many products sit in it. Use it to check a category before renaming it or before moving products into it, or to see whether a category is empty. To find a category by name, use list_product_categories, which returns them all. Requires the 'products:read' scope.

get_report_theme

ChatGPT
Return the 1club report template: the brand palette, the chart colours, the 1club wordmark, and a self-contained HTML document to fill in. Call this first - before you write anything - whenever you are about to present 1club data as a report, dashboard, chart, summary document, HTML page, canvas or artifact, and build on what it returns instead of choosing your own colours. It needs no scope and makes no request, so calling it costs nothing.

get_revenue_account

ChatGPT
Get one revenue account by its 1club ID, retired ones included. Requires any scope that carries a revenue account id: the plans, products, classes, areas and instructors scopes (read or write), plus 'transactions:read' and 'revenue-accounts:write' - so a key that assigns accounts, or maintains them, can look them up.

get_revenue_report

ChatGPT
Revenue for a period in one call - reach for this, not list_transactions, whenever the question is how much the organization earned, from what, where, or how it compares. Returns: totals (revenue, collected, uncollected, collection rate, number of sales, average sale); a comparison with the previous period of the same length or the same dates last year, with the change in amount and percent; revenue by stream (bookings, memberships, passes, drop-ins, products, other), by club and by the payment method that collected it, each with its share and its change; the top items sold (a class or court, a plan, a product); a trend by day, week or month; and 'movers', the streams, clubs and items whose revenue moved most. Revenue is ex-tax, recognised on the day of the sale on the organization's clock, net of refunds and of anything paid from the Wallet - the figures of the admin's revenue chart - and 'collected' is the part of it already paid, so 'uncollected' is what the period sold and has not been paid yet. Amounts are in the returned currency. A period may span at most 366 days. Requires the 'transactions:read' or the 'analytics:read' scope.

get_role_permissions

ChatGPT
Read what each staff role is allowed to do, as permissions written module.action.scope (e.g. booking.update.club), whether the organization changed the role from 1club's default, and the catalog of permissions a role can be given. manage includes every other action on its module; organization scope includes club, which includes own. Read this before update_role_permissions. Requires the 'staff:read' scope.

get_smart_tag_settings

ChatGPT
Read the smart tag rules: for each category (engagement, financial, lifecycle, level, membership, age, newContact, paymentMethod, relationship, language, progression, assessment) whether it is on, and each tag's id, name, colour and threshold - e.g. lifecycle tags by days since a member's first plan, engagement tags by visits over a period. interest is the bookings that make someone interested in a sport; scoring is the engagement score's weights. Read this before update_smart_tag_settings. Requires the 'contacts:read' scope.

get_template

ChatGPT
Get one message template by id, with its subject, preview text and whole body. Requires the 'templates:read' scope.

get_transaction

ChatGPT
Get one of your organization's charges by its ID. The API calls a charge a transaction; to the user it is always a charge. Requires the 'transactions:read' scope.

get_website

ChatGPT
Get the organization's website: its pages, its header and footer, its theme, whether it has been published, and its public and preview URLs. Requires the 'website:read' scope. Start here before editing anything - you need the page slugs, and you need to know whether the site is published. previewUrl renders the unpublished draft, so it is the link to give someone to review edits before they go live; it carries a signed grant that expires after a day, and anyone holding the link can see the draft, so treat it as shareable-but-sensitive and re-read this tool to get a fresh one. If the organization has several websites, list them with list_websites.

get_website_css

ChatGPT
Get the website's custom stylesheet. Requires the 'website:read' scope. Read this before calling set_website_css, which replaces it entirely. Note that most styling questions are answered by get_website_theme instead - colours, fonts, radius, shadows, spacing and motion are design tokens, not custom CSS.

get_website_page

ChatGPT
Get one page of the website with all of its sections and their settings. Requires the 'website:read' scope. Read the page before changing it - update_website_page replaces the whole section list, so you need the current sections to send back the ones you are keeping. The response also carries an seo block reporting what the page will actually put in its <head> once published - the title and description after fallbacks, the canonical URL, and whether search engines are being asked to index it. Use that to check SEO work instead of fetching the rendered page.

get_website_section_types

ChatGPT
List every section type a website page can use, with the config fields each one accepts, the allowed values, and notes on how to use it. Requires the 'website:read' scope. Call this before composing or editing sections - it is the authoritative definition of what a hero, a pricing block or a gallery takes, new types are added over time, and inventing a type or a field silently produces a section that renders wrong. Content types go in a page's sections; layout types (header, footer) appear on every page and are set with update_website_layout.

get_website_theme

ChatGPT
Get the website's current design tokens. Requires the 'website:read' scope. Returns stored (what this website has chosen), resolved (what it renders as) and sources (whether each value came from this website, from the organization's branding, or from a platform default). Read sources before changing any colour: a value sourced from branding is the organization's brand colour or font, shared with their member portal, their marketplace listing and their emails - changing it here makes this website depart from their brand, which is only right if the user asked for that. A token missing from resolved is one the stylesheet derives from the palette, not one with no value.

get_website_theme_tokens

ChatGPT
List every design token a website's look is made of - colours, fonts, heading weight and tracking, corner radius, shadow, border width, spacing, button shape and motion - with the allowed values for each, what each falls back to when unset, and the named looks (presets) on offer. Requires the 'website:read' scope. Call this before set_website_theme. Two things it will tell you that matter: unset is the normal state, because every token inherits from the organization's branding or from the tokens above it, so a good theme sets the fewest tokens it needs; and the tokens only look right in combination, which is what the presets are for - start from one and adjust two or three tokens rather than composing a whole theme.

list_area_blocks

ChatGPT
List area (court) blocks overlapping a date range - the time-ranged unavailability of a court, like time off for an instructor. Requires the 'areas:read' scope. A block with areaId null is club-wide and closes every court in that club. Use this to explain why a court has no availability, and check it before telling a customer a court is free.

list_area_types

ChatGPT
List the organization's area types - the kinds of space it books, such as "Padel court" or "Studio". Use this to resolve the areaTypeId that create_area requires: the type decides which sports the new area can be booked for and what it is priced from, so it is not a label and must not be guessed. Always call it before create_area_type; an organization is set up with a type per sport its clubs offer, so what the user is describing usually already exists. A type with isBookable false is not booked at all (a storeroom, a corridor); do not build courts on one. Requires the 'areas:read' scope.

list_areas

ChatGPT
List bookable areas (e.g. padel courts) for your organization. Requires the 'areas:read' scope. Optionally filter by club or sport. Use an area's id as areaId when creating a booking. Only areas that are bookable right now are listed - one closed for maintenance, or one that is not publicly visible, will not appear here even though it exists.

list_availability_changes

ChatGPT
List what changed in the organization's court availability since a cursor, oldest first: each change names the club, the area, the time window affected, why it changed and when. Use it to answer 'what changed since I last looked' or to catch up on missed availability webhooks - then re-read get_club_availability for the affected areas and windows, since a change says where to look, not what is now free. Pass since=0 to start from the beginning of retention, or the cursor from get_club_availability or from the previous call; keep calling with the returned cursor while hasMore is true. Requires the 'areas:read' scope.

list_booking_participants

ChatGPT
List the additional players sharing ONE booking - the other three on a doubles court. The person the booking is for is on the booking itself as contactId and is not repeated here. Works for any of the organization's bookings, whichever channel created it. This is not a class roster: class attendees each hold their own booking, so use list_class_bookings for those. Requires the 'bookings:read' scope.

list_booking_policies

ChatGPT
List the organization's booking policies, newest first. A policy sets a booking's cancellation refunds, payment timing, booking window, slot lengths and check-in rules. A policy is scoped on WHAT it governs (validFor: classes, areas and/or instructors, optionally narrowed to types; empty = every booking) and WHO (audience: contact types, tags, plans held; null = everyone), and narrowed to clubIds (empty = every club). When several apply, the most specific wins - club-specific first, then what+who, what, who, then the unscoped default; a tie goes to the newest. Do not work out by hand which one governs a booking - ask get_effective_booking_policy. Requires the 'booking-policies:read' scope.

list_bookings

ChatGPT
List bookings whose start time falls in a time window, optionally filtered by club, area, class, event, instructor, contact, or status. The window defaults to the next 7 days and may span at most 93 days per call - to cover a longer range, such as a year, call this repeatedly for consecutive windows of 93 days or less and combine the results rather than reporting the range as unsupported. Each call returns a 'total' for its window, so page with limit/offset until you have them all - though bookings created or cancelled while you page can shift rows across page boundaries, so treat a walk of a window that is still being booked as approximate. This returns bookings from every channel - each row carries a 'source' field - so it is the way to verify what was created and to see whether a slot is already taken by a member or staff booking. A class booking carries its occurrence as 'classId': class seats are one booking per attendee, all pointing at the same classId, and it is set on every one of them - so when several groups run in the same hour, group the rows by classId (or call list_class_bookings, which also resolves each attendee's name and check-in) rather than reporting that the bookings are not linked to a class. Note that a class attendee's row has no areaId and no instructorId of its own: the room and the coach belong to the class, so read them from get_class. On payment.status, 'no_charge' means nothing is collectable - a booking covered by a membership or an external program reports it while still carrying a price, so never total those as money owed; only 'unpaid' is still owed. Requires the 'bookings:read' scope.

list_checkins

ChatGPT
List attendance check-ins, newest first. Filter by customer, club, class, booking, or date range. Use this to verify whether a booking was attended. Requires the 'checkins:read' scope.

list_class_bookings

ChatGPT
List a class occurrence's roster: who is booked into it, with each attendee's name, booking status, whether they were checked in, the membership the seat was drawn from, and what they paid (contactEmail is filled in only when the key also holds 'contacts:read'). On payment.status, 'no_charge' means nothing is collectable - a seat covered by a membership or external program reports it while still carrying a price, so never report a covered seat as owing money; only 'unpaid' is still owed. This is how you answer 'two groups run at 10:00 - who is in which': class seats are one booking per person, all pointing at the same classId, so a plain booking list in that hour cannot separate them but this can. Attendees only - the occurrence's court hold and the instructor's own slot are excluded. Do not expect 'total' to equal the class's bookedCount: capacity counts confirmed/pending/checked_in plus standalone walk-in check-ins that have no booking to list, while this roster also keeps no-shows, since whether someone was enrolled and failed to turn up is usually the point of reconciling attendance. Cancelled seats are the one status omitted, unless you pass status='cancelled'. A seat with contactId null is an anonymous pass sold without naming its user - report it as anonymous and use bookerName, who paid for it, rather than treating the row as missing data. Requires the 'bookings:read' scope.

list_class_types

ChatGPT
List the organization's class types - the kinds of class it runs, such as "Padel clinic" or "Yoga". Use this to resolve the classTypeId that create_class takes, and the classTypeIds that scope a class pay rate policy. There is no paging; an organization has a handful of these. Read the whole record rather than matching on the name: a class type decides party size, cancellation behaviour and which account the class posts to, so two types with similar names are not interchangeable. Requires the 'classes:read' scope.

list_classes

ChatGPT
List the organization's class occurrences (group sessions), ordered by start time. One row is one occurrence: a weekly class has a row per session, linked by recurrenceId and occurrenceIndex, so a row's 'id' is exactly what a booking's classId points at. Each row carries the club, area, class type, assigned instructors, capacity with bookedCount/spotsLeft/waitlistCount, price, status, and externalSource/externalId when the class was imported from another system. The window is open by default - with neither bound the whole schedule is in scope, past included - so this is the tool for reconciling a historical timetable, not just upcoming sessions. Page with limit/offset against the 'total' each call reports. To find out WHO attended a class, call list_class_bookings with the class id. Requires the 'classes:read' scope.

list_clubs

ChatGPT
List the organization's clubs (locations), with each one's id, slug, status and city, and its booking labels. Call it to resolve a club the user names: get_club and update_club_booking_labels take the slug, and create_area, create_class and the instructor tools take the id. Every club is listed whatever its status; only an active one is open for booking. Requires the 'clubs:read' scope.

list_content

ChatGPT
List CMS content for your organization - posts, FAQs, documents, reusable website blocks and how-to guides. Requires the 'content:read' scope. By default returns only what the public can see; pass status 'all' and visibility 'all' to include drafts and private items, which additionally needs 'content:write'. The id in the result is what update_content and delete_content take. Translations are separate items sharing one slug: call this with neither locale nor language to see every variant and read each item's language - that is how you tell what has been translated and what has not.

list_custom_fields

ChatGPT
List the organization's contact custom fields - the extra fields kept on every contact, such as a t-shirt size, an emergency contact or a member number from the old system - with their type, options, and whether members see them or the sign-up form asks for them. Check it before creating a field so you do not add a second one meaning the same thing. Requires the 'contacts:read' scope.

list_document_rules

ChatGPT
List the organization's document rules, newest first: which members are asked to read and accept which documents (waivers, terms, consents), and how. Each rule has its documents, its filters (an empty axis means everyone), whether it is mandatory or optional, and whether it is required for entry (an unsigned member cannot check themselves in). Filter by documentId to find every rule asking for one document. Requires the 'document-rules:read' scope.

list_events

ChatGPT
List the organization's events (open days, socials, tournament weekends), earliest start first. status: draft (members see nothing), live (published), cancelled. from/to (ISO date or date-time) return events overlapping that window. Each event has bookedCount and its tickets; who booked is not included. Requires the 'events:read' scope.

list_forms

ChatGPT
List the organization's forms, newest first. createsAccount true is a sign-up form (registers people, can sell plans and products); false is a fill-in form (collects answers, e.g. a health declaration or a lead form). Each row has its publicUrl, which is live (null when the club has neither a member portal nor a live website, so nobody can open it yet), and submissionCount. Questions are not included - call get_form for them. Requires the 'forms:read' scope.

list_instructor_types

ChatGPT
List the organization's instructor types - the kinds of coach it has, such as "Padel coach" or "Personal trainer". Use this to resolve the instructorTypeId that create_instructor and update_instructor take. Always call it before create_instructor_type: an organization is set up with one type per sport its clubs offer, so the type the user is describing usually already exists under a slightly different name, and adding a second splits one roster in two. There is no paging. Requires the 'instructors:read' scope.

list_invoices

ChatGPT
List the invoices issued over a range of days, newest first - today when no dates are given. Use it for a brief of the day's invoices: who each was issued to, its number, amount and status. Days are read exactly as get_invoice_summary reads them, so total matches the count it reported. Pro-forma invoices are not included. Read-only: issuing, sending and voiding invoices stays in the 1club admin portal. Requires the 'invoices:read' scope.

list_media

ChatGPT
Browse or search the organization's media library. Requires the 'media:read' scope. Use search to find an image by name or alt text ('pool', 'yoga studio') and take the url from the result. ALWAYS get image URLs from here rather than composing one - a URL you invent will render as a broken image on the customer's website.

list_memberships

ChatGPT
List memberships in the organization, most recently started first. Filter by contactId to see what a customer holds, by planId, or by status (active, paused, cancelled, expired, used, pending_payment). Each membership reports usesRemaining, which is the session allowance the customer has left. Requires the 'memberships:read' scope.

list_messages

ChatGPT
List the organization's Messages (email, SMS, WhatsApp; drafts and sent; outbound and inbound), newest first, with a plain-text preview, the audience and recipientCount. Drafts written through the API have source 'api'. Use get_message for the full body and how each recipient received it. Requires the 'messages:read' scope.

list_pay_rate_policies

ChatGPT
List the organization's pay rate policies - the rules for what the club pays its coaches. A pay rate is what the GYM PAYS THE COACH. An instructor's hourlyRate is what a MEMBER PAYS for an hour with them. Never set one when the user meant the other. Each policy covers a slice of the schedule through three filters that each mean EVERYTHING when empty: no instructors named makes it the organization-wide default (it applies to every coach without one of their own), no classTypes covers every kind of class, no entranceScopes covers every way an attendee got in. Filter by instructorId to see the policies that actually decide one coach's pay, default policies included. This does not report what anyone has earned - the pay ledger is not on this API. Requires the 'instructors:read' scope.

list_payment_methods

ChatGPT
List the organization's own payment methods - the tenders staff record by hand, such as Cash and POS Terminal (both created with every organization) or a bank transfer - with who may choose each one. Card payments through a connected provider (Stripe, myPOS, DatecsPay) and the Wallet are not in this list and are not configured here: they follow from connecting the provider in 1club's Settings > Integrations. Requires 'transactions:read' or 'payment-methods:write'.

list_pipeline

ChatGPT
List the organization's sales pipeline: its stages in board order (each with how many contacts are in it) and the sources contacts come from. Use it to turn a stage or source name the user said into the pipelineStageId or sourceId that create_contact and update_contact take. Open stages are where leads are worked; the single Cold stage holds leads that went quiet. A lead leaves the pipeline on its own once it pays for something, so never move someone out of it just because they bought. Requires the 'contacts:read' scope.

list_plan_categories

ChatGPT
List every membership plan category in the organization, in display order - the headings on a price list and the sections of a plans page. Use this to turn a category name the user said into the planCategoryId that create_plan and update_plan take. There is no paging and no search: an organization has a handful of these and this returns all of them. Requires the 'plans:read' scope.

list_pricing_rules

ChatGPT
List the organization's pricing rules - its price list - in the order they win: lowest priority first. Each rule has an adjustmentType (absolute = the hourly price, fixed = an amount added per hour, percentage = a percentage change), the scopes it prices (empty = everything) and the conditions under which it applies. To see what a booking actually costs with every rule applied, use quote_booking_price. Requires the 'pricing-rules:read' scope.

list_product_categories

ChatGPT
List every product category in the organization, in display order - the tabs on the till and the sections of a shop page. Use this to turn a category name the user said into the categoryId that create_product, update_product and search_products take. There is no paging and no search: an organization has a handful of these and this returns all of them. Requires the 'products:read' scope.

list_progression_tracks

ChatGPT
List the progression tracks the organization uses - ladders of ranks in one discipline, like a belt system or a swim-stage scheme. Use this to resolve the progressionTrackId that create_class_type and update_class_type take. Each track lists the class types already counting toward it (classTypeIds): an empty list means every session counts toward its ranks, and once any class type is linked only sessions of the linked types do, so linking one recounts every member's progress on the track. Read-only: tracks and their levels are set up in the 1club admin dashboard. Requires the 'classes:read' scope.

list_revenue_accounts

ChatGPT
List the organization's revenue accounts - its chart of accounts - so you can resolve a revenueAccountId for create_plan, update_plan, create_product, update_product, or any of the class, instructor and area type tools. Each row carries the bookkeeping code, the name, whether it is still in use (isActive), and whether it is the account sales fall to when nothing names one (isDefault). Only set revenueAccountId when the user actually asked for a particular account: leaving it out posts the sale to the default, which is what a gym normally wants, and guessing an account misfiles their takings. An account with isActive false is retired - existing plans may still point at it, but do not attach it to anything new. Requires any scope that carries a revenue account id: the plans, products, classes, areas and instructors scopes (either the read or the write half - they are granted independently), plus 'transactions:read' and 'revenue-accounts:write'.

list_staff

ChatGPT
List everyone with access to the organization's admin portal - their name, email, role (admin, manager, front_desk or instructor), whether they are an owner, and whether they have accepted their invitation. Members are not listed. Use it to find the userId update_staff_role takes. Requires the 'staff:read' scope.

list_system_templates

ChatGPT
List the emails 1club sends automatically on the club's behalf that the club may replace with its own copy (booking confirmation, payment confirmation, welcome email...), each with the variables it supports. hasOverride says whether the club already has its own copy; overrideTemplateId is that template's id for get_template / update_template. Requires the 'templates:read' scope.

list_tags

ChatGPT
List the organization's tags with how many contacts carry each. type says who applies a tag: manual tags are put on by people (create_tag, add_contact_tags); system tags are smart tags the tagging engine applies from the smart tag rules (get_smart_tag_settings), such as Active, Trial or Expiring; interest tags come from what a person books. Use it to resolve a tag name before tagging, and to check a tag does not exist already before creating one. Requires the 'contacts:read' scope.

list_template_variables

ChatGPT
List the {{variables}} a template may use, with what each expands to. Pass type ("message" or "transactional") for an ordinary template, or systemTemplateKey for a copy of a system email - exactly one of the two. Use only these: any other variable is refused on create and update. Requires the 'templates:read' scope.

list_templates

ChatGPT
List the organization's message templates by name, with their full content. type "message" templates are applied in the message composer, "transactional" ones are sent by automations; a template with a systemTemplateKey is the club's own copy of a system email and is sent instead of the built-in one. Deleted templates are not listed. Requires the 'templates:read' scope.

list_transactions

ChatGPT
List your organization's charges, ordered by creation time (newest first). The API calls a charge a transaction; to the user it is always a charge. Requires the 'transactions:read' scope. Pass contactId, bookingId or membershipId to list that record's charges; with one of those and no dates there is no window at all, so the whole history of that contact, booking or membership comes back in one walk. Otherwise startDate is inclusive and endDate is exclusive, and when both are omitted the window defaults to the last 24 hours; a single call may span at most 93 days, so cover a longer range with repeated calls, passing each window's endDate as the next window's startDate - the exclusive upper bound means that chains without counting a boundary charge twice. This returns a bare array with no total, so a full page (limit rows) means there are likely more - keep advancing offset until a short page comes back. Rows come newest first, so a charge created while you are paging lands on the first page and shifts later rows down, which can push an unread one past an offset you have already passed; pass an explicit endDate in the past instead of relying on the 'now' default and nothing written mid-walk can move your pages.

list_website_pages

ChatGPT
List every page on the website with its slug, title, whether it is the homepage, the types of the sections on it in order, and its SEO fields - but not the section settings themselves. Use it to see what pages exist and how each one is built at a glance, to find the slug of a page the user named, or to spot pages missing a meta description; then call get_website_page for the full sections of the one you will edit. Reads the draft, which is what the edit tools change. Requires the 'website:read' scope.

list_website_releases

ChatGPT
List the website's publish history, newest first. Requires the 'website:read' scope. The entry with isActive true is what the public is being served; its id is what rollback_website takes.

list_websites

ChatGPT
List every website the organization owns, its default one first. Requires the 'website:read' scope. Only needed when an organization runs more than one site - otherwise go straight to get_website, which defaults to the right one.

publish_event

ChatGPT
Publish a draft event: it goes live on the website and member portal (as its visibility allows) and its tickets go on sale immediately. Get the user's explicit go-ahead first. Publishing a live event changes nothing; a cancelled event cannot be published (duplicate_event it instead). Requires the 'events:write' scope.

publish_website

ChatGPT
Publish the website, making every unpublished edit visible to the public. Requires the 'website:publish' scope - a key may be allowed to edit but not to publish, in which case tell the user their changes are saved and waiting, and give them the previewUrl from get_website to review. This is the only tool here that changes what visitors see, so confirm with the user before calling it. Use mode 'snapshot' before a large redesign to record a version that can be rolled back to; the default 'amend' updates the live version in place and keeps the history clean.

quote_booking_price

ChatGPT
Price a booking without making it, using the same calculator checkout uses: the base rate, every pricing rule that applies (listed in appliedRules), tax, and whether a membership would cover it. Name what is booked with areaId, instructorId or classId (an area plus an instructor is a court booked with a coach). Pass contactId to price it for a specific person (their plans unlock member rates), or planIds to ask what a holder of those plans would pay. Times are ISO date-times with an offset; at most 24 hours. Use it after writing a pricing rule to confirm it does what the user meant. Requires the 'pricing-rules:read' scope.

refund_transaction

ChatGPT
Record money given back out of a settlement this API key recorded with create_transaction. Nothing is moved; the club's revenue is reduced by it. Omit amount to refund everything still refundable. A reference already recorded on the settlement is refused (409); pass idempotencyKey too, so two retries in flight cannot both be recorded. Requires the 'transactions:write' scope.

remove_booking_participant

ChatGPT
Remove an additional player from a booking. Does not affect the person the booking is for. Reaches the same bookings as cancel_booking: any of the organization's over an OAuth connection, and only the ones it created itself with a developer-managed API key. Requires the 'bookings:write' scope.

remove_contact_tags

ChatGPT
Take tags off contacts, keeping the rest. Smart and interest tags are refused, as with add_contact_tags: change the smart tag rules instead. Returns each contact's tags as they now stand. Requires the 'contacts:write' scope.

remove_pay_rate_policy_instructor

ChatGPT
Take one coach off a pay rate policy. A pay rate is what the GYM PAYS THE COACH. An instructor's hourlyRate is what a MEMBER PAYS for an hour with them. Never set one when the user meant the other. Their not-yet-finalized pay re-resolves to whichever policy covers them next, or to nothing if none does; days already closed stay as they were. Removing the LAST named coach does not disable the policy - it turns it into the organization-wide default, applying to every coach without a policy of their own - so check get_pay_rate_policy first and warn the user when that would happen. Returns the policy as it now stands. Requires the 'instructors:write' scope.

remove_website_section

ChatGPT
Remove one section from a page, leaving the rest alone. sectionIndex is the section's 0-based position from get_website_page; every later section shifts down by one, so re-read the page before removing another rather than reusing an old index - removing two by their original indexes deletes the wrong one. To drop several sections at once, send the page's remaining sections with update_website_page instead. Returns the page with the section gone. Edits the draft, so the section stays live until you publish. Requires the 'website:write' scope.

reset_role_permissions

ChatGPT
Put the manager, front desk or instructor role back to 1club's default permissions, dropping every change the organization made to it. Requires the 'staff:write' scope and an admin or owner connected. Only works for a person connected over OAuth: an API key is refused.

rollback_website

ChatGPT
Restore an earlier published version of the website and put it live. Requires the 'website:publish' scope. Find the version with list_website_releases. This DISCARDS any unpublished draft edits, because the old version becomes the draft as well as the live site - confirm with the user before calling it. The rollback is recorded as a new version, so it can itself be undone.

search_contacts

ChatGPT
Find contacts (customers) in the organization by name, email, or phone. Matching is case-insensitive and cross-script, so 'ivan' also matches 'Иван'. Use this to turn a customer's name into the contactId that create_booking needs. Requires the 'contacts:read' scope. When a name matches more than one contact, ask the user which one they mean rather than guessing - booking for the wrong person is not visible to them until later.

search_instructors

ChatGPT
Find instructors (coaches) in the organization by name. Matching is case-insensitive and cross-script, so 'maya' also matches 'Мая'. Use this to turn a coach's name into the instructorId that create_booking accepts. Check isBookable on the result: an instructor who does not take one-on-one bookings cannot be booked at all, and that is never overridable. Requires the 'instructors:read' scope. When a name matches more than one instructor, ask the user which one they mean.

search_plans

ChatGPT
Find membership plans in the organization by name or description. Use this to turn a plan's name into the planId that create_membership needs, and to see what it costs before selling it: each plan reports its price, its joining fee (charged once on top of the price), billing frequency, and the session allowance a membership on it gets. Only plans the gym still sells are returned by default, so anything you find here can be sold; pass includeInactive to also see retired ones. Requires the 'plans:read' scope. When a name matches more than one plan, ask the user which one they mean.

search_products

ChatGPT
Find products in the organization's catalogue - what it sells over the counter, from drinks to racket grips. Matches name and description as a substring, and SKU or barcode exactly (half a barcode finds nothing). Each result reports its price, cost price, category and whether it is still on sale. Use this to turn a product's name into the productId that update_product and get_product_availability need. Deactivated products are included, so pass isActive true when you only want what is currently sold. Requires the 'products:read' scope. When a name matches more than one product, ask the user which one they mean.

set_contact_custom_field_values

ChatGPT
Set custom field values on one contact, leaving its other values alone. Name each field by fieldId or by name (from list_custom_fields); null clears a value. A select field only takes one of its options. Returns every value the contact now has. Requires the 'contacts:write' scope.

set_form_questions

ChatGPT
Set the questions a fill-in form asks, in order. Call get_form first. Resend EVERY question you are keeping, with its id - answers are stored against the id, so a question resent without it becomes a new question and loses the link to the answers already given. List questions to delete in removeQuestionIds; a question is never deleted by leaving it out, and a list missing one is refused. A deleted question's past answers stay readable. LIVE immediately, so confirm the wording with the user first. Sign-up forms have no questions of their own. Requires the 'forms:write' scope.

set_website_css

ChatGPT
LAST RESORT for styling - use set_website_theme instead for anything it covers: colours, fonts, heading weight and tracking, corner radius, shadows, border width, spacing, button shape and casing, and motion. Custom CSS is invisible to the 1club editor and to every other tool, so the customer cannot change or undo it without editing CSS, and you cannot read back what a rule did. Reach for it only when the user asks for something no design token expresses, or explicitly asks for custom CSS. Requires the 'website:write' scope. Send the complete stylesheet - this overwrites, so call get_website_css first and edit what comes back. Rules are scoped to the site automatically. Target sections with .section-{type} (.section-hero, .section-footer) and prefer theme variables like var(--primary-color) over fixed colours, so the styling survives a light/dark switch. Script tags, @import and javascript: URLs are refused. Edits the draft; call publish_website to make it live.

set_website_theme

ChatGPT
Change how the website LOOKS - its colours, fonts, corner radius, shadows, borders, spacing and motion. Requires the 'website:write' scope. This is the right tool for almost every styling request: a serif for headings, square corners, a darker palette, more breathing room, less animation, a more premium feel. Call get_website_theme_tokens first. Prefer preset as the starting point and use tokens to adjust a few values on top of it. Individual tokens merge, so setting one leaves the rest alone; send null for a token to give it back to the organization's branding. A preset is different: it REPLACES the look, clearing every token any preset owns before applying its own, so a hand-set font does NOT survive a preset unless you resend it in tokens. Edits the draft, so nothing public changes until publish_website - which is the point of setting a palette here rather than in the organization's branding, where it would go live immediately with no preview and no way back. Prefer this over set_website_css for anything it covers: a token is previewable, revertible and visible to the customer as a setting, while custom CSS is none of those.

unpublish_event

ChatGPT
Take a live event back to draft, hiding it from members. Refused when anyone holds an active booking for it - an event people booked has to be cancelled instead (cancel_event), which tells them. Requires the 'events:write' scope.

update_area

ChatGPT
Edit an area: rename it, reprice it, change its hours or capacity, or take it out of service with status maintenance or inactive. Send only the fields that change. Read it back afterwards with get_area, not list_areas - a closed area leaves the list. An area cannot be moved to another club and cannot be deleted - it carries booking history, so closing it with status is the way to retire one. Requires the 'areas:write' scope.

update_area_type

ChatGPT
Change an area type. This is the widest edit on this surface: every area of the type inherits sports, defaultPricePerHour, defaultMaxPlayers and isBookable, so one call reprices or re-sports every court of that kind at once and each of them shows up as an availability change to anyone consuming the feed. Confirm that with the user before changing one of those four. sports replaces the whole list rather than adding to it. To change one court only, use update_area instead. There is no delete. Requires the 'areas:write' scope.

update_booking

ChatGPT
Edit a booking by its 1club booking ID: reschedule, move area, attach or remove the instructor, reassign the contact, change notes or price, or make it recur. Send only what changes. Reaches the same bookings as cancel_booking and follows the admin portal's rules: a cancelled booking is final, a class seat takes its time and price from the class (use update_class), and a court or coach that is taken or blocked refuses with details.conflicts - check get_platform_area_availability first. The booking's charge follows the new price; a drop below what was already paid is refused. Requires the 'bookings:write' scope.

update_booking_policy

ChatGPT
Edit a booking policy. Send only what changes - but lists (clubIds, eventIds, cancellationRules, allowedProductCategoryIds, upsellPlanIds) and the validFor and audience objects REPLACE what is stored, so call get_booking_policy first and send the whole value. null clears a limit or the audience. The slot rules are checked against the policy as it will stand (a new step must still divide the stored minimum). Policies are live as soon as they are written: new bookings follow them at once (existing bookings keep the cancellation terms they were made under). Confirm with the user first, and check the outcome with get_effective_booking_policy. Requires the 'booking-policies:write' scope.

update_class

ChatGPT
Update one class occurrence. For a recurring class, scope=all_future applies the change to this and every later occurrence; the default only changes the one you named. To move where a series ends - extend it, shorten it, or make it open-ended - send recurrence with scope=all_future, on its own. The people booked on it are not told unless you set notifyCustomer. Requires the 'classes:write' scope. Use an idempotencyKey for retry safety.

update_class_type

ChatGPT
Change a class type. Send only the fields that change. This is not only about future classes: every class already scheduled as this type reads these values too, so lowering maxPartySize caps the next booking on classes that are already on the calendar, and changing revenueAccountId moves where their future sales post. There is no delete - a type with classes on it would strand them, so that stays in the 1club admin portal. Requires the 'classes:write' scope.

update_club

ChatGPT
Edit a club's profile - what members read about it and where it is: name, subtitle, description, phone, email, website, address, opening hours, amenities and sports - or hide it from members while staff keep running it (status inactive). Live at once on the club's website, member portal, app and 1club.me. Send only what changes; resolve the slug with list_clubs and ask which club when there are several. Moving the address moves the map pin and the timezone with it, unless you send timezone too. A club listed on 1club.me has changes to its listing held for review (pendingReview in the result) and keeps its approved listing until then - tell the user so. Closing a club for good, its slug, billing and kiosk settings are changed in 1club, not here. Requires the 'clubs:write' scope.

update_club_booking_labels

ChatGPT
Rename the cards members choose from under "What would you like to book?" on one club's website, member portal, mobile app and 1club.me page: the private training card (an hour with a coach), the group activities card (classes) and the areas card. Use it when the user wants that wording to be their own, e.g. "Coaching" instead of "Private training", and to translate it. Live immediately, no publish step. Only the card TITLE is the club's: the line under it is always the platform's (a count such as "4 available", or the class type names under group activities), so do not offer to change it. A card for a named area type (e.g. "Padel court") shows that type's name, not areasLabel - renaming that one means renaming the type with update_area_type, which renames it everywhere, so say so before doing it. Labels are per club: an organization with several clubs sets each one, so ask which club when the user did not say, and resolve its slug with list_clubs. Send only what changes. translations merge into what the club already has. Translate a new label into every language the organization serves (supportedLocales on get_website) other than the one it is written in, or members reading in those languages see the untranslated label. Requires the 'organization:write' scope, the one that also sets the organization's languages - an OAuth connection that does not hold it has to be reconnected with it ticked.

update_contact

ChatGPT
Correct or complete a contact's details - their name, email, or phone - or move them in the sales pipeline. Send only the fields that change; null clears lastName, email, or phone, and anything omitted is left alone. A contact must keep at least one of email or phone, so the last one cannot be cleared, and a field the club has marked required for staff cannot be cleared either. A contact who has never been a customer is a lead while they are in a pipeline stage, so moving them in or out can change their type. Two edits are refused outright: an email another contact in the organization already uses, and any change to the email of a contact whose address is also their 1club login - that one is theirs to change, not staff's. Requires the 'contacts:write' scope.

update_content

ChatGPT
Update a content item. Requires the 'content:write' scope. Takes the numeric contentId from list_content, not the slug. Only the fields you send change, but tags and images replace their whole list. To take something off the public site without losing it, set status to 'draft' rather than deleting it. language is editable here, so a variant tagged with the wrong locale can be corrected in place instead of being deleted and rewritten - send an empty string to turn it back into the original that every locale falls back to.

update_custom_field

ChatGPT
Change a contact custom field: its label, options, whether it is required or asked at sign-up, who sees it, or switch it off with isActive false. Send only what changes. Requires the 'contacts:write' scope.

update_document_rule

ChatGPT
Edit a document rule. Send only what changes - but documentIds and filters each REPLACE the stored value when sent (an axis left out of filters is cleared and then means everyone), so call get_document_rule first and send the complete set. Switching a rule to optional also switches off its typed-name and entry requirements; switching it to mandatory clears its consentChannel. Changing a rule never un-signs anybody. Turning on requiredForEntry, or widening the audience of an entry rule, changes who can check themselves in immediately - confirm with the user. Requires the 'document-rules:write' scope.

update_event

ChatGPT
Edit an event in any state. Send only the fields that change. tickets, instructorIds and areaIds each REPLACE the whole set, so call get_event first and resend every ticket you keep with its id. Changes to a live event are visible to members at once, so confirm them with the user first. Requires the 'events:write' scope.

update_form

ChatGPT
Edit a form. Send only the fields that change. The change is LIVE immediately, so confirm it with the user first. The slug and createsAccount cannot be changed - the slug is the address people were given; create a new form instead. There is no delete: removing a form deletes every submission made through it, so point the user to the 1club admin portal for that. Questions are changed with set_form_questions. Requires the 'forms:write' scope.

update_instructor

ChatGPT
Edit an instructor's bookable profile: their sports, the rate a member pays them, their availability, who may book them. Send only the fields that change. Set isActive false to retire a coach and true to bring one back - there is no delete, because they carry bookings, classes and pay history. Read the result rather than assuming the payload landed as sent: retiring a coach always forces bookability back to Admin_only, and bookability never outruns visibility. This never grants staff-portal access, and cannot move a profile to a different person. To change what the GYM pays this coach, use update_pay_rate_policy instead. Requires the 'instructors:write' scope.

update_instructor_type

ChatGPT
Change an instructor type. Send only the fields that change. maxConcurrentBookings here is the shape of the type - what a booking is actually checked against is each instructor's own value, so changing it does not retroactively widen the coaches already on it. maxPlayers is different: every coach of the type reads it live, so one call changes how many people every session with them may bring. Confirm that with the user first. There is no delete: removing a type would silently unfile every coach on it, so that stays in the 1club admin portal. Requires the 'instructors:write' scope.

update_media

ChatGPT
Update a media item's name, alt text or caption. Requires the 'media:write' scope. The file and its URL cannot be changed. Filling in alt text is worth doing: it is what screen readers announce, and it makes the image findable by search.

update_membership

ChatGPT
Change a membership: pause it, resume it, cancel it, or adjust its auto-renewal, session allowance and minimum commitment. Its end date follows from the plan and cannot be changed here. Send status on its own - autoRenew, the allowance and the commitment cannot be combined with it, because a status change sets them itself. Cancelling defaults to end_of_period, which keeps access until the paid period ends; use immediate to end access today. 'active' only applies to a paused membership. Changing the plan is not supported here - that needs proration and invoicing, so do it in 1club. Requires the 'memberships:write' scope.

update_message_draft

ChatGPT
Edit a draft Message. Send only what changes. Sending contactIds or segment replaces the audience. A Message that was already sent cannot be changed, and the channel cannot change (write a new draft instead). With an API key only drafts written through the API can be edited. It is NOT sent: there is no way to send through this tool set. The draft waits in the 1club admin app (Messages, drafts) for a member of staff to review and send it - tell the user that. Requires the 'messages:write' scope.

update_notification_setting

ChatGPT
Change one notification category's default for one role: switch it on or off, pick its channels (app, email, sms), or lock it so people cannot change it themselves. Send only what changes. WhatsApp cannot be set here - a person has to opt in to it themselves. The new default reaches everyone in the role who has not chosen for themselves; offer apply_notification_settings when overriddenUserCount shows people it will not reach. Requires the 'notifications:write' scope.

update_pay_rate_policy

ChatGPT
Edit a pay rate policy: its name, its rates, or which coaches, class types and entrance routes it covers. A pay rate is what the GYM PAYS THE COACH. An instructor's hourlyRate is what a MEMBER PAYS for an hour with them. Never set one when the user meant the other. Send only what changes - but note that any list you DO send replaces the whole set, so read the policy first and send the full list rather than just the addition. earnings.kind cannot change. Changing rates re-resolves the coaches' not-yet-finalized pay from today onward; days already closed stay as they were. Requires the 'instructors:write' scope.

update_payment_method

ChatGPT
Rename a payment method, change its code, or change who may choose it (visibility). Send only what changes. Payments already recorded with it keep pointing at it, so a rename shows on them too. Requires the 'payment-methods:write' scope.

update_plan

ChatGPT
Update a membership plan. Set isActive=false to retire a plan that is already in use - it stops appearing in search_plans but stays readable with get_plan, and search_plans with includeInactive finds it again. Requires the 'plans:write' scope.

update_plan_category

ChatGPT
Rename a membership plan category or move it in the display order. The plans in it are unaffected. Requires the 'plans:write' scope.

update_pricing_rule

ChatGPT
Edit a pricing rule. Send only what changes - but scopes and conditions, when sent, REPLACE the whole list, so call get_pricing_rule first and send the full list you want. Switching adjustmentType needs the matching amount (to percentage: send percentageAdjustment in the same call). To stop a rule without deleting it, send isActive false. Rules are live as soon as they are written: every new quote and booking uses them (existing bookings keep their price). Confirm the change with the user first, then check it with quote_booking_price. Requires the 'pricing-rules:write' scope.

update_product

ChatGPT
Change a product: reprice it, recategorise it, rename it, or take it off the till with isActive false. Only the fields you send change; send null to clear a nullable one. images and features replace the whole list, so read the product with get_product first if you are adding to one. Setting isActive false is how a product is removed here - it takes it off the till and keeps its sales history. There is no tool that deletes one outright; that stays in the 1club admin portal. Requires the 'products:write' scope.

update_product_category

ChatGPT
Rename a product category or move it in the display order. Products in it are unaffected. Requires the 'products:write' scope.

update_revenue_account

ChatGPT
Change a revenue account: rename it, recode it, retire it with isActive false, or make it the default. Send only what changes. Three refusals to expect - a code another account already uses; isDefault false on the LAST account holding the default, because an organization with no default has nowhere to post a sale that names no account (an organization that somehow has two can have the extra cleared); and anything leaving the default retired, since sales would keep posting to an account the API calls out of use. Move the default by setting it true on the other account instead, or reactivate and promote in one call. Requires the 'revenue-accounts:write' scope.

update_role_permissions

ChatGPT
Grant and revoke permissions on the manager, front desk or instructor role, keeping the rest - e.g. let front desk see billing with grant ["billing.read.club"]. Only catalog permissions (from get_role_permissions) can be granted. It applies to everyone with that role. Say exactly what changes before you call it. Requires the 'staff:write' scope and an admin or owner connected. Only works for a person connected over OAuth: an API key is refused.

update_smart_tag_settings

ChatGPT
Change the smart tag rules: switch a category on or off, or rename a tag, recolour it or change its threshold. Send only the categories that change; each is merged into the organization's, so { "engagement": { "enabled": true } } switches one on. A tags list replaces that category's whole list, so call get_smart_tag_settings first and send the list back with your edits, keeping every tag's id (the id is what links it to the contacts carrying it - a tag with a new id is a new tag). Contacts are re-tagged on the next tagging pass, not at once. Requires the 'contacts:write' scope.

update_staff_role

ChatGPT
Give a member of staff another role: admin (everything), manager, front_desk or instructor. The same limits as 1club's Users page apply to whoever is connected: nobody changes their own role, a manager can only act on and promote up to manager, and the last owner stays an owner. Say what the new role allows before you change it. Making someone an instructor needs their instructor profile first (create_instructor); without one the role is not changed. It takes effect when that person's session next refreshes. Requires the 'staff:write' scope. Only works for a person connected over OAuth: an API key is refused.

update_tag

ChatGPT
Rename a manual tag or change its colour; contacts carrying it keep it under the new name. Smart tags (type system) are renamed in the smart tag rules with update_smart_tag_settings instead. Requires the 'contacts:write' scope.

update_template

ChatGPT
Edit a message template. Send only what changes; content replaces the whole body, so read the template with get_template first when changing part of it. Variables must be ones list_template_variables allows for the template's type (for a copy of a system email, pass its systemTemplateKey to list_template_variables). The type of a system email copy cannot change. Per-language versions are managed in the admin portal and are not touched. Not available on Free. Requires the 'templates:write' scope.

update_website

ChatGPT
Update website-level settings: its name, which club it represents (the header/footer logo), whether visitors can switch between light and dark, the site-wide SEO defaults, and which languages the organization serves. Requires the 'website:write' scope, plus 'organization:write' when setting supportedLocales or defaultLocale. Cannot change the site's address or take it online/offline - those stay in the admin dashboard. Name and clubId take effect immediately (logos are branding, not a published token); the rest edits the draft - call publish_website to make those live. Language fields also apply immediately.

update_website_layout

ChatGPT
Update the site header or footer, which appear on every page. Requires the 'website:write' scope. This is where a page gets linked into the navigation. The link arrays - navItems on the header, linkCategories or links on the footer - REPLACE what is there, so read the current layout from get_website and send the complete list, or you will drop the links you left out. Other fields merge. See get_website_section_types for the header and footer fields.

update_website_page

ChatGPT
Update a website page - its title, its SEO fields, or its whole content. Requires the 'website:write' scope. This is the main way to build a page: sections REPLACES every section on the page, so call get_website_page first and send back the full list including anything you are keeping. Omitted fields are left alone, so you can change just the title without touching the content. Edits the draft; call publish_website to make it live.

update_website_section

ChatGPT
Change the settings of one section on a page, leaving the rest of the page alone. Requires the 'website:write' scope. Use this for a small edit - a headline, a limit, a background tone, one section's translations; use update_website_page to restructure a page. The fields you send are merged into the section's existing settings, but an array field (like a list of CTAs) replaces the whole array. sectionIndex is the section's position from get_website_page, counting from 0 - indexes shift when sections are added or removed, so re-read the page rather than reusing an old one.

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

Similar Apps