---
title: "For Developers — Let Your Agents Buy Real-World Services | roji.ai"
description: "ROJI is the commerce layer your AI agent orders through: search a catalog of verified businesses, read an itemized fee preview, order with structured inputs, pay at order, and consume a typed deliverable — all over MCP."
doc_version: 1971a20324d2
last_updated: 2026-09-10
---
# For Developers — Let Your Agents Buy Real-World Services | roji.ai

Give your agents a way to buy

Your agents run until they hit something only a person can do — a notarization, a site photo, a judgment call, a signature. ROJI is where your agent buys that: a catalog of verified businesses it can search, an itemized fee preview before any charge, a structured order, and a typed deliverable back — over MCP, without you in the loop.

Get started

## The wall every production agent hits

Every serious agent framework ships a `human_in_the_loop` escape hatch, because every deployed agent eventually needs one: a county filing that requires a commissioned notary, a photo that requires someone standing in front of the building, a judgment call your risk policy says a person must make, a phone call that has to come from a human. Today that interrupt pages a Slack channel and someone on your team becomes the fulfillment layer.

ROJI is the other side of the escape hatch: a catalog of verified businesses your code can search, order from, and pay — with a lifecycle it can operate.

## Search the catalog

Businesses publish machine-readable listings. Your agent filters them the way it would filter any inventory — by vertical, jurisdiction, price, and turnaround.

```text
search_services(
  vertical="field-verification",
  near="1200 Brazos St, Austin, TX 78701",
  max_price_cents=12000,
  max_turnaround_hours=24
)
→ svc_8sk2…  Exterior condition photo set, 12 slots   $85   ·  12h SLA  ·  Austin metro
  svc_ma41…  Occupancy check + observation form       $110  ·  24h SLA  ·  Travis County
```

`get_service` returns the listing in full — the input schema your agent must satisfy, the deliverable schema it will get back, the SLA, the refund window, and the **itemized fee preview**. Browse the [service directory](/categories) for what exists in each vertical and what it typically costs.

## Order in one call

An order is a listing plus parameterized inputs. The business wrote the offer; your agent fills it in. No prose job post, no price to invent, no negotiation.

```json
// order_service
{
  "service_id": "svc_8sk2",
  "inputs": {
    "address": "1200 Brazos St, Austin, TX 78701",
    "manifest_notes": "All four roof faces; gate code 4417",
    "freshness_window_hours": 24
  },
  "fee_preview_id": "fee_2h9x"
}
```

The call returns immediately with an order id and state. Nothing blocks on a human — your agent subscribes to webhooks (or polls, or negotiates the MCP long-running-call extension) and keeps working.

```text
order.placed → order.accepted → order.question_asked → order.delivered
             → order.completed
```

## When the business needs you, it's typed

Mid-order communication is structured, not a chat log your agent has to parse. A clarifying question arrives with an answer schema your code can satisfy programmatically:

```json
{
  "event": "order.question_asked",
  "question": "Second structure on the lot — include it?",
  "answer_schema": { "type": "enum", "options": ["include it", "main building only"] }
}
```

Your agent answers in one call. If it can't, the question escalates to the human who owns your account — and the business's SLA clock pauses while the answer is owed, so nobody is penalized for your latency. Full mechanics on the [order lifecycle page](/developers/ordering).

## Payments built for software buyers

- **Pay at order, never into escrow.** The charge clears when the order is placed and routes straight to the business as a Stripe destination charge, with ROJI's platform fee collected as the application fee. ROJI never holds the money — there is no hold to expire and no capture that can fail three days after your agent moved on.
- **Or pay over x402.** Order from an unfunded account and the API answers `402 Payment Required` with exact payment requirements — your agent pays in stablecoin and the order places on retry. No card form, no signup friction. Settlement runs through Stripe Machine Payments, so the business is always paid in dollars.
- **AP2 mandates.** An order carrying an AP2 mandate binds cryptographic proof of what your Principal authorized to the spend-policy decision on that order.
- **The fee preview comes first, and it's machine-readable.** Itemized list price, platform fee at your tier, and processing at cost — returned before any charge, and available as an API resource rather than something to read off a pricing page.
- **Spend controls are platform-enforced.** Per-order caps, rolling budgets, vertical allowlists, and approval thresholds set by the humans behind your agent — enforced by us, not by a prompt.

Full fee math on the [pricing page](/pricing).

What the platform does for your agent

A machine-readable catalog

Listings with declared input and deliverable schemas, prices, SLAs, and jurisdictions. Your agent searches real inventory instead of writing a brief and hoping.

Verified businesses

KYB-verified sellers, licenses checked against the issuing registry and bound to the jurisdictions a listing may cover, reviewed only on orders where money moved.

Typed communication

Questions with answer schemas, document requests, approval checkpoints, status updates. Every message is machine-operable.

Checks before delivery

Schema conformance, manifest completeness, geotags, file integrity — automatic and unwaivable, so structurally invalid work never reaches your agent.

Pay at order, refund-protected

Straight-through payment with an itemized preview first; automatic full refunds on rejection and SLA breach, a 7-day refund window, mediation as the backstop.

Bounded failure

Published SLAs, a refund window with a 72-hour response clock on the business, and a refund path that auto-approves on silence. Every path terminates.

Questions engineers actually ask

What if no business covers the jurisdiction I need?

You find out from search, immediately: a jurisdiction nobody covers returns no listings rather than an order that silently hangs. Jurisdiction is an eligibility rule on the listing itself, so a business can only publish work its verified license actually covers. We're seeding supply vertical by vertical and metro by metro, and coverage gaps are visible before you spend anything.

What happens when the work is bad?

Automated checks reject structurally invalid deliverables before they can be marked delivered. After that, protection is refund-shaped: your agent calls request_refund inside the listing's window with a reason, the business approves or contests within 72 hours (silence auto-approves), and a contested request goes to platform mediation decided from the order record. A missed SLA refunds in full automatically, with no request at all.

Why would my agent pay before the work is done?

The same reason it pays before an API call returns: the counterparty is verified, the terms are published, and the refund path is enforceable. You get KYB-verified businesses, registry-checked licenses, a published SLA with automatic refunds on breach, a refund window whose rail we control, and reviews bound to real transactions. What you don't get is an escrow — which is also what removes every stuck-funds failure mode from your integration.

Can I cap what my agent spends?

Yes, and it isn't advisory. Per-order ceilings, rolling-period budgets, vertical allowlists, and approval thresholds are enforced by the platform before an order places. An order over threshold parks until the human who owns the account approves it.

Do you support my framework?

If it speaks MCP, it speaks ROJI — one server covers Claude, the OpenAI Agents SDK, LangGraph, and most of the ecosystem, with a CLI for everything else. See the integration guides below.

Integration guides: [LangGraph](/integrations/langgraph) · [OpenAI Agents](/integrations/openai-agents) · [Anthropic tool use](/integrations/anthropic-tool-use) · [n8n](/integrations/n8n)

Get started

Get started

## Sitemap

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