Keys stay narrow.
Seven explicit scopes, per-key expiry, rotation, immediate revocation, and SHA-256 digests at rest.
API v1 · Stable contract
Build ERP, accounting, notification, and future mobile workflows on scoped credentials, predictable errors, and signed events.
Seven explicit scopes, per-key expiry, rotation, immediate revocation, and SHA-256 digests at rest.
Every error has a stable code, human message, request ID, and bounded validation details.
HMAC-SHA256 signatures, delivery IDs, timestamps, exponential backoff, and a dead-letter trail.
Quickstart
An Admin opens Developer in Revolution Road, names the integration, chooses only its required scopes, and copies the one-time secret.
Call your Revolution Road host over HTTPS. Never put the key in a query string, browser bundle, spreadsheet, or repository.
Persist the response request ID in connector logs and honor rate-limit headers before retrying.
assets:readcurl "https://your-forge-host.example.com/api/v1/assets?status=active" \
--header "Authorization: Bearer $FORGE_API_KEY" \
--header "Accept: application/json"Reference
/api/v1/assetsassets:readSearch and list organization assets
/api/v1/assetsassets:writeCreate an asset
/api/v1/assets/{id}assets:writeUpdate one asset
/api/v1/work-orderswork_orders:readList work orders
/api/v1/work-orderswork_orders:writeCreate a work order
/api/v1/work-orders/{id}work_orders:writeUpdate or advance work
/api/v1/exports/assets.csvexports:readERP-ready asset CSV
/api/v1/exports/work-orders.csvexports:readAccounting and work CSV
/api/v1/imports/assetsimports:writeValidate and upsert asset CSV
/api/v1/webhookswebhooks:manageList signed event subscriptions
/api/v1/webhookswebhooks:manageCreate a signed subscription
The /api/v1 contract remains stable within version 1. Additive fields may appear; clients should ignore fields they do not use.
Outbound events
Revolution Road signs the exact body as HMAC_SHA256(secret, timestamp + "." + body). Reject stale timestamps and compare signatures without timing leaks.
HMAC-SHA256import { createHmac, timingSafeEqual } from "node:crypto";
const timestamp = request.headers.get("x-forge-timestamp");
const received = request.headers.get("x-forge-signature").slice(3);
const expected = createHmac("sha256", process.env.FORGE_WEBHOOK_SECRET)
.update(timestamp + "." + rawBody).digest("hex");
if (!timingSafeEqual(Buffer.from(received), Buffer.from(expected))) {
throw new Error("Invalid Revolution Road signature");
}x-forge-eventEvent type, such as cmms.status.changedx-forge-deliveryStable event ID for deduplicationx-forge-timestampUnix seconds included in the signaturex-forge-signaturev1-prefixed SHA-256 HMACERP + accounting
Exports cap at 10,000 rows and neutralize spreadsheet-formula prefixes. Asset imports accept up to 1,000 rows or 2 MB, validate every row first, and upsert by asset_tag.
text/csvasset_tag,name,status,location,metadata
PMP-104,Boiler feed pump,active,Boiler room,"{""erp_id"":""EQ-9081""}"
AHU-12,North air handler,active,Roof,"{}"Enterprise bridge
Issuer, domain hint, and connection state are organization-scoped and disabled until an identity provider is connected.
Per-organization metadata URLs are stored without exposing provider credentials to the browser.
Token digests and lifecycle fields are prepared for enterprise provisioning endpoints in a controlled rollout.
Need a connector?