Tutorials
Submission & Results

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:

  1. Metric: What you're measuring
  2. Operator: How to compare (greater than, less than, between, etc.)
  3. 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

OperatorMeaningUse Case
gtGreater than"Effect must be >X"
gteGreater than or equal"Effect must be ≥X"
ltLess than"IC50 must be <X"
lteLess than or equal"MIC must be ≤X"
eqEqual toRarely used (too strict)
neqNot equal to"Must differ from control"
betweenWithin range"pH must be 6.5-7.5"
not_betweenOutside 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
  }
}
TestUse When
t_testComparing two groups, continuous data, normal distribution
anovaComparing 3+ groups
mann_whitneyComparing two groups, non-normal data
chi_squareCategorical outcomes
fisher_exactCategorical outcomes, small sample sizes

Setting Constraints

Budget

{
  "constraints": {
    "budget_max_usd": 500,
    "budget_flexibility": "flexible_25"
  }
}

Flexibility options:

  • strict: Hard cap, no exceptions
  • flexible_10: Can go up to 10% over if needed
  • flexible_25: Can go up to 25% over
  • flexible_50: Can go up to 50% over

Turnaround

{
  "turnaround_days": 14,
  "turnaround_priority": "standard"
}

Priority levels:

  • standard: Normal queue, best pricing
  • expedited: Faster matching, ~20% premium
  • urgent: Top priority, ~50% premium

Privacy

{
  "privacy": "open"
}
OptionDescriptionPremium
openResults public immediatelyNone
delayed_6moPrivate for 6 months, then public~10%
delayed_12moPrivate for 12 months, then public~15%
privatePermanently 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.json

Response:

{
  "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.json

Submit

curl -X POST https://api.litmus.science/experiments \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d @experiment.json

Response:

{
  "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

  1. Open: Your experiment is visible to qualified operators
  2. Claimed: An operator accepts the job (you're notified)
  3. In Progress: Operator executes the protocol
  4. Results Submitted: You review results against acceptance criteria
  5. 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

  1. Start small: First experiment? Keep it simple. One variable, standard template, low budget.

  2. Be specific in acceptance criteria: Vague criteria lead to disputes. "Must show activity" is bad. "IC50 ≤ 10μM" is good.

  3. Budget realistically: Use the estimate endpoint. Lowballing your budget reduces operator interest.

  4. Provide quality materials: If you're shipping compounds, ensure purity and proper storage.

  5. Communicate: If an operator has questions, respond promptly.

  6. 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