From ab9ada515cd8a19a49f8d98e6e90c84bac955e40 Mon Sep 17 00:00:00 2001 From: Alex Shchyhol Date: Tue, 8 Sep 2026 11:05:42 +0200 Subject: [PATCH 1/5] add deleteSubAccount to the sub accounts api --- .../io/mailtrap/api/subaccounts/SubAccounts.java | 13 +++++++++++++ .../mailtrap/api/subaccounts/SubAccountsImpl.java | 9 +++++++++ .../api/subaccounts/SubAccountsImplTest.java | 12 +++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java b/src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java index 69e16de..4220704 100644 --- a/src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java +++ b/src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java @@ -26,4 +26,17 @@ public interface SubAccounts { */ SubAccount createSubAccount(long organizationId, CreateSubAccountRequest request); + /** + * Delete a sub account from the specified organization. + * Requires sub account management permissions for the organization. + *

+ * Deletion is permanent and removes all sub account data. Deleting the last sub account + * of an organization deletes the organization as well. A repeated call for the same + * sub account fails with 404. Rate limit – 10 requests per minute per organization. + * + * @param organizationId unique organization ID + * @param subAccountId unique sub account ID + */ + void deleteSubAccount(long organizationId, long subAccountId); + } diff --git a/src/main/java/io/mailtrap/api/subaccounts/SubAccountsImpl.java b/src/main/java/io/mailtrap/api/subaccounts/SubAccountsImpl.java index dd64994..d69961f 100644 --- a/src/main/java/io/mailtrap/api/subaccounts/SubAccountsImpl.java +++ b/src/main/java/io/mailtrap/api/subaccounts/SubAccountsImpl.java @@ -34,4 +34,13 @@ public SubAccount createSubAccount(final long organizationId, final CreateSubAcc SubAccount.class ); } + + @Override + public void deleteSubAccount(final long organizationId, final long subAccountId) { + httpClient.delete( + String.format(apiHost + "/api/organizations/%d/sub_accounts/%d", organizationId, subAccountId), + new RequestData(), + Void.class + ); + } } diff --git a/src/test/java/io/mailtrap/api/subaccounts/SubAccountsImplTest.java b/src/test/java/io/mailtrap/api/subaccounts/SubAccountsImplTest.java index 39b685a..ecf759e 100644 --- a/src/test/java/io/mailtrap/api/subaccounts/SubAccountsImplTest.java +++ b/src/test/java/io/mailtrap/api/subaccounts/SubAccountsImplTest.java @@ -14,12 +14,14 @@ import java.util.List; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; class SubAccountsImplTest extends BaseTest { private final long organizationId = 1001L; + private final long subAccountId = 12345L; private SubAccounts api; @@ -30,7 +32,10 @@ public void init() { "GET", null, "api/subaccounts/getSubAccountsResponse.json"), DataMock.build(Constants.GENERAL_HOST + "/api/organizations/" + organizationId + "/sub_accounts", - "POST", "api/subaccounts/createSubAccountRequest.json", "api/subaccounts/createSubAccountResponse.json") + "POST", "api/subaccounts/createSubAccountRequest.json", "api/subaccounts/createSubAccountResponse.json"), + + DataMock.build(Constants.GENERAL_HOST + "/api/organizations/" + organizationId + "/sub_accounts/" + subAccountId, + "DELETE", null, null) )); final MailtrapConfig testConfig = new MailtrapConfig.Builder() @@ -61,4 +66,9 @@ void test_createSubAccount() { assertEquals(12347L, response.getId()); assertEquals("New Team Account", response.getName()); } + + @Test + void test_deleteSubAccount() { + assertDoesNotThrow(() -> api.deleteSubAccount(organizationId, subAccountId)); + } } \ No newline at end of file From 5a131d021b88df17c58b55f595ca63116129bfc1 Mon Sep 17 00:00:00 2001 From: Alex Shchyhol Date: Tue, 8 Sep 2026 11:05:42 +0200 Subject: [PATCH 2/5] delete the created sub account in the sub accounts example --- .../mailtrap/examples/organizations/SubAccountsExample.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/java/io/mailtrap/examples/organizations/SubAccountsExample.java b/examples/java/io/mailtrap/examples/organizations/SubAccountsExample.java index 9587883..bda7691 100644 --- a/examples/java/io/mailtrap/examples/organizations/SubAccountsExample.java +++ b/examples/java/io/mailtrap/examples/organizations/SubAccountsExample.java @@ -26,5 +26,9 @@ public static void main(String[] args) { final var createdSubAccount = client.organizationsApi().subAccounts() .createSubAccount(ORGANIZATION_ID, createRequest); System.out.println(createdSubAccount); + + // Permanent – removes all sub account data. Deleting the last sub account deletes the organization. + client.organizationsApi().subAccounts().deleteSubAccount(ORGANIZATION_ID, createdSubAccount.getId()); + System.out.println("Sub account " + createdSubAccount.getId() + " deleted"); } } \ No newline at end of file From d4c817b9ff80b6855c287717c5a4b429d8014396 Mon Sep 17 00:00:00 2001 From: Alex Shchyhol Date: Wed, 4 Nov 2026 11:46:16 +0100 Subject: [PATCH 3/5] update the permission note for deleting a sub-account --- src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java b/src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java index 4220704..a29edf2 100644 --- a/src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java +++ b/src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java @@ -28,7 +28,7 @@ public interface SubAccounts { /** * Delete a sub account from the specified organization. - * Requires sub account management permissions for the organization. + * Requires organization admin permissions. *

* Deletion is permanent and removes all sub account data. Deleting the last sub account * of an organization deletes the organization as well. A repeated call for the same From fb54fbbb29032871b889d81dcea0f42bf7d03af6 Mon Sep 17 00:00:00 2001 From: Alex Shchyhol Date: Wed, 4 Nov 2026 12:38:17 +0100 Subject: [PATCH 4/5] note the delete permission in the sub-account example --- .../io/mailtrap/examples/organizations/SubAccountsExample.java | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/java/io/mailtrap/examples/organizations/SubAccountsExample.java b/examples/java/io/mailtrap/examples/organizations/SubAccountsExample.java index bda7691..9bffbcf 100644 --- a/examples/java/io/mailtrap/examples/organizations/SubAccountsExample.java +++ b/examples/java/io/mailtrap/examples/organizations/SubAccountsExample.java @@ -28,6 +28,7 @@ public static void main(String[] args) { System.out.println(createdSubAccount); // Permanent – removes all sub account data. Deleting the last sub account deletes the organization. + // Requires organization admin permissions for the organization. client.organizationsApi().subAccounts().deleteSubAccount(ORGANIZATION_ID, createdSubAccount.getId()); System.out.println("Sub account " + createdSubAccount.getId() + " deleted"); } From 2bff76eab4a2e096170b5c237efe6d8eabd67f1d Mon Sep 17 00:00:00 2001 From: Alex Shchyhol Date: Thu, 5 Nov 2026 21:12:47 +0100 Subject: [PATCH 5/5] document the feature and conflict refusals for deleteSubAccount --- src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java b/src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java index a29edf2..72ac6d8 100644 --- a/src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java +++ b/src/main/java/io/mailtrap/api/subaccounts/SubAccounts.java @@ -29,6 +29,8 @@ public interface SubAccounts { /** * Delete a sub account from the specified organization. * Requires organization admin permissions. + * The organization must have the Organization & Sub-accounts feature enabled; otherwise the + * call fails with 403. A concurrent deletion of the same sub account fails with 409. *

* Deletion is permanent and removes all sub account data. Deleting the last sub account * of an organization deletes the organization as well. A repeated call for the same