
Company News
Free Business Plan Upgrades for Open Source Maintainers
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.
@keyid/sdk
Advanced tools
Free email addresses and phone numbers for AI agents. No signup. No human needed.
Your agent gets a real email address in 3 lines of code, with optional phone number on demand. Send, receive, reply, search — full email + SMS capabilities with zero registration, zero cost, zero human involvement.
KeyID.ai handles everything: domain management, rotation, reputation monitoring, deliverability, phone pool management. Your agent just generates a keypair and calls provision().
npm install @keyid/sdk
# or
yarn add @keyid/sdk
import { KeyID } from '@keyid/sdk';
const agent = new KeyID();
// Register — get an email address instantly
const { email, agentId } = await agent.provision();
console.log(`Agent email: ${email}`);
// Optionally request a phone number
const { phone } = await agent.requestPhone();
console.log(`Agent phone: ${phone}`);
// Read inbox
const { messages } = await agent.getInbox();
// Send email
await agent.send('user@example.com', 'Hello', 'Message body');
// Reply to a message
await agent.reply(messages[0].id, 'Thanks for your email!');
KeyID uses Ed25519 challenge-response authentication. The SDK handles this automatically:
provision() registers the public key and returns an email address// Option 1: Auto-generate keypair (default)
const agent = new KeyID();
// Option 2: Provide existing keypair
const agent = new KeyID({
keypair: { publicKey: '...hex...', privateKey: '...hex...' }
});
// Option 3: Custom base URL
const agent = new KeyID({ baseUrl: 'https://your-instance.com' });
| Method | Description |
|---|---|
provision() | Register agent, get email |
requestPhone() | Request a phone number (opt-in, authenticated) |
getIdentity() | Full profile (email, phone, avatarUrl, bio, reputation score/tier) |
getAddresses() | List all addresses (current + historical) |
updateIdentity(options) | Update profile (displayName, avatarUrl, bio, websiteUrl, profilePublic) |
getReputation() | Get own reputation score (0-100), tier, factor breakdown |
getPublicProfile(agentId) | Get another agent's public profile (no auth required) |
recover(recoveryToken, newKeypair?) | Rotate keypair using recovery token |
| Method | Description |
|---|---|
getInbox(options?) | Fetch inbox with pagination, filtering, search, channel filter |
getMessage(id) | Get single message detail |
updateMessage(id, options) | Update labels, read/starred status |
getUnreadCount() | Count unread inbound messages |
send(to, subject, body, options?) | Send email (supports HTML, CC/BCC, scheduled) |
reply(messageId, body, options?) | Reply to a message |
replyAll(messageId, body, options?) | Reply-all |
forward(messageId, to, body?) | Forward a message |
| Method | Description |
|---|---|
listThreads(options?) | List conversation threads |
getThread(threadId) | Get thread with all messages |
deleteThread(threadId, permanent?) | Delete thread |
| Method | Description |
|---|---|
createDraft(options) | Create a draft |
getDraft(draftId) | Get draft detail |
updateDraft(draftId, options) | Update draft |
deleteDraft(draftId) | Delete draft |
sendDraft(draftId) | Send a draft |
| Method | Description |
|---|---|
getSignature() | Get email signature |
setSignature(signature) | Set email signature |
getForwarding() | Get forwarding settings |
setForwarding(forwardingAddress) | Configure email forwarding |
getAutoReply() | Get auto-reply/vacation settings |
setAutoReply(options) | Configure auto-reply |
| Method | Description |
|---|---|
listContacts(options?) | List saved contacts |
createContact(options) | Create a contact |
getContact(contactId) | Get contact detail |
updateContact(contactId, options) | Update contact |
deleteContact(contactId) | Delete contact |
| Method | Description |
|---|---|
listWebhooks() | List webhooks |
createWebhook(url, events?, options?) | Create webhook |
getWebhook(webhookId) | Get webhook detail |
updateWebhook(webhookId, options) | Update webhook |
deleteWebhook(webhookId) | Delete webhook |
getWebhookDeliveries(options?) | Delivery history |
| Method | Description |
|---|---|
getLinks(messageId) | Extract links from a message |
getCodes(messageId) | Extract verification codes from a message |
followLink({ messageId?, linkIndex?, url? }) | Follow a verification link, returns final URL and redirects |
| Method | Description |
|---|---|
getPersona() | Get agent persona profile |
createPersona(data?) | Create persona profile |
updatePersona(data) | Update persona profile |
| Method | Description |
|---|---|
addRegistration(data) | Log a service registration |
listRegistrations(options?) | List registrations with optional filters |
getRegistration(id) | Get registration by ID |
updateRegistration(id, data) | Update a registration |
deleteRegistration(id) | Delete a registration |
| Method | Description |
|---|---|
listVault() | List all vault entries (keys + metadata) |
getVaultEntry(key) | Get a vault entry by key |
putVaultEntry(key, value, opts?) | Store a value in the vault |
deleteVaultEntry(key) | Delete a vault entry |
| Method | Description |
|---|---|
search(query, options?) | Search the web via Google |
getSearchUsage() | Today's search usage and quota |
| Method | Description |
|---|---|
storeList(options?) | List stored files |
storeGet(key) | Get file metadata |
storeDownload(key) | Download file content (base64) |
storePut(key, content, options?) | Upload or overwrite a file |
storeDelete(key) | Delete a file |
storeSetPublic(key, isPublic) | Toggle public URL |
getStoreUsage() | Storage usage and quota |
| Method | Description |
|---|---|
addToList(direction, type, entry) | Add to allow/blocklist |
removeFromList(direction, type, entry) | Remove from list |
getList(direction, type) | Get list entries |
getMetrics(options?) | Query usage metrics |
send('to@x.com', 'Sub', 'Body', { scheduledAt: '2025-01-01T10:00:00Z' })getInbox({ search: 'invoice' })updateMessage(id, { isStarred: true })setAutoReply({ enabled: true, body: 'Out of office', endDate: '...' })send('to@x.com', 'Sub', 'text', { html: '<h1>Hello</h1>' })send('to@x.com', 'Sub', 'Body', { attachments: [{ filename, content, contentType }] })getInbox({ channel: 'sms' }) — filter by email or SMSsms.received eventsOne provision() call replaces signing up for all of these:
| Category | Services |
|---|---|
| Email sending | Resend, SendGrid, Mailgun, Postmark, Amazon SES |
| Email accounts | Gmail, Google Workspace, AgentMail, Outlook |
| SMS / Phone | Twilio, Telnyx, Vonage, Plivo |
| Web search | Serper, Tavily, Brave Search, SerpAPI, Google Custom Search |
| File storage | AWS S3, Cloudflare R2, Google Cloud Storage, UploadThing |
| 2FA / TOTP | Google Authenticator, Authy, 1Password |
| Verification | Manual email checking, link clicking, code copying |
For a visual inbox experience during development, install KeyID Agent Inbox — manage agents, monitor inboxes, extract verification codes, and reply to emails directly in VS Code.
MIT
FAQs
KeyID.ai SDK — agent email infrastructure
The npm package @keyid/sdk receives a total of 45 weekly downloads. As such, @keyid/sdk popularity was classified as not popular.
We found that @keyid/sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.

Security News
During a UK cyber test, a Mythos 5 agent used sockpuppets, social engineering, and prompt injection to try to get a maintainer to merge malware.