---
title: "Real-World Services for LangGraph — ROJI Integration | roji.ai"
description: "Your LangGraph interrupt() fires — then what? Turn the interrupt into a ROJI order against a verified business's listing and resume the graph on the delivery webhook. Published price, published SLA, typed results."
doc_version: fdbef4dfda18
last_updated: 2026-09-10
---
# Real-World Services for LangGraph — ROJI Integration | roji.ai

Developers

LangGraph

Real-world services for LangGraph

interrupt() pauses your graph and waits for a human. LangGraph never says which one. ROJI is the answer to that question: a catalog of verified businesses your graph can order from and resume on.

Get started

## The problem

LangGraph's `interrupt()` / `Command(resume=...)` pattern is the right shape for human-in-the-loop — durable pause, resume with a value. But it routes to *your* humans: a Slack ping, an inbox, an ops queue. When the step needs a commissioned notary in Travis County, a photo of a roof in Phoenix, or a licensed reviewer, your team becomes the fulfillment layer.

## The pattern

Order a listed service inside the node, interrupt the graph, resume on the delivery webhook. Illustrative sketch — adapt to your checkpointer and webhook transport:

```python
# illustrative — not a published SDK
from langgraph.types import interrupt, Command
import roji  # thin client over the roji ordering surface

def notarize_filing(state):
    # the listing sets the price and the SLA; you accept the fee preview
    service = roji.services.get("svc_notary_travis_filing_v1")
    order = roji.orders.create(
        service_id=service.id,
        inputs={"packet_url": state["packet_url"],
                "jurisdiction": "US-TX-travis"},
        fee_preview_id=service.fee_preview.id,
    )
    # durable pause; graph state checkpointed
    result = interrupt({"roji_order_id": order.id})
    return {"filing_receipt": result["attestation"]}

# webhook handler: resume the graph when the business delivers
@app.post("/webhooks/roji")
def on_roji_event(event):
    if event["type"] == "order.delivered":
        graph.invoke(
            Command(resume=event["deliverable"]),
            config={"configurable": {"thread_id": event["metadata"]["thread_id"]}},
        )
```

Mid-order questions from the business arrive as `order.question_asked` webhook events too — answer them with `answer_question` from a lightweight handler without waking the whole graph, or let them escalate to your Principal automatically.

## What to expect while the graph sleeps

Turnaround depends on the [category](/categories), not the framework: minutes for verification calls and urgent field dispatch, hours for standard field work, days for document review and expert judgment. But your graph never sleeps on a guess — every listing publishes its SLA, and you see it before you order. Payment happens at order and ROJI never holds it; if the business rejects the order or misses its published SLA, the refund is automatic and full, so [every path terminates](/developers/ordering).

Start with the [developer overview](/developers), or go straight to the [MCP server](/developers/mcp) if your stack already speaks it.

Design partners

Get started

## Sitemap

- [Every public page, as markdown](/sitemap.md)
- [llms.txt](/llms.txt) · [AGENTS.md](/AGENTS.md) · [auth.md](/auth.md)
