diff --git a/Magento/Sniffs/Classes/AbstractApiSniff.php b/Magento/Sniffs/Classes/AbstractApiSniff.php
new file mode 100644
index 00000000..35353988
--- /dev/null
+++ b/Magento/Sniffs/Classes/AbstractApiSniff.php
@@ -0,0 +1,68 @@
+getTokens();
+ $prev = $phpcsFile->findPrevious(T_WHITESPACE, $stackPtr - 1, null, true);
+ if ($prev !== false && $tokens[$prev]['code'] !== T_ABSTRACT) {
+ return;
+ }
+
+ $commentStartPtr = $phpcsFile->findPrevious(T_DOC_COMMENT_OPEN_TAG, $stackPtr - 1, 0);
+ $commentCloserPtr = $tokens[$commentStartPtr]['comment_closer'];
+
+ for ($i = $commentStartPtr; $i <= $commentCloserPtr; $i++) {
+ $token = $tokens[$i];
+
+ if ($token['code'] !== T_DOC_COMMENT_TAG) {
+ continue;
+ }
+
+ if (strpos($token['content'], '@api') === false) {
+ continue;
+ }
+
+ $phpcsFile->addWarning($this->warningMessage, $i, $this->warningCode);
+ }
+ }
+}
diff --git a/Magento/Tests/Classes/AbstractApiUnitTest.inc b/Magento/Tests/Classes/AbstractApiUnitTest.inc
new file mode 100644
index 00000000..92d5edee
--- /dev/null
+++ b/Magento/Tests/Classes/AbstractApiUnitTest.inc
@@ -0,0 +1,41 @@
+ 1,
+ 23 => 1
+ ];
+ }
+}
diff --git a/Magento/ruleset.xml b/Magento/ruleset.xml
index 0e033cb7..c5b9f80e 100644
--- a/Magento/ruleset.xml
+++ b/Magento/ruleset.xml
@@ -105,6 +105,10 @@
+
+ 8
+ warning
+
8
warning