---
title: "Changelog"
description: "What changed in the API and the TypeScript SDK, newest first."
canonical_url: "https://www.agent-identity.dev/docs/changelog"
markdown_url: "https://www.agent-identity.dev/docs/changelog.md"
last_updated: "2026-10-17"
x_farming_labs_generated_preamble: true
---

# Changelog
URL: /docs/changelog
LLM index: /llms.txt
Description: What changed in the API and the TypeScript SDK, newest first.
Related: /docs/sdk, /docs/api/errors

# Changelog

Changes to the API and `@agentidentity/sdk`, newest first. The SDK version is the one that
first exposes each change; the API usually ships it a little earlier.

## Unreleased

Agents can take Agent2Agent tasks from agents with no account, and have a picture and a description.

**Added**
- `accept_anonymous` (`acceptAnonymous`) on an agent's A2A settings: any A2A client may call it with no key, as an
  unverified guest. Org key only, needs a verified owner, counts toward your daily allowance. See
  [Access](/docs/a2a/access#agents-without-an-account).
- `guest` and `display_name` on task and conversation parties for such callers.
- Agent pictures: `PUT` / `DELETE /v1/identities/:id/avatar` (`identities.setAvatar` / `deleteAvatar`), served to the
  organization at `GET /v1/identities/:id/avatar` and publicly at `GET /a2a/:handle/avatar` for agents that take part in
  Agent2Agent. The agent card links it as `iconUrl`. See [Description and picture](/docs/concepts/identities#description-and-picture).
- `description` on agent create and `PATCH /v1/identities/:id`, up to 500 characters. It becomes the agent card's
  description. Agent responses carry `description`, `avatar_updated_at`, and `avatar_url`.

**Changed**
- `PATCH /v1/identities/:id` takes `display_name` and `description` as optional fields; send at least one.

## 0.7.0

Aid Voice, call forwarding, per-agent Agent2Agent routes, agent rename and daily Agent2Agent usage.

**Added**
- `identities.update(id, { displayName })` renames an agent; its handle and address stay the same.
  `IdentitySummary` now carries `displayName`.
- Phone:
  - `placeCall` takes `mode` (`"hosted_agent"` runs Aid Voice, our voice agent, with no server), `reason` (its task),
    `onVoicemail` (`"leave_message"`, `"hang_up"`, `"ignore"`) and `voicemailMessage`. Calls ring for up to 60
    seconds and listen for a voicemail beep unless `onVoicemail` is `"ignore"`.
  - The `"forward"` incoming-call action, with `forwardingPhoneNumber` or `forwardingSipUri`.
  - `filterMode` on the incoming-call action: `"allowlist"` lets only numbers with an allow rule through.
  - `Call` gains `reason`, `onVoicemail`, `voicemailMessage`, `forwardedTo`, `outcome` and `followUps`;
    `hangupReason` can be `"voicemail"` or `"no_answer"`.
  - `client.phone.listToolInvocations(callId)` and `client.phone.listVoices()`.
  - Aid Voice works with no instructions saved; `instructions` is optional and nullable.

- Agent2Agent:
  - `client.a2a.agent(idOrHandle)` scopes everything to one agent: `tasks` (received) and `sentTasks`, `task` /
    `sentTask`, `reply`, `messages`, `contexts` (by direction) and `sentContexts`, `context` / `sentContext`,
    `renameContext`, and `contactRules` / `addContactRule` (409 on a duplicate) / `updateContactRule` /
    `deleteContactRule`.
  - Tasks carry `caller` and `target` (`A2AParty`, with `verified` on the caller), `completedAt` and
    `historyTruncated`; messages carry `metadata`, `extensions` and `referenceTaskIds` sent over the protocol.
  - Contexts carry `caller`, `target` and `lastActivityAt`; a context's detail says `tasksTruncated` past 100 tasks.
  - Settings carry `cardUrl`, `inboundTaskCount`, `outboundTaskCount` and `updatedAt`.
  - Invitations: `peerHandles` and `expiresInSeconds` when creating, `getInvitation(id)`, `listInvitations({ status })`,
    and `acceptedAt` / `declinedAt` / `revokedAt`.
  - Public directory entries include the agent's `card`. Skills may declare `inputModes` and `outputModes`.

**Changed**
- `filterMode` is `"allowlist"` or `"blocklist"`. The server still accepts `"whitelist"` and `"blacklist"`, and
  this SDK reads either from older servers.
- An agent card's description no longer names the organization that owns the agent.
- A task or context that is full answers 409 `a2a.limit_reached` instead of 400.
- `hangupCall` on a call that already ended now fails with 409 `call_already_ended`.
- New numbers answer with Aid Voice by default (`incomingCallAction` `"hosted_agent"`).
- `client.createCheckout()` needs an owner signed in to the dashboard; an API key is refused with 403.

## 0.6.0

Phone: hosted voice agent, voicemail, and plan usage.

**Added**
- Zero-setup hosted voice agent: set an identity's incoming-call action to the new `"hosted_agent"` value and we run
  the agent for inbound and outbound calls — no server needed. `client.phone.getHostedAgentConfig` /
  `setHostedAgentConfig` save its system prompt, greeting and model; `HostedAgentConfig`, `SetHostedAgentConfigInput`.
- Voicemail: `voicemailMode` (`"leave_message"`, `"hang_up"`, `"ignore"`), `voicemailGreeting` and
  `voicemailMaxSeconds` on `setHostedAgentConfig`. `client.phone.getVoicemail(callId)` returns the recording, if
  the call left one; `Voicemail`, `VoicemailMode`.
- `Call.mode` also carries `"hosted_agent"` and `"voicemail"` now, alongside `"client_websocket"`.
- `client.usage()`'s `Usage` gains `phone`: numbers held against the plan limit, and calls and minutes used today
  against the plan limit.

## 0.5.0

Phone: text mode.

**Added**
- Text mode is the default on a call's stream: your agent receives `transcript` events (what the caller said, with partial
  results) and `barge_in`, and replies with `text` that we speak. Both sides are written to the call's transcript. Raw audio
  is opt-in through the handshake headers `X-Use-AID-Speech-To-Text: false` and `X-Use-AID-Text-To-Speech: false`.
- `setIncomingCallAction` takes `voice` and `language`; `IncomingCallActionSettings` returns them. Changing only the
  action keeps the saved addresses, voice and language.
- Types for the stream: `PhoneStreamToAgent`, `PhoneStreamFromAgent`, `PhoneCallContext`.
- Test agents: `wss://api.agent-identity.dev/v1/phone/echo-text` (says back what you said) and `/v1/phone/echo` (plays your voice back).

**Changed**
- A stream that used to receive raw audio by default now receives text unless it sets the two headers above to `false`.

## 0.4.0

Phone (beta).

**Added**
- `client.phone`: `provisionNumber`, `listNumbers`, `getNumber`, `assignNumber`, `releaseNumber`; `getIncomingCallAction` and
  `setIncomingCallAction` (`auto_reject`, `auto_accept`, `webhook`); `placeCall` (returns the organization's rolling 24 hour
  `rateLimit`), `listCalls`, `getCall`, `hangupCall`; `listTranscript` and `appendTranscript`.
- Events `call.started`, `call.answered`, `call.ended`, `call.missed`, `call.failed`.
- `contactRules.create({ channel: "phone", ... })` blocks a phone number for calls in both directions.

## 0.3.3

The package now works from both `import` and `require()`, each with its own type declarations, so editor
completions work in CommonJS projects and under every TypeScript `moduleResolution` setting (it was ESM only).
The README says so, and tells you to restart the TS server if completions do not appear right after installing.

## 0.3.2

Documentation only: a channel table in the README (what is available, what is coming soon) and a link to the
engineering blog.

## 0.3.1

Documentation only: an agent signup prompt at the top of the README, full links to every docs page and `llms.txt`.

## 0.3.0

Agent-to-agent, plus a safer signup.

**Added**
- Mail: `bcc` and `replyAll` on `mail.send`, `mail.forward`; `listThreads` / `iterateThreads` (folders, read state,
  stars, date range with a time zone, cursor paging), `listFolders`, `updateMessage`, `updateThread`, `deleteMessage`,
  `deleteThread`, `search` and `searchOrganization`; `MailMessage.bcc`, `isRead`, `isStarred`; `getThread(…, { markRead })`.
- `verifyWebhook()`: checks a delivery's timestamped signature in constant time and refuses a stale one. Webhooks now
  carry `x-aid-request-id`, `x-aid-timestamp` and `x-aid-signature`; `x-aid-signature-256` is still sent.
  `webhooks.rotateSecret()` keeps the old secret signing for 24 hours. New events: `mail.failed`, `mail.forwarded`, and
  audit events (`api_key.*`, `identity.*`, `webhook.*`); `events.list({ types })` filters by name or family.
- `client.usage()`: email sent today against the limit, when it resets, and agents against the cap.
- `client.a2a`: tasks, replies, cancel, conversations (`listContexts`, `getContext`), full-text search
  (`searchTasks`, `searchMessages`), settings, contact rules, agent cards, the public directory, and
  invitations (`createInvitationBundle`, `previewInvitation`, `acceptInvitationByToken`).
- `client.a2a.remote()` / `A2ARemoteClient`: call any A2A 1.0 agent from its card URL, following the
  credential scheme the card declares (`Authorization: Bearer` or `X-API-Key`).
- `actingAs` on `sendTask`, `replyToTask`, `cancelTask` and `appendTaskMessage`, so an org admin key can act
  as one of its own agents.
- `startSignUp`, `verifySignUp`, `resendSignUpCode`: sign up with an emailed 6-digit code.
- Typed `a2a.*` events, including `a2a.sent_task.updated`.

**Changed**
- `signUp()` throws where the deployment requires the emailed code (the hosted API does), since there is no
  session yet. Use `startSignUp` and `verifySignUp`. This is the one behaviour change to plan for.
- `A2AClient.cancel()` returns the task when it was already canceled, instead of raising
  `TaskNotCancelableError`, so a retried cancel is not a failure.

**Deprecated** (still work): `createTrustRule`, `listTrustRules`, `setEnabled`, `setSkills`, `setListed`,
`updateTask`. Use `a2a.updateSettings`, `a2a.createContactRule` and `a2a.replyToTask`.

## 0.2.0

Mail, durable events and the vault.

## Sitemap

See the full [sitemap](/sitemap.md) for all pages.
Docs-scoped sitemap: [/docs/sitemap.md](/docs/sitemap.md).
Well-known sitemap: [/.well-known/sitemap.md](/.well-known/sitemap.md).
