Runs three detectors over one series and reports what each saw
Runs three detectors over one series and reports what each saw: a robust z score on median and median absolute deviation, a robust seasonal-trend decomposition with a z score on the residual, and an isolation forest over value and step-to-previous. Every score is returned per point, so callers set their own threshold instead of trusting a verdict. The forest draws from a fixed seed: same request, same result. Under three full cycles the seasonal figure is marked as not robust.
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
POST https://tools.halowerk.com/v1/series/anomaly
| Category | Everything else |
|---|---|
| Provider host | tools.halowerk.com |
| Networks | eip155:8453 |
| Payment schemes | exact |
| Self-reported calls, 30 days | 3 from 3 payers (the provider's figure, not ours) |
Our checks, last 30 days
| Day | Result | HTTP | Asked | Time |
|---|---|---|---|---|
| 2026-10-10 | valid payment request | 402 | $0.004 | 1188 ms |
Example input (from the provider)
{
"body": {
"contamination": 0.1,
"methods": [
"robust_z",
"isolation_forest"
],
"min_votes": 2,
"points": [
12.1,
12.4,
11.9,
12.3,
12,
12.2,
48.7,
12.1,
11.8,
12.5,
12.2,
12
],
"seed": 42
},
"bodyType": "json",
"method": "POST",
"type": "http"
}
Promised output schema (from the provider)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"body": {
"properties": {
"contamination": {
"default": 0.02,
"description": "Expected share of outliers. Sets where the isolation forest cuts.",
"maximum": 0.5,
"minimum": 0.0001,
"type": "number"
},
"methods": {
"default": [
"robust_z",
"stl_residual",
"isolation_forest"
],
"description": "Which detectors to run.",
"items": {
"enum": [
"robust_z",
"stl_residual",
"isolation_forest"
],
"type": "string"
},
"maxItems": 3,
"minItems": 1,
"type": "array"
},
"min_votes": {
"default": 1,
"description": "How many detectors must agree before a point is called an anomaly.",
"maximum": 3,
"minimum": 1,
"type": "integer"
},
"points": {
"description": "Either plain numbers or objects with value and optionally time_unix_s (seconds since 1970), time (ISO 8601) and label. The service caps the whole request body at 256 KB, so long records reach that limit before maxItems.",
"maxItems": 5000,
"minItems": 3,
"type": "array"
},
"robust_z_threshold": {
"default": 3.5,
"description": "Absolute robust z score at which a point counts as an outlier.",
"maximum": 20,
"minimum": 0.5,
"type": "number"
},
"sample_size": {
"default": 256,
"description": "Points drawn per tree, capped at the series length.",
"maximum": 1024,
"minimum": 8,
"type": "integer"
},
"season_period": {
"default": 0,
"description": "Points per season, e.g. 24 for hourly data with a daily rhythm. 0 leaves the seasonal part out.",
"maximum": 1000,
"minimum": 0,
"type": "integer"
},
"seed": {
"default": 42,
"description": "Fixed starting value for the forest. Same seed, same answer.",
"maximum": 2147483647,
"minimum": 0,
"type": "integer"
},
"stl_z_threshold": {
"default": 3.5,
"description": "Threshold on the robust z score of the residual.",
"maximum": 20,
"minimum": 0.5,
"type": "number"
},
"trees": {
"default": 100,
"description": "Number of isolation trees.",
"maximum": 300,
"minimum": 10,
"type": "integer"
}
},
"required": [
"points"
],
"type": "object"
},
"bodyType": {
"enum": [
"json",
"form-data",
"text"
],
"type": "string"
},
"method": {
"enum": [
"POST"
],
"type": "string"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method",
"bodyType",
"body"
],
"type": "object"
},
"output": {
"properties": {
"example": {
"type": "object"
},
"type": {
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
},
"required": [
"input"
],
"type": "object"
}