7 days on us. A real phone line for your AI Bot, with 10 minutes of calls. Nothing charged today.See how it works
Docs

Connect a line to your assistant.

What your assistant needs to place calls through your line and read what came back. One page.

Start here

A line is one phone number and one email address (handle@bot.cosvoice.com). It answers calls, places calls, takes texts and mail, and writes up every call: what happened, what was agreed, and the words that were said.

Three ways in, all doing the same things:

  • Connect your assistant at https://cosvoice.com/mcp. Paste one URL.
  • Write code against https://cosvoice.com/api/v1.
  • Get told when something happens: we post to your URL.

Your key is in Settings → Connect. Send it as Authorization: Bearer cv_live_…

Connect your assistant

Which Bot do you use?
  1. Open your Grok Bot's MCP settings and add a server.
  2. Paste the address below.
  3. A CosVoice page opens. Sign in and press Allow.
https://cosvoice.com/mcp
Then check it worked. Send it this
What is my CosVoice number?

There is no key to copy. You can cut a Bot off at any time in Settings, under Connect. More about Grok Bot

Add https://cosvoice.com/mcp to your assistant. It opens a CosVoice page, you sign in and press Allow, and it gets access to your line. Grok Bot, OpenAI dots, Claude, ChatGPT, and Cursor all take a URL. You can cut any of them off in Settings → Connect.

If a connector only accepts a plain URL with no sign-in, use https://cosvoice.com/mcp/k/<key>. That URL is a password: keep it out of shared chats, and make a new key if it leaks.

Then paste the instructions from Settings → Connect into your Bot. They teach it to brief a call the way you would, to wait for the result, and never to tell you something is booked when it isn't.

No line yet? Sign up, make a setup key on the first screen, connect your assistant, and tell it what you want: "Set up my CosVoice line. Call it Lloyd, area code 949, my mobile is 714-555-0123."

Ask for a call

Say what you would tell a person, including what to do when the first answer is no.

POST /api/v1/calls
{
  "to": "+13105550142",
  "callee_name": "Osteria Mozza, host stand",
  "purpose": "Book a table for two this Friday at 7:30 under Graham. If 7:30 is gone, take anything between 7:00 and 8:30. Give this line's number as the callback.",
  "desired_resolution": "A confirmed reservation with a time."
}

Calls take minutes, not seconds. You get an id immediately; ask get_call every twenty seconds or so, or let the call.completed webhook tell you.

What your assistant can do

The same list over MCP and REST.

place_callCall a number and hold the conversation. Returns an id right away.
get_callHow a call went: outcome, notes, transcript.
list_callsRecent calls, newest first.
annotate_callLeave a note on a call.
book_reservationBook a table: venue, party size, time, and what to accept instead.
list_reservationsReservations the line has made.
send_textSend a text from the line's number.
list_messagesTexts to and from the line.
send_emailSend email from the line's address.
list_emails / get_email / forward_emailRead mail that reached the line; send one on.
list_contacts / add_contact / remove_contactWho the line knows and how to treat them.
get_line / get_accountNumber, email, name, minutes left.
get_settings / update_settingsName, voice, greeting, standing instructions, when to answer.
recent_activityEverything since a timestamp. Use it after downtime.
list_historyThe History table as JSON or CSV.
set_webhook / set_bot_pushWhere to send events, and how to wake your Bot.
search_numbers / create_linePick a number and set the line up without the web pages.

REST API

Base https://cosvoice.com/api/v1. JSON in, JSON out, 240 requests a minute per key.

POST /callsPlace a call. Body: to, purpose (up to 1,200 characters), callee_name?, desired_resolution?, max_minutes?
GET /callsRecent calls.
GET /calls/:idOne call with its transcript.
POST /calls/:id/annotationsAdd a note to a call.
POST /reservationsBook a table.
GET /messages · POST /messagesRead texts; send a text.
GET /emails · GET /emails/:id · POST /emails/:id/forwardRead mail; send one on.
GET /contacts · POST /contacts · DELETE /contacts/:phoneManage who the line knows.
GET /line · GET /settings · PATCH /settingsLine details and settings.
GET /activity?since=ISOEverything since a timestamp.
GET /history?format=csvThe History table.
curl https://cosvoice.com/api/v1/calls/CALL_ID \
  -H "Authorization: Bearer cv_live_…"

{ "ok": true, "status": "completed",
  "outcome": "Reserved · Friday 8:15pm · party of 2",
  "summary": "The host offered 7:00 or 8:15. Lloyd took 8:15 and booked it under Graham.",
  "action_items": ["Hold Friday 8:15pm on the calendar"] }

Webhooks

Set a URL in Settings → Connect. We post JSON with X-CosVoice-Event, X-CosVoice-Delivery, X-CosVoice-Timestamp, and X-CosVoice-Signature: v1=<hex>. If your endpoint is down we try again after 1m, 5m, 15m, 1h, and 4h.

call.startedA call connected, in either direction.
call.completedThe call is written up: outcome, notes, transcript.
message.receivedA text reached the line.
email.receivedMail reached the line's address.
owner.instructionYou told the line something from your own number.
line.testYou pressed Send test.

Check the signature before you trust the body:

const expected = "v1=" + crypto
  .createHmac("sha256", WEBHOOK_SECRET)
  .update(req.headers["x-cosvoice-timestamp"] + "." + rawBody)
  .digest("hex");
if (!timingSafeEqual(expected, req.headers["x-cosvoice-signature"])) return 401;

Wake your Bot

Instead of your Bot checking in, CosVoice can start it. Make a routine in your assistant that runs on a webhook, open it, and copy the two values its panel shows: the address it posts to, and the key. Paste them into Settings → Connect → Wake your Bot. We start your Bot when you text the line an instruction, when mail arrives, and when a call is written up.

What we send says what happened in plain English, plus the ids your Bot needs to read the whole thing. Two quick retries, then we stop: waking something late is no use. Any endpoint that takes a bearer token works.

Your own number

Calls and texts from your mobile are treated as instructions for your assistant, not as a stranger getting in touch. The line captures each ask and reads back what it heard.

  • Approved people get a warm welcome and can leave real detail.
  • VIP people are treated as urgent. Use it for family.
  • Blocked numbers get a short, polite wall.
  • Everyone else meets a helpful assistant that never gives out your details.

Replace voicemail

Send the calls you miss on your own mobile to your line, using your carrier's forwarding for busy, unanswered, and unreachable. The line answers as your assistant covering a missed call and takes the whole message, instead of a beep.

  • Verizon: dial *71 + your line's 10 digits. *73 cancels.
  • AT&T and T-Mobile: *61*1<line># (no answer), *67*1<line># (busy), *62*1<line># (unreachable). #61# and friends cancel.
  • Android has the same three under Call forwarding. On iPhone the menu forwards every call, so use the codes above for missed calls only.

Settings → Replace voicemail fills the codes in with your number and tests it in a minute. Forwarded calls use your minutes like any other.

Texting

Texts to your line always arrive, are saved, and show in History. A text from your own mobile counts as an instruction for your assistant.

Texts from the line are limited today. US carriers only deliver business texts from numbers on an approved registration, and ours is in progress, so a reply may be filtered. Two-way texting switches on for every line when it clears. Until then, use a call or email for anything that has to arrive.

STOP, UNSUBSCRIBE, CANCEL, END, and QUIT opt a number out; the line sends one confirmation and nothing more. START comes back. HELP says who we are.

Voice

The line listens while it talks, so callers can interrupt it. You choose from 38 voices in two sets. New voices can be interrupted and sound more natural but take about a second longer to answer. Classic voices are the clearest on a phone line and the quickest to reply. Change it any time in Settings → Voice, or with update_settings.

You can also set the greeting, standing instructions the line always has, how many rings before it answers, up to 20 words to pronounce your way, and the speaking pace. "Hear it" calls your mobile so you can listen.

On outbound calls the line says who it is and who it calls for, and confirms it is an assistant whenever anyone asks.

Minutes

Starter is $29 a month with 100 minutes of calls, Plus $79 with 300, Pro $199 with 1000.

Minutes are time on a call, in or out, rounded up per call. Past your minutes it is $0.25 a minute on every plan. Texts and email don't use minutes. Your month runs from the day you started.

Security

  • Everything is scoped to your line. Nothing crosses lines.
  • What your line hears is sealed to your line. Our staff cannot read it.
  • We keep the written call and the transcript, not the audio.
  • API keys are shown once and stored hashed. Replace one any time.
  • Calls into our phone system are signature-checked, and the voice servers only accept our own carrier's streams.
  • What we send you is signed with your own secret, which you can rotate.
  • Sessions use HttpOnly cookies with a check on every change.