API reference
The complete list of HTTP endpoints your camera serves on your home network. Your own scripts and tools talk straight to the camera, with no cloud and no account needed.
http://eyeofthetiger.local/docs.Your device on the network
Once your camera is set up, it lives on your home network at http://eyeofthetiger.local. There are two ways to talk to it, depending on what you are building:
| Interface | Base URL | Use for |
|---|---|---|
| HTTP API | http://eyeofthetiger.local/v1/ | Scripts, automation, direct curl calls |
| MCP server | http://eyeofthetiger.local/mcp/ | AI assistants that support MCP |
Want to check it is reachable first? Open http://eyeofthetiger.local/docs in your browser. You will get a full, interactive API reference served straight from the camera. If you would rather connect an AI assistant over MCP, head to the MCP Reference.
POST/PUT/PATCH/DELETE) needs an X-EOT-Local: 1 header, e.g. curl -X POST -H "X-EOT-Local: 1" .... It stops a page you merely visit in your browser from silently controlling your camera (CSRF) โ plain reads (GET) need no header.HTTP API
Take a snapshot
Returns a JPEG still grabbed instantly from the camera stream. Pass ?quality=full for a one-shot 12ย MP photo (4608ร2592), which is slower but provides full sensor resolution. Full captures cannot run while a clip is recording.
| Method | Path | Response |
|---|---|---|
| GET | /v1/snapshot[?quality=full] | JPEG bytes |
Record a video clip
Record a fixed-length clip in one request and download the MP4.
| Method | Path | Description |
|---|---|---|
| GET | /v1/clip?duration_s=<1โ60> | Record a clip (default 10s) and return the MP4 |
Status & quality
One call returns the full device activity picture. The response includes camera and microphone together. camera.local_streaming is the LAN-only MJPEG preview (GET /live-stream.mjpg), camera.live_stream.streaming is the remote live stream, which shares the camera encoder with clips and continuous recording, and microphone.connected indicates whether a USB microphone is attached. Quality is camera-only, where one preset drives both stills and clips. Audio has no quality tier.
| Method | Path | Description |
|---|---|---|
| GET | /v1/status | Return {camera, microphone} with full recording, streaming, and quality state |
| POST | /v1/quality?level=<high|medium|low> | Set the camera quality preset |
camera.busy is true while a clip, continuous recording, or local preview holds the encoder. microphone.busy covers its own clip, continuous recording, or streaming. Check microphone.connected before calling any /audio/* endpoint, which returns 503 if no microphone is attached.
Quality presets (one tier drives both stills and clips):
| Level | Resolution | Bitrate |
|---|---|---|
| high | 1920ร1080 | 5 Mbps |
| medium | 1280ร720 | 2.5 Mbps |
| low | 854ร480 | 800 Kbps |
For a one-off full-resolution photo (4608ร2592), request a snapshot with ?quality=full, which does not change the preset.
Live stream
Live streaming provides sub-second latency. On the local network the device serves a plain MJPEG stream that you can view directly. Remote live streaming is also available through the cloud platform, where the portal provides a playback URL for viewers.
| Method | Path | Description |
|---|---|---|
| GET | /v1/live-stream.mjpg | MJPEG preview. Use <img src="/live-stream.mjpg">. One local viewer shares the stream. |
| POST | /v1/live-stream/start | Start live streaming for remote viewing |
| POST | /v1/live-stream/stop | Stop live streaming |
These endpoints require X-EOT-Local: 1 or the device's own UI origin. For remote access, use the cloud API POST /api/v1/cameras/:id/live-stream/start|stop and GET /api/v1/cameras/:id/live-stream instead.
Audio (USB microphone)
When a USB microphone is attached, the device exposes a parallel audio API. Check GET /v1/status and confirm microphone.connected is true first. All /audio/* routes return 503 if no microphone is attached and 409 while the microphone is busy, which includes an active clip, continuous recording, or /audio/stream.aac.
| Method | Path | Description |
|---|---|---|
| GET | /v1/audio/clip?duration_s=<1โ60> | Record a fixed-length audio clip (ADTS AAC) and return it. This is the microphone equivalent of /clip. |
| GET | /v1/audio/stream.aac | Live audio stream (audio/aac, chunked ADTS). This is the microphone equivalent of /live-stream.mjpg. One listener at a time. |
| POST | /v1/audio/continuous-recording/start | Start chunked continuous audio recording, which shares the single disk quota with video |
| POST | /v1/audio/continuous-recording/stop | Stop continuous audio recording and finalize the in-progress segment |
| POST | /v1/audio/continuous-recording/limit?max_bytes=<n> | Set the shared continuous-recording disk cap. This is one budget with a second, audio-namespaced path for API parity. |
| POST | /v1/audio/continuous-recording/segment-length?segment_seconds=<n> | Set per-segment duration for continuous audio |
Library
GET /v1/library?kind=snapshot|clip|continuous|audio_clip|audio_continuous lists the browsable capture library. /library/{date}/{time} streams the entry (video/mp4, image/jpeg, audio/aac), /thumbnail for video/snapshot. Audio entries join the same library as video.
Apps & events
Beyond stills and clips, your EOT-1 can build and run your own long-running programs directly on its hardware: watching the live stream, controlling continuous recording, and reporting structured events back, with no separate computer required. See Apps for the full concept guide, a minimal working example, and ideas for what to build.
| Method | Path | Description |
|---|---|---|
| POST | /v1/apps | Install an app from a manifest + build-context tarball |
| GET | /v1/apps | List installed apps with live status |
| POST | /v1/events | Report a structured event from an app |
| GET | /v1/events | List events, filterable by type and date |
Ready to wire this up to an AI assistant? See the Integration Guides, or try the Quick Checks to confirm every endpoint is reachable.