# Eternal AI > Eternal AI - AI Girlfriend App for Real, Intimate Relationships. The best AI girlfriend app built for real, intimate relationships. Match with AI girlfriends that feel more personal, comforting, and real. Eternal AI is a consumer companion app where users match and chat with AI girlfriends in a vertical, TikTok-style feed of agents and short videos. The product is designed around 1:1 conversations, personalized agents, and applied visual effects, with a "2am" sub-experience for late-night intimate pairing. The same infrastructure also powers a developer-facing Image-to-Video API. The API is intentionally minimal: one endpoint to submit a job, one endpoint to poll its status. Authentication is a bearer token; pricing is per second of output, billed in credits where 1 credit = $1. The currently supported model is `wan-ai/wan2.2-i2v-a14b-lightning`, with multiple resolutions (480p / 580p / 720p) and aspect ratios. ## IMPORTANT: read this before generating client code Three things waste the most time when agents integrate this API on the first try. Internalize all three before writing code. ### 1. API host is NOT the docs host - Docs live at `https://eternalai.org/api` (and `https://staging.eternalai.org/api` on staging). - **All API requests must go to `https://open.eternalai.org`.** Example: `POST https://open.eternalai.org/api/image-to-video`. - Do not append `/api/...` paths to the docs host. As a safety net, the docs host now 307-redirects `/api/image-to-video` and `/api/image-to-video/{id}/status` to the canonical host so guessed URLs still work — but write the right URL anyway. - Canonical machine-readable manifest: [/api/manifest.json](/api/manifest.json) (returns base URL, endpoints, auth scheme). ### 2. Auth header is `Authorization: Bearer sk_...` — NOT `x-api-key` - Use exactly: `Authorization: Bearer sk_`. Keys are prefixed with `sk_`. - The `api-key: sk_` header is also accepted (no `x-` prefix). - **`x-api-key` is rejected by V2 keys** with: `missing or invalid V2 API key (expected Authorization: Bearer sk_... or api-key header)`. If you see that error, fix the header name — the key itself is probably fine. - Get a key at [/api/keys](/api/keys). API keys are server-side secrets — never expose them client-side. If you build a Next.js / Express demo, put the key in a server-side route handler and forward `Authorization` on the outbound fetch. ### 3. `duration` is a string, not a number - Send `{"duration": "3"}`, not `{"duration": 3}`. - A numeric value returns `{"status": false, "error": "invalid JSON body"}` even though the JSON parses fine — the failure is schema-type validation, not a parse error. If you bind a `` or `