{"openapi":"3.1.0","info":{"title":"Jarvis API","version":"0.1.0"},"paths":{"/api/v1/messaging/inbound/{provider_key}":{"post":{"tags":["messaging"],"summary":"Inbound","operationId":"inbound_api_v1_messaging_inbound__provider_key__post","parameters":[{"name":"provider_key","in":"path","required":true,"schema":{"type":"string","title":"Provider Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sprite/skills/manifest":{"get":{"tags":["sprite","skills"],"summary":"Get Manifest","description":"Return the manifest of published sprite_worker skills.\n\nSprite warm-up flow (``sprite-init.sh``):\n\n    manifest=$(curl -H \"Authorization: Bearer $SPRITE_TOKEN\" \\\n        \"$JARVIS_API/api/sprite/skills/manifest?eager=true\")\n    echo \"$manifest\" | jq -r '.skills[] | ...' \\\n        | xargs skill-install.sh\n\nReturned shape:\n\n    {\n        \"skills\": [\n            {\n                \"skill_id\": \"deep-research-pro\",\n                \"name\": \"Deep Research Pro\",\n                \"description\": \"...\",\n                \"version_hash\": \"abc123...\",\n                \"download_url\": \"https://...presigned...\",\n                \"tool_bindings\": [...],\n                \"required_secrets\": [...],\n                \"estimated_cost_usd\": 0.3,\n                \"install_eagerly\": true\n            },\n            ...\n        ]\n    }","operationId":"get_manifest_api_v1_sprite_skills_manifest_get","parameters":[{"name":"eager","in":"query","required":false,"schema":{"type":"boolean","description":"When true, return only skills with install_eagerly=true. This is what sprite-init.sh fetches at warm-up so the core set lands quickly.","default":false,"title":"Eager"},"description":"When true, return only skills with install_eagerly=true. This is what sprite-init.sh fetches at warm-up so the core set lands quickly."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Manifest Api V1 Sprite Skills Manifest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sprite/skills/{skill_id}":{"get":{"tags":["sprite","skills"],"summary":"Get Skill For Sprite","description":"Return one skill's manifest entry. Used by ``skill-install.sh``\nwhen a sprite needs to install a specific skill on-demand\n(the ``delegate_to_skill`` path).\n\nReturns 404 if the skill isn't published (drafts are not visible\nto sprite endpoints — they're only visible via the admin /\ncontent-team paths).","operationId":"get_skill_for_sprite_api_v1_sprite_skills__skill_id__get","parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Skill For Sprite Api V1 Sprite Skills  Skill Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/watch-fired":{"post":{"summary":"Watch Fired","operationId":"watch_fired_internal_watch_fired_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/webhooks/payments/linq":{"post":{"summary":"Payments Settle","operationId":"payments_settle_api_v1_webhooks_payments_linq_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/signup/line":{"get":{"summary":"Signup Line","description":"Return ``{\"e164\": \"+1...\"}`` -- the line a new visitor should text.","operationId":"signup_line_api_v1_signup_line_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Signup Line Api V1 Signup Line Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/waitlist":{"post":{"summary":"Join Waitlist","description":"Capture a phone and/or email on the waitlist. Idempotent on either.","operationId":"join_waitlist_api_v1_waitlist_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/landing/events":{"post":{"summary":"Record Landing Event","description":"Store one landing event. Fields that fail cleaning are dropped.","operationId":"record_landing_event_api_v1_landing_events_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingEventRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/healthz":{"get":{"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LandingEventRequest":{"properties":{"event_type":{"type":"string","enum":["visit","handoff","tap","opened","closed","not_opened"],"title":"Event Type"},"vid":{"title":"Vid"},"cid":{"title":"Cid"},"path":{"title":"Path"},"utm_source":{"title":"Utm Source"},"utm_medium":{"title":"Utm Medium"},"utm_campaign":{"title":"Utm Campaign"},"utm_term":{"title":"Utm Term"},"utm_content":{"title":"Utm Content"},"click_id_param":{"title":"Click Id Param"},"entry":{"title":"Entry"},"device":{"title":"Device"},"via":{"title":"Via"},"outcome":{"title":"Outcome"},"line":{"title":"Line"}},"type":"object","required":["event_type"],"title":"LandingEventRequest","description":"One event. Only ``event_type`` is required; the rest depends on the step."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WaitlistRequest":{"properties":{"phone":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Phone"},"email":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Email"},"desired_platform":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Desired Platform"},"source":{"type":"string","maxLength":200,"minLength":1,"title":"Source","default":"unknown"},"utm_source":{"title":"Utm Source"},"utm_medium":{"title":"Utm Medium"},"utm_campaign":{"title":"Utm Campaign"},"utm_term":{"title":"Utm Term"},"utm_content":{"title":"Utm Content"},"click_id_param":{"title":"Click Id Param"}},"type":"object","title":"WaitlistRequest","description":"Body for ``POST /api/v1/waitlist``.\n\n``phone`` is any human-entered phone string (normalized server-side\nto E.164) and ``email`` is any email string (normalized server-side):\nat least one must be supplied. ``source`` is a free-form tag naming\nwhere the capture came from, e.g. ``landing-hero`` / ``desktop-qr``;\nit defaults to ``\"unknown\"`` so a caller that omits it still records a\nrow. ``desired_platform`` is an optional free-form string stored on\nthe row (write-only — not returned by the API)."},"WaitlistResponse":{"properties":{"e164":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"E164"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"source":{"type":"string","title":"Source"},"created":{"type":"boolean","title":"Created"}},"type":"object","required":["e164","email","source","created"],"title":"WaitlistResponse"}}}}