{"openapi":"3.1.0","info":{"title":"Atlas One API","description":"Governed external-context platform: weather, traffic, and routing snapshots with freshness, attribution, and project isolation.","version":"1.0.0"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Project API key as Bearer token"},"apiKey":{"type":"apiKey","name":"x-api-key","in":"header","description":"Project API key"},"clerkBearer":{"type":"http","scheme":"bearer","description":"Clerk session JWT for control-plane routes"}},"schemas":{}},"paths":{"/v1/openapi.json":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/health":{"get":{"summary":"Liveness probe","tags":["Health"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"status":{"type":"string"},"service":{"type":"string"},"timestamp":{"type":"string"}}}}}}}}},"/ready":{"get":{"summary":"Readiness probe","tags":["Health"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/providers":{"get":{"summary":"List registered context providers","tags":["Providers"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"providers":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}},"/v1/context/queries":{"post":{"summary":"Create context query for weather, traffic, routing, and/or hazard","tags":["Context"],"description":"Kind-first query. Reuses project-scoped cached snapshots when permitted. Provider failures for a kind return HTTP 200 with a failed snapshot (freshnessStatus unavailable) rather than aborting sibling kinds. When routing is requested with siblings, routing executes first internally so weather/traffic/hazard can use route geometry; results[] still match requested kinds order. Google Routes is never called unless routing is requested. Hazard results are filtered to events within/near the queried corridor (far-away 'none' exposure events are dropped); use options.hazard.corridorBufferKm to widen or narrow that radius (default 50 km). options.allowStale, options.freshnessPolicy, options.routing, and options.hazard control cache eligibility, route-spine, and hazard-corridor behavior.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["kinds","location","timeWindow"],"additionalProperties":true,"properties":{"kinds":{"type":"array","items":{"type":"string","enum":["weather","traffic","routing","hazard"]}},"location":{"type":"object","additionalProperties":true},"timeWindow":{"type":"object","additionalProperties":true},"requestedAt":{"type":"string"},"providerRefs":{"type":"array","items":{"type":"string"}},"options":{"type":"object","additionalProperties":true,"properties":{"allowStale":{"type":"boolean"},"freshnessPolicy":{"type":"object","additionalProperties":true},"hazard":{"type":"object","additionalProperties":true,"properties":{"corridorBufferKm":{"type":"number","minimum":0}}}}}}}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"requestId":{"type":"string"},"results":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}},"/v1/context/snapshots/{snapshotId}":{"get":{"summary":"Get a project-scoped context snapshot by id","tags":["Context"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"snapshotId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/context/compare":{"post":{"summary":"Compare two same-kind context snapshots","tags":["Context"],"description":"Deterministic project-scoped snapshot diff with materiality classification. Baseline and candidate must share the same context kind. Missing or cross-project snapshot ids return snapshot_not_found. Hard scope/kind incompatibilities return comparison_incompatible (422). changeClassifications is the authoritative rich model; reasons is the compact compatibility representation. Multi-kind request comparison is a follow-up (POST /v1/context/compare-requests).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"baselineSnapshotId":{"type":"string"},"candidateSnapshotId":{"type":"string"},"baselineSnapshot":{"type":"object","additionalProperties":true},"candidateSnapshot":{"type":"object","additionalProperties":true}}}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"comparisonId":{"type":"string"},"createdAt":{"type":"string"},"materiallyChanged":{"type":"boolean"},"changeClassifications":{"type":"array","items":{"type":"string"}},"reasons":{"type":"array","items":{"type":"string"}}}}}}}}}},"/v1/context/compare-requests":{"post":{"summary":"Compare two multi-kind context requests","tags":["Context"],"description":"Loads snapshots linked to two context request ids and runs per-kind snapshot comparison. Uses requested kinds from each request to distinguish query-shape changes (kind_added/kind_removed) from environmental materiality. Missing or cross-project request ids return request_not_found.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["baselineRequestId","candidateRequestId"],"properties":{"baselineRequestId":{"type":"string"},"candidateRequestId":{"type":"string"}}}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"comparisonId":{"type":"string"},"createdAt":{"type":"string"},"materiallyChanged":{"type":"boolean"},"kindResults":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}},"/v1/weather/history/query":{"post":{"summary":"Query historical weather conditions for a location and time range","tags":["Weather"],"description":"Returns structured, source-attributed historical weather observations plus a deterministic period summary — evidence for supply-chain/logistics use cases (e.g. was a shipment near heavy rain), never a causal claim about a delay or disruption. Historical data is immutable and cached long-term. Future time ranges, excessive query ranges, and unsupported variables are rejected.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["location","startTime","endTime","granularity","variables"],"additionalProperties":true,"properties":{"location":{"type":"object","additionalProperties":true},"startTime":{"type":"string"},"endTime":{"type":"string"},"granularity":{"type":"string"},"variables":{"type":"array","items":{"type":"string"}},"timezone":{"type":"string"}}}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/control-plane/me":{"get":{"summary":"Bootstrap session: resolve Clerk user to Atlas One account","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/control-plane/projects":{"get":{"summary":"List projects for the active account","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create a project","tags":["ControlPlane"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"environment":{"type":"string","enum":["development","production"]}}}}}},"security":[{"clerkBearer":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/projects/{projectId}":{"get":{"summary":"Get a project","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Update a project","tags":["ControlPlane"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"environment":{"type":"string","enum":["development","production"]},"status":{"type":"string","enum":["active","archived"]}}}}}},"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/projects/{projectId}/api-keys":{"get":{"summary":"List API keys for a project (never includes secrets)","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create an API key (plaintext secret returned once)","tags":["ControlPlane"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["label"],"properties":{"label":{"type":"string"},"clientRequestId":{"type":"string"}}}}}},"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/projects/{projectId}/api-keys/{apiKeyId}":{"delete":{"summary":"Revoke an API key","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true},{"schema":{"type":"string"},"in":"path","name":"apiKeyId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/usage":{"get":{"summary":"Get metered usage for the current UTC month","tags":["ControlPlane"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"projectId","required":false}],"security":[{"clerkBearer":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/projects/{projectId}/usage":{"get":{"summary":"Get account metered usage and project Google Routes live usage for a project","tags":["ControlPlane"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true}],"security":[{"clerkBearer":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/projects/{projectId}/watches":{"get":{"summary":"List watches for a project","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create a watch","tags":["ControlPlane"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/projects/{projectId}/watches/{watchId}":{"get":{"summary":"Get a watch","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true},{"schema":{"type":"string"},"in":"path","name":"watchId","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete (soft) a watch","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true},{"schema":{"type":"string"},"in":"path","name":"watchId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/projects/{projectId}/watches/{watchId}/webhook-subscriptions":{"get":{"summary":"List a watch's webhook subscriptions","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true},{"schema":{"type":"string"},"in":"path","name":"watchId","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Subscribe a watch to a webhook endpoint","tags":["ControlPlane"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["webhookEndpointId"],"properties":{"webhookEndpointId":{"type":"string"},"eventTypes":{"type":"array","items":{"type":"string"}}}}}}},"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true},{"schema":{"type":"string"},"in":"path","name":"watchId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/projects/{projectId}/watches/{watchId}/webhook-subscriptions/{subscriptionId}":{"delete":{"summary":"Disable a watch's webhook subscription","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true},{"schema":{"type":"string"},"in":"path","name":"watchId","required":true},{"schema":{"type":"string"},"in":"path","name":"subscriptionId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/projects/{projectId}/webhook-endpoints":{"get":{"summary":"List webhook endpoints for a project (never includes secrets)","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Register a webhook endpoint (plaintext secret returned once)","tags":["ControlPlane"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string"}}}}}},"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/projects/{projectId}/webhook-endpoints/{endpointId}":{"delete":{"summary":"Disable a webhook endpoint","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"projectId","required":true},{"schema":{"type":"string"},"in":"path","name":"endpointId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/projects/{projectId}/webhook-endpoints/{endpointId}/deliveries":{"get":{"summary":"List recent delivery attempts for a webhook endpoint","tags":["ControlPlane"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"before","required":false},{"schema":{"type":"string"},"in":"path","name":"projectId","required":true},{"schema":{"type":"string"},"in":"path","name":"endpointId","required":true}],"security":[{"clerkBearer":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/playground/queries":{"post":{"summary":"Run a playground context query (no API key required)","tags":["ControlPlane"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["projectId"],"properties":{"projectId":{"type":"string"},"scenario":{"type":"string","enum":["routing-hazard","hazard-louisville-columbus","hazard-cincinnati-columbus","hazard-lake-charles-nola","hazard-chihuahua-el-paso","hazard-san-jose-limon","hazard-seoul-busan","hazard-lublin-warsaw","hazard-islamabad-peshawar","hazard-memphis-atlanta-clear","weather-traffic","weather-memphis-atlanta","weather-chicago-detroit","weather-dallas-houston","weather-seattle-portland","weather-la-sf","weather-nyc-boston","full-houston-nola"]},"query":{"type":"object","additionalProperties":true}}}}}},"security":[{"clerkBearer":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/mcp-oauth-connections/consent-context":{"get":{"summary":"List eligible Atlas accounts for MCP OAuth consent/bind","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/mcp-oauth-connections/bind":{"post":{"summary":"Create or replace an MCP OAuth connection grant","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/mcp-oauth-connections":{"get":{"summary":"List MCP OAuth connections for the active account","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/mcp-oauth-connections/{connectionId}/revoke":{"post":{"summary":"Revoke an MCP OAuth connection (Atlas soft-revoke)","tags":["ControlPlane"],"security":[{"clerkBearer":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"connectionId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/control-plane/invitations":{"post":{"summary":"Invite a teammate to the inviter's Atlas account","tags":["ControlPlane"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"email":{"type":"string"}}}}}},"security":[{"clerkBearer":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/watches":{"post":{"summary":"Create a saved watch","tags":["Watches"],"description":"Saves a context query + notification policy as a watch. A watch is configuration only — creating one never schedules provider calls. Pass webhookEndpointId to atomically create and activate its first webhook subscription (status becomes 'active' and provider spend begins); omit it to leave the watch in 'draft'.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","query","policy"],"additionalProperties":true,"properties":{"name":{"type":"string"},"query":{"type":"object","additionalProperties":true},"policy":{"type":"object","additionalProperties":true},"webhookEndpointId":{"type":"string"}}}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"get":{"summary":"List watches for the authenticated project","tags":["Watches"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"watches":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}},"/v1/watches/{watchId}":{"get":{"summary":"Get a project-scoped watch by id","tags":["Watches"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"watchId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"delete":{"summary":"Soft-delete a watch","tags":["Watches"],"description":"Sets status to 'deleted', disables its subscription, clears next_check_at, and best-effort deletes its schedule. Historical runs, events, and deliveries are preserved.","parameters":[{"schema":{"type":"string"},"in":"path","name":"watchId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/watches/{watchId}/webhook-subscriptions":{"post":{"summary":"Subscribe a watch to a webhook endpoint","tags":["Watches"],"description":"Activates the watch's first (and, for this release, only) webhook subscription. This is the call that actually authorizes recurring execution and provider spend — the watch transitions draft -> active and its refresh schedule is created here, not at watch-creation time.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["webhookEndpointId"],"additionalProperties":true,"properties":{"webhookEndpointId":{"type":"string"},"eventTypes":{"type":"array","items":{"type":"string"}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"watchId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"get":{"summary":"List a watch's webhook subscriptions","tags":["Watches"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"watchId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"subscriptions":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}},"/v1/watches/{watchId}/webhook-subscriptions/{subscriptionId}":{"delete":{"summary":"Disable a watch's webhook subscription","tags":["Watches"],"description":"Disabling the watch's last active subscription automatically drops the watch to 'draft' and clears its schedule — an unsubscribed watch must stop costing money.","parameters":[{"schema":{"type":"string"},"in":"path","name":"watchId","required":true},{"schema":{"type":"string"},"in":"path","name":"subscriptionId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/webhook-endpoints":{"post":{"summary":"Register an outbound webhook endpoint","tags":["WebhookEndpoints"],"description":"Returns the raw signing secret exactly once — it is encrypted at rest and cannot be retrieved again. Registering an endpoint alone never activates any watch; use POST /v1/watches/:watchId/webhook-subscriptions to subscribe a watch to it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"additionalProperties":true,"properties":{"url":{"type":"string"}}}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"get":{"summary":"List webhook endpoints for the authenticated project","tags":["WebhookEndpoints"],"description":"Never returns the signing secret — only its last four characters.","security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"webhookEndpoints":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}},"/v1/webhook-endpoints/{endpointId}/deliveries":{"get":{"summary":"List recent delivery attempts for a webhook endpoint","tags":["WebhookEndpoints"],"description":"Most-recent-first delivery log (timestamp, event type, response status, error). Preserved even after the endpoint is disabled. Use `before` (ISO timestamp) to page.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"before","required":false},{"schema":{"type":"string"},"in":"path","name":"endpointId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"deliveries":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}},"/v1/webhook-endpoints/{endpointId}":{"delete":{"summary":"Disable a webhook endpoint","tags":["WebhookEndpoints"],"description":"Soft-disables the endpoint (never a hard delete — delivery history references it) and cascades to every subscription referencing it. Any watch whose only active subscription pointed here drops to 'draft'. No blocking error, no cascade flag needed.","parameters":[{"schema":{"type":"string"},"in":"path","name":"endpointId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/policy-events/query":{"post":{"summary":"Query policy events visible to the caller","tags":["Policy"],"description":"Returns mediated policy event views (canonical cluster member + caller-visible siblings). Never returns raw unscoped global store rows. Optional include fields: probability, research, exposures, hypotheses. Optional domain filter matches HS (hierarchical), commodity/concept/industry aliases, or controlled text — missing HS is not a reject.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"eventTypes":{"type":"array","items":{"type":"string"}},"lifecycleStatuses":{"type":"array","items":{"type":"string"}},"jurisdictions":{"type":"array","items":{"type":"string"}},"updatedAfter":{"type":"string"},"policyTradeWatchId":{"type":"string"},"domain":{"type":"object","additionalProperties":true,"properties":{"version":{"type":"string"},"hsCodes":{"type":"array","items":{"type":"string"}},"concepts":{"type":"array","items":{"type":"string"}},"industries":{"type":"array","items":{"type":"string"}},"commodities":{"type":"array","items":{"type":"string"}},"names":{"type":"array","items":{"type":"string"}},"affectedCountries":{"type":"array","items":{"type":"string"}},"eventTypes":{"type":"array","items":{"type":"string"}}}},"limit":{"type":"integer"},"cursor":{"type":"string"},"include":{"type":"array","items":{"type":"string"}}}}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/policy-events/{policyEventId}":{"get":{"summary":"Get a policy event by id","tags":["Policy"],"description":"Returns a mediated PolicyEventApiViewV1 for a visible event. Invisible ids return 404 without leaking cluster membership.","parameters":[{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"include","required":false},{"schema":{"type":"string"},"in":"path","name":"policyEventId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/policy-domain/resolve":{"post":{"summary":"Resolve a friendly name or industry to a domain filter (incl. HS chapters)","tags":["Policy"],"description":"Maps everyday product/industry names (e.g. \"steel manufacturing\") through a hermetic concept catalog to HS chapters + concepts/commodities. No LLM. Unknown names return matched=false without inventing HS codes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string"},"concept":{"type":"string"},"industry":{"type":"string"}}}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/policy-domain/concepts":{"get":{"summary":"List domain concepts for autocomplete","tags":["Policy"],"description":"Returns the hermetic concept catalog (id, label, HS chapters, sample aliases).","security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/policy-trade-watches":{"post":{"summary":"Create a policy_trade watch","tags":["Policy"],"description":"Creates a watch that reacts to material-change ledger events for a target policy event cluster, domain-matching discoveries/changes when target.type=domain (or top-level domain), or lane exposures when target.type=lane (or top-level projectTradeLaneId) via policy.exposure. Tenant/visibility integrity is enforced in the service and again in the store.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","webhookEndpointId"],"additionalProperties":true,"properties":{"name":{"type":"string"},"policyEventId":{"type":"string"},"domain":{"type":"object","additionalProperties":true},"projectTradeLaneId":{"type":"string"},"target":{"type":"object","additionalProperties":true},"webhookEndpointId":{"type":"string"},"conditions":{"type":"object","additionalProperties":true}}}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"get":{"summary":"List policy_trade watches for the project","tags":["Policy"],"parameters":[{"schema":{"type":"integer"},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/policy-trade-watches/{watchId}":{"get":{"summary":"Get a policy_trade watch by id","tags":["Policy"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"watchId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"delete":{"summary":"Soft-delete a policy_trade watch","tags":["Policy"],"description":"Sets status to deleted. Repeated DELETE returns 404.","parameters":[{"schema":{"type":"string"},"in":"path","name":"watchId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/project-trade-lanes":{"post":{"summary":"Register a known project trade lane","tags":["Policy"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"get":{"summary":"List project trade lanes","tags":["Policy"],"parameters":[{"schema":{"type":"integer"},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/project-trade-lanes/{laneId}":{"get":{"summary":"Get a project trade lane","tags":["Policy"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"laneId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"delete":{"summary":"Soft-delete a project trade lane","tags":["Policy"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"laneId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"204":{"description":"Default Response"}}}},"/v1/policy-event-exposures":{"get":{"summary":"List policy event exposures for the project","tags":["Policy"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"policyEventId","required":false},{"schema":{"type":"integer"},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/policy-impact-hypotheses":{"get":{"summary":"List policy impact hypotheses for the project","tags":["Policy"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"policyEventId","required":false},{"schema":{"type":"string"},"in":"query","name":"exposureId","required":false},{"schema":{"type":"integer"},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/policy-event-exposures/evaluate":{"post":{"summary":"Preview exposure matches for ad-hoc trade lanes (not persisted)","tags":["Policy"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v1/mcp":{"post":{"responses":{"200":{"description":"Default Response"}}},"get":{"responses":{"200":{"description":"Default Response"}}},"delete":{"responses":{"200":{"description":"Default Response"}}}},"/.well-known/oauth-protected-resource/v1/mcp/business":{"get":{"responses":{"200":{"description":"Default Response"}}},"options":{"responses":{"200":{"description":"Default Response"}}}},"/.well-known/oauth-authorization-server":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v1/mcp/business":{"post":{"responses":{"200":{"description":"Default Response"}}},"get":{"responses":{"200":{"description":"Default Response"}}},"delete":{"responses":{"200":{"description":"Default Response"}}}},"/v1/webhooks/clerk":{"post":{"summary":"Clerk lifecycle webhooks (user.updated, user.deleted)","tags":["Webhooks"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}}},"tags":[{"name":"Health","description":"Liveness and readiness"},{"name":"Providers","description":"Provider discovery"},{"name":"Context","description":"Context queries and snapshots"},{"name":"Weather","description":"Historical weather queries"},{"name":"ControlPlane","description":"Atlas One account, project, and session management"},{"name":"Webhooks","description":"Inbound provider and Clerk webhooks"},{"name":"Watches","description":"Saved monitoring watches and the subscriptions that authorize their recurring execution"},{"name":"WebhookEndpoints","description":"Outbound signed webhook endpoints"},{"name":"Policy","description":"Policy & trade intelligence events (mediated Store/Service/Route reads) and policy_trade watches"}]}