▸ Developer Hub · steadywrk.dev
Build on SteadyWrk.
API, MCP tools, and SDKs for AI field-service dispatch. The same three primitives — quote, order, evals — callable from a web app, a script, Claude Desktop, or any MCP client.
OpenAPI 3.1 spec. TypeScript + Python clients coming soon. Sub-2hr quote turnaround, 90% completion rate. Machine-readable evals are a first-class citizen at every integration layer.
- Quote turnaround
- <2hr target
- Completion rate
- 90%
- Dispatch latency p50
- 340ms
- Human override rate
- 3%
▸ Integration surfaces
Three integration surfaces.
Same dispatch engine underneath. Pick the surface that fits your stack.
OpenAPI 3.1
Full OpenAPI 3.1 spec. The public dispatch surface — evals, trade index, quote, and order — is documented, versioned, and testable from the spec playground. JSON over HTTPS, x-api-key auth on writes.
- —/api/dispatch/v1/quote — matched contractor + cost estimate
- —/api/dispatch/v1/order — create + track work orders
- —/api/dispatch/analytics/evals — rolling eval metrics
POST /api/dispatch/v1/quote HTTP/1.1
Host: steadywrk.app
x-api-key: swrk_live_...
Content-Type: application/json
{
"trade": "hvac",
"location": { "state": "CO", "zip": "80302" },
"urgency": "routine",
"nte_cents": 85000
}Model Context Protocol
Four dispatch primitives as native MCP tools. Point Claude Desktop, Cursor, or any MCP client at the live Streamable-HTTP endpoint and your agent can quote, order, and read evals in one tool call.
- —dispatch.quote — matched contractor + cost estimate + ETA tier
- —dispatch.order — create work order, get SW-{id} handle
- —dispatch.evals — rolling 30d operational metrics
- —dispatch.index — trade-rate catalog (public, no key)
// claude_desktop_config.json
{
"mcpServers": {
"steadywrk-dispatch": {
"type": "http",
"url": "https://steadywrk.app/api/mcp"
}
}
}TypeScript + Python
Typed TypeScript and Python clients generated from the OpenAPI spec are coming soon — not yet published to npm or PyPI. Until then, generate a client from the spec or call the REST surface directly.
- —Not yet on npm or PyPI — request access: [email protected]
- —OpenAPI 3.1 spec available now at /openapi.yaml
- —TypeScript + Python clients planned
# SDKs are not yet published.
# Request early access:
# [email protected]
#
# Available today:
# OpenAPI 3.1 spec → /openapi.yaml
# (generate a typed client in any language)
# MCP endpoint → /api/mcp▸ MCP reference
MCP tool reference.
Each tool follows the MCP JSON-Schema spec. dispatch.evals and dispatch.index are public read-only — no key required.
| Tool | Args | Returns | Auth |
|---|---|---|---|
| dispatch.quote | { trade, location{ state, city?, zip? }, urgency?, nte_cents? } | Matched contractor · estimated cost (cents) · ETA tier · quote validity | x-api-key |
| dispatch.order | { trade, location{ state, … }, description, urgency?, nte_cents?, reference_id? } | Order ID · masked contractor reference · status URL | x-api-key |
| dispatch.evals | { period?: "rolling_30d" } | Goal fulfillment · ops metrics · trust signals | Public |
| dispatch.index | {} | 8 trade verticals · baseline model rates (BLS-informed) | Public |
▸ Quickstart
Full dispatch flow.
Quote, confirm, dispatch — three round-trips, over MCP JSON-RPC or REST. Typed SDKs that wrap this flow are coming soon.
// 1. Get a quote — tools/call dispatch.quote
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dispatch.quote",
"arguments": {
"trade": "plumbing",
"location": { "state": "AZ", "zip": "85001" },
"urgency": "routine",
"nte_cents": 120000
}
}
}
// → matched contractor, estimated cost, ETA tier
// 2. Create the work order — tools/call dispatch.order
// { trade, location, description, reference_id? }
// → order id, masked contractor ref, status URL
// 3. Read live evals — tools/call dispatch.evals
// { "period": "rolling_30d" } — public, no key
// TypeScript + Python SDKs wrapping this flow:
// coming soon — request access at [email protected]# 1. Quote
curl -X POST https://steadywrk.app/api/dispatch/v1/quote \
-H "x-api-key: swrk_live_..." \
-H "Content-Type: application/json" \
-d '{
"trade": "plumbing",
"location": { "state": "AZ", "zip": "85001" },
"urgency": "routine",
"nte_cents": 120000
}'
# → matched contractor, estimated cost (cents),
# ETA tier, valid_for_minutes
# 2. Order
curl -X POST https://steadywrk.app/api/dispatch/v1/order \
-H "x-api-key: swrk_live_..." \
-H "Content-Type: application/json" \
-d '{
"trade": "plumbing",
"location": { "state": "AZ", "zip": "85001" },
"description": "Leaking supply line, suite 210"
}'▸ Authentication
API key, sent as a header.
All write operations require a live API key. dispatch.evals is public read-only. Keys are scoped per-account and revocable at any time.
Header format
x-api-key: swrk_live_<token>MCP endpoint (no client key — public tools open, keyed tools proxied server-side)
"steadywrk-dispatch": { "type": "http", "url": "https://steadywrk.app/api/mcp" }- —Keys are prefixed
swrk_live_in production,swrk_test_in sandbox. - —Rate limit: 100 req/min per key. Burst to 200 for 10s.
- —dispatch.evals accepts no key — public endpoint, no rate limit.
- —All decisions are logged. Append-only audit trail (7-year retention) queryable via API.
▸ For AI agents
A2A skill manifest.
The agent card at /.well-known/agent-card.json exposes four skills. dispatch.evals and dispatch.index are public read-only — no key, no auth.
dispatch.evalsPublicReturn the public operational evals for the rolling window: completion rate, NTE accuracy, dispatch latency (p50/p95), human-override rate. Self-reported, estimated from production telemetry.
{"skill":"dispatch.evals","input":{"period":"rolling_30d"}}dispatch.indexPublicReturn the catalog of 8 dispatch trade verticals with baseline model rates (routine urgency, 1.0× multiplier). Rates are STEADYWRK model rates informed by BLS OES data — not BLS verbatim.
{"skill":"dispatch.index","input":{}}dispatch.quotex-api-keyReturn an instant dispatch quote for a field-service job: accepts trade + location + urgency, returns matched contractor availability, estimated cost, ETA tier, and quote validity.
{"skill":"dispatch.quote","input":{"trade":"plumbing","location":{"state":"MO"},"urgency":"routine"}}dispatch.orderx-api-keyCreate a tracked dispatch work order. Auto-matches a contractor from the active pool and returns a masked contractor reference, order id, and status URL.
{"skill":"dispatch.order","input":{"trade":"electrical","location":{"state":"AZ"},"description":"breaker panel fault"}}▸ Live response preview
dispatch.evals returns canonical metrics from production telemetry. Numbers carry an estimated flag — see evals.estimated: true in the full response.
Get API access.
API keys are issued manually — talk to us and we’ll get you a live key and sandbox access within the day.