Cloud Labs Tutorial
Litmus integrates with automated cloud laboratories for hands-off experiment execution. This tutorial covers submitting experiments to cloud labs like Enko Cloud Lab (ECL) and Strateos.
What Are Cloud Labs?
Cloud labs are automated facilities where robotic systems execute experiments. Benefits include:
- Consistency — Robotic precision reduces variability
- Speed — 24/7 operation with no scheduling delays
- Scalability — Run many experiments in parallel
- Documentation — Automatic logging of all steps
Supported Providers
| Provider | Protocol Format | Best For |
|---|---|---|
| Enko Cloud Lab (ECL) | SLL | Cell-based assays, qPCR |
| Strateos | Autoprotocol | High-throughput screening |
Checking Provider Capabilities
List Providers
curl https://api.litmus.science/cloud-labs/providers \
-H "Authorization: Bearer YOUR_TOKEN"Get Provider Details
curl https://api.litmus.science/cloud-labs/providers/ecl \
-H "Authorization: Bearer YOUR_TOKEN"Response:
{
"id": "ecl",
"name": "Enko Cloud Lab",
"supported_experiment_types": [
"CELL_VIABILITY_IC50",
"MIC_MBC_ASSAY",
"QPCR_EXPRESSION"
],
"capabilities": {
"cell_lines": ["HeLa", "HEK293", "A549"],
"plate_formats": ["96-well", "384-well"]
},
"turnaround_days": {"min": 3, "max": 7}
}The Translation Process
Cloud labs require experiments in specific protocol formats. Litmus handles translation automatically:
Your Experiment → Interpretation → Translation → Cloud Lab ProtocolStep 1: Validate Compatibility
Before translating, check if your experiment is compatible:
curl -X POST https://api.litmus.science/cloud-labs/validate \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"intake": {
"experiment_type": "MIC_MBC_ASSAY",
"mic_mbc_assay": {
"target_organisms": ["Escherichia coli"],
"test_compounds": [
{"name": "Compound X", "concentrations_ug_ml": [0.5, 1, 2, 4, 8, 16, 32]}
]
}
},
"provider_id": "ecl"
}'Response:
{
"valid": true,
"provider_id": "ecl",
"warnings": [],
"estimated_cost_usd": 250,
"estimated_turnaround_days": 5
}Step 2: Translate to Protocol
curl -X POST https://api.litmus.science/cloud-labs/translate \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"intake": {...},
"provider_id": "ecl"
}'Response (ECL/SLL format):
{
"provider_id": "ecl",
"protocol_format": "sll",
"protocol": {
"name": "MIC Assay - Compound X",
"steps": [
{"operation": "dispense", "source": "media", "destination": "plate", "volume": "100uL"},
{"operation": "serial_dilution", "compound": "Compound X", "factor": 2, "steps": 7},
{"operation": "inoculate", "organism": "E. coli", "density": "5e5 CFU/mL"},
{"operation": "incubate", "temperature": "37C", "duration": "18h"},
{"operation": "measure", "method": "absorbance_600nm"}
]
},
"estimated_cost_usd": 250
}Step 3: Submit Experiment
Submit your experiment to Litmus first:
curl -X POST https://api.litmus.science/experiments \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"experiment_type": "MIC_MBC_ASSAY",
"hypothesis": {
"statement": "Compound X inhibits E. coli growth"
},
"compliance": {"bsl": "BSL1"},
"mic_mbc_assay": {...}
}'Step 4: Trigger Cloud Lab Translation
curl -X POST https://api.litmus.science/cloud-labs/experiments/exp_abc123/translate \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"provider_id": "ecl"
}'This creates a CloudLabSubmission record tracking the execution.
Tracking Submissions
List Submissions
curl https://api.litmus.science/cloud-labs/submissions \
-H "Authorization: Bearer YOUR_TOKEN"Get Submission Status
curl https://api.litmus.science/cloud-labs/submissions/sub_abc123 \
-H "Authorization: Bearer YOUR_TOKEN"Submission Status Values
| Status | Description |
|---|---|
pending | Created, not yet sent |
submitted | Sent to cloud lab |
queued | Waiting in cloud lab queue |
running | Experiment in progress |
completed | Results available |
failed | Execution error |
cancelled | Cancelled by user |
Protocol Formats
SLL (Symbolic Lab Language)
Used by Enko Cloud Lab. Declarative steps:
{
"steps": [
{"operation": "dispense", "source": "reservoir", "destination": "plate", "volume": "100uL"},
{"operation": "incubate", "temperature": "37C", "duration": "24h"}
]
}Autoprotocol
Used by Strateos. JSON with refs and instructions:
{
"refs": {
"plate": {"new": "96-pcr", "store": {"where": "cold_4"}}
},
"instructions": [
{"op": "dispense", "object": "plate", "reagent": "media", "volume": "100:microliter"}
]
}Complete Workflow Example
import requests
API_URL = "https://api.litmus.science"
headers = {"Authorization": "Bearer YOUR_TOKEN"}
# 1. Define experiment
intake = {
"experiment_type": "MIC_MBC_ASSAY",
"hypothesis": {
"statement": "Compound X inhibits E. coli with MIC < 32 μg/mL"
},
"compliance": {"bsl": "BSL1"},
"mic_mbc_assay": {
"target_organisms": ["Escherichia coli"],
"test_compounds": [
{"name": "Compound X", "concentrations_ug_ml": [0.5, 1, 2, 4, 8, 16, 32]}
]
}
}
# 2. Validate for cloud lab
validation = requests.post(
f"{API_URL}/cloud-labs/validate",
json={"intake": intake, "provider_id": "ecl"},
headers=headers
).json()
if not validation["valid"]:
print("Validation errors:", validation["errors"])
exit(1)
print(f"Estimated cost: ${validation['estimated_cost_usd']}")
# 3. Submit experiment
experiment = requests.post(
f"{API_URL}/experiments",
json=intake,
headers=headers
).json()
exp_id = experiment["experiment_id"]
print(f"Created experiment: {exp_id}")
# 4. Translate for cloud lab
submission = requests.post(
f"{API_URL}/cloud-labs/experiments/{exp_id}/translate",
json={"provider_id": "ecl"},
headers=headers
).json()
print(f"Cloud lab submission: {submission['id']}")
print(f"Protocol format: {submission['protocol_format']}")Handling Validation Errors
When validation fails:
{
"valid": false,
"errors": [
{
"field": "mic_mbc_assay.target_organisms",
"message": "Organism 'Custom strain' not available at ECL"
}
]
}Common issues:
- Unsupported organism/cell line — Check provider capabilities
- Invalid concentrations — Must match available stock dilutions
- Missing required fields — Fill in all protocol parameters
Best Practices
- Validate first — Always validate before submitting
- Check costs — Cloud labs may cost more than manual execution
- Review translations — Verify the protocol matches your intent
- Monitor submissions — Track status for timely results
- Use webhooks — Get notified when experiments complete
Next Steps
- Edison Integration — Generate hypotheses automatically
- API Reference — Full endpoint documentation
- AI Integration Guide — Build automated pipelines