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.
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
endpoint_url, presenting its certificate and proof.GET /v1/payment-address — naming the consumer, the amount, and the market.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"
}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.
| Check | Refused when |
|---|---|
| Per-transaction ceiling | The amount exceeds max_transaction_value. There is no approval path — the principal must raise the ceiling. |
| Windowed aggregate | The amount would exceed the remaining spending_limit in the current rolling window. |
| Counterparty floor | The provider’s live rating is below the consumer’s min_counterparty_rating. |
| Market authorization | The transaction market — derived from the consumer’s principal country — is not in the provider’s authorized_markets. |
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.
| Property | Behaviour |
|---|---|
| Scope | One transaction, one amount, one pair of counterparties. It cannot be reused or split. |
| Expiry | Short by design. A consumer that delays must renegotiate, and the policy is re-evaluated at that point. |
| Against the window | The 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. |
| Abandonment | An 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.
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.
| Situation | What to build |
|---|---|
| A refusal reaches the principal | Translate 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 exhaustion | Show 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 agent | Surface 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 raised | Route 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
| Code | Status | What it means |
|---|---|---|
spend_policy_violation | 403 | A ceiling, window, or counterparty floor refused the intent. Not retryable as-is. |
market_not_authorized | 409 | The consumer’s market is not among the provider’s authorized markets. A discovery filtering gap. |
counterparty_not_active | 409 | The provider is suspended or revoked since discovery. Re-resolve status and rematch. |
intent_expired | 409 | Settlement attempted against a stale intent. Renegotiate. |
network_mismatch | 400 | The agents are configured on different networks. A discovery filtering gap. |