Skip to content
Apier.no
Guides

How to verify an evidence pack

Call GET /api/v1/company/{org}/evidence-pack to get one signed record of what Apier observed about a Norwegian company, then check its signature against the public key set and each archived record's anchor proof against the published daily roots.

[Cite this as: Apier.no Docs v0.1.0 — last updated 2026-11-02]

An evidence pack is one signed JSON bundle of what Apier observed about one Norwegian company at a date: the check bundle, every archived change event in the window, your own receipts for the company, each archived record with its daily anchor inclusion proof, the coverage window and the licence of every source.

A pack is a record of observation. It is not a verdict on whether anyone may act, sign or is compliant, and Apier makes no claim that it is admissible in court. Every pack carries that statement in its statement field.

Step 1 — Call the endpoint and save the response

curl -H "Authorization: Bearer $APIER_API_KEY" \
  "https://www.apier.no/api/v1/company/{org}/evidence-pack" -o pack.json

Replace {org} with the company's 9-digit organisasjonsnummer. The key needs the read:brreg scope, and the call is billed as one company read.

as_of defaults to today in Europe/Oslo. Historical dates are not available yet, so any other as_of is refused with 400 VALIDATION_FAILED. changes_from sets the start of the change window: at most 366 days before as_of and never after it. A date before the archive start (2026-07-30) is answered as asked, and coverage states that nothing was observed before it.

The response's data.pack is the signed pack. When data.public_log.status is logged, data.public_log names the pack's entry in the public receipt log (kind evidence_pack): the SHA-256 of the pack's signature, never its content and never the org number. When the status is not_logged, seq is null and the response does not confirm whether an entry exists.

Step 2 — Open the pack in the viewer

Open the evidence pack viewer and choose pack.json. The viewer reads the file in your browser and uploads nothing: it fetches the public key set and the published anchor roots, checks the signature and every anchor proof with the browser's own cryptography, and shows the pack ready to print. There is no shareable link. The bokmål viewer is at /no/evidence-pack/viewer.

The viewer reads the latest 100 published anchors, the most /api/v1/public/anchors returns (?limit=100, newest first). A record whose day is older than those cannot be matched against a published root, in the viewer or through that endpoint, and the viewer says so for that record. Its inclusion proof still checks against the merkle_root the pack carries (Step 4), but that root has no public copy to compare with yet.

A pack changed after signing shows "does not match" on the signature line.

Step 3 — Verify the signature yourself

The pack is a verification certificate whose result is the evidence pack, so it verifies exactly as described in How to verify an apier certificate: remove signature, serialise the rest as canonical JSON (keys sorted at every level), and check the detached JWS against the key with the pack's kid in /.well-known/jwks.json.

Step 4 — Check each anchor proof

Each entry in archived_records.items with anchor_status anchored carries merkle_root, leaf_index and proof, an RFC 6962 sibling path. Rebuild the leaf as the canonical JSON of content_hash, first_observed_at (as an ISO 8601 UTC instant with milliseconds) and org_number, hash it with a 0x00 prefix, combine it with each sibling under a 0x01 prefix in the order position gives, and compare the result with merkle_root. Then compare merkle_root with the root for anchor_date at /api/v1/public/anchors?limit=100, which lists the latest 100 daily roots.

A record newer than the last daily anchor has anchor_status pending and no proof. A record whose day could not be reproduced has proof_unavailable and no proof. Neither is ever given an invented proof.

Step 5 — Try it in the sandbox

curl -H "Authorization: Bearer apier_sandbox_test_<uuid>" \
  "https://www.apier.no/api/v1/sandbox/company/999999999/evidence-pack" -o sandbox-pack.json

The sandbox pack is built from fixtures, signed with the public sandbox key (verify it against /.well-known/sandbox-jwks.json), never debited and never written to the public log. The viewer picks the sandbox key set for it.

Building with an LLM? Read llms.txt for agent-oriented integration guidance.