Getting started
The Club-tool public API is a JSON REST API over HTTPS at
https://app.club-tool.nl/api/v1. It gives your integration access to the
data of your own club — nothing else.
1. Check your plan
The public API is part of the Pro plan. On other plans
the API responds with 403 upgrade_required; existing keys are kept and
start working again after an upgrade.
2. Create an API key
- Sign in to app.club-tool.nl as a club administrator.
- Go to System → API and click New API key.
- Give the key a label (e.g. membership sync) and tick the scopes it needs.
- Copy the full key immediately — it is shown only once.
Treat the key like a password: store it in a secret manager,
never commit it to a repository, and never ship it in client-side code. Keys start with
ct_live_ so secret scanners can recognise them.
3. Make your first call
curl https://app.club-tool.nl/api/v1/club \
-H "Authorization: Bearer ct_live_..."
The response tells you which club the key belongs to and which scopes it carries:
{
"id": 12,
"name": "BC Amersfoort",
"slug": "bca",
"key": { "label": "membership sync", "prefix": "ct_live_3f9K",
"scopes": ["members:read", "members:write"] }
}
4. Explore the resources
| Resource | Read | Write | Bulk |
|---|---|---|---|
/api/v1/members | ✓ | create · update · delete | ✓ (mixed, max 100) |
/api/v1/groups | ✓ | — (memberships via members) | — |
/api/v1/events | ✓ | create · update · delete | — |
/api/v1/seasons | ✓ | — | — |
/api/v1/competition-teams | ✓ | create · update · delete | — |
/api/v1/attendance | ✓ (filtered) | upsert | ✓ (max 100) |
/api/v1/kennismakers | ✓ | create · update · status | — |
Every request/response shape is documented in the API reference, generated from the OpenAPI 3.1 spec — point your favourite client generator at that URL.
5. Incremental sync
Every resource carries an updated_at timestamp (UTC). Pass
?updated_since= on list endpoints to fetch only what changed since your
last run — store the start time of each sync and use it as the next cursor:
curl "https://app.club-tool.nl/api/v1/members?updated_since=2026-07-01T22:00:00Z" \
-H "Authorization: Bearer ct_live_..."
Deletions are not reflected in updated_since results — schedule a
periodic full sync to reconcile removed records.
6. Example: create a member
curl -X POST https://app.club-tool.nl/api/v1/members \
-H "Authorization: Bearer ct_live_..." \
-H "Content-Type: application/json" \
-d '{"name": "Sam de Vries", "birth_date": "2012-03-14",
"gender": "female", "group_ids": [3]}'
Next: learn how scopes work, and make your writes retry-safe with idempotency keys.