API conventions

How every Falcon API route behaves: base URL, Bearer keys, the JSON envelope, model selectors, body limits, quota buckets, error codes, retries and health.

Updated 2026-09-19

On this page

Overview #

The Falcon API is one HTTPS service that fronts every series: LIM, Waymark, Express and Response. It speaks JSON only, authenticates every model call with a Bearer token, wraps every response in the same envelope, and meters calls in five preview quota buckets. This page is the contract shared by all routes; each model page documents its own request and response bodies in its API chapter.

Falcon is in private preview. Self-serve API keys and accounts are paused. See Access for what a preview key covers.

The API itself runs on 2 vCPU / 2 GiB and is kept warm with one minimum instance, so a request carries no wait for the API to start. The in-process models — ELIM, LIM, LIM Nano, LIM3D and LIM3D-XL — answer in well under a second; the proxied routes add the latency of the service behind them, stated on each model page.

Base URL and transport #

  • The base URL is issued with your preview key. All paths below are relative to it.
  • Every request and response body is JSON; send Content-Type: application/json.
  • A trailing slash on a path is ignored (/v1/intention/ is /v1/intention).
  • Responses carry Cache-Control: no-store and are never cacheable.
  • Model routes are POST. GET is used only for the health, usage and voice-catalogue routes.

Authentication #

Send the key in the Authorization header:

http
POST /v1/intention HTTP/1.1
Authorization: Bearer fln_…
Content-Type: application/json
  • Preview API keys begin with fln_. Session tokens, which begin with fls_, are accepted on the same routes but are short-lived and belong to the account layer rather than to integrations.
  • A missing, malformed or revoked token returns 401 with error: "invalid_credentials".
  • A token whose account is not in good standing returns 402 with error: "payment_required"; the request is not processed and does not count against quota.
  • Keys are checked before the body is read, so an unauthenticated request never consumes quota.

The envelope #

Every JSON response has a boolean ok at the top level.

json
{ "ok": true, "engine": "waymark", "model": "waymark", "text": "doorway on your right foreground.", "from": "sketch" }
json
{ "ok": false, "error": "quota_exceeded", "kind": "spatial" }
  • On success the remaining fields are route-specific. Model routes name the model that answered in engine (/v1/spatial, /v1/move, /v1/airspace/read, /v1/airspace/plan, /v1/intention3d, /v1/chat, /v1/sound, /v1/speak, /v1/transcribe) or in result.model (/v1/intention). The audio routes return the audio itself as wav_base64, a base64-encoded RIFF/WAVE file.
  • On failure error is a stable snake_case code; some errors add a detail field (kind, hint, maxBytes). Never match on HTTP status alone — the code is the contract.
  • result is null, with ok: true, when a model was configured but declined to score the input (for example an empty window). Treat null as “no opinion”, not as an error.

Routes #

RouteMethodModelBody limitQuota bucket
/v1/intentionPOSTELIM (default), LIM via model: "lim" or LIM Nano via model: "lim-nano"; the response names the one that scored in result.model64,000 bytesintention
/v1/intention3dPOSTLIM3D-XL (default), or LIM3D via model: "lim3d"; the response names the size in model256,000 bytes; at most 64 stepsintention
/v1/spatialPOSTWaymark, from a sketch or from media24,000,000 bytes; decoded image ≤ 6,000,000 bytes, decoded video ≤ 15,000,000 bytesspatial
/v1/movePOSTWaymark Extra, from a sketch and a goal64,000 bytes; sketch ≤ 6,000 characters, goal ≤ 300spatial
/v1/airspace/readPOSTWaymark Flight, from an airspace scene and a flight track, beside the exact check64,000 bytes; ≤ 24 volumes, 1–12 track pointsspatial
/v1/airspace/planPOSTWaymark Flight, a route from start to goal, validated by the exact checker64,000 bytes; ≤ 24 volumesspatial
/v1/chatPOSTCognitio64,000 bytes; text ≤ 2,000 characters, at most 8 history turnscomplete
/v1/soundPOSTExpress Cue — releasedtext ≤ 400 characters; byte limit fixed with the routeaudio
/v1/speakPOSTExpress Voice — released; seven voices, lj the defaulttext ≤ 600 characters; byte limit fixed with the routeaudio
/v1/transcribePOSTExpress2Text — releasedone WAV, FLAC or OGG clip ≤ 12 MB decoded (≤ 60 s transcribed)audio
/v1/voicesGET— (the voice catalogue)none
/v1/usageGETnone
/healthGETnone; no authentication

Body limits apply to the raw request body. A body over the limit is refused; depending on the route that is 400 bad_json or, on the airspace routes, a closed connection with no JSON body.

/v1/intention #

Body: text (required, the current turn) and optional model: "elim" (the default when omitted), "lim" or "lim-nano"; any other value answers 400 unknown_model with models listing the three accepted names. The turn is wrapped as a one-line conversation window, and result.model echoes which model scored it.

json
{ "text": "what's the difference between etf and mutual fund", "model": "lim" }
json
{
  "ok": true,
  "result": {
    "action": "allow",
    "trajectory": "research",
    "harm": "none",
    "steer": "none",
    "pAction": 1,
    "pHarm": 1,
    "pTrajectory": 1,
    "model": "lim",
    "rule": "benign-traj≥0.28"
  }
}

pAction, pHarm and pTrajectory are the winning-class probabilities of the corresponding heads (0–1). rule names the threshold rule that decided the action. message, present on some steer and abort results, is a suggested short reply in a casual register, safe to replace. Labels are listed on Output vocabularies.

/v1/intention3d #

Body: sketch (required), steps (required, a non-empty array of observed steps), optional mover (default "you"), optional with_notes, and optional model, "lim3d-xl" (the default) or "lim3d"; any other value answers 400 bad_model. Steps with a non-finite t, x, y or z are dropped; the first 64 are kept. The response repeats the frame sentence, names the size that answered in model and adds a plain-words summary.

json
{
  "ok": true,
  "engine": "lim3d",
  "frame": "approx m; x right, y ahead, z up; viewer at origin",
  "model": "lim3d-xl",
  "result": {
    "intent": "pass_ahead",
    "pIntent": 1,
    "target": "none",
    "targetIndex": -3,
    "pTarget": 1,
    "phase": "walking",
    "hazard": "obstacle_ahead",
    "pHazard": 0.9994,
    "action": "caution",
    "pAction": 0.9519,
    "advice": "sidestep_left",
    "endpoint": { "dx": 0.246, "dy": 5.246, "dz": 0.205 },
    "eta": 4.648,
    "rule": "action-caution≥0.45",
    "model": "lim3d-xl",
    "summary": "You're just passing straight through, about 5m and 5s to go. Watch: sidestep left around the obstacle."
  }
}

LIM3D-XL answers unless the body carries model: "lim3d", in which case LIM3D answers on the same route and the response carries a warning string — at the top level and inside result — saying that LIM3D is the low-latency option, identifies the target less often than LIM3D-XL and degrades sharply when steps are missing. The sentence is fixed per version and is quoted on the LIM3D page; engine is always lim3d, the name of the route, and model is the size that answered.

/v1/spatial #

Body: either sketch (a scene sketch) or one media field — image, image_base64, video or video_base64, holding base64 or a data:…;base64, URL — plus optional question (alias text, default "what's the layout?"), mimeType (alias mime_type), filename and model"waymark" (the default) or its alias "waymark-indoor", which selects the same weights; any other value answers 400 bad_model. With media, the service runs server-side vision sketching (third-party model) to produce the sketch first; the response then includes the sketch it built and from is "image" or "video". With a sketch, from is "sketch".

json
{
  "sketch": "kind: scene\nviewer: eye-level on sidewalk\nobjects: doorway (right foreground); retaining wall (center background)\nrelations: doorway in front of retaining wall; doorway right of center; retaining wall behind doorway\nrelative: doorway closer than retaining wall",
  "question": "what's in front"
}
json
{ "ok": true, "engine": "waymark", "model": "waymark", "text": "doorway on your right foreground.", "from": "sketch" }

Waymark is sampled with at most 72 new tokens at temperature 0.3 (sketch) or 0.35 (media). engine is "waymark" when Waymark answered and model echoes the requested value; when model is waymark-indoor and the organisation's Waymark service predates that alias, the route answers 503 model_unavailable and the call is not counted; if Waymark is unavailable after a media sketch, the sketching model answers from the sketch and engine carries its identifier. Since 2026-09-16 Waymark runs on the same GPU service as Waymark Extra: an answer takes 0.6–1.1 s once the service is warm, but the service scales to zero, so the first call after a quiet period pays a cold start of one to two minutes and the route answers 503 waymark_unavailable or 502 spatial_failed until it is ready.

/v1/move #

Body: sketch (required, a scene sketch, at most 6,000 characters), goal (required, the movement request in plain words, at most 300 characters), optional mover ("you" for the viewer, the default, or a person label from the sketch), optional max_new_tokens (default 400, clamped to 32–480) and temperature (default 0.2, clamped to 0–1). Waymark Extra generates a movement trace; the route parses it into steps and adds a plain-words summary.

json
{ "sketch": "kind: scene\nviewer: eye-level on sidewalk\nobjects: planter box (center foreground); doorway (right midground); hedge (left midground)\nrelations: planter box in front of doorway; hedge left of doorway", "goal": "walk to the doorway", "mover": "you" }
json
{ "ok": true, "engine": "waymark-extra", "frame": "approx m; x right, y ahead, z up; viewer at origin", "mover": "you", "trace": "t=0.0s (0.0, 0.0, 0.0) ahead-right | doorway ~6m ahead | ahead: planter box ~2m\n…\narrive t=5.4s (3.0, 6.1, 0.0) doorway | planter box behind", "steps": [ { "t": 0.0, "x": 0.0, "y": 0.0, "z": 0.0, "heading": "ahead-right", "notes": ["doorway ~6m ahead", "ahead: planter box ~2m"], "arrive": false } ], "summary": "You reach the doorway in about 5s, ending ~3m right and ~6m ahead of where the photo was taken." }

trace and steps are abbreviated; the full shape is on the Waymark Extra page. The model runs on a GPU service that scales to zero: the first call after a quiet period pays a cold start of one to two minutes, during which the route answers 503 move_warming with a Retry-After of 60 seconds (503 move_unavailable means no movement service is configured at all). Once warm a twelve-step trace takes about 5–10 s depending on route length, and a CUDA warm-up at start-up means the first trace after a cold start is no slower. 413 text_too_long means the sketch or the goal is over its character limit.

/v1/airspace/read and /v1/airspace/plan #

Both routes take an airspace scene: volumes, at most 24 cylinders or rings in a local east/north frame in nautical miles with altitudes in feet MSL, and mover (drone, light, helicopter or jet). Waymark Flight is decision support and education only and is not certified for navigation; every response carries a notice saying so.

/v1/airspace/read also takes track, 1–12 points {t_s, x_nm, y_nm, alt_ft} in ascending t_s, and returns the model’s reading in model, the exact geometric check of the same input in exact, the more cautious of the two advisories in advisory (at least turn_away when the exact check puts the mover inside an active hazard) and the names of the fields on which they differ in disagreements.

json
{ "volumes": [ { "id": "R1", "kind": "restricted", "center": { "x_nm": 0, "y_nm": 0 }, "radius_nm": 2, "floor_ft": null, "ceiling_ft": 6000 } ], "track": [ { "t_s": 0, "x_nm": -6, "y_nm": 0, "alt_ft": 2500 }, { "t_s": 30, "x_nm": -5.1, "y_nm": 0, "alt_ft": 2500 } ], "mover": "light" }
json
{ "ok": true, "engine": "waymark-flight", "model": { "inside": [], "tier": "none", "under_shelf": false, "next_event": { "volume": "R1", "kind": "enter_lateral", "eta_s": 101 }, "hazard_entry": true, "margin_lat_nm": 3.1, "margin_vert_ft": 10000, "ceiling_ft": 18000, "advisory": "turn_away" }, "exact": { "inside": [], "tier": "none", "under_shelf": false, "next_event": { "volume": "R1", "kind": "enter_lateral", "eta_s": 104 }, "hazard_entry": true, "margin_lat_nm": 3.1, "margin_vert_ft": 10000, "ceiling_ft": 18000, "advisory": "turn_away" }, "advisory": "turn_away", "disagreements": [], "notice": "Decision support and education only. Not certified for navigation." }

/v1/airspace/plan takes start {x_nm, y_nm, alt_ft}, goal ({x_nm, y_nm, alt_ft?} or {land_at: volumeId}), optional allow_controlled (default false) and an optional track. It returns source (model when the model’s proposal passed the exact validator, oracle when the exact planner decided), feasible, reason when no route exists, up to 8 waypoints {x_nm, y_nm, alt_ft}, the validator’s verdict in check and latency_ms. Served routes are always valid under the exact checker; an infeasible plan answers 200 with feasible: false. The full shapes and a worked scene are on the Waymark Flight page.

Waymark Flight runs on a CPU service that scales to zero: the first call after a quiet period waits a few seconds and may answer 503 flight_warming with a Retry-After of 20 seconds.

/v1/chat #

Body: text (required, the current turn, at most 2,000 characters), optional history (up to eight prior turns as { "role": "user" | "assistant", "text": "…" }; older turns are dropped), optional max_new_tokens (8–256; the service itself caps generation at 96) and temperature (0–1.5, default 0.7). The route forwards the turn to Cognitio and returns its reply; 503 chat_unavailable when the Cognitio service is not configured.

json
{ "text": "long day. talk me through dinner ideas that take ten minutes?", "history": [ { "role": "user", "text": "hey" }, { "role": "assistant", "text": "hey — what's up?" } ], "temperature": 0.7 }
json
{ "ok": true, "engine": "cognitio", "text": "…" }

/v1/sound #

Body: text (required, a description of a sound, at most 400 characters after whitespace is collapsed) and optional seed (an integer that makes the render repeatable). Express Cue predicts a kind and a set of synthesis parameters and a deterministic engine renders them to 24 kHz mono WAV of 0.1–6 s. The response carries the audio and the parameters that produced it, so a host can edit and re-render them.

json
{ "text": "short bright chime, two notes rising", "seed": 7 }
json
{ "ok": true, "engine": "express-cue", "duration_seconds": 0.9, "params": { "kind": "chime", "duration": 0.9, "seed": 7 }, "wav_base64": "UklGR…" }

params is abbreviated; the full object, and the kind catalogue, are on the Express Cue page. The route has served Express Cue since 2026-09-13.

/v1/speak #

Body: text (required, English, at most 600 characters after whitespace is collapsed) and optional voice, one of the seven catalogue ids: lj (the LJSpeech voice, the default when the field is absent), female-1, female-2, female-3, male-1, male-2 or male-3 (the six Hi-Fi voices added on 2026-09-14). Express Voice speaks in that voice, echoes its id in voice and names itself in engine. It returns 16 kHz mono WAV. Behind the route is one GPU service (NVIDIA L4) holding all seven voices, kept warm with one minimum instance; the API passes the voice id through. A 14-word sentence renders in about 2.2–2.5 s and a short line in about 0.7 s.

json
{ "text": "Your table is ready. Please make your way to the front desk.", "voice": "male-3" }
json
{ "ok": true, "engine": "express-voice", "voice": "male-3", "duration_seconds": 3.5, "wav_base64": "UklGR…" }

A voice outside the catalogue answers 400 unknown_voice, and the body lists the accepted ids in voices. While the voice service is loading — a replacement instance, since the service is kept warm — the route answers 503 speak_warming with a Retry-After: 30 header; 503 speech_unavailable means no voice service is configured.

/v1/transcribe #

Body: audio (required; alias audio_base64, wav, wav_base64), one WAV, FLAC or OGG clip as base64, plain or as a data:…;base64, URL, at most 12 MB decoded; longer clips are transcribed for their first 60 seconds and the response says truncated: true. Any sample rate and channel count are accepted and resampled to 16 kHz mono. Express2Text returns lower-case English text with no punctuation.

json
{ "audio": "UklGRiQAAABXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YQ…" }
json
{ "ok": true, "engine": "express2text", "text": "your table is ready please make your way to the front desk", "duration_seconds": 3.5 }

A missing or empty clip answers 400 audio_required; a clip that is not decodable audio answers 400 bad_audio; one over 12 MB answers 400 audio_too_large with maxBytes. While the voice service (which hosts Express2Text) is replacing an instance the route answers 503 transcribe_warming with Retry-After: 30; an organisation whose dedicated voice service predates Express2Text answers 503 transcribe_unavailable, and neither is counted. Every successful call counts one unit against the audio bucket.

/v1/voices #

Not metered. Returns the voice catalogue: an object with ok, engine (express-voice), default (the id spoken when voice is omitted, lj) and voices, an array of entries each carrying exactly id, label, gender (F or M), accent and region (the recording source). It comes from the voice service and holds seven entries: lj and the six Hi-Fi voices. The payload carries no licence text; the Hi-Fi corpus's CC BY 4.0 attribution is carried on the Express Voice page and in the Express series notes. Abbreviated:

json
{ "ok": true, "engine": "express-voice", "default": "lj", "voices": [ { "id": "lj", "label": "en-US female 1", "gender": "F", "accent": "American", "region": "LJSpeech" }, { "id": "male-1", "label": "Male voice 1 (audiobook, en-US)", "gender": "M", "accent": "American", "region": "LibriVox audiobook" } ] }

The reference client also accepts a bare array of entries and drops any entry without an id.

Quotas #

Calls are metered in four preview quota buckets — intention (/v1/intention and /v1/intention3d), spatial (/v1/spatial, /v1/move, /v1/airspace/read and /v1/airspace/plan), complete (/v1/chat) and audio (/v1/sound, /v1/speak and /v1/transcribe; /v1/voices is not metered) — and counted per UTC calendar month. The period is the YYYY-MM of the current UTC date; counters reset when the month changes.

  • A call counts once, and only when it reaches the model: validation errors, 401, 402 and 503 do not count.
  • When a bucket is exhausted the route returns 429 with error: "quota_exceeded" and kind naming the bucket. The check runs before the body is read.
  • GET /v1/usage (authenticated) returns period, the usage counters and the quota allowance per bucket for the key’s account. A fourth counter, complete, appears in both objects and is not used by any route above.

Errors #

StatusCodeMeaning
400bad_jsonthe body is not valid JSON, or exceeds the route’s body limit
400text_required/v1/intention, /v1/reserve, /v1/chat, /v1/sound or /v1/speak called without a non-empty text
400text_too_long/v1/sound called with more than 400 characters of text, or /v1/speak with more than 600
400unknown_voice/v1/speak called with a voice that is not one of the seven catalogue ids; voices lists them
400sketch_and_steps_required/v1/intention3d called without a sketch or with no valid steps
400unknown_model/v1/intention called with a model that is not elim, lim or lim-nano; models lists the accepted values
400bad_model/v1/intention3d called with a model that is neither lim3d-xl nor lim3d, or /v1/spatial with one that is neither waymark nor waymark-indoor; models lists the accepted values
400sketch_required/v1/move called without a non-empty sketch
400goal_required/v1/move called without a non-empty goal
400bad_volumes/v1/airspace/read or /v1/airspace/plan called without a valid volumes array: missing, empty, over 24, a duplicate id, an unknown kind or an impossible shape
400bad_track/v1/airspace/read called without 1–12 track points in ascending t_s, or a track point is malformed
400bad_moveran airspace route called with a mover other than drone, light, helicopter or jet
400bad_start/v1/airspace/plan called without a valid start
400bad_goal/v1/airspace/plan called without a valid goal, or land_at names no volume in the scene
400sketch_or_media_required/v1/spatial called with neither a sketch nor a media field; hint explains the options
400bad_mediathe media field is not decodable base64 of a supported image or video type; hint lists the accepted forms
400image_too_largedecoded image over 6,000,000 bytes; maxBytes is included
400video_too_largedecoded video over 15,000,000 bytes; maxBytes is included
401invalid_credentialsmissing, malformed or revoked token
402payment_requiredthe account behind the token is not in good standing
404not_foundunknown route; the body links to the documentation and the API base
413text_too_long/v1/move called with a sketch over 6,000 characters or a goal over 300
422sketch_unavailablethe media was accepted but no usable sketch could be built from it
429quota_exceededthe bucket named in kind is used up for this UTC month
500internalan unexpected failure inside the service
502spatial_failedWaymark or the sketching step failed after a valid request
503move_warmingthe Waymark Extra GPU service is starting; retry after the Retry-After interval
502move_failedthe Waymark Extra service failed after a valid request, or returned a trace with no parseable step
502flight_failedthe Waymark Flight service failed after a valid request
503flight_warmingthe Waymark Flight CPU service is starting after a quiet period; retry after the Retry-After interval (20 s)
410route_withdrawn/v1/reserve (ERM, withdrawn 2026-09-20); successor names /v1/chat
502sound_failedthe Express Cue service failed after a valid request
502speech_failedthe voice service failed after a valid request
400audio_required/v1/transcribe called without a clip in audio (or its aliases)
400bad_audio/v1/transcribe clip is not decodable WAV, FLAC or OGG
400audio_too_large/v1/transcribe clip over 12 MB decoded; maxBytes is included
502transcribe_failedExpress2Text failed after a valid request
503transcribe_warmingthe voice service hosting Express2Text is loading; retry after the Retry-After interval (30 s)
503transcribe_unavailableno voice service is configured, or the organisation's dedicated voice service predates Express2Text; not counted
503speak_warmingthe voice service is loading (a replacement instance; the service is kept warm); retry after the Retry-After interval (30 s)
503lim3d_unavailablethe service has neither LIM3D-XL nor LIM3D weights loaded
503model_unavailable/v1/spatial asked for waymark-indoor and the organisation's Waymark service predates that alias (a dedicated service provisioned before 2026-09-19); not counted
503waymark_unavailablethe service has no Waymark endpoint configured, or the shared GPU service is still starting after a quiet period
503move_unavailablethe service has no Waymark Extra endpoint configured, or the GPU service is still warming up
503flight_unavailablethe service has no Waymark Flight endpoint configured, or it did not answer
503sound_unavailablethe service has no Express Cue endpoint configured
503speech_unavailablethe service has no voice endpoint configured

The audio codes — text_too_long, unknown_voice, sound_failed, speech_failed, sound_unavailable, speak_warming, speech_unavailable — follow the series pattern and are fixed with the routes.

Supported image types are JPEG, PNG, WebP, GIF, HEIC and HEIF; supported video types are MP4, MPEG, QuickTime, AVI, WebM, WMV, 3GPP and FLV. When mimeType is omitted the type is inferred from the data URL or the filename, defaulting to JPEG for images and MP4 for video.

Retries and loading #

The model services behind the API load their weights when an instance starts. The Falcon API and the Express Voice service are kept warm with one minimum instance each; Express Cue, the Waymark GPU service (Waymark and Waymark Extra), the Waymark Flight CPU service and Cognitio scale to zero after a quiet period. While a service is loading it answers 503; the convention across the series is one retry after 2.5 s, then treat the call as failed. The Falcon API applies this itself when it calls Waymark — a 503 or a timeout (45 s) from the Waymark service triggers a single 2.5 s wait and one retry before the route returns 502 spatial_failed — so a caller sees at most one such delay per request. The reference client applies the same rule to the Express services: a 45 s timeout, one 2.5 s wait and one retry on a 503 or a timeout.

For a 503 returned by the Falcon API itself (lim3d_unavailable, waymark_unavailable, move_unavailable, flight_unavailable, speech_unavailable) the same rule applies: retry once after 2.5 s, and if the second attempt also returns 503, stop; the service is not configured for that model rather than still loading. The exceptions are /v1/spatial and /v1/move, whose shared GPU service scales to zero — a cold start takes one to two minutes, so a host that sees 503 or 502 there after a quiet period should wait and try again after that window — and /v1/speak, where 503 speak_warming carries Retry-After: 30 and means the voice service is loading (only while an instance is replaced, since it is kept warm); wait that interval and try again. /v1/airspace/read and /v1/airspace/plan answer 503 flight_warming with Retry-After: 20 while the Waymark Flight service starts. Do not retry 400, 401, 402, 422 or 429; retrying 429 before the month changes cannot succeed.

Requests are not idempotent with respect to quota: a retried call that reaches the model counts again.

CORS #

The service answers OPTIONS with 204 and allows cross-origin requests only from the Falcon site origin, with the headers Authorization and Content-Type and the methods GET, POST, DELETE and OPTIONS. Browser code on any other origin cannot call the API directly; call it from your own server and keep the key there.

Health #

GET /health (alias /healthz) needs no token and reports which models the service can serve right now:

json
{
  "ok": true,
  "service": "falcon-api",
  "waymark": true,
  "lim3d": true,
  "limVariants": ["elim", "lim", "lim-nano"],
  "lim3dVariants": ["lim3d-xl", "lim3d"],
  "waymarkExtra": true,
  "expressCue": true,
  "expressVoice": true,
  "spatialImage": true,
  "spatialVideo": true
}
FieldMeaning
okalways true when the service is up
servicethe fixed string falcon-api
waymarka Waymark endpoint is configured
lim3da 3D intention model is loadable
limVariantsthe models selectable on /v1/intention: elim, lim and, when its bundle loaded, lim-nano
lim3dVariantsthe loaded sizes behind /v1/intention3d, lim3d-xl and lim3d
waymarkExtraa Waymark Extra endpoint is configured for /v1/move
expressCuean Express Cue service is configured for /v1/sound
expressVoicethe voice service is configured for /v1/speak (all seven voices)
spatialImage, spatialVideo/v1/spatial accepts image and video media

The payload also carries boolean flags for account-side features of the service; they are not model properties and are not documented here. A false for a model predicts the matching 503 code on its route.

Versioning #

Routes and envelope fields are stable within a model’s major version; a label added or removed, a renamed field or a changed frame is a major bump and is announced on the changelog. Fixed weights per version; the model does not learn from requests. See Status & versioning for the status vocabulary and the semver rules.