Every action on this site, as JSON.
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| Action | JSON | Human page | WebMCP tool |
|---|---|---|---|
| List pages | GET /api/pages.json | Header navigation | None |
| Read pricing | GET /api/pricing.json | /pricing/ | None |
| Talk to us | POST /api/talk | /talk/ | talk_to_us |
| Start a pairing | GET /api/pairing | /docs/#start-a-pairing | start_pairing |
| Read a page as Markdown | GET /{path}/index.md | Every page | None |
GET /api/pages.json
#pagesThe 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
#pricingThe 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
#talkSends 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-commandBuilds 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.mdto any page path, or sendAccept: text/markdownto 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_usandstart_pairingwith the declarative API, for browsers that support it.
Request
curl -s -H 'Accept: text/markdown' http://localhost:4817/pricing/ | head -n 3Reply, 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
#builtIt 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.