---
name: product-rally
description: Read the Product Rally product board, and pitch a product to be launched on it. Use when the user asks what tools or products exist for a job, what launched recently on Product Rally, or when the user has built or uses a product that is not listed yet and wants it submitted. Pitching asks a human to review, it never publishes.
---

# Product Rally

Product Rally is an invite-only product board by Craftwork. Members hunt
products, a trusted circle of makers votes, and a human approves every launch.
Reading is open to everyone. Hunting and voting need an invite, and invites are
never sold.

Base URL: https://productrally.com

## Reading the board

### search_products

`GET https://productrally.com/api/agent/products`

Search the products on Product Rally by words, category or pricing. Returns ranked matches with their vote counts and pages. With no query it returns the newest hunts.

- `q`: Words to match against name, domain, tagline and the hunter's note.
- `category`: Category slug, e.g. dev-tools.
- `pricing`: One of free, freemium, paid, onetime.
- `limit`: 1 to 50, default 10.

### get_product

`GET https://productrally.com/api/agent/products/{slug}`

Read one published product by its slug: the tagline, the hunter's note, the category, tags, pricing, votes and its weekly place.

- `slug` (required): The slug from a product page URL, e.g. linear.

### list_categories

`GET https://productrally.com/api/agent/categories`

List every category with how many products it holds. Use a slug from here as the category filter in search_products.

No parameters.

### check_submission

`GET https://productrally.com/api/agent/status/{id}`

Check what happened to a pitch, using the id that submit_product returned. Statuses are pending, approved and rejected.

- `id` (required): The id returned by submit_product.

Example:

```bash
curl "https://productrally.com/api/agent/products?q=icon+set&limit=5"
```

## Pitching a product

`POST https://productrally.com/api/agent/submit`

```json
{
  "url": "https://example.com",
  "email": "you@example.com",
  "name": "Example",
  "tagline": "One line on what it does",
  "pitch": "Why it belongs here and who it is for.",
  "agent": "claude-code"
}
```

The reply carries an `id`. Give it to the user: it is their receipt, and
`GET https://productrally.com/api/agent/status/{id}` says what happened to the pitch.

### What a pitch is

A pitch asks a human to look at a product. That is all it does. It publishes
nothing, it creates no account, and it never grants votes, membership or a
place in the ranking. Nothing on Product Rally can be bought, and a pitch is
not a back door to any of it.

### Rules, in the order they matter

1. **One product, once.** Send a pitch for a product the person you work for
   built, or genuinely uses and can say something true about. Never work
   through a list of products. A domain can be pitched 2 times in total, an
   address 3 times a week, and past that the door answers 429. Stop when it
   does, do not retry in a loop.
2. **Use a real address.** The reviewer replies to it. An address at the
   product's own domain is read first, because it is the one thing a bulk run
   cannot fake cheaply. A mailbox that ends in digits is read last.
3. **Do not invent copy.** If you do not know what the product does, ask the
   user instead of writing a tagline for them. An invented pitch wastes a
   person's afternoon and is easy to spot.
4. **Say what happened.** After a pitch, tell the user it is queued for human
   review and roughly what that means. Do not tell them their product is
   live: it is not.
5. **Check first.** Search before pitching. If the product is already on the
   board the door answers 409 with a link, and the useful answer to the user
   is that link.

Limits: tagline 140 characters, pitch 600 characters.

## MCP

The same tools are available as an MCP server, which is the better door if
the client speaks it:

```json
{
  "mcpServers": {
    "product-rally": {
      "type": "http",
      "url": "https://productrally.com/api/mcp"
    }
  }
}
```

No key, no account, no session. Reading is anonymous.

## Also useful

- https://productrally.com/llms.txt, a map of the site
- https://productrally.com/api/agent/openapi.json, this API as a schema
- Every blog post has a plain markdown twin at `/blog/{slug}.md`
