diff --git a/src/plone/restapi/services/blocktypes/__init__.py b/src/plone/restapi/services/blocktypes/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/src/plone/restapi/services/blocktypes/configure.zcml b/src/plone/restapi/services/blocktypes/configure.zcml
new file mode 100644
index 0000000000..56f2127305
--- /dev/null
+++ b/src/plone/restapi/services/blocktypes/configure.zcml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/src/plone/restapi/services/blocktypes/get.py b/src/plone/restapi/services/blocktypes/get.py
new file mode 100644
index 0000000000..c4f942e5c7
--- /dev/null
+++ b/src/plone/restapi/services/blocktypes/get.py
@@ -0,0 +1,39 @@
+from plone import api
+from plone.restapi.services import Service
+from collections import Counter
+from plone.dexterity.content import get_assignable
+
+
+class BlockTypesGet(Service):
+ def reply(self):
+ catalog = api.portal.get_tool(name="portal_catalog")
+ request_body = self.request.form
+ result = {}
+
+ if request_body.get("blocktypes") != "":
+ blocktypes = request_body.get("blocktypes").split(",")
+
+ for blocktype in blocktypes:
+ brains = catalog.searchResults(block_types=blocktype)
+ result[blocktype] = Counter()
+
+ for brain in brains:
+ obj = brain.getObject()
+ assignable = get_assignable(obj)
+
+ hasBlocksBehavior = bool(
+ {
+ behavior
+ for behavior in assignable.enumerateBehaviors()
+ if behavior.name == "volto.blocks"
+ }
+ )
+
+ if hasBlocksBehavior:
+ url = brain.getURL() # or brain.getPath()
+
+ for block in obj.blocks.values():
+ if block["@type"] == blocktype:
+ result[blocktype].update({url: 1})
+
+ return result
diff --git a/src/plone/restapi/services/configure.zcml b/src/plone/restapi/services/configure.zcml
index ed31ccf121..0a443df55f 100644
--- a/src/plone/restapi/services/configure.zcml
+++ b/src/plone/restapi/services/configure.zcml
@@ -13,6 +13,7 @@
+