Llista els membres
Tothom qui és a l'espai de treball, el rol que té cadascú i les adreces que se li han donat.
Executa la crida real contra el teu espai de treball, amb la teva pròpia clau.
GET /members
Tothom qui és a l'espai de treball, el rol que té cadascú i les adreces que se li han donat.
Un membre són dues concessions, no una
export OE=https://api.openemail.ukexport AUTH="Authorization: Bearer $OPENEMAIL_API_KEY"role és el que PODEN FER: una fila, un rol, el mateix objecte que descriu /roles. addresses és A QUÈ ho poden fer: una entrada per adreça, cadascuna amb el seu propi access. Un client no els ha de fusionar: un rol que té emails:send amb un array addresses buit és algú que pot enviar des de res, i un array addresses ple sota un rol de viewer també és algú que pot enviar des de res. El camí d'enviament comprova tots dos, i una pantalla que en mostri només un explicarà amb tota seguretat el rebuig equivocat.
Les files d'adreça diuen access allà on la columna emmagatzemada diu role, i el canvi de nom és intencionat i no una qüestió d'ordre: aquest objecte ja té un camp role que vol dir una cosa completament diferent, i dos role a un nivell d'imbricació de distància amb valors de dos vocabularis diferents és un error que espera la primera persona que ho llegeixi de pressa. access és member, que llegeix l'adreça i hi envia com a tal, o viewer, que només la llegeix.
implied: true vol dir que NINGÚ NO HA TRIAT AQUEST ROL. La compartició va arribar molt abans que els rols, de manera que la majoria de persones amb accés a una bústia tenen concessions d'adreça i cap fila de membre; en comptes de negar-los el correu fins que s'hagi executat un farciment, el servei infereix un rol integrat a partir de la concessió més àmplia que tenen i l'informa amb un role.id null. Mostra-ho com a «implícit per l'accés» i no com un rol que hagi triat algú. Fins que un PATCH no converteixi la inferència en una decisió, ampliar el seu accés a adreces amplia en silenci el que pot fer.
El PROPIETARI és la PRIMERA fila, marcada amb isOwner: true i amb role.builtin igual a owner. És el compte al qual està vinculat l'espai de treball, té tots els permisos per definició, i POST, PATCH i DELETE el rebutgen amb member_is_owner. Per tant, un espai de treball no compartit informa d'un membre i no de cap. Compta les places excloent isOwner.
Exemple
Necessita members:read. El propietari va primer, i després tothom per correu electrònic en comptes de per la data d'entrada, perquè aquesta llista es llegeix per trobar una persona i no per veure què ha canviat.
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}Dues poblacions en una llista, i cal que sigui així: algú pot tenir un rol i cap adreça, i algú pot tenir una adreça i cap fila de rol. Llistar només la intersecció n'amagaria totes dues, i en la majoria d'espais de treball el segon grup és el més gran.
createdAt és null per a algú que té concessions però per a qui mai no s'ha escrit una fila de membre, les mateixes persones per a les quals implied és true. És quan se li va donar un ROL, no quan se li va compartir una adreça per primera vegada.
permissions és la llista plana ja resolta i no un conjunt de booleans. Un client que pregunta «això inclou templates:write?» no pot quedar-se enrere respecte del vocabulari; un client a qui donen { canEditTemplates: true } sí que pot, i en silenci.
Sense cursor, amb l'embolcall estàndard. Els membres d'un espai de treball estan limitats per la quantitat de persones amb qui el propietari l'ha compartit realment, i paginar-ho seria una cerimònia davant d'una cosa que un client demana una vegada i renderitza sencera.