Inverba — signed, verifiable web extraction
JavaScript is off, so the interactive parts of this page (the in-browser verify demo, copy buttons) won't run. Everything that matters is still readable below — and the same applies to Inverba itself: verification is plain SHA-256 and Ed25519, checkable with about thirty lines in any language.
v0.1.0 is live on PyPI · pypi.org/project/inverba · status →
Sovereign, verifiable web extraction

Every scraper gives you data. Inverba gives you data you can prove.

A scraping and monitoring engine where every fetch produces a cryptographically signed provenance record — so one agent can prove to another exactly what it retrieved, and anyone can verify it offline. Signed by your key, on your machine. Runs complete on a single machine — no swarm, no account, no cloud required.

${{ installCmd }}

Python · Apache-2.0 open core · complete at N=1 · zero mandatory cloud

sh
$ inverba scrape https://example.com/pricing
✓ fetched 200 · 48,211 bytes · 2026-07-12T14:03:22Z
✓ hashed sha256:9f2b6c81…4e1a
✓ signed ed25519 · key inv_k1_7f3a
pricing.html + record.json
$ inverba verify record.json
✓ valid — offline · no account · nothing contacted
Apache-2.0 open core — audit every line ↗ 241 tests passing on the open core v0.1.0 on PyPI ↗ verify a record yourself, right here ↓ threat model — what we don't prove →
Verify it yourself

Don't take our word for it. Check.

Below is a real inverba-record. Verification runs right here in your browser — plain SHA-256 and Ed25519, no Inverba install, no trust in us required. Then flip one character and watch the math catch it.

one character of content_sha256 flipped — run verification and watch it fail
record.jsoninverba-record/1
{
  "inverba_record": "1",
  "url": "https://example.com/pricing",
  "fetched_at": "2026-07-12T14:03:22Z",
  "content_sha256": "9f2b6c8{{ tamperChar }}c7aa…de4e1a",
  "status_code": 200, "content_type": "text/html",
  "signature": {
    "alg": "ed25519", "key_id": "inv_k1_7f3a9d2c",
    "sig": "kQm4…Zx8="
  }
}
verifierruns in this tab · nothing sent to us
{{ vs.icon }} {{ vs.label }} {{ vs.status }}
{{ verdictText }}
How it works

Fetch. Sign. Verify — anywhere.

01 — fetch

Extract like any scraper

The response is captured with its fetch facts: status code, final URL after redirects, content type, timestamp.

from inverba import scrape
page = scrape(url)
02 — sign

Every fetch leaves evidence

Content hash and fetch context are signed with your Ed25519 key, locally. The record is a plain JSON file you own.

page.record.save(
  "record.json")
03 — verify

Anyone can check it

A record is a standard signature over canonical JSON. Verification needs ~30 lines in any language — no Inverba install, nothing from us.

$ inverba verify record.json
✓ valid · hash · sig · offline
record.json · inverba-record/1 — open spec2.1 KB
{
  "inverba_record": "1",
  "url": "https://example.com/pricing",
  "fetched_at": "2026-07-12T14:03:22Z",
  "content_sha256": "9f2b6c81c7aa…de4e1a",
  "status_code": 200,
  "final_url": "https://example.com/pricing",
  "content_type": "text/html; charset=utf-8",
  "fetched_by": "inv_k1_7f3a9d2c",
  "corroborations": [],
  "signature": {
    "alg": "ed25519",
    "key_id": "inv_k1_7f3a9d2c",
    "sig": "kQm4…Zx8="
  }
}

The record is the product.

content_sha256 — commits to the exact bytes. Change one character on the page and the hash breaks.

status_code · final_url · content_type — the fetch facts, signed alongside the content: what was asked for, what came back, and in what form.

signature — binds hash and context to a specific key at a specific time. Your key, generated and held locally.

corroborations — counter-signatures from other fetchers that saw the same content. Empty at N=1; a solo record is complete without them.

Capabilities

Complete on one machine. Deeper with a swarm.

Everything that makes a record provable works at N=1 — no swarm, no account, no cloud. Adding vantages deepens corroboration; it never gates the core.

✓ N=1signed provenance ✓ N=1offline verification ✓ N=1change detection ✓ N=1C2PA export ✓ N=1agent-to-agent verification
01 / agent-to-agent verificationworks solo · N=1

One agent can prove its data to another.

When an agent hands off web data, the receiving agent verifies the signed record itself — hash, signature, fetch context — without trusting the sender, without a swarm, without asking us. Machine-checkable provenance is what lets autonomous pipelines consume each other's output safely.

$ inverba verify incoming/record.json --key agent-a.pub
handoff · agent-a → agent-b · no swarm involved
agent-ascraped & signed record.json · key a_7f3a
↓ hands off data + record
agent-bverifies locally ✓ hash · ✓ sig · ✓ context
accepted without trusting agent-a — no server, no account, N=1 on both sides
Scale up with the swarm

Nothing below is required on day one. Solo records stay valid forever — extra vantages only add corroboration depth.

02 / change detectionworks solo · N=1

Monitor any URL. Prove what changed, and when.

Every scheduled check produces a signed record, so a diff isn't a claim — it's two pieces of evidence. Changes are classified by significance: a flipped price is flagged material even when 99% of the page is boilerplate churn.

$ inverba watch https://example.com/pricing --every 6h
example.com/pricing · check #482 vs #481 MATERIAL
before · Jul 12 08:03 · signed ✓
Pro — $49/mo
after · Jul 12 14:03 · signed ✓
Pro — $79/mo
1 of 214 nodes changed · class: pricing · evidence: record #481, record #482
example.com/terms · fetched from 2 vantages, 40s apart
residential · Berlin sha256:9f2b…4e1a
datacenter · Virginia sha256:c31d…88f0 ≠
divergence confidence0.83
consistent with: cloaking · geo pricing · A/B test — not proof of intent
03 / cloaking detectionscales with swarm

Catch sites showing different visitors different content.

Inverba fetches from multiple network vantages and compares signed results. Divergence is reported with a confidence level and plausible explanations — never as certainty. A site serving datacenter IPs a different terms page is a finding; why it does so is your call.

04 / distributed extractionscales with swarm

Trust-scored fetchers, corroboration where it counts.

Scale across a pool of fetchers — yours or federated — each with a trust score earned from verified history. Selective corroboration re-fetches only high-stakes pages through independent nodes, so you pay for agreement where a wrong answer is expensive, not everywhere.

corroboration · example.com/filings/10-k
fetcher-a9trust 0.97 9f2b…4e1a ✓
fetcher-c2trust 0.94 9f2b…4e1a ✓
fetcher-f7trust 0.61 timeout — excluded
2 of 2 responding fetchers agree · content accepted at trust 0.99
Start solo, scale to swarm

One machine is the whole product. The swarm is the upgrade.

Scaling adds corroboration depth. It never invalidates what you already signed.

N = 1 · one machine

The full core: fetch, sign, verify, change detection, C2PA export, agent-to-agent verification. A record signed at N=1 is complete evidence — valid forever, whatever you add later.

N = 2 · the notaryplanned

Opt-in two-party corroboration for solo users: an independent counter-signature that the notary saw the same content. In development — not yet hosted; solo records don't wait for it.

N = many · workers

Add fetchers when you outgrow one vantage. Corroboration deepens automatically, cloaking detection gains vantages — and old records never need re-signing.

Inverba will ask before it ever contacts a notary. Decline, and it stays 100% local — that's the default today and it will stay the default. First-run consent is part of the design, because sovereignty you have to configure isn't sovereignty.

Who it's for

Three situations where "trust me" stops working.

price & competitive monitoring

Show a competitor changed their pricing — with signed before/after records anyone can independently verify.

→ change detection with signed evidence
$ inverba watch example.com/pricing --every 6h
AI training-data provenance

Document what your training corpus contained, from where and when — as C2PA manifests your compliance team can hand an auditor.

→ C2PA compliance export
$ inverba export corpus/ --format c2pa
cloaking & brand safety

Catch a site serving different content to your crawlers than to real users — reported with confidence levels, not accusations.

→ multi-vantage divergence detection
$ inverba scrape example.com --vantages res,dc
Comparison

The dimension that matters: can you prove it?

Firecrawl, Crawl4AI, and ScrapeGraphAI are excellent extraction tools — use them happily. Inverba answers a different question: can you prove what you collected?

firecrawl
crawl4ai
scrapegraphai
inverba
Extraction & crawling
✓ excellent
✓ excellent
✓ excellent
Signed provenance per fetch
✓ signed
Third-party verifiability
✓ by anyone
Tamper-evident history
merkle log — planned
Cloaking / divergence detection
✓ confidence-scored
Runs fully local
self-host
Compliance export (C2PA)
For teams that answer to auditors

Evidence that holds up outside your team.

For Enterprise →

C2PA compliance export

Export provenance records as C2PA Content Credentials — training-data provenance in the format EU AI Act documentation obligations expect. One command, standard manifests.

$ inverba export --format c2pa

Tamper-evident registry planned

A Merkle transparency log for anchoring records — the same construction as Certificate Transparency. The design is published; the hosted log is not yet live. Records don't depend on it: they verify offline today.

design published · not yet operational

A threat model that names its limits

A record proves what your fetcher received and signed — not what every visitor saw, and not the honesty of a compromised fetcher. We document exactly where the guarantees stop.

Read what Inverba does not prove →
Copy the whole loop

Install to verified record in four commands.

Paste it into a terminal. The record it produces verifies on any machine, forever — with or without us.

sh
$ pip install inverba
$ inverba keys init
$ inverba scrape https://example.com/pricing
pricing.html + record.json
$ inverba verify record.json --content pricing.html
✓ signature · ✓ hash — verified offline
Open core

The engine is free. Forever.

Everything cryptographic — fetching, signing, verifying — is Apache-2.0 and runs on your hardware. We charge for operating infrastructure you'd rather not run — flat and predictable: no credits, no per-page metering, no surprise bill. Today the only thing you can buy is the perpetual Sovereign license, because it's the only thing that already exists; the hosted tiers open when the registry goes live.

CORE
Free
Apache-2.0 · self-hosted
  • Full engine: fetch, sign, verify
  • Unlimited local records
  • Change detection & monitors
  • Self-hosted registry
pip install inverba
SOLOwaitlist
$19 /mo
for one developer · when hosted launches
  • Everything in Core
  • Hosted anchoring, 1 project
  • Scheduled monitors & alerts
  • Email support
hosted infrastructure launches when the registry goes live. Waitlist gets: this price locked as founding-user pricing, early access before public launch, and a say in what ships first — reply with your use case.
MANAGEDwaitlist
$99 /mo per project · or $990/yr
for teams shipping on Inverba · when hosted launches
  • Everything in Core
  • Hosted verification registry
  • Scheduled monitors & alerting
  • C2PA export pipeline
hosted infrastructure launches when the registry goes live. Waitlist gets: this price locked as founding-user pricing, early access before public launch, and a say in what ships first — reply with your use case.
ENTERPRISE
Talk to us
compliance & audit programs
  • Support SLA & private registry
  • SSO/SAML, audit logging
  • Air-gapped deployment
  • Security review & procurement docs
Book a demo
Sovereign license · one-time

Buy once. Run forever.

$1,499 one-time · BTC, Lightning, USDC, or XMR
less than 16 months of the hosted rate when it launches — and you own this forever. No recurring charge, ever.

A perpetual license to the self-hostable software, running on your hardware. No recurring charge. No account required. No kill switch. The license is a signed token you own — it verifies offline against a key shipped in the software, forever, and can never be revoked.

Covers v1.x and every update to it — you own v1 forever; genuinely new major versions are a separate purchase. Hosted services (managed registry, monitoring, anchoring) stay subscription because they cost to run — and the registry is open core, so you can self-host it at no extra cost.

  • Full engine: fetch, sign, verify
  • Change detection & cloaking detection
  • C2PA export
  • Self-hosted registry
  • Perpetual · offline · revocation-impossible
Buy the license
early price — it will rise as the product matures. No countdown, no fake scarcity; just the honest reason to buy now.
Priority support is available as an add-on — talk to us.

Licenses are signed, not served. Every paid license is a cryptographically signed token that verifies offline against a public key shipped in the software — no license server, no phone-home, works air-gapped. Pay in Bitcoin — on-chain or over Lightning — in USDC, or in Monero: prepaid, no stored payment method, no recurring charge. Crypto checkout →

FAQ

Straight answers.

What does signing cost me in performance?+

A SHA-256 hash plus one Ed25519 signature — roughly 1–2 ms per fetch on commodity hardware. Network latency dominates by orders of magnitude. Registry anchoring is asynchronous and batched, off the fetch path.

Is the registry required?+

No — and today it doesn't exist yet. Records are complete and verifiable fully offline. The planned registry adds exactly one guarantee: a record can't have been created after the log root that includes it. When it ships you can use ours, run your own, or skip it entirely.

What happens if I lose my signing key?+

Existing records remain verifiable forever against the old public key — verification never needs the private key. Rotation issues a signed continuity link from old key to new. Custody is yours; HSM and KMS backends are supported.

How big are records, and where does the content live?+

A record is ~2 KB of JSON. The page content itself lives wherever you choose — local disk, S3, or nowhere. The hash commits to it either way; you only need the content when someone wants to re-verify the bytes.

How do I verify a record without installing Inverba?+

Canonicalize the record body (RFC 8785 JCS), check the SHA-256, verify the Ed25519 signature — about 30 lines in any language. The docs include a complete snippet.

Does a record mean I'm allowed to use the data?+

No. Provenance is not permission. Inverba proves what you collected and when — whether you may collect or use it is a question for your counsel. Our threat model says this explicitly.

Can I implement the record format myself?+

Yes — inverba-record/1 is an open specification with test vectors in the repo. Independent implementations are encouraged: a format only we can produce would defeat the point.

Start in the docs

Five minutes to your first signed record.

quickstart Install, scrape, verify record spec Canonical format, v1.2 self-hosting Registry & fetcher pools