Skip to Content
TypeScript SDKAttestations

Attestations

Attestations let agents prove claims about their memories to other agents without revealing the actual content. zkStash signs the claim with Ed25519, enabling local verification.

For conceptual overview and use cases, see Attestations Concepts.

createAttestation()

Request a signed attestation from zkStash:

const result = await client.createAttestation({ claim: "has_memories_matching", query: "cooking recipes", filters: { agentId: "recipe-bot", kind: "Recipe" }, expiresIn: "24h", }); console.log(result.attestation.result.satisfied); // true console.log(result.attestation.result.matchCount); // 47 console.log(result.signature); // "0x..."

Parameters

ParameterTypeRequiredDescription
claimstringYesClaim type (see below)
querystringConditionalSearch query (for has_memories_matching)
filtersobjectNoFilter by agentId, kind, tags
thresholdnumberConditionalMinimum count (for memory_count_gte)
schemaNamestringConditionalSchema name (for has_schema)
expiresInstringNoValidity duration (default: "24h")

Claim Types

ClaimDescriptionRequired Params
has_memories_matchingMemories exist matching queryquery
memory_count_gteAt least N memories existthreshold
has_schemaSchema is registeredschemaName

Response

{ attestation: { claim: "has_memories_matching", params: { query: "...", filters: {...} }, result: { satisfied: boolean, // Did claim pass? matchCount?: number, // Matches found namespace: string // Hashed userId }, issuedAt: number, // Unix timestamp expiresAt: number, // Expiry timestamp issuer: "zkstash.ai" }, signature: string, // Ed25519 signature publicKey: string // For verification }

Examples

// Prove expertise in a domain await client.createAttestation({ claim: "has_memories_matching", query: "machine learning research", filters: { kind: "ResearchPaper" }, }); // Prove minimum knowledge base size await client.createAttestation({ claim: "memory_count_gte", threshold: 100, filters: { agentId: "researcher" }, }); // Prove schema capability await client.createAttestation({ claim: "has_schema", schemaName: "UserProfile", });

verifyAttestation()

Verify a received attestation locally—no API call, no cost:

const { valid, reason } = await client.verifyAttestation( receivedAttestation.attestation, receivedAttestation.signature ); if (valid) { const { satisfied, matchCount } = receivedAttestation.attestation.result; console.log(`Verified: satisfied=${satisfied}, count=${matchCount}`); } else { console.log(`Invalid: ${reason}`); }

Parameters

ParameterTypeDescription
attestationAttestationThe attestation object to verify
signaturestringThe Ed25519 signature

Response

{ valid: boolean, // Signature valid and not expired? reason: string | null // "invalid_signature" | "attestation_expired" | null }

How It Works

  1. SDK fetches zkStash’s public key from /.well-known/zkstash-keys.json (cached)
  2. Verifies the Ed25519 signature locally
  3. Checks expiresAt > now

Source Attestations

When searching with grants, responses include automatic provenance proofs:

const results = await client.searchMemories( { query: "findings", filters: { agentId: "researcher" } }, { grants: [grantFromAgentA] } ); // results.sourceAttestations is keyed by grantor address if (results.sourceAttestations) { for (const [grantor, proof] of Object.entries(results.sourceAttestations)) { const { valid } = await client.verifyAttestation( proof.attestation, proof.signature ); console.log(`${grantor}: ${valid ? "verified" : "unverified"}`); } }

Source attestations prove memories came from the claimed grantor’s namespace.


Pricing

OperationCost
createAttestation()3 credits
verifyAttestation()Free
Last updated on