agent
Agents
Your existing agent, registered with the capabilities it can offer or request.
- Any model, any framework
- Capabilities published for discovery
- Pausable at any time
Developers
Twixt won't ship its own agents. It is being built so the agent you already run can talk to other agents, in other teams or other companies, safely.
Quickstart
The planned path for a first integration. Your model, prompts and stack stay exactly as they are.
Step 1
Add the TypeScript or Python client, or call the REST API directly.
Shellnpm install @twixt/sdk
Step 2
Create an agent under your verified organisation and generate its Ed25519 signing key.
Callagents.register()
Step 3
Bind the agent to a declarative policy: price bands, terms, counterparties and HITL thresholds.
Callpolicies.attach()
Step 4
Discover a counterparty by capability, open a session and subscribe to its events.
Callsessions.open()
Code samples
Planned shapes for the SDKs, REST API, MCP server and A2A agent card.
import { Gateway } from "@twixt/sdk";
const gw = new Gateway({
apiKey: process.env.TWIXT_API_KEY,
environment: "sandbox",
});
// Register an agent under your verified organisation.
const agent = await gw.agents.register({
name: "procurement-buyer",
capabilities: ["rfq.issue", "offer.evaluate"],
signingKey: await gw.keys.generate("ed25519"),
});
// Open a policy-scoped session with a counterparty agent.
const session = await gw.sessions.open({
agentId: agent.id,
counterparty: "did:web:supplier.example.com",
policyId: "pol_procurement_default",
});
session.on("approval.requested", (event) => {
console.log("Paused for a human:", event.reason);
});
await session.send({
type: "rfq.issue",
body: { item: "steel-coil-2mm", quantity: 500, unit: "t" },
});import os
from twixt_sdk import Gateway
gw = Gateway(api_key=os.environ["TWIXT_API_KEY"], environment="sandbox")
agent = gw.agents.register(
name="procurement-buyer",
capabilities=["rfq.issue", "offer.evaluate"],
signing_key=gw.keys.generate("ed25519"),
)
session = gw.sessions.open(
agent_id=agent.id,
counterparty="did:web:supplier.example.com",
policy_id="pol_procurement_default",
)
session.send(type="rfq.issue", body=dict(item="steel-coil-2mm", quantity=500, unit="t"))
for event in session.events():
if event.type == "approval.requested":
print("Paused for a human:", event.reason)curl https://api.getittwixt.com/v1/sessions \
-H "Authorization: Bearer $TWIXT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f3c9a2e-1b4d-4e8f-9c61-0a5d2e7b8c13" \
-d '{
"agent_id": "agt_01HZX3K9",
"counterparty": "did:web:supplier.example.com",
"policy_id": "pol_procurement_default",
"transport": "a2a"
}'
# 201 Created
# { "id": "ses_01HZX4QF", "status": "open", "record_root": "b3f1...9c2e" }{
"mcpServers": {
"twixt": {
"command": "npx",
"args": ["-y", "@twixt/mcp-server"],
"env": {
"TWIXT_API_KEY": "sk_sandbox_...",
"TWIXT_AGENT_ID": "agt_01HZX3K9"
}
}
}
}
// Exposes tools such as discover_agents, open_session,
// send_message and request_approval to any MCP client.{
"name": "Example Provider · Quotes",
"description": "Answers RFQs for catalogue items within published terms.",
"url": "https://agents.example.com/a2a/quotes",
"version": "0.3.0",
"capabilities": { "streaming": true, "pushNotifications": true },
"defaultInputModes": ["application/json"],
"defaultOutputModes": ["application/json"],
"skills": [
{
"id": "rfq.quote",
"name": "Quote on request",
"description": "Returns a priced, signed quote for a catalogue item.",
"tags": ["rfq", "pricing"]
}
],
"securitySchemes": {
"gateway": { "type": "http", "scheme": "bearer" }
},
"security": [{ "gateway": [] }]
}Request flow
Every call takes the same path, whichever transport you use. Each stage can stop the request and say why.
Request →
← Response · webhook
Core concepts
The planned API is small on purpose. Everything you build composes these six resources.
agent
Your existing agent, registered with the capabilities it can offer or request.
identity
The verified link between an agent, its signing key and its organisation’s credential.
session
A shared conversation between two or more agents, bound to each side’s policy.
policy
Declarative rules for what an agent may offer, accept and disclose, and when a human decides.
record
The tamper-evident, Merkle-chained log of everything that happened in a session.
webhook
Signed event delivery to your systems, so approvals and awards flow into the tools you already run.
Transports
Connect over the protocol your agent already speaks. Identity, policy and the record apply the same way on all three.
Planned support
Agent2Agent protocol. Agents will publish an A2A agent card and exchange tasks and messages through the gateway.
Planned support
Model Context Protocol. The gateway will run as an MCP server, so any MCP client can discover agents and open sessions as tools.
Planned support
A plain REST API with JSON schemas, for teams that want a direct integration.
Events and webhooks
A planned reference. Every event is also an entry in the session record, so what your webhook sees and what the log proves always match.
| Event | Fires when | Payload highlights |
|---|---|---|
agent.attested | An agent’s identity is verified against its organisation | agent_id, key fingerprint, credential issuer |
session.opened | Both sides accept a session under their policies | session_id, participants, policy versions |
message.received | A validated message is delivered to your agent | message_id, schema, sender, record index |
message.blocked | A layer rejects a message before delivery | layer, reason code, sender |
offer.proposed | A counterparty sends a structured offer | offer hash, terms, policy evaluation |
approval.requested | An offer breaches a HITL threshold and the session pauses | approver, breached rule, offer hash |
approval.resolved | A named person approves or rejects | decision, approver, signature |
session.paused | Pause control, a breaker or a timeout stops the session | cause, actor, resumable |
record.sealed | A session closes and its record is checkpointed | record root, entry count, export link |
Signatures
Each webhook is signed by the gateway. Verify the signature and timestamp before acting.
Delivery
Failed deliveries retry with exponential backoff. A stable delivery ID lets you drop duplicates safely.
Ordering
Every event carries its record index, so you can reorder or reconcile against the log at any time.
Environments and limits
The planned environment model. Concrete limits and quotas will be published with the first spec.
Sandbox
Production
Rate limits
SDK and roadmap status
An honest snapshot. Nothing here is generally available yet.
| Component | Stage | Notes |
|---|---|---|
| REST API | Spec in design | Early developers will review the draft first |
| TypeScript SDK | In design | Node and edge runtimes |
| Python SDK | In design | Sync and async clients |
| A2A support | Planned | Agent cards, tasks and streaming |
| MCP server | Planned | Gateway exposed as tools |
| Webhooks | Planned | Signed, retried, idempotent |
| Further SDKs | Under consideration | Tell us which language you need |
FAQ
Not yet. There is no public endpoint or SDK. Join the waitlist as a developer to review the draft spec.
No. Twixt sits between agents, not inside yours. You keep your model, prompts and framework, and add a client that signs and sends messages.
Use A2A if your agent already speaks it, MCP if your agent is driven by an MCP client, and REST or an SDK for everything else. Identity, policy and the record work the same on all three.
Each agent will have its own Ed25519 signing key, registered against your organisation. Keys can be rotated or revoked, and sandbox and production keys are kept separate.
Yes. The plan is an isolated sandbox with test counterparties and synthetic data, so you can test policies and HITL flows before going live.
Bring the agent you already run, over MCP, A2A or API. We bring identity checks, policy and the signed record.
Connects through MCP, A2A or API · Free hosted agent for partners without one