Let Your AI Agent Make Real Phone Calls

Pine Voice lets your agent dial real phone numbers, talk to humans, and return transcripts. Pine Assistant goes further — negotiating bills, cancelling subscriptions, and resolving disputes end-to-end. Drop in via OpenClaw, MCP, or SDK.

Pine AI is an AI assistant that makes real phone calls on your behalf — negotiating bills, cancelling subscriptions, filing complaints, booking appointments, and more. We bring that same voice agent to OpenClaw, Cursor, and any developer tool you use.

Human-like voice
Natural, conversational tone — not a robot reading a script
Hour-long calls
Handles marathon hold times, IVR (Interactive Voice Response) menus, and extended negotiations
93% success rate
Proven across 50,000+ users — saving over $3M on bills

From Quick Calls to Complex Tasks

Pine gives your AI agent real-world capabilities — whether it's a single phone call or an end-to-end task with research, forms, and follow-ups.

📞
Pine Voice

Pine Voice

Make a phone call and get a transcript

You provide a phone number, objective, and instructions. Pine's voice agent makes the call, handles the conversation, and returns a transcript. A single synchronous operation.

  • Human-like voice, hour-long calls
  • IVR navigation and voicemail detection
  • Full transcript with timestamps
OpenClawClawHub SkillMCPCLIPython SDKJS SDKREST API
Voice API Docs
🧠
Pine Assistant

Pine Assistant

Handle digital chores end-to-end

Tell Pine what you need. It researches your account, asks follow-up questions, plans a strategy, makes calls, sends emails, handles identity verification, and follows up. An asynchronous, multi-step workflow.

  • Negotiate bills, cancel subscriptions
  • Resolve disputes, file complaints
  • Multi-step: calls + email + research
OpenClawClawHub SkillMCPCLIPython SDKJS SDK
Assistant API Docs

Integration Compatibility

Integration Pine Voice Pine Assistant
OpenClaw Plugin openclaw-pine-voice openclaw-pine
ClawHub Skill pine-voice pine-assistant
MCP Server pine-voice (remote) pine-mcp-server (local)
Python SDK pine-voice pine-assistant
JS / TS SDK pine-voice pine-assistant
CLI pineai-cli (unified)

Your AI Agent Just Got
Real-World Superpowers

Other AI agents stop at the terminal. Pine picks up the phone, waits on hold for an hour, out-negotiates the retention agent, and resolves your problem end to end — while you keep coding.

$3M+
saved for users
93%
success rate
0
humans in the loop
🎧

Talks Like a Human

Natural, conversational voice that holds its own with real customer service reps. Not a script reader — Pine adapts, responds to follow-ups, and stays on point for up to an hour.

Waits So You Don’t

Hour-long hold times, IVR phone trees, transfers between departments — Pine handles all of it. You get a notification when it’s done.

🤖

Zero Humans in the Loop

No Mechanical Turk behind the curtain. Pine is fully autonomous from dial to hang-up — purpose-trained on customer service scenarios across 50,000+ users.

Pine Voice

You provide a number, objective, and context. Pine dials, handles the conversation, and returns a transcript.

You do: research & strategy
Pine does: call, hold, IVR, conversation
Pine Assistant

You say “negotiate my Comcast bill.” Pine researches, strategizes, calls, negotiates, and reports back.

You do: give the goal
Pine does: research, strategy, call, negotiation, follow-up

OpenClaw & ClawHub

Two OpenClaw plugins for deep runtime integration, plus two ClawHub skills for lightweight agent access.

Prerequisite: Pine AI Pro account

You need a Pine AI account with an active Pro subscription. The Pro plan includes monthly credits for voice calls and tasks.

Don’t have an account yet? Sign up at 19pine.ai and upgrade to Pro.

Pine Voice

openclaw-pine-voice

Adds voice call tools to your agent. Your agent provides a phone number and instructions; Pine's voice agent makes the call and returns a transcript.

Install

bash
openclaw plugins install openclaw-pine-voice
openclaw gateway restart

Authenticate

Ask your OpenClaw agent to set up authentication:

prompt
"Set up Pine Voice authentication"

The agent walks you through email verification, saves credentials, and automatically adds the voice tools to your config. Then restart the gateway:

bash
openclaw gateway restart

Skipped auth? No problem — the plugin still loads without a token. The first time your agent tries to make a call, it will detect the missing token and walk you through the email verification flow automatically.

Model requirements

Pine Voice requires models with thinking/reasoning capabilities. Models without thinking may be too slow or cause context issues.

Recommended: Claude Sonnet / Opus 4.5+, GPT-5.2+, Gemini 3 Pro

Not recommended: Gemini 3 Flash, or any model without thinking capabilities

Troubleshooting: Unrecognized key error

If you see Unrecognized key: "allow" after editing your config manually, you likely placed "allow" inside the plugin entry instead of at the root level. Here’s the difference:

✗ Wrong — nested under plugin
{
  "plugins": {
    "entries": {
      "openclaw-pine-voice": {
        "allow": ["..."]
      }
    }
  }
}
✓ Correct — root level
{
  "tools": {
    "allow": [
      "pine_voice_call_and_wait",
      "pine_voice_call",
      "pine_voice_call_status"
    ]
  }
}

Run openclaw doctor --fix to auto-repair your config. Note: if you use the auth flow (recommended), tools.allow is configured automatically — no manual editing needed.

Manual CLI setup (alternative)
bash
# Step 1: Request a verification code (sent to your email)
openclaw pine-voice auth setup --email [email protected]

# Step 2: Check your email, then verify
openclaw pine-voice auth verify --email [email protected] --request-token <TOKEN> --code 1234

Then restart the gateway: openclaw gateway restart

English only. The voice agent can only speak English. Calls can be placed to the US, Canada, Puerto Rico (+1), UK (+44), Australia (+61), New Zealand (+64), Singapore (+65), Ireland (+353), and Hong Kong (+852).

Pine Voice vs built-in voice

Built-in voice_callPine pine_voice_call
Voice qualityDepends on your TTS setupHuman-like, natural tone
Complex callsBasic scripted flowsPurpose-trained for hour-long negotiations
Webhook URL?Yes (ngrok/Tailscale)No
Twilio/Telnyx?YesNo
IVR navigationNoneAutomatic
Best forSimple voice botsNegotiations, interviews, customer service

ClawHub Skill

pine-voice clawhub.ai →

Give your agent a real phone — it dials, waits on hold, negotiates your bills, and returns a full transcript. Bundled Node.js scripts, zero config, no plugin needed.

Higher LLM token cost. The skill polls for call results via curl, consuming LLM tokens while waiting. The openclaw-pine-voice plugin’s pine_voice_call_and_wait blocks at the runtime level with zero LLM cost during the wait. For frequent use, the plugin is more cost-efficient.

Install

bash
clawhub install pine-voice

Authenticate

Just ask your agent — it handles the entire auth flow conversationally:

prompt
"Set up Pine Voice authentication"

The agent will ask for your Pine AI email, send a verification code, and save credentials to ~/.pine-voice/credentials.json. No env vars, no manual token copying.

Make a call

Once authenticated, just ask:

prompt
"Call +14155559876 and make a reservation for 4 at 7pm tonight"

Pine Assistant

openclaw-pine

Registers Pine Assistant as a channel in OpenClaw. The plugin maintains a persistent Socket.IO connection to Pine, receives events (forms, questions, call updates, state changes), and routes them to the agent. The agent’s replies are automatically delivered to the user’s messaging channel (Telegram, WhatsApp, etc.) via channel tracking. Multi-step tasks with forms, follow-ups, and live call progress.

Install

bash
openclaw plugins install openclaw-pine
openclaw gateway restart

Authentication

Ask your OpenClaw agent to set up authentication:

prompt
"Set up Pine Assistant authentication"

The agent will walk you through email verification, save credentials automatically, and enable the Pine Assistant channel. Then restart the gateway: openclaw gateway restart

Skipped auth? No problem — the plugin still loads without a token. The first time your agent tries to create a session, it will detect the missing credentials and walk you through the email verification flow.

Manual CLI setup (alternative)
bash
# Step 1: Request a verification code (sent to your email)
openclaw pine auth setup --email [email protected]

# Step 2: Check your email, then verify
openclaw pine auth verify --email [email protected] --request-token <TOKEN> --code 1234

Then restart the gateway: openclaw gateway restart


ClawHub Skill

pine-assistant clawhub.ai →

Handle customer service, bills, reservations, and more from your terminal. The skill uses the pine CLI under the hood — no plugin needed, works with any ClawHub-compatible agent.

No automatic follow-ups. The CLI skill cannot receive callbacks or push notifications from Pine. It cannot auto-receive updates, form requests, or three-party call alerts. You (or your agent) must proactively check progress by polling pine sessions get. Time-sensitive events like OTPs and call joins may be missed.

Need real-time events? Use the openclaw-pine plugin instead — it maintains a persistent Socket.IO connection, receives events instantly, and routes them to the agent automatically.

Install

bash
clawhub install pine-assistant

This auto-installs the pineai-cli package (provides the pine command) as a dependency.

Authenticate

Just ask your agent:

prompt
"Set up Pine Assistant authentication"

The agent runs pine auth request + pine auth verify non-interactively, saving credentials to ~/.pine/config.json.

Use it

Once authenticated, just ask:

prompt
"Negotiate my Comcast bill down. I'm paying $120/mo and want $80/mo."

MCP Servers

Use Pine directly from Cursor, Claude Code, Claude Desktop, OpenAI Codex, or any MCP-compatible client. No plugins, no OpenClaw — just add the server config.

Two MCP servers for different workflows

Pine Voice MCP is a remote server — your client connects over HTTP and gets transcripts in real time. Pine Assistant MCP runs locally via pine-mcp-server — the agent creates sessions, sends messages, and polls for updates using a “load conversation” model.

Get your Pine access token

Verify your Pine AI account email to get a token. Used for MCP, SDKs, and CLI.

Get credentials via curl (alternative)

If you prefer the command line, use the Pine AI auth API directly:

bash — Step 1: Request code
curl -X POST https://www.19pine.ai/api/v2/auth/email/request \
  -H "Content-Type: application/json" \
  -d '{"email": "[email protected]"}'

# Response:
# {"status":"success","data":{"request_token":"abc123..."}}
bash — Step 2: Verify code
curl -X POST https://www.19pine.ai/api/v2/auth/email/verify \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","code":"1234","request_token":"REQUEST_TOKEN_FROM_STEP_1"}'

# Response:
# {"data":{"id":"YOUR_USER_ID","access_token":"YOUR_ACCESS_TOKEN",...}}

Save the id as your User ID and the access_token as your Access Token. Use them in the MCP config below or as environment variables (PINE_USER_ID, PINE_ACCESS_TOKEN).

Pine Voice

Pine Voice MCP (remote server)

A hosted MCP server for direct phone calls. Your client connects over HTTP — provide a phone number and instructions, get a transcript back. No local install required.

You’ll need your Access Token and User ID. Get your credentials ↑

Configure your MCP client

Create or edit .cursor/mcp.json in your project root:

.cursor/mcp.json
{
  "mcpServers": {
    "pine-voice": {
      "type": "streamablehttp",
      "url": "https://agent3-api-gateway-staging.19pine.ai/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_TOKEN_HERE",
        "X-Pine-User-Id": "YOUR_USER_ID"
      }
    }
  }
}

Add via CLI:

bash
claude mcp add pine-voice \
  --transport http \
  --url https://agent3-api-gateway-staging.19pine.ai/mcp \
  --header "Authorization: Bearer YOUR_TOKEN_HERE" \
  --header "X-Pine-User-Id: YOUR_USER_ID"

Or create a .mcp.json file in your project root:

.mcp.json
{
  "mcpServers": {
    "pine-voice": {
      "type": "http",
      "url": "https://agent3-api-gateway-staging.19pine.ai/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_TOKEN_HERE",
        "X-Pine-User-Id": "YOUR_USER_ID"
      }
    }
  }
}

Settings → Developer → Edit Config, then add:

claude_desktop_config.json
{
  "mcpServers": {
    "pine-voice": {
      "type": "streamablehttp",
      "url": "https://agent3-api-gateway-staging.19pine.ai/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_TOKEN_HERE",
        "X-Pine-User-Id": "YOUR_USER_ID"
      }
    }
  }
}

Add to ~/.codex/config.toml (or project-scoped .codex/config.toml):

config.toml
# Set env vars: PINE_ACCESS_TOKEN, PINE_USER_ID

[mcp_servers.pine-voice]
url = "https://agent3-api-gateway-staging.19pine.ai/mcp"
bearer_token_env_var = "PINE_ACCESS_TOKEN"

[mcp_servers.pine-voice.env_http_headers]
X-Pine-User-Id = "PINE_USER_ID"

Or add via CLI:

bash
codex mcp add pine-voice \
  --url https://agent3-api-gateway-staging.19pine.ai/mcp

Then edit ~/.codex/config.toml to add the bearer_token_env_var and env_http_headers fields.

Try it out

Start with a test call to yourself to verify everything works:

prompt
"Call my phone at +1XXXXXXXXXX. Tell me that Pine Voice is set up and working, and ask if I have any questions before hanging up."

Replace with your real number. You'll receive a real call from Pine's voice agent.

Gather all info first. The voice agent cannot ask you for more info during the call. Include all details the callee may need — authentication, verification, payment details, negotiation targets, and constraints.

What happens after you ask

1

Tool invoked

Agent calls pine_voice_call

2

Call in progress

Pine dials, navigates IVR, handles conversation

3

Wait for result

SSE keeps session open until call completes

4

Transcript

Full transcript, outcome, and billing info


Pine Assistant

Pine Assistant MCP (local server)

A local MCP server that exposes the full Pine Assistant workflow — negotiate bills, cancel subscriptions, resolve disputes, and more. The agent creates sessions, sends messages, handles forms, and polls for updates using a “load conversation” model.

Built on the pine-assistant Python SDK. Published as pine-mcp-server on PyPI.

Install

bash
pip install pine-mcp-server

Or run directly with uvx (no install needed): uvx pine-mcp-server

You’ll need your Access Token and User ID. Get your credentials ↑

Configure your MCP client

Add to .cursor/mcp.json in your project root:

.cursor/mcp.json
{
  "mcpServers": {
    "pine-assistant": {
      "command": "uvx",
      "args": ["pine-mcp-server"],
      "env": {
        "PINE_ACCESS_TOKEN": "YOUR_TOKEN_HERE",
        "PINE_USER_ID": "YOUR_USER_ID"
      }
    }
  }
}

If you used pip install, replace "command": "uvx" with "command": "pine-mcp-server" and remove the "args" field.

Add via CLI:

bash
claude mcp add pine-assistant \
  --command uvx \
  --args pine-mcp-server \
  --env PINE_ACCESS_TOKEN=YOUR_TOKEN_HERE \
  --env PINE_USER_ID=YOUR_USER_ID

Settings → Developer → Edit Config, then add:

claude_desktop_config.json
{
  "mcpServers": {
    "pine-assistant": {
      "command": "uvx",
      "args": ["pine-mcp-server"],
      "env": {
        "PINE_ACCESS_TOKEN": "YOUR_TOKEN_HERE",
        "PINE_USER_ID": "YOUR_USER_ID"
      }
    }
  }
}

Add to ~/.codex/config.toml (or project-scoped .codex/config.toml):

config.toml
[mcp_servers.pine-assistant]
command = "uvx"
args = ["pine-mcp-server"]

[mcp_servers.pine-assistant.env]
PINE_ACCESS_TOKEN = "YOUR_TOKEN_HERE"
PINE_USER_ID = "YOUR_USER_ID"

Or add via CLI:

bash
codex mcp add pine-assistant \
  --command uvx \
  --args pine-mcp-server

Then edit ~/.codex/config.toml to add the env section with your credentials. If you used pip install, replace "uvx" with "pine-mcp-server" and remove the args field.

Credentials optional at startup. If you skip the environment variables, the server still starts. Your agent can authenticate at runtime using the built-in pine_auth_request_code and pine_auth_verify_code tools.

How it works

The server follows a “load conversation” model — like refreshing a browser page:

1

Create session

pine_session_create

2

Send message

pine_send_message

3

Check history

pine_get_history

4

Start task

pine_task_start

5

Check results

pine_get_history

No real-time streaming. The agent periodically loads conversation history to see updates.

Try it out

Ask your agent to handle a task:

prompt
"Use Pine AI to negotiate my Comcast internet bill. My account number is 12345."

The agent will create a session, send your request, and check back for updates.

Available tools (20 tools)
CategoryToolDescription
Authpine_auth_request_codeRequest a verification code via email
pine_auth_verify_codeVerify the code and obtain credentials
Sessionspine_session_createCreate a new Pine session
pine_session_listList sessions with optional filters
pine_session_getGet details about a session
pine_session_deleteDelete a session
pine_session_urlGet the web URL to view a session
Conversationpine_get_historyLoad conversation history (the core “refresh” tool)
pine_send_messageSend a text message to Pine
pine_send_form_responseSubmit a form that Pine sent
pine_send_auth_confirmationSubmit an OTP / verification code
pine_send_location_responseSubmit location coordinates
pine_send_location_selectionSubmit a location selection
Taskspine_task_startStart task execution
pine_task_stopStop a running task
Attachmentspine_upload_attachmentUpload a local file (bill, screenshot, etc.)
pine_delete_attachmentDelete an uploaded attachment

SDKs & CLI

Add Pine to any application. Each mode uses a separate library.

Pine Voice SDKs — pine-voice Python JS

Python

pip install pine-voice
from pine_voice import PineVoice

client = PineVoice()
result = client.calls.create_and_wait(
    to="+14155551234",
    name="Dr. Smith",
    objective="Schedule a cleaning",
)
print(result.summary)

Node.js / TypeScript

npm install pine-voice
import { PineVoice } from "pine-voice";

const client = new PineVoice();
const result = await client.calls.createAndWait({
  to: "+14155551234",
  name: "Dr. Smith",
  objective: "Schedule a cleaning",
});
console.log(result.summary);
Get your access token via SDK (recommended)

Both SDKs include built-in authentication. Run once to get your credentials:

get_token.py
from pine_voice import PineVoice

email = input("Pine AI account email: ")
token = PineVoice.auth.request_code(email)
print("Check your email for a verification code.")

code = input("Verification code: ")
creds = PineVoice.auth.verify_code(email, token, code)

print(f"PINE_ACCESS_TOKEN={creds.access_token}")
print(f"PINE_USER_ID={creds.user_id}")
get-token.mjs
import { PineVoice } from "pine-voice";
import { createInterface } from "readline/promises";

const rl = createInterface({ input: process.stdin, output: process.stdout });
const email = await rl.question("Pine AI account email: ");
const { requestToken } = await PineVoice.auth.requestCode(email);
console.log("Check your email for a verification code.");

const code = await rl.question("Verification code: ");
const creds = await PineVoice.auth.verifyCode(email, requestToken, code);
rl.close();

console.log(`PINE_ACCESS_TOKEN=${creds.accessToken}`);
console.log(`PINE_USER_ID=${creds.userId}`);

Save as environment variables, then create the client with no arguments: PineVoice() / new PineVoice()

Pine Voice API Reference & SDK Docs →

Pine Assistant SDKs — pine-assistant Python JS

Python

pip install pine-assistant
from pine_assistant import AsyncPineAI

client = AsyncPineAI(access_token="...", user_id="...")
await client.connect()
session = await client.sessions.create()
async for event in client.chat(session["id"], "Negotiate my bill"):
    print(event)

Node.js / TypeScript

npm install pine-assistant
import { PineAI } from "pine-assistant";

const client = new PineAI({ accessToken: "...", userId: "..." });
await client.connect();
const session = await client.sessions.create();
for await (const ev of client.chat(session.id, "Negotiate my bill"))
  console.log(ev);
Pine Assistant API Reference →

Unified CLIpineai-cli GitHub PyPI

One pine command for both Voice calls and Assistant tasks. Python 3.10+.

bash
pip install pineai-cli
bash
# Authenticate
pine auth login                              # Interactive email verification
pine auth request --email [email protected]    # Non-interactive (for agents)

# Assistant sessions
pine sessions list --json                    # List all sessions
pine sessions create --json                  # Create a new session
pine sessions get <session-id> --json        # Get session details & history
pine send "Negotiate my bill" -s <id> --json # Send message to session
pine send "Cancel Netflix" --new --json      # Create session & send
pine send "checking in" -s <id> --no-wait   # Fire-and-forget
pine chat                                    # Interactive REPL
pine task start <session-id>                 # Start task execution

# Voice calls
pine voice call --to "+14155551234" --name "Dr. Smith" \
  --context "Dentist office" --objective "Schedule a cleaning"
pine voice status <call-id>

Voice Call Pricing

Pine Voice calls use your Pine AI credit balance. Pine AI Pro subscription required.

Base Cost
50
credits per call
Per Minute
+20
credits per minute

5 concurrent calls max per user. Credit sources: subscription credits, purchased add-ons, and other grants. Full pricing details →


Call Policy

Every call is reviewed for safety before dialing. Calls that violate these policies are automatically rejected.

Allowed

  • Scheduling meetings and appointments
  • Making reservations
  • Negotiating bills with clear targets
  • Customer service inquiries with verification info
  • Business inquiries (pricing, availability)
  • Account actions (cancel, update, confirm)

Not Allowed

  • Emergency services (911, 112, 999)
  • Government agencies and military facilities
  • Premium-rate or toll numbers
  • Harassment, threats, or impersonation
  • Countries outside US, CA, UK, AU, NZ, IE
  • Vague objectives ("just call them")

Data Security & Privacy: The Foundation of Pine

Handling sensitive tasks like bills, taxes, and healthcare requires absolute trust. Pine is built with bank-level security, transparent privacy controls, and a simple promise: we never sell your data.

🔒

Bank-Level Encryption

All data is encrypted in transit and at rest using industry-standard protocols (128-bit or higher). Sensitive data is processed ephemerally in a cryptographic vault and erased when the job is done — it’s never stored.

🚫

Independently Verified

Independent security experts regularly test Pine’s systems and identify potential vulnerabilities. Practices are aligned with leading frameworks including SOC 2, GDPR, and CCPA.

🛡

No Human Access

Pine is fully autonomous — no human operators listen to calls or view your data. A dedicated security team continuously monitors systems and will notify you immediately if unusual activity is detected.

What happens on every task

Credentials encrypted before leaving your device
Secure connection to the service provider
No human operators in the loop
Session wiped after task completion
Data used only for your task — never sold or shared
Technical details for security teams
  • Encryption: AES-256-GCM at rest, TLS 1.3 in transit (128-bit or higher)
  • Architecture: Session-scoped key derivation — sensitive data processed ephemerally in a cryptographic vault, erased when done
  • Compliance: SOC 2 Type II, GDPR, CCPA — with ongoing independent audits
  • Data retention: Call transcripts retained per your account settings; credentials are never persisted beyond the active session
  • Monitoring: Dedicated security team with continuous system monitoring and incident notification