Payment negotiation
Phase 2. The buyer agent asks for the resource, the seller agent answers with a price and a payment intent, and Nustro decides — before the intent exists — whether the buyer agent 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 market and network, the buyer agent (buyer_did), the amount, and itself (seller_did).402 Payment Required, carrying those terms.HTTP/1.1 402 Payment Required
{
"intent_id": "pin_6b21f9c4",
"amount": "120.00",
"token": "USDC",
"network": "arc-testnet",
"settlement_contract": "0x4b8d…",
"seller_id_hash": "0x91af…",
"buyer_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 buyer agent needs to know where to pay and how much, and nothing more.
What the Operator checks
Four evaluations, all against the buyer agent’s signed AID rather than anything the seller agent 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 seller agent’s live rating is below the buyer agent’s minimum_counterparty_ar, or its certificate tier below minimum_counterparty_cert_tier. |
| Market authorization | The transaction market — derived from the buyer agent’s principal country — is not in the seller agent’s authorized_markets. |
Note who asks and who is checked: the seller agent requests terms, and the buyer agent’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 buyer agent 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 buyer agent 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 — detail.failed_check names it: max_transaction_value, spending_limit or counterparty_floor — 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 buyer agent’s market is not among the seller agent’s authorized markets. A discovery filtering gap. |
counterparty_not_active | 409 | The counterparty 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. |