API Docs
Live
Pages
Terms
Images
Luisearch API
Free, open search API. BM25 ranking with title + host name boosting. No API key required for public use. CORS enabled — call from anywhere.
https://stevens-predictions-get-feet.trycloudflare.com
All endpoints return JSON. Responses include up to 200 results for search, 100 for image search.
More Core Search
GET /api/resurrect
If a URL is dead right now, hand back the last archived crawl of it (title/content) instead of a dead end.
url*stringFull http(s) URL to check
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/resurrect"
Example response
{ "alive": false, "archived": true, "url": "https://example.com/page", "title": "Example Page", "content": "...(truncated to 6000 chars)...", "indexed_at": "2026-06-01 12:00:00" }
GET /api/galaxy
Sampled pages from the index for the "Index Galaxy" 3D visualization.
limitoptintMax stars to sample, default 4000, capped at 8000
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/galaxy"
Example response
{ "stars": [ { "id": 1023, "url": "https://example.com/", "title": "Example Domain", "host": "example.com" } ], "total": 2481932 }
GET /api/stats-history
Historical snapshots of index size over time (for growth charts).
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/stats-history"
Example response
{ "snapshots": [ { "taken_at": "2026-07-01 00:00:00", "pages": 2481932, "sites": 41200, "images": 981234, "videos": 12044, "audio": 3021, "downloads": 8842 } ] }
GET /api/download-index
Streams the raw search-index.db SQLite file (~9GB), with HTTP Range support for resumable downloads.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/download-index"
Example response
null
GET /api/geo-map
Lat/lon + page counts for every indexed host that has been geolocated (backs the map visualization).
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/geo-map"
Example response
{ "hosts": [ { "host": "example.com", "lat": 37.4, "lon": -122.1, "country": "United States", "city": "Mountain View", "pages": 142 } ] }
GET /api/geo-lookup
Real-time DNS + geolocation lookup for any domain (not just already-indexed ones); caches the result.
host*stringBare domain, e.g. example.com
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/geo-lookup"
Example response
{ "host": "example.com", "ip": "93.184.216.34", "lat": 37.4, "lon": -122.1, "country": "United States", "city": "Mountain View", "pages": 0 }
Auth & API Keys
GET /api/dl-token
Set the shared download-manager access token (query param, not a header — simple by design).
token*stringNew token value to store
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/dl-token"
Example response
{ "ok": true }
GET /api/dl-token-check
Check whether a given token matches the currently configured download token.
tokenoptstringToken to verify
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/dl-token-check"
Example response
{ "ok": true }
POST /api/admin/login
Admin console login — separate from both search API keys and Nexus/Drive accounts. Auth: none (this endpoint issues the admin token)
username*stringAdmin username
password*stringAdmin password
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/admin/login" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "token": "a1b2c3d4e5f6..." }
Drive
GET /api/drive/me
Current Drive account profile. Auth: Bearer Drive token
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/drive/me"
Example response
{ "owner": "alice", "email": "alice@example.com", "quota": 10737418240, "used": 204838, "created_at": "2026-01-04 10:00:00" }
GET /api/drive/files
List files in a Drive folder. Auth: Bearer Drive token
folderoptstringFolder path, default "/"
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/drive/files"
Example response
{ "files": [ { "id": "8f2a...", "name": "notes.txt", "size": 204, "mime": "text/plain", "folder": "/", "owner": "alice", "uploaded_at": "2026-06-01 09:00:00" } ], "used": 204838, "quota": 10737418240, "free": 10737213402 }
GET /api/drive/stats
Quota usage + file count summary. Auth: Bearer Drive token
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/drive/stats"
Example response
{ "used": 204838, "quota": 10737418240, "free": 10737213402, "files": 12 }
GET /api/drive/trash
List files currently in trash (not yet permanently deleted). Auth: Bearer Drive token
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/drive/trash"
Example response
{ "files": [ { "id": "8f2a...", "name": "old.txt", "trashed_at": "2026-07-10 08:00:00" } ] }
POST /api/drive/upload
Upload a file (multipart/form-data). Rejected if it exceeds the 1GB per-file cap or the account quota. Auth: Bearer Drive token
file*fileThe file
folderoptstringTarget folder, default "/"
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/drive/upload" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "8f2a...", "name": "photo.jpg", "size": 204838, "mime": "image/jpeg" }
POST /api/drive/delete
Move a file to trash (soft delete). Auth: Bearer Drive token
id*stringFile id
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/drive/delete" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/drive/restore
Restore a trashed file. Auth: Bearer Drive token
id*stringFile id
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/drive/restore" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/drive/delete-permanent
Permanently delete a file and free its quota. Auth: Bearer Drive token
id*stringFile id
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/drive/delete-permanent" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/drive/empty-trash
Permanently delete every trashed file for this account. Auth: Bearer Drive token
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/drive/empty-trash" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true, "deleted": 3 }
POST /api/drive/share
Toggle public sharing for a file; returns the public path when enabled. Auth: Bearer Drive token
id*stringFile id
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/drive/share" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "shared": true, "path": "/api/drive/public/8f2a..." }
GET /api/drive/public/<id>
Fetch a file that its owner has marked shared — no auth required. 404 if not shared.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/drive/public/<id>"
Example response
null
GET /api/drive/download/<id>
Download one of your own Drive files (also accepts ?token= for plain <a download> links). Auth: Bearer Drive token (or ?token=)
tokenoptstringDrive session token, alternative to the Authorization header
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/drive/download/<id>"
Example response
null
POST /api/drive/logout
Invalidate the current Drive Bearer token. Auth: Bearer Drive token
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/drive/logout" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
GET /api/save-to-drive
Queue a URL for download into your token-scoped MYstuff folder via the local aria2c-web service.
url*stringURL to download
nameoptstringFilename to save as
tokenoptstringDownload-manager token, required if one is configured
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/save-to-drive"
Example response
{ "ok": true, "queued": { "gid": "a1b2c3" } }
GET /api/drive-downloads
List active/queued downloads from the local aria2c-web helper.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/drive-downloads"
Example response
{ "downloads": [ { "gid": "a1b2c3", "status": "active", "completedLength": 204800, "totalLength": 1048576 } ] }
GET /api/local-files
List files sitting in your token-scoped MYstuff download folder.
tokenoptstringDownload-manager token
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/local-files"
Example response
{ "files": [ { "name": "ubuntu-24.04.iso", "size": 4831838208, "mtime": 1752345600.0 } ] }
GET /api/local-delete
Delete a file from your token-scoped MYstuff folder.
tokenoptstringDownload-manager token
name*stringFilename to delete
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/local-delete"
Example response
{ "ok": true }
AI (Answers, Chat Tools, LuisPaper)
GET /api/ai-servers
List the AI "tool" backends available to the assistant/tool-use system.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/ai-servers"
Example response
{ "servers": [ { "id": "web-search", "label": "Web Search", "icon": "\ud83d\udd0e", "desc": "Search the live index" } ] }
GET /api/ai/list
List saved AI chat conversations for the logged-in Drive account. Auth: Bearer Drive token
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/ai/list"
Example response
{ "conversations": [ { "id": "c1a2...", "title": "New chat", "updated_at": "2026-07-10 09:00:00" } ] }
GET /api/ai/get
Fetch one saved AI conversation with full message history. Auth: Bearer Drive token
id*stringConversation id
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/ai/get"
Example response
{ "id": "c1a2...", "title": "New chat", "messages": [ { "role": "user", "content": "hello" } ] }
GET /api/paper
Synchronous quick-answer variant of LuisPaper — generates a short cited report from top search results without the job/poll flow.
q*stringTopic to research
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/paper"
Example response
{ "answer": "...report text...", "sources": [ { "url": "https://example.com/", "title": "..." } ] }
POST /api/paper/start
Start an async LuisPaper report job (retrieval + long-form generation runs in a background thread). Auth: LuisPaper account (paper_ API key via Bearer/cookie)
q*stringReport topic
lengthoptstringOne of the supported PAPER_LENGTHS, default "standard"
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/start" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "job_id": "7e2a..." }
GET /api/paper/poll
Long-poll for new tokens on a report job/turn (up to 25s, returns as soon as new tokens or completion arrive).
job_id*stringJob id from /api/paper/start
turnoptintTurn index, default latest
sinceoptintToken offset already received
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/poll"
Example response
{ "tokens": [ "Linux", " is", " an", " open-source" ], "total": 842, "done": false, "error": null, "meta": { "title": "Linux: A Technical Overview" }, "turn": 0 }
POST /api/paper/followup
Continue a report conversation with a follow-up message (optionally with an attached image, routed through a vision model). Auth: LuisPaper account
job_id*stringJob id
message*stringFollow-up text
image_dataoptstringdata: URL of an attached image
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/followup" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "turn": 2 }
GET /api/paper/suggestions
AI-suggested follow-up questions for a given report job.
job_id*stringJob id
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/suggestions"
Example response
{ "questions": [ "What distributions are most popular?", "How does it compare to BSD?" ] }
GET /api/paper/account/me
Current LuisPaper account username. Auth: LuisPaper account
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/account/me"
Example response
{ "username": "alice" }
POST /api/paper/account/signup
Create a LuisPaper account.
username*string3+ chars, lowercase/digits/underscore
password*string6+ chars
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/account/signup" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "username": "alice", "api_key": "paper_9c1f..." }
POST /api/paper/account/login
Log in to LuisPaper.
username*string
password*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/account/login" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "username": "alice", "api_key": "paper_9c1f..." }
POST /api/paper/account/change-password
Change the logged-in LuisPaper account password. Auth: LuisPaper account
current_password*string
new_password*string6+ chars
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/account/change-password" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
GET /api/paper/account/usage
Today's report-generation usage against the rate limit. Auth: LuisPaper account
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/account/usage"
Example response
{ "used_today": 3, "limit": 10, "window_seconds": 86400 }
GET /api/paper/history
List saved reports for the logged-in account (pinned first). Auth: LuisPaper account
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/history"
Example response
{ "reports": [ { "id": "r1", "topic": "linux kernel", "title": "Linux Kernel Overview", "custom_title": null, "pinned": false, "shared": false, "created_at": "2026-07-01 10:00:00" } ] }
GET /api/paper/history/report
Fetch one full saved report by id. Auth: LuisPaper account
id*stringReport id
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/history/report"
Example response
{ "id": "r1", "topic": "linux kernel", "title": "Linux Kernel Overview", "raw_text": "...full report...", "pinned": false, "created_at": "2026-07-01 10:00:00" }
POST /api/paper/history/update
Rename (custom_title) or pin/unpin a saved report. Auth: LuisPaper account
id*string
custom_titleoptstring
pinnedoptbool
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/history/update" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/paper/history/delete
Delete a saved report. Auth: LuisPaper account
id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/history/delete" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/paper/history/share
Generate (or return the existing) public share token for a report. Auth: LuisPaper account
id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/history/share" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "token": "a9c1f..." }
POST /api/paper/history/unshare
Revoke a report's share token. Auth: LuisPaper account
id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/history/unshare" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
GET /api/paper/shared
Public, no-login read-only view of a shared report.
token*stringShare token
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/paper/shared"
Example response
{ "topic": "linux kernel", "title": "Linux Kernel Overview", "custom_title": null, "raw_text": "...", "created_at": "2026-07-01 10:00:00" }
Nexus — Auth
POST /api/vn/signup
Create a Voidnet/Nexus account (shared user system). Phone is required by the Nexus client but optional for Voidnet.
username*string3+ chars
password*string6+ chars
phoneoptstringRequired by Nexus signup flow
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/signup" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "token": "a1b2...", "username": "alice" }
POST /api/vn/login
Log in to a Voidnet/Nexus account.
username*string
password*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/login" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "token": "a1b2...", "username": "alice" }
POST /api/vn/logout
Invalidate the current session token. Auth: Bearer session token
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/logout" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
Nexus — Messaging
POST /api/nexus/messages
Post a message to a channel or a DM (channel_id can be a DM pseudo-channel). Auth: vn session
channel_id*string
contentoptstringUp to 4000 chars; required unless attachments/forward_of given
attachmentsoptarrayUp to 4 {type,url} objects
reply_tooptstringMessage id being replied to
forward_ofoptobject{author,content,attachments} of a forwarded message
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/messages" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "m1a2...", "channel_id": "c1", "author": "alice", "content": "hey!", "attachments": [], "reply_to": "", "created_at": "2026-07-19 10:00:00" }
GET /api/nexus/messages/<channel_id>
Fetch recent messages in a channel or DM (also supports forum thread replies via ?parent=). Auth: vn session
parentoptstringForum root message id, to fetch just its thread
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/messages/<channel_id>"
Example response
{ "messages": [ { "id": "m1", "author": "alice", "content": "hey!", "reactions": [] } ] }
POST /api/nexus/react
Toggle an emoji reaction on a message. Auth: vn session
message_id*string
emoji*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/react" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "reactions": [ { "emoji": "\ud83d\udc4d", "count": 2, "me": true } ] }
POST /api/nexus/delete
Delete a message (message author, or staff role in the server). Auth: vn session
id*stringMessage id
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/delete" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/nexus/typing
Broadcast a typing indicator to a channel/DM. Auth: vn session
channel_id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/typing" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/nexus/poll/create
Create a poll, posted as a message with 2-10 options. Auth: vn session
channel_id*string
question*stringUp to 300 chars
options*array2-10 strings, each up to 120 chars
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/poll/create" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "m5...", "poll_id": "p1...", "content": "\ud83d\udcca Favorite distro?" }
POST /api/nexus/poll/vote
Cast or change a vote on a poll. Auth: vn session
poll_id*string
option_index*int
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/poll/vote" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "p1...", "question": "Favorite distro?", "options": [ { "text": "Arch", "votes": 4 }, { "text": "Debian", "votes": 2 } ], "total_votes": 6 }
Nexus — Channels & Servers
POST /api/nexus/servers
Create a new server (with a default "general" text channel, creator becomes owner). Auth: vn session
name*stringUp to 60 chars
iconoptstringEmoji or image URL
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/servers" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "s1a2...", "name": "My Server", "invite": "ab12cd34" }
GET /api/nexus/servers
Servers the logged-in user is a member of (plus the default Lobby). Auth: vn session
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/servers"
Example response
{ "servers": [ { "id": "lobby", "name": "Lobby", "icon": "\ud83c\udf10", "invite": "", "owner": "system" } ] }
POST /api/nexus/join
Join a server via invite code. Auth: vn session
invite*stringInvite code or server id
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/join" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "s1a2...", "name": "My Server" }
POST /api/nexus/leave
Leave a server (owner cannot leave; must transfer or delete instead). Auth: vn session
server_id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/leave" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/nexus/kick
Remove a member from a server (requires owner/admin/mod, cannot kick equal-or-higher role). Auth: vn session
server_id*string
username*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/kick" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/nexus/role
Set a member's role (owner/admin only; cannot change the owner). Auth: vn session
server_id*string
username*string
role*stringadmin | mod | member
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/role" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/nexus/channels
Create a channel in a server. Auth: vn session
server_id*string
name*stringLowercased, spaces become dashes
typeoptstringtext|image|stream|event|announcement|forum, default text
topicoptstringUp to 120 chars
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/channels" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "c9a1...", "name": "general" }
GET /api/nexus/channels/<server_id>
List channels in a server (member-only). Auth: vn session
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/channels/<server_id>"
Example response
{ "channels": [ { "id": "c1", "name": "general", "topic": "", "position": 0, "type": "text" } ] }
GET /api/nexus/members/<server_id>
List a server's members with role/profile/online status. Auth: vn session
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/members/<server_id>"
Example response
{ "members": [ { "username": "alice", "role": "owner", "avatar": "", "color": "", "online": true } ] }
POST /api/nexus/server/icon
Set a server's icon (owner/admin only). Auth: vn session
server_id*string
icon*stringEmoji or image URL, up to 300 chars
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/server/icon" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true, "icon": "\ud83d\ude80" }
POST /api/nexus/profile
Set your own Nexus profile (partial updates supported). Auth: vn session
avataroptstring
coloroptstring
biooptstring
statusoptstring
pronounsoptstring
banner_coloroptstring
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/profile" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true, "avatar": "", "color": "#8ab4f8", "bio": "hi", "status": "", "pronouns": "", "banner_color": "" }
GET /api/nexus/profile/<username>
Fetch any user's public Nexus profile.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/profile/<username>"
Example response
{ "username": "alice", "avatar": "", "color": "#8ab4f8", "bio": "hi" }
Nexus — DMs
POST /api/nexus/dm/open
Resolve a username into a deterministic DM channel id. Auth: vn session
username*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/dm/open" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "channel_id": "dm:alice:bob", "user": "bob" }
GET /api/nexus/dms
List your DM conversations, latest message first, with online status. Auth: vn session
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/dms"
Example response
{ "dms": [ { "channel_id": "dm:alice:bob", "user": "bob", "last": "hey!", "at": "2026-07-19 10:00:00", "online": true, "avatar": "", "color": "" } ] }
Nexus — Realtime
WS /api/nexus/ws
WebSocket realtime feed — the primary transport for live Nexus events (messages, presence, typing, reactions, calls, etc). Replaces long-polling when available.
token*stringvn session token, passed in the connect URL query string
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/ws"
Example response
null
GET /api/nexus/events
Legacy long-poll fallback realtime feed (same event shapes as the WebSocket), used when WS isn't available.
token*string
afteroptintCursor from the previous call; omit/-1 to bootstrap and just get the current cursor
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/events"
Example response
{ "cursor": 4821, "events": [ { "type": "message", "channel_id": "c1", "message": { "id": "m1", "author": "alice", "content": "hey" } } ] }
Nexus — Calls & RTC
POST /api/nexus/call/start
Ring another user for a voice or screen-share call. Auth: vn session
username*stringCallee
kindoptstringvoice|screen, default voice
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/call/start" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "call_id": "a1b2..." }
POST /api/nexus/call/respond
Callee accepts or declines an incoming call. Auth: vn session
call_id*string
accept*bool
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/call/respond" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "status": "accepted" }
POST /api/nexus/call/signal
Relay a WebRTC SDP offer/answer/ICE candidate between the two call participants. Auth: vn session
call_id*string
data*objectOpaque SDP/ICE payload
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/call/signal" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/nexus/call/end
End an active call (either side). Auth: vn session
call_id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/call/end" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/nexus/signal
WebRTC signaling relay for in-channel screen share (separate from the call/* flow). Auth: vn session
to*stringTarget username
channel_idoptstring
kindoptstring
dataoptobject
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/signal" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/nexus/live
Start or stop screen-sharing presence in a channel. Auth: vn session
channel_id*string
on*bool
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/live" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true, "live": [ "alice" ] }
GET /api/nexus/live/<channel_id>
Who is currently screen-sharing in a channel.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/live/<channel_id>"
Example response
{ "live": [ "alice" ] }
POST /api/nexus/rtc/signal
Room-code-keyed WebRTC signaling relay (used by the desktop/phone pairing flow, not usernames).
room*stringUp to 16 chars
from*stringdesktop|phone
dataoptobject
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/rtc/signal" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
GET /api/nexus/rtc/poll
Drain queued signaling messages for one side of a paired room.
room*string
role*stringdesktop|phone
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/rtc/poll"
Example response
{ "msgs": [] }
Nexus — Sign-in (QR/Push/WiFi)
POST /api/nexus/qr/new
Desktop requests a new QR login code.
shortoptboolUse a short 4-char code for the "light" login flow
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/qr/new" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "code": "a1b2c3d4e5" }
POST /api/nexus/qr/approve
A logged-in phone approves a QR code, minting a new session token for the desktop. Auth: vn session
code*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/qr/approve" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true, "username": "alice" }
GET /api/nexus/qr/img
SVG QR code image for a login/pair code.
c*stringCode
moptstringsignup|pair|(login)
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/qr/img"
Example response
null
GET /api/nexus/qr/poll
Desktop polls whether its QR code has been approved yet.
c*stringCode
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/qr/poll"
Example response
{ "approved": true, "token": "a1b2...", "username": "alice" }
POST /api/nexus/push/request
Desktop asks a specific user's logged-in phone(s) to approve a login.
username*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/push/request" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "r1a2b3" }
POST /api/nexus/push/respond
Phone approves or denies a pending push login request. Auth: vn session
id*string
ok*bool
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/push/respond" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
GET /api/nexus/push/poll
Desktop polls the status of its push login request.
id*string
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/push/poll"
Example response
{ "status": "approved", "token": "a1b2...", "username": "alice" }
POST /api/nexus/wifi/new
New (logged-out) device registers itself and learns which logged-in devices are nearby on the same network.
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/wifi/new" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "device_id": "d1a2...", "nearby": [ "alice" ] }
POST /api/nexus/wifi/announce
Logged-in device announces "I'm here on this network" so new devices can discover it. Auth: vn session
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/wifi/announce" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/nexus/wifi/request
New device asks nearby phones to sign it in.
device_id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/wifi/request" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "nearby": [ "alice" ] }
POST /api/nexus/wifi/approve
Phone approves a nearby device's sign-in request (must be on the same detected network). Auth: vn session
device_id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/wifi/approve" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
GET /api/nexus/wifi/poll
New device polls for approval.
d*stringdevice_id
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/wifi/poll"
Example response
{ "approved": true, "token": "a1b2...", "username": "alice" }
Nexus — Media
POST /api/nexus/upload
Upload an image for use in a message; returns its relative URL. Auth: vn session
file*filepng/jpg/jpeg/gif/webp, max 12MB
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/upload" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "url": "/api/img/9c1f...jpg" }
POST /api/nexus/transcribe
Transcribe a voice-message clip to text via a local Whisper service. Auth: vn session
audio*fileAudio clip, max 25MB
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/transcribe" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "text": "hey, are you free later?" }
GET /api/img/<id>
Serve a previously uploaded image by id (proxied, reachable on the apex domain).
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/img/<id>"
Example response
null
POST /api/img/upload
Public image host — upload an image and get back a full shareable URL (not Nexus-scoped, no auth).
file*filepng/jpg/jpeg/gif/webp, max 12MB
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/img/upload" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "url": "/api/img/9c1f...jpg", "full": "https://luisearch.pages.dev/api/img/9c1f...jpg" }
Nexus — Events
POST /api/nexus/events/create
Create a structured event (date/location) in a channel. Auth: vn session
channel_id*string
title*stringUp to 120 chars
whenoptstring
locationoptstring
descriptionoptstring
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/events/create" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "e1a2..." }
POST /api/nexus/events/rsvp
RSVP to an event. Auth: vn session
event_id*string
status*stringgoing|maybe|no
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/events/rsvp" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
GET /api/nexus/events/<channel_id>
List events in a channel with RSVP tallies and your own RSVP. Auth: vn session
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/events/<channel_id>"
Example response
{ "events": [ { "id": "e1", "title": "Game night", "rsvp": { "going": 4, "maybe": 1, "no": 0 }, "my_rsvp": "going" } ] }
Voidnet (Social Feed)
GET /api/vn/feed
Paginated, score-ranked Voidnet post feed.
offsetoptintdefault 0
limitoptintdefault 20, max 50
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/feed"
Example response
{ "posts": [ { "id": "p1", "author": "alice", "text": "hello voidnet", "media": [], "like_count": 4, "my_vote": 0 } ], "total": 812 }
POST /api/vn/post
Create a Voidnet post (multipart with up to 4 files, or plain JSON text-only). Auth: vn session
textoptstring
file0..file3optfileUp to 4 attachments
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/post" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "p1a2..." }
GET /api/vn/post/<id>
Fetch a post with its comment thread.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/post/<id>"
Example response
{ "post": { "id": "p1", "text": "hello", "my_vote": 0 }, "comments": [ { "id": "c1", "author": "bob", "text": "nice!", "my_vote": 0 } ] }
POST /api/vn/post/delete
Delete your own post (and its attached media files). Auth: vn session
id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/post/delete" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/vn/comment
Comment on a post (optionally as a reply to another comment). Auth: vn session
post_id*string
parent_idoptstring
text*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/comment" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "c1a2..." }
POST /api/vn/vote
Upvote/downvote/clear a vote on a post or comment. Auth: vn session
id*string
type*stringpost|comment
vote*int1, -1, or 0
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/vote" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/vn/follow
Follow or unfollow a user. Auth: vn session
username*string
actionoptstringfollow (default) | unfollow
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/follow" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
GET /api/vn/me
Current Voidnet profile. Auth: vn session
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/me"
Example response
{ "username": "alice", "bio": "", "follower_count": 12, "following_count": 4 }
GET /api/vn/profile/<username>
Public Voidnet profile for any user, with their recent posts.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/profile/<username>"
Example response
{ "username": "alice", "bio": "", "posts": [ { "id": "p1", "text": "hi" } ], "following": false }
POST /api/vn/profile/update
Update your own bio/sysinfo/banner/status/links. Auth: vn session
biooptstring
sysinfooptobject
banneroptstring
banner_imgoptstring
statusoptstring
linksoptobject
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/profile/update" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/vn/profile/avatar
Upload a profile avatar image (multipart). Auth: vn session
file*file
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/profile/avatar" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "avatar_id": "9c1f...jpg" }
POST /api/vn/profile/banner
Upload a profile banner image (multipart). Auth: vn session
file*file
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/profile/banner" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "banner_img": "9c1f...jpg" }
POST /api/vn/dm/send
Send a plain Voidnet DM (separate from the richer Nexus DM/messages system). Auth: vn session
to*string
text*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/dm/send" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "m1a2..." }
GET /api/vn/dm/inbox
List Voidnet DM conversations with unread counts. Auth: vn session
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/dm/inbox"
Example response
{ "conversations": [ { "other": "bob", "last_time": "2026-07-19 10:00:00", "unread": 2 } ] }
GET /api/vn/dm/conversation/<user>
Fetch (and mark read) the DM history with one user. Auth: vn session
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/dm/conversation/<user>"
Example response
{ "messages": [ { "id": "m1", "sender": "alice", "recipient": "bob", "text": "hey", "read": 1 } ] }
GET /api/vn/notifications
Recent notifications (likes, comments, follows, DMs) with unread count. Auth: vn session
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/notifications"
Example response
{ "notifications": [ { "id": "n1", "type": "like", "from_user": "bob", "created_at": "2026-07-19 10:00:00" } ], "unread": 3 }
POST /api/vn/notifications/read
Mark all notifications as read. Auth: vn session
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/notifications/read" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/vn/push/subscribe
Register a Web Push subscription for notifications. Auth: vn session
subscription*objectStandard PushSubscription JSON
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/push/subscribe" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/vn/push/unsubscribe
Remove all Web Push subscriptions for this account. Auth: vn session
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/push/unsubscribe" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
GET /api/vn/vapid-public-key
Public VAPID key needed to create a Web Push subscription client-side.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/vapid-public-key"
Example response
{ "key": "BEl62iUYgUiv..." }
Voidgroups (Group Chats)
POST /api/voidgroups/create
Create a group chat (creator becomes owner). Auth: vn session
name*string
descriptionoptstring
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/voidgroups/create" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "g1a2...", "name": "Linux Fans" }
POST /api/voidgroups/join
Join an existing group. Auth: vn session
id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/voidgroups/join" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/voidgroups/leave
Leave a group. Auth: vn session
id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/voidgroups/leave" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
GET /api/voidgroups/list
List groups, largest first, with your membership status.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/voidgroups/list"
Example response
{ "groups": [ { "id": "g1", "name": "Linux Fans", "member_count": 42, "is_member": true } ] }
POST /api/voidgroups/post
Post a message to a group (multipart with up to 4 files, or plain JSON text-only). Auth: vn session
group_id*string
textoptstring
file0..file3optfile
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/voidgroups/post" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "id": "m1a2..." }
GET /api/voidgroups/messages/<group_id>
Fetch recent messages in a group.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/voidgroups/messages/<group_id>"
Example response
{ "messages": [ { "id": "m1", "author": "alice", "text": "hey all" } ] }
LuisWiki
GET /api/wiki/list
List all wiki pages.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/wiki/list"
Example response
{ "pages": [ { "slug": "linux-basics", "title": "Linux Basics", "updated_at": "2026-06-01 10:00:00" } ] }
GET /api/wiki/page
Fetch a wiki page by slug, rendered to HTML.
slug*string
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/wiki/page"
Example response
{ "exists": true, "slug": "linux-basics", "title": "Linux Basics", "content": "# Linux Basics\\n...", "html": "<h1>Linux Basics</h1>...", "editor": "alice", "updated_at": "2026-06-01 10:00:00" }
Code Runner
GET /api/code/list
List saved code projects for the logged-in user. Auth: vn session
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/code/list"
Example response
{ "projects": [ { "id": "p1", "name": "Untitled project", "lang": "python", "updated_at": "2026-07-01 10:00:00" } ] }
GET /api/code/load
Load a saved code project by id. Auth: vn session
id*string
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/code/load"
Example response
{ "id": "p1", "name": "Untitled project", "lang": "python", "code": "print(\"hi\")" }
App Store
GET /api/appstore/catalog
List published apps in the community app store.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/appstore/catalog"
Example response
{ "apps": [ { "id": "a1", "name": "MyApp", "subtitle": "A cool app", "version": "1.0", "icon": "app.fill", "publisher": "alice", "desc": "...", "ipaURL": "https://luisearch.pages.dev/api/appstore/ipa/a1" } ] }
GET /api/appstore/generate/status
Poll the build status of an AI-generated app job.
job*stringJob/session id from /api/appstore/generate
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/appstore/generate/status"
Example response
{ "status": "building" }
Admin (internal, staff-only)
POST /api/admin/approve
Approve a pending API key. Auth: admin session
token*stringAdmin session token
id*stringKey id
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/admin/approve" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/admin/reject
Reject a pending API key. Auth: admin session
token*string
id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/admin/reject" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/admin/revoke
Permanently delete an API key. Auth: admin session
token*string
id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/admin/revoke" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/admin/bulk-approve
Approve every currently pending API key at once. Auth: admin session
token*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/admin/bulk-approve" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "approved": 7 }
POST /api/admin/change-password
Change the admin console password. Auth: admin session
token*string
old_password*string
new_password*string6+ chars
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/admin/change-password" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
GET /api/admin/keys
List every registered API key (all statuses). Auth: admin session
token*string
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/admin/keys"
Example response
[ { "id": "k1", "key": "ls_9c1f...", "name": "alice", "email": "alice@example.com", "status": "approved" } ]
POST /api/admin/webmaster/approve
Approve a webmaster crawl-submission and queue it into the live crawler. Auth: admin session
token*string
id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/admin/webmaster/approve" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/admin/webmaster/force-crawl
Force-approve and immediately queue a submission for the crawler. Auth: admin session
token*string
id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/admin/webmaster/force-crawl" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/admin/webmaster/reject
Reject a webmaster submission. Auth: admin session
token*string
id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/admin/webmaster/reject" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
POST /api/admin/webmaster/delete
Delete a webmaster submission record. Auth: admin session
token*string
id*string
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/admin/webmaster/delete" \ -H "Content-Type: application/json" \ -d '{...}'
Example response
{ "ok": true }
GET /api/admin/webmaster/list
List all webmaster submissions with live index status. Auth: admin session
token*string
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/admin/webmaster/list"
Example response
[ { "id": "s1", "name": "Alice", "email": "alice@example.com", "url": "https://example.com/", "status": "approved", "indexed": true, "indexed_pages": 42 } ]
GET /api/admin/logs
Recent search query log (last 200), joined with the API key that made each request. Auth: admin session
token*string
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/admin/logs"
Example response
[ { "id": 1, "query": "linux kernel", "results_count": 24, "created_at": "2026-07-19 10:00:00", "key_name": "alice", "key_email": "alice@example.com" } ]
GET /api/crawl/start
Start a crawl run (optionally seeded from a specific URL). Auth: admin session
token*stringAdmin session token
urloptstringSeed URL; omit to crawl from sitemaps
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/crawl/start"
Example response
{ "started": true, "pid": 48213, "seed": "sitemaps" }
GET /api/crawl/stop
Kill any running crawler process.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/crawl/stop"
Example response
{ "stopped": 1 }
How it works
Three components running 24/7 on a local machine, exposed via Cloudflare Tunnel.
1
Web Crawler
Starts from 500+ seed URLs and sitemaps. BFS traversal, stores title + content (5KB cap) into SQLite. Filters junk URLs (carts, logins, CDN assets).
2
BM25 + Host Boost
BM25 scoring (same as Elasticsearch). Title matches +3/term. Host name matches +10/term — search "docker" gets docs.docker.com first.
3
Image Crawler
Visits indexed pages, extracts <img> alt text. Separate images.db. Prioritizes image-rich hosts like Apple, The Verge, iFixit.
Stack: Python · SQLite · BM25 · Cloudflare Pages · Cloudflare Tunnel
Response Schema
Fields returned in each result object from /api/search.
idintegerInternal page ID in the index
urlstringFull URL of the indexed page
titlestringPage title from the HTML <title> tag
snippetstringFirst ~300 chars of page content
Fields from /api/image-search:
srcstringAbsolute image URL
altstringAlt text / image description
page_urlstringPage the image was found on
hoststringDomain the image came from
Error Codes
All errors return JSON: {"error": "message"}
400Missing required fields in /api/keys/register (name + email)
401Invalid API key
401Admin endpoint called without valid session token
404Endpoint doesn't exist
500Server error — DB issue or crawler problem
Omitting the key entirely works fine — unauthenticated requests are allowed for all public endpoints.
Code Examples
Copy-paste snippets for common languages.
JavaScript
Python
Swift
curl
TypeScript
Go
Kotlin
async function search(query) { const res = await fetch( 'https://stevens-predictions-get-feet.trycloudflare.com/api/search?q=' + encodeURIComponent(query) ); const { results } = await res.json(); results.forEach(r => console.log(r.title, r.url)); } search('docker compose');
import urllib.request, urllib.parse, json def search(query): url = ('https://stevens-predictions-get-feet.trycloudflare.com/api/search?q=' + urllib.parse.quote(query)) with urllib.request.urlopen(url) as r: data = json.loads(r.read()) for result in data['results']: print(result['title'], result['url']) search('docker compose')
import Foundation func search(_ query: String) async throws { var comps = URLComponents(string: "https://stevens-predictions-get-feet.trycloudflare.com/api/search")! comps.queryItems = [URLQueryItem(name:"q", value:query)] let (data, _) = try await URLSession.shared.data(from: comps.url!) let json = try JSONSerialization.jsonObject(with: data) as! [String:Any] let results = json["results"] as! [[String:Any]] results.forEach { print($0["title"]!, $0["url"]!) } } Task { try await search("macbook") }
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/search?q=docker" # Image search curl "https://stevens-predictions-get-feet.trycloudflare.com/api/image-search?q=macbook" # Stats curl "https://stevens-predictions-get-feet.trycloudflare.com/api/stats" # With API key curl "https://stevens-predictions-get-feet.trycloudflare.com/api/search?q=linux&key=ls_..."
interface SearchResult { id: number; url: string; title: string; snippet: string; } async function search(query: string): Promise<SearchResult[]> { const res = await fetch( `https://stevens-predictions-get-feet.trycloudflare.com/api/search?q=${encodeURIComponent(query)}` ); const { results } = await res.json(); return results; } const results = await search('typescript handbook');
package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func search(query string) { u := "https://stevens-predictions-get-feet.trycloudflare.com/api/search?q=" + url.QueryEscape(query) resp, _ := http.Get(u) defer resp.Body.Close() var data map[string]any json.NewDecoder(resp.Body).Decode(&data) for _, r := range data["results"].([]any) { m := r.(map[string]any) fmt.Println(m["title"], m["url"]) } }
Embed Widget
Drop a live search box into any page in ~10 lines.
Embed code
<input id="q" placeholder="Search..."> <div id="results"></div> <script> document.getElementById('q').addEventListener('keydown', async e => { if (e.key !== 'Enter') return; const res = await fetch( 'https://stevens-predictions-get-feet.trycloudflare.com/api/search?q=' + encodeURIComponent(e.target.value) ).then(r => r.json()); document.getElementById('results').innerHTML = res.results.slice(0,5).map(r => `<div><a href="${r.url}">${r.title}</a><p>${r.snippet}</p></div>` ).join(''); }); </script>
FAQ
Is there a rate limit?
Yes, real tiered limits: 20 req/min with no key, 120 req/min with a free API key, 300 req/min with a registered account (plus response caching), and unlimited on the Plus tier. See /tiers for the full breakdown. Luisearch is one product in the LuisHae family of real, multi-user services — not a one-person hobby project.
Do I need an API key?
No. All public endpoints work without a key. A key raises your rate limit and gives you attribution in query logs.
What sites are indexed?
Tech-focused content: Apple, GitHub, MDN, Wikipedia, Docker, Kubernetes, Cloudflare, Arch Linux, Python docs, and 500+ more seed domains, expanding continuously by following outbound links. Hit /api/hosts to see every indexed domain with page counts.
How fresh is the index?
The crawler runs continuously adding new pages. Re-crawling existing pages to pick up changes isn't done yet — pages reflect the state they were in when first crawled. A separate background job does re-fetch pages specifically to backfill missing meta descriptions, but that's about metadata, not full re-indexing.
Can I request a domain to be indexed?
Not through a self-service form yet — the crawler is manually seeded. If you want a site added, contact the admin.
Why does my query return a Base64 answer?
The server detects queries like "base64 of hello" or "encode xyz to base64" and returns the encoded value directly as a quick answer, without hitting the search index.
How does ranking work?
BM25 (the same algorithm used by Elasticsearch, Solr, and Lucene) is computed for real at query time — real IDF and term-saturation formulas, not a simplified stand-in — then a secondary boost/penalty pass runs over the top candidates.
Are there search operators like site: or -exclude?
Not yet — right now search is plain keyword matching against the full index. Operator support (site:, intitle:, exclusion) is a real gap, not implemented.
How many results does the API return?
/api/search returns up to 200 results per query. /api/image-search returns up to 100. The mobile and desktop UIs paginate these — showing 50 at a time with a Load More button.
Is this open source?
Not publicly, not yet. The backend is a single Python file (many thousands of lines at this point — it covers a lot more than just search now) with SQLite for storage and BM25 computed at query time. AI features (the answer box, LuisPaper, AI Chat) call DeepSeek's hosted API first, falling back to Groq if the DeepSeek key is unavailable — no local/Ollama inference is used.
How big is the index?
Live counts only — any hardcoded number here would go stale within a day. Check /api/stats or the counters on the homepage for the current page/term totals.
Can I use this in a production app?
You can, but there's no formal uptime SLA. The Cloudflare tunnel occasionally reconnects. For anything critical, cache results on your side.
What is LuisDrive?
LuisDrive is cloud storage built into the LuisHae family, with 3 GB free per account. Create an account at /drive.html — upload files, organize into folders, share links, and access your files from any device. All files are stored on a private SSD.
How do I sign up for LuisDrive?
Go to luisearch.pages.dev/drive.html and tap "Create account." Choose a username and password — your files are isolated from other users. Tap "Sign in" on return visits. Your session token is stored locally in the browser.
Does Luisearch collect personal data?
See /privacy for the full, honest breakdown — including what's currently a real gap (query logs have no expiry yet). No IP address is stored alongside a query, and there's no ad tracking or third-party analytics anywhere.
Why is the server sometimes slow?
The backend runs over a Cloudflare Tunnel. Occasionally the tunnel reconnects (1-3 second blip) or SQLite is busy with a crawl write. Results are usually well under 200ms on a warm query.
Can I download my LuisDrive files?
Yes — tap the download icon on any file. You can also bulk-download multiple files at once by selecting them with long-press and tapping the download button in the toolbar. Downloads use a secure time-limited token in the URL so they work in any browser tab.
What file types can I upload to LuisDrive?
Any file type is accepted — images, videos, PDFs, code, archives, etc. Images and PDFs show an inline preview. The 3 GB quota applies to total storage across all your files.
How do I get a quick answer (calculator, converter)?
Type a math expression like 25 * 4 or a unit conversion like 100 f to c or 5 km to miles directly into the search bar. The answer appears as a quick-answer card above the results without hitting the index.
Can I bookmark or star search results?
Yes — tap the star (☆) icon on any result to save it. Saved results appear in the "Saved" section in the side panel. Bookmarks are stored in your browser's localStorage and persist across sessions.
Does the search support multiple languages?
BM25 is language-agnostic — you can search in any language the crawler has seen. The index is English-heavy since seed domains are mostly English tech sites, but results in other languages do appear when available. Many Wikipedia pages in the index are from non-English editions (Spanish, French, German, etc.), so some Wikipedia results may be in a different language.
What's the difference between the mobile and desktop sites?
The mobile site (/mobile.html) is touch-optimized: a Google-style home screen with a "Luisearch" wordmark and "I'm Feeling Lucky" button, larger tap targets, safe-area padding for iPhone notches, and swipeable image previews. Both hit the same API and show the same results.
What happens when a page I searched for is dead?
Resurrection mode kicks in automatically: when a result URL fails to load, the site does a real liveness check via /api/resurrect. If the site is confirmed dead but was previously crawled, you still get the archived title/content from the index instead of a dead end.
What is the Index Galaxy?
luisearch.pages.dev/galaxy renders the whole index as an explorable galaxy — every crawled page is a star, clustered into constellations by domain and colored by a hash of the hostname. Drag to pan, pinch to zoom, tap a star to open the real page. It also polls the crawler's live status, so a light-burst pulses and a new star fades in every time a genuinely new page gets indexed — you're watching the index grow in real time.
What is the Index Globe?
/map is a real, rotating globe (plain canvas, real Natural Earth coastline data, no external map library) showing the top indexed hosts geolocated by actual DNS + IP geolocation. You can also look up any domain live and drop a highlighted pin for it.
What is Nexus?
Nexus is a full multi-user chat platform built into the LuisHae family — servers, channels, DMs, roles, polls, calls, and file/image sharing, all under real accounts. Realtime updates (new messages, presence, typing, reactions) push over a genuine WebSocket connection (/api/nexus/ws) instead of polling, with an automatic long-poll fallback if a client's network blocks WebSocket upgrades.
Does Nexus support voice messages or transcription?
Yes — voice clips sent in Nexus are transcribed automatically via a native faster-whisper service running directly on the host (no Docker, no external API call), currently on the medium model for better accuracy. The transcript comes back through /api/nexus/transcribe.
What is LuisPaper?
LuisPaper (at /ai) turns a topic or question into a structured, long-form AI research report — title, abstract, headed sections, conclusion, and a real numbered bibliography — grounded only in actual Luisearch search results, streamed in as it's generated. It's a separate feature from the short inline AI answer box that appears above regular search results.
What is AI Chat?
A separate ChatGPT-style multi-turn chat at /ai/chat, with its own account system (distinct from Luisearch's own accounts, Nexus, and LuisPaper's). It's powered by DeepSeek and does not use web search grounding. You can attach an image — it's described by a real vision model first, then that description is handed to DeepSeek so it can answer about the image naturally.
How does the 🖼 Images tab work?
As the crawler indexes pages, it extracts every <img> tag and stores the src, alt text, and source page URL in a separate images database. When you click the Images tab and search, results are matched against the alt text. Live count via /api/image-stats.
How does the 🎬 Videos tab work?
A dedicated video crawler scrapes YouTube search results across 60+ topic queries (programming, science, math, education, and more) and stores video metadata — title, thumbnail, duration, channel — in a separate videos database. No videos are downloaded; tapping a result opens YouTube directly. Live count via /api/video-stats.
What's in the Downloads tab?
A separate crawler indexes real downloadable files — Linux ISOs, Apple IPSW firmware, GGUF AI models, and common app installers — from official mirrors and archives (Ubuntu, Debian, Arch, Fedora, ipsw.me, Hugging Face, and more), storing title, category, version, size, and a direct download URL. It runs continuously, not as a one-time pass.
How many images and videos are indexed?
Live counts are shown right below the search bar on the homepage. You can also check the API directly:

/api/image-stats{"images": N}
/api/video-stats{"videos": N}

Don't trust a hardcoded number here — both counts are growing continuously, check the live endpoints.
What happens when the Cloudflare Tunnel URL changes?
The tunnel URL (trycloudflare.com) changes when the server restarts. When that happens, the BASE URL in the frontend scripts needs to be updated and the site redeployed. The public luisearch.pages.dev domain always stays the same for the static frontend.
Can I export search results?
Yes — on the desktop site there's an Export button in the toolbar that lets you download results as JSON, CSV, or a plain list of URLs. Useful for batch processing or saving a result set.