Acceptance Criteria and Submission
You have a hypothesis and a protocol. Before submitting, you need to define what success looks like and set your constraints.
Why Acceptance Criteria Matter
Acceptance criteria are your pre-registered definition of success. They:
- Prevent moving goalposts after seeing data
- Make disputes objective (did results meet criteria or not?)
- Force you to think through what you actually need
- Enable automated validation by AI pipelines
Define these before the experiment runs.
Defining Success Conditions
Each success condition has three parts:
- Metric: What you're measuring
- Operator: How to compare (greater than, less than, between, etc.)
- Threshold: The value that constitutes success
Example: Enzyme Inhibition
{
"acceptance_criteria": {
"success_conditions": [
{
"metric": "IC50",
"operator": "lte",
"threshold": 10,
"unit": "μM",
"description": "Compound must inhibit enzyme with IC50 ≤ 10μM"
},
{
"metric": "Maximum inhibition",
"operator": "gte",
"threshold": 80,
"unit": "%",
"description": "Must achieve at least 80% inhibition at highest concentration"
}
]
}
}Available Operators
| Operator | Meaning | Use Case |
|---|---|---|
gt | Greater than | "Effect must be >X" |
gte | Greater than or equal | "Effect must be ≥X" |
lt | Less than | "IC50 must be <X" |
lte | Less than or equal | "MIC must be ≤X" |
eq | Equal to | Rarely used (too strict) |
neq | Not equal to | "Must differ from control" |
between | Within range | "pH must be 6.5-7.5" |
not_between | Outside range | "Must not be in toxic range" |
Using Ranges
For between and not_between, use an object threshold:
{
"metric": "Cell viability",
"operator": "between",
"threshold": { "min": 80, "max": 120 },
"unit": "% of control",
"description": "Compound must not be cytotoxic (viability 80-120% of control)"
}Defining Failure Conditions
Failure conditions describe results that would definitively reject your hypothesis:
{
"failure_conditions": [
{
"condition": "No inhibition observed at any concentration up to 1mM",
"interpretation": "Compound is inactive against this target"
},
{
"condition": "IC50 > 100μM",
"interpretation": "Compound has weak activity, not suitable for development"
}
]
}Statistical Requirements
For quantitative experiments, specify your statistical standards:
{
"statistical_requirements": {
"significance_level": 0.05,
"statistical_test": "t_test",
"power": 0.8
}
}| Test | Use When |
|---|---|
t_test | Comparing two groups, continuous data, normal distribution |
anova | Comparing 3+ groups |
mann_whitney | Comparing two groups, non-normal data |
chi_square | Categorical outcomes |
fisher_exact | Categorical outcomes, small sample sizes |
Setting Constraints
Budget
{
"constraints": {
"budget_max_usd": 500,
"budget_flexibility": "flexible_25"
}
}Flexibility options:
strict: Hard cap, no exceptionsflexible_10: Can go up to 10% over if neededflexible_25: Can go up to 25% overflexible_50: Can go up to 50% over
Turnaround
{
"turnaround_days": 14,
"turnaround_priority": "standard"
}Priority levels:
standard: Normal queue, best pricingexpedited: Faster matching, ~20% premiumurgent: Top priority, ~50% premium
Privacy
{
"privacy": "open"
}| Option | Description | Premium |
|---|---|---|
open | Results public immediately | None |
delayed_6mo | Private for 6 months, then public | ~10% |
delayed_12mo | Private for 12 months, then public | ~15% |
private | Permanently private | ~25-50% |
Open science is the default. You retain IP on your hypothesis regardless of privacy setting.
Submitting via API
Validate First (Recommended)
curl -X POST https://api.litmus.science/validate \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d @experiment.jsonResponse:
{
"valid": true,
"errors": [],
"warnings": [
{
"path": "protocol.replicates.biological_replicates",
"code": "low_replicates",
"message": "2 biological replicates may not provide sufficient statistical power"
}
],
"safety_flags": []
}Get Cost Estimate
curl -X POST https://api.litmus.science/estimate \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d @experiment.jsonSubmit
curl -X POST https://api.litmus.science/experiments \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d @experiment.jsonResponse:
{
"experiment_id": "exp_7a8b9c0d-1234-5678-9abc-def012345678",
"status": "open",
"created_at": "2026-01-15T10:30:00Z",
"estimated_cost_usd": 250,
"estimated_turnaround_days": 14
}What Happens Next
- Open: Your experiment is visible to qualified operators
- Claimed: An operator accepts the job (you're notified)
- In Progress: Operator executes the protocol
- Results Submitted: You review results against acceptance criteria
- Approved/Disputed: You approve (payment released) or dispute
After Results: Approval or Dispute
Approving Results
If results meet your acceptance criteria:
curl -X POST https://api.litmus.science/experiments/exp_xxx/approve \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"rating": 5, "feedback": "Excellent documentation, clear results."}'Disputing Results
If results don't meet criteria or there are quality issues:
curl -X POST https://api.litmus.science/experiments/exp_xxx/dispute \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"reason": "results_incomplete",
"description": "Protocol specified 3 biological replicates but only 2 were performed."
}'Disputes are resolved by Litmus based on whether delivered work meets the stated acceptance criteria.
Tips for Successful Experiments
-
Start small: First experiment? Keep it simple. One variable, standard template, low budget.
-
Be specific in acceptance criteria: Vague criteria lead to disputes. "Must show activity" is bad. "IC50 ≤ 10μM" is good.
-
Budget realistically: Use the estimate endpoint. Lowballing your budget reduces operator interest.
-
Provide quality materials: If you're shipping compounds, ensure purity and proper storage.
-
Communicate: If an operator has questions, respond promptly.
-
Review results carefully: Check that the protocol was followed, not just the final numbers.
Quick Reference: Submission Checklist
- Hypothesis complete (statement, null hypothesis, variables)
- Protocol selected (template, custom, or design requested)
- Materials list complete
- Acceptance criteria defined (success conditions with thresholds)
- Failure conditions stated
- Budget set (with flexibility level)
- Turnaround specified
- BSL level appropriate
- Privacy setting selected
- Validated via /validate endpoint
- Cost estimate reviewed