diff --git a/recipe_modules/util/api.py b/recipe_modules/util/api.py
new file mode 100644
index 0000000..2f78f35
--- /dev/null
+++ b/recipe_modules/util/api.py
@@ -0,0 +1,82 @@
+# Copyright 2021 The Pigweed Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+"""Utility functions common to multiple recipes that don't fit elsewhere."""
+
+import re
+
+import attr
+from recipe_engine import recipe_api
+
+
+@attr.s
+class ChangeWithComments(object):
+    change = attr.ib()
+    comments = attr.ib()
+
+
+class UtilApi(recipe_api.RecipeApi):
+    def get_change_with_comments(self):
+        input_ = self.m.buildbucket.build.input
+        change_id = str(input_.gerrit_changes[0].change)
+        change = self.m.gerrit.change_details(
+            'change details',
+            change_id=change_id,
+            host=input_.gerrit_changes[0].host,
+            query_params=['CURRENT_COMMIT', 'CURRENT_REVISION', 'ALL_FILES'],
+            test_data=self.m.json.test_api.output(
+                {
+                    'owner': {'email': 'coder@example.com',},
+                    'current_revision': 'a' * 40,
+                    'revisions': {
+                        'a' * 40: {'files': [], 'commit': {'message': '',},}
+                    },
+                    'revert_of': 0,
+                }
+            ),
+        ).json.output
+
+        current_revision = change['revisions'][change['current_revision']]
+        comments = [current_revision['commit']['message']]
+
+        comments_result = self.m.gerrit.list_change_comments(
+            "list change comments",
+            change_id,
+            test_data=self.m.json.test_api.output(
+                {'/PATCHSET_LEVEL': [{'message': ''}],}
+            ),
+        ).json.output
+
+        for file in comments_result:
+            for comment_data in comments_result[file]:
+                comments.append(comment_data['message'])
+
+        return ChangeWithComments(change, comments)
+
+    def find_matching_comment(self, rx, comments):
+        """Find a comment in comments that matches regex object rx."""
+        result = None
+        with self.m.step.nest('checking comments'):
+            for i, comment in enumerate(comments):
+                with self.m.step.nest('comment ({})'.format(i)) as pres:
+                    pres.step_summary_text = comment
+                    match = re.search(rx, comment)
+                    if match:
+                        result = match
+                        break
+
+            if result:
+                with self.m.step.nest('found'):
+                    pass
+
+        return result
