{"authority":"AstraNL (ZZP, KvK 88449335, Zaandam NL) - private attestation protocol. Contractual strength between parties. NOT a civil-law notary, NOT an eIDAS qualified trust service. A seal proves integrity, order and time of the record under a published schema - never absolute truth of the underlying claim.","determinism":"Same input -> same ACCEPT/REJECT for every caller. Rejects are sealed into the same public log.","verify":"GET /api/attest/verify/{attestation_id} - no key, no privileged path; hashes recomputed live.","ledger":"GET /api/attest/ledger?from_seq=0 - append-only export. Log integrity: GET /api/astralock/sth + /api/astralock/audit.","fee":{"rail":"x402-base-mainnet-USDC","recipient":[null,"no AstraNL payout address is configured, so the 1% is invoiced separately on the existing rail; enabling it means a wallet, key custody of our OWN revenue and crypto accounting - a founder decision, not a steward one"],"reference_rule":"put attestation_id in the transfer memo/reference"},"schemas":[{"schema_id":"record.integrity.v1","evidence_class":"R","class_label":"Record integrity (no observation of the world)","promise":"The submitted record existed in exactly this byte form at the sealed moment and was not changed after. This does NOT assert the record content is factually true.","claim_shape":{"statement":"string (1..4000 chars, required)","evidence_digests":"optional list of sha256 hex digests"},"accept_rules":["statement is a non-empty string up to 4000 chars","every evidence digest, if given, is 64-char sha256 hex","at most 32 evidence digests"],"reject_codes":["claim_empty","claim_too_long","digest_invalid","too_many_digests"],"fee_eurocents":25},{"schema_id":"vat.vies.v1","evidence_class":"A","class_label":"Public registry (official EU VIES API, fetched by protocol)","promise":"At the sealed moment T the official EU VIES service returned the sealed answer (valid or invalid, with the registered name/address when disclosed) for this VAT number. The observation is made by the protocol against the official EU endpoint, not taken from the submitter.","claim_shape":{"country_code":"ISO-2 EU member code, e.g. NL","vat_number":"national VAT number without country prefix"},"accept_rules":["country_code is a 2-letter EU member code","vat_number is 2..14 alphanumeric chars","official VIES endpoint answered (a VALID:false answer is still an ACCEPT - the registry spoke)"],"reject_codes":["vat_format","country_code_invalid","registry_unavailable"],"fee_eurocents":50},{"schema_id":"amh.handshake.v1","evidence_class":"R","class_label":"Protocol record (a platform MCP asked AstraNL to check a mandate, or stated an outcome; not the physical world)","promise":"At the sealed moment T AstraNL recorded this exact mandate check (phase verify) or this exact platform-stated outcome (phase seal) for this verify_ref, and the record was not changed afterwards. It does NOT assert that the order/booking/act happened - only that the check result or the platform statement was registered.","claim_shape":{"phase":"verify | seal","verify_ref":"AMH-... handshake id","platform_id":"registered platform","mandate_id":"agent mandate","action":"e.g. order.place","amount_cents":"int","currency":"ISO","ok":"verify: bool","reason":"verify: check result","outcome":"seal: placed|confirmed|delivered|failed|cancelled|refused","external_ref":"seal: platform order id","settlement_ref":"seal: optional"},"accept_rules":["phase is verify or seal","verify_ref present","platform_id present"],"reject_codes":["phase_invalid","verify_ref_missing","platform_missing"],"fee_eurocents":0,"fee_note":"AMH v0 launch: handshake is free; fee_status not_applicable. Called only by core.amh on behalf of a registered platform."},{"schema_id":"coordination.state.v1","evidence_class":"R","class_label":"Protocol record (the engine observing its own state machine, not the physical world)","promise":"At the sealed moment T the AstraNL coordination engine recorded this exact state transition for this case, with this evidence string, and the record was not changed afterwards. It does NOT assert that the physical act happened - only that the protocol registered the transition and the AWERI states it maps to.","claim_shape":{"case_id":"coordination case id","from_state":"previous engine state","to_state":"new engine state","evidence":"the evidence string the transition carried","aweri_states":"optional list of AWERI output states"},"accept_rules":["case_id present","to_state is one of the engine states","evidence is a non-empty string"],"reject_codes":["case_id_missing","state_unknown","evidence_empty"],"fee_eurocents":0,"fee_note":"internal protocol seal: no external caller, no fee, fee_status is recorded as not_applicable (never \"paid\")"},{"schema_id":"protocol.key.declaration.v1","evidence_class":"R","class_label":"Protocol record (the protocol declaring its own keys)","promise":"At the sealed moment T the protocol publicly declared this public key, this role and this exact scope. It does NOT assert the key is secure or that past signatures were correct - it fixes WHAT the protocol claimed, WHEN, so a later silent widening of a key scope is detectable.","claim_shape":{"public_key":"the key being declared","role":"root | legacy | peer","scope":"what this key may and may not be used for","superseded_by":"optional: the root key that replaces it"},"accept_rules":["public_key present","role is one of root | legacy | peer","scope is a non-empty string"],"reject_codes":["public_key_missing","role_invalid","scope_empty"],"fee_eurocents":0,"fee_note":"internal protocol seal: no external caller, no fee, fee_status recorded as not_applicable"},{"schema_id":"protocol.statement.v1","evidence_class":"R","class_label":"Protocol record (the protocol speaking about itself)","promise":"At the sealed moment T the protocol made exactly this statement about itself - an escalation, a correction, a declared limit - and the wording was not changed after. It does NOT assert the statement is a fact about the outside world.","claim_shape":{"statement":"string (1..4000 chars, required)","corrects_attestation_id":"optional: the seal this statement corrects"},"accept_rules":["statement is a non-empty string up to 4000 chars"],"reject_codes":["claim_empty","claim_too_long"],"fee_eurocents":0,"fee_note":"internal protocol seal: no external caller, no fee, fee_status not_applicable. Internal statements MUST use this schema - using a customer schema for them creates a false unpaid seal (bug class m388)."},{"schema_id":"registry.snapshot.v1","evidence_class":"C","class_label":"Credentialed public registries, queried by the protocol on its own legal-entity credentials; class C or A per source in the catalogue, decision 483","promise":"At the sealed moment T the protocol itself queried these official registries and received exactly the answers whose digests and bundle root are fixed here. It attests WHAT THE REGISTERS SAID AT T - not that the registers are right, and nothing about any person. A source that answered with an error is sealed as an error. A snapshot may declare follows_up=<attestation_id> to chain moments over time: proof of reality is the measured difference between sealed moments, not the signature alone.","claim_shape":{"sources":"list of {source, query} from the catalogue","purpose":"optional free text","follows_up":"optional prior attestation_id to chain"},"accept_rules":["1..6 sources","every source id published in the catalogue","query matches the source pattern","at least one source answered"],"reject_codes":["sources_missing","too_many_sources","unknown_source","query_invalid","all_sources_unreachable"],"source_catalogue_at":"core/registry_snapshot.py SOURCE_CATALOGUE (published verbatim in this schema listing)","fee_eurocents":200,"fee_note":"priced above credential and per-call cost; the value is access these answers are not freely obtainable by a private person, and the sealed moment itself"},{"schema_id":"kvk.liveness.v1","evidence_class":"C","class_label":"Accountable access (class C, decision 483): official KvK API fetched by protocol under AstraNL registered access; https://astranl.com/spec/ACCOUNTABLE_ACCESS.md","promise":"At the sealed moment T the official Dutch KvK register returned the sealed snapshot for this KvK number. The observation is made by the protocol against the official registry endpoint, not taken from the submitter.","claim_shape":{"kvk_number":"string, exactly 8 digits"},"accept_rules":["kvk_number is exactly 8 digits","official registry endpoint answered","registry returned a record for this number"],"reject_codes":["kvk_format","registry_unavailable","kvk_not_found"],"fee_eurocents":50}]}