Skip to content

Decide: execute a plan

quoted per request from $0.001USDC via x402POST /api/decide/execute

Run a decision's plan (decisionId from POST /api/decide), or a free plan sketch (steps), through Agent402: first-party steps run directly, third-party steps are bought from the seller and resold to you at Agent402's price (paid with a wallet on Base; prepaid credits and cards do not pay this route). Send POST /api/decide/execute with no required fields (6 optional) and pay quoted per request from $0.001 over x402 with USDC on Base or MPP. It returns a JSON object with runId, decisionId, status, steps, budgetUsd and 5 more.

Priced at the plan's budget (or your maxBudgetUsd, whichever you set) less a valid execution credit; spend stops at that budget, fallbacks are tried in order, and any unspent amount comes back as a credit. A run where no step succeeds is not charged on x402. Reusing a saved plan: send its decisionId with replan: true and the saved task is planned again on current prices and reliability before the run, for the POST /api/decide price at that decision's depth added to the quote; the answer's replanned field gives the new decisionId and each step whose tool, seller or price changed (or unchanged: true), and a re-plan that cannot run falls back to the saved plan with its price returned as credit. Also runs a free plan sketch: pass the sketch's tool slugs as steps (no decisionId) with params for step 1, and each later step takes its one required input from the step before, at list price. Takes up to 3 minutes to answer: send the paid call with "Prefer: respond-async" to get a job link at once and collect the answer from it (payment still settles only on a delivered result), or with "Prefer: wait=180" and keep the connection open for at least 210 seconds, because a client that disconnects first loses the answer. A paid call with neither header is answered 400 before any payment is taken.

Category: Routing & delegationTags: agents execute planning router x402

Try in playground →

Parameters

NameTypeRequiredDescription
decisionIdstringnoFrom POST /api/decide (or pass steps instead)
stepsarray of stringnoInstead of decisionId: the tool slugs of a free plan sketch (from /api/find or /api/route), 2 to 5, in order. Pass params for step 1; a later step takes its one required input from the step before.
creditTokenstringnoexecutionCredit.token from that decision (optional)
maxBudgetUsdnumbernoSpend ceiling for the run (default: the plan's estimate via Agent402)
paramsobjectnoPer-step params overriding the plan's exampleParams, keyed by step number
replanbooleannoWith decisionId: plan the saved task again on current prices and reliability, then run the new plan. Adds the plan price for that decision's depth to the quote; the answer's replanned field lists what changed. Default false.

Example request

curl -i -X POST https://agent402.tools/api/decide/execute \
  -H "Content-Type: application/json" \
  -d '{"steps":["ens-resolve","wallet-balance"],"params":{"1":{"name":"vitalik.eth"}}}'

Without payment this returns HTTP 402 Payment Required with the exact price for decide-execute; any x402 v2 or MPP client pays it and retries.

Example response

{
  "runId": "run_…",
  "decisionId": "dec_…",
  "status": "complete",
  "steps": [
    {
      "step": 1,
      "status": "ok",
      "tool": {
        "slug": "search",
        "seller": "agent402",
        "firstParty": true
      },
      "costUsd": 0.02,
      "result": {}
    }
  ],
  "budgetUsd": 0.02,
  "spentUsd": 0.02,
  "paidUsd": 0.001,
  "creditAppliedUsd": 0.02,
  "routingFeePct": 5,
  "leftoverCredit": null
}
FieldTypeAlways presentIn the example
runIdstringyesrun_…
decisionIdstringyesdec_…
statusstringyescomplete
stepsarray of objectsyes1 item in the example
budgetUsdnumberyes0.02
spentUsdnumberyes0.02
paidUsdnumberyes0.001
creditAppliedUsdnumberyes0.02
routingFeePctnumberyes5
leftoverCreditnullnonull

From an MCP client

catalog.call {
  "slug": "decide-execute",
  "params": {
    "steps": [
      "ens-resolve",
      "wallet-balance"
    ],
    "params": {
      "1": {
        "name": "vitalik.eth"
      }
    }
  }
}

The hosted connector at https://agent402.tools/mcp needs a payment for decide-execute; the stdio package pays it from a wallet or from an AGENT402_CREDITS_KEY issued earlier. Local install: npx -y agent402-mcp@0.13.32.

Errors and behavior

Paid call (JavaScript agent)

import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const client = new x402Client();
client.setSpendControls?.({ maxAmountPerPayment: "$3.00" }); // refuse any quote above this tool's price
registerExactEvmScheme(client, { signer: privateKeyToAccount(KEY) });
const payFetch = wrapFetchWithPayment(fetch, client);

const res = await payFetch("https://agent402.tools/api/decide/execute", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    "steps": [
      "ens-resolve",
      "wallet-balance"
    ],
    "params": {
      "1": {
        "name": "vitalik.eth"
      }
    }
  }),
});

Related tools

Decide: tool plan for a task

from $0.003POST /api/decide

Describe a job and get a call-ready plan: which tools, across this catalog and outside x402 sellers with a recently.

Route and execute

$0.01POST /api/route/execute

Describe a task (or name a slug) and the Smart Order Router resolves the best-matching tool and RUNS it in the same call.

Route and execute (max tier)

$0.55POST /api/route/execute-max

Describe a task (or name a slug) and the Smart Order Router resolves the best-matching tool and RUNS it in the same call.

Route and execute (plus tier)

$0.05POST /api/route/execute-plus

Describe a task (or name a slug) and the Smart Order Router resolves the best-matching tool and RUNS it in the same call.

Route and execute (pro tier)

$3.30POST /api/route/execute-pro

Describe a task (or name a slug) and the Smart Order Router resolves the best-matching tool and RUNS it in the same call.

Attest a settled call on Base

$0.05POST /api/attest

Write an on-chain attestation (Ethereum Attestation Service on Base) that binds a call you paid for to the bytes you.