diff --git a/API_TEST_EXECUTION_SUMMARY.md b/API_TEST_EXECUTION_SUMMARY.md
new file mode 100644
index 0000000..6cfa9b1
--- /dev/null
+++ b/API_TEST_EXECUTION_SUMMARY.md
@@ -0,0 +1,38 @@
+# CryptoFlash API Test Execution Summary
+
+## Overview
+This file captures the execution of the API test plan for the CryptoFlash project.
+
+## Changes made
+- Added controller tests for API endpoints:
+ - `src/test/java/jar/controller/MarketControllerTest.java`
+ - `src/test/java/jar/controller/UserControllerTest.java`
+ - `src/test/java/jar/controller/OrderControllerTest.java`
+ - `src/test/java/jar/controller/AdminControllerTest.java`
+- Updated `pom.xml` to include:
+ - `spring-boot-starter-test`
+ - `spring-boot-starter-validation`
+- Added request validation for `OrderController.OrderRequest` in `src/main/java/jar/controller/OrderController.java`.
+- Documented execution summary in `API_TEST_GUIDE.md`.
+
+## Commands executed
+```bash
+./mvnw test -q
+./mvnw -Djava.version=21 test -q
+./mvnw -Djava.version=21 -Dtest=MarketControllerTest test -q
+./mvnw -Djava.version=21 -Dtest=MarketControllerTest,UserControllerTest,OrderControllerTest,AdminControllerTest test -q
+```
+
+## Environment notes
+- Local environment uses Java 21.
+- The project `pom.xml` originally specified Java 25, so tests were executed with `-Djava.version=21`.
+- Full application test execution still requires a running MongoDB and Redis instance.
+
+## Result
+- The new controller tests passed successfully when run together:
+ - `./mvnw -Djava.version=21 -Dtest=MarketControllerTest,UserControllerTest,OrderControllerTest,AdminControllerTest test -q`
+- Exit status: `0`
+
+## Notes
+- Existing `CryptoflashApplicationTests` may fail in the current environment when MongoDB or Redis are not available.
+- The execution summary has been added to `API_TEST_GUIDE.md` and also saved in this standalone file.
diff --git a/API_TEST_EXECUTION_SUMMARY_RUN2.md b/API_TEST_EXECUTION_SUMMARY_RUN2.md
new file mode 100644
index 0000000..25b4256
--- /dev/null
+++ b/API_TEST_EXECUTION_SUMMARY_RUN2.md
@@ -0,0 +1,47 @@
+# CryptoFlash API Test Execution Summary (Run 2)
+
+## Overview
+
+This document captures a second execution of the API test plan for CryptoFlash.
+It preserves the existing summary file by writing a new record under `API_TEST_EXECUTION_SUMMARY_RUN2.md`.
+
+## Execution Date
+
+- June 1, 2026
+
+## Scope
+
+- Verified the focused controller test suite for Market, User, Order, and Admin APIs.
+- Used the same targeted Maven command as the prior run.
+- Did not start application containers for this execution.
+
+## Commands Used
+
+```bash
+wsl -d Ubuntu -- bash -lc 'cd /home/pedro/projects/lm-aide/CryptoFlash && ./mvnw -Djava.version=21 -Dtest=MarketControllerTest,UserControllerTest,OrderControllerTest,AdminControllerTest test -q; echo EXIT_CODE:$?'
+```
+
+## Execution Result
+
+- Controller tests executed successfully.
+- Maven returned `EXIT_CODE:0`.
+- The run produced Spring MockMvc initialization logs and validation warnings from Mockito, but no test failures.
+
+## Verified Test Coverage
+
+- `MarketControllerTest`
+- `UserControllerTest`
+- `OrderControllerTest`
+- `AdminControllerTest`
+
+## Notes
+
+- This run validates the standalone controller API tests in the current development environment.
+- Full application tests still require MongoDB and Redis to be available for end-to-end or integration scenarios.
+- The actual command output included expected validation handling for invalid order requests and missing headers.
+
+## Next Steps
+
+1. If you want to validate the full app behavior, start the containers from `docker-compose-dev.yml`.
+2. Run the full Maven suite or the integration tests once MongoDB and Redis are available.
+3. Preserve this run record alongside the existing summary for comparison.
diff --git a/API_TEST_EXECUTION_SUMMARY_RUN3.md b/API_TEST_EXECUTION_SUMMARY_RUN3.md
new file mode 100644
index 0000000..9a0d820
--- /dev/null
+++ b/API_TEST_EXECUTION_SUMMARY_RUN3.md
@@ -0,0 +1,38 @@
+# CryptoFlash API Test Execution Summary (Run 3 - Integration)
+
+## Overview
+
+This document captures an integration run that starts the full application and verifies basic end-to-end endpoints against running MongoDB and Redis containers.
+
+## Execution Date
+
+- June 1, 2026
+
+## Commands Used
+
+```bash
+wsl -d Ubuntu -- bash -lc 'cd /home/pedro/projects/lm-aide/CryptoFlash && ./mvnw -Djava.version=21 -Dtest=EndToEndTest test -q; echo EXIT_CODE:$?'
+```
+
+## Execution Result
+
+- The application started inside the test (Spring Boot v4.0.2) and connected to the running MongoDB replica set and Redis cluster.
+- `EndToEndTest` executed successfully; Maven returned `EXIT_CODE:0`.
+- Logs indicate successful seeding of users and Redis consumer group initialization.
+
+## Verified Endpoints
+
+- `GET /api/market/symbols` returned a non-empty array.
+- `GET /api/admin/health` returned 200 and a non-empty body.
+
+## Notes
+
+- This run confirms the application can start and reach MongoDB and Redis configured by `docker-compose-dev.yml`.
+- The integration test is minimal by design; expand with additional end-to-end flows if you want broader coverage.
+
+## Next Steps
+
+1. Expand `EndToEndTest` with additional scenarios (order placement, replay trigger, user trades).
+2. Add a CI job to run integration tests against an ephemeral Docker environment.
+3. Save additional run artifacts (logs, jacoco) if needed.
+
diff --git a/API_TEST_EXECUTION_SUMMARY_RUN4.md b/API_TEST_EXECUTION_SUMMARY_RUN4.md
new file mode 100644
index 0000000..1ab397f
--- /dev/null
+++ b/API_TEST_EXECUTION_SUMMARY_RUN4.md
@@ -0,0 +1,44 @@
+# CryptoFlash API Test Execution Summary (Run 4 - Expanded Integration)
+
+## Overview
+
+This record captures an expanded integration run that exercises additional end-to-end scenarios:
+- user profile
+- place order
+- order book
+- candles
+- trigger replay
+
+## Execution Date
+
+- June 1, 2026
+
+## Commands Used
+
+```bash
+wsl -d Ubuntu -- bash -lc 'cd /home/pedro/projects/lm-aide/CryptoFlash && ./mvnw -Djava.version=21 -Dtest=EndToEndTest test'
+```
+
+## Execution Result
+
+- Tests executed: 7
+- Failures: 0
+- Errors: 0
+- Build: SUCCESS
+- Observations: Application started, connected to MongoDB and Redis; users already seeded; market replay engine ran but found no candles (expected if collection empty); order placement created a resting order in the buy book.
+
+## Verified Scenarios
+
+- `GET /api/market/symbols` returned a non-empty list.
+- `GET /api/admin/health` returned 200.
+- `GET /api/users/SIM_USER_001` returned seeded user data.
+- `POST /api/orders` placed a valid order with header `X-User-ID` and returned 201.
+- `GET /api/orders/book/BTCUSD` returned an order book structure.
+- `GET /api/market/candles/BTCUSD?limit=5` returned an array (may be empty).
+- `GET /api/admin/trigger-replay` returned a success message.
+
+## Next Steps
+
+- Expand tests to cover negative scenarios (invalid orders, missing headers).
+- Add CI job that spins up ephemeral Docker services and runs `EndToEndTest`.
+- Optionally persist run logs and artifacts to `target/` for traceability.
diff --git a/API_TEST_GUIDE.md b/API_TEST_GUIDE.md
new file mode 100644
index 0000000..a54a64d
--- /dev/null
+++ b/API_TEST_GUIDE.md
@@ -0,0 +1,1032 @@
+# CryptoFlash API Testing Guide
+
+This document provides comprehensive testing documentation for all CryptoFlash REST API endpoints.
+
+## Table of Contents
+
+1. [Test Setup](#test-setup)
+2. [Test Structure](#test-structure)
+3. [Market Data Endpoints Tests](#market-data-endpoints-tests)
+4. [User Endpoints Tests](#user-endpoints-tests)
+5. [Order Endpoints Tests](#order-endpoints-tests)
+6. [Admin Endpoints Tests](#admin-endpoints-tests)
+7. [Running Tests](#running-tests)
+8. [Manual Testing with cURL](#manual-testing-with-curl)
+
+---
+
+## Test Setup
+
+### Prerequisites
+
+- Java 25
+- Maven
+- Running MongoDB instance
+- Running Redis instance
+- JUnit 5
+- Spring Boot Test Framework
+- MockMvc for testing REST endpoints
+
+### Dependencies (in pom.xml)
+
+```xml
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+```
+
+---
+
+## Test Structure
+
+Tests are organized by controller:
+
+```
+src/test/java/jar/
+├── controller/
+│ ├── MarketControllerTest.java
+│ ├── UserControllerTest.java
+│ ├── OrderControllerTest.java
+│ └── AdminControllerTest.java
+├── integration/
+│ └── EndToEndTest.java
+└── CryptoflashApplicationTests.java
+```
+
+---
+
+## Market Data Endpoints Tests
+
+### Endpoint: `GET /api/market/symbols`
+
+**Test Class:** `MarketControllerTest`
+
+**Test Case 1: Get All Symbols**
+```java
+@Test
+@DisplayName("Should return all supported trading symbols")
+void testGetSymbols() throws Exception {
+ mockMvc.perform(get("/api/market/symbols"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(5)))
+ .andExpect(jsonPath("$[0]", is("BTCUSD")))
+ .andExpect(jsonPath("$[1]", is("ETHUSD")));
+}
+```
+
+**Expected Response:**
+```json
+["BTCUSD", "ETHUSD", "LTCUSD", "XRPUSD", "BCHUSD"]
+```
+
+**Pass Criteria:**
+- ✅ Status code: 200 OK
+- ✅ Response contains 5 symbols
+- ✅ All symbols are valid cryptocurrency pairs
+
+---
+
+### Endpoint: `GET /api/market/candles/{symbol}`
+
+**Test Case 2: Get Candles for Valid Symbol**
+```java
+@Test
+@DisplayName("Should return market candles for valid symbol")
+void testGetCandlesForBTCUSD() throws Exception {
+ mockMvc.perform(get("/api/market/candles/BTCUSD")
+ .param("limit", "50"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", instanceOf(List.class)))
+ .andExpect(jsonPath("$[0].symbol", is("BTCUSD")))
+ .andExpect(jsonPath("$[0].open").exists())
+ .andExpect(jsonPath("$[0].high").exists())
+ .andExpect(jsonPath("$[0].low").exists())
+ .andExpect(jsonPath("$[0].close").exists())
+ .andExpect(jsonPath("$[0].volume").exists());
+}
+```
+
+**Test Case 3: Get Candles with Custom Limit**
+```java
+@Test
+@DisplayName("Should return candles with custom limit")
+void testGetCandlesWithCustomLimit() throws Exception {
+ mockMvc.perform(get("/api/market/candles/ETHUSD")
+ .param("limit", "100"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.length()", lessThanOrEqualTo(100)));
+}
+```
+
+**Test Case 4: Get Candles with Default Limit**
+```java
+@Test
+@DisplayName("Should return default 50 candles when limit not specified")
+void testGetCandlesDefaultLimit() throws Exception {
+ mockMvc.perform(get("/api/market/candles/LTCUSD"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.length()", lessThanOrEqualTo(50)));
+}
+```
+
+**Expected Response Structure:**
+```json
+[
+ {
+ "symbol": "BTCUSD",
+ "timestamp": "2026-06-01T10:30:00Z",
+ "open": 67500.00,
+ "high": 68000.00,
+ "low": 67200.00,
+ "close": 67800.00,
+ "volume": 1250.50
+ }
+]
+```
+
+**Pass Criteria:**
+- ✅ Status code: 200 OK
+- ✅ Response is an array of candles
+- ✅ Each candle has all required fields
+- ✅ Candles are in reverse chronological order
+- ✅ Limit parameter is respected
+
+---
+
+## User Endpoints Tests
+
+### Endpoint: `GET /api/users/{userId}`
+
+**Test Case 1: Get User Profile - Valid User**
+```java
+@Test
+@DisplayName("Should return user profile for valid userId")
+void testGetUserProfileValid() throws Exception {
+ mockMvc.perform(get("/api/users/SIM_USER_001"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.userId", is("SIM_USER_001")))
+ .andExpect(jsonPath("$.balance").exists())
+ .andExpect(jsonPath("$.totalTrades").exists())
+ .andExpect(jsonPath("$.joinDate").exists());
+}
+```
+
+**Test Case 2: Get User Profile - Invalid User**
+```java
+@Test
+@DisplayName("Should return 404 for non-existent userId")
+void testGetUserProfileNotFound() throws Exception {
+ mockMvc.perform(get("/api/users/INVALID_USER_999"))
+ .andExpect(status().isNotFound());
+}
+```
+
+**Expected Response (Success):**
+```json
+{
+ "userId": "SIM_USER_001",
+ "balance": 100000.00,
+ "totalTrades": 156,
+ "joinDate": "2026-04-10T00:00:00Z",
+ "portfolioValue": 125000.00
+}
+```
+
+**Pass Criteria:**
+- ✅ Status code: 200 OK for valid user
+- ✅ Status code: 404 NOT FOUND for invalid user
+- ✅ Response contains all required user fields
+- ✅ Balance is a positive number
+
+---
+
+### Endpoint: `GET /api/users/{userId}/trades`
+
+**Test Case 3: Get User Trades - Default Limit**
+```java
+@Test
+@DisplayName("Should return user trades with default limit of 50")
+void testGetUserTradesDefaultLimit() throws Exception {
+ mockMvc.perform(get("/api/users/SIM_USER_001/trades"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", instanceOf(List.class)))
+ .andExpect(jsonPath("$.length()", lessThanOrEqualTo(50)))
+ .andExpect(jsonPath("$[0].symbol").exists())
+ .andExpect(jsonPath("$[0].price").exists())
+ .andExpect(jsonPath("$[0].quantity").exists())
+ .andExpect(jsonPath("$[0].timestamp").exists());
+}
+```
+
+**Test Case 4: Get User Trades - Custom Limit**
+```java
+@Test
+@DisplayName("Should return user trades with custom limit")
+void testGetUserTradesCustomLimit() throws Exception {
+ mockMvc.perform(get("/api/users/SIM_USER_001/trades")
+ .param("limit", "100"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.length()", lessThanOrEqualTo(100)));
+}
+```
+
+**Test Case 5: Get User Trades - Most Recent First**
+```java
+@Test
+@DisplayName("Should return trades sorted by timestamp (most recent first)")
+void testGetUserTradesOrdering() throws Exception {
+ MvcResult result = mockMvc.perform(get("/api/users/SIM_USER_001/trades"))
+ .andExpect(status().isOk())
+ .andReturn();
+
+ // Verify trades are sorted newest to oldest
+ String jsonResponse = result.getResponse().getContentAsString();
+ List