SDK docs · sdk/00

Integration overview

Every integration runs the same verifying code: embed the Python SDK, deploy it as your own service, or call that service from a transport-only client.

Your backend asks a holder to prove a predicate, such as "over 18", "KYC grade at least A3" or "credential active", and gets a decision without ever seeing attributes, documents or identifiers. The SDK issues that request and validates the answer for a verifier agency: a relying party such as a bank, a marketplace or a platform.

The MintID code, meaning the chain, the proof core and the SDKs, is licensed under Apache-2.0, and every package manifest declares it. Its source is published from the main repository, at gitlab.com/mintid/mintid, with a read-only mirror for each client:

MirrorPackageRegistry
https://gitlab.com/mintid/sdk-typescript@mintid-net/verifier-clientnpm (npm install @mintid-net/verifier-client)
https://gitlab.com/mintid/verifier-mcp@mintid-net/verifier-mcpnpm (npm install -g @mintid-net/verifier-mcp)
https://gitlab.com/mintid/sdk-holder@mintid-net/holder (with its WebAssembly module)npm, from the first release whose signed manifest lists it
https://gitlab.com/mintid/sdk-pythonmintid-agent (with mintid-proof-core)PyPI (pip install mintid-agent); mintid-verifier-sdk on PyPI too
https://gitlab.com/mintid/sdk-goGo module gitlab.com/mintid/sdk-gofetched from the mirror

The verifier SDK itself (mintid-verifier-sdk) is in the main project and on PyPI (pip install mintid-verifier-sdk). Install lines are in getting started.

The same verifying code, whether you embed it, host it or call it

Every deployment runs the same single verifying core — the Python SDK, with its proof engine built in at a fixed version. Nothing else ever validates a presentation, and the protocol’s single-core rule makes that binding on every deployment.

ModeWhat you runFor whom
EmbeddedYour Python backend imports mintid-verifier-sdk and calls validate_presentation in-processPython backends; lowest latency, fewest moving parts
ServiceThe same SDK wrapped in a thin first-party HTTP service you self-deploy next to your backendAny backend language; operational isolation
Client@mintid-net/verifier-client (TypeScript, Node) — a transport-only client of your own service instanceNode/TypeScript backends; further languages as demand appears

Transport-only has two consequences:

  • Clients carry no cryptography and no policy. The TypeScript client is a thin HTTP layer; it cannot verify, cache, weaken or skip anything. If your client-side code ever seems to need a verification feature, the feature belongs to the service.
  • The service is yours. Pointing your client at somebody else's verifier service would delegate the decision itself. Service mode adds transport, never authority.

What the SDK enforces that you cannot turn off

These are constants and closed types in the code, with no configuration switch:

  1. The nine acceptance conditions run in full, in order, on every presentation: active verifier and exact origin on proven chain state; registered request key; unused nonce; inside the deadline; proof bound to the exact challenge (origin, verifier id, request key, nonce, policy, finalised chain height); every requested predicate proven; issuer operational with a current status root; a final proven-state re-check; and irreversible nonce consumption as the accept gate.
  2. Presentations live 10 seconds. The lifetime is a constant.
  3. Chain reads are proven or they don’t count. Every answer from a chain node is checked with a cryptographic store proof against your trust anchor — today, a node you run yourself — and a claimed absence that cannot be proven fails closed. There is no “trust this node” mode.
  4. Retention is closed. The only thing kept is a minimal decision record — the session, the outcome, the reason code, a digest of the bound context and the time. Proof bytes, claim values and personal data structurally do not fit.

The decision model

Validation returns a decision, never throws for a rejection. reason_code comes from a closed vocabulary shared byte-for-byte across the Python SDK, the HTTP contract and every client — see reason codes. Transport-level problems (malformed body, service refusing to work from unproven chain state) are errors; domain rejections are data.

Where to go next:

  1. Getting started — verifier obligations first, then installation channels and current status.
  2. Becoming a verifier — what registration puts on chain, and which steps are still done by hand.
  3. Python SDK — the embedded mode.
  4. Service mode — the deployable + the OpenAPI contract.
  5. TypeScript client.
  6. Conformance & versioning — how "every SDK behaves identically" is enforced, and what our version numbers promise.
  7. Protocol state — what is stable, draft and absent, before you commit a date to anyone.
  8. @mintid-net/holder — the holder library compiled to WebAssembly, for a page or a service that keeps its own custody record.
  9. Agent clients — the runtime side of an agent credential, in Python and TypeScript: the payment loop, a policy checked before any challenge, minting from a separate holder.
  10. Agent-to-agent handshake — an agent proves a human behind it at the start of an A2A or MCP session (provisional).
  11. Verify a release — the signed release manifest, and how to check a package or an image against it with the release key alone.
  12. Check a presentation in the browser — the proof core compiled to WebAssembly verifies a synthetic presentation on your own device, then refuses it twice on purpose; nothing is sent anywhere.