Skip to content

Receipts

Every result comes with a receipt. It says how the page was fetched, when, what it cost, and what Frankensurf could and couldn’t confirm. Your agent can rely on it, and anything uncertain is clearly marked.

{
"trace_id": "6f1c…",
"status": "observed",
"operation": "extract",
"adapter": "gumtree_listing",
"method": "scrapling",
"observed_at": "2026-10-02T03:14:07Z",
"freshness_seconds": 0,
"cache_hit": false,
"requested_url": "https://www.gumtree.com.au/web/listing/…",
"final_url": "https://www.gumtree.com.au/web/listing/…",
"http_status": 200,
"cost_usd": 0,
"evidence": ["…saved copies, by hash…"],
"attempts": [{ "provider": "scrapling", "status": "observed", "latency_ms": 4231 }]
}
  • evidence points to saved copies of what was fetched, named by their SHA256 hash, so you can prove what the page said.
  • attempts lists every tool tried, in order, with how long each took.
  • requested_url and final_url are kept separate, so redirects are visible.
  • Cookies and passwords never appear in the result.
freshness What happens
now Always fetches a new copy.
hour, day, cached May reuse a saved copy. The receipt keeps the original time and says how old it is.

An old copy is never passed off as new.

For listings, whether an item is still for sale and what it actually sold for both start as "unknown". Frankensurf only changes them when it has real proof.

Photos are downloaded and checked, not just linked. Each one has a hash, its real format and size, and its own error if it failed. Site parsers pick only the item’s own photos and skip logos, ads and recommendations. max_images caps how many are downloaded; it doesn’t mean the gallery is complete.

Every request saves a trace in state/traces/. Use Runtime.trace(trace_id) or frankensurf trace <trace_id> to see one. Runtime.capabilities() adds the traces up into success and speed per site and tool. Those are measurements with sample counts, not guarantees.