diff --git a/search_api.rules.inc b/search_api.rules.inc
new file mode 100644
index 0000000..2066fbf
--- /dev/null
+++ b/search_api.rules.inc
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @file
+ * Search API Rules integration.
+ */
+
+
+/**
+ * Implements hook_rules_action_info().
+ */
+function search_api_rules_action_info() {
+  $defaults = array(
+   'parameter' => array(
+      'entity' => array(
+        'type' => 'entity',
+        'label' => t('Entity'),
+        'save' => FALSE,
+      ),
+    ),
+    'group' => t('Search API'),
+    'access callback' => '_search_api_rules_access',
+  );
+
+  $items['search_api_index'] = $defaults + array(
+    'label' => t('Index an entity'),
+    'base' => '_search_api_rules_action_index',
+  );
+  $items['search_api_mark_changed'] = $defaults + array(
+    'label' => t('Mark an entity as changed'),
+    'base' => '_search_api_rules_action_mark_changed',
+  );
+  return $items;
+}
+
+/**
+ * Rules access callback for search api actions.
+ */
+function _search_api_rules_access() {
+  return user_access('administer search_api');
+}
+
+/**
+ * Rules action for indexing an item.
+ */
+function _search_api_rules_action_index(EntityDrupalWrapper $wrapper) {
+  $type = $wrapper->type();
+  $item_ids = array($wrapper->getIdentifier());
+
+  $conditions = array(
+    'enabled' => 1,
+    'item_type' => $type,
+    'read_only' => 0,
+  );
+  $indexes = search_api_index_load_multiple(FALSE, $conditions);
+  if (!$indexes) {
+    return;
+  }
+
+  foreach ($indexes as $index) {
+    $indexed = search_api_index_specific_items_delayed($index, $item_ids);
+  }
+}
+
+/**
+ * Rules action for marking an item as changed.
+ */
+function _search_api_rules_action_mark_changed(EntityDrupalWrapper $wrapper) {
+  $type = $wrapper->type();
+  $item_ids = array($wrapper->getIdentifier());
+
+  search_api_track_item_change($type, $item_ids);
+}
