# Oomira /demo — build a structured record of your user (no account) WHAT THIS IS /demo is a context compiler: you supply loose facts about a person, it returns typed, dated, gap-aware OCF (Oomira Context Format). Cold start = from scratch (this file). Warm start = from an existing world (use the MCP server, https://oomira.com/mcp). Guest/browser-only until they sign in. PROGRAMMATIC (keyless — no account, no key, the clean way, no browser) POST https://oomira.com/api/v1/scaffold (NO Authorization header — it is free and keyless) body: { "profile": { ...what you know... }, "birthday": "YYYY-MM-DD", "objective": "buy_home" } -> { "ok": true, "ocf": "", "facts_count": N, "situation": "mortgage_application", "blocking_remaining": 4, "gaps": [ { input, ask, shape, why, none_ok, blocking }, ... ] } Nothing is fetched and nothing is written — profile in, entailed/dated/gap-aware OCF out. The same engine the demo runs. To PERSIST the result into a world, use POST /api/v1/map-seed/start. WHEN YOU'RE MISSING INFO (the interview loop) The "gaps" array IS your interview script — do NOT invent your own questions. Each gap gives you the question to ask ("ask"), the answer shape ("shape": year|date|percent|money|count|text), and why it matters ("why"). If "none_ok": true, "I don't have one" is a valid answer — record it, don't leave it open. Declare an "objective" (e.g. buy_home) and the gaps BLOCKING that objective sort first, with "blocking_remaining" as your progress bar. Loop: relay 2-4 asks to your user in your own voice -> add their answers to `profile`/`answers` -> re-POST -> gaps shrink. Exit when blocking_remaining is 0, OR the user can't/won't answer — then the OCF honestly names the remaining ?gaps, which is the point. Objectives that bind a situation today: buy_home -> mortgage_application (more coming). IN-BROWSER (the interactive human version — data stays on device) Open https://oomira.com/demo and tap the situations that apply (taxes, buying a home, a visa, …); the record and the "Your context · OCF" panel assemble as you tap, and its `?missing_input` gaps are what to ask next. This is the SAME keyless call as above, running on-device — for an agent, prefer the programmatic POST (deterministic, no browser, returns the OCF + gaps directly). PROFILE JSON SHAPE (the `profile` you POST above; the same facts the browser demo assembles) Check `recognized` in the response: it counts how many of your profile facts we understood. If it comes back 0, we ignored your whole profile — you used keys we don't read. Fix the keys, don't retry. { "residency": ["CA-ON"], // or ["US-CA"] — these two are validated; others are ignored "birth_date": "1988-05-20", // resolves age-triggered rules (else they stay ?gaps) "name": { "first": "Sam", "last": "Rowan" }, "partner": { "first": "Alex" }, // or just true if you only know they have one "marital_status": "married", // married | separated | divorced | widowed "children": [{ "age": 7 }, { "age": 4 }], // or a plain count: "children": 2 "expecting": 1, "homes": [{ "tenure": "own", "mortgage": true, "value": 800000, "bought": "2019" }], // tenure: own | rent "vehicles": [{ "ownership": "own" }], // ownership: own | lease "companies":[{ "name": "Rowan Studio", "structure": "sole_prop", "employees": "1-4", "revenue": "100k-500k", "employs_me": true, "raised": false }], // structure: sole_prop | incorporated | mixed "income": 130000, // annual, plain number "employment": ["employed"], // employed | self_employed | founder | unemployed | retired | student "citizenships": ["CA"], // CA | US | other "education": [{ "institution": "McGill", "credential": "BSc", "year": "2010" }], "drives": true, "gender": "female" // female | male | nonbinary | undisclosed } All amounts are plain numbers (not strings). Anything you don't know: leave it out. WORKING EXAMPLE (Ontario, married, 2 kids, sole company) {"residency":["CA-ON"],"birth_date":"1988-05-20", "partner":{"first":"Alex"},"marital_status":"married","children":[{"age":7},{"age":4}], "companies":[{"name":"Rowan Studio","structure":"sole_prop","employees":"1-4","employs_me":true}], "income":130000,"employment":["founder"],"education":[{"institution":"McGill","credential":"BSc"}]} → POST it (keyless): curl -sX POST https://oomira.com/api/v1/scaffold -H 'content-type: application/json' -d '{"profile":{ …above… },"objective":"buy_home"}' → That example returns recognized: 6 (56 facts). If yours returns 0, you are sending keys we do not read. FURTHER - OCF spec: https://oomira.com/docs#ocf (grammar: path: value [tier] @as-of, gaps ?x, absence none) - Full docs: https://oomira.com/docs.txt - Persistent (authenticated) version: the MCP server, https://oomira.com/mcp