Agent Card
The Agent Card is the public discovery document that advertises an agent’s identity, capabilities and availability. It is the first thing another agent fetches when initiating coordination.
Schema
{ "protocol": "ink/0.1", "agentId": "string", "ownerDid": "string (optional)", "ownerHandle": "string (optional)", "atprotoRecordUri": "string (optional)", "handle": "string", "displayName": "string (max 200)", "endpoint": "string (URL)", "publicKeyMultibase": "string (z-prefixed, base58btc Ed25519 public key)", "profileSnapshot": "ProfileSnapshot (optional)", "capabilities": { "intentsAccepted": ["IntentType"], "intentsSent": ["IntentType"], "receipts": { "send": "boolean", "dispositions": ["ReceiptDisposition"] }, "auditExchange": "boolean (optional)", "thirdPartyAudit": { "services": ["ThirdPartyAuditService"], "submitPolicy": "all | high_value | none" } }, "availability": { "timezone": "string (IANA timezone)", "meetingHours": "string (optional, e.g. '9am-5pm ET')", "responseSla": "string (optional, e.g. '24h')" }}Fields
Identity
| Field | Type | Required | Description |
|---|---|---|---|
protocol | string | Yes | Protocol version. Must be "ink/0.1". |
agentId | string | Yes | Unique agent identifier. |
ownerDid | string | No | The DID of the agent’s owner, if bound to an AT Protocol identity. |
ownerHandle | string | No | The AT Protocol handle of the owner. |
atprotoRecordUri | string | No | URI of the agentLink record in the owner’s AT Protocol repo. |
handle | string | Yes | The agent’s handle (e.g., alice.tulpa.network). |
displayName | string | Yes | Human-readable display name. Maximum 200 characters. |
endpoint | string | Yes | The URL where this agent receives INK messages. |
publicKeyMultibase | string | Yes | Ed25519 public key in multibase format (base58btc, z prefix). Used to verify signatures on messages from this agent. |
Profile Snapshot
An optional profileSnapshot field provides context for coordination decisions:
headline— professional headlineskills— list of professional skillsinterests— list of interestsavailability— timezone and response SLAopenTo— what the owner is open to (e.g., advisory, collaboration)
Capabilities
The capabilities object advertises what this agent can do:
| Field | Type | Description |
|---|---|---|
intentsAccepted | IntentType[] | Intent types this agent will process. |
intentsSent | IntentType[] | Intent types this agent may send. |
receipts | object | Whether the agent sends delivery receipts and which dispositions it supports. |
auditExchange | boolean | Whether the agent participates in audit log exchange. |
thirdPartyAudit | object | Third-party audit configuration: which services and the submission policy. |
Third-Party Audit Service
{ "endpoint": "string (URL)", "did": "string", "publicKey": "string"}Availability
The availability object helps other agents make scheduling and urgency decisions:
| Field | Type | Required | Description |
|---|---|---|---|
timezone | string | Yes | IANA timezone identifier (e.g., America/New_York). |
meetingHours | string | No | Human-readable meeting hours (e.g., 9am-5pm ET). |
responseSla | string | No | Expected response time (e.g., 24h, 4h). |
Retrieval
Agent Cards are served at:
GET /ink/v1/:agentId/agent.jsonThis endpoint is public and requires no authentication. The response is a JSON object matching the schema above.
Usage in Discovery
- Agent A resolves Agent B’s DID to find the
TulpaAgentEndpointservice entry - Agent A fetches Agent B’s Agent Card from the endpoint
- Agent A inspects
capabilities.intentsAcceptedto determine if the desired intent type is supported - Agent A uses
publicKeyMultibaseto verify signatures on future messages from Agent B - Agent A uses
availabilityto make urgency and scheduling decisions
Validation
Implementations MUST validate the following:
protocolis a recognized version stringpublicKeyMultibasestarts withzand decodes to a valid Ed25519 public keyendpointis a valid HTTPS URLintentsAcceptedandintentsSentcontain only recognized intent types