{"openapi":"3.1.0","info":{"title":"Repwyn Open API","version":"0.1.0","description":"REST API for third-party access to Repwyn signal data, sentiment analysis, and alerts. Authenticate with a bearer token issued from the developer dashboard. Note: real-time SSE endpoints (/api/signals/stream, /api/alerts/stream, /api/predictions/stream) are session-only and intentionally not included in this public API surface (EventSource does not support Authorization headers)."},"servers":[{"url":"https://repwyn.com","description":"Production"}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"nlk_<base64url>"}}},"paths":{"/v1/meta":{"get":{"summary":"API metadata — version, rate limit info, docs URL.","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/meta/docs.json":{"get":{"summary":"OpenAPI 3.1 specification (JSON).","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/dev":{"get":{"summary":"API root healthcheck.","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/signals":{"get":{"summary":"List raw signals (reviews, tickets, mentions) for a business.","security":[{"BearerAuth":["signals:read"]}],"parameters":[{"name":"businessId","in":"query","required":false,"schema":{"type":"integer"},"description":"Filter by business id. Must be in the set granted to the API key."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned by the previous response."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Insufficient scope or businessId not in allowlist"},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the rate limit resets"}}}}}},"/v1/analysis":{"get":{"summary":"List sentiment analysis results for a business.","security":[{"BearerAuth":["analysis:read"]}],"parameters":[{"name":"businessId","in":"query","required":false,"schema":{"type":"integer"},"description":"Filter by business id. Must be in the set granted to the API key."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned by the previous response."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Insufficient scope or businessId not in allowlist"},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the rate limit resets"}}}}}},"/v1/alerts":{"get":{"summary":"List sentiment-shift alerts for a business.","security":[{"BearerAuth":["alerts:read"]}],"parameters":[{"name":"businessId","in":"query","required":false,"schema":{"type":"integer"},"description":"Filter by business id. Must be in the set granted to the API key."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned by the previous response."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Insufficient scope or businessId not in allowlist"},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the rate limit resets"}}}}}},"/v1/predictions":{"get":{"summary":"List predictive-intelligence forecasts for a business.","security":[{"BearerAuth":["predictions:read"]}],"parameters":[{"name":"businessId","in":"query","required":false,"schema":{"type":"integer"},"description":"Filter by business id. Must be in the set granted to the API key."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned by the previous response."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Insufficient scope or businessId not in allowlist"},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the rate limit resets"}}}}}},"/v1/businesses":{"get":{"summary":"List the businesses accessible via this API key.","security":[{"BearerAuth":["businesses:read"]}],"parameters":[{"name":"businessId","in":"query","required":false,"schema":{"type":"integer"},"description":"Filter by business id. Must be in the set granted to the API key."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned by the previous response."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Insufficient scope or businessId not in allowlist"},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the rate limit resets"}}}}}},"/v1/webhooks":{"get":{"summary":"List webhook subscriptions for the API key owner.","security":[{"BearerAuth":["webhooks:manage"]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Insufficient scope or businessId not in allowlist"},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the rate limit resets"}}}}},"post":{"summary":"Create a new webhook subscription.","security":[{"BearerAuth":["webhooks:manage"]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Insufficient scope or businessId not in allowlist"},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the rate limit resets"}}}}},"delete":{"summary":"Delete a webhook subscription by id.","security":[{"BearerAuth":["webhooks:manage"]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Insufficient scope or businessId not in allowlist"},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the rate limit resets"}}}}}}}}