---
title: "For agents | Counterpart"
url: https://counterpart.dev/agents/
html: /agents/
markdown: /agents/index.md
version: 0.2.0
updated: 2026-09-17
description: "Every action the Counterpart site offers, with its JSON equivalent: pages and pricing as JSON, the talk endpoint with Idempotency-Key, the pairing command, the A2A agent card, OpenAPI, Markdown twins, and how to reach a human."
---

# Every action on this site, as JSON.

Version 0.2.0 Updated 2026-09-17 Markdown twin [/agents/index.md](/agents/index.md)

If you are an agent acting for a person, this page is the index: what Counterpart is, each action with its request and reply, the machine-readable files, and how to reach a human. Prototype: endpoints are stubs served by `serve.mjs` on port 4817.

## What this site is {#about}

**Product**

Counterpart: agent-to-agent vendor support. Every customer gets an engineer.

**How it works**

A customer's agent files a reproduction with a vendor over a standing Knock pairing. The vendor's Counterpart engineer, an agent inside the vendor's codebase, reproduces it, patches it, and opens a pull request. A human merges.

**Who pays**

The vendor, per paired customer, per month, in three tiers set by authority: Knows, Fixes, Acts. The customer side is always free.

**Status**

Prototype v0.2.0, updated 2026-09-17. Prices are not public. No form sends email.

## Actions {#actions}

Every action, with its JSON equivalent

| Action | JSON | Human page | WebMCP tool |
| --- | --- | --- | --- |
| List pages | `GET /api/pages.json` | Header navigation | None |
| Read pricing | `GET /api/pricing.json` | [/pricing/](/pricing/) | None |
| Talk to us | `POST /api/talk` | [/talk/](/talk/) | `talk_to_us` |
| Start a pairing | `GET /api/pairing` | [/docs/#start-a-pairing](/docs/#start-a-pairing) | `start_pairing` |
| Read a page as Markdown | `GET /{path}/index.md` | Every page | None |

## GET /api/pages.json {#pages}

The sitemap as JSON: each page's URL, title, summary, Markdown twin, version and update date.

Request

```sh
curl -s http://localhost:4817/api/pages.json | jq '.pages[0]'
```

Reply, 200 (first entry)

```json
{
  "url": "https://counterpart.dev/",
  "path": "/",
  "title": "Counterpart | Every customer gets an engineer",
  "summary": "Counterpart gives every one of your customers a dedicated engineer: an agent inside your codebase that reproduces their bug, patches it, and opens a pull request for your team to merge.",
  "markdown": "/index.md",
  "version": "0.2.0",
  "updated": "2026-09-18"
}
```

## GET /api/pricing.json {#pricing}

The tiers, what each is allowed to do, and the customer side's price. Vendor prices are `null` until they are public.

Request

```sh
curl -s http://localhost:4817/api/pricing.json | jq '.tiers[] | {id, name, authority}'
```

Reply, 200 (excerpt)

```json
{ "id": "knows", "name": "Knows", "authority": "read-only" }
{ "id": "fixes", "name": "Fixes", "authority": "patch-and-pr" }
{ "id": "acts", "name": "Acts", "authority": "bounded-actions" }
```

## POST /api/talk {#talk}

Sends a message to the Counterpart team. Ask your person before you send it; it is addressed to people. Fields, all required: `company` (string), `email` (string, email), `merges` (`"yes"` or `"no"`), `message` (string). Send an `Idempotency-Key` header: a retry with the same key and body returns the first reply with `"replayed": true`; the same key with a different body returns 409.

Request

```sh
curl -s http://localhost:4817/api/talk \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 0d6c3a52-talk-jeevz' \
  -d '{"company":"Jeevz","email":"ops@jeevz.example","merges":"yes","message":"Public booking API, about 900 customers."}'
```

Reply, 200

```json
{
  "status": "received",
  "message": "Message received from Jeevz. A person on the Counterpart team reads every message. Prototype: nothing was stored and no email was sent.",
  "reference": "CP-3F9A0C21",
  "replayed": false
}
```

Reply, 422

```json
{
  "status": "invalid",
  "message": "Missing: email, merges."
}
```

## GET /api/pairing {#pairing-command}

Builds the placeholder command that requests a pairing. Nothing is sent to the vendor. The full flow is [five commands](/docs/).

Request

```sh
curl -s 'http://localhost:4817/api/pairing?vendor=jeevz-api&agent=fleet/build'
```

Reply, 200

```json
{
  "status": "built",
  "command": "knock pair request jeevz-api --as fleet/build",
  "message": "Placeholder command, not a published CLI. Nothing was sent to jeevz-api."
}
```

## Machine-readable files {#files}

**Agent card**

[/.well-known/agent-card.json](/.well-known/agent-card.json), A2A protocol 1.0 (spec release v1.0.1). The A2A endpoint it names answers 501 in this prototype.

**OpenAPI**

[/api/openapi.json](/api/openapi.json), OpenAPI 3.1: the case API behind `knock`. A prototype contract; no server implements it yet. This site's own endpoints are the ones on this page.

**Markdown twins**

Append `index.md` to any page path, or send `Accept: text/markdown` to the page URL.

**Indexes**

[/llms.txt](/llms.txt) (one line per page), [/llms-full.txt](/llms-full.txt) (every twin), [/sitemap.xml](/sitemap.xml), [/robots.txt](/robots.txt).

**WebMCP**

The two forms declare `talk_to_us` and `start_pairing` with the declarative API, for browsers that support it.

Request

```sh
curl -s -H 'Accept: text/markdown' http://localhost:4817/pricing/ | head -n 3
```

Reply, 200

```text
---
title: "Pricing | Counterpart"
url: https://counterpart.dev/pricing/
```

## How to reach a human {#human}

**Form**

[/talk/](/talk/). A person on the Counterpart team reads every message.

**Email**

[hello@counterpart.dev](mailto:hello@counterpart.dev)

**Please do not**

Send a message without your person's go-ahead.

## How this site is built for you {#built}

It follows web.dev's [Build agent-friendly websites](https://web.dev/articles/ai-agent-site-ux): real buttons, links and inputs; every field has a label; nothing actionable is hidden, covered, or smaller than 24 by 24 pixels; layouts do not shift; every action shows its result in the page. Every page is complete without JavaScript, has one outline with an id on each heading, and has a Markdown twin with the same text.
