REST API — Users
Full CRUD for users, products, and orders. Data is session-scoped and auto-expires in 10 min.
GraphQL API
Full CRUD over users, products, and orders via GraphQL. Shares the same session store as REST and SOAP.
Endpoint
POST /graphql — send JSON { "query": "..." }
GraphiQL IDE
Interactive explorer at /graphiql — schema browser built in
SDL Schema
Full schema at /graphql/schema — equivalent of /docs/json
Cross-protocol
Records created via REST or SOAP appear instantly in GraphQL queries
Schema Reference
users(page, limit, sort, order) → UserPageuser(id) → Userproducts(page, limit, sort, order) → ProductPageproduct(id) → Productorders(page, limit, sort, order) → OrderPageorder(id) → Order — includes user & product inlinesessionInfo → JSONcreateUser(input) / updateUser(id, input) / deleteUser(id)createProduct(input) / updateProduct(id, input) / deleteProduct(id)createOrder(input) / updateOrder(id, input) / deleteOrder(id)order { user { name } product { price } } — linked entities resolved automaticallypage, limit, sort, orderx-session-id header to share data with REST and SOAPSOAP API
Full CRUD over users, products, and orders via SOAP 1.1. 14 operations with a complete WSDL.
WSDL
Service definition at /soap?wsdl — import into SoapUI or Postman
Endpoint
POST /soap · Content-Type: text/xml · SOAPAction header required
Errors
Errors return <soap:Fault> · <faultcode> + <faultstring>
Authentication
Three auth methods supported. Configure in the sidebar, or try each one below.
Learning Scenarios
Guided step-by-step exercises from beginner to advanced. Each scenario explains the why, not just the how.
Error & Delay Simulation
Add query params to any REST endpoint to test client-side error handling and resilience.
⏱ Artificial Delay
Simulate network latency or slow backends. Max 10,000 ms.
💥 Force HTTP Error
Force any HTTP error code. Useful for testing your UI error states.
🎲 Random Failure
~30% of requests will randomly fail. Build retry logic and test resilience.
Click multiple times — about 1 in 3 will fail.
🔗 Chain Params
Combine simulation params on any endpoint.
This document defines the functional requirements and use cases for the ShiftLeft Store API — a multi-protocol online store simulation built for API testing training and tool demonstrations. The store exposes customer registration, product catalogue management, and order processing across three API protocols (REST, GraphQL, SOAP) simultaneously, all sharing one session-scoped data store.
The system is intentionally stateless between sessions. All data auto-expires after 10 minutes of inactivity. This makes it safe to use in live demonstrations: every attendee or trainee gets a clean, isolated environment without database setup.
x-session-id response header on every call. Include it in subsequent requests to keep your data. Data created by one participant cannot be seen by another.- Register an account
- Browse the product catalogue
- View a specific product
- Place an order
- View order confirmation with details
- Add products to the catalogue
- Update product details and stock
- View and filter all orders
- Accept and process orders
- Mark orders complete or cancelled
- Test REST, GraphQL, and SOAP
- Verify cross-protocol data consistency
- Test auth: JWT, API Key, OAuth2
- Simulate errors, delays, random failures
- Run automated end-to-end scenarios
Detailed use cases showing pre-conditions, step-by-step flows, alternative paths, and expected outcomes for each key interaction.
- 1Customer sends POST /api/v1/users with name and email. System returns a customer object including a unique
id. - 2Customer sends GET /api/v1/products?sort=price&order=asc. System returns the full product list sorted cheapest first. Customer notes the
idof the chosen product. - 3Customer sends POST /api/v1/orders with user_id (from step 1) and product_id (from step 2). System creates the order with status "pending" and returns the order object.
- 4Customer sends GET /api/v1/orders/{id}?expand=user,product. System returns the order with the full customer profile and product details merged inline.
- 1Manager sends GET /api/v1/orders?status=pending&sort=created_at&order=asc. System returns the oldest unprocessed orders first.
- 2Manager picks an order and sends GET /api/v1/orders/{id}?expand=user,product to see the full customer and product details.
- 3Manager sends PATCH /api/v1/orders/{id} with { "status": "processing" }. System updates the order and returns it with updated_at set.
- 4After goods are dispatched, manager sends PATCH /api/v1/orders/{id} with { "status": "completed" }. System records the final state.
- 1User sends POST /auth/token with { "username": "alice@demo.com", "password": "alice123" }. System returns access_token (JWT).
- 2User copies the access_token and sends GET /auth/me with header: Authorization: Bearer <token>. System returns identity: { sub, role }.
- 3Optional: user sends POST /auth/verify with { "token": "<token>" }. System confirms validity and returns the full JWT claims including expiry.
- 1Tester sends POST /api/v1/users (REST). Notes the returned user
id. - 2Tester opens /graphql and runs: query { user(id: "<id>") { id name email } }. The same user appears — created by REST, read by GraphQL.
- 3Tester sends a SOAP CreateUser request (POST /soap, SOAPAction: CreateUser). The new user is returned.
- 4Tester runs GET /api/v1/users via REST. Both the REST-created and SOAP-created users appear in the list.
- 5Tester sends DELETE /api/v1/users/{id} via REST. Re-running the GraphQL query returns null — the deletion is reflected everywhere.
- 1GET /api/v1/users?error=500 — server returns 500 SERVER_ERROR. Tool should show an error state, not crash.
- 2GET /api/v1/users?error=404 — server returns 404 NOT_FOUND. Tool should handle "not found" gracefully.
- 3GET /api/v1/users?delay=5000 — server waits 5 seconds. Tool should show a loading indicator and not time out prematurely.
- 4POST /api/v1/users with missing "name" field — server returns 400 VALIDATION_ERROR with details array. Tool should surface the field-level error message.
- 5GET /api/v1/users?random_fail=true — call 10 times. ~3 should fail with 500. Tool should retry failed calls automatically.
All REST endpoints follow /api/v1/{entity} where entity is users, products, or orders. Session ID must be sent as x-session-id header to maintain your data across calls.
Every error response has the same JSON shape: { "success": false, "error": "CODE", "message": "..." }. Validation errors (400) additionally include a details array with one object per broken field: { "field": "email", "message": "Invalid email" }.
data key alongside success: true.id is safe to use in subsequent calls immediately.details array for field-by-field breakdown. Also returned when session is at the 500-object cap (error: LIMIT_EXCEEDED).A multi-protocol API simulator built for demo environments. It exposes identical business data (Users, Products, Orders) across REST, GraphQL, and SOAP simultaneously — all sharing one session-scoped in-memory store. Use it to demonstrate API testing concepts, tooling integrations, and protocol comparisons without any persistent database setup.
x-session-id response header. Data auto-expires after 10 minutes of inactivity. No data persists between sessions.| Protocol | Endpoint |
|---|---|
| REST CRUD | /api/v1/{entity} |
| GraphQL | /graphql |
| SOAP 1.1 | /soap |
| Auth | /auth/* |
| Flows | /api/v1/flows/* |
| Mechanism | Value |
|---|---|
| Response header | x-session-id |
| Cookie | sandbox_session |
| Request header | x-session-id: <id> |
| TTL | 10 min (sliding) |
| Max objects/session | 500 |
Append these query params to any REST endpoint to simulate real-world failure conditions:
| Parameter | Type | Description | Example |
|---|---|---|---|
| ?delay=N | integer (ms) | Artificial latency. Max 10,000 ms. | ?delay=2000 |
| ?error=N | HTTP status | Force a specific HTTP error code. | ?error=503 |
| ?random_fail=true | boolean | ~30% chance of 500 error. For retry testing. | ?random_fail=true |