TypeScript SDK

The official AgentPhone TypeScript library provides convenient, typed access to the AgentPhone API from any JavaScript or TypeScript project.

npm

Installation

npm install agentphone

Quick start

import { AgentPhoneClient } from "agentphone";
const client = new AgentPhoneClient({ token: "YOUR_API_KEY" });
// Create an agent
const agent = await client.agents.createAgent({ name: "Support Bot" });
// Buy a number and attach it
const number = await client.numbers.createNumber();
await client.agents.attachNumberToAgent({
agent_id: agent.id,
numberId: number.id,
});
// Make a call
await client.calls.createOutboundCall({
agentId: agent.id,
toNumber: "+15559876543",
initialGreeting: "Hi, this is Support Bot!",
});

Request and response types

The SDK exports all request and response types under the AgentPhone namespace:

import { AgentPhone } from "agentphone";
const request: AgentPhone.CreateAgentRequest = {
name: "Sales Agent",
voiceMode: "hosted",
systemPrompt: "You are a helpful sales assistant.",
};

Resources

Agents

// List all agents
const agents = await client.agents.listAgents({ limit: 20, offset: 0 });
// Create an agent
const agent = await client.agents.createAgent({
name: "Support Bot",
description: "Handles customer inquiries",
voiceMode: "hosted",
systemPrompt: "You are a helpful support agent.",
beginMessage: "Hello! How can I help you?",
});
// Get agent details
const agent = await client.agents.getAgent({ agent_id: "agt_abc123" });
// Update an agent
await client.agents.updateAgent({
agent_id: "agt_abc123",
name: "Updated Bot",
systemPrompt: "New prompt",
});
// Delete an agent
await client.agents.deleteAgent({ agent_id: "agt_abc123" });
// Attach a number to an agent
await client.agents.attachNumberToAgent({
agent_id: "agt_abc123",
numberId: "num_xyz789",
});
// List conversations for an agent
const convos = await client.agents.listAgentConversations({
agent_id: "agt_abc123",
});
// List calls for an agent
const calls = await client.agents.listAgentCalls({
agent_id: "agt_abc123",
});

Numbers

// List numbers
const numbers = await client.numbers.listNumbers({ limit: 20 });
// Provision a new number
const number = await client.numbers.createNumber();
// Get messages for a number
const messages = await client.numbers.getMessages({
number_id: "num_xyz789",
limit: 50,
before: "2024-01-01T00:00:00Z", // cursor-based pagination
});
// Release a number (irreversible)
await client.numbers.deleteNumber({ number_id: "num_xyz789" });

Conversations

// List all conversations
const convos = await client.conversations.listConversations({ limit: 20 });
// Get a conversation with messages
const convo = await client.conversations.getConversation({
conversation_id: "conv_abc123",
message_limit: 50,
});
// Update conversation metadata
await client.conversations.updateConversation({
conversation_id: "conv_abc123",
metadata: { customerName: "Jane Doe", orderId: "ORD-12345" },
});
// Get paginated messages
const messages = await client.conversations.getConversationMessages({
conversation_id: "conv_abc123",
limit: 50,
before: "2024-01-01T00:00:00Z", // cursor-based pagination
});

Calls

// List all calls
const calls = await client.calls.listCalls({ limit: 20 });
// Get a call with transcript
const call = await client.calls.getCall({ call_id: "call_abc123" });
// Make an outbound call
await client.calls.createOutboundCall({
agentId: "agt_abc123",
toNumber: "+15559876543",
initialGreeting: "Hello!",
systemPrompt: "You are a support agent helping with order inquiries.",
});
// List calls for a specific number
const calls = await client.calls.listCallsForNumber({
number_id: "num_xyz789",
});

Webhooks

// Get webhook config
const webhook = await client.webhooks.getWebhook();
// Create or update webhook
const result = await client.webhooks.createOrUpdateWebhook({
url: "https://your-server.com/webhook",
contextLimit: 10,
});
console.log(result.secret); // save this!
// View delivery history
const deliveries = await client.webhooks.listDeliveries({ limit: 50 });
// Test webhook
await client.webhooks.testWebhook();
// Delete webhook
await client.webhooks.deleteWebhook();

Usage

// Get usage stats
const usage = await client.usage.getUsage();
console.log(usage.numbers.remaining); // remaining phone numbers
console.log(usage.stats.messagesLast24h); // messages in last 24h

Error handling

import { AgentPhoneError } from "agentphone";
try {
await client.agents.createAgent({ name: "Bot" });
} catch (err) {
if (err instanceof AgentPhoneError) {
console.log(err.statusCode); // e.g. 422
console.log(err.message);
console.log(err.body);
console.log(err.rawResponse);
}
}

Advanced

Retries

The SDK automatically retries on 408, 429, and 5xx errors with exponential backoff (default: 2 retries).

await client.agents.listAgents({}, { maxRetries: 0 }); // disable retries

Timeouts

Default timeout is 60 seconds.

await client.agents.listAgents({}, { timeoutInSeconds: 30 });

Abort requests

const controller = new AbortController();
const response = client.agents.listAgents({}, {
abortSignal: controller.signal,
});
controller.abort();

Raw response access

const { data, rawResponse } = await client.agents
.listAgents()
.withRawResponse();
console.log(rawResponse.headers);

Logging

import { AgentPhoneClient, logging } from "agentphone";
const client = new AgentPhoneClient({
token: "YOUR_API_KEY",
logging: {
level: logging.LogLevel.Debug,
logger: new logging.ConsoleLogger(),
silent: false, // defaults to true
},
});

Runtime compatibility

The SDK works in Node.js 18+, Vercel, Cloudflare Workers, Deno 1.25+, Bun 1.0+, and React Native.