This document describes the HTTP, WebSocket, WebDAV, and discovery endpoints available while CrossInk is in File Transfer or Calibre Wireless mode.
- HTTP server: port 80
- WebSocket upload server: port 81
- UDP discovery listener: port 8134
- WebDAV: port 80, handled by the same HTTP server
Examples use crosspoint.local. If mDNS does not resolve on your network, use
the IP address shown on the device screen.
| Method | Path | Purpose |
|---|---|---|
GET |
/ |
Home/status page |
GET |
/files |
File manager page |
GET |
/settings |
Web settings page |
GET |
/fonts |
SD-card font manager page |
GET |
/js/jszip.min.js |
JavaScript asset used by the file manager |
curl http://crosspoint.local/api/statusResponse:
{
"version": "1.0.0",
"ip": "192.168.1.100",
"mode": "STA",
"rssi": -45,
"freeHeap": 123456,
"uptime": 3600,
"device": "X4"
}| Field | Type | Description |
|---|---|---|
version |
string | Firmware version |
ip |
string | Device IP address |
mode |
string | "STA" for joined Wi-Fi or "AP" for hotspot mode |
rssi |
number | Wi-Fi RSSI in dBm; 0 in AP mode |
freeHeap |
number | Free heap in bytes |
uptime |
number | Seconds since boot |
device |
string | "X3" or "X4" hardware detection |
Lists files and folders under a directory.
curl "http://crosspoint.local/api/files?path=/Books"Query parameters:
| Parameter | Required | Default | Description |
|---|---|---|---|
path |
No | / |
Directory to list |
Response:
[
{"name":"MyBook.epub","size":1234567,"isDirectory":false,"isEpub":true},
{"name":"Notes","size":0,"isDirectory":true,"isEpub":false}
]Hidden dotfiles are omitted unless the device setting showHiddenFiles is
enabled. System Volume Information and XTCache are always hidden/protected.
Downloads a file from the SD card.
curl -OJ "http://crosspoint.local/download?path=/Books/MyBook.epub"Query parameters:
| Parameter | Required | Description |
|---|---|---|
path |
Yes | File path to download |
Protected dotfiles, System Volume Information, and XTCache cannot be
downloaded. EPUB files are served as application/epub+zip; other files use
application/octet-stream.
Uploads a file with HTTP multipart form data.
curl -X POST -F "file=@mybook.epub" "http://crosspoint.local/upload?path=/Books"Query parameters:
| Parameter | Required | Default | Description |
|---|---|---|---|
path |
No | / |
Destination directory |
Successful response:
File uploaded successfully: mybook.epub
Notes:
- Existing files with the same name are overwritten.
- EPUB cache data for the uploaded path is cleared after a successful upload.
- HTTP upload uses a 4 KB write buffer before flushing to the SD card.
Creates a folder.
curl -X POST -d "name=NewFolder&path=/" http://crosspoint.local/mkdirForm parameters:
| Parameter | Required | Default | Description |
|---|---|---|---|
name |
Yes | - | New folder name |
path |
No | / |
Parent folder |
Renames a file.
curl -X POST -d "path=/Books/old.epub&name=new.epub" http://crosspoint.local/renameForm parameters:
| Parameter | Required | Description |
|---|---|---|
path |
Yes | Existing file path |
name |
Yes | New file name, not a path |
Only files can be renamed through this endpoint. The old EPUB cache path is cleared before the rename.
Moves a file into an existing folder.
curl -X POST -d "path=/Books/mybook.epub&dest=/Read" http://crosspoint.local/moveForm parameters:
| Parameter | Required | Description |
|---|---|---|
path |
Yes | Existing file path |
dest |
Yes | Existing destination folder |
Only files can be moved through this endpoint. The old EPUB cache path is cleared before the move.
Deletes one or more files or empty folders.
curl -X POST -d "path=/Books/mybook.epub" http://crosspoint.local/delete
curl -X POST -d 'paths=["/Books/old.epub","/OldFolder"]' http://crosspoint.local/deleteForm parameters:
| Parameter | Required | Description |
|---|---|---|
path |
Yes, unless paths is provided |
Single path to delete |
paths |
Yes, unless path is provided |
JSON array of paths to delete |
Protected items cannot be deleted. Non-empty folders are rejected. EPUB cache data for deleted files is cleared.
Returns a streamed JSON array of editable settings. Each item contains common fields plus type-specific fields.
curl http://crosspoint.local/api/settingsExample item:
{
"key": "fontSize",
"name": "Font Size",
"category": "Reader",
"type": "enum",
"value": 1,
"options": ["10 pt", "12 pt", "14 pt", "16 pt"]
}Types:
| Type | Extra fields |
|---|---|
toggle |
value (0 or 1) |
enum |
value, options |
value |
value, min, max, step |
string |
value |
The font-family setting includes SD-card font families when they are installed.
For enum settings, value is the selected option's display index in the
returned options array. It is not necessarily the raw firmware enum value.
Applies a partial settings update from a JSON object.
curl -X POST \
-H "Content-Type: application/json" \
-d '{"fontSize":2,"showHiddenFiles":1}' \
http://crosspoint.local/api/settingsSuccessful response:
Applied 2 setting(s)
Lists installed SD-card font families.
curl http://crosspoint.local/api/fontsResponse:
{
"maxFamilies": 128,
"families": [
{
"name": "Literata",
"sizes": [12, 14, 16, 18],
"files": [
{"name": "Literata_12.cpfont", "size": 123456}
]
}
]
}Uploads one .cpfont file into a family folder.
curl -X POST \
-F "family=Literata" \
-F "file=@Literata_12.cpfont" \
http://crosspoint.local/api/fonts/uploadThe handler validates the family name, .cpfont filename, and CPFONT magic
bytes before accepting the file.
Successful response:
{"ok":true}Deletes an installed font family.
curl -X POST \
-H "Content-Type: application/json" \
-d '{"family":"Literata"}' \
http://crosspoint.local/api/fonts/deleteSuccessful response:
{"ok":true}Lists saved OPDS servers. Passwords are never returned.
curl http://crosspoint.local/api/opdsResponse:
[
{
"index": 0,
"name": "My Catalog",
"url": "http://calibre.local:8080/opds",
"username": "reader",
"hasPassword": true
}
]Adds or updates an OPDS server. Include index to update an existing entry.
If password is omitted during an update, the existing password is preserved.
curl -X POST \
-H "Content-Type: application/json" \
-d '{"name":"My Catalog","url":"http://calibre.local:8080/opds","username":"reader","password":"secret"}' \
http://crosspoint.local/api/opdsDeletes an OPDS server by index.
curl -X POST \
-H "Content-Type: application/json" \
-d '{"index":0}' \
http://crosspoint.local/api/opds/deleteLists saved Wi-Fi networks. Passwords are never returned.
curl http://crosspoint.local/api/wifiResponse:
[
{
"index": 0,
"ssid": "HomeWiFi",
"hasPassword": true,
"isLastConnected": true
}
]Adds or updates a saved Wi-Fi network. Include index to update an existing
entry. If password is omitted during an update, the existing password is
preserved.
curl -X POST \
-H "Content-Type: application/json" \
-d '{"ssid":"HomeWiFi","password":"secret"}' \
http://crosspoint.local/api/wifiDeletes a saved Wi-Fi network by index.
curl -X POST \
-H "Content-Type: application/json" \
-d '{"index":0}' \
http://crosspoint.local/api/wifi/deleteThe WebSocket path is used for fast binary uploads from the file manager and Calibre plugin workflows.
Connection:
ws://crosspoint.local:81/
Protocol:
- Client sends text:
START:<filename>:<size>:<path> - Server replies
READY - Client sends binary chunks
- Server sends
PROGRESS:<received>:<total>every 64 KB or at completion - Server sends
DONEwhen complete orERROR:<message>on failure
Example session:
Client -> START:mybook.epub:1234567:/Books
Server -> READY
Client -> [binary chunk]
Server -> PROGRESS:65536:1234567
...
Server -> DONE
Error messages include:
| Message | Cause |
|---|---|
ERROR:Upload already in progress |
A second upload was started before the first completed |
ERROR:Invalid START format |
Malformed START message or invalid size token |
ERROR:Failed to create file |
Destination file could not be opened |
ERROR:No upload in progress |
Binary data arrived without a matching START |
ERROR:Upload overflow |
Client sent more bytes than declared |
ERROR:Write failed - disk full? |
SD write failed |
Incomplete WebSocket uploads are deleted on disconnect or error.
The same HTTP server registers a WebDAV-compatible handler for file manager clients.
Supported methods:
OPTIONS, GET, HEAD, PUT, DELETE, PROPFIND, MKCOL, MOVE, COPY, LOCK, UNLOCK
Notes:
PUTwrites to a temporary.davtmpfile first, then renames it into place.- Protected paths are rejected.
LOCKandUNLOCKare accepted for client compatibility only. The server does not implement full WebDAV Class 2 locking semantics such as persistent locks or lock discovery.
The server listens on UDP port 8134. When it receives the text payload
hello, it replies to the sender with:
crosspoint (on <hostname>);81
The final field is the WebSocket upload port.
- Device joins an existing 2.4 GHz Wi-Fi network.
crosspoint.localis advertised with mDNS when available./api/statusreturns"mode": "STA"and RSSI in dBm.
- Device creates an open hotspot named
CrossPoint-Reader. - The device shows a Wi-Fi QR code and URL QR code.
- The fallback IP is typically
192.168.4.1. /api/statusreturns"mode": "AP"and"rssi": 0.
Calibre Wireless starts the same web server in STA mode and displays setup instructions plus WebSocket upload progress on the device screen.