[ docs ]

the API, the CLI, and doing everything from a terminal

authentication

Create a token at settings → api and pick its scopes (links:write, links:read, paste:write, image:write, drop:write, hook:read, hook:write, me:read). Send it as a bearer token. Tokens are shown once and stored hashed.

export S1D_TOKEN=s1d_…
curl -H "Authorization: Bearer $S1D_TOKEN" https://api.s1d.me/v1/me

All endpoints return JSON: {"ok": true, …} or {"ok": false, "error": "…"} with a matching HTTP status. Base URL: https://api.s1d.me/v1.

cli

One Python file, no dependencies.

curl -fsSL https://s1d.me/static/s1d-cli.py -o ~/.local/bin/s1d && chmod +x ~/.local/bin/s1d
s1d login                                  # paste your token
s1d link https://example.com -a launch     # → https://s1d.me/launch (copied)
cat notes.md | s1d paste -l markdown -e 1d
s1d img screenshot.png
s1d drop video.mp4 -e 3d -m 5              # resumable, 8 MB chunks
s1d hook new stripe && s1d hook tail <slug>
s1d stats launch -r 30d
POST   /v1/links                 {"url", "alias"?, "title"?, "tags"?, "expires"? ("1h","7d",ISO), "max_clicks"?, "password"?, "public"?, "utm"?}
GET    /v1/links?limit=&offset=
GET    /v1/links/{code}
PATCH  /v1/links/{code}          {"target"?, "title"?, "disabled"?}
DELETE /v1/links/{code}
GET    /v1/links/{code}/stats?range=1h|24h|7d|30d|90d|180d&humans=1

Stats include totals (clicks, humans, uniques, link previews by app, bots, QR scans), a time series, countries/regions/cities, networks, devices, OS and browser versions, languages, referrers, channels, UTM breakdowns, routing-rule hits and a day×hour heatmap. Smart routing rules (country, device, OS, browser, language, referrer, channel, time window, weekday, first-N, A/B) are edited on the link page.

From the address bar: s1d.me/+https://anything makes a link. Append + to any short link (s1d.me/abc+) to inspect it without being redirected. QR codes: s1d.me/links/{code}/qr.svg or .png.

paste

POST /v1/pastes   {"content", "name"?, "lang"?, "title"?, "visibility"? (unlisted|public|private), "expires"?, "burn"?, "password"?}
# or straight to p.s1d.me:
cat app.py | curl -H "Authorization: Bearer $S1D_TOKEN" -F f=@- https://p.s1d.me
curl https://p.s1d.me/<slug>/raw

End-to-end encryption is browser-only: the key lives in the link's #fragment and never reaches the server.

images

curl -H "Authorization: Bearer $S1D_TOKEN" -F [email protected] https://i.s1d.me/upload
curl -H "Authorization: Bearer $S1D_TOKEN" -H "Content-Type: application/json" -d '{"url":"https://…/cat.jpg"}' https://i.s1d.me/upload

Returns page, direct, markdown, html, bbcode. Direct links live on cdn.s1d.me and resize on the fly: ?w=800, ?h=, ?fit=cover, ?q=70; change the extension to .webp, .avif, .jpg or .png to convert. GIFs also get an .mp4. ShareX / Flameshot / iOS setup →

drops

POST https://d.s1d.me/api/drops                               {"title"?, "expires"?, "max_downloads"?, "password"?, "kind"? ("send"|"request")}
POST https://d.s1d.me/api/drops/{slug}/files                  {"name", "size", "chunk_size" (64 KiB–16 MiB)}
PUT  https://d.s1d.me/api/drops/{slug}/files/{id}/chunks/{i}  raw bytes
GET  https://d.s1d.me/api/drops/{slug}/files/{id}             → {"received": [...]}  (resume)
POST https://d.s1d.me/api/drops/{slug}/files/{id}/complete    → {"sha256"}
POST https://d.s1d.me/api/drops/{slug}/finish

webhooks & monitors

POST /v1/inboxes {"name"}                → {"url": "https://hook.s1d.me/<slug>"}
GET  /v1/inboxes/{slug}/requests?after=<id>
# heartbeat monitors: add to the end of a cron job
curl -fsS https://hook.s1d.me/ping/<monitor>          # ok
curl -fsS https://hook.s1d.me/ping/<monitor>/fail     # report failure

whoami

curl s1d.me/ip    ·  curl s1d.me/ip.json  ·  curl s1d.me/me.json  ·  curl s1d.me/ua  ·  curl s1d.me/headers

limits

Per member by default: 5 GB storage, 500 links/day, 50 MB per image, 2 GB per drop file. Guests: 100 MB, 20 links/day. Admins can raise quotas. Requests are rate limited per account and per IP; you'll get HTTP 429 if you go too fast.