# Ledenboek API > Ledenboek is membership management software for associations in the > Netherlands, Belgium and Germany. The Ledenboek API (v2) gives programmatic > access to one association's members, groups, committees, events and > invoices. This file summarises the API for AI assistants; the OpenAPI spec is > the complete reference. ## Essentials - Base URL: https://api.ledenboek.nl/v2 - Format: JSON. Errors are application/problem+json (RFC 9457). - OpenAPI 3.0 spec: https://developers.ledenboek.nl/openapi.json (also /openapi.yaml). The test suite checks every API response against this file. - Authentication: `Authorization: Bearer `. Keys start with `lb_live_` (production data) or `lb_test_` (a sample association: no email or payment requests are sent). A key in the query string (`?api_key=`, `?access_token=`) is rejected with `api_key_in_url`. - A key belongs to exactly one association. An administrator creates it in Ledenboek under Settings → API keys and chooses its scopes. - Scopes: leden:lezen, leden:schrijven, leden:gevoelig, groepen:lezen, groepen:schrijven, evenementen:lezen, evenementen:schrijven, facturen:lezen, facturen:schrijven. `leden:gevoelig` adds date_of_birth and sepa to members. - First request: `GET /v2/organization` works with any key and returns the association, its enabled modules and the key's scopes. ## Conventions - Pagination: `?limit=1..100` (default 25) and `?starting_after=`. Lists return `{ "object": "list", "data": [...], "has_more": bool, "next_cursor": string|null }`, ordered by id. - Incremental sync: `?updated_since=` returns records changed at or after that moment. Deleted records do not appear. - Idempotency: send `Idempotency-Key: ` on POST. The same key with the same request returns the original response (header `Idempotent-Replayed: true`); keys are kept for 24 hours. Same key with a different body: 422 `idempotency_key_reused`. Still running: 409 `idempotency_in_progress`. - Rate limit: 600 requests per minute per live key, 120 per test key, fixed one-minute window. Headers `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`; on 429 also `Retry-After` (seconds). - Language: `title` and `detail` of errors follow `Accept-Language` (nl, en, de, fr; default en). `type` is stable: https://developers.ledenboek.nl/errors/{code}. - Versioning: /v2 stays. Fields and endpoints may be added; clients must ignore unknown fields. Nothing is removed or changed in meaning without a new version, and an old version keeps working for at least 12 months with `Deprecation` and `Sunset` headers. ## Error codes - `api_key_in_url` (400): API key in URL. https://developers.ledenboek.nl/en/errors/api_key_in_url - `invalid_request` (400): Invalid request. https://developers.ledenboek.nl/en/errors/invalid_request - `invalid_api_key` (401): Invalid API key. https://developers.ledenboek.nl/en/errors/invalid_api_key - `missing_api_key` (401): Missing API key. https://developers.ledenboek.nl/en/errors/missing_api_key - `subscription_required` (402): Subscription required. https://developers.ledenboek.nl/en/errors/subscription_required - `insufficient_scope` (403): Insufficient permissions. https://developers.ledenboek.nl/en/errors/insufficient_scope - `module_disabled` (404): Module disabled. https://developers.ledenboek.nl/en/errors/module_disabled - `not_found` (404): Not found. https://developers.ledenboek.nl/en/errors/not_found - `already_in_group` (409): Already in group. https://developers.ledenboek.nl/en/errors/already_in_group - `already_registered` (409): Already registered. https://developers.ledenboek.nl/en/errors/already_registered - `event_full` (409): Not enough spots. https://developers.ledenboek.nl/en/errors/event_full - `event_requires_payment` (409): Payment required. https://developers.ledenboek.nl/en/errors/event_requires_payment - `group_follows_subscription` (409): Group follows subscriptions. https://developers.ledenboek.nl/en/errors/group_follows_subscription - `idempotency_in_progress` (409): Request still in progress. https://developers.ledenboek.nl/en/errors/idempotency_in_progress - `invoice_not_sendable` (409): Invoice cannot be sent. https://developers.ledenboek.nl/en/errors/invoice_not_sendable - `membership_already_ended` (409): Membership already ended. https://developers.ledenboek.nl/en/errors/membership_already_ended - `recipient_without_email` (409): No email address. https://developers.ledenboek.nl/en/errors/recipient_without_email - `registration_closed` (409): Registration closed. https://developers.ledenboek.nl/en/errors/registration_closed - `idempotency_key_reused` (422): Idempotency-Key already used. https://developers.ledenboek.nl/en/errors/idempotency_key_reused - `validation_failed` (422): Validation failed. https://developers.ledenboek.nl/en/errors/validation_failed - `rate_limited` (429): Too many requests. https://developers.ledenboek.nl/en/errors/rate_limited - `internal_error` (500): Internal error. https://developers.ledenboek.nl/en/errors/internal_error ## Example ``` curl https://api.ledenboek.nl/v2/members?limit=100 \ -H "Authorization: Bearer $LEDENBOEK_API_KEY" ``` ## Other ways to connect - MCP connector for Claude and ChatGPT: https://ledenboek.nl/mcp (OAuth authorization code flow with PKCE, dynamic client registration at https://ledenboek.nl/oauth/register). For a person working with an assistant, not for server-to-server integrations. - Embeds for an association's website: ``. No key needed; only public information. ## Pages - https://developers.ledenboek.nl/en/quickstart - https://developers.ledenboek.nl/en/authentication - https://developers.ledenboek.nl/en/concepts - https://developers.ledenboek.nl/en/reference - https://developers.ledenboek.nl/en/glossary (Dutch terms in the app and their API names) - https://developers.ledenboek.nl/en/changelog - https://developers.ledenboek.nl/en/terms