# Ontario Protocol Preflight SDKs

Before an AI agent pays an unknown x402 endpoint, call Ontario:

```bash
python ontario_preflight.py https://example.com/api/paid-endpoint --max-usdc 0.05
```

Python:

```python
from ontario_preflight import assert_can_pay, can_pay, verified_services

decision = can_pay("https://example.com/api/paid-endpoint", max_usdc="0.05")
if decision["decision"] != "allow":
    raise RuntimeError(decision["reasons"])

# Or raise automatically before your agent signs payment.
assert_can_pay("https://example.com/api/paid-endpoint", max_usdc="0.05")

# Discover monitored services with signed report history.
services = verified_services(limit=25)
```

TypeScript:

```ts
import { assertCanPay, canPay, verifiedServices } from "./ontario-preflight";

const decision = await canPay("https://example.com/api/paid-endpoint", {
  maxUsdc: "0.05",
  policy: "strict",
});

if (decision.decision !== "allow") {
  throw new Error(decision.reasons.join("; "));
}

await assertCanPay("https://example.com/api/paid-endpoint", { maxUsdc: "0.05" });
const services = await verifiedServices(25);
```

Core endpoints:

- `POST /api/verify/x402-readiness`
- `POST /api/agent/can-pay`
- `POST /api/agent/verify-payment`
- `POST /api/agent/can-pay` with `{"sandbox": true}` for deterministic sandbox decisions
- `POST https://sandbox.ontarioprotocol.com/facilitator/verify`
- `POST https://sandbox.ontarioprotocol.com/facilitator/settle`
- `POST /api/sandbox/signup`
- `GET /api/verify/services`
- `GET /api/verify/services/{slug}`
- `GET /api/verify/history?target_url=...`
- `GET /api/verify/dataset.json`
- `POST /api/alerts/x402`
- `POST /api/x402/list-service/validate` (free listing payload validation; no payment; does not store a listing)
- `POST /api/x402/list-agent/validate` (free agent payload validation; no payment; does not store an agent)
- `GET /api/listings/status`
- `GET /.well-known/x402-trust.json`
- `GET /.well-known/agent-invite.json`
- `GET /.well-known/geo.json`
- `GET /discover?grade=ready`
- Demo page: `/sandbox/demo`
- Sandbox sample: `/static/sdk/agent_sandbox_example.py`

CI gate:

```yaml
- uses: ./.github/actions/ontario-x402-verify
  with:
    endpoint: https://example.com/api/paid-endpoint
    min-score: "85"
    require-grade: ready
```

Marketplace payload validation (no payment):

```bash
curl -sS https://ontarioprotocol.com/api/x402/list-service/validate \
  -H "Content-Type: application/json" \
  -d '{"name":"Example","description":"Paid endpoint","endpoint":"https://example.com/api/paid","method":"POST","price_usdc":"0.01","network":"base","owner_url":"https://example.com"}'
```
