Skip to content

Team Members API

Maintained by: Aether365 Team Audience: Developers Scope: Team member API endpoints - managing user access

Authorization

Team member endpoints use role-based access control:

EndpointAllowed roles
List membersOwner, Admin, Member
Invite a memberOwner, Admin
Manage invites (list/revoke/resend)Owner, Admin
Change a member's roleOwner
Remove a memberOwner

List Team Members

Returns a flat list of active members and open invites for the authenticated tenant account. Each row carries a kind field: member (active seat) or invite (pending or sent invitation).

GET /tenants/me/members

Example Request

bash
curl https://api.aether365.io/tenants/me/members \
  -H "Authorization: Bearer ak_live_..."

Example Response

json
{
  "success": true,
  "data": [
    {
      "id": "3f2e1d0c-9b8a-4756-b3c2-d1e0f9a8b7c6",
      "email": "bob@example.com",
      "role": "member",
      "status": "active",
      "invitedAt": "2026-02-01T09:00:00+00:00",
      "joinedAt": "2026-02-01T11:00:00+00:00",
      "kind": "member"
    },
    {
      "id": "8a7b6c5d-4e3f-4a2b-9c8d-7e6f5a4b3c2d",
      "email": "carol@example.com",
      "role": "member",
      "status": "sent",
      "invitedBy": "alice@example.com",
      "invitedAt": "2026-04-10T08:00:00+00:00",
      "expiresAt": "2026-04-17T08:00:00+00:00",
      "sentAt": "2026-04-10T08:00:01+00:00",
      "acceptedAt": null,
      "revokedAt": null,
      "resentCount": 0,
      "kind": "invite"
    }
  ]
}

Response Fields

Member rows (kind: "member"):

FieldTypeDescription
idstringMember identifier (UUID)
emailstringMember email address
rolestringmember or admin (the owner is not a row)
statusstringMember status (active)
invitedAtstringISO 8601 timestamp of invitation
joinedAtstring or nullISO 8601 timestamp when invitation was accepted

Invite rows (kind: "invite") instead carry status (pending or sent), invitedBy, expiresAt, sentAt, acceptedAt, revokedAt and resentCount.

INFO

The account owner is not returned as a row - only additional members and open invites.


Invite a Team Member

Sends an invitation email to a new team member.

POST /tenants/me/members/invite

Request Body

json
{
  "email": "newmember@example.com",
  "role": "member"
}
FieldTypeRequiredDefaultDescription
emailstringYes-Email address to invite
rolestringNo"member""member" or "admin"

Example Request

bash
curl -X POST https://api.aether365.io/tenants/me/members/invite \
  -H "Authorization: Bearer ak_live_..." \
  -H "Content-Type: application/json" \
  -d '{"email": "newmember@example.com", "role": "member"}'

Example Response

Returns 201 with the created invite row (kind: "invite"):

json
{
  "success": true,
  "data": {
    "id": "8a7b6c5d-4e3f-4a2b-9c8d-7e6f5a4b3c2d",
    "email": "newmember@example.com",
    "role": "member",
    "status": "sent",
    "invitedBy": "alice@example.com",
    "invitedAt": "2026-04-12T10:00:00+00:00",
    "expiresAt": "2026-04-19T10:00:00+00:00",
    "sentAt": "2026-04-12T10:00:01+00:00",
    "acceptedAt": null,
    "revokedAt": null,
    "resentCount": 0,
    "kind": "invite"
  }
}

Errors

CodeHTTPDescription
PLAN_LIMIT_REACHED403Plan does not include team members, or the member limit is reached
CONFLICT409This email is already a member or has a pending invitation
VALIDATION_ERROR400Invalid email address, invalid role, or self-invite

Manage Invites

EndpointDescription
GET /tenants/me/members/invitesList open invites
DELETE /tenants/me/members/invites/{inviteId}Revoke an invite (404 NOT_FOUND if it does not exist)
POST /tenants/me/members/invites/{inviteId}/resendResend the invitation email

Change a Member's Role

Changes the role of an existing team member.

PATCH /tenants/me/members/{memberId}

WARNING

Only the account owner can change roles. Admins cannot change roles.

Request Body

json
{
  "role": "admin"
}
FieldTypeRequiredDescription
rolestringYesNew role: "member" or "admin"

Example Request

bash
curl -X PATCH https://api.aether365.io/tenants/me/members/3f2e1d0c-9b8a-4756-b3c2-d1e0f9a8b7c6 \
  -H "Authorization: Bearer ak_live_..." \
  -H "Content-Type: application/json" \
  -d '{"role": "admin"}'

Example Response

json
{
  "success": true,
  "data": {
    "id": "3f2e1d0c-9b8a-4756-b3c2-d1e0f9a8b7c6",
    "email": "bob@example.com",
    "role": "admin",
    "status": "active",
    "invitedAt": "2026-02-01T09:00:00+00:00",
    "joinedAt": "2026-02-01T11:00:00+00:00",
    "kind": "member"
  }
}

Remove a Team Member

Removes a member from the account. They immediately lose access.

DELETE /tenants/me/members/{memberId}

WARNING

Removing the account owner is not permitted. To transfer ownership, contact support.

Example Request

bash
curl -X DELETE https://api.aether365.io/tenants/me/members/3f2e1d0c-9b8a-4756-b3c2-d1e0f9a8b7c6 \
  -H "Authorization: Bearer ak_live_..."

Example Response

json
{
  "success": true,
  "data": null
}
Was this page helpful?