Skip to main content
Conditional routing lets workflows make decisions based on document quality or extracted data. The most common use case: automatically re-parse low-quality documents with OCR while using fast parsing for clean documents.

Prerequisites

Overview

A conditional step evaluates conditions and routes the workflow to different paths:
  • High-quality document (score ≥ 4.0) → Proceed directly to extraction
  • Low-quality document (score < 4.0) → Re-parse with force_ocr, then extract
This saves processing time and cost by only applying expensive OCR when needed.

Quality-Based Re-parsing Example

This workflow checks parse quality and automatically applies OCR for low-quality documents:
curl -X POST https://www.datalab.to/api/v1/workflows/workflows \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Parse with Quality-Based Fallback",
    "steps": [
      {
        "step_key": "marker_parse",
        "unique_name": "parse",
        "settings": {}
      },
      {
        "step_key": "await_parse_quality",
        "unique_name": "check_quality",
        "settings": {
          "max_wait_seconds": 120,
          "poll_interval_seconds": 10
        },
        "depends_on": ["parse"]
      },
      {
        "step_key": "conditional",
        "unique_name": "quality_gate",
        "settings": {
          "conditions": [
            {
              "left": "{{check_quality.parse_quality_score}}",
              "operator": ">=",
              "right": 4.0
            }
          ],
          "routes": {
            "true": {
              "enable_steps": ["extract"]
            },
            "false": {
              "enable_steps": ["high_accuracy_reparse", "extract_after_reparse"]
            }
          }
        },
        "depends_on": ["check_quality"]
      },
      {
        "step_key": "marker_extract",
        "unique_name": "extract",
        "settings": {
          "page_schema": {
            "title": {"type": "string"},
            "summary": {"type": "string"}
          }
        },
        "depends_on": ["quality_gate"]
      },
      {
        "step_key": "marker_parse",
        "unique_name": "high_accuracy_reparse",
        "settings": {
          "max_pages": 10,
          "config": {
            "force_ocr": true
          }
        },
        "depends_on": ["quality_gate"]
      },
      {
        "step_key": "marker_extract",
        "unique_name": "extract_after_reparse",
        "settings": {
          "page_schema": {
            "title": {"type": "string"},
            "summary": {"type": "string"}
          }
        },
        "depends_on": ["high_accuracy_reparse"]
      }
    ]
  }'
Execute the workflow:
curl -X POST https://www.datalab.to/api/v1/workflows/workflows/{workflow_id}/execute \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input_config": {
      "file_urls": [
          "https://www.wmaccess.com/downloads/sample-invoice.pdf"
      ]
    }
  }'

Understanding the Workflow

Step Breakdown

  1. parse (marker_parse): Parse document with standard settings
  2. check_quality (await_parse_quality): Wait for quality score (0-5 scale)
  3. quality_gate (conditional): Evaluate quality and route
    • If score ≥ 4.0 → enable extract
    • If score < 4.0 → enable high_accuracy_reparse + extract_after_reparse
  4. extract OR high_accuracy_reparseextract_after_reparse

Key Components

await_parse_quality step:
{
  "step_key": "await_parse_quality",
  "settings": {
    "max_wait_seconds": 120,        // Wait up to 2 minutes
    "poll_interval_seconds": 10     // Check every 10 seconds
  }
}
Waits for Marker’s quality scoring to complete. Outputs parse_quality_score (0-5). conditional step:
{
  "step_key": "conditional",
  "settings": {
    "conditions": [
      {
        "left": "{{check_quality.parse_quality_score}}",  // Reference previous step output
        "operator": ">=",                                 // Comparison operator
        "right": 4.0                                      // Threshold value
      }
    ],
    "logic": "AND",                                       // How to combine multiple conditions
    "routes": {
      "true": {"enable_steps": ["extract"]},              // If condition passes
      "false": {"enable_steps": ["reparse", "extract2"]}  // If condition fails
    }
  }
}

Condition Syntax

Referencing Previous Steps

Use {{step_name.field}} to reference step outputs:
{
  "left": "{{check_quality.parse_quality_score}}"  // Get quality score
}

Operators

OperatorDescriptionExample
>=Greater than or equalscore >= 4.0
<=Less than or equalscore <= 2.0
>Greater thanamount > 1000
<Less thanpages < 10
=Equal tostatus = "complete"
!=Not equal tovendor != "Unknown"

Multiple Conditions

Combine conditions with AND or OR logic:
{
  "conditions": [
    {
      "left": "{{check_quality.parse_quality_score}}",
      "operator": ">=",
      "right": 4.0
    },
    {
      "left": "{{check_quality.quality_metadata.ocr_detected}}",
      "operator": "=",
      "right": false
    }
  ],
  "logic": "AND",  // Both conditions must be true
  "routes": {
    "true": {"enable_steps": ["fast_extraction"]},
    "false": {"enable_steps": ["careful_extraction"]}
  }
}
AND: All conditions must pass OR: At least one condition must pass

Try it out

Sign up for Datalab and try out Marker - it’s free, and we’ll include credits. If you need a self-hosted solution, you can directly purchase an on-prem license, no crazy sales process needed, or reach out for custom enterprise quotes / contracts. As always, write to us at support@datalab.to if you want credits or have any specific questions / requests!