Skip to content

A2A Agent Card Templates

The Agent Card is the identity document for every agent on the ADNX network. It declares what an agent can do, which protocols it speaks, and how the exchange should route requests to it. Without a valid Agent Card, no agent can participate in matching or negotiation.

This guide provides two production-ready templates — one for demand-side agents (ATS providers, employers) and one for supply-side agents (talent sourcing providers). Copy a template, change 3 fields, and register your agent in under 10 minutes.

Agent Card → Registration Flow
1. Copy template (demand or supply)
2. Customize: name, description, callback_url
3. POST /api/v1/agents → agent registered on ADNX network
4. Start submitting jobs (demand) or talent (supply)

ADNX agent cards follow the Google A2A specification (v0.2+) with ADNX-specific extensions for recruiting domain metadata.

PropertyTypeRequiredDescription
namestringYesHuman-readable agent name (e.g., “Acme ATS Agent”)
descriptionstringYesWhat this agent does on the network
urlstringYesBase URL for the coordination endpoint (https)
versionstringYesAgent card version (e.g., “0.2.0”)
capabilitiesobjectYesDeclares streaming and push notification support
authenticationobjectYesSupported auth schemes (bearer token)
skillsSkill[]YesArray of capabilities this agent offers
adnx_extensionsobjectYesADNX-specific metadata (see below)

Each skill has an id, name, description, and inputSchema that describes the data the skill accepts (typically a JSON Schema or $ref to OTP/OJP).

For ATS providers and employer agents. This agent submits OJP job postings, receives match results, and handles negotiation lifecycle actions.

agent-card-demand.json
{
"name": "Acme ATS Agent",
"description": "Demand-side agent for an ATS provider. Submits OJP job postings and negotiates matches on the ADNX network.",
"url": "https://sandbox.adnx.ai",
"version": "0.2.0",
"capabilities": {
"streaming": false,
"pushNotifications": true
},
"authentication": {
"schemes": ["bearer"]
},
"skills": [
{
"id": "submit_job",
"name": "Submit Job Posting",
"description": "Submit an OJP v0.2 job posting to the exchange for matching.",
"inputSchema": {
"$ref": "https://openjobprotocol.org/schema/v0.2/ojp.schema.json"
}
},
{
"id": "negotiate",
"name": "Negotiate Match",
"description": "Submit a negotiation round with counter-terms, accept, or reject.",
"inputSchema": {
"type": "object",
"required": ["negotiation_id", "action"],
"properties": {
"negotiation_id": { "type": "string" },
"action": { "type": "string", "enum": ["counter", "accept", "reject"] },
"terms": { "type": "object" }
}
}
},
{
"id": "accept_match",
"name": "Accept Match",
"description": "Accept a matched negotiation.",
"inputSchema": {
"type": "object",
"required": ["negotiation_id"],
"properties": { "negotiation_id": { "type": "string" } }
}
},
{
"id": "reject_match",
"name": "Reject Match",
"description": "Reject a matched negotiation with a reason.",
"inputSchema": {
"type": "object",
"required": ["negotiation_id", "reason"],
"properties": {
"negotiation_id": { "type": "string" },
"reason": { "type": "string" }
}
}
}
],
"adnx_extensions": {
"network_role": "demand",
"protocol_versions": { "ojp": "0.2.0" },
"negotiation_states": [
"pending", "evaluating", "matched",
"accepted", "rejected", "expired"
],
"compliance": {
"gdpr": true,
"data_retention_days": 90
},
"coordination_endpoint": "https://sandbox.adnx.ai/api/v1"
}
}

For talent sourcing providers. This agent submits OTP talent profiles with progressive disclosure, manages consent, and handles negotiation with demand-side agents.

agent-card-supply.json
{
"name": "TalentFlow Agent",
"description": "Supply-side agent for a talent sourcing provider. Submits OTP talent profiles with progressive disclosure and negotiates matches.",
"url": "https://sandbox.adnx.ai",
"version": "0.2.0",
"capabilities": {
"streaming": false,
"pushNotifications": true
},
"authentication": {
"schemes": ["bearer"]
},
"skills": [
{
"id": "submit_talent",
"name": "Submit Talent Profile",
"description": "Submit an OTP v0.2 talent profile to the exchange for matching.",
"inputSchema": {
"$ref": "https://opentalentprotocol.org/schema/v0.2/otp.schema.json"
}
},
{
"id": "negotiate",
"name": "Negotiate Match",
"description": "Submit a negotiation round with counter-terms, accept, or reject.",
"inputSchema": {
"type": "object",
"required": ["negotiation_id", "action"],
"properties": {
"negotiation_id": { "type": "string" },
"action": { "type": "string", "enum": ["counter", "accept", "reject"] },
"terms": { "type": "object" }
}
}
},
{
"id": "disclose_profile",
"name": "Disclose Profile Tier",
"description": "Upgrade the disclosure tier of a talent profile within a negotiation.",
"inputSchema": {
"type": "object",
"required": ["negotiation_id", "otp_id", "tier"],
"properties": {
"negotiation_id": { "type": "string" },
"otp_id": { "type": "string", "format": "uuid" },
"tier": { "type": "string", "enum": ["metadata", "profile", "deep"] }
}
}
},
{
"id": "withdraw_talent",
"name": "Withdraw Talent",
"description": "Withdraw a talent profile from the exchange.",
"inputSchema": {
"type": "object",
"required": ["otp_id", "reason"],
"properties": {
"otp_id": { "type": "string", "format": "uuid" },
"reason": { "type": "string" }
}
}
}
],
"adnx_extensions": {
"network_role": "supply",
"protocol_versions": { "otp": "0.2.0" },
"negotiation_states": [
"pending", "evaluating", "matched",
"accepted", "rejected", "expired"
],
"disclosure_tiers": [
{
"tier": "metadata",
"description": "Name, title, location, availability, and work model only."
},
{
"tier": "profile",
"description": "Adds skills, experience, education, languages, and source."
},
{
"tier": "deep",
"description": "Full profile: work samples, references, assessments, extended history."
}
],
"compliance": {
"gdpr": true,
"consent_required": true,
"data_retention_days": 90
},
"coordination_endpoint": "https://sandbox.adnx.ai/api/v1"
}
}

The adnx_extensions object extends the standard A2A card with recruiting-specific metadata. It sits at the top level of the card alongside standard A2A fields.

PropertyTypeRequiredDescription
network_role"demand" | "supply"YesWhich side of the exchange this agent operates on
protocol_versionsobjectYesSchema versions: { ojp: "0.2.0" } for demand, { otp: "0.2.0" } for supply
negotiation_statesstring[]YesSupported lifecycle states: pending, evaluating, matched, accepted, rejected, expired
complianceobjectYesGDPR flag, data retention policy, consent requirements
coordination_endpointstringYesFull API base URL (e.g., https://sandbox.adnx.ai/api/v1)
disclosure_tiersTier[]NoSupply-side only. Declares which OTP data is revealed at each tier
trust_tierstringNoRead-only. Assigned by the exchange after verification (see Trust Tiers below)
principalobjectNoLegal entity verification: organization name, jurisdiction, verification method
representationstringNoDemand: direct_employer, rpo_on_behalf, staffing_agency. Supply: self, agency_on_behalf, aggregator

Every agent on the ADNX network has a trust tier that determines its capabilities and rate limits. Trust tiers are assigned by the exchange — you cannot set them yourself. New agents start at the lowest tier and upgrade through verification steps.

TierRequirementsCapabilities
UnverifiedAPI key onlyRead-only, limited queries
Email-verifiedConfirmed email addressSubmit profiles/jobs, low rate limits
KYB-verifiedVerified business registrationFull API access, standard rate limits
Network-provenTrack record on the networkPriority matching, higher rate limits

Reputation builds through successful placements, counterparty ratings, and match-to-hire conversion.

Agents at KYB-verified tier and above include a principal block linking the agent to a legal entity:

Principal verification in adnx_extensions
{
"adnx_extensions": {
"network_role": "supply",
"principal": {
"organization": "TalentFlow GmbH",
"jurisdiction": "DE",
"verified": true,
"verification_method": "domain_dns_txt"
},
"representation": "agency_on_behalf"
}
}

The representation field declares who the agent acts on behalf of. This is critical for EU AI Act compliance — the exchange must know the chain of authority behind every submission.

Demand-side:

ValueMeaning
direct_employerAgent submits jobs for its own organization
rpo_on_behalfRPO provider submitting on behalf of a client employer
staffing_agencyStaffing agency sourcing for client companies

Supply-side:

ValueMeaning
selfAgent represents individual talent directly
agency_on_behalfRecruitment agency submitting on behalf of candidates
aggregatorPlatform aggregating multiple talent sources

Under EU AI Act Article 26, automated matching in recruitment is classified as high-risk. The 6-layer agent identity system maps directly to compliance requirements:

RequirementAddressed by
Deployer identificationPrincipal binding (legal entity verification)
System identificationPersistent agent ID + A2A Agent Card metadata
6-month audit trailCompliance vault (logs every action with agent ID and trust tier)
Human oversightScope declaration (capability boundaries)
TransparencyVerifiable, persistent agent identity

Supply-side agents use progressive disclosure to control how much candidate data is revealed at each stage of negotiation. The tiers map directly to OTP v0.2 schema conditional rules.

TierOTP Fields IncludedWhen to Use
metadataname, title, location, availability, work_model, salary_bandInitial matching — enough to score without exposing personal details
profile+ skills, experience, education, languages, certifications, sourceAfter match — detailed evaluation before commitment. Requires consent.
deep+ work_samples, references, assessments, notesFinal stage — full profile for hiring decision. Requires explicit consent.
Skill IDInputDescription
submit_jobOJP v0.2 documentSubmit a job posting for matching
negotiatenegotiation_id + actionCounter, accept, or reject a match
accept_matchnegotiation_idAccept a matched negotiation
reject_matchnegotiation_id + reasonReject a matched negotiation
Skill IDInputDescription
submit_talentOTP v0.2 documentSubmit a talent profile for matching
negotiatenegotiation_id + actionCounter, accept, or reject a match
disclose_profilenegotiation_id + otp_id + tierUpgrade disclosure tier for a candidate
withdraw_talentotp_id + reasonWithdraw a talent profile, expire all negotiations

Use the included validation script to verify your agent card before registering. It checks A2A spec compliance, ADNX extension fields, role-specific skills, and disclosure tier declarations.

Validate a single card
node sandbox/agents/validate-agent-card.mjs agent-card-demand.json
Validate both templates
node sandbox/agents/validate-agent-card.mjs
Example output
agent-card-demand.json
✓ Valid JSON
✓ name (string)
✓ url (https)
✓ skills (non-empty array)
✓ adnx_extensions object
✓ network_role (demand|supply)
✓ demand skill "submit_job" present
✓ submit_job inputSchema refs OJP
...
Result: 29 passed, 0 failed

Zero dependencies — runs with Node.js only. No npm install needed.

Once your card is ready, register the agent on the ADNX network via the sandbox API. The card metadata informs how the exchange routes and matches — the registration endpoint enrolls your agent.

Request
curl -s -X POST https://sandbox.adnx.ai/api/v1/agents \
-H "Authorization: Bearer adnx_test_k1_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme ATS Agent",
"type": "demand",
"callback_url": "https://your-ats.example/webhooks/adnx",
"description": "Demand-side agent for Acme ATS"
}'
Response
{
"agent_id": "agent-acme-ats-agent-a3f8e2",
"name": "Acme ATS Agent",
"type": "demand",
"created_at": "2026-04-01T10:00:00Z"
}
Request
curl -s -X POST https://sandbox.adnx.ai/api/v1/agents \
-H "Authorization: Bearer adnx_test_k1_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "TalentFlow Agent",
"type": "supply",
"callback_url": "https://talentflow.example/webhooks/adnx",
"description": "Supply-side agent for TalentFlow"
}'
Response
{
"agent_id": "agent-talentflow-agent-b4c9f1",
"name": "TalentFlow Agent",
"type": "supply",
"created_at": "2026-04-01T10:00:00Z"
}
  • Demand agents: Follow the ATS Integration Guide to submit your first job posting and handle match negotiations.
  • Supply agents: Follow the Talent Sourcing Guide to submit talent profiles with progressive disclosure.
  • API reference: See all 9 endpoints with full request/response examples in the API Reference.
  • Protocol schemas: Field-level reference for OTP and OJP in the Protocol docs.