▸ 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. 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. Every route under /api/dispatch/* is documented, versioned, and testable from the spec playground. JSON over HTTPS, bearer token auth.
- —/api/dispatch/quote — NTE estimate + provider pool
- —/api/dispatch/work-orders — create + track work orders
- —/api/dispatch/contractors — contractor availability
- —/api/dispatch/analytics — rolling eval metrics
POST /api/dispatch/quote HTTP/1.1
Host: steadywrk.app
x-api-key: swrk_live_...
Content-Type: application/json
{
"trade": "hvac",
"locationZip": "80302",
"nteTarget": 850,
"urgencyTier": "standard"
}Model Context Protocol
Three dispatch primitives as native MCP tools. Drop the server config into Claude Desktop, Cursor, or any MCP client and your agent can quote, order, and read evals in one tool call.
- —dispatch.quote — NTE + provider pool size + ETA band
- —dispatch.order — create work order, get SW-{id} handle
- —dispatch.evals — rolling 30d operational metrics
// claude_desktop_config.json
{
"mcpServers": {
"steadywrk": {
"command": "npx",
"args": ["-y", "@steadywrk/mcp-dispatch"],
"env": { "STEADYWRK_KEY": "swrk_live_..." }
}
}
}TypeScript + Python
Generated from the OpenAPI spec. Typed request/response objects, auto-retry with exponential backoff, and first-class async/await ergonomics.
- —npm install @steadywrk/sdk
- —pip install steadywrk
- —TypeScript strict mode, full inference
- —Python 3.10+ async + sync clients
import { SteadyWrk } from '@steadywrk/sdk';
const sw = new SteadyWrk({ apiKey: process.env.STEADYWRK_KEY });
const quote = await sw.dispatch.quote({
trade: 'hvac',
locationZip: '80302',
nteTarget: 850,
});
console.log(quote.nte, quote.etaBand);▸ 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, locationZip, nteTarget?, urgencyTier? } | NTE estimate · provider pool size · ETA band | x-api-key |
| dispatch.order | { quoteId, accountRef, dispatchAt? } | Order ID · SW-{id} contractor handle · dispatch status | 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. The SDK handles retries and expiry checks automatically.
import { SteadyWrk } from '@steadywrk/sdk';
const sw = new SteadyWrk({
apiKey: process.env.STEADYWRK_KEY,
});
// 1. Get a quote
const quote = await sw.dispatch.quote({
trade: 'plumbing',
locationZip: '85001',
nteTarget: 1200,
urgencyTier: 'standard',
});
// → { quoteId, nte, providerPoolSize, etaBand }
// 2. Create the work order
const order = await sw.dispatch.order({
quoteId: quote.quoteId,
accountRef: 'acc_xyz',
});
// → { orderId, contractorHandle: 'SW-0041', status }
// 3. Read live evals
const evals = await sw.dispatch.evals();
// → { completionRate, nteVariance, quoteP50, ... }# 1. Quote
curl -X POST https://steadywrk.app/api/dispatch/quote \
-H "x-api-key: swrk_live_..." \
-H "Content-Type: application/json" \
-d '{
"trade": "plumbing",
"locationZip": "85001",
"nteTarget": 1200
}'
# Response
{
"quoteId": "qt_01J...",
"nte": 1150,
"providerPoolSize": 7,
"etaBand": "2-4hr",
"expiresAt": "2026-04-17T18:00:00Z"
}
# 2. Order
curl -X POST https://steadywrk.app/api/dispatch/work-orders \
-H "x-api-key: swrk_live_..." \
-d '{"quoteId":"qt_01J...","accountRef":"acc_xyz"}'▸ 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>SDK (TypeScript)
new SteadyWrk({ apiKey: process.env.STEADYWRK_KEY })SDK (Python)
SteadyWrk(api_key=os.environ["STEADYWRK_KEY"])MCP server (env)
"env": { "STEADYWRK_KEY": "swrk_live_..." }- —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. 7-year append-only audit trail 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.