# HALOWERK naturwerk > HALOWERK naturwerk liefert maschinenlesbare Ergebnisse gegen Zahlung nach x402. > Netz Base Mainnet, Zahlungsmittel USDC, Empfänger 0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E. ## So wird bezahlt 1. Route ohne Zahlungskopf aufrufen. Die Antwort ist 402 und trägt accepts, description und inputSchema. 2. Bedingungen mit einem x402-Client signieren. 3. Aufruf wiederholen, Nachweis im Kopf PAYMENT-SIGNATURE. Eine 402-Antwort kostet nichts und löst keine Arbeit aus. Scheitert die Arbeit, trägt die Antwort charged=false und es wird nicht abgerechnet. ## Endpunkte ### POST /v1/earthquake-brief Returns a single earthquake in decision-ready form, either by its USGS event identifier or as the most significant event matching a search. Magnitude is reported with the magnitude type, because moment magnitude and local magnitude are not interchangeable at the edges of their ranges. Depth and, when a reference point is supplied, distance from it are given equal standing with magnitude, since a magnitude six at three hundred kilometres depth is harmless and a magnitude four and a half at five kilometres under a city is not. Where USGS carries intensity products they are included: the maximum reported Modified Mercalli intensity, the estimated peak ground acceleration, and how many felt reports were submitted, which together say more about effect than any magnitude does. The review status is reported prominently: an automatic solution is frequently revised downward within hours, and alerting on a number that will change tomorrow is the most common mistake made with this dataset. Alert level and tsunami flag come through as USGS sets them, unmodified. - Preis: 0.004 USDC - MCP-Werkzeug: `earthquake_brief` - Eingabe: `["event_id","min_magnitude","hours","reference_lat","reference_lon"]` ### POST /v1/seismic-proximity Retrieves the earthquakes within a radius and time window of a point and turns them into an exposure figure. Each event contributes according to its magnitude and its distance, using an explicit formula that is returned with the result: energy scales exponentially with magnitude and attenuates with distance, so a distant large event and a near small one can contribute comparably, which is the behaviour that makes a single count useless. Depth is factored in because a deep event affects the surface far less than a shallow one of the same size. The response gives the total exposure, the strongest single contributor, the closest event, counts by magnitude band, and the full list of contributing events so a different weighting can be applied to the same data. This is explicitly not a seismic hazard assessment: hazard is derived from fault mapping, recurrence intervals and site soil conditions, none of which is in this dataset, and thirty days of recent activity says little about the next thirty years. What it does answer is how much shaking a location has actually seen lately. - Preis: 0.005 USDC - MCP-Werkzeug: `seismic_proximity` - Eingabe: `["lat","lon","radius_km","days","min_magnitude"]` ### POST /v1/quake-sequence Clusters earthquakes that are close in space and time into sequences, using a single-link approach with an explicit distance and time threshold that both appear in the result. For each sequence you get the strongest event, the events that preceded it and those that followed, the duration, the spatial extent, the magnitude range and the rate of events per day. The naming is deliberate: the fields are before_strongest and after_strongest, not foreshocks and aftershocks. Whether an event was a foreshock is knowable only after the fact, and a service that labels one in advance is claiming more than the data supports — roughly one sequence in twenty continues upward, and the rest do not. What the response does offer for that question is the observable evidence: whether the sequence rate is rising or falling, whether the largest event came early or late in the sequence, and how the magnitudes are distributed, all of which a seismologist would want and none of which is a prediction. Sequences are reported ordered by strongest magnitude. - Preis: 0.005 USDC - MCP-Werkzeug: `quake_sequence` - Eingabe: `["lat","lon","radius_km","days","min_magnitude","cluster_km","cluster_hours"]` ### POST /v1/river-gauge Returns the latest instantaneous values at a USGS streamgage, together with what makes them readable. A stage of three point four feet means nothing on its own, so each value is placed against the station own record for the requested reference period: the minimum, median and maximum, and the percentile the current reading falls at. The reference period is stated with the comparison, because a percentile without a window is not a statistic. Measurement time is returned as reported by the station rather than as retrieval time, and the gap between the two is given, since a gauge that last reported eleven hours ago is telling you about yesterday. Qualifier codes attached to a reading — ice-affected, estimated, provisional — are passed through and expanded, because a provisional value that gets revised is normal for this dataset and treating it as final is the standard error. Stations that report nothing at all are distinguished from stations that report a zero. - Preis: 0.004 USDC - MCP-Werkzeug: `river_gauge` - Eingabe: `["site_id","reference_days"]` ### POST /v1/river-anomaly Compares the recent record of a gauge against its own longer history and reports three kinds of finding, kept separate because their causes differ. An extreme level is a reading in the top or bottom percentile of the reference period. An unusual rate of rise is a change per hour exceeding the station own typical rate by a stated factor — this is the figure that matters in a flood and it leads the level rather than following it, so it is reported even when the absolute value is still ordinary. A break is a jump between consecutive measurements that exceeds what the river can physically do, which is almost always an instrument fault or a datum change, and naming it as such prevents a sensor glitch being sold as an event. Every threshold is returned, the reference period is stated with every percentile, and the readings that produced each finding are included. Values USGS marks as provisional, ice-affected or estimated are excluded from the baseline and counted, because a baseline built from bad readings makes every good one look anomalous. - Preis: 0.005 USDC - MCP-Werkzeug: `river_anomaly` - Eingabe: `["site_id","parameter","recent_hours","reference_days","sensitivity"]` ### POST /v1/water-quality Retrieves water quality results for a monitoring site from the Water Quality Portal and normalises them into a comparable shape. The real work is units: the same measurement appears there as mg/L, ug/L, ppm and mg/l in mixed case, and combining them unchecked puts factor-of-thousand errors into any statistic built on top. Conversion is therefore applied only where it is unambiguous, the assumption behind ppm to mg/L is stated rather than made silently, and anything not safely convertible is returned in its original unit and counted separately. Per parameter you get the sample count, minimum, median and maximum of the convertible values, the date range, the detection condition where a result was below the reporting limit — which is not the same as zero and is kept distinct — and the reporting organisation, since a state agency and a volunteer programme are not equally comparable. No result is judged against a regulatory limit: limits depend on country, on the intended use of the water and on the legal regime, and a service that applies one silently is applying the wrong one somewhere. - Preis: 0.005 USDC - MCP-Werkzeug: `water_quality` - Eingabe: `["site_id","start_date","characteristic","max_results"]` ### POST /v1/climate-normals Returns the German Weather Service reference-period values for the station nearest a coordinate: monthly means and annual totals for air temperature, precipitation and sunshine duration, plus the mean annual counts of frost days, ice days, summer days and hot days. Which station supplied the values is always named with its identifier, its altitude and its distance from your point, and the altitude difference is reported explicitly — in mountainous terrain the nearest station can sit eight hundred metres below the site, which shifts temperature normals by several degrees and makes the nearest station the wrong one. Values the source marks as missing are returned as null rather than as zero, and the count of missing months per quantity is reported, since a station that operated for part of the period produces a plausible-looking annual figure from incomplete data. The response states plainly that normals are not a forecast: a July mean of nineteen degrees does not exclude thirty-five, and using a normal as an expectation for a particular day is the standard misuse of this dataset. Germany only; the source covers no other country. - Preis: 0.005 USDC - MCP-Werkzeug: `climate_normals` - Eingabe: `["lat","lon","quantities","max_station_distance_km"]` ### POST /v1/frost-window Turns an hourly forecast into the thing that is actually planned around: continuous frost windows. Each window carries its start and end hour, its duration, the lowest temperature within it and the hour that low occurs, so a two-hour dip at dawn is distinguishable from a night-long freeze. Air frost and ground frost are reported against separate thresholds and never conflated: forecasts are for two metres above ground, and on clear calm nights the surface runs three to five degrees colder, so a two-metre temperature of plus two can still mean ground frost. Rather than silently applying an offset, the response evaluates both thresholds and states the assumption behind the ground one. Confidence is attached per window and declines with lead time, because a frost forecast for tomorrow morning and one for day nine are not the same statement, and reporting them with equal weight is how a forecast gets misused. Wind speed and cloud cover are included per window since both suppress radiative frost, which is the factor that decides whether a marginal night actually freezes. - Preis: 0.005 USDC - MCP-Werkzeug: `frost_window` - Eingabe: `["lat","lon","hours","air_threshold_c","ground_offset_c"]` ### POST /v1/growing-degree-days Accumulates growing degree days at a location from the hourly forecast, for a base temperature you choose. Two methods are returned side by side: the hourly integration, which is the more accurate, and the conventional average of daily maximum and minimum, which is what agronomic tables and most published thresholds are built on. Reporting only one would either be less accurate or incomparable with the literature, so both are given with the difference between them stated. An optional upper cut-off caps the contribution of very hot hours, because most crops do not develop faster above their optimum and an uncapped sum turns a heatwave into growth that did not happen. Missing hours are counted and excluded, never filled with an average — a data gap that is quietly interpolated becomes accumulated heat that was never measured. Daily breakdown, running total and the date each supplied phenological threshold would be reached are included, with the threshold dates marked as forecast-based and therefore provisional. - Preis: 0.005 USDC - MCP-Werkzeug: `growing_degree_days` - Eingabe: `["lat","lon","base_temp_c","upper_cutoff_c","thresholds"]` ### POST /v1/irrigation-need Computes reference evapotranspiration by the FAO-56 Penman-Monteith method from hourly forecast data, applies a crop coefficient, subtracts effective rainfall and returns the resulting daily water deficit and its running total. The method is named because it matters: a simple temperature-based estimate and Penman-Monteith diverge substantially in windy or dry conditions, and a number without its method cannot be compared with anything. Radiation is taken from the forecast where available and otherwise estimated from cloud cover and solar geometry, with which of the two was used stated per day, because that substitution is the largest single source of error. The assumptions are returned as a list rather than a footnote: reference grass unless a crop is given, no knowledge of the soil, no field capacity, no groundwater contribution, and no irrigation already applied. Those are the things that turn this estimate into an actual recommendation, and none of them is available here. What it does provide is the atmospheric side of the water balance, computed properly and stated honestly. - Preis: 0.005 USDC - MCP-Werkzeug: `irrigation_need` - Eingabe: `["lat","lon","crop","altitude_m","effective_rain_factor"]` ### POST /v1/fire-weather Calculates the Canadian Fire Weather Index components from an hourly forecast: the Fine Fuel Moisture Code for the surface litter that carries ignition, the Duff Moisture Code and Drought Code for the deeper layers that determine whether a fire keeps going, the Initial Spread Index combining wind with surface dryness, the Buildup Index, and the resulting Fire Weather Index. Each is returned separately rather than only as a final number, because they answer different questions: a high FFMC with a low DC means easy ignition but little to sustain it, and the reverse means a fire that will be hard to put out once started. The codes are recursive and need a starting state; standard spring startup values are used, which is stated, and the response says how many days of spin-up have been applied, since the deep codes need weeks of history to be meaningful and a short forecast cannot supply that. This is not a fire prediction and does not claim to be: the index describes how fire would behave if there were one, and whether there is one depends on ignition sources, which are almost always people. - Preis: 0.005 USDC - MCP-Werkzeug: `fire_weather` - Eingabe: `["lat","lon","initial_ffmc","initial_dmc","initial_dc"]` ### POST /v1/solar-storm Assembles the current state of geomagnetic activity from four NOAA sources and says what each one is good for. The planetary Kp index is the standard scale and maps to the G-scale storm levels, but it is computed from ground magnetometers and therefore describes a storm that has already arrived. Real-time solar wind measured at the L1 Lagrange point — speed, density and the southward component of the interplanetary magnetic field — sees the same event thirty to sixty minutes earlier, and a strongly southward field with high speed is the combination that actually drives a storm. Both are returned with their lead or lag stated rather than blended into one number. GOES X-ray flux gives the current flare class, which matters for radio blackouts rather than for geomagnetic effects, and is labelled as such. The official three-day forecast is parsed and included because a forecast from the responsible agency outranks anything derived here. The overall level is the highest of observed and forecast, with the reason stated. - Preis: 0.004 USDC - MCP-Werkzeug: `solar_storm` - Eingabe: `["include_forecast"]` ### POST /v1/gnss-degradation Estimates how likely satellite navigation is to be degraded, keeping two distinct mechanisms apart. Ionospheric delay error rises with geomagnetic activity, affects single-frequency receivers far more than dual-frequency ones, and shifts the computed position without any obvious sign that something is wrong. Scintillation, driven by X-ray and proton events, makes the signal fade or drop out entirely and affects even dual-frequency receivers, so a service that only watches the Kp index misses it completely. Both are evaluated separately with the measurement behind each. Latitude is taken into account rather than ignored: the same Kp value means auroral-zone conditions at seventy degrees and almost nothing at forty, and the response states which latitude band applies. The receiver type you declare changes the assessment, since the mitigation differs — dual-frequency and augmentation systems remove most of the ionospheric term but nothing of the scintillation term. Thresholds and the reasoning are returned; this is an exposure assessment from space weather indices, not a measurement of your actual position error. - Preis: 0.004 USDC - MCP-Werkzeug: `gnss_degradation` - Eingabe: `["lat","lon","receiver"]` ### POST /v1/aviation-brief Collects the current observation, the terminal forecast, nearby pilot reports and active SIGMETs for the requested airports and returns them in one shape. The observation carries temperature, dewpoint, wind with gusts, visibility, altimeter setting, the cloud layers with their bases, and the derived ceiling — the lowest broken or overcast layer, which is the value that matters and is not the same as the lowest layer reported. From ceiling and visibility a flight rule category is derived with the thresholds returned alongside, since the US convention used here draws those lines differently from other states. Every report carries its age in minutes, because a METAR from ninety minutes ago at an airport that reports half-hourly means the station has stopped reporting. Raw text is always included next to the parsed fields so nothing is lost in normalisation. This is for operations planning, dispatch analysis and monitoring, and explicitly not for flight preparation: the legally binding briefing comes from the responsible air navigation service provider and from nowhere else. - Preis: 0.005 USDC - MCP-Werkzeug: `aviation_brief` - Eingabe: `["airports","include_taf","include_pireps","include_sigmets"]` ### POST /v1/runway-crosswind Combines the current wind at an airport with the bearings of its runways to give, per runway direction, the headwind or tailwind component and the crosswind component. Runway geometry comes from OpenStreetMap, where runways carry an explicit bearing or one derived from their designator, and both the source and the derivation are stated per runway because a designator gives the bearing only to the nearest ten degrees. Gusts are evaluated as a second, separate case rather than averaged into the steady wind: aircraft crosswind limits are stated against the gust, so computing only from the mean removes the number that actually matters. When the observation reports variable wind direction, or reports no direction at all, the components are returned as null with the reason given rather than computed from an assumed heading — a plausible-looking crosswind figure derived from a direction nobody measured is worse than an honest gap. The best runway by lowest crosswind and the best by highest headwind are both named, since they are frequently not the same one. - Preis: 0.005 USDC - MCP-Werkzeug: `runway_crosswind` - Eingabe: `["airport","crosswind_limit_kt","tailwind_limit_kt"]` ### POST /v1/volcanic-ash-route Takes a route as an ordered list of waypoints, samples it at a chosen spacing and tests every sample against the currently active SIGMETs carrying a volcanic ash hazard. For each hit you get the affected segment as a from-to pair of waypoints, the SIGMET issuing centre and flight information region, the validity window, the reported base and top of the ash layer, and the raw text. The distinction the response insists on is between intersection and proximity: where the source supplies a polygon, the route is genuinely tested against it and the result is an intersection; where it supplies only a reference point, the distance is reported and the result is explicitly labelled as proximity rather than intersection, because treating the two alike would suggest a precision the data does not carry. Vertical extent is reported but not applied as a filter unless a cruising level is supplied, since an ash layer between twenty and thirty thousand feet is irrelevant to an aircraft above it and decisive to one climbing through. Advisory only: routing decisions belong to the operator and the responsible air navigation service. - Preis: 0.006 USDC - MCP-Werkzeug: `volcanic_ash_route` - Eingabe: `["waypoints","sample_km","cruise_level_ft","proximity_km"]` ### POST /v1/species-taxonomy Takes a scientific or vernacular name and returns the accepted taxon it belongs to, with the complete classification from kingdom down to species, the taxonomic authority, the GBIF key and any linked identifiers. The distinction the response keeps is the one that matters for anything downstream: whether the name you supplied is the accepted name or a synonym, and if it is a synonym, what the accepted name is. Searching occurrence data with a synonym returns a subset of the records without any indication that the rest exist, which is the quiet way a survey ends up incomplete. Match confidence as GBIF reports it is passed through rather than dropped, because a hit at confidence sixty-two and one at ninety-nine are different claims and presenting them identically sells a guess as an identification. Vernacular names are resolved where GBIF holds them but are flagged as ambiguous by nature: the same common name covers different species in different regions and languages, and alternatives are listed rather than the first hit being presented as the answer. - Preis: 0.004 USDC - MCP-Werkzeug: `species_taxonomy` - Eingabe: `["name","kingdom","strict"]` ### POST /v1/species-occurrence Retrieves occurrence records for a species within a radius of a coordinate and returns each with what makes it usable or not: the observation date, the coordinate uncertainty in metres, the basis of record — whether it is a preserved specimen, a human observation or a machine detection — the publishing dataset, and the licence of that record. Licence filtering is applied and stated: GBIF aggregates records under different licences and some prohibit commercial redistribution, so only CC0 and CC BY records are returned, and the number excluded for licence reasons is reported rather than the result quietly shrinking. Coordinate uncertainty is treated as a first-class field, not a footnote: a record with fifty kilometres of uncertainty does not establish that the species occurs at your point, and records are flagged when their uncertainty exceeds the search radius. Records without any uncertainty stated are marked as such, because absent uncertainty is not zero uncertainty. Absence of records is never reported as absence of the species — it means nobody recorded one, which in under-surveyed areas is the usual case. - Preis: 0.005 USDC - MCP-Werkzeug: `species_occurrence` - Eingabe: `["species","lat","lon","radius_km","years_back","limit"]` ### POST /v1/biodiversity-density Assesses the recorded biodiversity of an area around a point: how many distinct species appear, how many records support them, how recent those records are, how many separate datasets contributed, and the breakdown by kingdom. The trap this service is built around is that record density measures observers, not organisms — a city park with heavy footfall carries more records than a roadless reserve and is not thereby richer. Every richness figure is therefore paired with a normalised one: species per hundred records, which rises when a place is genuinely diverse and stays flat when it is merely well visited. The number of contributing datasets is reported for the same reason, since a thousand records from one bird survey describe one taxon group thoroughly and everything else not at all. Only records under CC0 or CC BY are counted, and the number excluded on licence grounds is stated. Records are attributed to observation effort over the chosen period, and a sparse result is reported as thin survey coverage rather than as low diversity. - Preis: 0.006 USDC - MCP-Werkzeug: `biodiversity_density` - Eingabe: `["lat","lon","radius_km","years_back","kingdom"]` ### POST /v1/seasonal-species Builds a monthly profile of when a species is recorded near a point, from historical occurrence data, and corrects it for observation effort. The correction is the substance of the service: raw monthly counts follow the observers, who are outdoors more in May than in November, so an uncorrected profile makes almost every species look like a spring species. The monthly distribution of the target species is therefore divided by the monthly distribution of all records in the same area and period, producing a relative index where one means the species is recorded exactly as often as the average effort would predict. Both the raw counts and the corrected index are returned, along with the peak months by each measure, since they frequently differ and the difference is informative. The number of records behind each month is given so a peak resting on three observations is visible as such, and months with too few records to say anything are marked rather than shown as zero. This describes recording, not presence: a nocturnal or cryptic species is under-recorded in every month. - Preis: 0.005 USDC - MCP-Werkzeug: `seasonal_species` - Eingabe: `["species","lat","lon","radius_km","years_back"]` ### POST /v1/marine-species Looks a marine organism up in the taxonomically curated register rather than in an aggregator, and returns the accepted name with its AphiaID, the authority, the rank, the full classification and the recorded status. Where the queried name is not the accepted one, the accepted name is given together with the status term that explains why — unaccepted, alternate representation, nomen dubium and the rest each mean something different to a taxonomist and are passed through rather than flattened into synonym. Known synonyms of the accepted taxon are listed on request, which is what you need when reconciling historical datasets where the same animal appears under three names across four decades. Whether the taxon is marine, brackish, freshwater or terrestrial is reported, since the register covers non-marine taxa too and a name matching here does not by itself mean a marine organism. Bulk harvesting through the public interface is not permitted by the source and is not offered: this resolves names one at a time. - Preis: 0.004 USDC - MCP-Werkzeug: `marine_species` - Eingabe: `["name","fuzzy","include_synonyms","marine_only"]` ### POST /v1/synonym-graph Assembles all names associated with one taxon into a graph with the accepted name at the centre and every synonym, basionym and alternate representation as a node carrying its status, authority and the register that supplied it. Two registers are queried rather than one because their disagreement is the finding: reconciling datasets that span decades regularly turns up names that GBIF treats as a synonym and WoRMS treats as a separate species, or the reverse, and a service that silently follows one register hands the user a merge that quietly loses records. Conflicts are therefore listed explicitly with what each register says. For marine taxa WoRMS is noted as the specialist authority and GBIF as the aggregator, which is the ordering a taxonomist would apply, but the response states that rather than acting on it unilaterally. Names are returned with their publication authority so the same binomial published by different authors — a homonym, not a synonym — can be told apart, which is the failure mode that silently merges two unrelated organisms. - Preis: 0.006 USDC - MCP-Werkzeug: `synonym_graph` - Eingabe: `["name","include_worms"]` ## Weitere Flächen - OpenAPI: https://natur.halowerk.com/openapi.json - Preise: https://natur.halowerk.com/pricing - x402-Manifest: https://natur.halowerk.com/.well-known/x402 - Bazaar: https://natur.halowerk.com/.well-known/x402/bazaar - MCP: https://natur.halowerk.com/mcp ## Missing a capability? If you looked for something this service does not offer, say so. One call, no payment, no sign-up, no account: POST https://bedarf.halowerk.com/capabilities/request Content-Type: application/json {"requested_capability": "what you would buy", "description": "the use case, one sentence", "callback_url": "optional - we call back once it exists"} Only requested_capability is required, 3 to 160 characters. Schema and status: https://bedarf.halowerk.com/openapi.json Submissions are held for review and are never published verbatim.