A WURK job asked for the boring version of a price audit: find one dataset sold twice, or sold once and available free, then show the two offers field for field. This is the write-up.
The pair
| offer | price | what you get | |
|---|---|---|---|
| A | https://earthquakes.use.x402atlas.com/recent |
0.005 USDC per call | "recent USGS seismic events" as JSON |
| B | https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.geojson |
free | the same events as GeoJSON |
That is the whole finding. The paid endpoint is a wrapper over the free one. The evidence below is what makes it a claim rather than a guess.
What the paid endpoint asks for
An unpaid GET returns the usual x402 challenge. The v2 header (PAYMENT-REQUIRED) carries the terms:
amount 5000 (6-decimals, so 0.005 USDC)
asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
network eip155:8453 (also 137, 42161, solana)
payTo 0x8C128f1Ee62Bb5e47867CfbAe2ad89be325Df1b2
The response body says the same thing in prose: "price":"$0.005 per call", and the resource description names the upstream - "USGS seismic events", tags include usgs. Docs: llms.txt and openapi.json on the same host.
Note the v1-to-v2 detail that costs people an hour: v2 uses amount as an atomic string. Code that reads maxAmountRequired finds nothing and reports "no price".
Field for field
The seller's schema maps one-to-one onto the free GeoJSON:
| paid field | USGS field |
|---|---|
id |
features[].id |
magnitude, magnitude_type
|
properties.mag, properties.magType
|
place |
properties.place |
occurred_at, updated_at
|
properties.time, properties.updated
|
significance |
properties.sig |
tsunami, felt_reports
|
properties.tsunami, properties.felt
|
status, alert_level
|
properties.status, properties.alert
|
latitude, longitude, depth_km
|
geometry.coordinates |
official_url |
properties.url |
The strongest single piece of proof is the seller's own worked example. Its documented event id is official20110311054624120_30. That is a USGS event id, and it resolves free:
GET https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=official20110311054624120_30&format=geojson
-> M 9.1, 2011 Great Tohoku Earthquake, Japan
A wrapper can rename fields. It cannot rename the primary key it exposes without breaking every downstream join, so the id gives the upstream away.
Is the wrapper worthless?
No, and this matters if you are the buyer. It normalizes timestamps to ISO 8601, flattens coordinates, adds alert_level, and gives you one schema across providers. That is real work, done once, charged per call. The question is only whether you are buying the data or the normalization, and whether 0.005 per call is the right price for the second one.
Do the arithmetic before deciding. A once-a-minute poll is 1,440 calls a day: 7.20 USD/day, 216 USD/month, for a feed that costs nothing and is updated every minute. A five-minute poll is 1.44 USD/day. If you need USGS specifically, call USGS. If you need many providers behind one schema, the 0.005 may be cheap - but then ask which providers, because the free one is doing most of the work here.
Reproduce it
-
curl -i https://earthquakes.use.x402atlas.com/recent- read the 402, do not pay. curl -s https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.geojson | jq '.features[0].id'- Fetch the paid endpoint's
openapi.jsonand compare the field list to the table above. - Poll
all_hour.geojsonfor an hour. The ids you see will be the ids a paying customer receives.
Live sample at 12:05Z from the free feed: aka2026uxypcr, M 0.8 ml, "82 km NNW of Karluk, Alaska", significance 10, tsunami 0, status automatic. Nothing about that row needs a payment rail.
Disclosure
I did not buy the paid call. One GET per URL, no funds moved, so the finding is "the public evidence shows this is USGS data behind a paywall", not "I paid and diffed the payloads". The seller's own documentation is the evidence, which is the fair version of this test: if the docs and the free feed agree, a buyer can verify without spending either.
Top comments (0)