ReṼoman is an API Orchestration Engine for the JVM — the middleware between an agent and your API-Graphs.
Describe a workflow of interdependent API calls as executable API metadata. ReṼoman executes that graph on the JVM — resolving data dependencies between calls, handling auth, polling, and type-safe payloads — and hands back a structured Rundown of everything that happened. That makes it a building block for Agentic API Orchestration, with JVM API test automation as one powerful application.
📖 Docs · Get started · Why ReṼoman? · Slack
|
ℹ️
|
NO licensed Postman SDKs are used inside this project. This is written ground up natively in JVM. ReṼoman comes from the API-first SaaS company, Salesforce. |
Hand the engine the executable API metadata you already author for manual testing. It runs the graph in order, threads each step’s output into the next, and returns a Rundown you assert on — right inside your JVM stack.
ReṼoman ▸ executing API-Graph ······································
01 GET /objects 200 88 ms ✓
02 POST /objects 200 142 ms ✓ → {id}
03 PATCH /objects/{id} 200 110 ms ✓ ← {id}
04 GET /objects/{id} 200 76 ms ✓ ← {id}
················································· 4 steps · 4 passed
› rundown.toJson(VERBOSE)
{ "stepReports": [ 4 — all passed ], "mutableEnv": {…}, "stats": {…} }
The four steps above are a real, passing run against a deterministic local http4k-backed handler over a loopback socket — POST creates an object, and later steps reuse its {id}. ReṼoman ships the public MockHttpServer; DeterministicMockApi is this repository’s application-specific example handler. The caller owns both, starts the server explicitly, and injects its URL into the run:
final var api = new DeterministicMockApi();
try (final var server = MockHttpServer.start(api)) {
final var rundown =
ReVoman.revUp( // (1)
Kick.configure()
.templatePath(PM_COLLECTION_PATH) // (2)
.environmentPath(PM_ENVIRONMENT_PATH) // (3)
.dynamicEnvironment("baseUrl", server.getBaseUrl()) // (4)
.nodeModulesPath("js")
.off());
assertThat(rundown.firstUnsuccessfulStepReport()).isNull(); // (5)
assertThat(rundown.stepReports).hasSize(4); // (6)
}-
revUpruns the graph, taking a configuration built withKick.configure() -
An exported Postman collection JSON — your executable API metadata
-
An exported Postman environment JSON
-
Overlay the fixture’s loopback URL
-
Assert the run had no failures
-
Assert on the structured Rundown
MockHttpServer listens only on an ephemeral IPv4 127.0.0.1 address. It records request
bodies in memory so tests can inspect server.requests() without calling a real HTTP service.
Handlers may run concurrently, so mutable handler state must be thread-safe.
Newman and the Postman CLI overlap with ReṼoman only at "execute a collection." A runner emits a pass/fail report; ReṼoman is middleware that executes an API-Graph and returns structured context your JVM code — or an agent — builds on.
-
JVM-native. Runs inside your JVM stack — coverage, assertions, and all. Newman/Postman CLI run on Node and can’t.
-
Type-safe. Its Moshi bridge hands responses back as POJOs you assert on directly, not raw JSON.
-
Richer execution model. Dynamic pre/post-step hooks plug custom JVM code between steps; polling, execution control, and a mutable environment are first-class.
-
A Rundown, not a report. The Rundown is far richer than a newman report — it is the structured Context Information an agentic orchestration loop reasons over.
Minimum Java version required = 25 (0.90.x is the last line that runs on JDK 21)
Maven
<dependency>
<groupId>com.salesforce.revoman</groupId>
<artifactId>revoman</artifactId>
<version>0.90.0</version>
</dependency>Gradle Kotlin
implementation("com.salesforce.revoman:revoman:0.90.0")Bazel
"com.salesforce.revoman:revoman"Full docs: sfdc.co/revoman-docs
Each topic links to its published page. The source for every page lives in docs/modules/ROOT/pages/<page-name>.adoc (one concept per file) — e.g. the Hooks page below is docs/modules/ROOT/pages/hooks.adoc.
If ReṼoman saved you from writing yet another bespoke API-automation framework, a star helps other JVM teams find it — and tells us to keep investing in the open.
-
The CONTRIBUTING doc has everything to set up this library locally and get hands-on.
-
Any issues or PRs are welcome!
♥️ -
Join the Slack Community to discuss issues or PRs.