Every action on this site, as JSON.

Version 0.2.0 Updated Markdown twin /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
ActionJSONHuman pageWebMCP tool
List pagesGET /api/pages.jsonHeader navigationNone
Read pricingGET /api/pricing.json/pricing/None
Talk to usPOST /api/talk/talk/talk_to_us
Start a pairingGET /api/pairing/docs/#start-a-pairingstart_pairing
Read a page as MarkdownGET /{path}/index.mdEvery pageNone

GET /api/pages.json

#pages

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

Request

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

Reply, 200 (first entry)

{
  "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

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

Reply, 200 (excerpt)

{ "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

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

{
  "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

{
  "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.

Request

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

Reply, 200

{
  "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, A2A protocol 1.0 (spec release v1.0.1). The A2A endpoint it names answers 501 in this prototype.
OpenAPI
/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 (one line per page), /llms-full.txt (every twin), /sitemap.xml, /robots.txt.
WebMCP
The two forms declare talk_to_us and start_pairing with the declarative API, for browsers that support it.

Request

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

Reply, 200

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

How to reach a human

#human
Form
/talk/. A person on the Counterpart team reads every message.
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: 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.