about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/mailersend
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/mailersend')
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/__init__.py7
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/activity/__init__.py37
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/analytics/__init__.py118
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/api_quota/__init__.py25
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/base/__init__.py0
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/base/base.py45
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/domains/__init__.py128
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/email_verification/__init__.py91
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/emails/__init__.py137
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/inbound_routing/__init__.py126
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/messages/__init__.py35
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/recipients/__init__.py255
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/scheduled_messages/__init__.py47
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/sender_identities/__init__.py137
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/sms_activity/__init__.py68
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/sms_inbounds/__init__.py134
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/sms_messages/__init__.py52
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/sms_phone_numbers/__init__.py95
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/sms_recipients/__init__.py76
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/sms_sending/__init__.py43
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/sms_webhooks/__init__.py122
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/templates/__init__.py42
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/tokens/__init__.py54
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/utils/__init__.py43
-rw-r--r--.venv/lib/python3.12/site-packages/mailersend/webhooks/__init__.py135
25 files changed, 2052 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/mailersend/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/__init__.py
new file mode 100644
index 00000000..3ad21155
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/__init__.py
@@ -0,0 +1,7 @@
+"""
+MailerSend Official Python DSK
+@maintainer: Igor HrĨek (igor at mailerlite dot com)
+"""
+
+__version_info__ = ("0", "5", "8")
+__version__ = ".".join(__version_info__)
diff --git a/.venv/lib/python3.12/site-packages/mailersend/activity/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/activity/__init__.py
new file mode 100644
index 00000000..e8e8a3fe
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/activity/__init__.py
@@ -0,0 +1,37 @@
+"""
+Handles /activity endpoint
+Doc: https://developers.mailersend.com/api/v1/activity.html
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewActivity(base.NewAPIClient):
+    """
+    Instantiates the /activity endpoint object
+    """
+
+    pass
+
+    def get_domain_activity(
+        self, domain_id, page=None, limit=None, date_from=None, date_to=None, event=None
+    ):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        _data = {
+            "page": page or None,
+            "limit": limit or None,
+            "date_from": date_from or None,
+            "date_to": date_to or None,
+            "event": event or None,
+        }
+
+        request = requests.get(
+            f"{self.api_base}/activity/{domain_id}",
+            headers=self.headers_default,
+            json=_data,
+        )
+        return request.text
diff --git a/.venv/lib/python3.12/site-packages/mailersend/analytics/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/analytics/__init__.py
new file mode 100644
index 00000000..cbc436c7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/analytics/__init__.py
@@ -0,0 +1,118 @@
+"""
+Handles /analytics endpoint
+Doc: https://developers.mailersend.com/api/v1/analytics.html
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewAnalytics(base.NewAPIClient):
+    """
+    Instantiates the /activity endpoint object
+    """
+
+    pass
+
+    def get_activity_by_date(
+        self, date_from, date_to, event, domain_id=None, group_by=None
+    ):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        _data = {
+            "date_from": date_from,
+            "date_to": date_to,
+            "event[]": event,
+        }
+
+        if domain_id is not None:
+            _data["domain_id"] = domain_id
+
+        if group_by is not None:
+            _data["group_by"] = group_by
+
+        request = requests.get(
+            f"{self.api_base}/analytics/date",
+            headers=self.headers_default,
+            params=_data,
+        )
+
+        return request.text
+
+    def get_opens_by_country(self, date_from, date_to, domain_id=None, recipients=None):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        _data = {
+            "date_from": date_from,
+            "date_to": date_to,
+        }
+
+        if domain_id is not None:
+            _data["domain_id"] = domain_id
+
+        if recipients is not None:
+            _data["recipient_id"] = recipients
+
+        request = requests.get(
+            f"{self.api_base}/analytics/country",
+            headers=self.headers_default,
+            json=_data,
+        )
+
+        return request.text
+
+    def get_opens_by_user_agent(
+        self, date_from, date_to, domain_id=None, recipients=None
+    ):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        _data = {
+            "date_from": date_from,
+            "date_to": date_to,
+        }
+
+        if domain_id is not None:
+            _data["domain_id"] = domain_id
+
+        if recipients is not None:
+            _data["recipient_id"] = recipients
+
+        request = requests.get(
+            f"{self.api_base}/analytics/ua-name",
+            headers=self.headers_default,
+            json=_data,
+        )
+
+        return request.text
+
+    def get_opens_by_reading_environment(
+        self, date_from, date_to, domain_id=None, recipients=None
+    ):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        _data = {
+            "date_from": date_from,
+            "date_to": date_to,
+        }
+
+        if domain_id is not None:
+            _data["domain_id"] = domain_id
+
+        if recipients is not None:
+            _data["recipient_id"] = recipients
+
+        request = requests.get(
+            f"{self.api_base}/analytics/ua-type",
+            headers=self.headers_default,
+            json=_data,
+        )
+
+        return request.text
diff --git a/.venv/lib/python3.12/site-packages/mailersend/api_quota/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/api_quota/__init__.py
new file mode 100644
index 00000000..fcd027b8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/api_quota/__init__.py
@@ -0,0 +1,25 @@
+"""
+Handles /api-quota endpoint
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewApiQuota(base.NewAPIClient):
+    """
+    Instantiates the /api-quota endpoint object
+    """
+
+    pass
+
+    def get_quota(self, page=1, limit=25, verified=False):
+        query_params = {"page": page, "limit": limit, "verified": verified}
+
+        request = requests.get(
+            f"{self.api_base}/api-quota",
+            headers=self.headers_default,
+            params=query_params,
+        )
+
+        return request.text
diff --git a/.venv/lib/python3.12/site-packages/mailersend/base/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/base/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/base/__init__.py
diff --git a/.venv/lib/python3.12/site-packages/mailersend/base/base.py b/.venv/lib/python3.12/site-packages/mailersend/base/base.py
new file mode 100644
index 00000000..68d72f4f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/base/base.py
@@ -0,0 +1,45 @@
+"""
+Base object handles connection information to the MailerSend API
+"""
+
+import os
+
+API_BASE = "https://api.mailersend.com/v1"
+API_KEY = os.environ.get("MAILERSEND_API_KEY")
+
+
+class NewAPIClient:
+    """
+    Instantiates the parent object all endpoints follow.
+    Provides necessary connection information to perform API operations.
+    """
+
+    def __init__(
+        self,
+        mailersend_api_key=API_KEY,
+        api_base=None,
+        headers_default=None,
+        headers_auth=None,
+    ):
+        """
+        NewAPIClient constructor
+        """
+
+        self.api_base = API_BASE
+        self.mailersend_api_key = mailersend_api_key
+        self.headers_auth = f"Bearer {self.mailersend_api_key}"
+        self.headers_default = {
+            "Content-Type": "application/json",
+            "X-Requested-With": "XMLHttpRequest",
+            "User-Agent": "MailerSend-Client-python-v1",
+            "Authorization": f"{self.headers_auth}",
+        }
+
+
+def generate_config_change_json_body(key, value):
+    """
+    Returns a key:value pair
+    """
+    data = {key: value}
+
+    return data
diff --git a/.venv/lib/python3.12/site-packages/mailersend/domains/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/domains/__init__.py
new file mode 100644
index 00000000..2645d491
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/domains/__init__.py
@@ -0,0 +1,128 @@
+"""
+Handles /domains endpoint
+Doc: https://developers.mailersend.com/api/v1/domains.html
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewDomain(base.NewAPIClient):
+    """
+    Instantiates the /domains endpoint object
+    """
+
+    pass
+
+    def get_domains(self):
+        """
+        Get a list of all domains
+
+        Returns the JSON response of MailerSend API
+        """
+        request = requests.get(f"{self.api_base}/domains", headers=self.headers_default)
+        return request.text
+
+    def get_domain_by_id(self, domain_id):
+        """
+        Get info on a domain by its ID
+
+        @params:
+          domain_id (str): A domain ID
+
+        Returns the JSON response of MailerSend API
+        """
+        request = requests.get(
+            f"{self.api_base}/domains/{domain_id}", headers=self.headers_default
+        )
+        return request.text
+
+    def add_domain(self, domain_data):
+        """
+        Add a domain
+
+        @params:
+          domain_data (dic): Contains key:value data needed for creating a new domain
+
+        """
+
+        request = requests.post(
+            f"{self.api_base}/domains",
+            headers=self.headers_default,
+            json=domain_data,
+        )
+        return request.text
+
+    def delete_domain(self, domain_id):
+        """
+        Delete a domain
+
+        @params:
+          domain_id (str): A domain ID
+
+        Returns the JSON response of MailerSend API
+        """
+        request = requests.delete(
+            f"{self.api_base}/domains/{domain_id}", headers=self.headers_default
+        )
+        return request.status_code
+
+    def get_recipients_for_domain(self, domain_id):
+        """
+        List all recipients for a domain
+
+        @params:
+          domain_id (str): A domain ID
+
+        Returns the JSON response of MailerSend API
+        """
+        request = requests.get(
+            f"{self.api_base}/domains/{domain_id}/recipients",
+            headers=self.headers_default,
+        )
+        return request.text
+
+    def update_domain_setting(self, domain_id, domain_data):
+        """
+        Returns the JSON response of MailerSend API
+
+        @params:
+          domain_id (str): A domain ID
+          domain_data (dict): A key:value list that contains parameters for updating domain name
+
+        """
+        request = requests.put(
+            f"{self.api_base}/domains/{domain_id}/settings",
+            headers=self.headers_default,
+            json=domain_data,
+        )
+        return request.text
+
+    def get_dns_records(self, domain_id):
+        """
+        Returns the JSON response of dns records
+
+        @params:
+          domain_id (str): A domain ID
+
+        """
+
+        request = requests.get(
+            f"{self.api_base}/domains/{domain_id}/dns-records",
+            headers=self.headers_default,
+        )
+        return request.text
+
+    def verify_domain(self, domain_id):
+        """
+        Returns the JSON response of verified domain
+
+        @params:
+          domain_id (str): A domain ID
+
+        """
+
+        request = requests.get(
+            f"{self.api_base}/domains/{domain_id}/verify", headers=self.headers_default
+        )
+        return request.text
diff --git a/.venv/lib/python3.12/site-packages/mailersend/email_verification/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/email_verification/__init__.py
new file mode 100644
index 00000000..adebad09
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/email_verification/__init__.py
@@ -0,0 +1,91 @@
+"""
+Handles /email-verification endpoint
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewEmailVerification(base.NewAPIClient):
+    """
+    Instantiates the /email-verification endpoint object
+    """
+
+    # you shall not
+    pass
+
+    def get_all_lists(self, page=1, limit=25):
+        """
+        Returns all email verification lists
+        :param page: int
+        :param limit: int
+        """
+        query_params = {"page": page, "limit": limit}
+
+        request = requests.get(
+            f"{self.api_base}/email-verification",
+            headers=self.headers_default,
+            params=query_params,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def get_list(self, email_verification_id):
+        """
+        Retrieve single email verification list
+        :type email_verification_id: object
+        """
+
+        query_params = {"email_verification_id": email_verification_id}
+
+        request = requests.get(
+            f"{self.api_base}/email-verification",
+            headers=self.headers_default,
+            params=query_params,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def create_list(self, name, emails):
+        """
+        Create email verification list
+        :param name: str
+        :param emails: list
+        :return:
+        """
+
+        data = {"name": name, "emails": emails}
+
+        request = requests.post(
+            f"{self.api_base}/email-verification",
+            headers=self.headers_default,
+            json=data,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def verify_list(self, email_verification_id):
+        """
+        Verify an email verification list
+        :type email_verification_id: str
+        """
+
+        request = requests.get(
+            f"{self.api_base}/email-verification/{email_verification_id}/verify",
+            headers=self.headers_default,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def get_list_results(self, email_verification_id):
+        """
+        Get the result for each individual email of an email verification list
+        :type email_verification_id: str
+        """
+
+        request = requests.get(
+            f"{self.api_base}/email-verification/{email_verification_id}/results",
+            headers=self.headers_default,
+        )
+
+        return f"{request.status_code}\n{request.text}"
diff --git a/.venv/lib/python3.12/site-packages/mailersend/emails/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/emails/__init__.py
new file mode 100644
index 00000000..c34f30d2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/emails/__init__.py
@@ -0,0 +1,137 @@
+"""
+Handles /email endpoint
+Doc: https://developers.mailersend.com/api/v1/email.html
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewEmail(base.NewAPIClient):
+    """
+    Send an e-mail
+    """
+
+    pass
+
+    def set_mail_from(self, mail_from, message):
+        """
+        Appends the 'from' part on an e-mail
+        """
+        message["from"] = mail_from
+
+    def set_mail_to(self, mail_to, message):
+        """
+        Appends the 'to' part on an e-mail
+        """
+        message["to"] = mail_to
+
+    def set_subject(self, subject, message):
+        """
+        Appends the 'subject' part on an e-mail
+        """
+        message["subject"] = subject
+
+    def set_html_content(self, content, message):
+        """
+        Appends the HTML content of an e-mail
+        """
+        message["html"] = content
+
+    def set_plaintext_content(self, text, message):
+        """
+        Appends the plaintext content of an e-mail
+        """
+        message["text"] = text
+
+    def set_template(self, template_id, message):
+        """
+        Appends the 'template_id' part on an e-mail
+        """
+        message["template_id"] = template_id
+
+    def set_personalization(self, personalization, message):
+        """
+        Handles advanced personalization
+        """
+        message["personalization"] = personalization
+
+    def set_cc_recipients(self, cc_recipient, message):
+        """
+        Appends the 'cc' part on an e-mail
+        """
+        message["cc"] = cc_recipient
+
+    def set_bcc_recipients(self, bcc_recipient, message):
+        """
+        Appends the 'bcc' part on an e-mail
+        """
+        message["bcc"] = bcc_recipient
+
+    def set_tags(self, tags, message):
+        """
+        Handles e-mail tags
+        """
+        message["tags"] = tags
+
+    def set_attachments(self, attachments, message):
+        """
+        Appends an attachment on an e-mail
+        """
+        message["attachments"] = attachments
+
+    def set_reply_to(self, reply_to, message):
+        """
+        Appends 'reply to' on an e-mail
+        """
+        message["reply_to"] = reply_to
+
+    def set_in_reply_to(self, in_reply_to, message):
+        """
+        Appends 'in reply to' on an e-mail
+        """
+        message["in_reply_to"] = in_reply_to
+
+    def set_send_at(self, send_at, message):
+        """
+        Sets the 'send_at' parameter for scheduled messages
+        """
+        message["send_at"] = send_at
+
+    def send(self, message):
+        """
+        Handles e-mail sending
+
+        @params:
+          message (dict): A dict containing required parameters for mail sending
+        """
+
+        request = requests.post(
+            f"{self.api_base}/email", headers=self.headers_default, json=message
+        )
+        return f"{request.status_code}\n{request.text}"
+
+    def get_bulk_status_by_id(self, bulk_email_id):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        request = requests.get(
+            f"{self.api_base}/bulk-email/{bulk_email_id}", headers=self.headers_default
+        )
+        return request.text
+
+    def send_bulk(self, message_list):
+        """
+        Handles bulk e-mail sending
+
+        @params:
+          message_list (list): A list containing e-mail dicts
+        """
+
+        request = requests.post(
+            f"{self.api_base}/bulk-email",
+            headers=self.headers_default,
+            json=message_list,
+        )
+        return f"{request.status_code}\n{request.text}"
diff --git a/.venv/lib/python3.12/site-packages/mailersend/inbound_routing/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/inbound_routing/__init__.py
new file mode 100644
index 00000000..61a16f4e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/inbound_routing/__init__.py
@@ -0,0 +1,126 @@
+"""
+Handles /inbound endpoint
+Doc: https://developers.mailersend.com/api/v1/inbound.html
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewInbound(base.NewAPIClient):
+    """
+    Instantiates the /inbound endpoint object
+    """
+
+    pass
+
+    def get_inbound_routes(self):
+        """
+        Get a list of all inbound routes
+
+        Returns the JSON response of MailerSend API
+        """
+        request = requests.get(f"{self.api_base}/inbound", headers=self.headers_default)
+        return f"{request.status_code}\n{request.text}"
+
+    def get_inbound_by_id(self, inbound_id):
+        """
+        Get info on an inbound route by its ID
+
+        @params:
+          inbound_id (str): An inbound route ID
+
+        Returns the JSON response of MailerSend API
+        """
+        request = requests.get(
+            f"{self.api_base}/inbound/{inbound_id}", headers=self.headers_default
+        )
+        return request.text
+
+    def update_inbound_route(self, inbound_id, options):
+        """
+        Update an inbound route
+
+        @params:
+          inbound_id (str): An inbound route ID
+          key (str): The key param to change
+          value (object): The value to update key with
+
+        Returns the JSON response of MailerSend API
+        """
+
+        request = requests.put(
+            f"{self.api_base}/inbound/{inbound_id}",
+            headers=self.headers_default,
+            json=options,
+        )
+        return f"{request.status_code}\n{request.text}"
+
+    def delete_inbound_route(self, inbound_id):
+        """
+        Returns the status code of delete inbound route operation
+
+        @params:
+          inbound_id (str): An inbound route ID
+        """
+
+        request = requests.delete(
+            f"{self.api_base}/inbound/{inbound_id}",
+            headers=self.headers_default,
+        )
+        return request.status_code
+
+    def set_name(self, name, options):
+        """
+        Appends the 'name' param of inbound route options
+        """
+        options["name"] = name
+
+    def set_domain_enabled(self, enabled, options):
+        """
+        Appends the 'domain_enabled' param of inbound route options
+        """
+        options["domain_enabled"] = enabled
+
+    def set_inbound_domain(self, domain, options):
+        """
+        Appends the 'inbound_domain' param of inbound route options
+        """
+        options["inbound_domain"] = domain
+
+    def set_catch_filter(self, content_json, options):
+        """
+        Appends the 'catch_filter' param of inbound route options
+        """
+        options["catch_filter"] = content_json
+
+    def set_match_filter(self, content_json, options):
+        """
+        Appends the 'match_filter' param of inbound route options
+        """
+        options["match_filter"] = content_json
+
+    def set_forwards(self, content_json, options):
+        """
+        Appends the 'forwards' param of inbound route options
+        """
+        options["forwards"] = content_json
+
+    def add_inbound_route(self, domain_id, options):
+        """
+        Add a new inbound route
+
+        @params:
+          domain_id (str): For which domain will inbound route be created
+          options (str): Creation options as defined in https://developers.mailersend.com/api/v1/inbound.html#add-an-inbound-route
+
+        """
+
+        options["domain_id"] = domain_id
+
+        request = requests.post(
+            f"{self.api_base}/inbound",
+            headers=self.headers_default,
+            json=options,
+        )
+        return f"{request.text}\n{request.status_code}"
diff --git a/.venv/lib/python3.12/site-packages/mailersend/messages/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/messages/__init__.py
new file mode 100644
index 00000000..8ceb3bf4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/messages/__init__.py
@@ -0,0 +1,35 @@
+"""
+Handles /messages endpoint
+Doc: https://developers.mailersend.com/api/v1/messages.html
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewMessage(base.NewAPIClient):
+    """
+    Instantiates the /messages endpoint object
+    """
+
+    pass
+
+    def get_message_by_id(self, message_id):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        request = requests.get(
+            f"{self.api_base}/messages/{message_id}", headers=self.headers_default
+        )
+        return request.text
+
+    def get_messages(self):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        request = requests.get(
+            f"{self.api_base}/messages", headers=self.headers_default
+        )
+        return request.text
diff --git a/.venv/lib/python3.12/site-packages/mailersend/recipients/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/recipients/__init__.py
new file mode 100644
index 00000000..5761a8f1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/recipients/__init__.py
@@ -0,0 +1,255 @@
+"""
+Handles /recipients endpoint
+Doc: https://developers.mailersend.com/api/v1/recipients.html
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewRecipient(base.NewAPIClient):
+    """
+    Instantiates the /recipients endpoint object
+    """
+
+    pass
+
+    def get_recipients(self):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        request = requests.get(
+            f"{self.api_base}/recipients", headers=self.headers_default
+        )
+        return request.text
+
+    def get_recipient_by_id(self, recipient_id):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        request = requests.get(
+            f"{self.api_base}/recipients/{recipient_id}", headers=self.headers_default
+        )
+        return request.text
+
+    def delete_recipient(self, recipient_id):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+
+        request = requests.delete(
+            f"{self.api_base}/recipients/{recipient_id}", headers=self.headers_default
+        )
+        return request.status_code
+
+    def get_recipients_from_blocklist(self, domain_id=None, limit=None, page=None):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+        message = {}
+        message["domain_id"] = domain_id
+        message["limit"] = limit
+        message["page"] = page
+
+        request = requests.get(
+            f"{self.api_base}/suppressions/blocklist",
+            headers=self.headers_default,
+            json=message,
+        )
+        return request.text
+
+    def get_hard_bounces(self, domain_id=None, limit=None, page=None):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+        message = {}
+        message["domain_id"] = domain_id
+        message["limit"] = limit
+        message["page"] = page
+
+        request = requests.get(
+            f"{self.api_base}/suppressions/hard_bounces",
+            headers=self.headers_default,
+            json=message,
+        )
+        return request.text
+
+    def get_spam_complaints(self, domain_id=None, limit=None, page=None):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+        message = {}
+        message["domain_id"] = domain_id
+        message["limit"] = limit
+        message["page"] = page
+
+        request = requests.get(
+            f"{self.api_base}/suppressions/spam-complaints",
+            headers=self.headers_default,
+            json=message,
+        )
+        return request.text
+
+    def get_unsubscribes(self, domain_id=None, limit=None, page=None):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+        message = {}
+        message["domain_id"] = domain_id
+        message["limit"] = limit
+        message["page"] = page
+
+        request = requests.get(
+            f"{self.api_base}/suppressions/unsubscribes",
+            headers=self.headers_default,
+            json=message,
+        )
+        return request.text
+
+    def add_to_blocklist(self, domain_id, recipients=None, patterns=None):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+        message = {}
+        message["domain_id"] = domain_id
+
+        if recipients is not None:
+            message["recipients"] = recipients
+        if patterns is not None:
+            message["patterns"] = patterns
+
+        request = requests.post(
+            f"{self.api_base}/suppressions/blocklist",
+            headers=self.headers_default,
+            json=message,
+        )
+        return request.text
+
+    def delete_from_blocklist(self, domain_id, ids=None, remove_all=False):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+        message = {}
+        message["domain_id"] = domain_id
+
+        if ids is not None:
+            message["ids"] = ids
+        if remove_all is True:
+            message["all"] = "true"
+
+        request = requests.delete(
+            f"{self.api_base}/suppressions/blocklist",
+            headers=self.headers_default,
+            json=message,
+        )
+        return request.text
+
+    def add_hard_bounces(self, domain_id=None, recipients=None):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+        message = {}
+        message["domain_id"] = domain_id
+
+        if recipients is not None:
+            message["recipients"] = recipients
+
+        request = requests.post(
+            f"{self.api_base}/suppressions/hard-bounces",
+            headers=self.headers_default,
+            json=message,
+        )
+        return request.text
+
+    def delete_hard_bounces(self, domain_id, ids=None, remove_all=False):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+        message = {}
+        message["domain_id"] = domain_id
+
+        if ids is not None:
+            message["ids"] = ids
+        if remove_all is True:
+            message["all"] = "true"
+
+        request = requests.delete(
+            f"{self.api_base}/suppressions/hard-bounces",
+            headers=self.headers_default,
+            json=message,
+        )
+        return request.text
+
+    def add_spam_complaints(self, domain_id=None, recipients=None):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+        message = {}
+        message["domain_id"] = domain_id
+
+        if recipients is not None:
+            message["recipients"] = recipients
+
+        request = requests.post(
+            f"{self.api_base}/suppressions/spam-complaints",
+            headers=self.headers_default,
+            json=message,
+        )
+        return request.text
+
+    def delete_spam_complaints(self, domain_id, ids=None, remove_all=False):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+        message = {}
+        message["domain_id"] = domain_id
+
+        if ids is not None:
+            message["ids"] = ids
+        if remove_all is True:
+            message["all"] = "true"
+
+        request = requests.delete(
+            f"{self.api_base}/suppressions/spam-complaints",
+            headers=self.headers_default,
+            json=message,
+        )
+        return request.text
+
+    def add_unsubscribes(self, domain_id=None, recipients=None):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+        message = {}
+        message["domain_id"] = domain_id
+
+        if recipients is not None:
+            message["recipients"] = recipients
+
+        request = requests.post(
+            f"{self.api_base}/suppressions/unsubscribes",
+            headers=self.headers_default,
+            json=message,
+        )
+        return request.text
+
+    def delete_unsubscribes(self, domain_id, ids=None, remove_all=False):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+        message = {}
+        message["domain_id"] = domain_id
+
+        if ids is not None:
+            message["ids"] = ids
+        if remove_all is True:
+            message["all"] = True
+
+        request = requests.delete(
+            f"{self.api_base}/suppressions/unsubscribes",
+            headers=self.headers_default,
+            json=message,
+        )
+        return request.text
diff --git a/.venv/lib/python3.12/site-packages/mailersend/scheduled_messages/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/scheduled_messages/__init__.py
new file mode 100644
index 00000000..1971ea9e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/scheduled_messages/__init__.py
@@ -0,0 +1,47 @@
+"""
+Handles /message-schedules endpoint
+Doc: https://developers.mailersend.com/api/v1/message-schedules.html
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewMessageSchedule(base.NewAPIClient):
+    """
+    Instantiates the /message-schedules endpoint object
+    """
+
+    pass
+
+    def get_scheduled_messages(self):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        request = requests.get(
+            f"{self.api_base}/message-schedules", headers=self.headers_default
+        )
+        return request.text
+
+    def get_scheduled_message_by_id(self, message_id):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        request = requests.get(
+            f"{self.api_base}/message-schedules/{message_id}",
+            headers=self.headers_default,
+        )
+        return request.text
+
+    def delete_scheduled_message(self, message_id):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        request = requests.delete(
+            f"{self.api_base}/message-schedules/{message_id}",
+            headers=self.headers_default,
+        )
+        return request.text
diff --git a/.venv/lib/python3.12/site-packages/mailersend/sender_identities/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/sender_identities/__init__.py
new file mode 100644
index 00000000..c6dce4d8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/sender_identities/__init__.py
@@ -0,0 +1,137 @@
+"""
+Handles /identities endpoint
+"""
+
+import requests
+from mailersend.base import base
+
+class NewSenderIdentities(base.NewAPIClient):
+    """
+    Instantiates the /identities endpoint object
+    """
+
+    # you shall not
+    pass
+
+    def get_identities(self, domain_id=None, page=None, limit=25):
+        """
+        Get all sender identities
+
+        @params:
+          domain_id (string)
+          page (int)
+          limit (int): Min: `10`, Max: `100`, default is 25
+        """
+
+        passed_arguments = locals()
+        query_params = {}
+
+        for key, value in passed_arguments.items():
+            if key != "self" and value is not None:
+                query_params[key] = value
+
+        request = requests.get(
+            f"{self.api_base}/identities",
+            headers=self.headers_default,
+            params=query_params,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+    
+    def get_identity(self, identity_id):
+        """
+        Get a single sender identity
+
+        @params:
+          identity_id (string)
+        """
+
+        request = requests.get(
+            f"{self.api_base}/identities/{identity_id}",
+            headers=self.headers_default,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+    
+    def add_identitity(self, domain_id, name, email, reply_to_email=None, reply_to_name=None, add_note=False, personal_note=None):
+        """
+        Add a sender identity
+
+        @params:
+          domain_id (string)
+          name (string) - Max 191 characters
+          email (string) - Max 191 characters, unique
+          reply_to_email (string)
+          reply_to_name (string)
+          add_note (boolean)
+          personal_note (string)
+        """
+
+        data = {
+            "domain_id": domain_id, 
+            "name": name,
+            "email": email
+        }
+
+        if reply_to_email != None:
+            data["reply_to_email"] = reply_to_email
+
+        if reply_to_name != None:
+            data["reply_to_name"] = reply_to_name
+        
+        if add_note == True:
+            data["add_note"] = add_note
+            data["personal_note"] = personal_note
+
+        request = requests.post(
+            f"{self.api_base}/identities",
+            headers=self.headers_default,
+            json=data,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+    
+    def update_identitity(self, identity_id, domain_id=None, name=None, email=None, reply_to_email=None, reply_to_name=None, add_note=False, personal_note=None):
+        """
+        Update a sender identity
+
+        @params:
+          identity_id (string)
+          domain_id (string)
+          name (string) - Max 191 characters
+          email (string) - Max 191 characters, unique
+          reply_to_email (string)
+          reply_to_name (string)
+          add_note (boolean)
+          personal_note (string)
+        """
+        
+        passed_arguments = locals()
+        data = {}
+
+        for key, value in passed_arguments.items():
+            if key != "self" and key != "identity_id" and value is not None:
+                data[key] = value
+
+        request = requests.put(
+            f"{self.api_base}/identities/{identity_id}",
+            headers=self.headers_default,
+            json=data,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+    
+    def delete_identity(self, identity_id):
+        """
+        Delete a sender identity
+
+        @params:
+          identity_id (string)
+        """
+        
+        request = requests.delete(
+            f"{self.api_base}/identities/{identity_id}",
+            headers=self.headers_default,
+        )
+
+        return request.text
\ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/mailersend/sms_activity/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/sms_activity/__init__.py
new file mode 100644
index 00000000..afe9044c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/sms_activity/__init__.py
@@ -0,0 +1,68 @@
+"""
+Handles /sms-activity endpoint
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewSmsActivity(base.NewAPIClient):
+    """
+    Instantiates the /sms-activity endpoint object
+    """
+
+    pass
+
+    def get_activities(
+        self,
+        sms_number_id=None,
+        date_from=None,
+        date_to=None,
+        status=[],
+        page=None,
+        limit=25,
+    ):
+        """
+        Retrieve every single data point of the activity that happened for a specific phone number.
+
+        @params:
+          sms_number_id (str)
+          date_from (int): Timestamp is assumed to be `UTC`. Must be lower than `date_to`
+          date_to (int): Timestamp is assumed to be `UTC`. Must be higher than `date_from`
+          status (dict): Possible types: `processed`,`queued`,`sent`,`delivered`, `failed`
+          page (int)
+          limit (int): Min: `10`, Max: `100`, default is 25
+        """
+
+        passed_arguments = locals()
+        query_params = {}
+
+        for key, value in passed_arguments.items():
+            if key != "self":
+                if key == "status":
+                    query_params[key + "[]"] = value
+                else:
+                    query_params[key] = value
+
+        request = requests.get(
+            f"{self.api_base}/sms-activity",
+            headers=self.headers_default,
+            params=query_params,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def get_activity(self, sms_message_id):
+        """
+        Get every single activity data point that happened to a specific SMS message
+
+        @params:
+          sms_message_id (str)
+        """
+
+        request = requests.get(
+            f"{self.api_base}/sms-messages/{sms_message_id}",
+            headers=self.headers_default,
+        )
+
+        return f"{request.status_code}\n{request.text}"
diff --git a/.venv/lib/python3.12/site-packages/mailersend/sms_inbounds/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/sms_inbounds/__init__.py
new file mode 100644
index 00000000..2ac3a663
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/sms_inbounds/__init__.py
@@ -0,0 +1,134 @@
+"""
+Handles /sms-inbounds endpoint
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewSmsInbounds(base.NewAPIClient):
+    """
+    Instantiates the /sms-inbounds endpoint object
+    """
+
+    # you shall not
+    pass
+
+    def get_inbound_routes(self, sms_number_id=None, enabled=True, page=1, limit=25):
+        """
+        Get a list of SMS inbound routes.
+
+        @params:
+          sms_number_id (string)
+          enabled (bool)
+          page (int)
+          limit (int)
+        """
+
+        passed_arguments = locals()
+        query_params = {}
+
+        for key, value in passed_arguments.items():
+            if key != "self":
+                if key == "enabled":
+                    query_params[key] = int(value)
+                else:
+                    query_params[key] = value
+
+        request = requests.get(
+            f"{self.api_base}/sms-inbounds",
+            headers=self.headers_default,
+            params=query_params,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def get_inbound_route(self, sms_inbound_id):
+        """
+        Get a single SMS inbound route.
+
+        @params:
+          sms_inbound_id (string)
+        """
+
+        request = requests.get(
+            f"{self.api_base}/sms-inbounds/{sms_inbound_id}",
+            headers=self.headers_default,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def create_inbound_route(
+        self, sms_number_id, name, forward_url, filter={}, enabled=True
+    ):
+        """
+        Add an SMS inbound route.
+
+        @params:
+          sms_number_id (string)
+          name (string)
+          forward_url (string)
+          filter (object)
+          enabled (bool)
+        """
+
+        data = {
+            "sms_number_id": sms_number_id,
+            "name": name,
+            "forward_url": forward_url,
+            "filter": filter,
+            "enabled": int(enabled),
+        }
+
+        request = requests.post(
+            f"{self.api_base}/sms-inbounds", headers=self.headers_default, json=data
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def update_inbound_route(
+        self, sms_inbound_id, name=None, forward_url=None, filter=None, enabled=None
+    ):
+        """
+        Update an inbound route.
+
+        @params:
+          sms_inbound_id (string)
+          name (string)
+          forward_url (string)
+          filter (object)
+          enabled (bool)
+        """
+
+        passed_arguments = locals()
+        data = {}
+
+        for key, value in passed_arguments.items():
+            if key != "self" and key != "sms_inbound_id" and value is not None:
+                if key == "enabled":
+                    data[key] = int(value)
+                else:
+                    data[key] = value
+
+        request = requests.put(
+            f"{self.api_base}/sms-inbounds/{sms_inbound_id}",
+            headers=self.headers_default,
+            json=data,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def delete_inbound_route(self, sms_inbound_id):
+        """
+        Delete an SMS inbound route.
+
+        @params:
+          sms_inbound_id (string)
+        """
+
+        request = requests.delete(
+            f"{self.api_base}/sms-inbounds/{sms_inbound_id}",
+            headers=self.headers_default,
+        )
+
+        return f"{request.status_code}\n{request.text}"
diff --git a/.venv/lib/python3.12/site-packages/mailersend/sms_messages/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/sms_messages/__init__.py
new file mode 100644
index 00000000..03db8f63
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/sms_messages/__init__.py
@@ -0,0 +1,52 @@
+"""
+Handles /sms-messages endpoint
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewSmsMessages(base.NewAPIClient):
+    """
+    Instantiates the /sms-messages endpoint object
+    """
+
+    pass
+
+    def get_messages(self, page=1, limit=25):
+        """
+        Get a list of SMS messages.
+
+        @params:
+          page (int)
+          limit (int): Min: `10`, Max: `100`, default is 25
+        """
+
+        passed_arguments = locals()
+        query_params = {}
+
+        for key, value in passed_arguments.items():
+            query_params[key] = value
+
+        request = requests.get(
+            f"{self.api_base}/sms-messages",
+            headers=self.headers_default,
+            params=query_params,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def get_message(self, sms_message_id):
+        """
+        Get a single SMS message.
+
+        @params:
+          sms_message_id (string)
+        """
+
+        request = requests.get(
+            f"{self.api_base}/sms-messages/{sms_message_id}",
+            headers=self.headers_default,
+        )
+
+        return f"{request.status_code}\n{request.text}"
diff --git a/.venv/lib/python3.12/site-packages/mailersend/sms_phone_numbers/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/sms_phone_numbers/__init__.py
new file mode 100644
index 00000000..1f47b417
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/sms_phone_numbers/__init__.py
@@ -0,0 +1,95 @@
+"""
+Handles /sms-numbers endpoint
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewSmsNumbers(base.NewAPIClient):
+    """
+    Instantiates the /sms-numbers endpoint object
+    """
+
+    pass
+
+    def get_phone_numbers(self, paused=False, page=None, limit=25):
+        """
+        Get a list of SMS phone numbers information.
+
+        @params:
+          paused (bool)
+          page (int)
+          limit (int): Min: `10`, Max: `100`, default is 25
+        """
+
+        passed_arguments = locals()
+        query_params = {}
+
+        for key, value in passed_arguments.items():
+            if key != "self":
+                if key == "paused":
+                    query_params[key] = int(value)
+                else:
+                    query_params[key] = value
+
+        request = requests.get(
+            f"{self.api_base}/sms-numbers",
+            headers=self.headers_default,
+            params=query_params,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def get_phone_number(self, sms_number_id):
+        """
+        Get information about a specific SMS phone number
+
+        @params:
+          sms_number_id (string)
+        """
+
+        request = requests.get(
+            f"{self.api_base}/sms-numbers/{sms_number_id}", headers=self.headers_default
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def update_phone_number(self, sms_number_id, paused=True):
+        """
+        Update a specific SMS phone number
+
+        @params:
+          sms_number_id (string)
+           paused (bool)
+        """
+
+        query_params = {"paused": int(paused)}
+        data = {"sms_number_id": sms_number_id}
+
+        request = requests.put(
+            f"{self.api_base}/sms-numbers/{sms_number_id}",
+            headers=self.headers_default,
+            params=query_params,
+            json=data,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def delete_phone_number(self, sms_number_id):
+        """
+        Delete a specific SMS phone number
+
+        @params:
+          sms_number_id (string)
+        """
+
+        data = {"sms_number_id": sms_number_id}
+
+        request = requests.delete(
+            f"{self.api_base}/sms-numbers/{sms_number_id}",
+            headers=self.headers_default,
+            json=data,
+        )
+
+        return f"{request.status_code}\n{request.text}"
diff --git a/.venv/lib/python3.12/site-packages/mailersend/sms_recipients/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/sms_recipients/__init__.py
new file mode 100644
index 00000000..ae8774f2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/sms_recipients/__init__.py
@@ -0,0 +1,76 @@
+"""
+Handles /sms-recipients endpoint
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewSmsRecipients(base.NewAPIClient):
+    """
+    Instantiates the /sms-recipients endpoint object
+    """
+
+    pass
+
+    def get_recipients(self, status="active", sms_number_id=None, page=None, limit=25):
+        """
+        Get information about SMS recipients.
+
+        @params:
+          status (string) - Possible values are `active` and `opt_out`
+          sms_number_id (string)
+          page (int)
+          limit (int): Min: `10`, Max: `100`, default is 25
+        """
+
+        passed_arguments = locals()
+        query_params = {}
+
+        for key, value in passed_arguments.items():
+            if key != "self":
+                query_params[key] = value
+
+        request = requests.get(
+            f"{self.api_base}/sms-recipients",
+            headers=self.headers_default,
+            params=query_params,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def get_recipient(self, sms_recipient_id):
+        """
+        Get information about a specific SMS recipient.
+
+        @params:
+          sms_recipient_id (string) - Possible values are `active` and `opt_out`
+        """
+
+        request = requests.get(
+            f"{self.api_base}/sms-recipients/{sms_recipient_id}",
+            headers=self.headers_default,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def update_recipient(self, sms_recipient_id, status):
+        """
+        Update a specific SMS recipient
+
+        @params:
+          sms_recipient_id (string)
+          status (string)
+        """
+
+        query_params = {"status": status}
+        data = {"sms_recipient_id": sms_recipient_id}
+
+        request = requests.put(
+            f"{self.api_base}/sms-recipients/{sms_recipient_id}",
+            headers=self.headers_default,
+            params=query_params,
+            json=data,
+        )
+
+        return f"{request.status_code}\n{request.text}"
diff --git a/.venv/lib/python3.12/site-packages/mailersend/sms_sending/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/sms_sending/__init__.py
new file mode 100644
index 00000000..c45d09fd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/sms_sending/__init__.py
@@ -0,0 +1,43 @@
+"""
+Handles /sms endpoint
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewSmsSending(base.NewAPIClient):
+    """
+    Instantiates the /sms endpoint object
+    """
+
+    pass
+
+    def send_sms(self, number_from, numbers_to, text, personalization=None):
+        """
+        Send SMS message to one or more recipients
+
+        Returns the JSON response of MailerSend API
+
+        @params:
+          number_from (str): Number belonging to your account in E164 format
+          numbers_to (dict): Recipient phone numbers (up to 50)
+          text (str): Message test
+          personalization: Allows using personalization in {{ var }} syntax. Can be used in the text fields
+        """
+
+        data = {
+            "from": number_from,
+            "to": numbers_to,
+            "text": text,
+            "personalization": personalization,
+        }
+
+        if personalization is None:
+            data["personalization"] = []
+
+        request = requests.post(
+            f"{self.api_base}/sms", headers=self.headers_default, json=data
+        )
+
+        return f"{request.status_code}\n{request.headers['X-SMS-Message-Id']}"
diff --git a/.venv/lib/python3.12/site-packages/mailersend/sms_webhooks/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/sms_webhooks/__init__.py
new file mode 100644
index 00000000..21070536
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/sms_webhooks/__init__.py
@@ -0,0 +1,122 @@
+"""
+Handles /sms-webhooks endpoint
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewSmsWebhooks(base.NewAPIClient):
+    """
+    Instantiates the /sms-webhooks endpoint object
+    """
+
+    # you shall not
+    pass
+
+    def get_webhooks(self, sms_number_id):
+        """
+        Get a list of SMS webhooks.
+
+        @params:
+          sms_number_id (string)
+        """
+
+        passed_arguments = locals()
+        query_params = {"sms_number_id": sms_number_id}
+
+        request = requests.get(
+            f"{self.api_base}/sms-webhooks",
+            headers=self.headers_default,
+            params=query_params,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def get_webhook(self, sms_webhook_id):
+        """
+        Get a single SMS webhook.
+
+        @params:
+          sms_webhook_id (string)
+        """
+
+        request = requests.get(
+            f"{self.api_base}/sms-webhooks/{sms_webhook_id}",
+            headers=self.headers_default,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def create_webhook(self, url, name, events, sms_number_id, enabled=True):
+        """
+        Create an SMS webhook.
+
+        @params:
+          url (string)
+          name (string)
+          events (dict)
+          enabled (bool)
+          sms_number_id (string)
+        """
+
+        data = {
+            "url": url,
+            "name": name,
+            "events": events,
+            "sms_number_id": sms_number_id,
+            "enabled": int(enabled),
+        }
+
+        request = requests.post(
+            f"{self.api_base}/sms-webhooks", headers=self.headers_default, json=data
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def update_webhook(
+        self, sms_webhook_id, url=None, name=None, events=None, enabled=None
+    ):
+        """
+        Update a single SMS Webhook.
+
+        @params:
+          sms_webhook_id (string)
+          url (string)
+          name (string)
+          events (dict)
+          enabled (bool)
+        """
+
+        passed_arguments = locals()
+        data = {}
+
+        for key, value in passed_arguments.items():
+            if key != "self" and key != "sms_webhook_id" and value is not None:
+                if key == "enabled":
+                    data[key] = int(value)
+                else:
+                    data[key] = value
+
+        request = requests.put(
+            f"{self.api_base}/sms-webhooks/{sms_webhook_id}",
+            headers=self.headers_default,
+            json=data,
+        )
+
+        return f"{request.status_code}\n{request.text}"
+
+    def delete_webhook(self, sms_webhook_id):
+        """
+        Delete an SMS webhook.
+
+        @params:
+          sms_webhook_id (string)
+        """
+
+        request = requests.delete(
+            f"{self.api_base}/sms-webhooks/{sms_webhook_id}",
+            headers=self.headers_default,
+        )
+
+        return f"{request.status_code}\n{request.text}"
diff --git a/.venv/lib/python3.12/site-packages/mailersend/templates/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/templates/__init__.py
new file mode 100644
index 00000000..deee93f7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/templates/__init__.py
@@ -0,0 +1,42 @@
+"""
+Handles /templates endpoint
+Doc: https://developers.mailersend.com/api/v1/templates.html
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewTemplate(base.NewAPIClient):
+    """
+    Instantiates the /templates endpoint object
+    """
+
+    pass
+
+    def get_templates(self):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+        request = requests.get(
+            f"{self.api_base}/templates", headers=self.headers_default
+        )
+        return request.text
+
+    def get_template_by_id(self, template_id):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+        request = requests.get(
+            f"{self.api_base}/templates/{template_id}", headers=self.headers_default
+        )
+        return request.text
+
+    def delete_template(self, template_id):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+        request = requests.delete(
+            f"{self.api_base}/templates/{template_id}", headers=self.headers_default
+        )
+        return request.text
diff --git a/.venv/lib/python3.12/site-packages/mailersend/tokens/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/tokens/__init__.py
new file mode 100644
index 00000000..82954132
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/tokens/__init__.py
@@ -0,0 +1,54 @@
+"""
+Handles /tokens endpoint
+Doc: https://developers.mailersend.com/api/v1/tokens.html
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewToken(base.NewAPIClient):
+    """
+    Instantiates the /tokens endpoint object
+    """
+
+    pass
+
+    def create_token(self, token_name, token_scopes):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        _data = {"name": token_name, "scopes": token_scopes}
+
+        request = requests.post(
+            f"{self.api_base}/token", headers=self.headers_default, json=_data
+        )
+        return request.text
+
+    def update_token(self, token_id, pause=True):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        if pause:
+            _data = base.generate_config_change_json_body("status", "pause")
+        else:
+            _data = base.generate_config_change_json_body("status", "unpause")
+
+        request = requests.put(
+            f"{self.api_base}/token/{token_id}/settings",
+            headers=self.headers_default,
+            json=_data,
+        )
+        return request.text
+
+    def delete_token(self, token_id):
+        """
+        Returns a HTTP status code from the MailerSend API
+        """
+
+        request = requests.delete(
+            f"{self.api_base}/token/{token_id}/", headers=self.headers_default
+        )
+        return request.status_code
diff --git a/.venv/lib/python3.12/site-packages/mailersend/utils/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/utils/__init__.py
new file mode 100644
index 00000000..d57e2fb5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/utils/__init__.py
@@ -0,0 +1,43 @@
+"""
+Provides helper functions to convenience devs
+"""
+
+import requests
+from mailersend.base import base
+
+
+class NewHelper(base.NewAPIClient):
+    """
+    NewHelper extends base.NewAPIClient to inherit connection details
+    """
+
+    def __init__(self):
+        """
+        NewHelper constructor
+        """
+        pass
+
+    def get_id_by_name(self, category, name):
+        """
+        Returns an ID given a category and item name from the MailerSend API
+
+        @params:
+          category (str): Can be one of "recipients", "domains"
+          name (str): Object name
+        """
+
+        request = requests.get(
+            f"{self.api_base}/{category}", headers=self.headers_default
+        )
+
+        _json_req = request.json()
+
+        category_search_asset = {"recipients": "email", "domains": "name"}
+
+        _data_block = _json_req["data"]
+
+        for data in _data_block:
+            if data[category_search_asset.get(category)] == name:
+                return data["id"]
+
+        return request.text
diff --git a/.venv/lib/python3.12/site-packages/mailersend/webhooks/__init__.py b/.venv/lib/python3.12/site-packages/mailersend/webhooks/__init__.py
new file mode 100644
index 00000000..92152b17
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/mailersend/webhooks/__init__.py
@@ -0,0 +1,135 @@
+"""
+Handles /webhooks endpoint
+Doc: https://developers.mailersend.com/api/v1/webhooks.html
+"""
+
+import requests
+from mailersend.base import base
+
+data = {}
+
+
+class NewWebhook(base.NewAPIClient):
+    """
+    Instantiates the /webhooks endpoint object
+    """
+
+    def __init__(self):
+        """
+        NewWebhook constructor
+        """
+        pass
+
+    def get_webhooks(self, domain_id):
+        """
+        Returns a JSON response from the MailerSend API
+
+        @params:
+          domain_id (str): A domain ID
+        """
+        request = requests.get(
+            f"{self.api_base}/webhooks",
+            headers=self.headers_default,
+            json={"domain_id": domain_id},
+        )
+        return request.text
+
+    def get_webhook_by_id(self, webhook_id):
+        """
+        Returns a JSON response from the MailerSend API
+
+        @params:
+          webhook_id (str): A webhook ID
+        """
+        request = requests.get(
+            f"{self.api_base}/webhooks/{webhook_id}", headers=self.headers_default
+        )
+        return request.text
+
+    def set_webhook_url(self, webhook_url):
+        """
+        Sets the webhook 'url' field
+
+        @params:
+          webhook_url (str): A webhook URL
+        """
+        data["url"] = webhook_url
+
+    def set_webhook_name(self, webhook_name):
+        """
+        Sets the webhook 'name' field
+
+        @params:
+          webhook_name (str): A webhook name
+        """
+
+        data["name"] = webhook_name
+
+    def set_webhook_events(self, events):
+        """
+        Sets the webhook 'events' field
+
+        @params:
+          events (list): A list containing valid events
+        """
+        data["events"] = events
+
+    def set_webhook_enabled(self, enabled=True):
+        """
+        Sets the webhook 'enabled' status field
+
+        @params:
+          enabled (bool): Controls webhook status
+        """
+
+        data["enabled"] = enabled
+
+    def set_webhook_domain(self, domain_id):
+        """
+        Sets the webhook 'domain_id' status field
+
+        @params:
+          domain_id (str): A valid domain ID
+        """
+
+        data["domain_id"] = domain_id
+
+    def update_webhook(self, webhook_id, key, value):
+        """
+        Updates a webhook setting
+
+        @params:
+          webhook_id (str): A valid webhook ID
+          key (str): A setting key
+          value (str): Corresponding keys value
+        """
+
+        request = requests.put(
+            f"{self.api_base}/webhooks/{webhook_id}",
+            headers=self.headers_default,
+            json={f"{key}": value},
+        )
+        return request.text
+
+    def delete_webhook(self, webhook_id):
+        """
+        Returns a JSON response from the MailerSend API
+
+        @params:
+          webhook_id (str): A valid webhook ID
+        """
+
+        request = requests.delete(
+            f"{self.api_base}/webhooks/{webhook_id}", headers=self.headers_default
+        )
+        return request.text
+
+    def create_webhook(self):
+        """
+        Returns a JSON response from the MailerSend API
+        """
+
+        request = requests.post(
+            f"{self.api_base}/webhooks", headers=self.headers_default, json=data
+        )
+        return request.text