{"openapi":"3.1.0","info":{"title":"ExeWatch API","description":"Read your ExeWatch data. Authenticate with an account API key: `Authorization: Bearer ew_api_…`.","version":"1"},"servers":[{"url":"https://api.exewatch.com"}],"paths":{"/v1/applications":{"get":{"summary":"List Applications","operationId":"list_applications_v1_applications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationList"}}}},"401":{"description":"Missing, unknown, revoked or expired key."},"403":{"description":"Account inactive, or API access not in the plan."},"404":{"description":"Application not found or not covered by the key."},"429":{"description":"A limit of your account or of your IP address was reached. Wait for `Retry-After` seconds; the per-IP answer may not be JSON."},"503":{"description":"The API is busy or the database is briefly unavailable. Wait for `Retry-After` seconds."},"504":{"description":"The query took too long. Narrow the time range."}},"security":[{"HTTPBearer":[]}]}},"/v1/applications/{app_id}/customers":{"get":{"summary":"List Customers","operationId":"list_customers_v1_applications__app_id__customers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerPage"}}}},"401":{"description":"Missing, unknown, revoked or expired key."},"403":{"description":"Account inactive, or API access not in the plan."},"404":{"description":"Application not found or not covered by the key."},"429":{"description":"A limit of your account or of your IP address was reached. Wait for `Retry-After` seconds; the per-IP answer may not be JSON."},"503":{"description":"The API is busy or the database is briefly unavailable. Wait for `Retry-After` seconds."},"504":{"description":"The query took too long. Narrow the time range."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{app_id}/devices":{"get":{"summary":"List Devices","operationId":"list_devices_v1_applications__app_id__devices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"customer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Customer Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevicePage"}}}},"401":{"description":"Missing, unknown, revoked or expired key."},"403":{"description":"Account inactive, or API access not in the plan."},"404":{"description":"Application not found or not covered by the key."},"429":{"description":"A limit of your account or of your IP address was reached. Wait for `Retry-After` seconds; the per-IP answer may not be JSON."},"503":{"description":"The API is busy or the database is briefly unavailable. Wait for `Retry-After` seconds."},"504":{"description":"The query took too long. Narrow the time range."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{app_id}/logs":{"get":{"summary":"Search Logs","operationId":"search_logs_v1_applications__app_id__logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Level"},{"type":"null"}],"title":"Level"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Tag"}},{"name":"customer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Customer Id"}},{"name":"device_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Device Id"}},{"name":"app_version","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"App Version"}},{"name":"app_binary_version","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"App Binary Version"}},{"name":"session_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Session Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"from_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From Time"}},{"name":"to_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To Time"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogPage"}}}},"401":{"description":"Missing, unknown, revoked or expired key."},"403":{"description":"Account inactive, or API access not in the plan."},"404":{"description":"Application not found or not covered by the key."},"429":{"description":"A limit of your account or of your IP address was reached. Wait for `Retry-After` seconds; the per-IP answer may not be JSON."},"503":{"description":"The API is busy or the database is briefly unavailable. Wait for `Retry-After` seconds."},"504":{"description":"The query took too long. Narrow the time range."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{app_id}/logs/export":{"get":{"summary":"Export Logs","description":"Prelievo a cursore per server_timestamp, span figli compresi, con il taglio\nalla retention (la pulizia cancella proprio per server_timestamp).","operationId":"export_logs_v1_applications__app_id__logs_export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Level"},{"type":"null"}],"title":"Level"}},{"name":"customer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Customer Id"}},{"name":"device_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Device Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogExportPage"}}}},"401":{"description":"Missing, unknown, revoked or expired key."},"403":{"description":"Account inactive, or API access not in the plan."},"404":{"description":"Application not found or not covered by the key."},"429":{"description":"A limit of your account or of your IP address was reached. Wait for `Retry-After` seconds; the per-IP answer may not be JSON."},"503":{"description":"The API is busy or the database is briefly unavailable. Wait for `Retry-After` seconds."},"504":{"description":"The query took too long. Narrow the time range."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{app_id}/metrics":{"get":{"summary":"List Metrics","operationId":"list_metrics_v1_applications__app_id__metrics_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"time_range","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CatalogRange"},{"type":"null"}],"title":"Time Range"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricList"}}}},"401":{"description":"Missing, unknown, revoked or expired key."},"403":{"description":"Account inactive, or API access not in the plan."},"404":{"description":"Application not found or not covered by the key."},"429":{"description":"A limit of your account or of your IP address was reached. Wait for `Retry-After` seconds; the per-IP answer may not be JSON."},"503":{"description":"The API is busy or the database is briefly unavailable. Wait for `Retry-After` seconds."},"504":{"description":"The query took too long. Narrow the time range."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{app_id}/metrics/series":{"get":{"summary":"Metric Series","operationId":"metric_series_v1_applications__app_id__metrics_series_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"name","in":"query","required":true,"schema":{"type":"string","maxLength":255,"title":"Name"}},{"name":"type","in":"query","required":true,"schema":{"$ref":"#/components/schemas/MetricType"}},{"name":"tag","in":"query","required":false,"schema":{"type":"string","maxLength":255,"default":"","title":"Tag"}},{"name":"time_range","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/SeriesRange"},{"type":"null"}],"title":"Time Range"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Series"}}}},"401":{"description":"Missing, unknown, revoked or expired key."},"403":{"description":"Account inactive, or API access not in the plan."},"404":{"description":"Application not found or not covered by the key."},"429":{"description":"A limit of your account or of your IP address was reached. Wait for `Retry-After` seconds; the per-IP answer may not be JSON."},"503":{"description":"The API is busy or the database is briefly unavailable. Wait for `Retry-After` seconds."},"504":{"description":"The query took too long. Narrow the time range."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{app_id}/metrics/export":{"get":{"summary":"Export Metrics","operationId":"export_metrics_v1_applications__app_id__metrics_export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricExportPage"}}}},"401":{"description":"Missing, unknown, revoked or expired key."},"403":{"description":"Account inactive, or API access not in the plan."},"404":{"description":"Application not found or not covered by the key."},"429":{"description":"A limit of your account or of your IP address was reached. Wait for `Retry-After` seconds; the per-IP answer may not be JSON."},"503":{"description":"The API is busy or the database is briefly unavailable. Wait for `Retry-After` seconds."},"504":{"description":"The query took too long. Narrow the time range."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Application":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"platform":{"type":"string","title":"Platform"},"sdk_type":{"type":"string","title":"Sdk Type"},"environment":{"type":"string","title":"Environment"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","description","platform","sdk_type","environment","is_active","created_at"],"title":"Application"},"ApplicationList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Application"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ApplicationList"},"CatalogRange":{"type":"string","enum":["1h","6h","24h","7d","30d","90d"],"title":"CatalogRange"},"Customer":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"external_id":{"type":"string","title":"External Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"first_seen_at":{"type":"string","format":"date-time","title":"First Seen At"},"last_seen_at":{"type":"string","format":"date-time","title":"Last Seen At"}},"type":"object","required":["id","external_id","name","email","first_seen_at","last_seen_at"],"title":"Customer"},"CustomerPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Customer"},"type":"array","title":"Items"},"has_more":{"type":"boolean","title":"Has More"},"next_offset":{"type":"integer","title":"Next Offset"}},"type":"object","required":["items","has_more","next_offset"],"title":"CustomerPage"},"Device":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"external_id":{"type":"string","title":"External Id"},"customer_external_id":{"type":"string","title":"Customer External Id"},"hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hostname"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"os_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os Type"},"os_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os Version"},"app_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Version"},"app_binary_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Binary Version"},"sdk_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sdk Version"},"first_seen_at":{"type":"string","format":"date-time","title":"First Seen At"},"last_seen_at":{"type":"string","format":"date-time","title":"Last Seen At"}},"type":"object","required":["id","external_id","customer_external_id","hostname","username","os_type","os_version","app_version","app_binary_version","sdk_version","first_seen_at","last_seen_at"],"title":"Device"},"DevicePage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Device"},"type":"array","title":"Items"},"has_more":{"type":"boolean","title":"Has More"},"next_offset":{"type":"integer","title":"Next Offset"}},"type":"object","required":["items","has_more","next_offset"],"title":"DevicePage"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Level":{"type":"string","enum":["debug","info","warning","error","fatal"],"title":"Level"},"LogEvent":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"level":{"type":"string","title":"Level"},"message":{"type":"string","title":"Message"},"tag":{"type":"string","title":"Tag"},"client_timestamp":{"type":"string","format":"date-time","title":"Client Timestamp"},"server_timestamp":{"type":"string","format":"date-time","title":"Server Timestamp"},"thread_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Thread Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"extra_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra Data"},"customer_external_id":{"type":"string","title":"Customer External Id"},"customer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Name"},"device_external_id":{"type":"string","title":"Device External Id"},"device_hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Hostname"},"app_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Version"},"app_binary_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Binary Version"}},"type":"object","required":["id","level","message","tag","client_timestamp","server_timestamp","thread_id","session_id","extra_data","customer_external_id","customer_name","device_external_id","device_hostname","app_version","app_binary_version"],"title":"LogEvent"},"LogExportPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LogEvent"},"type":"array","title":"Items"},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"type":"string","title":"Next Cursor"}},"type":"object","required":["items","has_more","next_cursor"],"title":"LogExportPage"},"LogPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LogEvent"},"type":"array","title":"Items"},"has_more":{"type":"boolean","title":"Has More"},"next_offset":{"type":"integer","title":"Next Offset"}},"type":"object","required":["items","has_more","next_offset"],"title":"LogPage"},"Metric":{"properties":{"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"tag":{"type":"string","title":"Tag"},"last_seen_at":{"type":"string","format":"date-time","title":"Last Seen At"}},"type":"object","required":["name","type","tag","last_seen_at"],"title":"Metric"},"MetricExportPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MetricRow"},"type":"array","title":"Items"},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"type":"string","title":"Next Cursor"}},"type":"object","required":["items","has_more","next_cursor"],"title":"MetricExportPage"},"MetricList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Metric"},"type":"array","title":"Items"},"has_more":{"type":"boolean","title":"Has More"},"since":{"type":"string","format":"date-time","title":"Since"},"until":{"type":"string","format":"date-time","title":"Until"}},"type":"object","required":["items","has_more","since","until"],"title":"MetricList"},"MetricRow":{"properties":{"metric_name":{"type":"string","title":"Metric Name"},"metric_type":{"type":"string","title":"Metric Type"},"tag":{"type":"string","title":"Tag"},"value":{"type":"number","title":"Value"},"min_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Value"},"max_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Value"},"avg_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Value"},"sample_count":{"type":"integer","title":"Sample Count"},"period_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Period Start"},"period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Period End"},"server_timestamp":{"type":"string","format":"date-time","title":"Server Timestamp"},"customer_external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer External Id"},"device_external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device External Id"}},"type":"object","required":["metric_name","metric_type","tag","value","min_value","max_value","avg_value","sample_count","period_start","period_end","server_timestamp","customer_external_id","device_external_id"],"title":"MetricRow"},"MetricType":{"type":"string","enum":["counter","gauge"],"title":"MetricType"},"Series":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SeriesPoint"},"type":"array","title":"Items"},"since":{"type":"string","format":"date-time","title":"Since"},"until":{"type":"string","format":"date-time","title":"Until"}},"type":"object","required":["items","since","until"],"title":"Series"},"SeriesPoint":{"properties":{"bucket_start":{"type":"string","format":"date-time","title":"Bucket Start"},"value":{"type":"number","title":"Value"},"min_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Value"},"max_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Value"},"avg_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Value"},"sample_count":{"type":"integer","title":"Sample Count"}},"type":"object","required":["bucket_start","value","min_value","max_value","avg_value","sample_count"],"title":"SeriesPoint"},"SeriesRange":{"type":"string","enum":["1h","6h","24h","7d","30d"],"title":"SeriesRange"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"HTTPBearer":{"type":"http","description":"An account API key: `ew_api_…`","scheme":"bearer"}}}}