Projects & members
A project is LocalMind's unit of multi-tenancy: a self-contained workspace with its own members, invitations, settings, API keys and webhooks. Tenant data never crosses between projects — the isolation is enforced at the data layer, not by convention.
Creating a project
Any verified user can create a project and automatically becomes its Owner.
curl -X POST https://api.localmind.app/api/v1/projects \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
--cookie "$SESSION" \
-d '{ "name": "Acme Platform", "slug": "acme-platform" }'Projects are addressed by slug in the dashboard and by id in the API.
Members & roles
Every membership carries exactly one project role — owner, admin,
member or viewer — forming a clean viewer ⊂ member ⊂ admin ⊂ owner
hierarchy. Roles are fixed bundles of permissions; see
Permissions & roles for the full matrix.
curl https://api.localmind.app/api/v1/projects/$PROJECT_ID/members \
-H "Authorization: Bearer $LOCALMIND_API_KEY"Invitations
Invite existing or not-yet-registered users by email. Each invitation is a single-use token that expires after 7 days; the role is chosen up front and can never be Owner. Unregistered invitees are added automatically once they sign up. Pending invitations can be resent or cancelled.
Ownership transfer
Ownership moves in two stages: the current Owner initiates the transfer (guarded by step-up re-verification), and the recipient — who must already be a member — has to explicitly accept before it takes effect. On acceptance the former Owner is demoted to Admin. A project always has at least one Owner: the last Owner cannot leave, self-demote or be removed.
Lifecycle & soft delete
Deleting a project is a soft delete with a 30-day grace period. During the
window the project is inaccessible and its API keys and webhooks are frozen, but
an Owner can restore it. After 30 days a background job hard-deletes the data.
The project.deleted webhook fires at soft-delete time (the project is already
unreachable); a restore re-emits project.updated.