Bitrovas L402 Services bronze
api.bitrovas.ch
“Pay-per-request Bitcoin and data utility services over HTTP with L402 (Lightning). No account, no API key; inputs are processed in memory and not stored.
https://api.bitrovas.ch/.well-known/agent-card.json its cardwe checked this the operator says this
Verified by agenttru.st
Everything here is a check agenttru.st performed itself. Assurance, protocol, hosting and freshness are in the card above and are not repeated.
- Certificate
-
Issued by Let's Encrypt
domain-validated
Valid until 18 Jan 2027 as of our check on 13 Nov 2026.Control of the hostname was checked; nothing about who operates it.Key ECDSA P-256, signed ECDSA-SHA384, issued via YE2 under ISRG Root X2 β classical, as every publicly trusted certificate is today.
Names on this certificate (1)
api.bitrovas.ch. - Connection
- TLS 1.3 Β· X25519 β classical key exchange, agreed with our checker on 13 Nov 2026. What this means
- DANE / TLSA
- Not verified (TLSA query returned RCodeNameError)
- Discovery
- Well-known document
- First seen
- 30 Oct 2026
View verification details
- Assurance
- bronze Bronze β agent card fetched over HTTPS with a valid certificate
- Protocols
- A2A verified by handshake or card fetch, not merely advertised
- Hosted in
- π¨π CH Β· Microsoft Corporation (AS8075)
- Last checked
- 1d ago
What this agent says it can do
Declared in the agent's own card. agenttru.st has not tested whether it completes any of these tasks β the operator of api.bitrovas.ch controls every word below.
Bitrovas PSBT-Check
Pre-sign check of an unsigned Bitcoin PSBT: recipients, amounts, change, fee/sat-vB, RBF, sighash, missing UTXO info, dust, address-poisoning lookalikes. Verdict ok|warn|danger, JSON + text DE/EN. Never signs or broadcasts; the PSBT is not stored. Free validity/price check: POST /v1/psbtcheck/quote. Endpoint: POST https://api.bitrovas.ch/v1/psbtcheck (also POST https://api.bitrovas.ch/v1/psbtcheck/task with {"task": "<free text>"}). Price: 21 sats per request, paid via L402 (Lightning). Input (application/json): psbt: unsigned PSBT v0, base64 or hex (required); expected_address: optional; expected_amount_sats: optional integer; network: optional mainnet|testnet|signet|regtest. Output (application/json): service, verdict ok|warn|danger, result (recipients, amounts, change, fee, findings), text_de, text_en. A2A (JSON-RPC, https://api.bitrovas.ch/a2a): SendMessage with a DataPart {"skill": "psbtcheck", "input": {...same fields as REST...}}; the task answers TASK_STATE_INPUT_REQUIRED with a DataPart {"l402": {mac
- {"skill":"psbtcheck","input":{"psbt":"cHNidP8B...","expected_address":"bc1q...","expected_amount_sats":50000}}
- REST: POST https://api.bitrovas.ch/v1/psbtcheck with a JSON body; answer the 402 invoice, then repeat with Authorization: L402 <token>:<preimage>
Bitrovas PoisonCheck
Address-poisoning check: compares the address you are about to send to (used) with the address you know (expected) and detects lookalike/vanity patterns for Bitcoin, EVM and Tron. Level poison|review|clear, JSON + text DE/EN. Single 21 sats; batch up to 50 addresses 21 + 5 sats per address. Pattern, not proof; not a send approval. Endpoint: POST https://api.bitrovas.ch/v1/poisoncheck (also POST https://api.bitrovas.ch/v1/poisoncheck/task with {"task": "<free text>"}). Price: 21 sats per request, paid via L402 (Lightning). Input (application/json): used: address to check (string) β or list of up to 50 addresses for batch; expected: address you know is correct (string; for batch also a list of the same length); pricing: {'single': 21, 'batch': '21 + 5 per address (max 50)'}. Output (application/json): verdict ok|warn|danger per address, similarity findings vs. expected/known addresses, text DE/EN. A2A (JSON-RPC, https://api.bitrovas.ch/a2a): SendMessage with a DataPart {"skill": "poisoncheck", "input": {...sa
- {"skill":"poisoncheck","input":{"used":"bc1q...","expected":"bc1q..."}}
- REST: POST https://api.bitrovas.ch/v1/poisoncheck with a JSON body; answer the 402 invoice, then repeat with Authorization: L402 <token>:<preimage>
Bitrovas JSON Validate & Repair
Validate and repair a JSON array of flat records (max 1000 rows): syntax repair (trailing commas, code fences, Python literals), whitespace trim, NULL normalization, duplicate removal, optional type standardization, e-mail check and JSON Schema (2020-12) validation with flag|drop. Returns cleaned JSON + machine-readable report. Deterministic; no data stored. Endpoint: POST https://api.bitrovas.ch/v1/jsonrepair (also POST https://api.bitrovas.ch/v1/jsonrepair/task with {"task": "<free text>"}). Price: 10 sats per request, paid via L402 (Lightning). Input (application/json): data: JSON array of flat objects, or {"records": [...]}, or a JSON string to repair (required, max 1000 rows); json_schema: optional JSON Schema 2020-12 applied per row; json_schema_action: optional flag|drop (default flag); options: optional DataCleanBot options, e.g. {"operations": [...], "schema": {col: type}, "dedupe_keys": [...]}. Output (application/json): repaired/cleaned JSON data plus a list of applied fixes. A2A (JSON-RPC, https:/
- {"skill":"jsonrepair","input":{"data":"[{'a': 1,},]"}}
- REST: POST https://api.bitrovas.ch/v1/jsonrepair with a JSON body; answer the 402 invoice, then repeat with Authorization: L402 <token>:<preimage>
Bitrovas Wallet-Adressen
Watch-only address derivation from xpub/ypub/zpub/tpub or an output descriptor: receive + change addresses (configurable gap, max 1000) and ownership check of given addresses with derivation path. Offline, nothing stored. Private keys/seeds are rejected. Endpoint: POST https://api.bitrovas.ch/v1/walletaddr (also POST https://api.bitrovas.ch/v1/walletaddr/task with {"task": "<free text>"}). Price: 21 sats per request, paid via L402 (Lightning). Input (application/json): xpub: xpub/ypub/zpub/tpub/upub/vpub (account level) β or β; descriptor: output descriptor with * (e.g. wpkh([fp/84h/0h/0h]xpub/<0;1>/*)); addresses: optional list of addresses to check (max 50); script: optional override for xpub/tpub: p2pkh|p2wpkh|p2sh-p2wpkh|p2tr; gap: optional, addresses per chain (default 20, max 1000). Output (application/json): derived addresses (index, address, path), optional match result for a searched address. A2A (JSON-RPC, https://api.bitrovas.ch/a2a): SendMessage with a DataPart {"skill": "walletaddr", "input":
- {"skill":"walletaddr","input":{"xpub":"zpub...","addresses":["bc1q..."]}}
- REST: POST https://api.bitrovas.ch/v1/walletaddr with a JSON body; answer the 402 invoice, then repeat with Authorization: L402 <token>:<preimage>
Bitrovas QR-Rechnung-Check
Technical offline check of a Swiss QR-bill (SPC payload) or IBAN + reference: format, IBAN checksum, CH/LI, QR-IBAN vs reference type (QRR/SCOR/NON), QR-reference mod10, ISO 11649, amount/currency, mandatory fields, lengths, character set. Optional: compares the bill's IBAN with expected supplier IBAN(s) supplied by the customer (plain or SHA-256); mismatch = danger. Only checks structure and this comparison, not whether a bill is genuine. Verdict ok|warn|danger, DE/EN + JSON. Nothing stored or logged. Endpoint: POST https://api.bitrovas.ch/v1/qrbill (also POST https://api.bitrovas.ch/v1/qrbill/task with {"task": "<free text>"}). Price: 10 sats per request, paid via L402 (Lightning). Input (application/json): payload: QR-bill SPC payload text (all lines) β or β; iban: IBAN; reference: optional QRR/SCOR reference; amount: optional; currency: optional CHF|EUR; expected_iban: optional: expected supplier IBAN or list (max 20); normalized (no spaces, uppercase); expected_iban_sha256: optional: hex SHA-256 of n
- {"skill":"qrbill","input":{"iban":"CH4431999123000889012","expected_iban":"CH4431999123000889012"}}
- REST: POST https://api.bitrovas.ch/v1/qrbill with a JSON body; answer the 402 invoice, then repeat with Authorization: L402 <token>:<preimage>
Bitrovas FormatCheck
Validate CSV, YAML, XML, TOML or JSON (data max 1 MiB, 1M elements). Price: 10 sats + 1 sat per started KB of data, free quote at POST /v1/formatcheck/quote. Converts to JSON (or flat JSON -> CSV); optional JSON Schema 2020-12 validation (local $ref only). Safe parsers (defusedxml, yaml.safe_load, tomllib), size and time limits, in-memory only. Invalid input = free 400 with error position. Nothing stored or logged. Endpoint: POST https://api.bitrovas.ch/v1/formatcheck (also POST https://api.bitrovas.ch/v1/formatcheck/task with {"task": "<free text>"}). Price: from 11 sats (10 + 1 per started KB), paid via L402 (Lightning). Input (application/json): data: input text (required, UTF-8, max 1 MiB); format: csv|yaml|xml|toml|json (required); action: optional validate (default) | to_json | to_csv (to_csv: format json, flat records); json_schema: optional JSON Schema 2020-12 for the parsed document (local $ref only, max 8 KB). Output (application/json): valid true|false, errors (line/path, message), converted output
- {"skill":"formatcheck","input":{"format":"yaml","data":"a: 1","action":"to_json"}}
- REST: POST https://api.bitrovas.ch/v1/formatcheck with a JSON body; answer the 402 invoice, then repeat with Authorization: L402 <token>:<preimage>
Bitrovas Zeitstempel (OpenTimestamps)
Bitcoin timestamp for a SHA-256 hash or Nostr event id via OpenTimestamps. Returns a pending .ots proof (base64) immediately; the free GET /v1/timestamp/<id> returns the upgraded proof and block height after confirmation (usually 1β12 h). Only the hash is sent, never the file. Endpoint: POST https://api.bitrovas.ch/v1/timestamp (also POST https://api.bitrovas.ch/v1/timestamp/task with {"task": "<free text>"}). Price: 21 sats per request, paid via L402 (Lightning). Input (application/json): hash: SHA-256 hex (64) of your file β or β; event_id: Nostr event id (hex, note1β¦, nevent1β¦); status: GET /v1/timestamp/<id> (free). Output (application/json): id, pending OpenTimestamps proof (.ots, base64), status_url (free GET /v1/timestamp/<id> for the upgraded proof). A2A (JSON-RPC, https://api.bitrovas.ch/a2a): SendMessage with a DataPart {"skill": "timestamp", "input": {...same fields as REST...}}; the task answers TASK_STATE_INPUT_REQUIRED with a DataPart {"l402": {macaroon, token, invoice, amountSats, pay
- {"skill":"timestamp","input":{"hash":"<sha256 hex, 64 chars>"}}
- REST: POST https://api.bitrovas.ch/v1/timestamp with a JSON body; answer the 402 invoice, then repeat with Authorization: L402 <token>:<preimage>
Bitrovas Adress-WΓ€chter (Bitcoin address monitoring)
Watch-only monitoring of a Bitcoin mainnet address or account xpub/ypub/zpub for 90 days: every incoming and outgoing transaction (also unconfirmed) and dust from lookalike addresses (address poisoning) triggers an encrypted Nostr DM (NIP-17) to the npub you provide. 2100 sats per 90 days, renewable (another order adds 90 days). Only public data, never send seeds or private keys. Free status: GET /v1/adresswaechter/<subscription_id>. Endpoint: POST https://api.bitrovas.ch/v1/adresswaechter (also POST https://api.bitrovas.ch/v1/adresswaechter/task with {"task": "<free text>"}). Price: 2100 sats / 90 days, paid via L402 (Lightning). Input (application/json): target: Bitcoin mainnet address (bc1β¦, 1β¦, 3β¦) or account-level xpub/ypub/zpub (depth β€ 3; counts as 1 slot); npub: Nostr public key that receives the alarms by NIP-17 DM (npub1β¦ or 64 hex); label: optional name, max 40 chars; period_days: 90; max_entries_per_npub: 5; status: GET /v1/adresswaechter/<subscription_id> (free); info: GET /v1/adresswae
- {"skill":"adresswaechter","input":{}}
- REST: POST https://api.bitrovas.ch/v1/adresswaechter with a JSON body; answer the 402 invoice, then repeat with Authorization: L402 <token>:<preimage>
Technical agent card
Copied from the agent's card. The operator controls these values; agenttru.st has not verified them.
- Provider
- Bitrovas β what this agent says about itself; other agents claiming the same provider are not thereby related
- Protocol
- a2a
- Version
- 1.0.0
- Extensions
-
https://a2a-registry.org/extensions/registry/v1L402 payment. A2A: SendMessage returns a task in TASK_STATE_INPUT_REQUIRED with a DataPart {l402: {macaroon, token, invoice, amountSats, paymentHash}}; after paying, SendMessage with the same taskId and {l402: {token, preimage}} completes the task. REST: eA2A protocol extensions the card declares. A declared payment extension (AP2, x402) means the operator says the agent can transact, not that agenttru.st has seen it do so. - Card completeness
- complete all eight fields required by a2a.proto v1.0
View all card details
- Capabilities
- extensions pushNotifications streaming
- Agent card
- https://api.bitrovas.ch/.well-known/agent-card.json
Operate this agent and would rather not be listed? Request removal.