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.
Core Search
GET
/api/search
›
Search the index. Results are scored with BM25 + title boost + host name boost. Returns up to 200 results. Automatically detects Base64-encoded queries and decodes them before searching.
q*stringThe search query
keyoptstringYour API key (or use Authorization header)
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/search?q=linux+kernel"
Example response
{
"results": [
{
"id": 42,
"url": "https://kernel.org",
"title": "The Linux Kernel Archives",
"snippet": "The Linux kernel is the core of the Linux operating system..."
},
// up to 200 results, ordered by relevance
]
}
GET
/api/stats
›
Returns index statistics. Useful for showing users how large the index is.
Example request
GET https://stevens-predictions-get-feet.trycloudflare.com/api/stats
Example response
{
"pages": 5000,
"terms": 123004
}
GET
/api/hosts
›
Returns all indexed domains with their page counts, sorted by most pages. Up to 500 domains.
Example request
GET https://stevens-predictions-get-feet.trycloudflare.com/api/hosts
Example response
[
{ "host": "en.wikipedia.org", "count": 124 },
{ "host": "github.com", "count": 113 },
// ...
]
GET
/api/crawl-status
›
Returns the URL currently being crawled, or null if the crawler is idle.
Example request
GET /api/crawl-status
Example response
{
"url": "https://wiki.archlinux.org/title/Pacman",
"crawling": true
}
GET
/api/image-search
›
Search the image index by alt text. Returns up to 100 images with their source URL, alt text, and the page they were found on. Images are crawled from indexed pages and stored in a separate database.
q*stringSearch query — matched against image alt text
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/image-search?q=macbook"
Example response
{
"results": [
{
"src": "https://www.apple.com/newsroom/images/macbook-pro.jpg",
"alt": "MacBook Pro 14-inch",
"page_url": "https://www.apple.com/newsroom/2024/01/...",
"host": "www.apple.com"
}
]
}
GET
/api/image-stats
›
Returns the total number of images indexed.
Example request
GET /api/image-stats
Example response
{
"images": 1200
}
GET
/api/video-search
›
Search the video index by title and description. Returns up to 50 videos with thumbnail, duration, channel, and platform. Videos are crawled from YouTube and stored in a separate database.
q*stringSearch query — matched against title and description
Example request
GET /api/video-search
Example response
{
"results": [
{
"title": "Python Tutorial for Beginners",
"url": "https://www.youtube.com/watch?v=...",
"thumbnail": "https://i.ytimg.com/vi/.../mqdefault.jpg",
"duration": "1:22:45",
"channel": "Programming with Mosh",
"platform": "YouTube",
"description": "Learn Python in this full course..."
}
]
}
GET
/api/video-stats
›
Returns the total number of videos indexed.
Example request
GET /api/video-stats
Example response
{
"videos": 1043
}
POST
/api/keys/register
›
Request an API key. The key is generated and active immediately -- no manual approval needed.
Example request
POST https://stevens-predictions-get-feet.trycloudflare.com/api/keys/register
Content-Type: application/json
{
<span class="key">"name"</span>: <span class="string">"Luis"</span>,
<span class="key">"email"</span>: <span class="string">"luis@example.com"</span>,
<span class="key">"usecase"</span>: <span class="string">"personal search widget"</span>
}
Example response
{
"key": "ls_a1b2c3d4e5f6...",
"status": "approved",
"message": "Key approved."
}
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
}
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
}
Media Search
GET
/api/audio-search
›
Search crawled audio clips by title/description.
qoptstringSearch query; empty returns latest 50
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/audio-search"
Example response
{
"results": [
{
"id": 44,
"title": "Interview clip",
"url": "https://example.com/clip.mp3",
"duration": "12:04",
"description": "...",
"source_page": "https://example.com/",
"host": "example.com",
"format": "mp3"
}
]
}
GET
/api/audio-stats
›
Total indexed audio clip count.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/audio-stats"
Example response
{
"audio": 3021
}
GET
/api/download-search
›
Search the downloads index (ISOs, IPSW firmware, IPAs, installers). Deduplicates to the newest version of each product unless all=1.
qoptstringSearch text
categoryoptstringFilter, e.g. "ipsw"
allopt0 or 1Include every version, not just the newest
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/download-search"
Example response
{
"results": [
{
"title": "Ubuntu 24.04.2 Desktop amd64",
"url": "https://example.com/ubuntu-24.04.2.iso",
"category": "linux",
"version": "24.04.2",
"platform": "amd64",
"size": 5928837120,
"ext": "iso",
"host": "releases.ubuntu.com"
}
]
}
GET
/api/download-stats
›
Total indexed downloads + a per-category breakdown.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/download-stats"
Example response
{
"downloads": 8842,
"categories": {
"linux": 3120,
"ipsw": 940,
"ipa": 210
}
}
GET
/api/downloads-crawl-status
›
Whether the downloads crawler is currently running, plus its last status line.
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/downloads-crawl-status"
Example response
{
"status": "crawling releases.ubuntu.com",
"crawling": true
}
POST
/api/reverse-image-search
›
Upload an image; a vision model captions it, then that caption drives both a regular web search and the image index search.
file*fileImage file: png/jpg/jpeg/webp/gif, max 8MB
Example request
curl -X POST "https://stevens-predictions-get-feet.trycloudflare.com/api/reverse-image-search" \
-H "Content-Type: application/json" \
-d '{...}'
Example response
{
"query": "golden retriever puppy in grass",
"uploaded_url": "https://luisearch.pages.dev/api/img/9c1f...jpg",
"web_results": [
{
"url": "https://example.com/",
"title": "...",
"snippet": "..."
}
],
"image_results": [
{
"src": "https://example.com/dog.jpg",
"alt": "golden retriever puppy",
"page_url": "https://example.com/",
"host": "example.com"
}
]
}
GET
/api/gifproxy
›
Server-side fetch of a remote GIF, bypassing hotlink/referer blocks.
u*stringRemote GIF URL
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/gifproxy"
Example response
null
GET
/api/gifvid
›
Transcode a remote (or crawled) GIF into a looping MP4 so it animates on iOS/all browsers.
u*stringRemote GIF URL
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/gifvid"
Example response
null
GET
/api/nexus/gifs
›
Search Luisearch's own crawled GIFs (verified actually-animated ones only); results come back as looping MP4 URLs.
qoptstringSearch text; empty returns a random set
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/nexus/gifs"
Example response
{
"gifs": [
{
"alt": "excited cat",
"vid": "/api/gifvid?u=https%3A%2F%2Fexample.com%2Fcat.gif"
}
]
}
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
}
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
}
GET
/api/vn/search
›
Search Voidnet users and posts.
q*string
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/vn/search"
Example response
{
"users": [
{
"username": "alice",
"bio": "",
"follower_count": 12
}
],
"posts": [
{
"id": "p1",
"text": "linux tips"
}
]
}
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"
}
GET
/api/wiki/search
›
Search wiki page titles/content.
q*string
Example request
curl "https://stevens-predictions-get-feet.trycloudflare.com/api/wiki/search"
Example response
{
"results": [
{
"slug": "linux-basics",
"title": "Linux Basics"
}
]
}
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"])
}
}
import java.net.URL
import org.json.JSONObject
fun search(query: String) {
val url = "https://stevens-predictions-get-feet.trycloudflare.com/api/search?q=" +
java.net.URLEncoder.encode(query, "UTF-8")
val text = URL(url).readText()
val results = JSONObject(text).getJSONArray("results")
for (i in 0 until results.length()) {
val r = results.getJSONObject(i)
println("${r.getString("title")} — ${r.getString("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:
•
•
Don't trust a hardcoded number here — both counts are growing continuously, check the live endpoints.
•
/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.