diff --git a/src/devranta/api.py b/src/devranta/api.py
index 66eac6b..32df954 100644
--- a/src/devranta/api.py
+++ b/src/devranta/api.py
@@ -1,5 +1,11 @@
+from typing import Literal, Optional
 import aiohttp
+from enum import Enum
 
+class VoteReason(Enum):
+    NOT_FOR_ME = 0
+    REPOST = 1
+    OFFENSIVE_SPAM = 2
 
 class Api:
 
@@ -168,6 +174,28 @@ class Api:
         obj = await response.json()
         return obj.get("success", False)
 
+    async def vote_rant(self, rant_id: int, vote: Literal[-1, 0, 1], reason: Optional[VoteReason] = None):
+        if not await self.ensure_login():
+            return None
+        async with self as session:
+            response = await session.post(
+                url=self.patch_url(f"devrant/rants/{rant_id}/vote"),
+                data=self.patch_auth({"vote": vote, "reason": reason.value if reason else None}),
+            )
+        obj = await response.json()
+        return obj.get("success", False)
+
+    async def vote_comment(self, comment_id: int, vote: Literal[-1, 0, 1], reason: Optional[VoteReason] = None):
+        if not await self.ensure_login():
+            return None
+        async with self as session:
+            response = await session.post(
+                url=self.patch_url(f"comments/{comment_id}/vote"),
+                data=self.patch_auth({"vote": vote, "reason": reason.value if reason else None}),
+            )
+        obj = await response.json()
+        return obj.get("success", False)
+
     @property
     async def notifs(self):
         response = None