Reelspan signs a note with your Nostr key and sends it to your relays. Videos and photos go to nostr.build first, and their links go in the note, where most clients show them inline.
What you can post
| Post | How it appears |
|---|---|
| Text | A note (kind 1) |
| Photos | A note with up to 10 photos or videos, their links added after the text |
| Video | A note with the video's link added after the text |
Each media link is also tagged in the note (imeta), and every #hashtag in the text becomes a topic tag, so clients can find the note by it.
The result's url opens the note on njump.me, post_id is the note's event id, and relays lists the relays that took it.
Connect your key
You need your private key. Setup takes about a minute.
- Copy your private key (
nsec1…) from your Nostr app's key or account settings. - In the Reelspan dashboard, open Accounts → Connect account, choose the profile and Nostr, and paste the key.
- Name the relays to publish to, or leave them empty for
wss://relay.damus.io,wss://nos.lolandwss://relay.primal.net.
Your private key is stored encrypted and only signs the notes you send through Reelspan, plus the upload authorisation nostr.build asks for. If you'd rather not share your main key, make a separate key for the account you post from.
With the API
curl -X POST https://api.reelspan.com/v1/accounts/nostr \
-H "Authorization: Bearer $REELSPAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"profile_username": "my-brand", "nsec": "nsec1...", "relays": ["wss://relay.damus.io", "wss://nos.lol"]}'import { Reelspan } from 'reelspan';
const reelspan = new Reelspan();
await reelspan.accounts.connect('my-brand', 'nostr', {
nsec: process.env.NOSTR_NSEC,
relays: ['wss://relay.damus.io', 'wss://nos.lol'],
});import os
from reelspan import Reelspan
reelspan = Reelspan()
reelspan.accounts.connect("my-brand", "nostr", nsec=os.environ["NOSTR_NSEC"], relays=["wss://relay.damus.io", "wss://nos.lol"]){ "success": true, "platform": "nostr", "account": "npub1abcdefghijk…", "reconnected": false }| Field | Required | Also accepted (Upload-Post) |
|---|---|---|
nsec |
Yes. nsec1…, or the key as 64 hex characters |
private_key |
relays |
No. A list, or one string separated by spaces or commas. Up to 10 are used |
Connecting again replaces the Nostr account on that profile. See Connect with credentials.
Example post
A video note:
curl -X POST https://api.reelspan.com/v1/posts/video \
-H "Authorization: Bearer $REELSPAN_API_KEY" \
-F "user=my-brand" \
-F "platform[]=nostr" \
-F "title=Launch day" \
-F "nostr_title=We shipped. Here's the 60-second tour #launch #buildinpublic" \
-F "[email protected]"import { Reelspan } from 'reelspan';
import { readFile } from 'node:fs/promises';
const reelspan = new Reelspan();
const post = await reelspan.posts.video({
user: 'my-brand',
platforms: ['nostr'],
title: 'Launch day',
video: { data: await readFile('launch.mp4'), name: 'launch.mp4', type: 'video/mp4' },
extra: { nostr_title: "We shipped. Here's the 60-second tour #launch #buildinpublic" },
});from reelspan import Reelspan
reelspan = Reelspan()
post = reelspan.posts.video(
"my-brand", ["nostr"], "launch.mp4", "Launch day",
extra={"nostr_title": "We shipped. Here's the 60-second tour #launch #buildinpublic"},
){
"success": true,
"request_id": "9b1f6c2e8a3d4f50b7e1c9a2d6f3e8b1",
"results": {
"nostr": {
"success": true,
"url": "https://njump.me/note1…",
"post_id": "5c83da77…",
"relays": ["wss://relay.damus.io", "wss://nos.lol"]
}
}
}Fields
| Field | Meaning |
|---|---|
nostr_title |
The note's text. Falls back to title. |
title |
The caption every network uses, when nostr_title isn't sent. |
Nostr has no options of its own in the dashboard composer. A first_comment isn't posted on Nostr; the result says "first_comment": "unsupported" with a warning.
Limits and behaviour
- Media: up to 10 items per note, each up to 100 MB, uploaded to nostr.build (a NIP-96 server, authorised with a NIP-98 signature from your key). The media server can't be changed today.
- Relays: the note goes to every relay at once, and each has 10 seconds to accept it. The post succeeds when at least one relay takes it; each relay that didn't is named in a warning.
- Text: no limit is applied by Reelspan. The dashboard composer stops at 10,000 characters.
- Signing: each note is signed with your key on Reelspan's servers; the key never leaves them.
Common errors
| Code | When | Fix |
|---|---|---|
INVALID_KEY |
Connecting: the key isn't nsec1… or 64 hex characters |
Copy the private key (nsec1…), not the public one (npub1…). |
INVALID_RELAY |
Connecting: a relay isn't a wss:// address |
Use wss:// addresses only. |
nostr_relays_failed |
No relay accepted the note; each relay's answer is in error. Retried automatically |
Check the relays still accept your notes, or connect again with others. |
nostr_media_error |
nostr.build didn't take the file. Retried automatically on 5xx | Read error for the server's reason. |
file_too_large |
A file is over 100 MB | Send a smaller file. |
MISSING_FIELD |
Connecting without nsec |
Send it. |
Errors when connecting come back as a 400 with the code in error_code. Errors when posting are in that network's result. See Errors.