{"openapi":"3.1.0","info":{"title":"SiteSignal API","version":"1.0.0","description":"Weather-intelligence webhooks + workability queries for field-service software. US sites only (NWS coverage). Responses describe weather risk in decision-ready language — never \"safe\"."},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"ss_live_... API key"}}},"paths":{"/v1/sites":{"post":{"security":[{"bearer":[]}],"summary":"Register a job site","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["label","lat","lon"],"properties":{"label":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"}}}}}},"responses":{"201":{"description":"Site created (timezone resolved from forecast provider)"}}},"get":{"security":[{"bearer":[]}],"summary":"List sites","responses":{"200":{"description":"Sites"}}}},"/v1/sites/{id}":{"delete":{"security":[{"bearer":[]}],"summary":"Delete a site","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted"}}}},"/v1/rules":{"post":{"security":[{"bearer":[]}],"summary":"Attach a condition rule to a site","description":"Types: nws_alert{min_severity}, wind_gust_over{mph}, rain_prob_over{pct}, heat_index_over{hi_f}, freeze{}, no_go_tomorrow{trade}.","responses":{"201":{"description":"Rule created"}}},"get":{"security":[{"bearer":[]}],"summary":"List rules","responses":{"200":{"description":"Rules"}}}},"/v1/rules/{id}":{"delete":{"security":[{"bearer":[]}],"summary":"Delete a rule","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted"}}}},"/v1/webhooks":{"post":{"security":[{"bearer":[]}],"summary":"Register a webhook endpoint","description":"Returns the HMAC secret ONCE. Verify X-SiteSignal-Signature = sha256=HMAC_SHA256(secret, timestamp + \".\" + rawBody) with X-SiteSignal-Timestamp.","responses":{"201":{"description":"Endpoint + secret"}}},"get":{"security":[{"bearer":[]}],"summary":"List webhook endpoints (secrets masked)","responses":{"200":{"description":"Endpoints"}}}},"/v1/accuracy":{"get":{"summary":"Network-wide forecast accuracy (public, CORS *)","description":"Rolling ≤90-day self-graded scorecard: next-day high within 3°F and rain-call hit rate, graded against NWS station observations (model-analysis fallback). Always 200; siteDays is 0 until grades exist.","responses":{"200":{"description":"{siteDays, hi:{hits,total}, rain:{hits,total}, since, updated}"}}}},"/v1/signup":{"post":{"summary":"Self-serve signup (public)","description":"Body: {company, email}. Returns customer_id + api_key ONCE. 409 if the email already has an account.","responses":{"201":{"description":"Customer + API key"}}}},"/v1/usage":{"get":{"security":[{"bearer":[]}],"summary":"Request usage for this key (month + today) with limits","responses":{"200":{"description":"Usage summary"}}}},"/v1/webhooks/{id}":{"delete":{"security":[{"bearer":[]}],"summary":"Delete a webhook endpoint","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted"}}}},"/v1/workability":{"get":{"security":[{"bearer":[]}],"summary":"Workability score /100 with per-factor breakdown","parameters":[{"name":"site","in":"query","required":true,"schema":{"type":"string"}},{"name":"trade","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Score, factors, trade assessment, confidence"}}}},"/v1/conditions":{"get":{"security":[{"bearer":[]}],"summary":"Decision-ready current + next-24h summary","parameters":[{"name":"site","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Conditions"}}}},"/v1/deliveries":{"get":{"security":[{"bearer":[]}],"summary":"Webhook delivery log","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deliveries, newest first"}}}},"/v1/test":{"post":{"security":[{"bearer":[]}],"summary":"Fire a signed sample event at your webhook endpoint(s)","responses":{"200":{"description":"Per-endpoint delivery results"}}}}}}