def get_content_macro_by_hash(self, content_id, version, macro_hash, callback=None):
        """
        Returns the body of a macro (in storage format) with the given hash.
        This resource is primarily used by connect applications that require the body of macro to perform their work.

        The hash is generated by connect during render time of the local macro holder and
        is usually only relevant during the scope of one request. For optimisation purposes, this hash will usually
        live for multiple requests.

        Collecting a macro by its hash should now be considered deprecated and will be replaced,
        transparently with macroIds. This resource is currently only called from connect addons
        which will eventually all use the
        {@link #getContentById(com.atlassian.confluence.api.model.content.id.ContentId,
        java.util.List, Integer, String)} resource.

        To make the migration as seamless as possible, this resource will match macros against a generated hash or a
        stored macroId. This will allow add ons to work during the migration period.
        :param content_id (string): A string containing the id of the content.
        :param version (int): The version of the content which the hash belongs.
        :param macro_hash (string): The macroId to find the correct macro
        :param callback: OPTIONAL: The callback to execute on the resulting data, before the method returns.
                         Default: None (no callback, raw data returned).
        :return: The JSON data returned from the endpoint, or the results of the callback.
                 Will raise requests.HTTPError on bad input, potentially.
        """
        return self._service_get_request("rest/api/content/{id}/history/{version}/macro/hash/{hash}"
                                         "".format(id=content_id, version=version, hash=macro_hash), callback=callback)