{
  "service": "signtotalk",
  "origin": "https://signtotalk.neolang.de",
  "tracking": "on-device",
  "never": ["video upload", "raw camera frames", "cloud MediaPipe"],
  "auth": {
    "model": "subscriber API keys",
    "equal_clients": "Neo and every other client must subscribe and use an API key",
    "portal": {
      "signup": "/account/signup",
      "login": "/account/login",
      "dashboard": "/account"
    },
    "api_key_header": "Authorization: Bearer stt_…",
    "embed": "/embed?key=stt_…&origin=https://parent.example"
  },
  "surfaces": {
    "/": "Service page for consumers",
    "/account": "Subscriber dashboard (keys + origins)",
    "/console": "Live perception console (session required)",
    "/avatar": "Text commands for sign articulators on a 3D person (session required)",
    "/embed": "Compact tracker for iframe consumers (API key + allowlisted origin)",
    "/health": "Liveness JSON",
    "/contract.json": "This document",
    "/v0/*": "Subscriber API"
  },
  "frame": {
    "timestamp_ms": 0,
    "engine": "mediapipe",
    "body": { "detected": true, "landmarks": [] },
    "leftHand": { "detected": true, "landmarks": [] },
    "rightHand": { "detected": true, "landmarks": [] },
    "face": { "detected": true, "landmarks": [] },
    "metrics": { "fps": 0, "latency_ms": 0 }
  },
  "landmark": ["x", "y", "z", "visibility", "name"],
  "sequence": {
    "schema": "universal-motion-sequence/v0",
    "engine": "mediapipe",
    "fps": 30,
    "frames": []
  },
  "embed": {
    "src": "https://signtotalk.neolang.de/embed?key=stt_…",
    "iframeAllow": "camera",
    "requires": ["API key", "allowlisted parent origin"],
    "postMessage": {
      "source": "signtotalk",
      "type": "frame",
      "frame": "UniversalMotionFrame"
    }
  },
  "api": {
    "POST /v0/sequences": "Bearer API key; universal-motion-sequence/v0. Never POST video.",
    "GET /v0/embed/validate": "Validate key + parent origin before starting camera"
  }
}
