diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index a549ab1c78..f48555245e 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -94,6 +94,7 @@ class PostStatusService < BaseService
   end
 
   def load_circle
+    raise ArgumentError if @options[:visibility] == 'limited' && @options[:circle_id].nil?
     return unless @options[:visibility] == 'circle' || (@options[:visibility] == 'limited' && @options[:circle_id].present?)
 
     @circle = @options[:circle_id].present? && Circle.find(@options[:circle_id])
diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb
index 3b953b9fc1..a2cf6fbfb0 100644
--- a/spec/services/post_status_service_spec.rb
+++ b/spec/services/post_status_service_spec.rb
@@ -206,6 +206,27 @@ RSpec.describe PostStatusService, type: :service do
     expect(status.mentioned_accounts.first.id).to eq circle_account.id
   end
 
+  it 'circle post with limited visibility' do
+    account = Fabricate(:account)
+    circle_account = Fabricate(:account)
+    circle = Fabricate(:circle, account: account)
+    text = 'This is an English text.'
+
+    circle_account.follow!(account)
+    circle.accounts << circle_account
+    status = subject.call(account, text: text, visibility: 'limited', circle_id: circle.id)
+
+    expect(status.visibility).to eq 'limited'
+    expect(status.limited_scope).to eq 'circle'
+  end
+
+  it 'limited visibility and empty circle' do
+    account = Fabricate(:account)
+    text = 'This is an English text.'
+
+    expect { subject.call(account, text: text, visibility: 'limited') }.to raise_exception ActiveRecord::RecordInvalid
+  end
+
   it 'safeguards mentions' do
     account = Fabricate(:account)
     mentioned_account = Fabricate(:account, username: 'alice')