Members
List members, update roles, transfer ownership, and leave an organization.
Manage users within your organization. The endpoints on this page scope to the org bound to your API key — you don't need to pass an org id.
Endpoints
| Method | Path | Required role | Description |
|---|---|---|---|
GET | /v1/members | any member | List members |
DELETE | /v1/members/{member_id} | admin+ | Remove a member |
PATCH | /v1/members/{member_id}/role | owner | Update a member's role |
POST | /v1/members/{member_id}/transfer-ownership | owner | Transfer ownership |
POST | /v1/leave | any member | Leave the organization |
Member object
{
"id": 1,
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"role": "admin",
"has_passkey": true,
"created_at": "2026-04-20T18:24:10.113Z"
}| Field | Type | Description |
|---|---|---|
id | integer | Membership id (not user id) |
email | string | Member's email |
first_name, last_name | string | Member's display name |
role | string | owner, admin, or member |
has_passkey | boolean | Whether the member has a passkey registered on their account |
created_at | timestamp | ISO 8601 UTC |
Role hierarchy
| Role | Can invite | Can remove members | Can change roles | Can transfer ownership |
|---|---|---|---|---|
owner | ✓ | ✓ (including admins) | ✓ | ✓ |
admin | ✓ | ✓ (members only, not admins) | — | — |
member | — | — | — | — |
Each org has exactly one owner.
List members
curl https://api.thunderphone.com/v1/members \
-H "Authorization: Bearer sk_live_YOUR_API_KEY"members = requests.get(
"https://api.thunderphone.com/v1/members",
headers={"Authorization": "Bearer sk_live_YOUR_API_KEY"},
).json()const members = await fetch("https://api.thunderphone.com/v1/members", {
headers: { Authorization: `Bearer ${process.env.THUNDERPHONE_API_KEY}` },
}).then((r) => r.json());Returns a JSON array of Member objects, sorted by created_at ascending.
Remove a member
curl -X DELETE https://api.thunderphone.com/v1/members/5 \
-H "Authorization: Bearer sk_live_YOUR_API_KEY"requests.delete(
f"https://api.thunderphone.com/v1/members/{member_id}",
headers={"Authorization": "Bearer sk_live_YOUR_API_KEY"},
)Returns 204 No Content.
| Status | Condition |
|---|---|
204 | Removed |
400 | Caller tried to remove themself — use POST /v1/leave instead |
403 | Caller is not admin/owner; caller is admin trying to remove another admin; or target is the owner |
404 | No such member in this org |
Update member role
Only the owner can change roles. Supported target roles are admin and
member. To promote someone to owner, use
Transfer ownership.
curl -X PATCH https://api.thunderphone.com/v1/members/5/role \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"role": "admin"}'requests.patch(
f"https://api.thunderphone.com/v1/members/{member_id}/role",
headers={"Authorization": "Bearer sk_live_YOUR_API_KEY"},
json={"role": "admin"},
)| Field | Type | Required | Allowed values |
|---|---|---|---|
role | string | yes | admin, member |
Returns 200 OK with the updated Member object.
Transfer ownership
Promotes another member to owner and demotes the current owner to
admin. Atomic — if any step fails, no change is applied.
curl -X POST https://api.thunderphone.com/v1/members/5/transfer-ownership \
-H "Authorization: Bearer sk_live_YOUR_API_KEY"requests.post(
f"https://api.thunderphone.com/v1/members/{member_id}/transfer-ownership",
headers={"Authorization": "Bearer sk_live_YOUR_API_KEY"},
)Returns 200 OK:
{ "detail": "Ownership transferred." }Errors:
| Status | Condition |
|---|---|
400 | Target is already the owner (e.g. you passed your own membership id) |
403 | Caller is not the owner |
404 | Target membership not found |
Leave organization
Remove the caller's own membership from the org.
curl -X POST https://api.thunderphone.com/v1/leave \
-H "Authorization: Bearer sk_live_YOUR_API_KEY"requests.post(
"https://api.thunderphone.com/v1/leave",
headers={"Authorization": "Bearer sk_live_YOUR_API_KEY"},
)Returns 204 No Content. Errors:
| Status | Condition |
|---|---|
403 | Caller is the owner — transfer ownership first, or this is the caller's only organization |
404 | Caller is no longer a member of this org |