# Authentication for automated clients — Black Powder Search

Most of this site needs no authentication at all. This file exists so an agent
does not waste a round trip discovering that.

## What is open, with no credentials

| Surface | What it gives you |
|---|---|
| `GET https://blackpowdersearch.com/mcp` | MCP server. POST JSON-RPC; `tools/list` enumerates the tools. |
| `POST https://blackpowdersearch.com/a2a` | A2A JSON-RPC endpoint. See `/.well-known/agent-card.json`. |
| `GET https://blackpowdersearch.com/llms.txt` | Plain-text overview of the firm, open roles and available talent. |
| `GET https://blackpowdersearch.com/llms-full.txt` | Every page as markdown, in one fetch. |
| `GET https://blackpowdersearch.com/<path>.md` | Any page as markdown. `Accept: text/markdown` works on the page URL too. |
| `GET https://blackpowdersearch.com/site-data.json` | Services, sectors, process and team as structured data. |
| `POST https://blackpowdersearch.com/api/intake` | Submit an inquiry. No key. Rate limited per IP. |

## What is closed, and why you cannot get in

Two areas require a human to sign in with a one-time email link, and **there is
no API key, service account or client-credentials flow for either**. This is
deliberate, not an omission.

- **`/admin`** — staff console. Publishing roles and candidate profiles.
- **`/portal`** — employer workspace. Requires an approved employer account
  *and* a signed site-use and fee agreement before it opens.

Confidential candidate records — real names, contact details, photographs,
resumes — are released by Black Powder Search to one employer at a time, under
agreement. They are not reachable from any public endpoint, are not in the
markdown mirrors, and are not returned by any MCP tool. Do not attempt to
resolve an anonymized profile to a named person.

## If you are submitting on someone's behalf

Send `X-Agent-Source: <your agent name>` with the request. It is advisory,
nothing is rejected for its absence, and nothing is verified — it exists so the
recruiter who picks the inquiry up knows a person did not type it, and opens the
callback accordingly.

Do not submit an inquiry the person has not asked for.

## Rate limits

`/api/intake` is limited per IP address. On a 429 the response carries
`Retry-After`; wait rather than retrying immediately. The MCP and A2A
endpoints are read-only and not currently rate limited, but are cached at the
edge — a freshly published role appears immediately, since those tools read the
database per request.
