# Nostr Media - complete documentation > Image, video and file hosting for the Nostr protocol, at https://nostrmedia.com. > Every document from https://nostrmedia.com/llms.txt, concatenated in one file. > Source of each section is given as a URL above it. > Operated by 21 Million LLC dba Nostr Services. Contact: support@NostrMedia.com ============================================================================== # Overview # Source: https://nostrmedia.com/docs/index.md ============================================================================== # Nostr Media > Image, video and file hosting for the [Nostr](https://nostr.com) protocol. Nostr Media > is a Blossom- and NIP-96-compatible media server: any Nostr client that speaks either > protocol can upload to it by pointing at `https://nostrmedia.com`. - **Site:** - **File manager:** - **Blob host:** `https://file.nostrmedia.com` - **Operator:** 21 Million LLC dba Nostr Services - **Support:** support@NostrMedia.com - **Nostr:** [npub18jnd0ssw2v882c0t9xsxdhafsah8j86prdfpsld8kv2dcjx43r8qke59kc](https://njump.me/npub18jnd0ssw2v882c0t9xsxdhafsah8j86prdfpsld8kv2dcjx43r8qke59kc) ## What it does Nostr Media stores media on behalf of a Nostr public key. Authentication is a signed Nostr event rather than a username and password, so there is no account to create and no password to lose — access is proven by signing with the key you already have. | Capability | Detail | | --- | --- | | Upload protocols | [Blossom](https://github.com/hzrd149/blossom) and [NIP-96](https://github.com/nostr-protocol/nips/blob/master/96.md) | | Max file size | 5 GB per file (via the presigned endpoint); 125 MB via a single `POST /upload` | | Storage | 100 GB (Purple), 210 GB (Onyx), 2.1 TB (Gold) | | Retention | Uploads never expire while the subscription is active | | Payment | Credit card via Stripe, or Bitcoin over Lightning via a Nostr zap | | Monetisation | Zapwall — charge satoshis to unlock a file, paid 100% to the file owner | | Free tier | None. A paid plan is required to upload or store files. | ## Documentation for agents and developers | Document | Contents | | --- | --- | | [api.md](https://nostrmedia.com/docs/api.md) | Complete HTTP API reference: auth, upload, mirror, list, rename, delete, usage, Zapwall | | [clients.md](https://nostrmedia.com/docs/clients.md) | How to point Amethyst, Primal, Nostur, noStrudel, 0xchat, YakiHonne and other clients at Nostr Media | | [pricing.md](https://nostrmedia.com/docs/pricing.md) | Plans, prices, storage limits and per-tier file-type rules | | [faq.md](https://nostrmedia.com/docs/faq.md) | Frequently asked questions | | [file-manager.md](https://nostrmedia.com/docs/file-manager.md) | What the web file manager at /manage can do | | [terms.md](https://nostrmedia.com/docs/terms.md) | Terms of Service | | [privacy.md](https://nostrmedia.com/docs/privacy.md) | Privacy Policy | | [aup.md](https://nostrmedia.com/docs/aup.md) | Acceptable Use Policy | Machine-readable index: [llms.txt](https://nostrmedia.com/llms.txt). Everything concatenated into one file: [llms-full.txt](https://nostrmedia.com/llms-full.txt). ## How uploading works, in short 1. The user's Nostr client computes the SHA-256 hash of the file. 2. The client signs a kind `24242` Nostr event with a `["t", "upload"]` tag and an `["x", ""]` tag. 3. The signed event is base64-encoded and sent as `Authorization: Nostr `. 4. The file is sent to `https://nostrmedia.com/upload`. 5. The server checks the event's pubkey against the subscriber lists, stores the blob, and returns the public URL under `https://file.nostrmedia.com/p//.`. Files larger than 125 MB use `https://nostrmedia.com/presigned`, which hands back presigned URLs the client `PUT`s the file to directly. See [api.md](https://nostrmedia.com/docs/api.md) for both flows in full. ## Why files are addressed by hash Every blob is stored under its own SHA-256 hash, so a URL is a verifiable content address: fetch it, hash the bytes, and you can confirm you received exactly the file the Nostr event referred to. This is the property Blossom is built around, and it is why the same file uploaded twice occupies one path rather than two. ## What Nostr Media is not - It is not affiliated with the Nostr project itself. - It is not a Nostr relay. It stores files; relays store events. - It does not hold, see or store private keys (`nsec`). A lost key cannot be recovered. - It is not a free service; uploading requires an active paid subscription. - Listing and deleting over the Blossom/NIP-96 wire protocols is not implemented yet. Those operations go through the endpoints documented in [api.md](https://nostrmedia.com/docs/api.md) or the web file manager. ============================================================================== # API reference # Source: https://nostrmedia.com/docs/api.md ============================================================================== # Nostr Media HTTP API reference Base URL: `https://nostrmedia.com` Blob host: `https://file.nostrmedia.com` Every endpoint below returns JSON, sends `Access-Control-Allow-Origin: *`, and answers `OPTIONS` with `204` for CORS preflight. Every endpoint except `GET /zapwall` requires an `Authorization` header carrying a signed Nostr event. An active paid subscription (Purple, Onyx or Gold) is required for all write operations. Requests from a pubkey with no subscription are rejected with `403`. ## Authentication Authentication is [NIP-98](https://github.com/nostr-protocol/nips/blob/master/98.md)-style: sign a Nostr event, base64-encode its JSON, and send it as a bearer-like credential. ``` Authorization: Nostr ``` The event kind is `24242` (the Blossom authorization kind). The `t` tag names the operation, and its value must match the endpoint being called: | Operation | Event | Used by | | --- | --- | --- | | Upload | kind `24242`, tags `[["t","upload"],["x",""]]` | `/upload`, `/media`, `/mirror` | | Manage | kind `24242`, tags `[["t","manage"]]` | `/edit`, `/usage`, `/presigned`, `/check-subscription` | | Delete | kind `24242`, tags `[["t","delete"],["x",""]]` | `/delete` | Additional rules the server enforces: - `created_at` may be at most 5 seconds in the future. - An optional `["expiration", ""]` tag is honoured; an expired event is rejected. - If the `t` tag is absent, a `["method", "POST"]` tag is accepted as a fallback. - On `/upload`, the file's SHA-256 may come from the event's `x` tag **or** from an `X-SHA-256` request header. ### Building the header in JavaScript ```js const event = { kind: 24242, created_at: Math.floor(Date.now() / 1000), tags: [["t", "upload"], ["x", sha256Hex]], content: "Uploading blob with SHA-256 hash", pubkey: await window.nostr.getPublicKey(), }; const signed = await window.nostr.signEvent(event); const auth = "Nostr " + btoa(JSON.stringify(signed)); ``` --- ## POST /upload Uploads a file of up to **125 MB**. Larger files must use [`/presigned`](#post-presigned); `/upload` answers `413` above 125 MB because the request would outlive the worker. `PUT` is accepted as an alias for `POST`. `GET` and `HEAD` return `401` with an `X-Reason` header (Blossom BUD-06 handling). The endpoint serves two protocols and picks between them by looking at the `Authorization` event: a kind `24242` event is treated as a Blossom upload, anything else falls through to the NIP-96 handler. The two differ in how the body is sent and in the shape of the response. ### Blossom style — raw body ```http PUT /upload HTTP/1.1 Host: nostrmedia.com Authorization: Nostr Content-Type: image/png Content-Length: 184320 ``` `Content-Type` must be a supported MIME type and `Content-Length` must be present — the server reads the size from that header. Response `200`: ```json { "url": "https://file.nostrmedia.com/p//.png", "sha256": "", "size": 184320, "type": "image/png", "uploaded": 1756339200 } ``` ### NIP-96 style — multipart form ```http POST /upload HTTP/1.1 Host: nostrmedia.com Authorization: Nostr Content-Type: multipart/form-data; boundary=... file: caption: ``` Response `200`, carrying a NIP-94 event template: ```json { "status": "success", "message": "Upload successful.", "nip94_event": { "tags": [ ["url", "https://file.nostrmedia.com/p//.png"], ["m", "image/png"], ["x", ""], ["ox", ""], ["size", "184320"] ], "content": "" } } ``` ### Errors | Status | Meaning | | --- | --- | | `400` | Missing or unparseable authorization event, or no SHA-256 in either the `x` tag or the `X-SHA-256` header | | `401` | Called with `GET`/`HEAD`, or blocked referer | | `403` | No authorization header, no paid subscription, storage limit reached, or a file type restricted to Onyx/Gold | | `405` | Method other than `GET`, `HEAD`, `POST`, `PUT`, `OPTIONS` | | `413` | File larger than 125 MB — use `/presigned` | | `415` | Unsupported content type | | `500` | Server error; the message is echoed in the body | --- ## POST /presigned The route for files between 125 MB and 5 GB. The client asks for presigned R2 URLs, uploads the bytes straight to storage, then tells Nostr Media the upload is finished so the file is recorded against the account. Authorization: a `manage` event (kind `24242`, `["t","manage"]`). Content type: `application/json`. The `action` field selects the sub-operation. ### Multipart flow (large files) **1. `initiate`** — splits the file into 100 MB parts and returns one presigned URL per part. ```json { "action": "initiate", "fileHash": "", "fileSize": 524288000, "fileType": "video/mp4", "fileName": "clip.mp4" } ``` ```json { "status": "success", "uploadId": "", "key": "p//.mp4", "presignedUrls": [ { "partNumber": 1, "url": "https://..." }, { "partNumber": 2, "url": "https://..." } ] } ``` **2. Upload each part** with a plain `PUT` to its presigned URL. Keep the `ETag` each response returns. **3. `complete`** — assembles the parts and records the file. ```json { "action": "complete", "fileHash": "", "fileSize": 524288000, "fileType": "video/mp4", "fileName": "clip.mp4", "uploadId": "", "parts": [ { "partNumber": 1, "etag": "\"...\"" }, { "partNumber": 2, "etag": "\"...\"" } ] } ``` ```json { "status": "success", "message": "Upload successful.", "url": "https://file.nostrmedia.com/p//.mp4", "sha256": "", "size": 524288000, "type": "video/mp4", "uploaded": 1756339200 } ``` **`abort`** — cancels an initiated multipart upload. Same fields as `complete` minus `parts`; returns `{"status":"success","message":"Upload aborted."}`. ### Single-PUT flow (medium files) **`initiate-single`** takes the same fields as `initiate` and returns one URL: ```json { "status": "success", "presignedUrl": "https://...", "key": "p//.mp4" } ``` `PUT` the whole file to `presignedUrl` with the matching `Content-Type`, then call **`complete-single`** with `{ "action": "complete-single", "key": "", "fileHash": ..., "fileSize": ..., "fileType": ..., "fileName": ... }`. The server verifies the object landed in storage before recording it, and returns the same body as `complete`. ### Errors `400` file over 5 GB or invalid action · `403` no auth header, or no paid subscription, or storage limit reached · `405` non-POST · `500` storage credentials unavailable or the object missing after a single PUT. --- ## PUT /mirror Blossom BUD-04. Copies a blob that already exists at some other URL into the caller's Nostr Media storage, so the client never has to re-upload the bytes itself. ```http PUT /mirror HTTP/1.1 Authorization: Nostr Content-Type: application/json { "url": "https://other-blossom-server.example/.png" } ``` Returns the Blossom blob descriptor (`url`, `sha256`, `size`, `type`, `uploaded`). `GET` and `HEAD` return `401`. ## PUT /media Blossom BUD-05. Same request and response shape as `/mirror`, for blobs a client wants processed as media. `GET` and `HEAD` return `200`. --- ## POST /edit The management endpoint. Authorization must be a `manage` event. The request body selects the operation. ### List every file ```json { "fetchAll": true } ``` ```json { "files": [ { "name": "sunset.jpg", "hash": "", "url": "https://file.nostrmedia.com/p//.jpg", "type": "image/jpeg", "size": 184320, "uploaded": 1756339200, "zapwall": false } ] } ``` This is the endpoint to use instead of Blossom `GET /list/`, which is not implemented yet. ### Fetch one file ```json { "sha256": "" } ``` Returns `{ "file": { ...same shape as above... } }`. ### Rename a file ```json { "action": "rename-file", "fileHash": "", "newFileName": "sunset-2026.jpg" } ``` Filenames are sanitised server-side to `[a-zA-Z0-9-_.]`; anything else is stripped. The stored blob and its URL do not change — only the display name in the file manager. ### Add a Zapwall Puts a file behind a Lightning paywall. The file moves from `p//...` to `zapwall//...`, so its public URL changes accordingly. ```json { "action": "add-zapwall", "fileUrl": "https://file.nostrmedia.com/p//.jpg", "satsAmount": 21, "ownerPubKey": "", "noteId": "" } ``` `satsAmount` must be an integer of 1 or more. `noteId` is the id of a kind `9734` zap request event the client signs beforehand. `ownerPubKey` must be a valid 64-character hex Nostr pubkey. ### Remove a Zapwall ```json { "action": "remove-zapwall", "fileUrl": "https://file.nostrmedia.com/zapwall//.jpg", "ownerPubKey": "" } ``` Moves the blob back to `p//...` and clears the Zapwall flag. ### Errors `400` invalid parameters · `403` missing/invalid auth or no paid subscription · `404` file not found · `405` non-POST. --- ## GET /zapwall The one unauthenticated endpoint. Asks whether a file is behind a Zapwall and, if so, for how many satoshis. ``` GET /zapwall?fileUrl=https%3A%2F%2Ffile.nostrmedia.com%2Fzapwall%2F%2F.jpg ``` ```json { "monetized": true, "satsAmount": 21 } ``` An unmonetised file returns `{ "monetized": false }`. Payments settle directly to the file owner's Lightning address; Nostr Media takes no cut. `400` if `fileUrl` is missing · `405` for non-`GET` · `500` on a lookup failure. --- ## POST /usage Returns how much storage the authenticated pubkey has consumed and which tier it is on. Authorization must be a `manage` event. No request body. ```json { "usedStorage": 4294967296, "tier": "onyx" } ``` `usedStorage` is in bytes. `tier` is `"purple"`, `"onyx"`, `"gold"`, or `null` when the pubkey has no active subscription. --- ## POST /check-subscription Checks subscription status without touching storage. Authorization must be a signed Nostr event; no request body. ```json { "status": "success", "message": "User is subscribed", "subscribed": true, "tier": "purple" } ``` A pubkey with no subscription gets `403` and `{"status":"error","message":"A paid subscription (Purple, Onyx, or Gold) is required to upload files.","subscribed":false,"tier":null}`. `401` if the `Authorization` header is absent, `400` if the event cannot be parsed. --- ## POST /delete Deletes one file, or every file belonging to the pubkey. Authorization must be a `delete` event (kind `24242`, tags `[["t","delete"],["x",""]]`). Delete one file: ```json { "fileHash": "" } ``` Delete everything: send an empty JSON body. Both the blobs and the account's file record are removed, and the CDN cache for each deleted URL is purged. `403` missing auth · `404` nothing to delete · `405` non-POST. --- ## Storage limits and file types | Tier | Storage | File types | | --- | --- | --- | | Purple | 100 GB | Images and video | | Onyx | 210 GB | All supported types | | Gold | 2.1 TB | All supported types | Per-file ceiling on every tier is 5 GB. Supported MIME types and extensions: - **Images** — `.jpeg` `.jpg` `.png` `.gif` `.webp` `.bmp` `.tiff` `.heic` `.ico` `.svg` - **Video** — `.mp4` `.webm` `.ogg` `.mov` `.avi` `.wmv` `.mkv` `.flv` `.mpeg` `.mpg` `.3gp` `.m4v` - **Audio** — `.mp3` `.wav` `.flac` `.aac` `.m4a` `.wma` - **Documents** — `.pdf` `.docx` `.xlsx` `.pptx` `.txt` `.rtf` `.odt` `.ods` `.csv` - **Archives and other** — `.zip` `.rar` `.7z` `.tar.gz` `.psd` `.stl` Uploading a type outside the Purple set from a Purple account returns `403` with `"Only Onyx or Gold subscribers can upload this file type."`. A file whose bytes do not match any known signature is stored with a `.bin` extension. ## URL layout | Path | Meaning | | --- | --- | | `https://file.nostrmedia.com/p//.` | A normal blob | | `https://file.nostrmedia.com/zapwall//.` | A Zapwalled blob | Both are content-addressed: the path segment before the extension is the SHA-256 of the file, so any client can verify the bytes it receives. ## Rate and size ceilings at a glance | Limit | Value | | --- | --- | | Single `POST /upload` | 125 MB | | Presigned multipart part size | 100 MB | | Per-file maximum | 5 GB | | Clock skew allowed on `created_at` | 5 seconds into the future | ============================================================================== # Client setup # Source: https://nostrmedia.com/docs/clients.md ============================================================================== # Using Nostr Media from a Nostr client Nostr Media implements both [Blossom](https://github.com/hzrd149/blossom) and [NIP-96](https://github.com/nostr-protocol/nips/blob/master/96.md), so any client that supports either protocol can use it. There is nothing to install and no account to create — your Nostr key *is* the account. ## The one setting you need In your client's media server, file server or image host setting, enter: ``` https://nostrmedia.com ``` Save it. From then on every upload from that client goes to your Nostr Media storage. Some clients ask you to choose between Blossom and NIP-96 first. Either works; the same address is used for both. ## Client-by-client These clients are known to work with Nostr Media: | Client | Platform | | --- | --- | | [Amethyst](https://github.com/vitorpamplona/amethyst) | Android | | [Primal](https://primal.net) | Web, iOS, Android | | [Nostur](https://nostur.com) | iOS, macOS | | [noStrudel](https://nostrudel.ninja) | Web | | [YakiHonne](https://yakihonne.com) | Web, mobile | | [0xchat](https://0xchat.com) | iOS, Android | | [Snort](https://snort.social) | Web | Any other Blossom or NIP-96 client works the same way. The setting lives in each client's own settings screen and the wording differs between apps and versions — look for whichever of "media server", "file server", "Blossom server", "image host" or "upload service" your build offers, and put `https://nostrmedia.com` in it. ## What is and is not supported over the wire Uploading and mirroring are implemented for both protocols. Listing and deleting are **not** yet exposed over Blossom or NIP-96 — a client calling Blossom `GET /list/` or `DELETE /` will not get a useful answer today. To list, rename or delete files, use one of: - the web file manager at , or - the `/edit` and `/delete` endpoints in the [API reference](https://nostrmedia.com/docs/api.md). Full Blossom and NIP-96 compliance is planned. ## Signing in on the website The website itself accepts any of the usual Nostr login methods, handled by `nostr-login`: - a NIP-07 browser extension (Alby, nos2x, and similar), - a NIP-46 remote signer ("connect"), - a local key stored in the browser. The site requests permission to sign kind `1`, kind `24242` and to use `nip04_encrypt`. Kind `24242` is the Blossom authorization event described in the [API reference](https://nostrmedia.com/docs/api.md); it is what proves an upload, listing or deletion came from you. ## Troubleshooting **Uploads fail with "A paid subscription is required".** Nostr Media has no free tier. Subscribe at — with a card through Stripe, or with Bitcoin at . Zap-paid subscriptions can take a moment to appear on the subscriber list after payment. **Uploads fail only for large files.** A single `POST /upload` is capped at 125 MB. Clients that do not implement the presigned multipart flow will fail above that. Upload large files through the website instead, which uses the presigned endpoint and supports up to 5 GB per file. **A document, archive or audio file is rejected on Purple.** Purple covers images and video. Audio, documents and archives need Onyx or Gold. **The upload succeeded but the file will not open.** Files whose bytes match no known signature are stored as `.bin`. Check that the client sent a correct `Content-Type`. **I changed my Nostr key.** Storage is bound to a pubkey. A new key is a new account with no access to the old key's files, and a subscription does not follow you across keys. ============================================================================== # Plans and pricing # Source: https://nostrmedia.com/docs/pricing.md ============================================================================== # Plans and pricing Nostr Media has **no free tier**. An active subscription is required to upload or store files. Subscriptions are tied to a Nostr public key, not to an email address. ## The three plans | | Purple | Onyx | Gold | | --- | --- | --- | --- | | Storage | 100 GB | 210 GB | 2.1 TB | | Monthly | $2.99 | $4.99 | $29.99 | | Yearly | $29.99 | $49.99 | $299.99 | | Max file size | 5 GB | 5 GB | 5 GB | | Images and video | Yes | Yes | Yes | | Audio, documents, archives | No | Yes | Yes | | Web file manager | Yes | Yes | Yes | | Zapwall monetisation | Yes | Yes | Yes | | Uploads expire | No, while the subscription is active | No | No | Prices are in USD. The yearly price on every tier is roughly ten months for twelve. ## What each tier can upload Purple covers images and video. Onyx and Gold add everything else: - **Purple** — `.jpeg` `.jpg` `.png` `.gif` `.webp` `.bmp` `.tiff` `.heic` `.ico` `.svg` `.mp4` `.webm` `.ogg` `.mov` `.avi` `.wmv` `.mkv` `.flv` `.mpeg` `.mpg` `.3gp` `.m4v` - **Onyx and Gold** — all of the above plus `.mp3` `.wav` `.flac` `.aac` `.m4a` `.wma` `.pdf` `.docx` `.xlsx` `.pptx` `.txt` `.rtf` `.odt` `.ods` `.csv` `.zip` `.rar` `.7z` `.tar.gz` `.psd` `.stl` A Purple account uploading one of the Onyx/Gold types gets a `403` with `"Only Onyx or Gold subscribers can upload this file type."` ## How to pay **Credit card, through Stripe.** Use the pricing table at . Manage or cancel the subscription later in the Stripe billing portal: . **Bitcoin, over Lightning, as a Nostr zap.** Go to , pick a plan and a term, and zap the invoice. The same page has a "Check Time Remaining" button that shows how much of the subscription is left. Renewing means sending another zap for the same plan and term — it extends the subscription automatically. There is nothing to cancel; a zap subscription simply lapses. ## Upgrading, downgrading and cancelling Changing tier does not delete anything you have already stored. But if you are over the 100 GB Purple ceiling and downgrade from Onyx, you keep the files and lose the ability to upload more until you are back under the limit. What happens when a subscription ends depends on how it was paid: | Paid with | On cancellation or expiry | | --- | --- | | Card (Stripe) | Files are deleted automatically at the end of the paid period | | Bitcoin zap | Files stay online for 14 days after expiry | All payments are non-refundable, though they may be applied as account credit. See the [Terms of Service](https://nostrmedia.com/docs/terms.md). ## Discount codes The Lightning subscription page accepts promo codes. Codes are percentage-off, fixed-dollar or fixed-satoshi, and each is scoped to particular plans and billing cycles with its own expiry and usage cap. Codes are announced by Nostr Media rather than listed publicly here. ## Checking your own plan from code `POST /usage` returns the tier and bytes consumed for the authenticated pubkey, and `POST /check-subscription` returns subscription status alone. Both are documented in the [API reference](https://nostrmedia.com/docs/api.md). ============================================================================== # FAQ # Source: https://nostrmedia.com/docs/faq.md ============================================================================== # Frequently asked questions ## How many files can I upload, and what file types are supported? Storage is capped by total size rather than by file count: **100 GB** on Purple, **210 GB** on Onyx and **2.1 TB** on Gold. How many files that holds depends on how big each one is. A single file can be up to 5 GB. Supported types: `.jpeg` `.jpg` `.png` `.gif` `.webp` `.bmp` `.tiff` `.heic` `.ico` `.svg` `.mp4` `.webm` `.ogg` `.mov` `.avi` `.wmv` `.mkv` `.flv` `.mpeg` `.mpg` `.3gp` `.m4v` `.mp3` `.wav` `.flac` `.aac` `.m4a` `.wma` `.pdf` `.docx` `.xlsx` `.pptx` `.txt` `.rtf` `.odt` `.ods` `.csv` `.zip` `.rar` `.7z` `.tar.gz` `.psd` `.stl`. Purple covers the image and video types; audio, documents and archives need Onyx or Gold. A paid plan is required to upload anything at all. ## Which Nostr clients work with Nostr Media? Any client that supports [Blossom](https://github.com/hzrd149/blossom) or [NIP-96](https://github.com/nostr-protocol/nips/blob/master/96.md) — including Primal, Amethyst, Nostur, YakiHonne, Snort, noStrudel and 0xchat. Enter `https://nostrmedia.com` as the media server address in the client's settings and save. See [clients.md](https://nostrmedia.com/docs/clients.md). Only the upload and mirroring parts of Blossom and NIP-96 are implemented so far. Listing and deleting go through the [file manager](https://nostrmedia.com/manage) or the [API](https://nostrmedia.com/docs/api.md). ## Do uploaded files expire? No. Uploads never expire for as long as the subscription stays active. They are removed only after a subscription is cancelled or lapses — immediately at the end of the paid period for card subscriptions, or 14 days after expiry for Bitcoin zap subscriptions. ## Can I manage my uploaded files? Yes. Every subscriber gets the web file manager at : search and filter by type, rename, copy URLs, add or remove a Zapwall, and delete. It also shows how much of your storage quota is used. ## I lost my private key (nsec). Do you have it? No, and it cannot be recovered. Uploading never requires your private key to leave your signer — Nostr Media only ever sees signed events, never the key itself. A lost or compromised key means creating a new Nostr account and subscribing again; the old key's files are not transferable. ## What is Zapwall? Zapwall is a paywall unlocked by a Nostr zap rather than a card. A subscriber sets a price in satoshis on any of their files; a viewer unlocks it by zapping that amount. The Lightning payment goes **directly to the file owner** — Nostr Media takes no cut. Turning it on moves the file from `file.nostrmedia.com/p//...` to `file.nostrmedia.com/zapwall//...`, so share the new URL. Anyone can check the price on a file without authenticating: `GET /zapwall?fileUrl=`. ## How do I manage my subscription? Card subscriptions are managed in the Stripe billing portal at . Bitcoin subscriptions are checked and renewed at — the "Check Time Remaining" button shows what is left, and a new zap for the same plan and term extends it automatically. ## What happens to my files if I downgrade or cancel? Cancelling a card subscription deletes the files at the end of the billing period. A lapsed Bitcoin subscription keeps them online for 14 more days. Upgrading or downgrading never deletes anything, but if you are over the 100 GB Purple limit and downgrade from Onyx, you cannot upload again until you are back under it. ## Is there restricted content? Nostr Media does not moderate uploads. It is, however, bound by the laws of its applicable jurisdiction, and will act on valid DMCA, abuse or illegal-content complaints, removing material where necessary. See the [Terms of Service](https://nostrmedia.com/docs/terms.md) and the [Acceptable Use Policy](https://nostrmedia.com/docs/aup.md). ## Is there an API? Yes — see the full [API reference](https://nostrmedia.com/docs/api.md). In brief: hash the file, sign a kind `24242` Nostr event carrying `["t","upload"]` and `["x",""]` tags, base64-encode it into an `Authorization: Nostr ` header, and `POST` the file to `https://nostrmedia.com/upload`. `PUT` and `OPTIONS` are also accepted. Files over 125 MB go through `https://nostrmedia.com/presigned`, which returns presigned URLs for direct upload, up to 5 GB per file. ## Is Nostr Media part of the Nostr project? No. It is an independent service run by 21 Million LLC dba Nostr Services, offered as-is without warranty of any kind. ## Is there a free tier? No. Uploading and storing files requires an active Purple, Onyx or Gold subscription. ============================================================================== # File manager # Source: https://nostrmedia.com/docs/file-manager.md ============================================================================== # The Nostr Media file manager The file manager is the web interface to everything Nostr Media stores for your Nostr public key. It is available to every Purple, Onyx and Gold subscriber. ## Signing in There is no password. On first visit the page asks your signer to sign a kind `24242` event carrying a `["t","manage"]` tag; that signature is what proves the files are yours. Any Nostr login method works — a NIP-07 browser extension, a NIP-46 remote signer, or a key held locally in the browser. The signed event is kept in browser storage so you are not re-prompted on every visit. Signing out clears it. ## What it does - **Browse** every file, thirty per page, with thumbnails for images and inline players for audio and video. - **Search** by filename or SHA-256 hash. - **Filter** by images, video, audio or other. - **Rename** a file. Names are sanitised to letters, digits, `-`, `_` and `.`; the stored blob and its URL are unaffected. - **Copy** a file's public URL. - **Delete** a file. Deletion removes the blob and purges the CDN cache. - **Zapwall** a file: tick the box, set a price in satoshis, and viewers must zap that amount to unlock it. All of the payment goes to you. - **Upload** by dragging files onto the page, including files up to 5 GB, which are sent through the presigned multipart flow. - **See your quota** — used storage against your tier's limit, shown as a progress bar. ## Notes - Files encrypted client-side arrive with no recognisable type and are stored as `.bin`; the manager shows them with a padlock rather than a preview. - Zapwalling a file changes its URL from `/p//...` to `/zapwall//...`. The manager copies the right URL for the file's current state. - Everything the manager does is available over HTTP as well — see the [API reference](https://nostrmedia.com/docs/api.md). ============================================================================== # Terms of Service # Source: https://nostrmedia.com/docs/terms.md ============================================================================== # Terms of Service > The Terms of Service for Nostr Media, operated by 21 Million LLC dba Nostr Services. > > This is a plain-text mirror of for AI agents and offline reading. > The page at that URL is the authoritative version. **Operator:** 21 Million LLC dba Nostr Services **Contact:** support@NostrMedia.com --- ## 1. Provision of service 21 Million LLC dba Nostr Services shall provide the services to Client as set out in appendix to this Agreement as well as in our [Acceptable Use Policy](https://nostrmedia.com/aup). These Terms are governed by Australian law. ## 2. Term This Agreement is valid from the date 21 Million LLC dba Nostr Services receives the order from the Customer and payment outlined in the Agreement. The agreement applies then with 1 month mutual notice. Cancellation of service shall be handled through Stripe payment gateway. ## 3. Changes 21 Million LLC dba Nostr Services has no right to without prior notification to the Customer perform changes to the Service or this Agreement. When changes which significantly affect the function or content of the service, the Customer shall be given the opportunity to prematurely break the contract without any charges. The changes will be affect one month after notice. ## 4. Disclaimers and Warranties We are not liable for any property, equipment, software, consequential, incidental, punitive, or other damages, under any circumstances. The rate for Our service is based, in part, upon Your waiver of such damages and You freely acknowledge and consent to this limitation on Your remedies. Our maximum liability arising out of or related to this agreement will not exceed the total amount of fees billed to You during the three months preceding the claimed breach. ## 5. Privacy 21 Million LLC dba Nostr Services shall keep confidential and not disclose information regarding the Customer except where this required by Australian law or is pre-approved by the Customer. Customer data will be always stored and transfered encrypted. Communication between our staff will be always secured and encrypted. ## 6. Billing Procedures All services are prepayed. If no payment is done until the due date the service will be deleted. Overdue Payments on colocation: All payments will be net 20 days. If payment is not received by the due date, the Your service will not be temporarily disabled and data permanently deleted until 2 weeks past due. You will be re-sent Your invoice along with a notice stating that Your payment is more than X days overdue and You must make a payment now to prevent having Your service disabled. If no payment is received in three weeks, Your subscription will be canceled and data permanently deleted. All payments are nonrefundable, but could be placed as Account Credit. ## A. Special terms and conditions The Customer is responsible for the usage of the service and information made available through it. You will engage only in lawful activities (according to Australian and from housed servers country laws); You will not engage in any activity, nor permit others to use Your hosting, to engage in actions that will limit, prevent, or interfere with the rights or lawful access of any other user of the Internet, or any computer system accessible through the Internet. You will not engage in any activity, nor permit others to use Your hosting, to engage in actions that will result in the unauthorized access to the computers, data, or networks of others or harm the health of somebody. You will not store any malware, trojan or any other software or hardware to intercept or surveillance people. In case you use our services for such illicit activity you agree to pay a fine of 1 million (1.000.000) AUD. 21 Million LLC dba Nostr Services is entitled to after a warning terminate this Agreement or limit the service, if the customer's use of the Service causes considerable economic damage to 21 Million LLC dba Nostr Services. 21 Million LLC dba Nostr Services has the right to temporarily restrict the service if necessary to ensure the function of other customers. 21 Million LLC dba Nostr Services is not authorized to monitor customer traffic through or use of the Service other than for statistics or management of the service function. 21 Million LLC dba Nostr Services has the right to terminate the service without prior warning, if the service is used or intended to be used for cybercrime, to send or otherwise use the Network for unsolicited or prohibited advertising or any other illegal content. 21 Million LLC dba Nostr Services has the right to not issue a service if the purpose is related towards cybercrime. There will be no refund issued and your account closed. ## B. Special terms and conditions for Web service If 21 Million LLC dba Nostr Services determine that a customer's account is utilizing an unacceptable amount of system resources, we may temporarily deactivate the account in question. If we deem it necessary, an eviction notice may be sent to the customer of an offending account providing them with five (5) days in which to locate a new provider. This only occurs in extreme cases. User is ultimately responsible for the backup of their information. While 21 Million LLC dba Nostr Services is backed up by various processes, the availability of such data is also not guaranteed to be available. However, the backup processes are very rigorous. 21 Million LLC dba Nostr Services is not responsible for any kind of data loss. ## C. User-Account: If the customer loses their Nostr private key and could not be verified to regain access to their account the subscription will be closed for security reasons. --- Questions about this document: support@NostrMedia.com Related: [Terms of Service](https://nostrmedia.com/docs/terms.md) · [Privacy Policy](https://nostrmedia.com/docs/privacy.md) · [Acceptable Use Policy](https://nostrmedia.com/docs/aup.md) ============================================================================== # Privacy Policy # Source: https://nostrmedia.com/docs/privacy.md ============================================================================== # Privacy Policy > How Nostr Media collects, uses and protects personal information. > > This is a plain-text mirror of for AI agents and offline reading. > The page at that URL is the authoritative version. **Operator:** 21 Million LLC dba Nostr Services **Contact:** support@NostrMedia.com --- 21 Million LLC dba Nostr Services ("21 Million LLC dba Nostr Services", "we", "us" or "our") continues to put your privacy first. This Privacy Policy is intended to tell you what we do to protect your privacy when you access or use 21 Million LLC dba Nostr Services services. This Privacy Policy describes how we collect and use your personal information and the choices you have regarding the collection, use, maintenance, access and transfer of your personal information. By using 21 Million LLC dba Nostr Services services, including our NostrMedia.com website, you or the entity you represent ("you" or "your") accept and agree to this Privacy Policy. ## Definitions "Terms and Conditions" means the agreement you enter into when you use the 21 Million LLC dba Nostr Services services. "IP" means any Internet Protocol address, including but not limited to unique and non-unique network addresses. "Personal Data" means any information relating to a data subject (that's you!) or your end users that is provided to us directly or indirectly as part of our Services. "Privacy Policy" means this Policy. "Visitor" or "Visitor" means any person(s) or entity(ies) who accesses, maintains, transmits, develops, acquires, operates or otherwise uses any 21 Million LLC dba Nostr Services resource but is not a Customer. ## Who does this Privacy Policy apply to? This Privacy Policy applies to all customers and visitors to 21 Million LLC dba Nostr Services services. In the case of customers, the account holder is responsible for: - informing their end users, if any, of the existence of this Privacy Policy and of any amendments, updates or modifications to this Privacy Policy; and - agreeing to this Privacy Policy, as amended, updated or modified from time to time, on behalf of its or their End Users. ## What personal information does 21 Million LLC dba Nostr Services collect? 21 Million LLC dba Nostr Services considers any information that can be used to directly or indirectly identify you to be Personal Data, including, without limitation, Personal Data that is accessed, collected, maintained, transmitted and/or used by 21 Million LLC dba Nostr Services in the normal course of our business and is subject to the provisions of this Privacy Policy and applicable law. ## How does 21 Million LLC dba Nostr Services collect personal data? 21 Million LLC dba Nostr Services leverages Cloudflare, which collects and logs your IP address, the time and duration of your visit, the time and duration of the pages you view on our website (where applicable) and information about your computer system, such as your browser type and operating system, whenever you access or use a 21 Million LLC dba Nostr Services service. In the case of customers, we collect, maintain, transmit and/or use personal information provided by you subscription creation, including but not limited to your full name, billing information, contact information and 21 Million LLC dba Nostr Services user ID (assigned when you set up an account). 21 Million LLC dba Nostr Services is likely to place a cookie on your hard drive during your visit. Cookies are simply an identifier that is shared between you and 21 Million LLC dba Nostr Services to enable 21 Million LLC dba Nostr Services to improve the services that 21 Million LLC dba Nostr Services provides to you through its website. If you do not want cookies to be stored on your computer, you can disable them in your web browser. You can usually find the option to do this in the 'security settings' section of your browser. However, please note that permanently disabling cookies in your browser may prevent you from using 21 Million LLC dba Nostr Services's website and other websites and interactive services. 21 Million LLC dba Nostr Services does not collect any personal information about you when you visit our website. ## Why does 21 Million LLC dba Nostr Services collect personal information? ### For our customers 21 Million LLC dba Nostr Services strives to collect as little personal information about you as possible. The personal information we do collect is used to process your service requests, to process orders, to deliver products and services, to process payments, to communicate with you about orders, to provide access to secure areas of the 21 Million LLC dba Nostr Services website, and to enable 21 Million LLC dba Nostr Services to review, develop and continually improve the products, services and offerings that it provides. 21 Million LLC dba Nostr Services also uses this information to prevent or detect fraud or misuse of the 21 Million LLC dba Nostr Services website and to enable third parties to perform technical, logistical or other functions on its behalf. ### For visitors 21 Million LLC dba Nostr Services uses personal data to send visitors information about 21 Million LLC dba Nostr Services and to contact them when necessary. Visitors are free to choose whether or not to provide 21 Million LLC dba Nostr Services with information in response to 21 Million LLC dba Nostr Services's request for information. ### For financial information 21 Million LLC dba Nostr Services allows customers to pay for services online in a variety of ways. Credit card information provided via our website is transmitted via a secure connection to the Stripe payment processor. 21 Million LLC dba Nostr Services does not store this information and does not authorize the disclosure of this information to anyone not directly involved in processing the transaction. C 21 Million LLC dba Nostr Services will enter into written agreements with these third parties and will continue to enter into written agreements with third parties that provide credit card processing services. 21 Million LLC dba Nostr Services will ensure that appropriate security measures are in place and that confidentiality is maintained to protect your personal information in accordance with applicable laws and regulations. ### For support information 21 Million LLC dba Nostr Services uses the information you provide via chat, email, web forms and other communications to correspond with you about services you may be interested in purchasing. If you choose to purchase a service online using a web form, 21 Million LLC dba Nostr Services will use the information to create your account. Information that you submit in writing, such as chat, email and web form information, will be archived and may be linked to information that 21 Million LLC dba Nostr Services collects about your web visits. 21 Million LLC dba Nostr Services may enter information you provide by telephone into its systems for use for the purposes described in this paragraph. With whom does 21 Million LLC dba Nostr Services share or provide access to personal information? 21 Million LLC dba Nostr Services Disclosure of Personal Data to Regulatory Authorities 21 Million LLC dba Nostr Services discloses Personal Data to third parties, including law enforcement agencies, in the following normal business processes: If you breach the [Terms of Service](https://nostrmedia.com/terms) or any other applicable service level agreement, or if 21 Million LLC dba Nostr Services is required to disclose or share your personal data in order to comply with any legal obligation, 21 Million LLC dba Nostr Services may disclose your information to a relevant authority. In particular, 21 Million LLC dba Nostr Services may disclose the information it collects to third parties if 21 Million LLC dba Nostr Services believes that disclosure is appropriate to comply with the law, to enforce its legal rights, or to protect the rights or safety of others. Customer data (data stored on the server) is stored in accordance with applicable law and requires a court order from the country in which it is stored in order to be disclosed. User Choice Subject to applicable law, you have the choice and the right to limit, restrict or deny 21 Million LLC dba Nostr Services's ability to share your personal data with third parties or to use your personal data for a purpose that is materially different from the purpose for which it was originally collected or authorized by you. To exercise your right of choice, please contact us at support@nostrmedia.com ## Security and integrity of your personal information 21 Million LLC dba Nostr Services has implemented physical, administrative and technical measures to protect your Personal Data from unauthorized access, use or disclosure. These measures include: - Encryption of all devices that operate customer data and communication systems; - Password- and/or cryptographic key-based authentication controls on servers that host Personal Data; - Browser-based Transport Layer Security encryption; - Access control mechanisms on storage systems to protect the integrity of internal databases and prevent unauthorized access; - Strict access controls and tailored incident response protocols; - Customer data is always stored and transmitted in encrypted form when moved between servers; - Communications between our employees are always secure and end-to-end encrypted. We require our business partners to provide the same level of protection for any personal data we share with them. ## Access to your personal information You control access to the Personal Information you maintain or store through 21 Million LLC dba Nostr Services's web-based account management interface, hosted through Stripe. You can update your information at any time. You may cancel your account at any time and request that your personal information be deleted from our databases, except for any accounting records of purchases, which we are required by law to retain for 7 years, network access logs, which we may retain for any period of time at our discretion, in cases where there are outstanding financial obligations or in cases where illegal activity is suspected (as determined by 21 Million LLC dba Nostr Services management or law enforcement officials), in which case personal information may be retained indefinitely for the purposes of ongoing investigation and prevention of recurrence of fraud, or in cases where a breach of the Terms and Conditions and applicable Service Level Agreement has resulted in the termination of your account (as defined by revocation of your permission to use 21 Million LLC dba Nostr Services's services), in which case personal information may be retained indefinitely for the purposes of preventing further use of 21 Million LLC dba Nostr Services's services by the offending individual. Upon request, 21 Million LLC dba Nostr Services will provide you with reasonable access to the personal data that 21 Million LLC dba Nostr Services holds about you. We will also take reasonable steps to correct, amend or delete any information that you demonstrate is inaccurate, incomplete or processed in breach of applicable law. Except as required by law, 21 Million LLC dba Nostr Services will not allow you to access the Personal Data of anyone other than yourself. ## Dispute Resolution Please direct any complaints regarding this Privacy Policy to support@nostrmedia.com ## Changes We may change this Privacy Policy at any time, so you should check back periodically for changes. We will also provide public notice of changes to this Privacy Policy by email and within the Service Centre. Unless otherwise instructed by you, you agree that 21 Million LLC dba Nostr Services has the right and ability to amend this Privacy Policy and that you waive any requirement for specific or express acknowledgement or consent to any such amendments or modifications. --- Questions about this document: support@NostrMedia.com Related: [Terms of Service](https://nostrmedia.com/docs/terms.md) · [Privacy Policy](https://nostrmedia.com/docs/privacy.md) · [Acceptable Use Policy](https://nostrmedia.com/docs/aup.md) ============================================================================== # Acceptable Use Policy # Source: https://nostrmedia.com/docs/aup.md ============================================================================== # Acceptable Use Policy > What may and may not be hosted on Nostr Media's network and services. > > This is a plain-text mirror of for AI agents and offline reading. > The page at that URL is the authoritative version. **Operator:** 21 Million LLC dba Nostr Services **Contact:** support@NostrMedia.com --- 21 Million LLC dba Nostr Services have formulated this Acceptable Use Policy As part of our [Terms of Service](https://nostrmedia.com/terms) agreement in order to encourage the responsible use of 21 Million LLC dba Nostr Services's networks, systems, services, web sites and products (collectively "21 Million LLC dba Nostr Services's Network and Services") by our customers and other users ("Users"), and to enable us to provide our Users with secure, reliable and productive services. We do not allow: ## 1. Malicious Activities: - Any activity related to spam (relays, sites, links, proxy). - Malware distribution, hacking attempts (e.g., SQL injection attacks, remote code execution) - Phishing, scam or impersonation platforms for stealing information/money (e.g., credit card, password scam sites, fake cryptocurrency exchanges). ## 2. Illegal and Harmful Content: - Hosting or sharing child pornography - Selling pharmaceuticals without a license. - Sharing or distributing materials related to terrorism. - Doxxing: revealing or sharing personal and private information without consent (privacy violation) ## General notice In case of ToS/AUP break 21 Million LLC dba Nostr Services does not provide any backups. ## General Conduct 21 Million LLC dba Nostr Services's Network and Services must be used in a manner that is consistent with their intended purposes and may be used only for lawful purposes. Users may not use 21 Million LLC dba Nostr Services's Network and Services in order to transmit, distribute or store material that is: (a) fraudulent; (b) abusive; (c) contains a virus, worm, Trojan horse, or other harmful component; (d) containing fraudulent offers for goods or services or any promotional materials that contain false, deceptive or misleading statements, claims or representations (e) generally, in a manner that may expose 21 Million LLC dba Nostr Services or any of its personnel to criminal or civil liability. ## Responsibility for Content 21 Million LLC dba Nostr Services takes no responsibility for any material created or accessible on or through 21 Million LLC dba Nostr Services's Networks and Services that is not posted by or at the request of 21 Million LLC dba Nostr Services. 21 Million LLC dba Nostr Services does not monitor nor exercise any editorial control over such material, but reserves the right to do so to the extent permitted by applicable law. 21 Million LLC dba Nostr Services is not responsible for the content of any content other than 21 Million LLC dba Nostr Services's web sites, including for the content of web sites linked to such 21 Million LLC dba Nostr Services's web sites. Links are provided as Internet navigation tools only. ## System and Network Security Users are prohibited from violating or attempting to violate the security of 21 Million LLC dba Nostr Services's Network and Services, including, without limitation (a) accessing data not intended for such User or logging into a server or account which such User is not authorized to access; (b) attempting to probe, scan or test the vulnerability of a system or network or to breach security or authentication measures without proper authorisation; (c) attempting to interfere with, disrupt or disable service to any user, host or network, including, without limitation, via means of overloading, "flooding", "mailbombing" or "crashing"; (d) forging any TCP/IP packet header or any part of the header information in any e-mail or newsgroup posting; (e) taking any action in order to obtain services to which such User is not entitled. Violations of system or network security may result in civil or criminal liability. --- Questions about this document: support@NostrMedia.com Related: [Terms of Service](https://nostrmedia.com/docs/terms.md) · [Privacy Policy](https://nostrmedia.com/docs/privacy.md) · [Acceptable Use Policy](https://nostrmedia.com/docs/aup.md)