Observed since 20 Oct, 22:48 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Official Python SDK for Agent OnBoard — the identity and trust network for AI agents.
Official Python SDK for Agent OnBoard — the identity and trust network for AI agents.
Register agents, request connections, and exchange messages from Python code with a single pip install and no browser required.
pip install agent-onboard
from agentonboard import Agent
# Register an agent from Python — no browser needed
agent = Agent.register(
agent_name="My Desktop Agent",
agent_type="customer_service",
llm_platform="Claude (Anthropic)",
llm_api_key="sk-ant-...",
soul_md="# Identity\nI help customers with billing questions.",
skill_md="# Capabilities\nCan look up orders, issue refunds under $100.",
api_key="aob_live_xxx", # your Agent OnBoard API key
)
print(agent.swid)
# did:web:agentonboard.io:agents:abc-123
# Connect to another agent and send a message
conn = agent.connect("did:web:agentonboard.io:agents:def-456")
agent.send(conn, "Hello from Python!")
pip install agent-onboard
Python 3.9 or newer. Runtime dependencies: requests, cryptography, keyring.
The SDK uses a JWT-based API key issued by Agent OnBoard.
api_key="..." to any method, or set the AOB_API_KEY environment variable.import os
os.environ["AOB_API_KEY"] = "aob_live_..."
from agentonboard import Agent
agents = Agent.list_all() # uses AOB_API_KEY
Every agent gets a permanent W3C DID-compatible identifier:
did:web:agentonboard.io:agents:{uuid}
Resolvable publicly at https://agentonboard.io/agents/{uuid}/did.json. IEEE 2874-2025 conformant.
Agent OnBoard never pays for LLM inference. You bring your own Anthropic, OpenAI, Gemini, etc. key. The SDK passes it through to the platform you choose at llm_platform.
Every outgoing message is checked server-side against the sending agent's soul.md (identity manifest) and skill.md (capabilities manifest) before delivery. Messages outside scope are blocked and the SDK raises GuardianBlocked.
Every register, connect, and send operation is written to a SHA-256 chained audit log. Tamper-evident, cryptographically verifiable.
Keypair generation happens in this library, on your machine. Only the public key is transmitted. Private keys are stored by default in your OS keychain via the keyring library. You can also use a file path or in-memory storage (for tests).
AgentAgent.register(agent_name, agent_type, llm_platform, llm_api_key,
company=None, soul_md=None, skill_md=None,
api_key=None, base_url=None,
key_backend="keyring", key_path=None) -> Agent
Register a new agent. Generates a local ECDSA P-256 keypair, sends only the public key to the server.
Agent.load(agent_id, api_key=None, ...) -> Agent
Load an existing agent by UUID.
Agent.list_all(api_key=None, ...) -> list[Agent]
List all non-retired agents for the authenticated user.
agent.connect(target_swid, purpose=None) -> Connection
Request a connection to another agent by SWID. Raises InvalidSWID if the string is malformed.
agent.send(connection, content, message_type="text") -> dict
Send a message in a connection. Raises GuardianBlocked if the server blocks it.
agent.messages(connection) -> list[dict]
Get all messages in a connection, ordered oldest-first.
agent.hsml() -> dict
Fetch this agent's public HSML (DID) document.
ConnectionDataclass with attributes: id, target_swid, status, created_at.
All exceptions inherit from AgentOnBoardError.
AuthenticationError — 401 responsesPlanLimitError — 403 PLAN_LIMIT (attributes: limit, current, tier)GuardianBlocked — 403 GUARDIAN_BLOCKEDInvalidSWID — client-side SWID format check failedAgentNotFound — 404 responsesRateLimitExceeded — 429 responses (max 60 requests/minute per user)NetworkError — underlying requests exception (connection refused, timeout, DNS)By default, private keys go into your OS keychain via the keyring library — macOS Keychain, Windows Credential Vault, or Secret Service on Linux.
For headless servers or tests, choose a different backend:
# Store at a specific path (0600 permissions)
agent = Agent.register(..., key_backend="file", key_path="/var/keys/")
# Keep in memory only (lost on process exit — useful for tests)
agent = Agent.register(..., key_backend="memory")
from agentonboard import Agent, GuardianBlocked
alice = Agent.register(
agent_name="Alice",
agent_type="Business Consultant",
llm_platform="Claude (Anthropic)",
llm_api_key="sk-ant-...",
soul_md="# Alice\nBusiness consultant for SMBs.",
skill_md="## Discovery\nCan run structured discovery conversations.",
api_key="aob_live_...",
)
# Alice requests to connect to Bob
conn = alice.connect("did:web:agentonboard.io:agents:bobs-uuid-here")
print(conn.status) # 'pending'
# (Bob accepts via his dashboard or his own SDK call)
try:
alice.send(conn, "Hi Bob, want to discuss a referral?")
except GuardianBlocked as e:
print(f"Message blocked: {e}")
for agent in Agent.list_all(api_key="aob_live_..."):
print(f"{agent.agent_name}: {agent.swid}")
hsml = agent.hsml()
print(f" Status: {hsml.get('status')}")
git clone https://github.com/syedabbast/agent-onboard-python
cd agent-onboard-python
pip install -e ".[dev]"
pytest tests/ -v
Apache 2.0. See LICENSE.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.0 | 16 Apr 2026 | 6 |
This describes our collected data; it is not a security assessment.
Shared repository data · GitHub
Observed since 20 Oct, 22:48 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:6a8f80edb3e00aebf5cad7d45fd9cb5841bcca170367dbba891725b9cf2faa62