ParmanaClient. Python exposes each area as an attribute of the client, such as client.policy or client.receipt, and adds a shortcut method on the client for most of them. Both forms are listed.
Version. Rows marked 1.6.0 need SDK 1.6.0, published on 2026-10-11,
rows marked 1.5.0 need 1.5.0 or later, rows marked 1.4.0 need 1.4.0 or
later, and rows marked 1.3.0 need 1.3.0 or later, both on npm (
npm install @parmana/sdk) and PyPI (pip install parmana). Every other row works
in 1.2.0.Executing and deciding
Evidence and verification
The offline verifiers make no network call. Get the public key once with
publicKey() or public_key() and keep it. In Python they need pip install "parmana[verify]", and from 1.3.0 they accept either the raw JSON or the SDK’s own model.
Execution Intents
Policies and governance
Approvers
External connectors
Sign the step up authorization for approve or reject with
signPolicyChangeStepUp() or sign_policy_change_step_up(), with the changeId as pendingPolicyChangeId. With an SDK older than 1.5.0, call these routes directly; see Connect any external system.
Business signal sources
With an SDK older than 1.6.0, call these routes directly; see Connect a business signal source.
Authority grants
With an SDK older than 1.6.0, call these routes directly; see Grant an agent authority.
Caller and service
Operations with no SDK method, and why
Errors
Both SDKs raise a typed error for every non 2xx response. From 1.3.0 both carry the HTTP status:error.statusCode in TypeScript, error.status_code in Python (Python has had it since before 1.3.0). The server’s own code, for example CONNECTOR_NOT_REGISTERED or SIGNING_UNAVAILABLE, is on serverCode / server_code of InternalServerError and of AuthorizationError when present.
Every error, from the server or raised by the SDK itself, extends
ParmanaError. The ones raised without a server response are ConfigurationError (bad client configuration), NetworkError and TimeoutError (the request did not complete; in Python TimeoutError is a subclass of NetworkError, in TypeScript both extend ParmanaError directly), and VerificationError and ReplayError (the result failed a check or could not be replayed).
Parity rules both SDKs keep
- The same core methods on the client itself:
execute,verify,replay,validatePolicy(validate_policyin Python) andhealth, in addition to the grouped APIs (client.policies,client.executionIntentsand so on). - The same error class names as listed above, so one catch clause means the same thing in both languages.
How this is kept true
scripts/check-sdk-docs.tsfails the build when a page names a method, option or export that does not exist in the SDK.- Unit tests in
typescript/test/Alignment.test.tsandpython/tests/test_sdk_alignment.pycheck the method, path and body of every operation added in 1.3.0. - Both SDKs verify the same real server signed Execution Intent offline. A step up authorization signed by each SDK is accepted by the server’s own verifier.
- On 2026-09-25 both SDKs were run against a live self hosted deployment: caller, public key, propose, list, sign and approve a policy change, a reused signature refused, a refused request with its Refusal Record verified, an authorized request with no connector (
503,CONNECTOR_NOT_REGISTERED), its Execution Intent verified offline, and Trust Record listing. 11 of 11 checks in each SDK.