Skip to content

Partisia Platform

The platform under everything we ship.

VisitorPass and AgeVerify are two flows. The platform is what makes them possible: credential issuance, verification, and wallet integration, deployed inside your own infrastructure. Build on top of it directly when the productised flows don't fit your use case.

What it is

Three primitives. One platform.

Each primitive is independently deployable. Use them together for a complete identity stack, or pick one to slot into the system you already have.

Issuance

Verifiable credentials, signed by you.

Issue standards-based credentials signed by your organisation. Compatible with the EU Architecture & Reference Framework and any SD-JWT-VC wallet.

Read the docs
Verification

A library of zero-knowledge proofs.

Compose new verification flows from a library of primitives. Age, residency, accreditation, membership, without writing cryptography yourself.

Read the docs
Wallet integration

Plug into the wallet your users already have.

Adapters for the EU Digital Identity Wallet and the SD-JWT-VC standard. Optional: bring your own wallet, or skip the wallet layer entirely.

Read the docs

Build your own flow

When the productised flows don't fit, build directly on the platform.

Productised flows

VisitorPass & AgeVerify

Two opinionated flows we've built on top of the platform. Best when the use case matches: guest check-in or age-gating.

See products
The platform directly

Your own verification flow

Build a flow we haven't shipped yet: accreditation, residency, professional licensing, membership, custom regulatory checks. Same primitives, your shape.

Talk to us

Examples

Issue a credential. Verify it. That's the loop.

Two SDK calls cover most of what the platform does. Full reference and language-specific examples on docs.partisia.com .

issue.ts Issue.java issue.go issue.py
Issue
import { issue } from '@partisia/sdk';

const credential = await issue({
  subject: '[subject_id]',
  claims:  { age: 19, country: 'DK' },
  signer:  process.env.PARTISIA_SIGNER,
});

// Hand the credential to the user's wallet,
// or store it under your own custody.
import com.partisia.sdk.Partisia;
import com.partisia.sdk.Credential;
import java.util.Map;

Credential credential = Partisia.issue()
    .subject("[subject_id]")
    .claims(Map.of("age", 19, "country", "DK"))
    .signer(System.getenv("PARTISIA_SIGNER"))
    .execute();

// Hand the credential to the user's wallet,
// or store it under your own custody.
import "github.com/partisia/sdk-go"

credential, err := partisia.Issue(ctx, partisia.IssueRequest{
    Subject: "[subject_id]",
    Claims:  map[string]any{"age": 19, "country": "DK"},
    Signer:  os.Getenv("PARTISIA_SIGNER"),
})

// Hand the credential to the user's wallet,
// or store it under your own custody.
from partisia import issue
import os

credential = issue(
    subject="[subject_id]",
    claims={"age": 19, "country": "DK"},
    signer=os.environ["PARTISIA_SIGNER"],
)

# Hand the credential to the user's wallet,
# or store it under your own custody.
verify.ts Verify.java verify.go verify.py
Verify
import { verify } from '@partisia/sdk';

const result = await verify({
  proof:   request.body.proof,
  require: { ageAbove: 18 },
  issuer:  '[trusted_issuer_id]',
});

if (result.ok) grantAccess();
else           denyWithReason(result.reason);
import com.partisia.sdk.Partisia;
import com.partisia.sdk.VerifyResult;
import java.util.Map;

VerifyResult result = Partisia.verify()
    .proof(request.body().proof())
    .require(Map.of("ageAbove", 18))
    .issuer("[trusted_issuer_id]")
    .execute();

if (result.ok()) grantAccess();
else             denyWithReason(result.reason());
result, err := partisia.Verify(ctx, partisia.VerifyRequest{
    Proof:   req.Body.Proof,
    Require: partisia.Requirements{AgeAbove: 18},
    Issuer:  "[trusted_issuer_id]",
})

if result.Ok {
    grantAccess()
} else {
    denyWithReason(result.Reason)
}
from partisia import verify

result = verify(
    proof=request.json["proof"],
    require={"age_above": 18},
    issuer="[trusted_issuer_id]",
)

if result.ok:
    grant_access()
else:
    deny_with_reason(result.reason)

Deploy

Runs where your security review puts it.

Cloud

Managed by us, in the region you choose.

Docker

A single image. Bring your own Kubernetes.

On-prem

Inside your VPC. No Partisia servers in the data path.

Hybrid

Control plane in cloud, data plane on-prem. Documented.

Read the docs.
Or talk to the team that built it.