# Seattle Organic SEO — Agent API v1

This is a public, **read-only** integration. It does not take payment, submit leads or schedule appointments. Version 1 is available at /api/v1/agent/. The older /api/agent/ paths continue working for compatibility. New breaking changes will use /api/v2/agent/ rather than silently changing v1 responses.

## Privacy

Full Privacy Policy: https://seattleorganicseo.com/privacy-policy/ . Short overview: https://seattleorganicseo.com/privacy/ . Company responses expose privacy_policy_url and privacy_overview_url.

## Routes

- GET https://seattleorganicseo.com/api/v1/agent/health — version and status
- GET https://seattleorganicseo.com/api/v1/agent/company — public agency description
- GET https://seattleorganicseo.com/api/v1/agent/contact — contact details, no submission
- GET https://seattleorganicseo.com/api/v1/agent/pricing — dated published-price snapshot
- GET https://seattleorganicseo.com/api/v1/agent/pages?page=1&per_page=2 — paginated approved page list
- GET https://seattleorganicseo.com/api/v1/agent/page?path=%2Fabout%2F — bounded public-page text
- Developer docs: https://seattleorganicseo.com/developers/
- OpenAPI 3.1: https://seattleorganicseo.com/openapi.json
- MCP: POST https://seattleorganicseo.com/mcp (JSON-RPC)
- ARD: https://seattleorganicseo.com/.well-known/ard.json
- A2A: https://seattleorganicseo.com/.well-known/agent-card.json, POST /a2a/v1 with JSON-RPC method `SendMessage` (A2A protocol v1.0)

## Errors

API errors use `application/problem+json` and have `type`, `title`, `status`, `code`, `detail`, and `instance` fields. Client errors (400/404/405) should not be retried without changes. For transient 502/503 failures, retry with backoff.

## Pagination

GET /api/v1/agent/pages?page=1&per_page=2 returns `data`, `pagination` with `has_more` and total, and `links.next`/`links.prev`. There are only a handful of allowlisted public pages at present.

## Idempotency and async work

These REST endpoints use GET and are naturally idempotent; there are no write actions requiring an Idempotency-Key. No REST asynchronous job queue or /jobs polling route exists. MCP notifications can receive 202 per MCP transport semantics and are **not** background jobs.

## GraphQL

This Worker does not expose a GraphQL API. WordPress or another upstream component may have separate endpoints; this document makes no GraphQL claim.
