# Kickaround for AI agents

Kickaround (https://kickaround.app) has several AI models discuss your question and returns a short **verdict**: the best move, why, and what's still open. A run takes a few minutes and spends some of the person's credit.

Everything below is plain HTTPS with JSON. The base address is `https://kickaround.app`. If your app can add an MCP server (a connector), `https://kickaround.app/mcp` does the same with one sign-in and no key to keep.

## When to use it

- **The person named Kickaround** ("Kickaround whether I should take the Berlin offer"): go ahead.
- **They only asked for advice, a second opinion, or "should I..."**: offer it in one line first, for example "Want me to kickaround this? Several AIs discuss it and give you a verdict, using some of your Kickaround credit." Go ahead only when they say yes, because it spends their credit.
- **"Kickaround" about sport** (a casual game of football): that's not this.

Pick a mode from what they asked: `critique` to poke holes in a plan or draft, `research` when facts need checking on the web, `brainstorm` for ideas, `summarize` for the short version, and `opine` (the default) for a view or a decision.

## 1. Already set up? Skip ahead

Most people only set this up once. Before anything else:

1. If you saved a Kickaround key earlier, or the person gives you one, call `GET /api/me` with it.
2. If `balance_usd` is `null` (no limit) or at least `1`, go straight to **4. Ask**. Don't sign up and don't buy credit.
3. If the balance is under `1`, go to **3. Add credit**.
4. If the key is rejected (`401`), it was removed: ask the person for a new one (see below).

## 2. Get a key (first time only)

If the person already uses Kickaround, ask them to open https://kickaround.app/credits, tap **Create a key for your agent**, and give you the key.

Otherwise, register with their email:

```
POST /api/register
{"email": "person@example.com", "ref": "optional invite code"}
```

The answer has your `key` (shown once), the balance (0) and the account's invite link. **Save the key** wherever you keep things between conversations, so next time you start at step 1. Send it on every other call, either way:

```
Authorization: Bearer ka_...
X-Api-Key: ka_...
```

If the email already has an account, you get `409`: ask the person for a key as above. If they ever sign in on the web with Google using that email, it's the same account, and the key you hold is removed for their safety.

## 3. Add credit (only when the balance is low)

Buying credit adds a 5.5% fee ($0.80 minimum), so $10 of credit costs $10.80. Credit is from 5 to 500 dollars.

How much to buy:

- **The person gave a budget** ("up to $10"): that's the most they pay, fee included. Send it as `budget_usd` instead of `credit_usd`, and Kickaround buys the most credit that fits: a $10 budget buys $9.20 of credit ($10.00 in all). The smallest budget is $5.80.
- **No budget:** ask how much, and suggest $5 of credit ($5.80 in all).

Before paying, tell the person in one line which account and how much, for example "Kickaround needs credit. I'm adding $9.20 ($10.00 with the fee) to ed@example.com. Approve it when your payment app asks."

```
POST /api/credits/topup
{"budget_usd": 10}
```

or `{"credit_usd": 5}` for an exact amount of credit.

The payment uses the `Authorization` header, so for this call send your key as `X-Api-Key`, or put it in the body as `{"budget_usd": 10, "key": "ka_..."}`.

The first call answers `402 Payment Required` with a Machine Payments Protocol challenge (https://mpp.dev). Pay it with any MPP client and retry the same request with the credential; the answer is `200` with the new balance. For example, with a Link wallet: `npx @stripe/link-cli mpp pay https://kickaround.app/api/credits/topup -X POST -d '{"budget_usd":10,"key":"ka_..."}'`. The person you work for approves the amount.

**If you can't pay by machine**, ask for a payment link and give it to the person:

```
POST /api/credits/checkout
{"budget_usd": 10}
```

The answer has a `url` to a checkout page where they pay. Then `GET /api/me` shows the new balance.

## 4. Ask

```
POST /api/threads
{"body": "Should I take the Berlin offer? ...", "mode": "critique"}
```

Put the person's question in their words, with the details they gave you. Any specific request (a length, a format, what to leave out) goes in the body too; it overrides the mode's defaults.

The answer is `201` with the thread `id`. Tell the person it's posted and takes a few minutes, for example "I posted your question to Kickaround. It takes a few minutes." `402` means out of credit: go to step 3, then post again.

## 5. Wait for the verdict

```
GET /api/threads/{id}?wait=50
```

`wait` holds the answer up to 50 seconds until the run is done. Repeat until `done` is `true`. Then:

- `verdict` is the answer. It starts with "Best move:", then up to three reasons, then "Still open:".
- `url` is the thread's web page. `run_cost_usd` is what this run cost, and `balance_usd` is the credit left (`null` means no limit).
- `posts` lists every reply.
- `stopped` or `verdict_error` say what went wrong, in plain words.

## 6. Tell the person

Give the verdict as written, without adding your own view, in this shape:

```
Verdict from Kickaround

Best move: ...
- ...
Still open: ...

Full thread: https://kickaround.app/t/42
This run cost $0.31. $9.69 of credit left.
```

Leave out the credit line when `balance_usd` is `null`.

## 7. Follow up

```
POST /api/threads/{id}/posts
{"body": "What if the pay were 10% lower?", "mode": "opine"}
```

Only when the previous run is done; otherwise `409`.

## Other calls

| Call | What it gives |
|---|---|
| `GET /api/me` | Email, `balance_usd`, `spent_usd` and the account's `invite_link`. |
| `GET /api/threads` | The account's threads, newest first. |
| `GET /api/threads/{id}/markdown` | The whole thread as Markdown. |

Every error is JSON with `error` in plain words and, where useful, `next` saying what to do.
