diff --git a/CHANGES b/CHANGES
index 60a0617..3505ba9 100644
--- a/CHANGES
+++ b/CHANGES
@@ -3,11 +3,11 @@
 
 * Fixed regression with `stream` parameter deprecation, requests.session() and cookie handling.
 * Replaced adhoc URL parsing with `urllib.parse`.
+* Added ``match`` parameter to ``add_callback`` method
 * Added `responses.matchers.fragment_identifier_matcher`. This matcher allows you
   to match request URL fragment identifier.
 * Improved test coverage.
 
-
 0.15.0
 ------
 
diff --git a/responses/__init__.py b/responses/__init__.py
index 7de3b64..1b1ce57 100644
--- a/responses/__init__.py
+++ b/responses/__init__.py
@@ -259,7 +259,7 @@ class BaseResponse(object):
 
     stream = False
 
-    def __init__(self, method, url, match_querystring=_unspecified, match=[]):
+    def __init__(self, method, url, match_querystring=_unspecified, match=()):
         self.method = method
         # ensure the url has a default path set if the url is a string
         self.url = _ensure_url_default_path(url)
@@ -667,7 +667,13 @@ class RequestsMock(object):
             self.add(method_or_response, url, body, *args, **kwargs)
 
     def add_callback(
-        self, method, url, callback, match_querystring=False, content_type="text/plain"
+        self,
+        method,
+        url,
+        callback,
+        match_querystring=False,
+        content_type="text/plain",
+        match=(),
     ):
         # ensure the url has a default path set if the url is a string
         # url = _ensure_url_default_path(url, match_querystring)
@@ -679,6 +685,7 @@ class RequestsMock(object):
                 callback=callback,
                 content_type=content_type,
                 match_querystring=match_querystring,
+                match=match,
             )
         )
 
diff --git a/responses/__init__.pyi b/responses/__init__.pyi
index 8e0bf35..898c68a 100644
--- a/responses/__init__.pyi
+++ b/responses/__init__.pyi
@@ -11,7 +11,8 @@ from typing import (
     Dict,
     List,
     Tuple,
-    Union
+    Union,
+    Iterable
 )
 from io import BufferedReader, BytesIO
 from re import Pattern
@@ -47,6 +48,8 @@ class Call(NamedTuple):
 
 _Body = Union[str, BaseException, "Response", BufferedReader, bytes]
 
+MatcherIterable = Iterable[Callable[[Any], Callable[..., Any]]]
+
 class CallList(Sequence[Call], Sized):
     def __init__(self) -> None: ...
     def __iter__(self) -> Iterator[Call]: ...
@@ -63,19 +66,19 @@ class BaseResponse:
     method: Any = ...
     url: Any = ...
     match_querystring: Any = ...
-    match: List[Any] = ...
+    match: MatcherIterable = ...
     call_count: int = ...
     def __init__(
         self,
         method: str,
         url: Union[Pattern[str], str],
         match_querystring: Union[bool, object] = ...,
-        match: List[Callable[..., Any]] = ...,
+        match: MatcherIterable = ...,
     ) -> None: ...
     def __eq__(self, other: Any) -> bool: ...
     def __ne__(self, other: Any) -> bool: ...
     def _req_attr_matches(
-        self, match: List[Callable[..., Any]], request: Optional[Union[bytes, str]]
+        self, match: MatcherIterable, request: Optional[Union[bytes, str]]
     ) -> Tuple[bool, str]: ...
     def _should_match_querystring(
         self, match_querystring_argument: Union[bool, object]
@@ -107,7 +110,7 @@ class Response(BaseResponse):
         content_type: Optional[str] = ...,
         auto_calculate_content_length: bool = ...,
         match_querystring: bool = ...,
-        match: List[Any] = ...,
+        match: MatcherIterable = ...,
     ) -> None: ...
     def get_response(  # type: ignore [override]
         self, request: PreparedRequest
@@ -125,7 +128,7 @@ class CallbackResponse(BaseResponse):
         stream: bool = ...,
         content_type: Optional[str] = ...,
         match_querystring: bool = ...,
-        match: List[Any] = ...,
+        match: MatcherIterable = ...,
     ) -> None: ...
     def get_response(  # type: ignore [override]
         self, request: PreparedRequest
@@ -202,7 +205,7 @@ class _Add(Protocol):
         auto_calculate_content_length: bool = ...,
         adding_headers: HeaderSet = ...,
         match_querystring: bool = ...,
-        match: List[Any] = ...,
+        match: MatcherIterable = ...,
     ) -> None: ...
 
 class _AddCallback(Protocol):
@@ -213,6 +216,7 @@ class _AddCallback(Protocol):
         callback: Callable[[PreparedRequest], Union[Exception, Tuple[int, Mapping[str, str], _Body]]],
         match_querystring: bool = ...,
         content_type: Optional[str] = ...,
+        match: MatcherIterable = ...,
     ) -> None: ...
 
 class _AddPassthru(Protocol):
@@ -240,7 +244,7 @@ class _Replace(Protocol):
         content_type: Optional[str] = ...,
         adding_headers: HeaderSet = ...,
         match_querystring: bool = ...,
-        match: List[Any] = ...,
+        match: MatcherIterable = ...,
     ) -> None: ...
 
 class _Upsert(Protocol):
@@ -256,7 +260,7 @@ class _Upsert(Protocol):
         content_type: Optional[str] = ...,
         adding_headers: HeaderSet = ...,
         match_querystring: bool = ...,
-        match: List[Any] = ...,
+        match: MatcherIterable = ...,
     ) -> None: ...
 
 class _Registered(Protocol):

diff --git a/responses/test_responses.py b/responses/test_responses.py
index 9c02fe6..2b8f403 100644
--- a/responses/test_responses.py
+++ b/responses/test_responses.py
@@ -669,6 +669,62 @@ def test_callback_content_type_dict():
     assert_reset()
 
 
+def test_callback_matchers():
+    def request_callback(request):
+        return (
+            200,
+            {"Content-Type": "application/json"},
+            b"foo",
+        )
+
+    @responses.activate
+    def run():
+        req_data = {"some": "other", "data": "fields"}
+        req_files = {"file_name": b"Old World!"}
+
+        responses.add_callback(
+            responses.POST,
+            url="http://httpbin.org/post",
+            match=[matchers.multipart_matcher(req_files, data=req_data)],
+            callback=request_callback,
+        )
+        resp = requests.post("http://httpbin.org/post", data=req_data, files=req_files)
+        assert resp.text == "foo"
+        assert resp.headers["content-type"] == "application/json"
+
+    run()
+    assert_reset()
+
+
+def test_callback_matchers_fail():
+    @responses.activate
+    def run():
+        req_data = {"some": "other", "data": "fields"}
+        req_files = {"file_name": b"Old World!"}
+
+        responses.add_callback(
+            responses.POST,
+            url="http://httpbin.org/post",
+            match=[matchers.multipart_matcher(req_files, data=req_data)],
+            callback=lambda x: (
+                0,
+                {"a": ""},
+                "",
+            ),
+        )
+        with pytest.raises(ConnectionError) as exc:
+            requests.post(
+                "http://httpbin.org/post",
+                data={"some": "other", "data": "wrong"},
+                files=req_files,
+            )
+
+        assert "multipart/form-data doesn't match." in str(exc.value)
+
+    run()
+    assert_reset()
+
+
 def test_callback_content_type_tuple():
     def request_callback(request):
         return (

Allow to specify stream=True for callback responses
According to https://github.com/getsentry/responses/blob/master/responses.py#L355 default stream value for callback responses is False.
Also there is no way to override this value using public method add_callback https://github.com/getsentry/responses/blob/master/responses.py#L510
As a result this doesn't work:
```
        def callback(request):
            return 200, {}, 'content'
        responses.add_callback(
            'GET',
            'https://domain.com/',
            callback
        )
        response = requests.get('https://domain.com/', stream=True)
        content = response.raw.read()
....
    response.raw.read()
  File "/usr/lib/python3.6/site-packages/urllib3/response.py", line 380, in read
    data = self._fp.read()
ValueError: I/O operation on closed file.
```
Looks like it can be fixed by adding stream argument to add_callback method

As an workaround one can add a match manually using context manager:
```
        def callback(request):
            return 200, {}, 'content'
        with responses.RequestsMock() as requests_mock:

            requests_mock._matches.append(responses.CallbackResponse(
                'GET',
                'https://domain.com/',
                callback, stream=True
            ))
            response = requests.get('https://domain.com/', stream=True)
            content = response.raw.read()
```
responses/test_responses.py::test_callback_matchers responses/test_responses.py::test_callback_matchers_fail
responses/test_responses.py::test_response responses/test_responses.py::test_response_encoded responses/test_responses.py::test_response_with_instance responses/test_responses.py::test_replace[http://example.com/two-http://example.com/two] responses/test_responses.py::test_replace[original1-replacement1] responses/test_responses.py::test_replace[http://example\\.com/two-http://example\\.com/two] responses/test_responses.py::test_replace_error[http://example.com/one-http://example\\.com/one] responses/test_responses.py::test_replace_error[http://example\\.com/one-http://example.com/one] responses/test_responses.py::test_replace_response_object_error responses/test_responses.py::test_upsert_replace[http://example.com/two-http://example.com/two] responses/test_responses.py::test_upsert_replace[original1-replacement1] responses/test_responses.py::test_upsert_replace[http://example\\.com/two-http://example\\.com/two] responses/test_responses.py::test_upsert_add[http://example.com/two-http://example.com/two] responses/test_responses.py::test_upsert_add[original1-replacement1] responses/test_responses.py::test_upsert_add[http://example\\.com/two-http://example\\.com/two] responses/test_responses.py::test_remove responses/test_responses.py::test_response_equality[args10-kwargs10-args20-kwargs20-True] responses/test_responses.py::test_response_equality[args11-kwargs11-args21-kwargs21-False] responses/test_responses.py::test_response_equality[args12-kwargs12-args22-kwargs22-False] responses/test_responses.py::test_response_equality[args13-kwargs13-args23-kwargs23-True] responses/test_responses.py::test_response_equality_different_objects responses/test_responses.py::test_connection_error responses/test_responses.py::test_match_querystring responses/test_responses.py::test_query_string_matcher responses/test_responses.py::test_match_empty_querystring responses/test_responses.py::test_match_querystring_error responses/test_responses.py::test_match_querystring_regex responses/test_responses.py::test_match_querystring_error_regex responses/test_responses.py::test_match_querystring_auto_activates responses/test_responses.py::test_match_querystring_missing_key responses/test_responses.py::test_accept_string_body responses/test_responses.py::test_accept_json_body responses/test_responses.py::test_no_content_type responses/test_responses.py::test_arbitrary_status_code responses/test_responses.py::test_throw_connection_error_explicit responses/test_responses.py::test_callback responses/test_responses.py::test_callback_deprecated_argument responses/test_responses.py::test_callback_exception_result responses/test_responses.py::test_callback_exception_body responses/test_responses.py::test_callback_no_content_type responses/test_responses.py::test_callback_content_type_dict responses/test_responses.py::test_callback_content_type_tuple responses/test_responses.py::test_regular_expression_url responses/test_responses.py::test_base_response_get_response responses/test_responses.py::test_custom_adapter responses/test_responses.py::test_responses_as_context_manager responses/test_responses.py::test_activate_doesnt_change_signature responses/test_responses.py::TestFixtures::test_function responses/test_responses.py::TestFixtures::test_function_decorated responses/test_responses.py::test_activate_mock_interaction responses/test_responses.py::test_activate_doesnt_change_signature_with_return_type responses/test_responses.py::test_activate_doesnt_change_signature_for_method responses/test_responses.py::test_response_cookies responses/test_responses.py::test_response_cookies_secure responses/test_responses.py::test_response_cookies_multiple responses/test_responses.py::test_response_cookies_session[True-True] responses/test_responses.py::test_response_cookies_session[True-False] responses/test_responses.py::test_response_cookies_session[True-None] responses/test_responses.py::test_response_cookies_session[False-True] responses/test_responses.py::test_response_cookies_session[False-False] responses/test_responses.py::test_response_cookies_session[False-None] responses/test_responses.py::test_response_cookies_session[None-True] responses/test_responses.py::test_response_cookies_session[None-False] responses/test_responses.py::test_response_cookies_session[None-None] responses/test_responses.py::test_response_callback responses/test_responses.py::test_response_filebody responses/test_responses.py::test_use_stream_twice_to_double_raw_io responses/test_responses.py::test_assert_all_requests_are_fired responses/test_responses.py::test_allow_redirects_samehost responses/test_responses.py::test_handles_unicode_querystring responses/test_responses.py::test_handles_unicode_url responses/test_responses.py::test_handles_unicode_body responses/test_responses.py::test_handles_buffered_reader_body responses/test_responses.py::test_headers responses/test_responses.py::test_legacy_adding_headers responses/test_responses.py::test_auto_calculate_content_length_string_body responses/test_responses.py::test_auto_calculate_content_length_bytes_body responses/test_responses.py::test_auto_calculate_content_length_json_body responses/test_responses.py::test_auto_calculate_content_length_unicode_body responses/test_responses.py::test_auto_calculate_content_length_doesnt_work_for_buffered_reader_body responses/test_responses.py::test_multiple_responses responses/test_responses.py::test_multiple_urls responses/test_responses.py::test_multiple_methods responses/test_responses.py::test_passthrough_flag responses/test_responses.py::test_passthrough_response responses/test_responses.py::test_passthrough_response_stream responses/test_responses.py::test_passthru_prefixes responses/test_responses.py::test_passthru responses/test_responses.py::test_passthru_regex responses/test_responses.py::test_method_named_param responses/test_responses.py::test_passthru_unicode responses/test_responses.py::test_custom_target responses/test_responses.py::test_cookies_from_headers responses/test_responses.py::test_request_param[http://example.com] responses/test_responses.py::test_request_param[http://example.com/some/path] responses/test_responses.py::test_request_param[http://example.com/other/path/] responses/test_responses.py::test_request_param_with_multiple_values_for_the_same_key responses/test_responses.py::test_assert_call_count[http://example.com] responses/test_responses.py::test_assert_call_count[http://example.com?hello=world] responses/test_responses.py::test_request_matches_post_params responses/test_responses.py::test_request_matches_empty_body responses/test_responses.py::test_request_matches_params responses/test_responses.py::test_multipart_matcher responses/test_responses.py::test_fail_request_error responses/test_responses.py::test_fail_matchers_error responses/test_responses.py::test_fail_multipart_matcher responses/test_responses.py::test_query_string_matcher_raises responses/test_responses.py::test_request_matches_headers responses/test_responses.py::test_request_matches_headers_no_match responses/test_responses.py::test_request_matches_headers_strict_match responses/test_responses.py::test_fragment_identifier_matcher responses/test_responses.py::test_fragment_identifier_matcher_error responses/test_responses.py::test_fragment_identifier_matcher_and_match_querystring responses/test_responses.py::test_response_representations[response_params0-<Response(url='http://example.com/' responses/test_responses.py::test_response_representations[response_params1-<Response(url='http://another-domain.com/' responses/test_responses.py::test_response_representations[response_params2-<Response(url='http://abcd.com/' responses/test_responses.py::test_mocked_responses_list_registered responses/test_responses.py::test_rfc_compliance[http://service-A/foo?q=fizz-http://service-a/foo?q=fizz] responses/test_responses.py::test_rfc_compliance[http://service-a/foo-http://service-A/foo] responses/test_responses.py::test_rfc_compliance[http://someHost-AwAy/-http://somehost-away/] responses/test_responses.py::test_rfc_compliance[http://fizzbuzz/foo-http://fizzbuzz/foo] responses/test_responses.py::test_matchers_create_key_val_str