Agentic file storage and sharing

No subscriptions. Use Walrus's robust, verifiable, and decentralized storage. Pay via x402.

Send POST /v1/files/public with your file, or request an upload session with maxSizeBytes, to find out the price via the 402 challenge.

Use an upload session when your client can't put a large file's bytes inline in the paid request — for example a CLI passing the body as a command-line argument. It splits payment from byte transfer: you pay for a declared maxSizeBytes, then PUT the actual bytes (which may be smaller, never larger) to the returned URL.

Durations are requested in days, then rounded up to Walrus epochs by the server. Walrus Testnet epochs are 1 day; Walrus Mainnet epochs are 14 days.

Privacy

Files stored through this service are PUBLIC on Walrus and retrievable by anyone with the blob ID. Use it to share the file with anyone.

If you need to store private data, make sure you encrypt it yourself and only send the cyphertext.

store.nosub.club does not store your file any longer than it's necessary to fulfil your request and upload it to Walrus storage.

Endpoints

POST /v1/files/public?duration=<days>[&contentType=<mime>]
Upload a file. Body: application/octet-stream. duration is the requested storage period in days. contentType is optional — supply a MIME type (e.g. text/plain, application/json, application/msword) to have it stored as metadata on the Walrus blob object. When set, the returned aggregatorUrl serves the file with the correct Content-Type header, which helps agents and browsers interpret the content without guessing.
POST /v1/files/public
JSON uploads support contentText, contentBase64, or maxSizeBytes plus contentType for a paid upload session. After payment, a session request returns HTTP 200 with an uploadUrl, method (PUT), expiresAt, maxSizeBytes, and contentType.
PUT /v1/files/public/uploads/:token
Upload the bytes for a paid session to the uploadUrl returned above. No payment header is needed — it was settled on the POST. Send the Content-Type you declared in the session (e.g. audio/wav), not application/octet-stream; a mismatch is rejected. The body must not exceed maxSizeBytes, and the session is single-use and expires at expiresAt. A successful PUT returns the same 201 storage response as a direct upload.
POST /v1/files/public/:blobId/extend
Extend storage for a file previously uploaded through this service. Body: {"duration": <days>} (JSON).

Example response

A successful upload returns HTTP 201:

        {
        "blobId": "0xabc123...",
        "storageObjectId": "0xdef456...",
        "aggregatorUrl": "https://aggregator.walrus.space/v1/blobs/by-object-id/0xdef456...",
        "expiresAt": "2026-08-23T00:00:00.000Z"
        }
    

The blobId is permanent on Walrus for the duration of file storage. You can retrieve your file using blobId or storageObjectId from any public Walrus aggregator — even if this service is down.