---
title: "agdata docs"
description: "The reference: how a call is paid, the routes, limits, response shapes, failures and refunds, Solana, MCP and discovery. The landing page has the short version."
canonical: "/docs"
updated: "2026-10-07"
---

# agdata docs

The reference: how a call is paid, the routes, limits, response shapes, failures and refunds, Solana, MCP and discovery. The landing page has the short version.

## How a call is paid

Calls are paid in stablecoins: x402 on Base and Polygon (plus Solana on some routes) or MPP on Base.

Every route is one HTTP call. Send the JSON body with no payment: the answer is `402` with the quote for exactly that body, in the `PAYMENT-REQUIRED` header (x402) and a `WWW-Authenticate: Payment` challenge (MPP). Sign one and send the same body again with `PAYMENT-SIGNATURE` (x402) or `Authorization: Payment` (MPP). Either credential is accepted on either path.

Ask: POST the body to `/x402/<route>` or `/mpp/<route>`, with no payment.

Pay: sign the quote in stablecoins and repeat the same body with the payment.

Receive: `200` with the data and an `X-Agdata-Results-Delivered` header.

Refund: a short result is refunded on-chain for the part not delivered, in the background.

The quote is for the full call. A call that cannot be served is refused before anything settles, so nothing is charged.

## Routes

Each route is served on `/x402/<name>` and on `/mpp/<name>`, with the same body and the same price. The table lists the routes this server serves, with what each one returns; the response shape section explains the common fields.

RouteWhat it returnsSolana

POST /x402/unblockUnblocker: any URL to clean Markdownno

POST /x402/instagramInstagram posts by profile, tag, searchyes

POST /x402/google-mapsGoogle Maps places and businessesyes

POST /x402/tiktokTikTok videos by user, hashtag, searchyes

POST /x402/linkedinLinkedIn profile lookupyes

POST /x402/youtubeYouTube video search and channel videosyes

POST /x402/twitterX (Twitter) tweets by handle or searchno

POST /x402/redditReddit posts by subreddit, user, searchno

POST /x402/amazonAmazon product searchyes

POST /x402/google-searchGoogle Search results (SERP)yes

POST /x402/google-maps-reviewsGoogle Maps reviews of a placeyes

POST /x402/youtube-transcriptYouTube transcript of a videono

POST /x402/screenshotWebsite screenshot or PDF of any URLno

POST /x402/linkedin-jobsLinkedIn job listings for a searchno

POST /x402/indeed-jobsIndeed job listings for a searchyes

POST /x402/google-newsGoogle News articles for a searchyes

POST /x402/amazon-reviewsAmazon customer reviews of a productno

POST /x402/web-searchWeb search with page contentno

POST /x402/x-repliesReplies to a post on Xno

POST /x402/youtube-commentsComments under a YouTube videono

POST /x402/tiktok-commentsComments under a TikTok videono

POST /x402/instagram-commentsComments under an Instagram postno

POST /x402/search-plusWeb or news search with excerptsyes

## Limits and the quote

Routes that return lists take a `limit`, with a default and a maximum set by the server. The quote is for the full `limit`; what the call delivers is what is kept.

the unblocker, the screenshot, the transcript and the LinkedIn profile are single-item routes: no `limit`, one flat quote.

An unpaid call with a valid body always returns the quote, so you can read the price before you sign anything.

## Response shape

Most routes return the source's records in a fixed JSON shape. Instagram, YouTube, LinkedIn and Amazon can be served by more than one provider: each record keeps the provider's own fields and gains `source` and a `normalized` object with the same keys for every provider, `null` where a provider has no value.

Reddit and TikTok return compact records by default; `raw: true` returns the source's own records.

The unblocker returns one record: `url`, `finalUrl`, `statusCode`, `contentType`, `title`, `description`, `language`, `format`, `content` and `truncated`. `content` is Markdown unless you ask for `html` or `text`, and it is cut at 512 KiB.

## Failures and refunds

A call whose source returned nothing is never settled. The answer is `502` with `error: not_fetched` and `charged: false`, and the same payment can be used for a retry.

An unblocked page counts as delivered only when it is a real page: a block, challenge or error page is not charged.

A list with fewer results than the `limit` is settled for what came back, and the rest is refunded on-chain to the paying address.

Empty and placeholder answers are never cached.

A call the service cannot serve, or a payment that cannot be verified, is refused before it settles.

## Solana

Solana is offered on most routes, paid with x402. The routes table says which routes are not offered on Solana, because their runs take longer than a Solana payment window.

## MCP tools

`POST /mcp` is a remote MCP server (streamable HTTP, stateless): one tool per route, named like the route, with the route's own input schema. A tool call without payment returns the x402 quote in the result; the retry carries the signed payment in `_meta`, and the settlement comes back in the result.

## Feedback

`POST /feedback`, and the MCP tool `feedback`, are free and open, with no account. Send a message, and optionally a kind (bug, idea, praise or other), the route and a contact. Only the text and those fields are stored; no IP address and no wallet.

## Reliability and limits

There is no uptime SLA or uptime guarantee. Service and upstream availability are best-effort and can change.

A quote is shown before payment, and work starts only after settlement. A request refused before settlement is not charged; product-specific refund rules for partial results, orders and deals are described below.

Paid calls have no universal concurrency quota. Individual routes may have stricter caps: some routes allow only a few in-flight calls per target host or per route. Calls are cut off at their configured upstream deadline (normally 120 seconds, with shorter caps on some routes). For a short result, the missing portion is refunded; an undeliverable result is not charged.

Free GET docs, guides, pricing and discovery pages are limited to 120 requests per client IP per minute. They return RateLimit headers; a limit response is HTTP 429 with Retry-After. GET /health is a liveness check, not an uptime promise.

Failures are signalled with HTTP 402 when payment is required, 429 when a request is limited, 502 when a result cannot be delivered, and 503 when the service cannot accept work. Follow Retry-After when present. Report problems on the contact page at /contact.

## How it differs

API-key scraping services and data marketplaces commonly use accounts, keys, subscriptions, credits or monthly billing; agdata quotes each call before stablecoin payment and charges for delivered results.

## Discovery

`/openapi.json`: the OpenAPI 3.1 document, with the request schemas and the payment info.

`/.well-known/x402`: the x402 manifest.

`/agents.md`: the guide for agents (preferred), with the routes and the flow; `/llms.txt` is the same text for older tools.

`/pricing.md`: generated endpoint prices and quote behavior.

`/health`: the service's status.

Try the service without paying: send a GET request to a listed endpoint to receive its free `402` quote, then decide whether to sign and pay. The quote request does not start a paid delivery.

The free `GET /ask?query=...` route searches the product reference. When available, `POST /mcp/docs` is a free, read-only documentation server with search, section lookup, and endpoint schema tools.

[Official MCP registry entry](https://registry.modelcontextprotocol.io/?q=dev.shveik/agdata) · [Glama listing](https://glama.ai/mcp/connectors/dev.shveik/agdata) · [Smithery listing](https://smithery.ai/servers/shveik/agdata) · [Agent guide](/agents.md) · [OpenAPI](/openapi.json) · [x402 manifest](/.well-known/x402)

## API versioning and deprecation policy

Versioned REST resources use `/v1`. Paid endpoint paths remain the documented `/x402/<name>` and `/mpp/<name>` forms; consult `/openapi.json` for the current contract. We aim to preserve compatible behavior within a version.

For a breaking change to a stable API surface, we will announce it in the documentation and provide `Deprecation` and `Sunset` response headers where applicable, with at least 90 days' notice before removal. Preview and upstream-dependent behavior can change sooner; check the live documentation.

## Authentication and payment

No API key, account, or subscription is required. Payment credentials authorize a specific quoted call and replace a reusable API key. Supported protocols on this service: x402 on Base and Polygon (plus Solana on some routes) or MPP on Base.

For x402, send a valid request without payment and read the HTTP 402 `PAYMENT-REQUIRED` challenge. Sign the offered amount and network, then retry the same request with `PAYMENT-SIGNATURE`. For MPP, the unpaid response includes `WWW-Authenticate: Payment`; retry with the matching `Authorization: Payment` credential. Never authorize a quote you have not checked.

A paid request delivers data only after settlement succeeds. The protocols accept their corresponding payment credential; use the route family's documented path and the exact body used to obtain the quote.

See the [API deprecation policy](/deprecation-policy) for route lifecycle commitments.

## Request examples

unblock
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/unblock' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"format":"markdown","url":"https://example.com/"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/unblock` (x402) or `https://agdata.shveik.dev/mpp/unblock` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
instagram
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/instagram' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":5,"mode":"profile","query":"natgeo"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/instagram` (x402) or `https://agdata.shveik.dev/mpp/instagram` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
google-maps
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/google-maps' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":5,"location":"Prague","query":"coffee shops"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/google-maps` (x402) or `https://agdata.shveik.dev/mpp/google-maps` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
tiktok
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/tiktok' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":5,"mode":"profile","query":"nasa"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/tiktok` (x402) or `https://agdata.shveik.dev/mpp/tiktok` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
linkedin
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/linkedin' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"query":"jane-example"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/linkedin` (x402) or `https://agdata.shveik.dev/mpp/linkedin` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
youtube
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/youtube' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":5,"mode":"search","query":"web scraping tutorials"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/youtube` (x402) or `https://agdata.shveik.dev/mpp/youtube` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
twitter
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/twitter' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":5,"mode":"profile","query":"elonmusk"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/twitter` (x402) or `https://agdata.shveik.dev/mpp/twitter` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
reddit
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/reddit' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":5,"mode":"hashtag","query":"programming"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/reddit` (x402) or `https://agdata.shveik.dev/mpp/reddit` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
amazon
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/amazon' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":5,"query":"wireless keyboard"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/amazon` (x402) or `https://agdata.shveik.dev/mpp/amazon` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
google-search
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/google-search' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":5,"query":"best CRM tools"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/google-search` (x402) or `https://agdata.shveik.dev/mpp/google-search` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
google-maps-reviews
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/google-maps-reviews' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":10,"place":"ChIJN1t_tDeuEmsRUsoyG83frY4"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/google-maps-reviews` (x402) or `https://agdata.shveik.dev/mpp/google-maps-reviews` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
youtube-transcript
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/youtube-transcript' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"format":"json","lang":"en","video":"dQw4w9WgXcQ"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/youtube-transcript` (x402) or `https://agdata.shveik.dev/mpp/youtube-transcript` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
screenshot
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/screenshot' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"format":"jpeg","url":"https://example.com/"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/screenshot` (x402) or `https://agdata.shveik.dev/mpp/screenshot` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
linkedin-jobs
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/linkedin-jobs' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":10,"location":"Prague","query":"data engineer"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/linkedin-jobs` (x402) or `https://agdata.shveik.dev/mpp/linkedin-jobs` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
indeed-jobs
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/indeed-jobs' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"country":"us","limit":10,"location":"Austin, TX","query":"nurse"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/indeed-jobs` (x402) or `https://agdata.shveik.dev/mpp/indeed-jobs` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
google-news
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/google-news' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":10,"query":"openai"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/google-news` (x402) or `https://agdata.shveik.dev/mpp/google-news` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
amazon-reviews
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/amazon-reviews' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":10,"product":"B079JLY5M5"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/amazon-reviews` (x402) or `https://agdata.shveik.dev/mpp/amazon-reviews` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
web-search
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/web-search' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":3,"query":"lithium prices"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/web-search` (x402) or `https://agdata.shveik.dev/mpp/web-search` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
x-replies
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/x-replies' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":10,"url":"https://x.com/NASA/status/2106751099063484493"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/x-replies` (x402) or `https://agdata.shveik.dev/mpp/x-replies` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
youtube-comments
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/youtube-comments' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":20,"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/youtube-comments` (x402) or `https://agdata.shveik.dev/mpp/youtube-comments` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
tiktok-comments
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/tiktok-comments' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":20,"url":"https://www.tiktok.com/@nasa/video/7665075736742530317"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/tiktok-comments` (x402) or `https://agdata.shveik.dev/mpp/tiktok-comments` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
instagram-comments
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/instagram-comments' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"limit":20,"url":"https://www.instagram.com/p/DdG4RIxIPyf/"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/instagram-comments` (x402) or `https://agdata.shveik.dev/mpp/instagram-comments` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.
search-plus
First send this valid request without payment. The response is HTTP 402 with the current quote. Review and sign that quote, then retry the same request and body at the MPP path with `Authorization: Payment`, or retry the x402 path with `PAYMENT-SIGNATURE`.

`curl -i -X POST 'https://agdata.shveik.dev/x402/search-plus' -H 'content-type: application/json' --data-binary @- <<'JSON'
{"category":"developer","limit":10,"query":"fastapi websocket disconnect"}
JSON`

Paid retry paths: `https://agdata.shveik.dev/x402/search-plus` (x402) or `https://agdata.shveik.dev/mpp/search-plus` (MPP), with the same JSON body and matching `PAYMENT-SIGNATURE` or `Authorization: Payment` credential.

## Command-line tool

A small shell script (needs only sh and curl) lists the endpoints, prints the quote of a call and sends a call you have already signed. It never holds keys and never signs a payment.

`curl -fsSL https://agdata.shveik.dev/install.sh | sh
agdata help
agdata endpoints`

Commands: help, endpoints, docs, pricing, openapi, quote, call, health, version, update. Exit code 3 means a payment is required and the quote was printed. The installer puts the script in ~/.local/bin; its source is at /cli.

