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:
| Endpoint | Allowed roles |
|---|---|
| List members | Owner, Admin, Member |
| Invite a member | Owner, Admin |
| Manage invites (list/revoke/resend) | Owner, Admin |
| Change a member's role | Owner |
| Remove a member | Owner |
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/membersExample 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"):
| Field | Type | Description |
|---|---|---|
id | string | Member identifier (UUID) |
email | string | Member email address |
role | string | member or admin (the owner is not a row) |
status | string | Member status (active) |
invitedAt | string | ISO 8601 timestamp of invitation |
joinedAt | string or null | ISO 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/inviteRequest Body
json
{
"email": "newmember@example.com",
"role": "member"
}| Field | Type | Required | Default | Description |
|---|---|---|---|---|
email | string | Yes | - | Email address to invite |
role | string | No | "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
| Code | HTTP | Description |
|---|---|---|
PLAN_LIMIT_REACHED | 403 | Plan does not include team members, or the member limit is reached |
CONFLICT | 409 | This email is already a member or has a pending invitation |
VALIDATION_ERROR | 400 | Invalid email address, invalid role, or self-invite |
Manage Invites
| Endpoint | Description |
|---|---|
GET /tenants/me/members/invites | List 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}/resend | Resend 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"
}| Field | Type | Required | Description |
|---|---|---|---|
role | string | Yes | New 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
}