Integration API v1.0 / source-aligned

One system.
Four ways in.

Query live state, control every automation-safe app surface, schedule work, poll for changes, and deliver callbacks through WebSocket, Web API, App Intents, or URL schemes. A loopback MCP endpoint gives local agents the same contract.

Current · July 31, 2026 JSON over HTTP / WS / WSS iOS 27 Siri discovery Local MCP
LIVE CONTRACT
GET 127.0.0.1:8766/v1/query/current-show
{ "ok": true, "result": { … } }
action show.control { "command": "go" }
event request.completed
same request works through all four APIs
Discover, do not guess. Query capabilities, send discover, call GET /v1/capabilities, or use sybilsight_capabilities over MCP. The returned catalog is authoritative for the installed build. A machine-readable OpenAPI 3.1 document describes the loopback routes and schemas.

Request and response envelopes

Universal JSON request
{
  "id": "client-generated-id",
  "method": "query",
  "resource": "current-show",
  "parameters": { "limit": 50 },
  "callbackURL": "https://automation.example/sybilsight/result",
  "callbackHeaders": { "X-Request": "client-generated-id" }
}

method is one of discover, query, action, schedule, poll, subscribe, or unsubscribe. Query requests set resource; action requests set action. IDs are echoed unchanged.

Universal JSON response
{
  "type": "integration_response",
  "requestId": "client-generated-id",
  "ok": true,
  "result": { /* resource or action result */ },
  "timestamp": "2026-07-31T18:45:00.000Z"
}

Failures set ok: false and include error.code, error.message, and optional structured error.details. Additive fields may appear; integrations should ignore fields they do not recognize.

Queryable resources

ResourceOptional parametersReturns
capabilitiesAPI version, transports, auth, and the complete resource/action catalog.
statusApp readiness, foreground state, connectivity, live work, and automation counts.
appsid, filter, runningCatalog apps with lifecycle, compatibility, display access, and visibility.
running-appsRunning and foregrounded apps and miniapps.
showsid, filterSaved Shows library.
current-showLive show, cue, standby, deck, hold, duck, camera, and timer state.
routinesid, filterVisible routine library, triggers, branches, anchors, readiness, and armed state.
current-routineLive routine text, choices, reveal state, and candidate match.
listsDiscovery across all list-like collections.
quicklistid, completedQuicklist items, focus, completion, and glasses presentation state.
variablesid, filterPersistent third-party integration variables.
queuesQueue discovery and sizes.
peek-queueid, limitPeek inbox/history, active queue, current item, and unread state.
tasksCurrent show, routine, app, and integration-automation work.
settingsid, filterRedacted settings snapshot; secrets and endpoint credentials are never returned.
devicesGlasses, case, ring, WebSocket, phone, battery, and wear state.
captionsfilter, limitRecent finalized captions and speaker labels.
galleryfilter, limitDownloaded media and gallery sync state.
integrationsid, filterConfigured routine integrations with credentials and resolved URLs redacted.
schedulesidPersisted scheduled action jobs and last-run state.
pollsidPersisted resource polls, cadence, fingerprint, and delivery state.
callbacksidSchedules and polls configured for outbound callback delivery.
navigationCurrent app route and navigation stack.
eventslimitUp to the most recent 200 Integration API events.

Controllable actions

DomainActionsInputs
Appsapp.start, app.stop, app.foreground, app.hide, app.show, app.display-accessid; display-access also takes allowed.
Showsshow.open, show.close, show.controlid; or command for any Shows action.
Routinesroutine.start, routine.stop, routine.rearm, routine.enable, routine.branch, routine.revealid, value?, anchor?, set?; enabled; or zero-based index.
Quicklistquicklist.add, quicklist.rename, quicklist.toggle, quicklist.remove, quicklist.clear, quicklist.presenttitle, id, and/or enabled as applicable.
Variablesvariable.set, variable.delete, variable.clearname and any JSON value.
Queuesqueue.enqueue, queue.load, queue.select, queue.next, queue.previous, queue.clearvalue/source/show, values/seconds/show, or id.
Peekpeek.text, peek.cleartext.
Captionscaptions.start, captions.stop, captions.search, translation.setquery/limit or enabled.
Statusstatus-bar.set, status-bar.templateenabled or template.
Glassesglasses.connect, glasses.disconnect, glasses.brightnesslevel from 0 through 100 where applicable.
Assistantassistant.ask, assistant.activate, recording.setquestion or enabled.
Displaydisplay.reveal, display.notify, display.clear, camera.startseconds or text where applicable.
Systemnavigation.open, settings.set, callback.testurl/path; key/value; or url/payload.
Schedulesschedule.create, schedule.delete, schedule.runrequest/runAt/intervalSeconds/repeatCount/callbackURL, or id.
Pollspoll.create, poll.delete, poll.runresource/intervalSeconds/callbackURL/changedOnly, or id.

Actions are deliberately limited to app-owned, automation-safe controllers. They do not expose bearer tokens, saved credentials, raw Keychain records, arbitrary filesystem access, or unrestricted process execution.

Two trust domains. The cloud socket uses the performer’s session-scoped core token. The loopback socket uses the separate Integration API token returned by the authenticated Get Integration API Token App Intent. Keep both out of logs, screenshots, source control, and shared shortcuts.
Cloud endpoint
wss://api.sybilsight.com/glasses-ws
Local endpoint
ws://127.0.0.1:8766/v1/ws
Envelope
{ "type": "…" }
Liveness
ping every 15 seconds

Connect to the cloud channel

Derive the socket from the configured backend by converting https to wss (or http to ws) and replacing the path with /glasses-ws. The iOS client sends these query items:

WebSocket URL
wss://api.sybilsight.com/glasses-ws?token=CORE_TOKEN&livekit=true&udpEncryption=true
1. Open the socketSupply the current core token and optional media capability flags in the query.
2. Wait for connection_ackThe acknowledgement may include UDP audio host, port, user ID, and encryption configuration.
3. Exchange typed JSONEvery text message has a string type. Audio can fall back to binary WebSocket frames until UDP is ready.
4. Maintain livenessAnswer client ping messages with pong. A missed pong triggers bounded reconnect with exponential backoff.

Connect to the local universal channel

The loopback socket is designed for a trusted utility or agent on the same device. Pass the Integration API token in the socket query, then exchange the universal request and response envelopes from the shared contract. The listener binds only to 127.0.0.1.

Loopback WebSocket
ws://127.0.0.1:8766/v1/ws?token=ssapi_REDACTED

→ request
{ "id": "shows-1", "method": "query", "resource": "shows" }

← response
{ "type": "integration_response", "requestId": "shows-1", "ok": true, "result": [ … ] }

Send { "method": "subscribe" } to receive pushed integration_event frames, and { "method": "unsubscribe" } to stop them. Request execution events include the source, request ID, method, resource or action name, success state, and timestamp.

Cloud → client display command
{
  "type": "display_event",
  "view": "text",
  "packageName": "com.example.integration",
  "durationMs": 5000,
  "layout": {
    "text": "The spectator chose the seven of hearts."
  }
}

Client → cloud messages

typeImportant fieldsPurpose
pingLiveness probe; the cloud answers with pong.
udp_registeruserIdHashRegisters the client for the negotiated UDP audio path.
glasses_connection_statemodelName, deviceModel, status, timestamp, wifiReports connection and Wi-Fi state.
glasses_battery_updatelevel?, charging?, timestampReports fresh glasses power state.
VADstatusReports whether voice activity is currently detected.
button_pressbuttonId, pressType, timestampReports a physical button action.
touch_eventdevice_model?, gesture_name?, source?, is_ring?, container_*?, selected_item_*?Reports touchpad, ring, or container navigation gestures.
swipe_volume_statusenabled, timestampReports the swipe-volume toggle state.
switch_statusswitch_type, switch_value, timestampReports a hardware switch change.
head_positionposition, timestampReports up or down.
phone_subscription_updatesubscriptions, timestampPublishes the stream types needed by phone-side consumers.
location_updatelat, lng, accuracy?, correlationId?, timestampReturns a requested or streamed location.
audio_play_responserequestId, success, error?, duration?Completes an audio-play request.
stream_statuskind, status, streamId?, timestamp?, resolvedConfig?Reports stream lifecycle and recovery state.
keep_alive_ackstreamId, ackId, timestamp?Acknowledges keep_stream_alive.
integration_responserequestId, ok, result?, error?, timestampCompletes a cloud integration_request.
integration_eventname, data, timestampPushes subscribed Integration API lifecycle and request events.

Binary frames carry encoded microphone audio when the negotiated UDP path is not yet ready. The client prefers UDP after registration and probe acknowledgement.

Cloud → client messages

typeImportant fieldsClient behavior
connection_ackudpHost / udp_host?, udpPort / udp_port?, userId?, udpEncryption?Completes session readiness and configures optional UDP audio.
pongClears the outstanding liveness probe.
microphone_state_changerequiredData[]Updates cloud microphone/transcription requirements.
display_eventview, layout?, durationMs?, packageName?, sessionId?Renders a managed display event through the app’s display arbitration.
photo_requestrequestId, appId, webhookUrl?, size?, compress?, sound?, authToken?, exposureTimeNs?, saveToGallery?Captures a glasses photo and returns its result.
rgb_led_controlrequestId, packageName?, action, color?, ontime?, offtime?, count?Controls the glasses LED.
camera_fov_setfov, roiPositionClamps FOV to 62–118 and applies center/top/bottom ROI.
audio_play_requestrequestId?, audioUrl?, appId/packageName?, volume?, stopOtherAudio?Plays remote audio and emits audio_play_response.
audio_stop_requestappId/packageName?Stops audio owned by that app, or the current request.
start_streamstreamUrl / rtmpUrl / srtUrl / whipUrl, streamId?, keepAlive?, keepAliveIntervalSeconds?, sound?, video?, audio?Starts phone/glasses streaming with the resolved configuration.
keep_stream_alivestreamId, ackIdRefreshes the stream lease and returns an acknowledgement.
stop_streamStops the active stream.
start_video_recordingrequestId?, save?, sound?Starts a recording; a request ID is generated when omitted.
stop_video_recordingrequestId?Stops the matching recording.
data_streamstreamType, data?Forwards typed cloud data into subscribed local miniapps.
phone_stream_status / phone_managed_stream_statusrequestId? plus status payloadForwards phone-side stream status to the local runtime.
set_location_tiertierChanges the app’s location update tier.
request_single_locationaccuracy, correlationIdRequests one location and returns a correlated location_update.
show_wifi_setupreason?Prompts the performer to connect glasses to Wi-Fi.
app_state_change / app_started / app_stoppedsessionId?, packageName?, error?, timestamp?Refreshes app catalog lifecycle state.
integration_requestid, method, resource?, action?, parameters?, callbackURL?Executes the universal Integration API contract and answers with integration_response. Subscribe/unsubscribe also manage event delivery.
connection_error / auth_errormessage?, error?, reason?Tears down the socket and enters bounded recovery.

Recovery behavior

Socket failures, malformed incoming envelopes, missed pongs, and server connection errors trigger reconnect. The delay follows an exponential curve with a one-second floor, a 60-second cap, and jitter. A valid connection_ack resets the curve. Manual disconnect cancels recovery.

Local base URL: http://127.0.0.1:8766/v1. The server binds to loopback only and is available while the Sybil Sight process is active. Send Authorization: Bearer INTEGRATION_API_TOKEN on every functional route.
Query and control locally
# Query running apps
curl "http://127.0.0.1:8766/v1/query/running-apps" \
  -H "Authorization: Bearer $SYBILSIGHT_API_TOKEN"

# Fire the next show cue
curl -X POST "http://127.0.0.1:8766/v1/actions/show/control" \
  -H "Authorization: Bearer $SYBILSIGHT_API_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"command":"go"}'

Local routes

MethodPathBehavior
GET/healthNo auth Process health and API version.
GET/.well-known/sybilsight-apiNo auth Local discovery document.
GET/v1 or /v1/capabilitiesComplete discovery catalog.
GET/v1/query/{resource}Queries any catalog resource. Query items become typed parameters; requestId sets the response correlation ID.
POST/v1/actions/{action/path}Runs an action. Slashes are joined with dots, so show/control resolves to show.control.
POST/v1/requestsExecutes a complete universal request envelope.
GET POST/v1/schedulesLists schedules or creates one.
DELETE/v1/schedules/{id}Deletes one persisted schedule.
POST/v1/schedules/{id}/runRuns one schedule immediately without changing its saved cadence.
GET POST/v1/pollsLists polls or creates one.
DELETE/v1/polls/{id}Deletes one persisted poll.
POST/v1/polls/{id}/runRuns one poll immediately.
POST/mcpMCP Streamable HTTP JSON-RPC endpoint.

Requests are capped at 1 MiB. Responses use the universal envelope, include Cache-Control: no-store, and return 401 for a missing or invalid token. CORS preflight is supported for a same-device browser utility, but bearer authentication is still required.

Existing cloud client API

Cloud base URL: https://api.sybilsight.com. These legacy client resources use the performer’s separate session-scoped core token, not the local Integration API token. Unless marked public, send Authorization: Bearer CORE_TOKEN.

Older cloud resources commonly use { "success": true, "data": … }; newer v2 photo and managed-stream resources return their payload directly. Follow the shape shown for the endpoint.

Core cloud resources

MethodPathBody / response
GET/api/client/min-versionPublic Envelope with required and recommended.
GET/api/client/user/settingsEnvelope containing the user’s settings object.
POST/api/client/user/settings{ "settings": { … } }
POST/api/client/device/stateCurrent glasses/device state JSON.
POST/api/client/locationCurrent location payload.
POST/api/client/calendarCalendar payload authorized by the performer.
POST/api/client/notificationsnotificationId, app, title, content, priority, timestamp, packageName
POST/api/client/notifications/dismissednotificationId, notificationKey, packageName
POST/api/client/audio/configureformat plus optional lc3Config.
GET/api/client/livekit/tokenEnvelope with url and token.
POST/api/client/goodbyeEnds the active client session.

Apps and settings

MethodPathBody / response
GET/api/client/appsEnvelope containing the app catalog.
POST/apps/{packageName}/startEnvelope containing isRunning.
POST/apps/{packageName}/stopStops the package.
POST/api/apps/uninstall/{packageName}Uninstalls an eligible package.
GET/appsettings/{packageName}App metadata and settings definitions.
POST/appsettings/{packageName}{ "key": "…", "value": … }
POST/api/auth/generate-webview-token{ "packageName": "…" } → direct token response.
POST/api/auth/hash-with-api-keystringToHash, packageName → direct hash response.
POST/api/app-uptime/app-pkg-health-check{ "packageName": "…" }success.

Photos and managed streams

MethodPathBody / response
POST/api/client/photo/responserequestId, timestamp, success, plus photoUrl or error fields.
POST/api/v2/client/photo/requestDirect requestId, uploadUrl, uploadToken.
GET/api/v2/client/photo/{requestId}200: direct photoUrl, mimeType, size; otherwise code, message.
DELETE/api/v2/client/photo/{requestId}Releases the photo slot.
POST/api/v2/client/streams/managed/provisionOptional restreamDestinations[]; returns ingest and playback URLs.
GET/api/v2/client/streams/managed/{liveInputId}/statusDirect isConnected, timestamps, and optional viewer count.
DELETE/api/v2/client/streams/managed/{liveInputId}Tears down the managed stream.

Feedback, incidents, and account lifecycle

MethodPathPurpose
POST/api/client/feedbackFeedback plus optional sanitized phone state.
POST/api/incidentsCreates an incident and returns incidentId.
POST/api/incidents/{incidentId}/logsUploads phone log entries.
POST/api/incidents/{incidentId}/attachmentsMultipart files under the form field files.
POST/api/account/request-deletionStarts account deletion confirmation.
DELETE/api/account/confirm-deletionrequestId, confirmationCode

Routine HTTP integrations

For performer-configured web services, a routine can send or receive data without using the cloud client endpoints above:

  • Default output: an HTTP(S) output sends { "value": "…" } as JSON with POST.
  • GET output: prefix the template with get ; Sybil Sight removes the prefix and fetches the resolved URL.
  • Reusable integrations: Settings → Integrations can poll a configured URL, extract a chosen JSON key or bare response, and optionally write with JSON or form encoding.
  • Substitution: {value} and configured field placeholders are percent-encoded before insertion.
Routine web output
# JSON POST
https://example.com/reveal
# body: {"value":"seven of hearts"}

# Plain GET with encoded substitution
get https://example.com/reveal/{value}
Endpoint: http://127.0.0.1:8766/mcp using MCP Streamable HTTP JSON-RPC and protocol version 2025-06-18. Include the Integration API bearer token on every request.
ToolInputsPurpose
sybilsight_capabilitiesDiscover all resources, actions, transports, and automation features.
sybilsight_queryresource, parameters?, callbackURL?Read any resource in the catalog.
sybilsight_actionaction, parameters?, callbackURL?Perform any catalog action.
sybilsight_scheduleaction, parameters?, runAt?, intervalSeconds?, repeatCount?, callbackURL?Create a one-time or repeating scheduled action.
sybilsight_pollresource, parameters?, intervalSeconds, changedOnly?, callbackURL?Create a persisted resource poll.
MCP initialize and tool call
# initialize
{ "jsonrpc": "2.0", "id": 1, "method": "initialize",
  "params": { "protocolVersion": "2025-06-18", "capabilities": {}, "clientInfo": { "name": "stage-agent", "version": "1" } } }

# tools/call
{ "jsonrpc": "2.0", "id": 2, "method": "tools/call",
  "params": { "name": "sybilsight_query",
    "arguments": { "resource": "tasks" } } }

initialize, notifications/initialized, ping, tools/list, and tools/call are implemented. Tool results contain both text JSON and structuredContent, so an MCP client can inspect fields without reparsing display text.

Before running: open Sybil Sight at least once, pair and save the glasses for connection actions, and grant any permission the chosen action needs. When iOS launches an intent in the background, Sybil Sight waits briefly for its live app model to become ready.

Pre-registered Siri phrases

Apple limits each app to ten pre-registered App Shortcuts. The standard Sybil Sight build uses the curated set below; every other action remains available in the Shortcuts editor.

ShortcutExample phraseNotes
Peek Text“Peek text with Sybil Sight”Also: “Show text on my glasses…”
Ask SybilSight“Ask Sybil Sight a question”Standard edition; omitted from Sybil for Nexus.
Show Peek Value“Show a value with Sybil Sight”Momentary value with optional auto-clear.
Clear Peek“Clear my glasses with Sybil Sight”Clears the active peek.
Start Captions“Start captions with Sybil Sight”Starts the on-device captions app.
Stop Captions“Stop captions with Sybil Sight”Stops captions.
Control SybilSight“Control Sybil Sight”Prompts for any indexed action in the universal catalog.
GO (Next Cue)“Go with Sybil Sight”Standard edition; omitted from Sybil for Nexus.
Connect Glasses“Connect my glasses with Sybil Sight”Uses the saved default glasses.
Enable App“Enable an app with Sybil Sight”Prompts for a catalog app entity.

Universal automation actions

Shortcut actionInputsOutput
Query SybilSightIndexed resource, optional parameters JSONUniversal response JSON for any queryable resource.
Control SybilSightIndexed action, optional parameters JSONUniversal response JSON for any catalog action.
Schedule SybilSight ActionAction, parameters JSON, first run?, interval, number of runs, callback URL?Created schedule record as JSON.
Poll SybilSightResource, parameters JSON, interval, changed-only, callback URL?Created poll record as JSON.
List SybilSight AutomationsAll schedules and polls as JSON.
Cancel SybilSight AutomationAutomation ID, is-poll flagDeletion response JSON.
Get Integration API TokenLocal device authenticationThe private loopback Web/WebSocket/MCP bearer token.

Parameters JSON accepts the same object used by WebSocket and Web API calls. For example, choose Control SybilSight, select Show Control, and pass { "command": "go" }. This keeps new catalog actions usable from Shortcuts without adding a bespoke intent for every parameter combination.

iOS 27 Siri and system discovery

Resources and actions conform to AppEntity and IndexedEntity, have stable identifiers and searchable summaries, and are proactively indexed with Core Spotlight at app startup. The generic Query and Control intents accept those entities directly, while the curated App Shortcuts provide natural-language entry phrases. On iOS 27, the universal intents explicitly target the main app process so they can reach the live app model. Together these hooks give Siri a discoverable entity/action graph in addition to every existing typed intent.

Sybil Sight’s show-control and mentalism concepts are a custom domain, so the app uses custom App Intents and indexed entities for the universal catalog. Apple App Schemas should be adopted only when an action semantically matches an Apple-defined domain; declaring a mismatched system schema would make Siri behavior less reliable.

All Shortcuts actions

ActionInputsResult / effect
Enable AppAppStarts the selected catalog app.
Disable AppAppStops the selected catalog app.
Peek TextTextShows persistent wrapped text in the Peek Text region.
Peek ImageImage fileShows a greyscale bitmap in the Peek Image region.
Clear PeekClears the active optical peek while retaining history.
Show Peek ValueValue, seconds (0–600)Shows a value; 0 keeps it visible until cleared.
Show Peek QueueOne value per line, secondsLoads the queue and shows its first value.
Capture Spoken PeekArms the next spoken phrase as a hidden peek; requires a listening show.
Next Peek / Previous PeekMoves through the staged queue.
Start Captions / Stop CaptionsToggles live captions.
Start Translation / Stop TranslationToggles translated captions; start also starts captions.
Show Status Bar / Hide Status BarToggles the glasses status strip.
Connect Glasses / Disconnect GlassesConnects the saved pair or disconnects the current pair.
Start Recording / Stop RecordingControls Assistant voice recording.
Ask SybilSightQuestionReturns a string and shows the answer on the glasses.
Start RoutineRoutine, value?, anchor?, set values?Returns Boolean success and starts any armed routine.
Shows ControlActionGO, Back, Panic, Kill Audio, Hold, Duck, Undo, Standby, Mic, or Camera.
GO (Next Cue) / PanicDedicated show-control actions.
Reveal DisplaySeconds (0 = configured duration)Temporarily opens the tap-to-display gate.
Show NotificationMessageShows text on the glasses and posts to Notification Center.
Glasses Connected?Returns Boolean.
Get Glasses BatteryReturns 0–100, or -1 when unknown.
Get Glasses StatusReturns a connection, battery, charging, wear, case, and ring summary string.
Get WeatherReturns last fetched weather, or “Unavailable.”
Get TemperatureReturns Fahrenheit, or -1000 when unavailable.
Search CaptionsQuery, max results (1–50)Returns an array of matching caption lines.
Set Brightness0–100Persists and applies display brightness.
Set Tap to DisplayEnabled, secondsChanges reveal mode and optionally its duration.
Set Status Bar TemplateTemplateSets tokens such as $TIME12$ $DATE$ $GBATT$ $WEATHER$.
Set Peek Render ModeRender as imageChooses bitmap or native text/shapes for Propless peeks.
Start CameraStarts the glasses camera app.
Activate Voice AssistantStarts one listening turn.

Start a routine with pre-filled anchors

The Start Routine action accepts a main value, an anchor to open immediately, and newline- or semicolon-separated name=value pairs. Only slots declared by the routine are accepted.

Set Values input
name=Sarah Jane
city=Hilo
sign=Scorpio

The action returns true when delivered, or false with a performer-readable reason such as “routine is not armed,” so the Shortcut can branch safely.

Use sybilsight:// as the canonical scheme. The app also registers com.sybilsight:// and com.sybilsight.app:// aliases. cuekiller://cue/{UUID} is reserved for show cue NFC tags.

Universal API routes

Query, act, and receive a callback
sybilsight://api/query/current-show?requestId=show-1

sybilsight://api/action/show.control?command=go&requestId=go-1

sybilsight://api/query/tasks\
?callback=stageutility%3A%2F%2Fsybilsight-result\
&requestId=tasks-1

The route is api/query/{resource} or api/action/{dot-separated-action}. Query items are type-inferred as Boolean, number, JSON, or string. A percent-encoded parameters JSON object can supply nested values and overrides same-name scalar query items.

When callback or callbackURL is present, Sybil Sight opens that URL with requestId, ok=1|0, and either result or error. The result/error value is a Base64-encoded universal response JSON document.

Complete envelope route

For nested parameters, schedules, polls, or a client-generated callback envelope, encode the universal request JSON as Base64URL (replace + with -, / with _, and omit padding):

Base64URL request
sybilsight://api/request?payload=BASE64URL_ENCODED_REQUEST_JSON

Compact legacy links

Launch an existing compact action
sybilsight://peek?value=seven%20of%20hearts&seconds=5
sybilsight://shows/go
sybilsight://notify?text=Your%20next%20table%20is%20ready

Peeks and display

RouteParametersBehavior
peekvalue (required), seconds? (default 5; 0 persists)Shows an auto-clearing value.
peek/texttext?, show? (1/true/yes)Opens Peek Text; show=1 sends the text immediately.
peek/imageOpens the Peek Image screen.
peek/queuevalues=a|b|c, seconds?Loads a pipe-separated queue and shows its first value.
peek/captureArms the next spoken phrase as a peek.
peek/clearClears the active peek.
peek/nextAdvances the queue.
peek/previousSteps the queue backward.
revealseconds?Temporarily reveals a gated display.
notifytext (required)Shows a glasses and Notification Center message.
brightnesslevel=0…100Clamps, saves, and applies brightness.
tap-to-displayon?, seconds?Turns tap-to-display on/off and optionally sets its duration.
set-templatetext (required)Updates the status bar template.
peek-modeimage?Selects image or text/shape render mode.

Apps, assistant, and translation

RouteParameters / suffixBehavior
apps/{packageName}Opens the catalog app when it has a route.
apps/{packageName}/startAliases: enableStarts the package without navigating.
apps/{packageName}/stopAlias: disableStops the package without navigating.
apps/{packageName}/settingsappName?Opens that package’s settings.
captions/start | stopToggles captions.
status-bar/start | stopToggles the status bar.
translation/start | stopToggles translated captions.
connect | disconnectConnects the saved glasses or disconnects.
cameraStarts the glasses camera app.
record/start | stopControls Assistant recording.
askq or question (required)Asks the assistant and shows a non-empty answer on the glasses.
voice/activateStarts one voice-assistant listening turn.

Shows and routines

RouteParametersBehavior
shows/{action}go, back, panic, killaudio, jumptop, hold, duck, undo, next, previous, decknext, deckprev, mic, cameraFires the action without navigating. shows alone opens Shows.
routine/{token}value?, anchor?, repeatable set.{name}?Starts the armed routine with the matching App-link UUID token.
routinesOpens the routine library.
proplessOpens the Propless suite.
Routine inbound link
sybilsight://routine/8F4A0000-0000-0000-0000-0000000000C2\
?value=Scorpio\
&anchor=birthday\
&set.city=Hilo\
&set.name=Sarah%20Jane

The token is generated by a routine’s App link start trigger. The routine must be armed, unknown set. keys are ignored, and anchor names match case-insensitively.

Navigation routes

These routes bring the app to a screen: home, settings, glasses, assistant, terminal, mirror, mirror/fullscreen, mirror/display-regions, miniapps/gallery, degrees/actors, and degrees/wikipedia. Links received during launch or onboarding are parked and replayed after the authenticated home screen is ready.

Terminal pairing route

sybilsight://terminal/pair?host=HOST&port=3456&token=TOKEN&provider=codex&name=My%20Mac&cwd=%2Fpath

host and token are required; the port defaults to 3456 and must be 1–65535. Treat the pairing token as a secret.

On demand versus scheduled

ModeUseLifecycle
On demandSend a query/action through any transport, or call schedule.run / poll.run with an existing automation ID.Executes immediately and does not move the saved next-run date.
One timeCreate a schedule with runAt, no positive interval, and repeatCount: 1.Disables itself after the run; the record remains queryable.
RepeatingAdd intervalSeconds and set repeatCount to a positive count, or 0/unset for unlimited.Persists in app storage and advances after each scheduled run.
PollSelect a resource, its query parameters, an interval, and optional changedOnly.Fingerprints the structured result and can suppress unchanged callback deliveries.
Create a changed-only poll
curl -X POST "http://127.0.0.1:8766/v1/polls" \
  -H "Authorization: Bearer $SYBILSIGHT_API_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{
    "name": "Current task watcher",
    "resource": "tasks",
    "intervalSeconds": 5,
    "changedOnly": true,
    "callbackURL": "https://automation.example/sybilsight/task"
  }'

Schedule object

A schedule contains a nested universal request, an ISO 8601 runAt, optional interval and run count, optional callback URL and headers, and a name. For convenience, schedule creation also accepts top-level action and parameters. Poll creation accepts top-level resource and query parameters.

Schedule a repeating action
{
  "method": "schedule.create",
  "parameters": {
    "name": "Keep captions ready",
    "action": "captions.start",
    "parameters": {},
    "runAt": "2026-07-31T23:00:00Z",
    "intervalSeconds": 900,
    "repeatCount": 4
  }
}

Callback delivery

Any immediate Web, WebSocket, App Intent, MCP, schedule, or poll request can carry callbackURL and optional callbackHeaders. Sybil Sight sends the universal response as an application/json POST with a 15-second timeout. Only HTTPS URLs, or HTTP on 127.0.0.1, localhost, or ::1, are accepted. URLs with embedded credentials are rejected.

Custom headers are forwarded except Host, Content-Length, Transfer-Encoding, and Proxy-*. A 2xx response marks delivery successful. Delivery success/failure appears in the event stream, while callback URLs are redacted in stored events.

iOS execution model: interval timers run precisely while Sybil Sight is active. Jobs are persisted, and an overdue enabled job runs when the app process resumes, but iOS may suspend the app in the background. Do not treat this as a hard real-time daemon or rely on second-level timing while the app is suspended.

Encoding

All WebSocket and Web API text payloads are UTF-8 JSON. URL-scheme query values and routine URL substitutions must be percent-encoded. In particular, encode spaces, ampersands, hashes, percent signs, slashes inside path values, and any user-provided text.

Identifiers

Package names are stable reverse-DNS strings such as com.sybilsight.peek_text. Routine App-link tokens and request IDs are opaque: copy them exactly and do not derive meaning from them.

Action versus navigation

Control links such as shows/go, peek/clear, and brightness are action-only and intentionally leave the performer on the current screen. Screen routes replace or extend the app’s navigation path.

Errors and retries

Local API failures use a stable machine-readable error code such as invalid_request, unknown_resource, unknown_action, missing_argument, not_found, or app_unavailable. Cloud Web API requests accept any 2xx response as transport success, then validate the endpoint’s response shape. A cloud response indicating NO_ACTIVE_SESSION causes one session recovery attempt and one request retry. WebSocket reconnect is automatic and bounded; callers should not add an aggressive retry loop.

Versioning

The universal contract reports apiVersion: "1.0" through discovery. Ignore additive JSON fields you do not understand, preserve opaque identifiers, and discover capabilities at startup. For cloud compatibility, also check /api/client/min-version. Validate critical show workflows against the exact app build you will perform with.

Live-show rule: rehearse any integration with the same phone, glasses, network, permissions, routine state, callback service, and server environment you will use on stage. Never put a token or a spectator’s private data into a public URL.