{
  "name": "HookPulse",
  "description": "Dead-man switch de webhooks/cron. Cliente principal: agente de IA — toda ação da UI tem /api/* equivalente.",
  "build": "dev",
  "base_url": "https://hookpulse.net",
  "docs": {
    "llms": "https://hookpulse.net/llms.txt",
    "openapi": "https://hookpulse.net/openapi.json",
    "human_ui": "https://hookpulse.net/"
  },
  "conventions": {
    "format": "JSON em `/api/*`; erro `{ error, detail? }`.",
    "cors": "`Access-Control-Allow-Origin: *`.",
    "x402": "Paid actions return HTTP 402 with accepts[]; retry with X-PAYMENT.",
    "parity": "Mexeu na UI/API → apidocs + skill + MCP + llms no mesmo PR."
  },
  "auth": {
    "none": "Público, sem credencial.",
    "guest": "Guest token (`POST /api/guest`) em `X-Guest-Token: hp_…` ou `Authorization: Bearer hp_…`. Sessão `sess_…` também serve.",
    "session": "Sessão: `Authorization: Bearer sess_…` (OTP e-mail).",
    "token": "Token de operador `METRICS_TOKEN` em Bearer ou `?key=`.",
    "hook": "Token do endpoint em query `?token=` ou header `X-Hook-Token` (status/events)."
  },
  "endpoints": [
    {
      "method": "GET",
      "path": "/api/",
      "auth": "none",
      "summary": "Índice auto-descrito de toda a superfície.",
      "returns": "{ name, description, auth, endpoints[], quickstart[] }",
      "url": "https://hookpulse.net/api/",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/health",
      "auth": "none",
      "summary": "Liveness.",
      "returns": "{ ok, app, ts }",
      "url": "https://hookpulse.net/api/health",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "POST",
      "path": "/api/guest",
      "auth": "none",
      "summary": "Cria guest token `hp_…` (dono anônimo de endpoints).",
      "returns": "{ token }",
      "url": "https://hookpulse.net/api/guest",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/endpoints",
      "auth": "guest",
      "summary": "Lista endpoints do dono (guest ou sessão).",
      "returns": "{ endpoints[], guest, billing? }",
      "url": "https://hookpulse.net/api/endpoints",
      "auth_detail": "Guest token (`POST /api/guest`) em `X-Guest-Token: hp_…` ou `Authorization: Bearer hp_…`. Sessão `sess_…` também serve."
    },
    {
      "method": "POST",
      "path": "/api/endpoints",
      "auth": "guest",
      "summary": "Cria endpoint de dead-man. 2º+ ou intervalo < free_min → x402 (402 até pagar).",
      "body": {
        "name": "cron prod",
        "interval_sec": 900,
        "alert_to": "opcional@email.com"
      },
      "returns": "{ id, name, ingest_url, token, interval_sec, … }",
      "notes": [
        "Free: 1 endpoint, intervalo ≥ 900s. Preços em GET /api/billing."
      ],
      "url": "https://hookpulse.net/api/endpoints",
      "auth_detail": "Guest token (`POST /api/guest`) em `X-Guest-Token: hp_…` ou `Authorization: Bearer hp_…`. Sessão `sess_…` também serve."
    },
    {
      "method": "GET",
      "path": "/api/endpoints/:id",
      "auth": "hook",
      "summary": "Status de um endpoint (token de dono ou token do endpoint).",
      "returns": "{ id, healthy, overdue, last_event_at, ingest_url, … }",
      "url": "https://hookpulse.net/api/endpoints/:id",
      "auth_detail": "Token do endpoint em query `?token=` ou header `X-Hook-Token` (status/events)."
    },
    {
      "method": "PATCH",
      "path": "/api/endpoints/:id",
      "auth": "guest",
      "summary": "Atualiza nome/intervalo/alert_to (pode cobrar x402 se intervalo ficar pago).",
      "body": {
        "name": "…",
        "interval_sec": 300,
        "alert_to": null
      },
      "returns": "{ ok, endpoint }",
      "url": "https://hookpulse.net/api/endpoints/:id",
      "auth_detail": "Guest token (`POST /api/guest`) em `X-Guest-Token: hp_…` ou `Authorization: Bearer hp_…`. Sessão `sess_…` também serve."
    },
    {
      "method": "DELETE",
      "path": "/api/endpoints/:id",
      "auth": "guest",
      "summary": "Desativa/remove o endpoint do dono.",
      "returns": "{ ok }",
      "url": "https://hookpulse.net/api/endpoints/:id",
      "auth_detail": "Guest token (`POST /api/guest`) em `X-Guest-Token: hp_…` ou `Authorization: Bearer hp_…`. Sessão `sess_…` também serve."
    },
    {
      "method": "GET",
      "path": "/api/endpoints/:id/events",
      "auth": "hook",
      "summary": "Últimos pings recebidos no ingest.",
      "returns": "{ events[] }",
      "url": "https://hookpulse.net/api/endpoints/:id/events",
      "auth_detail": "Token do endpoint em query `?token=` ou header `X-Hook-Token` (status/events)."
    },
    {
      "method": "GET",
      "path": "/in/:id",
      "auth": "none",
      "summary": "URL de ingest — cron/webhook faz GET/POST aqui para provar vida.",
      "returns": "{ ok } ou texto curto",
      "url": "https://hookpulse.net/in/:id",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "POST",
      "path": "/in/:id",
      "auth": "none",
      "summary": "Mesmo ingest via POST (body opcional).",
      "returns": "{ ok }",
      "url": "https://hookpulse.net/in/:id",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/billing",
      "auth": "none",
      "summary": "Free tier, preços e parâmetros x402 (incl. contact_agent_usd).",
      "returns": "{ provider, network, prices, free_max_endpoints, … }",
      "url": "https://hookpulse.net/api/billing",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "POST",
      "path": "/api/contact",
      "auth": "none",
      "summary": "Suporte: Turnstile (humano) ou x402 $0.10 (agente).",
      "body": {
        "name": "…",
        "email": "a@example.com",
        "message": "…",
        "form_ts": 0
      },
      "returns": "{ ok, path } | 402 accepts[]",
      "url": "https://hookpulse.net/api/contact",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/me",
      "auth": "session",
      "summary": "Usuário da sessão + endpoints.",
      "returns": "{ user, endpoints[] }",
      "url": "https://hookpulse.net/api/me",
      "auth_detail": "Sessão: `Authorization: Bearer sess_…` (OTP e-mail)."
    },
    {
      "method": "POST",
      "path": "/api/auth/start",
      "auth": "none",
      "summary": "Envia OTP por e-mail.",
      "body": {
        "email": "voce@exemplo.com"
      },
      "returns": "{ ok }",
      "url": "https://hookpulse.net/api/auth/start",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "POST",
      "path": "/api/auth/verify",
      "auth": "none",
      "summary": "Troca OTP por sessão sess_…",
      "body": {
        "email": "voce@exemplo.com",
        "code": "123456"
      },
      "returns": "{ ok, token, user }",
      "url": "https://hookpulse.net/api/auth/verify",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "POST",
      "path": "/api/auth/claim",
      "auth": "session",
      "summary": "Move endpoints do guest para a conta.",
      "body": {
        "guest_token": "hp_…"
      },
      "returns": "{ ok, claimed }",
      "url": "https://hookpulse.net/api/auth/claim",
      "auth_detail": "Sessão: `Authorization: Bearer sess_…` (OTP e-mail)."
    },
    {
      "method": "POST",
      "path": "/api/auth/logout",
      "auth": "session",
      "summary": "Invalida sessão.",
      "returns": "{ ok }",
      "url": "https://hookpulse.net/api/auth/logout",
      "auth_detail": "Sessão: `Authorization: Bearer sess_…` (OTP e-mail)."
    },
    {
      "method": "POST",
      "path": "/api/visit",
      "auth": "none",
      "summary": "Ping de audiência da UI (agente ignora).",
      "body": {
        "p": "/"
      },
      "returns": "{ ok, counted }",
      "url": "https://hookpulse.net/api/visit",
      "auth_detail": "Público, sem credencial."
    },
    {
      "method": "GET",
      "path": "/api/metrics",
      "auth": "token",
      "summary": "Métricas 7d (operador).",
      "returns": "{ app, visits[], … }",
      "url": "https://hookpulse.net/api/metrics",
      "auth_detail": "Token de operador `METRICS_TOKEN` em Bearer ou `?key=`."
    }
  ],
  "mcp_tools": [
    "api_index",
    "health",
    "create_guest",
    "list_endpoints",
    "create_endpoint",
    "get_endpoint",
    "delete_endpoint",
    "list_events",
    "ping_ingest",
    "billing",
    "contact"
  ],
  "quickstart": [
    "TOKEN=$(curl -s -XPOST https://hookpulse.net/api/guest -H 'content-type: application/json' -d '{}' | jq -r .token)",
    "curl -s -XPOST https://hookpulse.net/api/endpoints -H \"content-type: application/json\" -H \"X-Guest-Token: $TOKEN\" -d '{\"name\":\"demo\",\"interval_sec\":900}'",
    "curl -s https://hookpulse.net/api/billing"
  ]
}