SDK

⚠ The SDK packages are deprecated and unmaintained.

@observer-protocol/sdk, @observerprotocol/sdk and the PyPI package observer-protocol were all last released on 30 April 2026 and are no longer maintained. The npm packages are marked deprecated. They have not been unpublished, so anything already pinned to them keeps working — but do not start with them.

What to use instead

There is no single client library today. What exists is a verification core and one adapter per rail, and that is the honest shape of it:

If you want to…Use
Verify a credential someone gave you@observer-protocol/policy-engine
Enforce policy on x402@observer-protocol/x402-op-authorize
Enforce policy on L402 / Lightning@observer-protocol/l402-op-authorize
Enforce policy on Tether WDK@observer-protocol/wdk-op-policy
Enforce policy on MPP / Tempo@observer-protocol/mppx-op-account
Verify an Open Wallet Standard delegation@observer-protocol/ows-op-verify

Verifying a credential

No API key, no token, no Observer Protocol API in the path. It fetches the issuer's DID document and the revocation status list over ordinary HTTPS from the origins the credential names; point offline.didDocumentPath at a local copy and it makes no network call at all.

npm install @observer-protocol/policy-engine
import { verifyCredentialObject } from '@observer-protocol/policy-engine'; const verdict = await verifyCredentialObject( mandate, // the signed delegation credential config, // VerifierConfig: pinned issuer, schema allowlist Date.now() // evaluated at this instant );

It checks the issuer, the structure, the validity window, the eddsa-jcs-2022 proof against the issuer's DID document, and revocation. It fails closed.

Note that verifyCredential(config, nowMs) is a different exported function and does not take the credential. The published type definitions are the reference — a worked example does not ship yet, which is a gap we know about.

Everything it checks, you can re-check

The DID document is public and the schema URLs are frozen and immutable, so verification needs no permission from us: nothing to authenticate to, and nothing we can withhold to make a credential stop verifying. It is not independent of reachability, though. onUnreachable: 'cache-then-deny' is the only implemented mode, so a revocation list that cannot be fetched is served from cache inside the staleness window and denied outside it — and Observer's own clause-zero status list is served by api.observerprotocol.org rather than as a static file. It fails closed, and it will refuse us too.

A hosted one-call verifier is also available at verify.observerprotocol.orgPOST /v1/verify, open and unauthenticated, rate limited. It returns a verdict signed with did:web:observerprotocol.org#key-7, so its answer is checkable against the same DID document as everything else.

The offline path above stays the primary instruction. It needs nothing from us at the moment of verification and cannot be rate limited, revoked or taken down. The hosted endpoint is a convenience for getting an answer in one call, not a dependency.

← All documentation