{"provider": "Bitrovas", "protocol": "L402", "services": [{"name": "Bitrovas PSBT-Check", "description": "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.", "url": "https://api.bitrovas.ch/v1/psbtcheck", "method": "POST", "task_url": "https://api.bitrovas.ch/v1/psbtcheck/task", "pricing": {"amount": 21, "currency": "sats", "model": "per-request"}, "l402_format": "json", "input": {"psbt": "unsigned PSBT v0, base64 or hex (required)", "expected_address": "optional", "expected_amount_sats": "optional integer", "network": "optional mainnet|testnet|signet|regtest"}}, {"name": "Bitrovas PoisonCheck", "description": "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.", "url": "https://api.bitrovas.ch/v1/poisoncheck", "method": "POST", "task_url": "https://api.bitrovas.ch/v1/poisoncheck/task", "pricing": {"amount": 21, "currency": "sats", "model": "per-request"}, "l402_format": "json", "input": {"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)"}}}, {"name": "Bitrovas JSON Validate & Repair", "description": "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.", "url": "https://api.bitrovas.ch/v1/jsonrepair", "method": "POST", "task_url": "https://api.bitrovas.ch/v1/jsonrepair/task", "pricing": {"amount": 10, "currency": "sats", "model": "per-request"}, "l402_format": "json", "input": {"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\": [...]}"}}, {"name": "Bitrovas Wallet-Adressen", "description": "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.", "url": "https://api.bitrovas.ch/v1/walletaddr", "method": "POST", "task_url": "https://api.bitrovas.ch/v1/walletaddr/task", "pricing": {"amount": 21, "currency": "sats", "model": "per-request"}, "l402_format": "json", "input": {"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)"}}, {"name": "Bitrovas QR-Rechnung-Check", "description": "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.", "url": "https://api.bitrovas.ch/v1/qrbill", "method": "POST", "task_url": "https://api.bitrovas.ch/v1/qrbill/task", "pricing": {"amount": 10, "currency": "sats", "model": "per-request"}, "l402_format": "json", "input": {"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 normalized IBAN (no spaces, uppercase, ASCII) or list"}}, {"name": "Bitrovas FormatCheck", "description": "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.", "url": "https://api.bitrovas.ch/v1/formatcheck", "method": "POST", "task_url": "https://api.bitrovas.ch/v1/formatcheck/task", "pricing": {"amount": 11, "currency": "sats", "model": "per-kb", "base_sats": 10, "per_kb_sats": 1, "kb_bytes": 1024, "max_data_bytes": 1048576, "formula": "base + per_kb * ceil(bytes(data)/1024)", "quote_url": "/v1/formatcheck/quote"}, "l402_format": "json", "input": {"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)"}}, {"name": "Bitrovas Zeitstempel (OpenTimestamps)", "description": "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.", "url": "https://api.bitrovas.ch/v1/timestamp", "method": "POST", "task_url": "https://api.bitrovas.ch/v1/timestamp/task", "pricing": {"amount": 21, "currency": "sats", "model": "per-request"}, "l402_format": "json", "input": {"hash": "SHA-256 hex (64) of your file – or –", "event_id": "Nostr event id (hex, note1…, nevent1…)", "status": "GET /v1/timestamp/<id> (free)"}}]}