Publication membership and capabilities

Manage collaborators in a publication's Management membership. Membership is separate from public author profiles and from service-wide admission.

Authentication

Every route requires a bearer token and active publication membership for the effective Personal or organization principal. Use current context and member action flags before offering an edit. Owner/Admin roles grant protected management actions, while optional actions come from current role defaults or a custom capability selection. Organization grants restrict both sets of actions.

Routes

Paths below include the /v1 API prefix. Write routes use publication_id; list routes also accept publication_slug.

Route Capability Required fields Optional fields / result
GET or POST /v1/member/list member.list Publication selector limit (1–100, default 50), offset (0–1,000,000, default 0); returns members, total_count, next_offset, group, roles, and active Owner count.
POST /v1/member/get member.list, or self with publication.get One publication selector; member_id or principal_id See member detail.
POST /v1/member/save member.save; role changes additionally require member.assign_roles publication_id, principal_id member_id for an existing membership; role, status; returns saved, member, and nullable updated context.
POST /v1/member/remove member.remove publication_id, principal_id, exact member_id Returns removed, member identifiers, and nullable updated context.
POST /v1/member/leave member.leave publication_id Removes the current workspace's membership; returns left. Target principal, member, role, and status fields are rejected.
GET or POST /v1/member/capabilities/list member.list Publication selector Returns read-only tags and roles.
POST /v1/member/capabilities/save member.save publication_id, principal_id, exact member_id, mode, tag_ids Returns saved and updated context.

Membership writes use local Blog roster UUIDs, not native user or organization IDs. Targets must be active admitted roster principals. Owner can manage all membership levels; Admin can manage ordinary Members. Accepted roles are owner, admin, and member; editable statuses are active and disabled. For an existing membership, omitted role/status retain current values. A new direct membership defaults to active Member. An existing membership must be identified exactly before lifecycle changes; do not use creation as reactivation.

{
  "publication_id": "PUBLICATION_UUID",
  "principal_id": "COLLABORATOR_PRINCIPAL_UUID",
  "member_id": "MEMBERSHIP_UUID",
  "status": "disabled"
}

The final active Owner cannot be disabled, demoted, removed, or leave. Operations recheck authority while applying the change. A successful self-change can return context: null when the caller loses access; stop using the old context. Inviting or applying uses a separate recipient-consent workflow; see invitations and applications.

Select optional capabilities

Load the catalogue for the publication. Each tag has tag_id, capability, name, and description; use tag_id in the save request. roles describes current defaults and permitted selections. These are read-only definitions.

{
  "publication_id": "PUBLICATION_UUID",
  "principal_id": "COLLABORATOR_PRINCIPAL_UUID",
  "member_id": "MEMBERSHIP_UUID",
  "mode": "custom",
  "tag_ids": ["CAPABILITY_TAG_UUID"]
}

mode is defaults or custom. Send tag_ids: [] for defaults; for custom, an empty list deliberately selects no optional grants. IDs must be unique and allowed for the target's current role. Changing a role clears its old custom selection. Protected management rights and the last-owner rule are independent of optional selections. Member results include capabilities_mode, selected capability_tag_ids, can_update, can_remove, can_leave, can_edit_capabilities, allowed_roles, and allowed_statuses.

Public capability discovery

GET /v1/capabilities.json returns the current read-only service capability catalogue without authentication. It is a raw JSON document, outside the usual response envelope, with schema_version, service, catalogue_version, families, capabilities, presets, and role_defaults. Use capability id values to understand action names and profile expansions. Catalogue definitions do not grant the caller those actions; the selected resource context remains the access decision. Blog also accepts HEAD. Optional positive integer catalogue_version selects a retained catalogue revision; malformed values return 400. An unavailable catalogue returns 503.

Errors and recovery

Malformed input or invalid/duplicate capability selections return 400; missing active membership or permission returns 403; missing target membership returns 404; conflicting lifecycle or last-owner changes return 409. Capability catalogue unavailability fails closed.

Remove and Leave coordinate with the relationship for the selected publication when one exists. A remote failure does not report success or delete the local membership. Retry the same action after recovery; a lost successful remote reply can be completed without duplicating the removal event. Direct memberships with no relationship still support local removal. See the relationship recovery contract.