diff --git a/app/assets/javascripts/components/actions/compose.jsx b/app/assets/javascripts/components/actions/compose.jsx
index c9be895f1274c21775eb95dff221933e345d6cd0..b77a9c727b6521420a26ed0dc14a2bcfd63b0791 100644
--- a/app/assets/javascripts/components/actions/compose.jsx
+++ b/app/assets/javascripts/components/actions/compose.jsx
@@ -148,7 +148,8 @@ export function fetchComposeSuggestions(token) {
     api(getState).get('/api/v1/accounts/search', {
       params: {
         q: token,
-        resolve: false
+        resolve: false,
+        limit: 4
       }
     }).then(response => {
       dispatch(readyComposeSuggestions(token, response.data));
diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index 9b02c998170d2f373971db3b53cf690955756dfd..9573326ef1d7065ad855c456585c0bb3c388cec2 100644
--- a/app/controllers/api/v1/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -92,7 +92,8 @@ class Api::V1::AccountsController < ApiController
   end
 
   def search
-    @accounts = SearchService.new.call(params[:q], params[:resolve] == 'true')
+    limit = params[:limit] ? [DEFAULT_ACCOUNTS_LIMIT, params[:limit].to_i].min : DEFAULT_ACCOUNTS_LIMIT
+    @accounts = SearchService.new.call(params[:q], limit, params[:resolve] == 'true')
     render action: :index
   end
 
diff --git a/app/services/search_service.rb b/app/services/search_service.rb
index d9b6278531a0613fa23d6b57d3bcc98cf105d603..9e8ee6220bc5c7fd28265b052255f7b42e296a7b 100644
--- a/app/services/search_service.rb
+++ b/app/services/search_service.rb
@@ -1,25 +1,21 @@
 class SearchService < BaseService
-  def call(query, resolve = false)
+  def call(query, limit, resolve = false)
     return if query.blank?
 
     username, domain = query.split('@')
 
-    if domain.nil?
-      search_all(username)
+    results = if domain.nil?
+      Account.search_for(username)
     else
-      search_or_resolve(username, domain, resolve)
+      Account.search_for("#{username} #{domain}")
     end
-  end
 
-  private
+    results = results.limit(limit).with_counters
 
-  def search_all(username)
-    Account.search_for(username)
-  end
+    if resolve && results.empty? && !domain.nil?
+      results = [FollowRemoteAccountService.new.call("#{username}@#{domain}")]
+    end
 
-  def search_or_resolve(username, domain, resolve)
-    results = Account.search_for("#{username} #{domain}")
-    return [FollowRemoteAccountService.new.call("#{username}@#{domain}")] if results.empty? && resolve
     results
   end
 end