A2CN is the shared protocol layer for cross-company commercial negotiation:
discovery, mandates, signed offers, acceptance, deterministic transaction
records, audit logs, and post-commitment events.
Adapters: 11 platform adapters across procurement, CPQ, CLM, renewal, and signature.
Overview
Where A2CN fits
A2CN sits between the systems that discover commercial opportunities and
the systems that execute them. A procurement, CPQ, CLM, renewal, or
agent framework can translate local events into A2CN terms, let two
authorized agents negotiate, and receive a content-addressed transaction
record when the session completes.
Protocol boundary
Defines shared messages, turn order, mandate checks, signatures, acceptance, and record verification.
Platform boundary
Adapters translate platform-native RFx, quote, workflow, renewal, and envelope events into or out of A2CN.
Canonical implementation: the Python reference server is the executable model for v0.2.0 behavior and currently ships with 474 passing tests.
Source, tests, and deeper implementation detail remain available in the
GitHub repository.
Quickstart
Run a complete bilateral negotiation
The fastest way to see the protocol is the Python reference demo. It
creates two agents, exchanges signed offers, accepts the final offer,
and verifies that both sides produce the same transaction record hash.
Production integrations usually use the client library or adapter helpers,
but the wire flow is intentionally simple: create a session, post signed
messages, then fetch the completed record.
Sessions are bilateral and turn-based. Round 1 begins with an
offer; later commercial proposals are counteroffer
messages. A terminal message creates either a completed record or an
auditable terminal state.
01
Discover
Fetch /.well-known/a2cn-agent to learn endpoint, DID, deal types, and verification method.
02
SessionInit
Initiator proposes deal type, timeouts, currency, and mandate.
03
Negotiate
Offer and counteroffer messages carry signed protocol acts.
04
Accept
Acceptance signs the canonical accepted-offer payload.
05
Record
Both parties independently compute the same transaction record hash.
Concepts
Core protocol concepts
SessionInit / SessionAck
SessionInit declares requested session parameters and the initiator mandate. SessionAck binds the responder, accepted parameters, responder mandate, and initial turn.
Offers and counteroffers
Each commercial proposal contains canonical terms, a protocol-act hash, and a compact JWS over that hash.
Mandates
Declared mandates constrain agent authority, including hard max commitment value checks before state mutation.
DID-backed signatures
JWT auth and protocol-act signatures resolve DID documents and accept only signing-capable verification methods.
Transaction records
Completed sessions emit deterministic records linking final terms, offer chain, acceptance, parties, mandates, and signatures.
Post-commitment events
Delivery, acknowledgment, dispute, resolution, contract, and signature workflows can reference the record hash without reopening negotiation.
Reference
Reference server endpoints
The Python server is implemented with FastAPI and returns
application/a2cn+json for protocol endpoints. State-mutating
endpoints use Bearer JWT authentication, except inbound
POST /invitations, which authenticates by invitation signature.
transaction_record_hash plus event-specific evidence
Records
Transaction records and audit logs
A completed A2CN negotiation produces a deterministic transaction record.
The verifier checks record hash integrity, accepted-offer linkage, the
offer-chain hash, and both party signatures. This makes the record usable
as a neutral artifact for CLM, signature, payment, custody, and dispute
workflows.
When post-commitment fulfillment reaches a terminal state, the reference
server can also expose a Concordia-shaped
FulfillmentAttestation. A clean
delivery_acknowledged emits fulfilled_clean;
dispute_resolved emits fulfilled_with_mediation
with resolver metadata.
python
from a2cn.record import generate_transaction_record, verify_transaction_record
record = generate_transaction_record(session)
ok = verify_transaction_record(
record,
did_resolver={
"did:web:buyer.example": buyer_did_document,
"did:web:seller.example": seller_did_document,
},
)
assert ok is True
Audit logs are available for terminal sessions and include the message
log, terminal state, mandate context, and AI-system metadata such as
whether human oversight was present.
Agents
MCP and agent integration notes
Agent frameworks should keep commercial reasoning separate from protocol
custody. The agent can choose terms and negotiation strategy; the A2CN
client/server layer should canonicalize, hash, sign, verify, enforce
mandates, and store the record.
LLM agent loop
Use MCP tools or client wrappers to expose safe actions: start session, propose terms, accept offer, inspect record.
Separation of concerns
Never ask the model to invent hashes, signatures, mandate checks, or DID verification. Those belong in deterministic code.
Adapters are thin translation layers. They should preserve platform IDs,
normalize money into integer minor units, and leave commitment authority
to A2CN mandates and signatures.
Vendr benchmark and renewal context can seed an A2CN SaaS renewal session. The clean path is MCP-to-MCP: an agent asks Vendr for pricing intelligence, converts it into A2CN terms, and lets A2CN own the bilateral negotiation and record.
In
Renewal webhook or MCP pricing benchmark.
A2CN
saas_renewal terms with integer-cent values and mandate context.
Back
Summary artifact for CRM, sourcing notes, or agent memory. Vendr webhooks are one-way.
Ironclad workflow attributes become A2CN commercial terms, while completed A2CN sessions can write final values and record hashes back to Ironclad workflow metadata or record properties.
In
Workflow webhook with contract value, counterparty, dates, and line attributes.
A2CN
Heuristic routing to saas_renewal or goods_procurement.
Back
Workflow metadata update or POST /records payload with a2cnRecordHash.
SAP Ariba Event Management and Discovery RFx publication events map into A2CN goods procurement terms. The adapter preserves Ariba item and lot IDs for bid reconstruction.
In
Event items or Discovery RFx lots with quantities, unit prices, and delivery terms.
A2CN
goods_procurement terms with normalized total value and line items.
Back
Ariba bid payload or RFx acknowledgement with original item and lot identifiers.
JAGGAER ASO customer-host and sourcing events translate to A2CN goods procurement terms. Integrations can start from event-driven push payloads or CHES polling.
In
ASO sourcing event, CHES event response, or tenant-normalized push event.
A2CN
Line-item goods terms retaining jaggaer_item_id and jaggaer_lot_id.
Back
Response payload with prices converted from cents back to decimal values.
DocuSign is a formalization layer after A2CN completes. The adapter turns a dual-signed transaction record into an envelope and parses Connect callbacks into post-commitment status.
In
Completed A2CN transaction record with parties, contacts, final terms, and record hash.
A2CN
A2CN remains the canonical commercial commitment; DocuSign executes signature workflow.
Back
Connect events mark signature completed, declined, or voided.
DealHub quote-ready webhooks and quote details become A2CN SaaS renewal sessions. Completed records can be linked back through DealHub Actions API calls.
In
quoteReady webhook plus quote detail fetch.
A2CN
saas_renewal terms with total value, seat count, tier, and term length.
Back
External-signature action marking the quote won with A2CN audit notes.
Nue pricing, subscription, and order data can seed A2CN session terms and receive agreed terms back as Nue order creation payloads with audit references.
In
Pricing, subscription renewal, or quote/order payload from Nue.
A2CN
SaaS renewal terms and mandate bounds based on floor discount configuration.
Back
Nue order payload with a2cn_session_id, record hash, and notes.
The Revenue Cloud adapter translates Salesforce Pricing API responses into A2CN offer terms and maps agreed terms back into Revenue Cloud order payloads.
In
Pricing response from /connect/pricing/....
A2CN
Commercial terms normalized for negotiation and commitment checks.
Back
Order payload for /connect/qoc/sales-transactions.
Fairmarkit BID_CREATED sourcing webhooks can be parsed into A2CN goods procurement terms and sent back as response payloads when negotiation completes.
In
Bid-created webhook with request ID, item quantities, unit prices, and deadline.
A2CN
goods_procurement terms with line items and delivery days.
Back
Supplier response payload referencing the completed A2CN session.
Keelvar sourcing optimization events can trigger A2CN sessions, with agreed terms converted back into Keelvar response shapes for bid submission or audit.
In
Sourcing event or invitation accepted into an A2CN session.
A2CN
Goods procurement terms aligned with Keelvar item and event context.
Back
Keelvar response payload from completed transaction-record terms.