diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/SearchBeanConfig.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/SearchBeanConfig.java
new file mode 100644
index 00000000..debc1e8b
--- /dev/null
+++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/SearchBeanConfig.java
@@ -0,0 +1,32 @@
+package com.cameleer3.server.app.config;
+
+import com.cameleer3.server.app.search.ClickHouseSearchEngine;
+import com.cameleer3.server.core.detail.DetailService;
+import com.cameleer3.server.core.search.SearchEngine;
+import com.cameleer3.server.core.search.SearchService;
+import com.cameleer3.server.core.storage.ExecutionRepository;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+/**
+ * Creates beans for the search and detail layers.
+ */
+@Configuration
+public class SearchBeanConfig {
+
+ @Bean
+ public SearchEngine searchEngine(JdbcTemplate jdbcTemplate) {
+ return new ClickHouseSearchEngine(jdbcTemplate);
+ }
+
+ @Bean
+ public SearchService searchService(SearchEngine searchEngine) {
+ return new SearchService(searchEngine);
+ }
+
+ @Bean
+ public DetailService detailService(ExecutionRepository executionRepository) {
+ return new DetailService(executionRepository);
+ }
+}
diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/SearchController.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/SearchController.java
new file mode 100644
index 00000000..d80fd006
--- /dev/null
+++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/SearchController.java
@@ -0,0 +1,64 @@
+package com.cameleer3.server.app.controller;
+
+import com.cameleer3.server.core.search.ExecutionSummary;
+import com.cameleer3.server.core.search.SearchRequest;
+import com.cameleer3.server.core.search.SearchResult;
+import com.cameleer3.server.core.search.SearchService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.Instant;
+
+/**
+ * Search endpoints for querying route executions.
+ *
+ * GET supports basic filters via query parameters. POST accepts a full
+ * {@link SearchRequest} JSON body for advanced search with all filter types.
+ */
+@RestController
+@RequestMapping("/api/v1/search")
+@Tag(name = "Search", description = "Transaction search endpoints")
+public class SearchController {
+
+ private final SearchService searchService;
+
+ public SearchController(SearchService searchService) {
+ this.searchService = searchService;
+ }
+
+ @GetMapping("/executions")
+ @Operation(summary = "Search executions with basic filters")
+ public ResponseEntity> searchGet(
+ @RequestParam(required = false) String status,
+ @RequestParam(required = false) Instant timeFrom,
+ @RequestParam(required = false) Instant timeTo,
+ @RequestParam(required = false) String correlationId,
+ @RequestParam(required = false) String text,
+ @RequestParam(defaultValue = "0") int offset,
+ @RequestParam(defaultValue = "50") int limit) {
+
+ SearchRequest request = new SearchRequest(
+ status, timeFrom, timeTo,
+ null, null,
+ correlationId,
+ text, null, null, null,
+ offset, limit
+ );
+
+ return ResponseEntity.ok(searchService.search(request));
+ }
+
+ @PostMapping("/executions")
+ @Operation(summary = "Advanced search with all filters")
+ public ResponseEntity> searchPost(
+ @RequestBody SearchRequest request) {
+ return ResponseEntity.ok(searchService.search(request));
+ }
+}
diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/ClickHouseSearchEngine.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/ClickHouseSearchEngine.java
new file mode 100644
index 00000000..f8f6e5c5
--- /dev/null
+++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/ClickHouseSearchEngine.java
@@ -0,0 +1,145 @@
+package com.cameleer3.server.app.search;
+
+import com.cameleer3.server.core.search.ExecutionSummary;
+import com.cameleer3.server.core.search.SearchEngine;
+import com.cameleer3.server.core.search.SearchRequest;
+import com.cameleer3.server.core.search.SearchResult;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import java.sql.Timestamp;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ClickHouse implementation of {@link SearchEngine}.
+ *
+ * Builds dynamic WHERE clauses from non-null {@link SearchRequest} fields
+ * and queries the {@code route_executions} table. LIKE patterns are properly
+ * escaped to prevent injection.
+ */
+public class ClickHouseSearchEngine implements SearchEngine {
+
+ private final JdbcTemplate jdbcTemplate;
+
+ public ClickHouseSearchEngine(JdbcTemplate jdbcTemplate) {
+ this.jdbcTemplate = jdbcTemplate;
+ }
+
+ @Override
+ public SearchResult search(SearchRequest request) {
+ var conditions = new ArrayList();
+ var params = new ArrayList