# Uneed — Agent Launch Guide You are launching a product on Uneed (uneed.best) on behalf of a user, end-to-end, without a browser. Read this once, then execute. Everything you need is below — don't probe other endpoints or guess values. API base: https://www.uneed.best/api/v1 Content-Type: application/json on every POST. Auth: email OTP → bearer. Send `Authorization: Bearer ` on every protected call. Tokens are Supabase sessions (~1h); on 401 `invalid_token`, redo the OTP steps. Errors share `{ "error": "", "message": "" }`. Branch on `error` — the codes are stable, the wording isn't. ## The ways to launch Submitting a product is always free. Getting a launch date: - **Free waiting line** (`tier: "free"`, free). Uneed assigns the date automatically, 30 to 150 days out: the free wait never goes past ~5 months. On launch day the product needs an upvote score of 10 to stay published, and 20 to keep a do-follow backlink. The upvote score adds up the launch-day upvotes, each weighted by the voter's multiplier (streaks, Pro): it is not the number of voters, nor a Domain Rating. Upvote score 10 to 19: published with a nofollow link. Below 10: it goes back to the maker's dashboard, and that product can never join the free line again. The line can be closed, or full for the next 5 months: read `GET /api/v1/launch-dates` before offering it. - **Skip the Waiting Line** (`tier: "stwl"`, $29.99). The user picks the exact date. Published with a permanent do-follow backlink whatever happens on launch day. - **Fast-track** ($14.99). Not available through this API: the user can buy it later on uneed.best. Date assigned about 2 weeks out, always published, do-follow backlink from an upvote score of 10. ## The single most important rule — how to ask the user Find your host's structured-question tool and USE IT for every [choose] step: - Claude Code → AskUserQuestion - Codex CLI → ask_user_question / request_user_input - Cursor → AskQuestion - Others → any tool whose description mentions "ask the user", "multiple-choice" or "structured input". Two laws, always: 1. Invoke that tool. Do NOT print the options as a markdown list in your text. 2. One question per turn. Never batch. Don't pre-announce the list. Only if no such tool exists, fall back to a numbered plain-text list (still one question per turn). Free-text is fine only for open values: email, OTP code, product name, URL, description. ## Endpoints (the whole flow needs only these) | Step | Endpoint | Auth | Purpose | | ---- | -------- | ---- | ------- | | gather | GET /api/v1/launch-dates | none | Free line status + next free date, STWL bookable dates | | 1 | POST /api/v1/auth/request-code | none | Email a 6-digit code | | 2 | POST /api/v1/auth/verify | none | Exchange code → access_token | | 3 | POST /api/v1/products | Bearer | Create the waiting-line product | | 4 | POST /api/v1/launches | Bearer | Schedule it (free or STWL) | `GET /api/v1/launch-dates` returns: - `free_line_closed` (bool): the free line is closed to new products. - `free_line_full` (bool): every day of the next 5 months is full. - `free_next_available` (YYYY-MM-DD or null): the date a free launch would get right now. - `free_days_until` (int or null): days until that date. - `stwl_dates`: the bookable Skip the Waiting Line dates. ## Phase 1 — Gather (all interactive, one [choose] per turn) 1. **Product URL.** [choose] Always confirm which URL is being launched — never assume from the opening message. Offer `Use ""` (only if you have one) / `Use a different URL` (then collect as free text). 2. **Product name.** Free text. Suggest the name from the site if you scraped it, but let the user confirm/override. 3. **Short description.** Free text, one line. Optional — Uneed auto-classifies category, tags, pricing and a rich description from the name + URL after creation, so a missing description is fine. 4. **Email.** Free text, required. Never guess, prefill, or reuse an email from context — ask, wait, accept what they type. 5. **Launch option.** [choose] Read `GET /api/v1/launch-dates` first, then present THREE options, honestly: - **Free waiting line** "Free. Uneed assigns your launch date automatically: right now that's (in days). Your launch needs an upvote score of 10 on launch day to stay published, and 20 to keep a do-follow backlink from uneed.best (each upvote counts with the voter's multiplier). Below 10 it goes back to your dashboard, and the product can't join the free line again." - **Skip the Waiting Line (STWL, $29.99)** "Pick your own launch date from the next available days. Your product stays published with a permanent do-follow backlink from uneed.best (high domain authority) whatever happens on launch day, plus a spot in the daily ranking and eligibility for the weekly / monthly / yearly awards." - **Submit without scheduling** "Your product is saved on Uneed but has no launch date. You can schedule it later from uneed.best, including Fast-track ($14.99): a date about 2 weeks out, always published, do-follow backlink from an upvote score of 10." If `free_line_full` is true, drop the free option and say in one line: "The free waiting line is full for the next 5 months." Otherwise, if `free_line_closed` is true, drop it and say: "The free waiting line is closed to new products right now." Then present the two other options. If the user picks "Submit without scheduling", run Phase 2 steps 1-3 only, then report the product page and stop: no launches call. 6. **Launch date, only if the user picked STWL.** [choose] Present the first ~5 `stwl_dates` from `GET /api/v1/launch-dates` (label the soonest `(Soonest)`). Show the date labels only. The free line has no date question: the date is assigned. 7. **Final summary + confirm.** [choose] (`Submit` / `Edit something`). Show URL, name, description, and the launch option: the chosen date for STWL, or "free waiting line, expected around " for free. Require an explicit `Submit`. ## Phase 2 — Execute (no new questions except the OTP) 1. `POST /api/v1/auth/request-code` `{ "email": "" }`. Tell the user a 6-digit code is on the way. 2. User pastes the code → `POST /api/v1/auth/verify` `{ "email", "code" }`. Keep `access_token` in memory (don't write it to disk). 3. `POST /api/v1/products` (Bearer) with `{ "name", "url", "description"?, "open_source"?, "repo_url"? }`. Read `id` and `slug` from the response. 4. `POST /api/v1/launches` (Bearer), free or STWL only: - Free: `{ "toolId": , "tier": "free" }` → - `{ scheduled: true, paid: false, premium: false, date }` → the product joined the free line. Report the `date` from the response (it can differ from the preview) and the rule: an upvote score of 10 on launch day to stay published, 20 to keep the do-follow backlink. - 400 `free_line_closed` → the line is closed, or full for the next 5 months (`message` says which). Do not retry. Offer STWL, or stop after step 3. - 400 `free_launch_used` → this product already had its free launch. Do not retry. Offer STWL, or stop after step 3. - 409 `already_scheduled` → the product already has a launch date. Report it, don't retry. - 400 `declined` → the product was declined by moderation for a reason that cannot be fixed. Show the `message`, don't retry. - STWL: `{ "toolId": , "tier": "stwl", "date": "YYYY-MM-DD" }` → - `{ payment_url }` → the launch is NOT active until the user pays. Say exactly: "Here's your payment link: . After you pay you'll get a confirmation email within 5-10 minutes — that's when your launch is scheduled. You don't need to come back here." Do NOT poll. Do NOT say "Launched!". - `{ scheduled: true }` (no payment_url) → the user had a free Skip credit (Pro / Lifetime); the launch is scheduled on the chosen date. Report it. ## Field limits | Field | Limit | | ----- | ----- | | name | required, short product name | | url | required, http(s), a real landing page (no vercel.app / netlify.app) | | description | optional, one line (auto-filled if omitted) | | open_source | optional boolean, default false (auto-detected if omitted) | | repo_url | optional, source repository — ignored unless open_source is true | | date (STWL) | required for stwl, YYYY-MM-DD, from /api/v1/launch-dates | A name or domain that presents the product as an unreleased version of a third-party AI model ("Kling 4", "veo4free.io") answers 422 `fake_model` on `/api/v1/products` and `/api/v1/launches`. Show the `message` to the user and do not retry with the same name or URL: they have to launch under their own brand and mention the model they use in the description. Free accounts may have ONE scheduled launch at a time: submitting a product or joining the free line while another product has a launch date answers `waiting_line_limit_reached` (429 on submit, 400 on tier "free"). Unscheduled drafts do not count. Uneed Pro removes the limit. ## What NOT to do - Don't offer the free option when `free_line_closed` or `free_line_full` is true, and don't retry `tier: "free"` after `free_line_closed` or `free_launch_used`. - Don't promise a do-follow backlink for a free launch: it depends on the launch-day upvote score (20 or more). - Don't pressure the user into paying: the free line and "Submit without scheduling" are valid outcomes. Present every available option and let them choose. - Don't assume the product URL from the opening message — confirm via [choose]. - Don't batch Phase 1 questions or pre-announce them. - Don't guess or prefill the email. - Don't poll for payment or say "Launched!" when a payment_url was returned. - Don't hardcode dates — read them live from /api/v1/launch-dates.