Fake Bayeux Tapestry - Test Transport Dataset
Test Transport - Not for Production
This is a TEST TRANSPORT using a fake Bayeux Tapestry for validating the S-MA-C-H platform (v0.x) before the real v1.0.0 release in May/June 2026.
Purpose:
- Validate core functionalities of back, front, and StaRT mobile apps
- Test limited external user (courier) access
- Demonstrate transport workflow from Bayeux to London and back
Real Transport: Scheduled for May/June 2026 with v1.0.0 release, full role management, and production data.
For Mobile Developers
This page is optimized for StaRT mobile app development. Jump to Quick Start for authentication and testing workflows.
Overview
This test transport simulates a real-world scenario: the loan of a fake Bayeux Tapestry replica to the British Museum for system validation. This demo includes a complete round-trip transport from Bayeux, France to London, UK and back.
Test Transport Period: January 8-18, 2026
- First Leg: Bayeux → London (Jan 8, 2026 at 10:00 UTC)
- Second Leg: London → Bayeux (Jan 16, 2026 at 14:00 UTC)
- Duration: 32 hours per leg
- Artifact: Fake Bayeux Tapestry (replica for testing)
Validation Focus:
- ✅ Transport creation and management (Web UI)
- ✅ Operator workflows (StaRT mobile app)
- ✅ Courier read-only access (StaRT mobile app)
- ✅ IoT datalogger integration (Bluetooth connectivity)
- ✅ Multi-organization access control
- ✅ Real-time sensor monitoring
Quick Start for Mobile Developers
API Configuration
Configure StaRT mobile app with these endpoints:
const config = {
apiBaseUrl: 'https://api.smach.science',
keycloakUrl: 'https://id.smach.science/realms/smach',
keycloakClient: 'front-prod'
}Authentication Flow
Step 1: Get JWT Token
curl -X POST "https://id.smach.science/realms/smach/protocol/openid-connect/token" \
-d "client_id=front-prod" \
-d "username=admin@bayeuxmuseum.test" \
-d "password=PASSWORD" \
-d "grant_type=password"Step 2: Use Token in API Requests
curl -X GET "https://api.smach.science/transports" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Organization: bayeux"Mobile App Testing (StaRT)
Test Scenarios for Jay
Scenario 1: Administrator Transport Execution
User: admin@bayeuxmuseum.test (Administrator role)
- Login to StaRT app with administrator credentials
- View active transports (filter:
past=false) - Select "Fake Bayeux Tapestry - Test Transport" transport
- View transport details:
- Artwork: Fake Tapisserie de Bayeux (replica for testing, 68.58m × 0.50m, 350 kg)
- Crate: CRT001 (BAYEUX CRATE)
- Dataloggers: 3 units (DLG001, DLG002, DLG003)
- Execute Pre-Departure:
- Complete checklist tasks
- Connect to dataloggers via Bluetooth
- Push configuration to dataloggers
- Take installation photos
- Press "Ready to Start" → Creates destination with status
Pending
- Start Journey:
- Press START → Updates destination to
InTransit - Captures GPS location and timestamp
- Press START → Updates destination to
- Monitor During Journey:
- View real-time sensor data
- Receive alerts if thresholds exceeded
- Complete Journey:
- Press STOP → Destination status
Arrived - Take photos after STOP
- Press STOP → Destination status
Expected Behavior: Full transport execution capabilities, can start/stop destinations
Scenario 2: Super Admin Multi-Organization Access
User: super.admin@smach.science (Super Admin role)
- Login to StaRT app
- Organization Selection: Choose
bayeuxfrom organization list - View active transports for Bayeux
- Execute transport workflow (same as Administrator)
- Switch Organization: Change to
smach - Verify data isolation between organizations
Expected Behavior: Can access any organization, same transport permissions as Administrator
Scenario 3: Bluetooth IoT Connection
User: admin@bayeuxmuseum.test or super.admin@smach.science
- Open active transport in StaRT
- Navigate to IoT devices screen
- Scan for dataloggers:
- DLG001 (top right position: 3.23, 2.12)
- DLG002 (center position: 0.0, 0.0)
- DLG003 (bottom left position: -3.23, -2.12)
- Connect to each datalogger via Bluetooth
- Read sensor data:
- Accelerometer (vibration)
- Hygrometer (humidity %)
- Thermometer (temperature °C)
- Push configuration to dataloggers
- Sync alerts to backend API during journey
Expected Behavior: Successful Bluetooth pairing, real-time data streaming
Test Users & Authentication
All users authenticate via Keycloak OAuth2 JWT at: https://id.smach.science/realms/smach
Available Test Users
| Username | Role | Organizations | Mobile Use Case |
|---|---|---|---|
| super.admin@smach.science | super-admin | smach | Platform admin - StaRT execution (most likely) |
| admin@bayeuxmuseum.test | administrator | bayeux | Museum admin - plans transports (web UI) |
| viewer@bayeuxmuseum.test | viewer | bayeux | View-only access (web only) |
Passwords
Contact the S-MA-C-H admin team for test user passwords.
Primary Mobile Users
For StaRT mobile testing, focus on:
- super.admin@smach.science - Full transport execution capabilities (S-MA-C-H experts)
- admin@bayeuxmuseum.test - Full transport execution capabilities (museum staff)
User Capabilities by Role
Super Admin (super.admin@smach.science) - PRIMARY StaRT USER
Organizations: All (via X-Organization header)
Permissions:
- ✅ View all transports across all organizations
- ✅ Create and execute transports using StaRT mobile app
- ✅ Update transport status (
Draft→Ready→Pending→InTransit→Ready) - ✅ Complete destination tasks
- ✅ Connect to IoT dataloggers via Bluetooth
- ✅ Record sensor measurements
- ✅ Start/stop destinations (creates/completes destinations)
- ✅ Manage organizations and users
Mobile Workflow:
- Select organization to work with
- View transports for that organization
- Use StaRT to execute transport workflow
- Start destination when carrier takes charge
- Monitor IoT sensors during transit
- Stop destination upon arrival
- Perform expert analysis
API Example:
# Get transports for Bayeux organization
curl -X GET "https://api.smach.science/transports?past=false" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Organization: bayeux"
# Start destination
curl -X POST "https://api.smach.science/transports/{id}/events" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"type": "start", "date": "2026-01-08T14:00:00Z", "location": {...}}'Administrator (admin@bayeuxmuseum.test) - StaRT USER
Organizations: bayeux
Permissions:
- ✅ View own organization's transports
- ✅ Create and execute transports using StaRT mobile app (same as Super Admin)
- ✅ Update transport status
- ✅ Complete destination tasks
- ✅ Connect to IoT dataloggers via Bluetooth
- ✅ Start/stop destinations
- ✅ Manage inventory
- ❌ Cannot access other organizations
Mobile Workflow:
- Use StaRT to execute transport workflow for own organization
- Start destination when carrier takes charge
- Monitor IoT sensors during transit
- Stop destination upon arrival
- Perform analysis (own organization only)
API Example:
# Get own organization's transports (X-Organization auto-detected from JWT)
curl -X GET "https://api.smach.science/transports?past=false" \
-H "Authorization: Bearer $TOKEN"Viewer (viewer@bayeuxmuseum.test) - WEB ONLY (NO MOBILE)
Organizations: bayeux
Permissions:
- ✅ View own organization's transports (read-only)
- ✅ View transport details, destinations, alerts (read-only)
- ✅ View IoT sensor data (read-only)
- ❌ Cannot use StaRT mobile app
- ❌ Cannot modify anything
- ❌ No inventory access
Web Workflow:
- View transport list for own organization
- Monitor transport progress
- View alerts and notifications
- No data entry or modifications
API Example:
# View transports (read-only)
curl -X GET "https://api.smach.science/transports" \
-H "Authorization: Bearer $TOKEN"
# View transport details (read-only)
curl -X GET "https://api.smach.science/transports/{id}" \
-H "Authorization: Bearer $TOKEN"API Endpoints for Mobile App
Core Transport Endpoints
| Endpoint | Method | Description | Required Header | Mobile Priority |
|---|---|---|---|---|
/transports?past=false | GET | List active transports | X-Organization | ⭐⭐⭐ |
/transports/{id} | GET | Get transport details | Auto from context | ⭐⭐⭐ |
/transports/{id}/destinations | GET | Get transport destinations | Auto from context | ⭐⭐⭐ |
/transports/{id}/tasks/{taskId} | PATCH | Update task completion | Auto from context | ⭐⭐⭐ |
/transports/{id} | PATCH | Update transport state | Auto from context | ⭐⭐ |
/collections | GET | List collections | X-Organization | ⭐ |
/collections/{ref}/artworks/{ref} | GET | Get artwork details | X-Organization | ⭐⭐ |
/loggers | GET | List dataloggers | X-Organization | ⭐⭐⭐ |
/sensors | GET | List sensors | X-Organization | ⭐⭐⭐ |
/crates | GET | List crates | X-Organization | ⭐⭐ |
Organization Header
For multi-org users (like super.admin@smach.science), always include:
-H "X-Organization: bayeux"Transport State Transitions
Destination State Transitions
Transport Dataset Details
Transport: "Fake Bayeux Tapestry - Test Transport"
Basic Information:
- Name: Fake Bayeux Tapestry - Test Transport
- Type: Test/Demo Transport (v0.x validation)
- Artwork:
TAPISSERIE(from collectionB3) - Organization:
bayeux - State:
active - Crate:
CRT001(BAYEUX CRATE - Secured Container) - Duration: January 8-18, 2026 (10 days total)
Permissions:
- Editors:
admin@bayeuxmuseum.test - Operators:
admin@bayeuxmuseum.test - Viewers:
viewer@bayeuxmuseum.test
Destination 1: Bayeux → London (Way In)
{
"type": "wayIn",
"date": "2026-01-08T10:00:00Z",
"origin": {
"address": "13B Rue de Nesmond, 14400 Bayeux, France",
"coordinates": [49.274411, -0.7005935]
},
"destination": {
"address": "Great Russell St, London WC1B 3DG, UK",
"coordinates": [51.5194133, -0.1269566]
},
"weight": 1560,
"estimatedDuration": 32,
"courier": {
"company": "Artport",
"contact": "John Doe",
"phone": "+33123456789"
},
"vehicle": "Camion blindé (Armored truck)"
}Distance: ~450 km Expected Arrival: January 9, 2026 at 18:00 UTC (32 hours later)
Destination 2: London → Bayeux (Way Back)
{
"type": "wayBack",
"date": "2026-01-16T14:00:00Z",
"origin": {
"address": "Great Russell St, London WC1B 3DG, UK",
"coordinates": [51.5194133, -0.1269566]
},
"destination": {
"address": "13B Rue de Nesmond, 14400 Bayeux, France",
"coordinates": [49.274411, -0.7005935]
},
"weight": 1560,
"estimatedDuration": 32,
"courier": {
"company": "Transpart",
"contact": "Jane Doe",
"phone": "+33123456789"
},
"vehicle": "Camion blindé (Armored truck)"
}Expected Arrival: January 18, 2026 at 22:00 UTC (transport end)
IoT Equipment
Dataloggers (3 units)
| ID | Sensor | Position | Coordinates (x, y) | Bluetooth ID | Measurements |
|---|---|---|---|---|---|
| DLG001 | SEN0265 | Top Right | (3.23, 2.12) | BLE_DLG001 | Accelerometer, Hygrometry, Thermometer |
| DLG002 | SEN0385 | Center | (0.0, 0.0) | BLE_DLG002 | Accelerometer, Hygrometry, Thermometer |
| DLG003 | SEN0405 | Bottom Left | (-3.23, -2.12) | BLE_DLG003 | Accelerometer, Hygrometry, Thermometer |
Sensor Capabilities:
- Accelerometer: Vibration detection (G-force)
- Hygrometer: Relative humidity (%)
- Thermometer: Temperature (°C)
Bluetooth Connection
Dataloggers use BLE (Bluetooth Low Energy) for connectivity. Ensure StaRT app has Bluetooth permissions enabled.
Crate: CRT001 (BAYEUX CRATE)
{
"identity": "CRT001",
"name": "BAYEUX CRATE",
"type": "Isotherme (Insulated)",
"materials": ["Acier (Steel)", "Inox (Stainless steel)"],
"thermalRating": 4,
"vibrationProtection": {
"method": "Amortissement par mousse (Foam dampening)",
"rating": 3
},
"dimensions": {
"length": 1.00,
"width": 1.50,
"height": 0.80,
"unit": "meters"
},
"weight": 150,
"weightUnit": "kg"
}Artwork: Fake Tapisserie de Bayeux (Replica)
{
"reference": "TAPISSERIE",
"collection": "B3",
"name": "Fake Tapisserie de Bayeux (Replica)",
"description": "Test replica for S-MA-C-H platform validation",
"artist": "Test Artifact",
"creationPeriod": "2025 (Replica)",
"location": "13B Rue de Nesmond, 14400 Bayeux, France",
"dimensions": {
"length": 68.58,
"width": 0.50,
"height": 0.02,
"unit": "meters"
},
"weight": 350,
"weightUnit": "kg",
"isTestArtifact": true
}Test Artifact
This is a fake replica of the Bayeux Tapestry created for testing purposes only. The real Bayeux Tapestry is an 11th-century embroidered cloth depicting the Norman Conquest of England and remains at the Bayeux Museum. This replica is used to validate the S-MA-C-H transport monitoring system before the v1.0.0 production release.
Organizations
| Organization | Alias | Description |
|---|---|---|
| S-MA-C-H | smach | Platform administrator organization |
| Bayeux Museum | bayeux | Museum owning the Bayeux Tapestry |
Dataset Entities
Collection
- Reference:
B3 - Organization:
bayeux - Name: BAYEUX MUSEUM
- Description: Bayeux Museum collection including the famous tapestry
API Testing Workflows (Backend/Web Developers)
Workflow 1: Administrator Creates Transport
- Login as administrator
# Get JWT token from Keycloak
TOKEN=$(curl -X POST "https://id.smach.science/realms/smach/protocol/openid-connect/token" \
-d "client_id=front-prod" \
-d "username=admin@bayeuxmuseum.test" \
-d "password=PASSWORD" \
-d "grant_type=password" | jq -r '.access_token')- List collections
curl -X GET "https://api.smach.science/collections" \
-H "Authorization: Bearer $TOKEN"- View artwork details
curl -X GET "https://api.smach.science/collections/B3/artworks/TAPISSERIE" \
-H "Authorization: Bearer $TOKEN"- Create new transport
curl -X POST "https://api.smach.science/transports" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d @new-transport.jsonWorkflow 2: Administrator Executes Transport (StaRT Mobile)
- Login as administrator
TOKEN=$(curl -X POST "https://id.smach.science/realms/smach/protocol/openid-connect/token" \
-d "client_id=front-prod" \
-d "username=admin@bayeuxmuseum.test" \
-d "password=PASSWORD" \
-d "grant_type=password" | jq -r '.access_token')- Get assigned transports
curl -X GET "https://api.smach.science/transports?past=false" \
-H "Authorization: Bearer $TOKEN"- Send "Ready to Start" event (creates destination)
curl -X POST "https://api.smach.science/transports/{id}/events" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"type": "setup", "date": "2026-01-08T10:00:00Z", "location": {...}}'- Send START event (carrier takes charge)
curl -X POST "https://api.smach.science/transports/{id}/events" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"type": "start", "date": "2026-01-08T14:00:00Z", "location": {...}}'- Send STOP event (arrival)
curl -X POST "https://api.smach.science/transports/{id}/events" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"type": "stop", "date": "2026-01-09T18:00:00Z", "location": {...}}'Workflow 3: Viewer Views Transport (Read-Only)
- Login as viewer
TOKEN=$(curl -X POST "https://id.smach.science/realms/smach/protocol/openid-connect/token" \
-d "client_id=front-prod" \
-d "username=viewer@bayeuxmuseum.test" \
-d "password=PASSWORD" \
-d "grant_type=password" | jq -r '.access_token')- View assigned transports (read-only)
curl -X GET "https://api.smach.science/transports" \
-H "Authorization: Bearer $TOKEN"- View transport details (read-only)
curl -X GET "https://api.smach.science/transports/{id}" \
-H "Authorization: Bearer $TOKEN"Workflow 4: Super Admin Cross-Organization Access
- Login as super admin
TOKEN=$(curl -X POST "https://id.smach.science/realms/smach/protocol/openid-connect/token" \
-d "client_id=front-prod" \
-d "username=super.admin@smach.science" \
-d "password=PASSWORD" \
-d "grant_type=password" | jq -r '.access_token')- Access Bayeux data
curl -X GET "https://api.smach.science/collections" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Organization: bayeux"- Access smach organization data
curl -X GET "https://api.smach.science/transports" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Organization: smach"Swagger UI Testing
URL: https://api.smach.science/swagger-ui.html
- Click Authorize button
- Enter JWT token (from Keycloak login)
- Set X-Organization header as needed
- Try API endpoints interactively
Interactive API Exploration
Swagger UI is great for understanding API contracts and testing individual endpoints before implementing in StaRT.
Organization Header (X-Organization)
The X-Organization header determines which organization's data to access:
| User Type | Header Behavior |
|---|---|
| Super-admin | MUST specify header to access specific organization |
| Multi-org user | MUST specify which organization to work with |
| Single-org user | Optional - auto-detected from JWT if not provided |
Examples
Super admin accessing Bayeux:
curl -H "X-Organization: bayeux" -H "Authorization: Bearer $TOKEN" \
https://api.smach.science/collectionsOperator accessing smach org:
curl -H "X-Organization: smach" -H "Authorization: Bearer $TOKEN" \
https://api.smach.science/transportsAdministrator (auto-detected):
# X-Organization automatically set to "bayeux" from JWT
curl -H "Authorization: Bearer $TOKEN" \
https://api.smach.science/collectionsTroubleshooting
Issue: 401 Unauthorized
- Check JWT token is valid and not expired
- Verify token includes correct organization claims
- Ensure Keycloak realm and client are correct
Solution:
# Refresh token
TOKEN=$(curl -X POST "https://id.smach.science/realms/smach/protocol/openid-connect/token" \
-d "client_id=front-prod" \
-d "username=YOUR_USER" \
-d "password=YOUR_PASS" \
-d "grant_type=password" | jq -r '.access_token')Issue: 403 Forbidden
- User doesn't have permission for the operation
- Check user role (super-admin, administrator, viewer)
- Verify organization access in user profile
Example: Viewer cannot update transport status (read-only role)
Issue: 404 Not Found (Organization Context)
X-Organizationheader specifies wrong organization alias- User doesn't have access to the specified organization
- Data doesn't exist in that organization
Solution: Verify organization with:
# Check user's organizations
curl -X GET "https://api.smach.science/users/me" \
-H "Authorization: Bearer $TOKEN"Issue: Empty Response
- Organization filter is active but no data exists
- Try accessing as super-admin with different
X-Organizationvalues - Check if test data has been initialized
Issue: Bluetooth Connection Fails (StaRT Mobile)
- Ensure Bluetooth is enabled on device
- Check app has Bluetooth permissions granted
- Verify datalogger is powered on and in range
- Try scanning again or restarting Bluetooth
Issue: Organization Switcher Not Working (StaRT Mobile)
- Verify user has multi-org access (e.g.,
super.admin@smach.science) - Check JWT token includes all organization claims
- Ensure
X-Organizationheader is being sent with each request