Overview
Memberships let you offer group subscriptions where one owner pays for multiple members. The owner handles all billing and controls who has access. Members share the same entitlements as the owner but never see invoices or payment details.
When the owner cancels or their subscription expires, all members immediately lose access.
How It Works
- Owner subscribes - A customer purchases a membership plan with a specified number of seats
- Owner adds members - The owner invites people by email, or configures automatic access by IP address or email domain
- Members get access - Invited members register or log in to activate their access
Example: A university library purchases a 500-seat subscription. They configure their campus IP range (128.112.0.0/16) for automatic access. Students on campus get access without logging in. The library can also invite specific researchers by email for off-campus access.
API Endpoints
| Method | Endpoint | Description |
|---|---|---|
GET | List members | Retrieve a paginated list of membership records |
POST | Create member | Add an existing customer as a member of a group subscription |
POST | Invite member | Send an email invitation to join a group subscription |
GET | Get member | Retrieve details for a specific membership |
PUT | Update member | Update a membership record (address) |
DELETE | Delete member | Remove a member from a group subscription |
POST | IP authorization | Check if an IP address has membership access |
Important Behaviors
- Soft delete: Removing a member soft-deletes the record and frees up a seat for another member.
- Pending activation: If a pending invitation exists for a customer's email, the create endpoint activates it instead of creating a new record (returns
200instead of201). - Seat capacity: Adding or inviting members is subject to the subscription's
member_seat_capacitylimit. - Address ownership: The
address_idmust belong to the member's customer. - Expand behavior: The
subscriptionfield returns an integer (subscription_id) by default. Passexpand=subscriptionto get the full object. Same foruser/user_id.
Member Statuses
| Status | What It Means |
|---|---|
pending | Invitation sent, waiting for the member to register or log in |
active | Member has access to the subscription's entitlements |
Membership Object
| Attribute | Type | Description |
|---|---|---|
id | integer | Unique identifier for the membership |
user_id | integer|null | ID of the member. Null for pending invitations. (expandable) |
subscription | integer|object | Subscription ID by default. Full object when expand=subscription is used. |
subscription_id | integer | ID of the parent subscription (always integer) |
site_id | integer | ID of the site |
address_id | integer | ID of the member's address. Returns 0 when not set. |
status | string | Membership status: pending or active |
created_at | integer | Unix timestamp of creation |
updated_at | integer | Unix timestamp of last update |
