Docs
⌘K
Transacting / Payment negotiation

Payment negotiation

Phase 2. The consumer asks for the resource, the provider answers with a price and a payment intent, and Nustro decides — before the intent exists — whether the consumer is allowed to spend that much. Your platform is not in this exchange.

Where enforcement actually happens

Spend policy is applied when the payment intent is minted, not when funds move and not by your platform. This is the single most important thing to understand about Phase 2: no intent, no settlement, so a principal’s declared limit is a hard limit rather than a rule someone is trusted to honour.

The exchange

The consumer requests the resource directly from the provider’s endpoint_url, presenting its certificate and proof.
The provider asks the Operator for payment terms — GET /v1/payment-address — naming the consumer, the amount, and the market.
The Operator evaluates the consumer’s spend policy. If it passes, it mints an intent and returns the settlement contract, token, and amount.
The provider responds 402 Payment Required, carrying those terms.
HTTP/1.1 402 Payment Required

{
  "intent_id": "pin_6b21f9c4",
  "amount": "120.00",
  "token": "USDC",
  "network": "base-sepolia",
  "settlement_contract": "0x4b8d…",
  "provider_id_hash": "0x91af…",
  "consumer_id_hash": "0x2e77…",
  "expires_at": "2026-05-14T09:20:00Z"
}
Nustro enforces

The 402 carries the settlement contract and the amount — never wallet addresses, split ratios, or fee configuration. How a payment divides is between the contract and the Operator; a consumer needs to know where to pay and how much, and nothing more.

What the Operator checks

Four evaluations, all against the consumer’s signed AID rather than anything the provider or your platform asserts.

CheckRefused when
Per-transaction ceilingThe amount exceeds max_transaction_value. There is no approval path — the principal must raise the ceiling.
Windowed aggregateThe amount would exceed the remaining spending_limit in the current rolling window.
Counterparty floorThe provider’s live rating is below the consumer’s min_counterparty_rating.
Market authorizationThe transaction market — derived from the consumer’s principal country — is not in the provider’s authorized_markets.
The consumer's limits, enforced against the provider's request

Note who asks and who is checked: the provider requests terms, and the consumer’s policy decides. Neither agent can widen the other’s scope, and neither can appeal. AEA/P §5.3.2.3. Read §5.3

Intents expire

An intent is a short-lived authorisation to settle one specific transaction, not a standing permission.

PropertyBehaviour
ScopeOne transaction, one amount, one pair of counterparties. It cannot be reused or split.
ExpiryShort by design. A consumer that delays must renegotiate, and the policy is re-evaluated at that point.
Against the windowThe amount counts toward the rolling limit when the intent is minted, not when the payment lands — otherwise a consumer could mint many intents and settle them all.
AbandonmentAn unsettled intent releases its hold on the window when it expires.

High-value commitments

Standing scope covers routine spending. Above a step-up threshold, a transaction can additionally require a Commitment Authorization — a single-use, amount-scoped credential signed by the principal’s own key and presented at request time.

What this is for

It is the difference between “this agent may spend up to $500 per transaction” and “this agent may commit $50,000 to this specific deal, because I personally signed off on it.” If your platform hosts agents that make occasional large commitments, surface this to principals as an approval step rather than asking them to raise a standing ceiling they will forget to lower.

What your platform should do

You are not in the exchange, but you own the experience around it.

SituationWhat to build
A refusal reaches the principalTranslate spend_policy_violation into which limit was hit and what raising it would take. “Declined” with no reason generates a support ticket every time.
Limits are near exhaustionShow remaining window headroom before it runs out. A principal that discovers the limit through a failed transaction will ask you to remove it entirely.
Repeated refusals for one agentSurface it. Either the scope is wrong for the workload, or the agent is doing something the principal did not intend — both are worth a human look.
A principal wants a limit raisedRoute it through scope configuration, not a support override. There is no mechanism for your platform to grant an exception, and building the expectation is worse than saying so.

Common errors

CodeStatusWhat it means
spend_policy_violation403A ceiling, window, or counterparty floor refused the intent. Not retryable as-is.
market_not_authorized409The consumer’s market is not among the provider’s authorized markets. A discovery filtering gap.
counterparty_not_active409The provider is suspended or revoked since discovery. Re-resolve status and rematch.
intent_expired409Settlement attempted against a stale intent. Renegotiate.
network_mismatch400The agents are configured on different networks. A discovery filtering gap.

Next