Skip to content

Approved workflow runner Labs

Your agent hands over a task. You decide where it goes.

A lead, an order, a task or a sent quote goes from your AI agent into the system you already keep them in — your own endpoint, or the n8n, Make or Zapier flow you already use. You see the destination, the exact data and the cost before anything leaves, and afterwards you both read what really happened.

Registering needs an account: you sign in (or create one) and land on the Connecties page, where your systems are kept. Trying it below needs nothing.

1 · What your system receives

Type a record the way your agent would hand it over. Below it is the exact JSON that travels — checked by the same rules the runner uses. Using this preview sends nothing: what you type stays in your browser.

Fields

A value that is plainly a number travels as a number; 00412 keeps its leading zero and travels as text. A field named like a credential, or a value that looks like a key, is refused — a business record never needs one.

POST to the address you registered · 444 bytes · signed: x-jithox-signature: t=<unix seconds>,v1=<HMAC-SHA256> · the same x-jithox-idempotency-key on every attempt and every repeat

{
  "schema": "jithox.workflow-run/v1",
  "runReference": "wfr_EXAMPLE-fixed-when-your-agent-prepares-the-run_5f0c2a9b7d3e4c1a8b6d2f90",
  "action": "record.create",
  "test": false,
  "preparedAt": "2026-01-15T09:30:00.000Z",
  "data": {
    "schema": "jithox.record/v1",
    "recordType": "lead",
    "externalReference": "web-2026-0001",
    "fields": {
      "company": "Sample Company",
      "customerNumber": "00412",
      "email": "lead@example.com",
      "note": "Asked for a quote for 40 units."
    }
  },
  "report": null
}

2 · What your system's answer proves

A 200 proves only what the agreed contract says it proves. Choose how your system answers and read what Jithox would record — for you and for the agent.

Accepted — the other system confirmed it took the job

Your system said, in its answer, that it took the job.

Your system's own reference, kept with the run: CRM-10482

How a task goes

  1. 1. You register where things may go — the https address of your own system or of a flow in the automation tool you already use — which kinds of task it may receive, and how it answers. The signing secret is made for you and shown once.
  2. 2. Your agent sees which tasks you allow to which system (the label and the host, never the address), prepares one, and gets back the exact data and a fixed reference. It cannot name, add or change a destination.
  3. 3. You see the destination, the exact JSON, the expected action and the cost, and approve or reject. A changed request or a changed destination needs a new approval. Or you pre-approve one kind of task for one system, with a number per day, and withdraw that whenever you like.
  4. 4. Jithox sends it once, signed, with the fixed reference on every attempt — to the address you registered or nowhere. Redirects are never followed; private and intranet addresses are refused.
  5. 5. Both of you read the outcome. After a lost answer nothing is re-sent by itself; running it again sends the same reference, so a system that checks it acts once. We cannot make another company's system do that, and we say so.

Five outcomes, never mixed up

  • Offered — it arrived at the other system, which has not confirmed anything
  • Accepted — the other system confirmed it took the job
  • Completed — the other system reported the business action as done
  • Failed — the other system did not accept it, or nothing was sent
  • Unknown — no answer after the bounded attempts; it may or may not have run

What this is, and what it is not

It does

  • Two kinds of task in this version: create a record (a lead, customer, order, task or your own kind) and hand over a quote that really was sent.
  • Any https address on a public host, in any country: up to 5 systems per workspace, a record of up to 40 flat fields and 8,192 bytes.
  • Answer at once: a run is one short request with three bounded attempts. The agent gets the fixed reference back when it prepares, and reads the status with it at any time.
  • Refuse a field named like a credential or a value that looks like a key. A business record never needs one.

It does not

  • Send anything to an address an agent supplies. Only addresses a signed-in person registered are ever reached.
  • Read a 200 as "done". It records what your system's contract actually confirms.
  • Retry by itself after a lost answer, or promise that another company's system will act only once.
  • Apply tax, currency or language logic to your data. It travels as you approved it.
  • Claim a proven n8n, Make or Zapier integration. The whole journey runs in our tests against our own example receiver, and the n8n workflow we provide has only been checked in a sandbox. It has not yet been run against a real automation account — that is why this is Labs.

What it costs

Free while this is a Labs capability. No price has been set for a run; none is charged. The cost is shown to you with every approval request and to the agent with every prepared run, so a price — if one is ever set — is seen before a run, never after.

On your side: a receiver you can run

One short Node file, no packages: it checks the signature and the age of the request, acts once per reference, and answers in the JSON contract. In n8n, Make or Zapier the same three steps go into the flow behind your webhook; without a JSON answer, choose the "received only" contract and a run ends as offered.

// receiver.mjs  —  JITHOX_SECRET=<the secret shown once> PORT=8787 node receiver.mjs
// Put it behind https on a public host (your own server, or a tunnel while you try it).
import { createServer } from "node:http";
import { createHmac, timingSafeEqual } from "node:crypto";

const secret = process.env.JITHOX_SECRET;
if (!secret) throw new Error("Set JITHOX_SECRET to the signing secret of this destination.");
const handled = new Map(); // idempotency key -> your own reference. Use your database in real life.

createServer(async (req, res) => {
  const parts = [];
  for await (const chunk of req) parts.push(chunk);
  const raw = Buffer.concat(parts);

  // 1. Is it really from Jithox, and recent? HMAC-SHA256 over "<t>.<raw body>".
  const sig = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(String(req.headers["x-jithox-signature"] ?? ""));
  const expected = sig && createHmac("sha256", secret).update(sig[1] + ".").update(raw).digest();
  const recent = sig && Math.abs(Date.now() / 1000 - Number(sig[1])) <= 300;
  if (!sig || !recent || !timingSafeEqual(expected, Buffer.from(sig[2], "hex"))) {
    res.writeHead(401).end();
    return;
  }

  // 2. Act ONCE per key. A repeat after a lost answer carries the same key.
  const key = String(req.headers["x-jithox-idempotency-key"]);
  const duplicate = handled.has(key);
  if (!duplicate) {
    const run = JSON.parse(raw.toString("utf8"));
    handled.set(key, "demo-" + (handled.size + 1));
    if (!run.test) console.log("create", run.data.recordType, run.data.fields); // your business action goes here
  }

  // 3. Say what you did. Under the JSON contract this is what makes the run "accepted".
  res.writeHead(200, { "content-type": "application/json" });
  res.end(JSON.stringify({ accepted: true, reference: handled.get(key), duplicate }));
}).listen(Number(process.env.PORT ?? 8787));

For your AI agent and for developers

Not for agents since 25 September 2026: the five workflow runner tools were retired from the Jithox connection, which now keeps the checks an agent runs before a payment. What your system receives, and how to check it, is described above. The tools an agent can call.