Catalog PyPI
PACKAGE EXPLORERView in registry

a2spa

PyPI

A2SPA payload helper library for AI-agent runtime authorization

a2spaai-agentsauthorizationpayload-helpersruntime-securitysigned-payloads
Versions collected1
Direct dependencies2From release 0.1.4
Last observed20 Oct, 16:34 UTC

README

Version 0.1.4 documentation

A2SPA Python Payload Helpers

Helper-only Python package for building, hashing, and signing A2SPA runtime authorization payloads.

The verifier remains server-side. This package does not authorize actions by itself.

Install

pip install a2spa

For ML-DSA signing support where the optional wheel is available:

pip install "a2spa[pq]"

Basic Usage

from pathlib import Path

from a2spa import build_payload_fields, build_signed_request, policy_input

private_key_text = Path("sender.priv.pem").read_text(encoding="utf-8")

payload = build_payload_fields(
    agent_id="user-123_sender",
    target_agent_id="user-123_receiver",
    input_data=policy_input(action="deliver", workflow_scope="messages:deliver"),
)

request_body = build_signed_request(private_key_text, payload)

Send request_body to POST /api/verify_payload with your account API key in the x-api-key header.

Helper Functions

  • build_payload_fields(...)
  • policy_input(...)
  • policy_template(...)
  • state_continuity_claim(...)
  • canonicalize_payload(...)
  • compute_payload_hash(...)
  • finalize_payload(...)
  • sign_payload(...)
  • build_signed_request(...)
  • is_authorized_result(...)
  • require_authorized_result(...)
  • verify_execution_receipt(...)
  • enforce_target_authorization(...)
  • build_target_acknowledgement(...)
  • execute_protected_action(...)
  • build_debug_snapshot(...)

Signed Bytes

Current helper compatibility signs the UTF-8 bytes of json.dumps(signable_payload, sort_keys=True) using the normalized signable fields. Do not reimplement canonicalization unless your bytes match canonicalize_payload(...) exactly.

Security Boundary

Private keys must stay in a secret manager, server environment, or deployment secret. Do not paste private keys into chats, logs, client-side code, or source control.

A2SPA 2.1 Target Enforcement

A2SPA 2.1 adds a deployment profile for protected targets. The target, trusted gateway, service, or executor should fail closed unless the A2SPA authorization result is valid for the exact operation being committed.

from a2spa import build_target_acknowledgement, enforce_target_authorization

authorization = enforce_target_authorization(
    result,
    target_agent_id="user-123_email-target",
    action="send_email",
    workflow_scope="email:send",
    trusted_receipt_public_key_pem=trusted_a2spa_receipt_public_key,
)

# Commit the protected side effect only after enforce_target_authorization returns.
provider_result = email_provider.send(message)

target_ack = build_target_acknowledgement(
    authorization,
    target_id="smtp-gateway",
    operation_id=message["idempotency_key"],
    result={"provider_message_id": provider_result.id},
)

If the agent can reach another route that commits the same protected consequence without this guard, the deployment fails the A2SPA 2.1 profile.

Downloads & popularity

1downloads
1-day window · source-reported counts19 Oct 2026
186930
2026-08-17: 186 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-17–2026-08-172026-08-18: 27 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-18–2026-08-182026-08-19: 7 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-19–2026-08-192026-08-20: 90 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-20–2026-08-202026-08-21: 2 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-21–2026-08-212026-08-22: 4 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-22–2026-08-222026-08-23: 7 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-23–2026-08-232026-08-24: 13 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-24–2026-08-242026-08-25: 4 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-25–2026-08-252026-08-26: 3 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-26–2026-08-262026-08-28: 97 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-28–2026-08-282026-08-29: 18 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-29–2026-08-292026-08-30: 2 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-30–2026-08-302026-08-31: 2 · observed 2026-10-20T16:35:46.3825528Z · period 2026-08-31–2026-08-312026-09-01: 6 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-01–2026-09-012026-09-02: 3 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-02–2026-09-022026-09-03: 2 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-03–2026-09-032026-09-04: 12 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-04–2026-09-042026-09-05: 6 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-05–2026-09-052026-09-06: 6 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-06–2026-09-062026-09-07: 4 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-07–2026-09-072026-09-08: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-08–2026-09-082026-09-09: 4 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-09–2026-09-092026-09-10: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-10–2026-09-102026-09-12: 7 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-12–2026-09-122026-09-13: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-13–2026-09-132026-09-14: 3 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-14–2026-09-142026-09-15: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-15–2026-09-152026-09-16: 7 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-16–2026-09-162026-09-17: 2 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-17–2026-09-172026-09-18: 8 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-18–2026-09-182026-09-19: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-19–2026-09-192026-09-20: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-20–2026-09-202026-09-21: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-21–2026-09-212026-09-23: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-23–2026-09-232026-09-24: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-24–2026-09-242026-09-26: 4 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-26–2026-09-262026-09-27: 6 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-27–2026-09-272026-09-28: 7 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-28–2026-09-282026-09-29: 8 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-29–2026-09-292026-09-30: 107 · observed 2026-10-20T16:35:46.3825528Z · period 2026-09-30–2026-09-302026-10-01: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-01–2026-10-012026-10-02: 3 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-02–2026-10-022026-10-03: 8 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-03–2026-10-032026-10-04: 2 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-04–2026-10-042026-10-05: 2 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-05–2026-10-052026-10-06: 2 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-06–2026-10-062026-10-07: 3 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-07–2026-10-072026-10-08: 10 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-08–2026-10-082026-10-09: 4 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-09–2026-10-092026-10-10: 2 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-10–2026-10-102026-10-11: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-11–2026-10-112026-10-12: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-12–2026-10-122026-10-13: 2 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-13–2026-10-132026-10-14: 11 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-14–2026-10-142026-10-15: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-15–2026-10-152026-10-16: 2 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-16–2026-10-162026-10-17: 4 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-17–2026-10-172026-10-18: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-18–2026-10-182026-10-19: 1 · observed 2026-10-20T16:35:46.3825528Z · period 2026-10-19–2026-10-19
17 Aug19 Oct

pypistats · 60 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-19 – 2026-10-1912026-10-20T16:35:46.3825528Z
2026-10-18 – 2026-10-1812026-10-20T16:35:46.3825528Z
2026-10-17 – 2026-10-1742026-10-20T16:35:46.3825528Z
2026-10-16 – 2026-10-1622026-10-20T16:35:46.3825528Z
2026-10-15 – 2026-10-1512026-10-20T16:35:46.3825528Z
2026-10-14 – 2026-10-14112026-10-20T16:35:46.3825528Z
2026-10-13 – 2026-10-1322026-10-20T16:35:46.3825528Z
2026-10-12 – 2026-10-1212026-10-20T16:35:46.3825528Z
2026-10-11 – 2026-10-1112026-10-20T16:35:46.3825528Z
2026-10-10 – 2026-10-1022026-10-20T16:35:46.3825528Z
2026-10-09 – 2026-10-0942026-10-20T16:35:46.3825528Z
2026-10-08 – 2026-10-08102026-10-20T16:35:46.3825528Z
2026-10-07 – 2026-10-0732026-10-20T16:35:46.3825528Z
2026-10-06 – 2026-10-0622026-10-20T16:35:46.3825528Z
2026-10-05 – 2026-10-0522026-10-20T16:35:46.3825528Z
2026-10-04 – 2026-10-0422026-10-20T16:35:46.3825528Z
2026-10-03 – 2026-10-0382026-10-20T16:35:46.3825528Z
2026-10-02 – 2026-10-0232026-10-20T16:35:46.3825528Z
2026-10-01 – 2026-10-0112026-10-20T16:35:46.3825528Z
2026-09-30 – 2026-09-301072026-10-20T16:35:46.3825528Z
2026-09-29 – 2026-09-2982026-10-20T16:35:46.3825528Z
2026-09-28 – 2026-09-2872026-10-20T16:35:46.3825528Z
2026-09-27 – 2026-09-2762026-10-20T16:35:46.3825528Z
2026-09-26 – 2026-09-2642026-10-20T16:35:46.3825528Z
2026-09-24 – 2026-09-2412026-10-20T16:35:46.3825528Z
2026-09-23 – 2026-09-2312026-10-20T16:35:46.3825528Z
2026-09-21 – 2026-09-2112026-10-20T16:35:46.3825528Z
2026-09-20 – 2026-09-2012026-10-20T16:35:46.3825528Z
2026-09-19 – 2026-09-1912026-10-20T16:35:46.3825528Z
2026-09-18 – 2026-09-1882026-10-20T16:35:46.3825528Z
2026-09-17 – 2026-09-1722026-10-20T16:35:46.3825528Z
2026-09-16 – 2026-09-1672026-10-20T16:35:46.3825528Z
2026-09-15 – 2026-09-1512026-10-20T16:35:46.3825528Z
2026-09-14 – 2026-09-1432026-10-20T16:35:46.3825528Z
2026-09-13 – 2026-09-1312026-10-20T16:35:46.3825528Z
2026-09-12 – 2026-09-1272026-10-20T16:35:46.3825528Z
2026-09-10 – 2026-09-1012026-10-20T16:35:46.3825528Z
2026-09-09 – 2026-09-0942026-10-20T16:35:46.3825528Z
2026-09-08 – 2026-09-0812026-10-20T16:35:46.3825528Z
2026-09-07 – 2026-09-0742026-10-20T16:35:46.3825528Z
2026-09-06 – 2026-09-0662026-10-20T16:35:46.3825528Z
2026-09-05 – 2026-09-0562026-10-20T16:35:46.3825528Z
2026-09-04 – 2026-09-04122026-10-20T16:35:46.3825528Z
2026-09-03 – 2026-09-0322026-10-20T16:35:46.3825528Z
2026-09-02 – 2026-09-0232026-10-20T16:35:46.3825528Z
2026-09-01 – 2026-09-0162026-10-20T16:35:46.3825528Z
2026-08-31 – 2026-08-3122026-10-20T16:35:46.3825528Z
2026-08-30 – 2026-08-3022026-10-20T16:35:46.3825528Z
2026-08-29 – 2026-08-29182026-10-20T16:35:46.3825528Z
2026-08-28 – 2026-08-28972026-10-20T16:35:46.3825528Z
2026-08-26 – 2026-08-2632026-10-20T16:35:46.3825528Z
2026-08-25 – 2026-08-2542026-10-20T16:35:46.3825528Z
2026-08-24 – 2026-08-24132026-10-20T16:35:46.3825528Z
2026-08-23 – 2026-08-2372026-10-20T16:35:46.3825528Z
2026-08-22 – 2026-08-2242026-10-20T16:35:46.3825528Z
2026-08-21 – 2026-08-2122026-10-20T16:35:46.3825528Z
2026-08-20 – 2026-08-20902026-10-20T16:35:46.3825528Z
2026-08-19 – 2026-08-1972026-10-20T16:35:46.3825528Z
2026-08-18 – 2026-08-18272026-10-20T16:35:46.3825528Z
2026-08-17 – 2026-08-171862026-10-20T16:35:46.3825528Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.1.430 Sept 20262

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 16:34 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:15fb46583496fdb4685556c682bf16996d1802fc9dd4144c6e1da64d1cd859cf