API Reference

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.

๐Ÿ“–
Full OpenAPI reference: if your device is on the same network, browse the complete, interactive schema at http://eyeofthetiger.local/docs.
๐Ÿš€
Just getting started? The Quick Start guide walks you through getting your camera onto your network step by step.

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:

InterfaceBase URLUse for
HTTP APIhttp://eyeofthetiger.local/v1/Scripts, automation, direct curl calls
MCP serverhttp://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.

๐Ÿ”’
Every mutating request (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.

MethodPathResponse
GET/v1/snapshot[?quality=full]JPEG bytes

Record a video clip

Record a fixed-length clip in one request and download the MP4.

MethodPathDescription
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.

MethodPathDescription
GET/v1/statusReturn {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):

LevelResolutionBitrate
high1920ร—10805 Mbps
medium1280ร—7202.5 Mbps
low854ร—480800 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.

MethodPathDescription
GET/v1/live-stream.mjpgMJPEG preview. Use <img src="/live-stream.mjpg">. One local viewer shares the stream.
POST/v1/live-stream/startStart live streaming for remote viewing
POST/v1/live-stream/stopStop 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.

MethodPathDescription
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.aacLive 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/startStart chunked continuous audio recording, which shares the single disk quota with video
POST/v1/audio/continuous-recording/stopStop 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.

MethodPathDescription
POST/v1/appsInstall an app from a manifest + build-context tarball
GET/v1/appsList installed apps with live status
POST/v1/eventsReport a structured event from an app
GET/v1/eventsList 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.