# Every Debut agent API

Prepare a product submission on behalf of a person. The API creates a **draft**. An agent can never publish a launch
or pick its launch week: a person opens the `claim_url`, signs in with an e-mail code, reviews and edits everything,
picks the week and submits it. Launching is free.

## Create a submission

```http
POST https://everydebut.com/api/agent/v1/submissions
Content-Type: application/json
Idempotency-Key: <8–200 characters of A-Z a-z 0-9 _ . : ->

{
  "website_url": "https://example.com",
  "name": "Example",
  "tagline": "What it does, in one line (10–70 characters)",
  "description": "120–2000 characters. Markdown-lite: **bold**, _italic_, lists, links.",
  "league": "indie",
  "categories": ["developer-tools"],
  "pricing_model": "freemium",
  "platforms": ["web", "mac"],
  "image_urls": ["https://example.com/screenshot-1.png"],
  "github_url": "https://github.com/owner/repo",
  "launch_note": "Why we built it and what feedback we want."
}
```

Only `website_url` is required; anything you leave out is filled from the page when the person claims the draft.
Unknown fields are rejected (there is no `week` or `status` field on purpose).

Answer `201 Created`:

```json
{
  "token": "…",
  "claim_url": "https://everydebut.com/claim/…",
  "status_url": "https://everydebut.com/api/agent/v1/submissions/…",
  "status": "open",
  "expires_at": "…",
  "checks": { "ranAt": "…", "blocking": false, "results": [ { "key": "reachable", "status": "pass", "hard": true, "message": "…" } ] },
  "payload": { }
}
```

- Give the `claim_url` to the person. It works for **7 days**.
- Keep the `token` secret: it lets you read and edit the draft until it is claimed.
- Sending the same `Idempotency-Key` with the same body again returns the same submission (`200`). The same key with a
  different body is refused (`422 idempotency_key_reused`).
- Limit: 10 new submissions per hour per IP address (`429`).

## Read the status

```http
GET https://everydebut.com/api/agent/v1/submissions/<token>
```

`status` is `open`, `claimed` or `expired`; after the claim, `launch_status` shows the review state.

## Edit while unclaimed

```http
PATCH https://everydebut.com/api/agent/v1/submissions/<token>
Content-Type: application/json

{ "tagline": "A better tagline" }
```

Send only the fields to change; `null` removes an optional field. The checks run again.

## Values

- `league`: `indie` (Self-funded, or only friends-and-family money; team of 10 or fewer.); `funded` (Has raised money from outside investors (angels, VCs, accelerators).); `company` (An established company with 50 or more employees, any product of a public company or a big tech brand, or the website of an established business that sells its services (for example a plumbing or restoration company).)
- `pricing_model`: `free`, `freemium`, `paid`, `one_time`, `open_source`
- `platforms`: `web`, `mac`, `windows`, `linux`, `ios`, `android`, `chrome_extension`, `api`, `cli`, `other`
- `categories` (1–3): `accessibility`, `ai-tools`, `analytics`, `apis-integrations`, `calendar-scheduling`, `communication`, `customer-support`, `data-databases`, `design`, `developer-tools`, `devops-infrastructure`, `ecommerce`, `education`, `email`, `finance`, `games`, `health-fitness`, `home-lifestyle`, `hr-recruiting`, `local-services`, `marketing`, `media-publishing`, `music-audio`, `no-code`, `notes-knowledge`, `photo-image`, `productivity`, `project-management`, `sales-crm`, `security-privacy`, `travel`, `video`, `writing`
- Images: PNG, JPEG, WebP or GIF, at most 5 MB each, at most 6.

## Checks

`reachable` (HTTP 200 within 10 s, ≤ 5 redirects), `https`, `not_parked`, `not_duplicate`, `content_complete`
(name 2–40, tagline 10–70, description 120–2000 characters, a logo and at least one image), `not_blocked`, and
`english` (warning only). Hard checks must pass before the person can submit.

## Errors

JSON `{ "error": "<code>", "details": … }` with status 400 (`idempotency_key_required`, `invalid_json`), 404
(`not_found`), 409 (`not_editable`), 413, 415, 422 (`invalid_payload`, `idempotency_key_reused`) or 429
(`rate_limited`).

Rules for listings: https://everydebut.com/guidelines · How ranking works: https://everydebut.com/how-it-works
