Lentra
Home / Format
Version 0.1 · draft

The format is open by design.

Anyone may emit passports, read them, or build a verifier, and data providers are expected to issue their own. What is sold is responsible issuance: keys, operational discipline and accountability. Never access to the format. The canonical copies live on this site's own API: GET /api/v0/spec and GET /api/v0/verifier.mjs, alongside the live records they govern.

01 · Envelope

Six groups inside one signed container.

MemberMeaning
passport_versionFormat version. A verifier must reject versions it does not implement.
idGlobally unique, sortable identifier of this record.
issuerIssuer name and the key id used to sign.
claimsThe six groups: source, observation, method, context, quality, rights.
chainSequence number and digest of the preceding record. This is the tamper-evidence.
signatureAlgorithm, key id and the detached signature over the canonical body.
countersignatures · planned v0.2Qualified-timestamp countersignature (RFC 3161) over the signed record, for jurisdictions where legal presumption attaches to qualified time.
02 · Profiles

One envelope. Three directions of capture.

The six groups keep their meaning in every profile: who, when, how, against what, with which result, under which rights. A profile only fixes the vocabulary inside each group for one direction of capture.

Drafted

ingress

A crawler visit recorded at a publisher's edge: the claimed agent, the real network, what was fetched, and the robots.txt and license state at that moment. The specimen below is an ingress record.

Drafted

session

A model session recorded at the API boundary: prompt chain, model and version, parameters, output digests. The answer to “the examples were engineered”.

v0.1 as drafted

observation

An outbound fetch: what a machine consumed from the open web, from where, and under which rights.

03 · Canonicalization

Determinism is the whole trick.

Two parties must derive byte-identical input from the same record, or a signature proves nothing. The rules are deliberately few: strip the signature, sort keys, emit no insignificant whitespace, and never re-encode a number that was measured.

body      = passport without "signature"
canonical = sortedKeys(JSON(body))       // UTF-8 bytes
signature = ed25519.sign(canonical, k)   // base64
verify    = ed25519.verify(sig, canonical, pub)
04 · What a verifier does

Four steps, and the last one is yours.

01

Resolve the key

Look up signature.key_id in a published issuer registry.

02

Check the signature

Recompute the canonical body and verify Ed25519 over those exact bytes.

03

Follow the chain

Check chain.prev against the record it claims to follow.

04

Apply your policy

Decide whether this freshness, corroboration and rights are enough for you.

Step four is deliberately yours. A passport states what was observed and what is permitted. It does not decide whether that is sufficient for a given decision; that judgement stays with the party who answers for it.

05 · Issuer keys

Retired keys stay published forever.

Public keys live at /keys/issuers.json, versioned by key_id and rotated on a fixed schedule. A key that stops issuing is never removed: records signed under it must remain verifiable long after it is retired.

06 · Complete record

The whole object, exactly as issued.

{
  "passport_version": "0.1",
  "id": "lp_01J9AC5K8Q2RD7MW4XE1VBT6HN",
  "issuer": {
    "name": "LENTRA",
    "key_id": "lentra-demo-2026-08"
  },
  "claims": {
    "source": {
      "claimed_agent": "ExampleBot/2.4 (+https://ai.example.com/bot)",
      "peer_ip": "198.51.100.23",
      "peer_asn": "AS64511",
      "reverse_dns": "none",
      "forward_confirmed": false
    },
    "observation": {
      "observed_at": "2026-08-19T09:14:52.104Z",
      "observed_at_source": "roughtime+ntp-consensus",
      "capture_point": "edge_mirror",
      "duration_ms": 63
    },
    "method": {
      "transport": "https_get",
      "capture": "passive_mirror",
      "interference": "none",
      "site": "daily-ledger.example"
    },
    "context": {
      "requested_url": "https://daily-ledger.example/analysis/2026-08-19/rates",
      "robots_txt_sha256": "sha256:5b0e…77c1",
      "robots_state": "disallowed_for_agent",
      "license_signals": [
        "rsl:v1",
        "tdm-reservation"
      ]
    },
    "quality": {
      "http_status": 200,
      "content_sha256": "sha256:c9d4…12aa",
      "content_bytes": 48211,
      "response": "served",
      "anomalies": [
        "agent_network_mismatch"
      ]
    },
    "rights": {
      "basis": "publisher_terms",
      "terms_url": "https://daily-ledger.example/terms",
      "terms_sha256": "sha256:7a19…0f55",
      "reserved": [
        "tdm",
        "model_training"
      ],
      "jurisdiction": "EU"
    }
  },
  "chain": {
    "seq": 51402,
    "prev": "sha256:aa03…4f6d"
  },
  "signature": {
    "alg": "ed25519",
    "key_id": "lentra-demo-2026-08",
    "value": "PzppiIltEetr9BXf09qSohp6qkE/9GPdYRsPkFuSH+665jQptbIYKoNiZ2L+Ppl0WNjR/X9HXKGkuLlfJNVJAQ=="
  }
}

Specimen record. Field values are illustrative; the signature over them is real and verifiable.