दस्तावेज़ पर जाएँ
API

पता ग्रांट और निरस्त करें

दूसरा अक्ष: एक व्यक्ति किन पतों तक पहुँच सकता है, और किस स्तर पर।

POSTapi.openemail.uk/members/{userId}/addresses

इस पेज की 2 कॉल में से कोई भी आपकी अपनी कुंजी से आपके वर्कस्पेस पर चलाता है।

POST /members/{userId}/addresses

दूसरा अक्ष: एक व्यक्ति किन पतों तक पहुँच सकता है, और किस स्तर पर।

ग्रांट भूमिका नहीं है

access प्रति-पता वाली पुरानी शब्दावली है और जानबूझकर अनुमति-नामों से नहीं टकराती: member पते को पढ़ता है और उसके रूप में भेजता है, viewer केवल पढ़ता है। यह इस बारे में कुछ नहीं कहता कि वह व्यक्ति भेज भी सकता है या नहीं — वह उनकी भूमिका तय करती है, और भेजने से पहले दोनों को अनुमति देनी होती है।

उनकी भूमिकाbilling@ पर उनका ग्रांटक्या वे billing@ के रूप में भेज सकते हैं
`emails:send` रखते हैंmemberहाँ।
`emails:send` रखते हैंviewerनहीं, ग्रांट मना कर देता है।
`emails:send` नहींmemberनहीं, भूमिका मना कर देती है।
`emails:send` रखते हैंकोई ग्रांट नहींनहीं, वह पता उस सूची में आता ही नहीं जिसके विरुद्ध भेजने की जाँच होती है।

किसी को भूमिका देने से उन्हें कोई पता नहीं मिलता। भूमिका वाला पर बिना ग्रांट वाला सदस्य सबका मेलबॉक्स नहीं, बल्कि एक खाली मेलबॉक्स खोलता है — और जब तक आप तय कर रहे हों कि उन्हें क्या दिखना चाहिए, यही सही विफलता है।

पता ग्रांट करें

members:write चाहिए। POST /members/{userId}/addresses के साथ { addressId, access }; access का डिफ़ॉल्ट member है। पूरा सदस्य उसकी मौजूदा स्थिति में लौटाता है।

curl
curl -X POST "$OE/members/nQ8vBz1aRd4tYwKx7fQ2mN8vBz1aRd4t/addresses" -H "$AUTH" \    -H "Content-Type: application/json" \    -d '{ "addressId": "c40a95f2-1cc6-4d31-82a8-9e075d31c2a8", "access": "viewer" }'
रिस्पॉन्स
{    "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"],    "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"  }

जोड़ी पर PUT के बजाय सब-कलेक्शन पर POST, क्योंकि यह वैसे भी upsert है और row id ऐसी चीज़ नहीं जिसे कॉल करने वाला कभी नाम से बताए। अलग access के साथ दोबारा पोस्ट करना ही viewer को member बनाने का तरीका है: (पता, व्यक्ति) की हर जोड़ी के लिए एक ही row होती है, इसलिए दूसरी कॉल दूसरा ग्रांट जोड़ने के बजाय स्तर बदल देती है। इसी से यह उन दुर्लभ POST में से है जिन्हें दोहराना सुरक्षित है।

यह पते के स्वामित्व पर नहीं, members:write पर गेट किया गया है — और यही इसे डोमेन राउटर वाले पुराने ग्रांट पथ से अलग करता है। स्वामित्व उस व्यक्ति के लिए सही गेट है जिसने डोमेन जोड़ा, और उस एडमिन के लिए गलत जो कुछ भी नहीं रखता पर मालिक की ओर से वर्कस्पेस का एक्सेस चला रहा है। दोनों एक ही row लिखते हैं।

अकेले ग्रांट के बजाय पूरा सदस्य लौटता है, ताकि स्क्रीन पर दिख रही row दूसरे अनुरोध के बिना दोबारा रेंडर हो सके, और ताकि जवाब एक जैसा पढ़ा जाए, चाहे ग्रांट नया हो या संशोधन।

जो पता इस वर्कस्पेस का नहीं है वह member_not_found, एक 422 है, जिसमें param: "addressId" होता है। कोई कुंजी केवल उसी वर्कस्पेस के पते बाँट सकती है जिसके विरुद्ध वह जारी हुई थी।

वर्कस्पेस के मालिक को ग्रांट देना member_is_owner, एक 422 है। उनके पास पहले से उसका हर पता है, इसलिए यह कॉल कुछ जोड़ ही नहीं सकती।

पता निरस्त करें

members:write चाहिए। DELETE /members/{userId}/addresses/{addressId}। उस पते को हटाकर सदस्य लौटाता है।

curl
curl -X DELETE \    "$OE/members/nQ8vBz1aRd4tYwKx7fQ2mN8vBz1aRd4t/addresses/c40a95f2-1cc6-4d31-82a8-9e075d31c2a8" \    -H "$AUTH"
रिस्पॉन्स
{    "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"],    "addresses": [      {        "addressId": "2b81de07-9c1f-4a4b-8e05-d3862c1f0a44",        "address": "[email protected]",        "access": "member"      }    ],    "createdAt": "2026-08-12T14:20:00.000Z"  }

यह संकरा निरस्तीकरण है, और तब काम आता है जब कोई टीम बदलता है: उनकी भूमिका और बाकी पते बने रहते हैं, बस यह पता दिखना बंद हो जाता है।

जो पता इस वर्कस्पेस का नहीं है उसे चुपचाप अनदेखा करने के बजाय मना किया जाता है। वरना id में एक टाइपो ऐसे निरस्तीकरण की सफलता बता देता जो कभी हुआ ही नहीं — और यही वह विफलता है जिसे रोकने के लिए यह एंडपॉइंट है।

टॉम्बस्टोन के बजाय सदस्य लौटता है, क्योंकि दिलचस्प जवाब यह है कि वे अब भी किन तक पहुँच सकते हैं। यहाँ { deleted: true } क्लाइंट को घटाकर हिसाब लगाने पर छोड़ देता।

एक साथ सब वापस लेने के लिए DELETE /members/{userId} भूमिका और हर ग्रांट दोनों हटा देता है और बताता है कि कितने गए।