From 061af32750f8d36a383b18b13b47ccbdb06333bb Mon Sep 17 00:00:00 2001 From: Giovanny Amador <219895655+Eras256@users.noreply.github.com> Date: Wed, 14 Oct 2026 19:49:13 -0600 Subject: [PATCH] docs: MPP Charge now verified on the hosted testnet endpoint On 15 Oct 2026 nirium@0.16.1's initMpp()/mppFetch() paid nirium-agent.fly.dev/api/v1/mpp/signals in pull and push mode; both settled on Stellar testnet (b8c4ed56..., 96d43d6f...) and returned the resource. The 1 Oct "402 Verification Failed" no longer reproduces. Mainnet stays untested and the section keeps "not for production". The Python README keeps saying its mpp_fetch() cannot pay; only the note about the hosted endpoint changes. Co-Authored-By: Claude Opus 5.5 --- packages/sdk-python/README.md | 4 ++-- packages/sdk/README.md | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/sdk-python/README.md b/packages/sdk-python/README.md index 22c66ee..a12fd5d 100644 --- a/packages/sdk-python/README.md +++ b/packages/sdk-python/README.md @@ -140,7 +140,7 @@ Runnable example: [`examples/langchain-x402-agent`](../../examples/langchain-x40 - builds a classic Stellar payment, where MPP Charge needs a Soroban SAC transfer; - sends its proof in an `X-PAYMENT` header, where MPP uses `Authorization: Payment`. -This is not fixed in the version published today. Use x402 (`init_x402()` / `x402_fetch()`) for paid endpoints. The TypeScript package has an MPP Charge client (experimental, see its README); Nirium's hosted testnet `/api/v1/mpp/*` endpoint also rejected MPP payments when tested on 1 October 2026 (mainnet not tested), so do not rely on the hosted endpoints from any language. +This is not fixed in the version published today. Use x402 (`init_x402()` / `x402_fetch()`) for paid endpoints. The TypeScript package has an MPP Charge client (experimental, see its README): Nirium's hosted testnet `/api/v1/mpp/*` endpoint accepted its payments on 15 October 2026, in `pull` and `push` mode (mainnet not tested). That does not change this Python version, which still cannot pay. ### Endpoint Access Model @@ -150,7 +150,7 @@ This is not fixed in the version published today. Use x402 (`init_x402()` / `x40 | **Protected** (API key) | `execute`, `market`, `loop/start\|stop\|scan`, `subscriptions`, `skills/install`, `webhooks` | | **WebSocket** (JWT) | `/ws/signals` — real-time signal stream | | **x402 Premium** | `/api/v1/premium/signals` ($0.02 USDC), `/api/v1/premium/market` ($0.05 USDC) | -| **MPP Charge** | `/api/v1/mpp/signals`, `/api/v1/mpp/market` (testnet endpoint rejected MPP payments when tested, mainnet untested, and `mpp_fetch()` does not work in this version) | +| **MPP Charge** | `/api/v1/mpp/signals`, `/api/v1/mpp/market` (testnet verified with the TypeScript client on 15 Oct 2026, mainnet untested; `mpp_fetch()` does not work in this version) | ## Payouts diff --git a/packages/sdk/README.md b/packages/sdk/README.md index 3a3b4fe..2c18ead 100644 --- a/packages/sdk/README.md +++ b/packages/sdk/README.md @@ -172,12 +172,12 @@ const response = await agent.mppFetch('https://your-mpp-server.example/resource' `initMpp()` builds an MPP Charge client: the server answers `402` with a challenge, the client signs a USDC transfer on Stellar, and the server verifies and settles it. The network comes from the server's challenge, so `network` in the config is accepted but unused. -**Do not use it in production, and do not point it at Nirium's hosted endpoints yet.** +**Testnet: verified. Mainnet: not tested. Still experimental, not for production.** -- The client works against a compliant MPP Charge server. We checked it against Nirium's own MPP middleware running locally against testnet, in `pull` and in `push` mode. -- When we tested on 1 October 2026, Nirium's hosted **testnet** endpoint (`/api/v1/mpp/*`) rejected MPP payments with `402 Verification Failed`, in `pull` and in `push` mode. We have **not tested the mainnet endpoint** (it would spend real USDC), so we cannot tell you it works there. We have not found the cause yet. +- On 15 October 2026 (UTC) we paid Nirium's hosted **testnet** endpoint with this client (`nirium@0.16.1`), once in `pull` and once in `push` mode. Both settled on Stellar testnet and the server returned the resource: [`b8c4ed56…`](https://stellar.expert/explorer/testnet/tx/b8c4ed568f6eb41321b97d251d7f3727c57570a226d187e3675a9df03496e3ed) (pull), [`96d43d6f…`](https://stellar.expert/explorer/testnet/tx/96d43d6f4cf38fbd3a4df2c2bb6625e650c0d0509184d86c1e42c7e6ebdf242c) (push). The `402 Verification Failed` we saw on 1 October no longer reproduces. +- We have **not tested the mainnet endpoint** (it would spend real USDC), so we cannot tell you it works there. - In `push` mode the payment settles on-chain before the server verifies it, so a request the server rejects is **not refunded**. -- Until this is diagnosed, use x402 (`initX402()`) for paid endpoints. The `get_mpp_*` tools of the MCP server have the same limitation. +- For paid endpoints in production, use x402 (`initX402()`). The `get_mpp_*` tools of the MCP server were not re-tested. ### x402Serve(): Charging Your Own API @@ -267,7 +267,7 @@ No in-memory store ships with the package, and you do not need Upstash: any stor | **Protected** (API key) | `execute`, `market`, `loop/start\|stop\|scan`, `subscriptions`, `skills/install`, `webhooks` | | **WebSocket** (JWT) | `/ws/signals` - real-time signal stream | | **x402 Premium** | `/api/v1/premium/signals` ($0.02 USDC), `/api/v1/premium/market` ($0.05 USDC). `/premium/signals` only exists on testnet: on mainnet it answers `501` (no signal source there) and does not charge. `/premium/market` is paid on both networks. | -| **MPP Charge** | `/api/v1/mpp/signals`, `/api/v1/mpp/market` (testnet endpoint rejected MPP payments when tested, mainnet untested, see [MPP Charge](#mpp-charge-experimental)) | +| **MPP Charge** | `/api/v1/mpp/signals`, `/api/v1/mpp/market` (testnet verified with settled payments on 15 Oct 2026, mainnet untested, see [MPP Charge](#mpp-charge-experimental)) | ### x402 Metrics: Observability Wrapper