Skip to content

Quickstart

Create your first cryptographic attestation in under 5 minutes.

The simplest working example with online (server-witnessed) mode:

from glacis import Glacis
glacis = Glacis(api_key="glsk_live_...")
receipt = glacis.attest(
service_id="my-ai-app",
operation_type="inference",
input={"prompt": "What is the capital of France?"}, # Hashed locally
output={"response": "Paris is the capital of France."}, # Never sent
)
print(f"Attestation ID: {receipt.id}") # att_xxx...
print(f"Witness status: {receipt.witness_status}") # WITNESSED
  1. Install the SDK

    Terminal window
    pip install glacis
  2. Create an attestation

    from glacis import Glacis
    glacis = Glacis(api_key="glsk_live_your_key_here")
    # Attest any AI interaction
    receipt = glacis.attest(
    service_id="my-service",
    operation_type="inference",
    input={"prompt": "Hello, world!"},
    output={"response": "Hi there!"},
    metadata={"model": "gpt-4", "temperature": "0.7"},
    )
    print(f"Attestation ID: {receipt.id}")
    print(f"Evidence hash: {receipt.evidence_hash}")
  3. Verify the receipt

    result = glacis.verify(receipt)
    print(f"Valid: {result.valid}")
    if result.verification:
    print(f"Signature valid: {result.verification.signature_valid}")
    print(f"Merkle proof valid: {result.verification.proof_valid}")
  4. Save the receipt for later verification

    import json
    with open("receipt.json", "w") as f:
    json.dump(receipt.model_dump(), f, indent=2, default=str)
    # Verify from the command line:
    # python -m glacis verify receipt.json

Each call to attest() returns an Attestation object with these fields:

FieldTypeDescription
idstrUnique identifier (att_... for online, oatt_... for offline)
evidence_hashstrSHA-256 hash of your input/output (hex-encoded, 64 chars)
service_idstrService identifier you provided
operation_typestrOperation type you provided
witness_statusstr (property)"WITNESSED" (online) or "UNVERIFIED" (offline). Computed property — not included in model_dump() output.
signaturestrEd25519 signature (hex-encoded)
public_keystrEd25519 public key (hex-encoded)
timestampint | NoneUnix timestamp in milliseconds

Start developing immediately without an API key. Offline mode signs attestations locally with Ed25519:

from glacis import Glacis
import os
# Offline mode requires a 32-byte signing seed
glacis = Glacis(mode="offline", signing_seed=os.urandom(32))
receipt = glacis.attest(
service_id="dev-testing",
operation_type="inference",
input={"prompt": "test"},
output={"response": "result"},
)
print(f"Attestation ID: {receipt.id}") # oatt_xxx...
print(f"Witness status: {receipt.witness_status}") # UNVERIFIED

Verify an offline receipt:

result = glacis.verify(receipt)
print(f"Valid: {result.valid}") # True
print(f"Signature valid: {result.signature_valid}") # True
print(f"Witness status: {result.witness_status}") # UNVERIFIED