Organizations

List Organizations

GET /api/organizations

Input:
{
  userId: string
}

Output: Array<{
  id: string
  name: string
  avatarUrl: string | null
  members: Array<{
    id: string
    userId: string
    role: "OWNER" | "MEMBER"
    isCreator: boolean
    user?: {
      id: string
      name: string | null
      email: string
      avatarUrl: string | null
    }
  }>
  memberCount: number
}>

Get Organization

GET /api/organizations/:id

Input:
{
  id: string
}

Output: {
  id: string
  name: string
  avatarUrl: string | null
}

Create Organization

POST /api/organizations

Input:
{
  name: string
}

Output: {
  id: string
  name: string
  avatarUrl: string | null
  memberships: Array<{
    id: string
    role: "OWNER" | "MEMBER"
    isCreator: boolean
  }>
}

Update Organization

PATCH /api/organizations/:id

Input:
{
  id: string
  name?: string
  avatarUrl?: string
}

Output: {
  id: string
  name: string
  avatarUrl: string | null
}

Delete Organization

DELETE /api/organizations/:id

Input:
{
  id: string
}

Output: void

Organization Members

List Members

GET /api/organizations/:organizationId/members

Input:
{
  organizationId: string
}

Output: Array<{
  id: string
  userId: string
  organizationId: string
  role: "OWNER" | "MEMBER"
  isCreator: boolean
  user?: {
    id: string
    name: string | null
    email: string
    avatarUrl: string | null
  }
}>

Remove Member

DELETE /api/organizations/members/:membershipId

Input:
{
  membershipId: string
}

Output: void

Update Membership

PATCH /api/organizations/members/:id

Input:
{
  id: string
  role: "OWNER" | "MEMBER"
}

Output: void

Organization Invitations

List Invitations

GET /api/organizations/:organizationId/invitations

Input:
{
  organizationId: string
}

Output: Array<{
  id: string
  organizationId: string
  email: string
  role: "OWNER" | "MEMBER"
  expiresAt: Date
}>

Get Invitation

GET /api/organizations/invitations/:id

Input:
{
  id: string
}

Output: {
  id: string
  organizationId: string
  email: string
  role: "OWNER" | "MEMBER"
  expiresAt: Date
  organization?: {
    name: string
  }
} | null

Invite Member

POST /api/organizations/:organizationId/invitations

Input:
{
  organizationId: string
  email: string
  role: "OWNER" | "MEMBER"
}

Output: void

Accept Invitation

POST /api/organizations/invitations/:id/accept

Input:
{
  id: string
}

Output: {
  name: string
}

Revoke Invitation

DELETE /api/organizations/invitations/:invitationId

Input:
{
  invitationId: string
}

Output: void

Organization Subscription

Get Organization Subscription

GET /api/organizations/:organizationId/subscription

Input:
{
  organizationId: string
}

Output: {
  id: string
  organizationId: string
  customerId: string
  status: "ACTIVE" | "CANCELED" | "PAST_DUE" | "UNPAID" | "INCOMPLETE"
  planId: string
  variantId: string
  currentPeriodStart: Date
  currentPeriodEnd: Date
  canceledAt: Date | null
  cancelAtPeriodEnd: boolean
} | null

Notes

  1. All endpoints require authentication.
  2. Most organization management operations require organization owner permissions.
  3. Organization members can:
    • View organization details and members
    • View organization subscription status
  4. Organization owners can:
    • Update organization details
    • Manage organization members and invitations
    • Delete the organization
  5. Users can only remove themselves from an organization if they are not the owner.
  6. Organization invitations expire after 7 days.