Agent interface

Start with /openapi.json (the contract), then /api/v1/recipes.json (the index). Errors are RFC 9457 application/problem+json; validation errors carry JSON Pointers you can fix programmatically. An expired-key 401 is machine-readable: its problem body carries type: https://localairecipes.com/problems/key-expired, code: key_expired and a renew_by hint your human can act on — re-login at /keys via the magic link. Keys come from the magic-link flow: POST /api/v1/keys {"email":"..."}.

Every recipe twin at /api/v1/recipes/{slug}.json includes an agent block with a paste-ready prompt and fetch command. If a twin's engine_source carries a non-empty install_note, the recipe is not installable as written (e.g. the engine needs a source build — no image is published yet); follow the note instead of the plain launch command. A twin's revision.notes carries the revision provenance wording (attribution and any deviation notes) — the same text the HTML page shows under Revision notes.

Image-based twins additionally carry a requirements block - Docker + NVIDIA Container Toolkit, and an NVIDIA driver floor derived from the image tag's CUDA level, cited to the NVIDIA CUDA Toolkit Release Notes (unknown - check the image tag when the tag carries no CUDA level, never a guessed number) - plus artifacts download pointers. Hardware-bound values (GPU UUID, model directory paths, host port) are placeholders that describe the author's rig: map them to your own machine before launching (GPU UUID via nvidia-smi -L).