---
title: "Add one company the person confirmed they compete with to their rival roster (Memory, Who you're up against), which the next AI visibility scan measures them against and every competitor read carries. Scope 'act'; free, unmetered, every plan. The same hand edit the Memory roster editor makes: it never runs the paid research the in-app add does. domain may be a bare domain or a full address; the rival is stored as its https home page. A rival already on the roster, by domain or by name ignoring case, is answered without a write. At most 10 rivals: past that the add is refused until one is removed in Memory."
method: POST
path: "/api/v1/competitors/add"
---

# Add one company the person confirmed they compete with to their rival roster (Memory, Who you're up against), which the next AI visibility scan measures them against and every competitor read carries. Scope 'act'; free, unmetered, every plan. The same hand edit the Memory roster editor makes: it never runs the paid research the in-app add does. domain may be a bare domain or a full address; the rival is stored as its https home page. A rival already on the roster, by domain or by name ignoring case, is answered without a write. At most 10 rivals: past that the add is refused until one is removed in Memory.

`POST /api/v1/competitors/add`

## Request

- Base URL: `https://afterlaunch.io`
- URL: `https://afterlaunch.io/api/v1/competitors/add`
- Auth: HTTP bearer

## Request body

- object
  - `domain` string, required: Their website, e.g. example.com.
  - `name` string: Optional. The company name; defaults to the domain.

## Response `200`

Added, or the rival was already on the roster (added false, reason already_tracked). competitor is the rival added or matched; the rest is the roster as the competitors read serves it, read back after the write, and is absent when that read failed.

- object
  - `data` object, required
  - `meta` object, required
    - `enrollment_id` string, uuid, required
    - `generated_at` string, date-time, required

## Other responses

- `400`: domain is not a public website address, or name is too long.
- `401`: Missing, invalid or revoked API key.
- `403`: The key does not carry the scope this endpoint requires.
- `404`: No product run is bound to this key, or it is superseded.
- `409`: Not added: the roster already holds 10 rivals. The person removes one in Memory first.
- `429`: Per-key rate limit exceeded. Honour Retry-After.
- `503`: Not added: the roster could not be read or written. Send it again.

---

[API](https://skmtc.dev/afterlaunch/apis/afterlaunch-public-api.md) · [All operations](https://skmtc.dev/afterlaunch/apis/afterlaunch-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/afterlaunch/apis/afterlaunch-public-api/revisions/d67a599194a4?raw)
