Mitglieder auflisten
Alle im Workspace, die Rolle, die jeder hält, und die Adressen, die jedem gegeben wurden.
Führt den echten Aufruf gegen Ihren Workspace aus, mit Ihrem eigenen Schlüssel.
GET /members
Alle im Workspace, die Rolle, die jeder hält, und die Adressen, die jedem gegeben wurden.
Ein Mitglied sind zwei Grants, nicht einer
export OE=https://api.openemail.ukexport AUTH="Authorization: Bearer $OPENEMAIL_API_KEY"role ist, was sie TUN dürfen: eine Zeile, eine Rolle, dasselbe Objekt, das /roles beschreibt. addresses ist, WORAUF sie es tun dürfen: ein Eintrag pro Adresse, jeder mit eigenem access. Ein Client darf die beiden nicht zusammenziehen: Eine Rolle mit emails:send und einem leeren addresses-Array ist jemand, der von nichts senden darf, und ein volles addresses-Array unter einer viewer-Rolle ist ebenfalls jemand, der von nichts senden darf. Der Sendepfad prüft beides, und ein Bildschirm, der nur eines davon zeigt, erklärt selbstbewusst die falsche Ablehnung.
Die Adresszeilen sagen access, wo die gespeicherte Spalte role sagt, und die Umbenennung ist der Punkt und kein Aufräumen: Dieses Objekt hat bereits ein Feld role, das etwas völlig anderes bedeutet, und zwei roles eine Verschachtelungsebene auseinander, die Werte aus zwei verschiedenen Vokabularen führen, sind ein Fehler, der auf die erste Person wartet, die schnell liest. access ist member, was die Adresse liest und als sie sendet, oder viewer, was sie nur liest.
implied: true heißt NIEMAND HAT DIESE ROLLE GEWÄHLT. Das Teilen gab es lange vor den Rollen, daher halten die meisten Personen mit Zugriff auf ein Postfach Adress-Grants und überhaupt keine Mitgliederzeile; statt ihnen ihre Post zu verweigern, bis ein Backfill gelaufen ist, leitet der Dienst aus dem weitesten Grant, den sie halten, eine eingebaute Rolle ab und meldet sie mit einer role.id von null. Zeigen Sie das als „durch Zugriff impliziert“ statt als Rolle, die jemand gewählt hat. Solange ein PATCH die Ableitung nicht in eine Entscheidung verwandelt, erweitert ein Ausweiten ihres Adresszugriffs stillschweigend auch das, was sie tun dürfen.
Der INHABER ist die ERSTE Zeile, mit isOwner: true markiert und mit role.builtin gleich owner. Es ist das Konto, auf das der Workspace geschlüsselt ist, er hält per Definition jede Berechtigung, und POST, PATCH und DELETE lehnen ihn alle mit member_is_owner ab. Ein ungeteilter Workspace meldet daher ein Mitglied statt keines. Zählen Sie Plätze, indem Sie isOwner ausschließen.
Beispiel
Benötigt members:read. Der Inhaber kommt zuerst, dann alle anderen nach E-Mail-Adresse statt nach Beitrittszeitpunkt, weil diese Liste gelesen wird, um eine Person zu finden, und nicht, um zu sehen, was sich geändert hat.
curl "$OE/members" -H "$AUTH"{ "object": "list", "data": [ { "object": "member", "userId": "nQ8vBz1aRd4tYwKx7fQ2mN8vBz1aRd4t", "email": "[email protected]", "name": "Sam Okonjo", "image": null, "role": { "id": "role_2b81de079c1f0a4b7e05d386", "name": "Support", "builtin": null }, "implied": false, "permissions": [ "emails:send", "emails:read", "threads:read", "threads:write", "labels:read", "labels:write", "contacts:read" ], "addresses": [ { "addressId": "2b81de07-9c1f-4a4b-8e05-d3862c1f0a44", "address": "[email protected]", "access": "member" }, { "addressId": "c40a95f2-1cc6-4d31-82a8-9e075d31c2a8", "address": "[email protected]", "access": "viewer" } ], "createdAt": "2026-08-12T14:20:00.000Z" }, { "object": "member", "userId": "7fQ2mN8vBz1aRd4tYwKx7fQ2mN8vBz1a", "email": "[email protected]", "name": null, "image": null, "role": { "id": null, "name": "Viewer", "builtin": "viewer" }, "implied": true, "permissions": [ "emails:read", "drafts:read", "threads:read", "labels:read", "contacts:read", "calendar:read", "templates:read", "rules:read", "connections:read", "settings:read" ], "addresses": [ { "addressId": "c40a95f2-1cc6-4d31-82a8-9e075d31c2a8", "address": "[email protected]", "access": "viewer" } ], "createdAt": null } ], "hasMore": false, "nextCursor": null}Zwei Gruppen in einer Liste, und das muss so sein: Jemand kann eine Rolle und keine Adresse halten, und jemand kann eine Adresse und keine Rollenzeile halten. Nur die Schnittmenge aufzulisten würde beide verbergen, und in den meisten Workspaces ist die zweite Gruppe die größere.
createdAt ist null für jemanden, der Grants hat, für den aber nie eine Mitgliederzeile geschrieben wurde – dieselben Personen, für die implied true ist. Es ist der Zeitpunkt, an dem ihnen eine ROLLE gegeben wurde, nicht der, an dem zuerst eine Adresse mit ihnen geteilt wurde.
permissions ist die flache aufgelöste Liste statt einer Menge von Booleans. Ein Client, der fragt „enthält das templates:write“, kann nicht hinter das Vokabular zurückfallen; ein Client, dem { canEditTemplates: true } gereicht wird, kann es stillschweigend.
Ohne cursor, mit dem Standardumschlag. Die Mitgliedschaft eines Workspace ist dadurch begrenzt, mit wie vielen Personen sein Inhaber ihn tatsächlich geteilt hat, und das zu paginieren wäre Zeremoniell vor etwas, das ein Client einmal abruft und ganz darstellt.