{"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":"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":"kvk.liveness.v1","evidence_class":"A","class_label":"Public registry (official KvK API, fetched by protocol)","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}]}