# Authentication — Slipstream Advocacy

> **Scope note.** This file follows the *spirit* of `auth.md`: a plain-language,
> machine-readable description of how automated clients authenticate here. It does
> **not** implement the auth.md agent-registration protocol. There is no OAuth
> authorization server, no dynamic client registration, no agent identity
> endpoint, and no token endpoint on this domain — so there is deliberately no
> `/.well-known/openid-configuration`, `/.well-known/oauth-authorization-server`,
> or `/.well-known/oauth-protected-resource`. Publishing those would advertise
> endpoints that do not exist.
>
> The short version: **everything an agent can use here is open, and nothing an
> agent cannot use can be unlocked.**

## Open — no credentials required

No API key, no token, no CSRF header, no registration.

| Endpoint | Method | Notes |
| --- | --- | --- |
| `/api/accomplishments` | GET | Published legislative track record |
| `/api/accomplishments/{id}` | GET | One published accomplishment |
| `/api/contact` | POST | Submit an inquiry — rate limited, see below |
| `/api/status` | GET | Service health |
| `/mcp` | POST | MCP server, streamable HTTP |
| `/.well-known/*` | GET | Discovery documents |
| `/openapi.json` | GET | OpenAPI 3.1 description |
| `/auth.md`, `/index.md`, `/about.md`, `/services.md`, `/contact.md`, `/privacy.md` | GET | Markdown |

Public pages also return markdown when the request sends
`Accept: text/markdown`.

## Rate limits

`POST /api/contact` and the MCP `submit_inquiry` tool are limited to **5
submissions per IP per 15 minutes**, counted separately for each source. Over the
limit returns HTTP `429` (or an error result over MCP). Do not retry in a loop.

Read endpoints are not rate limited.

## Closed to agents

These require an interactive human session and cannot be accessed
programmatically. There is no way to request access for an agent.

- Everything under `/admin/*`
- `POST`, `PUT`, `DELETE` on `/api/accomplishments*`
- `PATCH`, `DELETE` on `/api/contact/{id}`
- `POST /api/upload`
- `/api/auth/*`

Authentication for these is a human email-and-password sign-in with a 24-hour
session cookie. There are no API keys, no service accounts, no client
credentials, and none are planned.

### About the CSRF header

The admin write endpoints above additionally require
`x-requested-with: XMLHttpRequest`. This is a defence-in-depth measure against
cross-site request forgery, **not** an authentication mechanism — those endpoints
also require a valid admin session, so sending the header on its own achieves
nothing.

It is **not** required on `POST /api/contact`, which is open.

## Conduct expected of agents

- Confirm the wording of an inquiry with the person you are acting for before
  submitting it. Do not send speculative or test inquiries.
- Identify yourself in your `User-Agent` where practical.
- Honour the content signals in [`/robots.txt`](/robots.txt): this content may be
  indexed and may be retrieved to answer questions with attribution, but may not
  be used to train generative AI models.

## Requesting access

There is no programmatic credential issuance. If you need access to something not
listed as open, a human should get in touch through
<https://slipstreamadvocacy.com/contact>.

## See also

- [`/docs/api`](/docs/api) — human-readable API documentation
- [`/.well-known/api-catalog`](/.well-known/api-catalog) — RFC 9727 catalog
- [`/.well-known/mcp/server-card.json`](/.well-known/mcp/server-card.json) — MCP server card
- [`/.well-known/agent-skills/index.json`](/.well-known/agent-skills/index.json) — agent skills
