diff --git a/src/requests/all/add_sticker_to_set.rs b/src/requests/all/add_sticker_to_set.rs
index 5049ce21..fad08872 100644
--- a/src/requests/all/add_sticker_to_set.rs
+++ b/src/requests/all/add_sticker_to_set.rs
@@ -36,7 +36,9 @@ pub struct AddStickerToSet<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for AddStickerToSet<'_> {
+impl Request for AddStickerToSet<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_multipart(
             self.bot.client(),
diff --git a/src/requests/all/answer_callback_query.rs b/src/requests/all/answer_callback_query.rs
index 3b5f35cb..6e11f4d8 100644
--- a/src/requests/all/answer_callback_query.rs
+++ b/src/requests/all/answer_callback_query.rs
@@ -41,7 +41,9 @@ pub struct AnswerCallbackQuery<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for AnswerCallbackQuery<'_> {
+impl Request for AnswerCallbackQuery<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/answer_inline_query.rs b/src/requests/all/answer_inline_query.rs
index d0422adf..311bc904 100644
--- a/src/requests/all/answer_inline_query.rs
+++ b/src/requests/all/answer_inline_query.rs
@@ -50,7 +50,9 @@ pub struct AnswerInlineQuery<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for AnswerInlineQuery<'_> {
+impl Request for AnswerInlineQuery<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/answer_pre_checkout_query.rs b/src/requests/all/answer_pre_checkout_query.rs
index 341cc519..f421e9ca 100644
--- a/src/requests/all/answer_pre_checkout_query.rs
+++ b/src/requests/all/answer_pre_checkout_query.rs
@@ -34,7 +34,9 @@ pub struct AnswerPreCheckoutQuery<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for AnswerPreCheckoutQuery<'_> {
+impl Request for AnswerPreCheckoutQuery<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/answer_shipping_query.rs b/src/requests/all/answer_shipping_query.rs
index 67052cea..61618a31 100644
--- a/src/requests/all/answer_shipping_query.rs
+++ b/src/requests/all/answer_shipping_query.rs
@@ -34,7 +34,9 @@ pub struct AnswerShippingQuery<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for AnswerShippingQuery<'_> {
+impl Request for AnswerShippingQuery<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/create_new_sticker_set.rs b/src/requests/all/create_new_sticker_set.rs
index 1f05bc51..aba8219f 100644
--- a/src/requests/all/create_new_sticker_set.rs
+++ b/src/requests/all/create_new_sticker_set.rs
@@ -42,7 +42,9 @@ pub struct CreateNewStickerSet<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for CreateNewStickerSet<'_> {
+impl Request for CreateNewStickerSet<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_multipart(
             self.bot.client(),
diff --git a/src/requests/all/delete_chat_photo.rs b/src/requests/all/delete_chat_photo.rs
index 65ea22a2..6eee11ce 100644
--- a/src/requests/all/delete_chat_photo.rs
+++ b/src/requests/all/delete_chat_photo.rs
@@ -22,7 +22,9 @@ pub struct DeleteChatPhoto<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for DeleteChatPhoto<'_> {
+impl Request for DeleteChatPhoto<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/delete_chat_sticker_set.rs b/src/requests/all/delete_chat_sticker_set.rs
index cfebe609..422faa32 100644
--- a/src/requests/all/delete_chat_sticker_set.rs
+++ b/src/requests/all/delete_chat_sticker_set.rs
@@ -24,7 +24,9 @@ pub struct DeleteChatStickerSet<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for DeleteChatStickerSet<'_> {
+impl Request for DeleteChatStickerSet<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/delete_message.rs b/src/requests/all/delete_message.rs
index 2d8bef47..490d6d0a 100644
--- a/src/requests/all/delete_message.rs
+++ b/src/requests/all/delete_message.rs
@@ -30,7 +30,9 @@ pub struct DeleteMessage<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for DeleteMessage<'_> {
+impl Request for DeleteMessage<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/delete_sticker_from_set.rs b/src/requests/all/delete_sticker_from_set.rs
index 4c9c0968..11a32ab1 100644
--- a/src/requests/all/delete_sticker_from_set.rs
+++ b/src/requests/all/delete_sticker_from_set.rs
@@ -20,7 +20,9 @@ pub struct DeleteStickerFromSet<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for DeleteStickerFromSet<'_> {
+impl Request for DeleteStickerFromSet<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/delete_webhook.rs b/src/requests/all/delete_webhook.rs
index 84e27dec..bb75cd88 100644
--- a/src/requests/all/delete_webhook.rs
+++ b/src/requests/all/delete_webhook.rs
@@ -17,7 +17,9 @@ pub struct DeleteWebhook<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for DeleteWebhook<'_> {
+impl Request for DeleteWebhook<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/edit_message_caption.rs b/src/requests/all/edit_message_caption.rs
index 229d2267..26345554 100644
--- a/src/requests/all/edit_message_caption.rs
+++ b/src/requests/all/edit_message_caption.rs
@@ -29,7 +29,9 @@ pub struct EditMessageCaption<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for EditMessageCaption<'_> {
+impl Request for EditMessageCaption<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/edit_message_live_location.rs b/src/requests/all/edit_message_live_location.rs
index 7a72fd07..b5b9c8b9 100644
--- a/src/requests/all/edit_message_live_location.rs
+++ b/src/requests/all/edit_message_live_location.rs
@@ -29,7 +29,9 @@ pub struct EditMessageLiveLocation<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for EditMessageLiveLocation<'_> {
+impl Request for EditMessageLiveLocation<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/edit_message_media.rs b/src/requests/all/edit_message_media.rs
index 487b024a..7941b1d9 100644
--- a/src/requests/all/edit_message_media.rs
+++ b/src/requests/all/edit_message_media.rs
@@ -30,7 +30,9 @@ pub struct EditMessageMedia<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for EditMessageMedia<'_> {
+impl Request for EditMessageMedia<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         let mut params = FormBuilder::new();
 
diff --git a/src/requests/all/edit_message_reply_markup.rs b/src/requests/all/edit_message_reply_markup.rs
index 7878cdd1..a5721ca2 100644
--- a/src/requests/all/edit_message_reply_markup.rs
+++ b/src/requests/all/edit_message_reply_markup.rs
@@ -24,7 +24,9 @@ pub struct EditMessageReplyMarkup<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for EditMessageReplyMarkup<'_> {
+impl Request for EditMessageReplyMarkup<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/edit_message_text.rs b/src/requests/all/edit_message_text.rs
index 61b80659..78857182 100644
--- a/src/requests/all/edit_message_text.rs
+++ b/src/requests/all/edit_message_text.rs
@@ -31,7 +31,9 @@ pub struct EditMessageText<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for EditMessageText<'_> {
+impl Request for EditMessageText<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/export_chat_invite_link.rs b/src/requests/all/export_chat_invite_link.rs
index 1242db02..5550953b 100644
--- a/src/requests/all/export_chat_invite_link.rs
+++ b/src/requests/all/export_chat_invite_link.rs
@@ -29,7 +29,9 @@ pub struct ExportChatInviteLink<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<String> for ExportChatInviteLink<'_> {
+impl Request for ExportChatInviteLink<'_> {
+    type Output = String;
+
     async fn send(&self) -> ResponseResult<String> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/forward_message.rs b/src/requests/all/forward_message.rs
index 0d942b82..646ef8a7 100644
--- a/src/requests/all/forward_message.rs
+++ b/src/requests/all/forward_message.rs
@@ -29,7 +29,9 @@ pub struct ForwardMessage<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for ForwardMessage<'_> {
+impl Request for ForwardMessage<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/get_chat.rs b/src/requests/all/get_chat.rs
index 105664be..8313dde6 100644
--- a/src/requests/all/get_chat.rs
+++ b/src/requests/all/get_chat.rs
@@ -22,7 +22,9 @@ pub struct GetChat<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Chat> for GetChat<'_> {
+impl Request for GetChat<'_> {
+    type Output = Chat;
+
     async fn send(&self) -> ResponseResult<Chat> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/get_chat_administrators.rs b/src/requests/all/get_chat_administrators.rs
index 5135c75a..32fd9e61 100644
--- a/src/requests/all/get_chat_administrators.rs
+++ b/src/requests/all/get_chat_administrators.rs
@@ -24,7 +24,9 @@ pub struct GetChatAdministrators<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Vec<ChatMember>> for GetChatAdministrators<'_> {
+impl Request for GetChatAdministrators<'_> {
+    type Output = Vec<ChatMember>;
+
     async fn send(&self) -> ResponseResult<Vec<ChatMember>> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/get_chat_member.rs b/src/requests/all/get_chat_member.rs
index 58f3bc0c..37a32e70 100644
--- a/src/requests/all/get_chat_member.rs
+++ b/src/requests/all/get_chat_member.rs
@@ -23,7 +23,9 @@ pub struct GetChatMember<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<ChatMember> for GetChatMember<'_> {
+impl Request for GetChatMember<'_> {
+    type Output = ChatMember;
+
     async fn send(&self) -> ResponseResult<ChatMember> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/get_chat_members_count.rs b/src/requests/all/get_chat_members_count.rs
index c3660aae..a5b6fa58 100644
--- a/src/requests/all/get_chat_members_count.rs
+++ b/src/requests/all/get_chat_members_count.rs
@@ -21,7 +21,9 @@ pub struct GetChatMembersCount<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<i32> for GetChatMembersCount<'_> {
+impl Request for GetChatMembersCount<'_> {
+    type Output = i32;
+
     async fn send(&self) -> ResponseResult<i32> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/get_file.rs b/src/requests/all/get_file.rs
index d06cb055..f6a66d2a 100644
--- a/src/requests/all/get_file.rs
+++ b/src/requests/all/get_file.rs
@@ -37,7 +37,9 @@ pub struct GetFile<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<File> for GetFile<'_> {
+impl Request for GetFile<'_> {
+    type Output = File;
+
     async fn send(&self) -> ResponseResult<File> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/get_game_high_scores.rs b/src/requests/all/get_game_high_scores.rs
index 02e727bb..eb5737b9 100644
--- a/src/requests/all/get_game_high_scores.rs
+++ b/src/requests/all/get_game_high_scores.rs
@@ -27,7 +27,9 @@ pub struct GetGameHighScores<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Vec<GameHighScore>> for GetGameHighScores<'_> {
+impl Request for GetGameHighScores<'_> {
+    type Output = Vec<GameHighScore>;
+
     async fn send(&self) -> ResponseResult<Vec<GameHighScore>> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/get_me.rs b/src/requests/all/get_me.rs
index 07d882e7..3fbe7791 100644
--- a/src/requests/all/get_me.rs
+++ b/src/requests/all/get_me.rs
@@ -17,7 +17,9 @@ pub struct GetMe<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<User> for GetMe<'_> {
+impl Request for GetMe<'_> {
+    type Output = User;
+
     #[allow(clippy::trivially_copy_pass_by_ref)]
     async fn send(&self) -> ResponseResult<User> {
         network::request_json(
diff --git a/src/requests/all/get_sticker_set.rs b/src/requests/all/get_sticker_set.rs
index 86a9fb31..5914123c 100644
--- a/src/requests/all/get_sticker_set.rs
+++ b/src/requests/all/get_sticker_set.rs
@@ -20,7 +20,9 @@ pub struct GetStickerSet<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<StickerSet> for GetStickerSet<'_> {
+impl Request for GetStickerSet<'_> {
+    type Output = StickerSet;
+
     async fn send(&self) -> ResponseResult<StickerSet> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/get_updates.rs b/src/requests/all/get_updates.rs
index 22d3155b..795aa58b 100644
--- a/src/requests/all/get_updates.rs
+++ b/src/requests/all/get_updates.rs
@@ -66,7 +66,9 @@ pub struct GetUpdates<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Vec<Update>> for GetUpdates<'_> {
+impl Request for GetUpdates<'_> {
+    type Output = Vec<Update>;
+
     async fn send(&self) -> ResponseResult<Vec<Update>> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/get_user_profile_photos.rs b/src/requests/all/get_user_profile_photos.rs
index 622d2453..2c43731d 100644
--- a/src/requests/all/get_user_profile_photos.rs
+++ b/src/requests/all/get_user_profile_photos.rs
@@ -26,7 +26,9 @@ pub struct GetUserProfilePhotos<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<UserProfilePhotos> for GetUserProfilePhotos<'_> {
+impl Request for GetUserProfilePhotos<'_> {
+    type Output = UserProfilePhotos;
+
     async fn send(&self) -> ResponseResult<UserProfilePhotos> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/get_webhook_info.rs b/src/requests/all/get_webhook_info.rs
index 55b9015e..ff65ee25 100644
--- a/src/requests/all/get_webhook_info.rs
+++ b/src/requests/all/get_webhook_info.rs
@@ -17,7 +17,9 @@ pub struct GetWebhookInfo<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<WebhookInfo> for GetWebhookInfo<'_> {
+impl Request for GetWebhookInfo<'_> {
+    type Output = WebhookInfo;
+
     async fn send(&self) -> ResponseResult<WebhookInfo> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/kick_chat_member.rs b/src/requests/all/kick_chat_member.rs
index 5efdad2c..50ec4bbb 100644
--- a/src/requests/all/kick_chat_member.rs
+++ b/src/requests/all/kick_chat_member.rs
@@ -30,7 +30,9 @@ pub struct KickChatMember<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for KickChatMember<'_> {
+impl Request for KickChatMember<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/leave_chat.rs b/src/requests/all/leave_chat.rs
index 686009c4..a6e792a4 100644
--- a/src/requests/all/leave_chat.rs
+++ b/src/requests/all/leave_chat.rs
@@ -21,7 +21,9 @@ pub struct LeaveChat<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for LeaveChat<'_> {
+impl Request for LeaveChat<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/pin_chat_message.rs b/src/requests/all/pin_chat_message.rs
index dad8e193..8abef686 100644
--- a/src/requests/all/pin_chat_message.rs
+++ b/src/requests/all/pin_chat_message.rs
@@ -29,7 +29,9 @@ pub struct PinChatMessage<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for PinChatMessage<'_> {
+impl Request for PinChatMessage<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/promote_chat_member.rs b/src/requests/all/promote_chat_member.rs
index 5068a46f..88f8ee72 100644
--- a/src/requests/all/promote_chat_member.rs
+++ b/src/requests/all/promote_chat_member.rs
@@ -46,7 +46,9 @@ pub struct PromoteChatMember<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for PromoteChatMember<'_> {
+impl Request for PromoteChatMember<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/restrict_chat_member.rs b/src/requests/all/restrict_chat_member.rs
index fd9d6c1a..3ec1815d 100644
--- a/src/requests/all/restrict_chat_member.rs
+++ b/src/requests/all/restrict_chat_member.rs
@@ -31,7 +31,9 @@ pub struct RestrictChatMember<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for RestrictChatMember<'_> {
+impl Request for RestrictChatMember<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/send_animation.rs b/src/requests/all/send_animation.rs
index ffde26fc..a416b02c 100644
--- a/src/requests/all/send_animation.rs
+++ b/src/requests/all/send_animation.rs
@@ -62,7 +62,9 @@ pub struct SendAnimation<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendAnimation<'_> {
+impl Request for SendAnimation<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_multipart(
             self.bot.client(),
diff --git a/src/requests/all/send_audio.rs b/src/requests/all/send_audio.rs
index bee572c0..dc87956d 100644
--- a/src/requests/all/send_audio.rs
+++ b/src/requests/all/send_audio.rs
@@ -58,7 +58,9 @@ pub struct SendAudio<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendAudio<'_> {
+impl Request for SendAudio<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_multipart(
             self.bot.client(),
diff --git a/src/requests/all/send_chat_action.rs b/src/requests/all/send_chat_action.rs
index 405a48c9..641bfc93 100644
--- a/src/requests/all/send_chat_action.rs
+++ b/src/requests/all/send_chat_action.rs
@@ -68,7 +68,9 @@ pub enum SendChatActionKind {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for SendChatAction<'_> {
+impl Request for SendChatAction<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/send_contact.rs b/src/requests/all/send_contact.rs
index 4489e0ff..56f144cf 100644
--- a/src/requests/all/send_contact.rs
+++ b/src/requests/all/send_contact.rs
@@ -38,7 +38,9 @@ pub struct SendContact<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendContact<'_> {
+impl Request for SendContact<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/send_document.rs b/src/requests/all/send_document.rs
index 65e870f0..1817167f 100644
--- a/src/requests/all/send_document.rs
+++ b/src/requests/all/send_document.rs
@@ -51,7 +51,9 @@ pub struct SendDocument<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendDocument<'_> {
+impl Request for SendDocument<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_multipart(
             self.bot.client(),
diff --git a/src/requests/all/send_game.rs b/src/requests/all/send_game.rs
index 2d906ce2..48d5cff9 100644
--- a/src/requests/all/send_game.rs
+++ b/src/requests/all/send_game.rs
@@ -31,7 +31,9 @@ pub struct SendGame<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendGame<'_> {
+impl Request for SendGame<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/send_invoice.rs b/src/requests/all/send_invoice.rs
index 66aa1140..bedfe27d 100644
--- a/src/requests/all/send_invoice.rs
+++ b/src/requests/all/send_invoice.rs
@@ -75,7 +75,9 @@ pub struct SendInvoice<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendInvoice<'_> {
+impl Request for SendInvoice<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/send_location.rs b/src/requests/all/send_location.rs
index 89bd0196..1a0a36e4 100644
--- a/src/requests/all/send_location.rs
+++ b/src/requests/all/send_location.rs
@@ -37,7 +37,9 @@ pub struct SendLocation<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendLocation<'_> {
+impl Request for SendLocation<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/send_media_group.rs b/src/requests/all/send_media_group.rs
index 298bd89b..1b6fd151 100644
--- a/src/requests/all/send_media_group.rs
+++ b/src/requests/all/send_media_group.rs
@@ -29,7 +29,9 @@ pub struct SendMediaGroup<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Vec<Message>> for SendMediaGroup<'_> {
+impl Request for SendMediaGroup<'_> {
+    type Output = Vec<Message>;
+
     async fn send(&self) -> ResponseResult<Vec<Message>> {
         network::request_multipart(
             self.bot.client(),
diff --git a/src/requests/all/send_message.rs b/src/requests/all/send_message.rs
index 43906859..934bc37f 100644
--- a/src/requests/all/send_message.rs
+++ b/src/requests/all/send_message.rs
@@ -45,7 +45,9 @@ pub struct SendMessage<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendMessage<'_> {
+impl Request for SendMessage<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/send_photo.rs b/src/requests/all/send_photo.rs
index 9ddfd157..1ce44e87 100644
--- a/src/requests/all/send_photo.rs
+++ b/src/requests/all/send_photo.rs
@@ -40,7 +40,9 @@ pub struct SendPhoto<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendPhoto<'_> {
+impl Request for SendPhoto<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_multipart(
             self.bot.client(),
diff --git a/src/requests/all/send_poll.rs b/src/requests/all/send_poll.rs
index fe4463e8..601e0dec 100644
--- a/src/requests/all/send_poll.rs
+++ b/src/requests/all/send_poll.rs
@@ -35,7 +35,9 @@ pub struct SendPoll<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendPoll<'_> {
+impl Request for SendPoll<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/send_sticker.rs b/src/requests/all/send_sticker.rs
index 74b0f4f5..bbf41ffb 100644
--- a/src/requests/all/send_sticker.rs
+++ b/src/requests/all/send_sticker.rs
@@ -35,7 +35,9 @@ pub struct SendSticker<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendSticker<'_> {
+impl Request for SendSticker<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_multipart(
             self.bot.client(),
diff --git a/src/requests/all/send_venue.rs b/src/requests/all/send_venue.rs
index 128ff1e0..9c114745 100644
--- a/src/requests/all/send_venue.rs
+++ b/src/requests/all/send_venue.rs
@@ -44,7 +44,9 @@ pub struct SendVenue<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendVenue<'_> {
+impl Request for SendVenue<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/send_video.rs b/src/requests/all/send_video.rs
index e564e78f..1e549fb0 100644
--- a/src/requests/all/send_video.rs
+++ b/src/requests/all/send_video.rs
@@ -60,7 +60,9 @@ pub struct SendVideo<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendVideo<'_> {
+impl Request for SendVideo<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_multipart(
             self.bot.client(),
diff --git a/src/requests/all/send_video_note.rs b/src/requests/all/send_video_note.rs
index 62716d37..9f1b3d94 100644
--- a/src/requests/all/send_video_note.rs
+++ b/src/requests/all/send_video_note.rs
@@ -49,7 +49,9 @@ pub struct SendVideoNote<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendVideoNote<'_> {
+impl Request for SendVideoNote<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_multipart(
             self.bot.client(),
diff --git a/src/requests/all/send_voice.rs b/src/requests/all/send_voice.rs
index 5ea744a8..7bfd0163 100644
--- a/src/requests/all/send_voice.rs
+++ b/src/requests/all/send_voice.rs
@@ -46,7 +46,9 @@ pub struct SendVoice<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SendVoice<'_> {
+impl Request for SendVoice<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_multipart(
             self.bot.client(),
diff --git a/src/requests/all/set_chat_administrator_custom_title.rs b/src/requests/all/set_chat_administrator_custom_title.rs
index 90b32c81..7ea8aebf 100644
--- a/src/requests/all/set_chat_administrator_custom_title.rs
+++ b/src/requests/all/set_chat_administrator_custom_title.rs
@@ -28,7 +28,9 @@ pub struct SetChatAdministratorCustomTitle<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for SetChatAdministratorCustomTitle<'_> {
+impl Request for SetChatAdministratorCustomTitle<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/set_chat_description.rs b/src/requests/all/set_chat_description.rs
index f95c0a5c..23be7923 100644
--- a/src/requests/all/set_chat_description.rs
+++ b/src/requests/all/set_chat_description.rs
@@ -24,7 +24,9 @@ pub struct SetChatDescription<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for SetChatDescription<'_> {
+impl Request for SetChatDescription<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/set_chat_permissions.rs b/src/requests/all/set_chat_permissions.rs
index 95fc8c53..213c0cab 100644
--- a/src/requests/all/set_chat_permissions.rs
+++ b/src/requests/all/set_chat_permissions.rs
@@ -24,7 +24,9 @@ pub struct SetChatPermissions<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for SetChatPermissions<'_> {
+impl Request for SetChatPermissions<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/set_chat_photo.rs b/src/requests/all/set_chat_photo.rs
index ccc749d1..0e62e898 100644
--- a/src/requests/all/set_chat_photo.rs
+++ b/src/requests/all/set_chat_photo.rs
@@ -25,7 +25,9 @@ pub struct SetChatPhoto<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for SetChatPhoto<'_> {
+impl Request for SetChatPhoto<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/set_chat_sticker_set.rs b/src/requests/all/set_chat_sticker_set.rs
index ad6c1408..a698a809 100644
--- a/src/requests/all/set_chat_sticker_set.rs
+++ b/src/requests/all/set_chat_sticker_set.rs
@@ -26,7 +26,9 @@ pub struct SetChatStickerSet<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for SetChatStickerSet<'_> {
+impl Request for SetChatStickerSet<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/set_chat_title.rs b/src/requests/all/set_chat_title.rs
index d2cc866d..1aaa630e 100644
--- a/src/requests/all/set_chat_title.rs
+++ b/src/requests/all/set_chat_title.rs
@@ -24,7 +24,9 @@ pub struct SetChatTitle<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for SetChatTitle<'_> {
+impl Request for SetChatTitle<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/set_game_score.rs b/src/requests/all/set_game_score.rs
index 12e736d3..b98230ee 100644
--- a/src/requests/all/set_game_score.rs
+++ b/src/requests/all/set_game_score.rs
@@ -33,7 +33,9 @@ pub struct SetGameScore<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for SetGameScore<'_> {
+impl Request for SetGameScore<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/set_sticker_position_in_set.rs b/src/requests/all/set_sticker_position_in_set.rs
index 6db6a2d7..23892145 100644
--- a/src/requests/all/set_sticker_position_in_set.rs
+++ b/src/requests/all/set_sticker_position_in_set.rs
@@ -22,7 +22,9 @@ pub struct SetStickerPositionInSet<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for SetStickerPositionInSet<'_> {
+impl Request for SetStickerPositionInSet<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/set_webhook.rs b/src/requests/all/set_webhook.rs
index 998384b7..b2cf1589 100644
--- a/src/requests/all/set_webhook.rs
+++ b/src/requests/all/set_webhook.rs
@@ -49,7 +49,9 @@ pub struct SetWebhook<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for SetWebhook<'_> {
+impl Request for SetWebhook<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/stop_message_live_location.rs b/src/requests/all/stop_message_live_location.rs
index ece22938..154da4f0 100644
--- a/src/requests/all/stop_message_live_location.rs
+++ b/src/requests/all/stop_message_live_location.rs
@@ -24,7 +24,9 @@ pub struct StopMessageLiveLocation<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Message> for StopMessageLiveLocation<'_> {
+impl Request for StopMessageLiveLocation<'_> {
+    type Output = Message;
+
     async fn send(&self) -> ResponseResult<Message> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/stop_poll.rs b/src/requests/all/stop_poll.rs
index 1f33c348..b99de386 100644
--- a/src/requests/all/stop_poll.rs
+++ b/src/requests/all/stop_poll.rs
@@ -25,7 +25,9 @@ pub struct StopPoll<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<Poll> for StopPoll<'_> {
+impl Request for StopPoll<'_> {
+    type Output = Poll;
+
     async fn send(&self) -> ResponseResult<Poll> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/unban_chat_member.rs b/src/requests/all/unban_chat_member.rs
index a6cae179..e145911d 100644
--- a/src/requests/all/unban_chat_member.rs
+++ b/src/requests/all/unban_chat_member.rs
@@ -25,7 +25,9 @@ pub struct UnbanChatMember<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for UnbanChatMember<'_> {
+impl Request for UnbanChatMember<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/unpin_chat_message.rs b/src/requests/all/unpin_chat_message.rs
index 87e8874d..4b166240 100644
--- a/src/requests/all/unpin_chat_message.rs
+++ b/src/requests/all/unpin_chat_message.rs
@@ -23,7 +23,9 @@ pub struct UnpinChatMessage<'a> {
 }
 
 #[async_trait::async_trait]
-impl Request<True> for UnpinChatMessage<'_> {
+impl Request for UnpinChatMessage<'_> {
+    type Output = True;
+
     async fn send(&self) -> ResponseResult<True> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/all/upload_sticker_file.rs b/src/requests/all/upload_sticker_file.rs
index 6b9cf7dc..5b1b496b 100644
--- a/src/requests/all/upload_sticker_file.rs
+++ b/src/requests/all/upload_sticker_file.rs
@@ -24,7 +24,9 @@ pub struct UploadStickerFile<'a> {
     png_sticker: InputFile,
 }
 #[async_trait::async_trait]
-impl Request<File> for UploadStickerFile<'_> {
+impl Request for UploadStickerFile<'_> {
+    type Output = File;
+
     async fn send(&self) -> ResponseResult<File> {
         network::request_json(
             self.bot.client(),
diff --git a/src/requests/mod.rs b/src/requests/mod.rs
index e5dc6857..7f121d29 100644
--- a/src/requests/mod.rs
+++ b/src/requests/mod.rs
@@ -11,7 +11,10 @@ pub type ResponseResult<T> = Result<T, crate::RequestError>;
 
 /// Designates an API request.
 #[async_trait::async_trait]
-pub trait Request<T> {
+pub trait Request {
+    /// A data structure returned if success.
+    type Output;
+
     /// Asynchronously sends this request to Telegram and returns the result.
-    async fn send(&self) -> ResponseResult<T>;
+    async fn send(&self) -> ResponseResult<Self::Output>;
 }