{
  "service": "exchange-pwa",
  "version": "0.1.0",
  "description": "Progressive web app and edge microservice for the exchange turn-or-hold surface.",
  "origin": "https://exchange.starlightglobal.industries",
  "phase": "waitlist",
  "upstream": {
    "configured": true,
    "credential": true,
    "service": "exchange",
    "repository": "apps/exchange"
  },
  "authentication": {
    "configured": true,
    "providers": [
      "github"
    ],
    "planned": [
      "github",
      "email",
      "google"
    ],
    "available": [
      "github"
    ]
  },
  "authorization": {
    "access": {
      "mode": "allowlist",
      "store": true
    },
    "store": true,
    "roles": [
      "member",
      "operator",
      "smoke"
    ],
    "capabilities": {
      "economics:read": {
        "summary": "What an item is worth selling now, against what it costs to keep holding it.",
        "fields": [
          "expected_net",
          "margin_ratio",
          "declared_value",
          "realizable",
          "holding_cost_per_year",
          "break_even_days",
          "carry.total",
          "carry.known",
          "carry.contributions"
        ],
        "roles": [
          "operator"
        ]
      },
      "exchange:post": {
        "summary": "Offer your items for matching and register what you are looking for.",
        "fields": [],
        "roles": [
          "operator"
        ],
        "ledger": "pause: false"
      }
    }
  },
  "endpoints": {
    "health": {
      "method": "GET",
      "path": "/api/health",
      "tier": "public"
    },
    "session": {
      "method": "GET",
      "path": "/api/session",
      "tier": "session"
    },
    "waitlist_request": {
      "method": "POST",
      "path": "/api/waitlist/request",
      "tier": "public"
    },
    "waitlist_confirm": {
      "method": "POST",
      "path": "/api/waitlist/confirm",
      "tier": "public",
      "page": {
        "method": "GET",
        "note": "The emailed link. It renders a button that POSTs; opening it confirms nothing."
      }
    },
    "turn": {
      "method": "GET",
      "path": "/api/turn",
      "tier": "session"
    },
    "sign_in": {
      "method": "{see start_methods}",
      "start_methods": {
        "github": "GET",
        "email": "POST"
      },
      "path": "/api/auth/{provider}/start",
      "tier": "public"
    },
    "sign_in_callback": {
      "method": "GET",
      "path": "/api/auth/{provider}/callback",
      "tier": "public"
    },
    "sign_out": {
      "method": "POST",
      "path": "/api/auth/signout",
      "tier": "public"
    },
    "ebay_notifications": {
      "method": "GET, POST",
      "path": "/api/ebay/notifications",
      "tier": "ebay-signed"
    }
  },
  "ebay": {
    "challenge": false,
    "verification": false,
    "orders": true
  },
  "datasets": {
    "reference": {
      "path": "/api/reference",
      "tier": "session",
      "cost": "worker-invocation"
    }
  },
  "conformance": {
    "acp": "unverified",
    "note": "This is a client of the exchange matching engine, not an implementation of any agent-commerce protocol."
  }
}