- The API is documented as OpenAPI 3.0. The readable reference is https://api.memberspot.de/api and the machine-readable spec is https://api.memberspot.de/api-json, so the plugin’s schemas were built from the spec rather than from prose.
- Auth is an
X-API-KEYheader. A missing key answers 400, not 401; only an invalid key answers 401. The plugin treats both as auth failures and never retries them. auth.checkreturnsschoolId, notid. The spec documents that route with no response body, so its shape was taken from the live API. It is the cheapest way to confirm a key works.namemeans last name. MemberSpot splits a member intofirstnameandname, and this plugin keeps those names exactly.createdand the other dates are ISO date-times.- Paging uses two different names. A page request takes
lastLoadedIdand the response returnsnextPage; the course-progress list calls the inbound cursorlastLoadedCourseId. PassnextPagestraight back aslastLoadedId. - Many operations come in email and uid pairs. Most writes that target a member exist twice, once keyed by email and once by uid; prefer the uid form when you already have the uid.
users.setOfferExpires,users.setCourseStartDate,users.loginTokenandusers.offerstake a uid only, so look the uid up withusers.findByEmailfirst. - Deletes are capped at 10 members per call. The schema enforces the cap locally, because the API rejects an 11th rather than batching it.
- Members are deleted, not deactivated.
users.deleteandusers.deleteByUidremove the account and its progress. To keep the record, revoke offers instead.users.setOfferStatewithactive: falserevokes one offer, and the member keeps any other offer. To remove all access, list the grants withusers.offersand revoke each one. - Grant-state writes need
active. MemberSpot deletes the grant whenactiveis missing, so the offer-state and order-state writes require it. Passtrueto grant,falseto revoke, ornullto delete the grant.users.setOrderStateByOrderIdchanges every member holding that order id. users.loginTokenmints a credential. It returns a signed token and URL that sign in as the member, valid for an hour. It is marked as a write, so a read-only caller cannot create one, but treat the result as a secret and never log it.- A member that does not exist is not
null.users.findByEmailanswers 400USER_NOT_FOUND, andusers.findByUidanswers 200 with an empty body that fails the output schema. Catch the error rather than testing for a null result. - Custom properties are keyed by id.
users.setCustomPropertiestakes a map of property id (theidfromcustomProperties.list) to value and sends it as the[{ id, value }]array the API expects. - Chapter access needs the course.
chapters.enableAccesstakes thecourseIdas well as thechapterId. - Rate limits. Several write routes document a 429 with no
Retry-After. The plugin retries twice, after the header when present and after one minute otherwise. Every other 4xx is a rejected request and is not retried. - No webhooks. MemberSpot sends none, so the plugin declares no webhook surface.
- 32 typed API operations
Setup
1
Install
2
Add the plugin
corsair.ts
multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.3
Choose authentication
- API Key (Recommended)
No setup required yet. When you make your first request as a tenant, Corsair prompts for the API key.More: API Key
4
Connect a tenant
Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.
Example API calls
List a page of membersWhat’s next
API reference
Every
memberspot.api.* operation with input and output types.Connect / OAuth
createLink, Hub delivery, and tenant connect flows.
Use with agents
Expose this plugin’s operations as MCP tools.