Vocatech

Developers

Build on what we ship on.

One REST API for calls, recordings, transcripts, texts, faxes and contacts, with a signed webhook for each event. You make the keys yourself in the portal, and the API comes with every seat. It reads and sends, and it never changes your call settings.

In every seat
Start here

Three steps from a new key to today’s calls.

The quickstart in the guide carries the same three steps in curl, Node, Python and PHP, with a small client to keep.

  1. 01

    Make a key

    On your company’s Integrations page in the portal, press Generate. A login that may edit the company sees the button.

  2. 02

    Ask for today’s calls

    One request with the key in its header brings today back, each call with its journey, summary and transcript.

  3. 03

    Get events pushed

    Create a webhook endpoint and choose its events. Each delivery is signed, and your server answers within five seconds.

One request
curl "https://api.vocatech.com/v1/calls?limit=10" \
  -H "Authorization: Bearer $VOCATECH_API_KEY"
The answer, trimmed200 OK
{
  "calls": [{
    "call_id": "8a1f3c2e-5b7d-4e9a-9c1b-2d4e6f8a0b1c",
    "direction": "incoming",
    "status": "answered",
    "remote_name": "Jordan Reyes",
    "remote_number": "7185550142",
    "start_time": "2026-10-23T18:02:11.000Z",
    "duration": 317,
    "journey": [
      { "order": 1, "type": "auto_attendant", "extension_name": "Main Menu" },
      { "order": 2, "type": "user", "extension_name": "Maya Chen",
        "summary": "Jordan asked about the March invoice. Maya sent a corrected copy.",
        "recording_url": "https://api.vocatech.com/v1/media/rec_48213907" }
    ]
  }],
  "meta": { "page": 1, "limit": 10, "total_calls": 38 }
}

Read the quickstart

What you can reach

Twelve areas, every one scoped to your account.

Twenty-eight operations behind one key. Lists page up to 500 records, dates default to today in New York time, and one request covers up to 366 days.

The API reads and sends. It does not change call settings such as forwarding or voicemail. Those live in the portal.

Webhooks

Eleven events, every delivery signed.

Create an endpoint through the API, choose its events, and filter by extension or number. Answer within five seconds and do the work after. A failed delivery is tried five times over about two and a half hours, then listed for seven days, with no replay.

verify.mjs
// Verify X-Vocatech-Signature, which reads t=<unix>,v1=<hex>.
// rawBody is the body exactly as it arrived, before any parsing.
import { createHmac, timingSafeEqual } from 'node:crypto';

export function verify(rawBody, header, secret) {
  const parts = Object.fromEntries(
    String(header).split(',').map((p) => p.split('='))
  );
  const t = Number(parts.t);
  if (!t || !parts.v1) return false;
  if (Math.abs(Date.now() / 1000 - t) > 300) return false;

  const expected = Buffer.from(
    createHmac('sha256', secret).update(`t=${parts.t}.${rawBody}`).digest('hex')
  );
  const given = Buffer.from(parts.v1);
  // timingSafeEqual throws on unequal lengths, so check them first.
  return given.length === expected.length && timingSafeEqual(given, expected);
}
call.startedA call leg starts Within seconds
call.answeredA call leg is answered Within seconds
call.endedA call leg ends Within seconds
call.transcriptionA recorded leg’s summary and transcript are ready Minutes after, sometimes hours
message.sentA text sent from the API or the portal goes out Within seconds
message.receivedA text or WhatsApp message arrives Within seconds
message.status_updatedA carrier or WhatsApp reports a status Within seconds
fax.sentAn outgoing fax is logged Within a minute
fax.receivedAn incoming fax is logged Within a minute
fax.deliveredA fax is logged as delivered Within a minute
fax.failedA fax is logged as failed Within a minute
Keys, limits and errors

Keys you control. Limits you can read.

Each counter runs in fixed windows in UTC, and a refused request counts too. A 429 names the counter and the window, with the seconds to wait in Retry-After.

Keys you make yourself

The main key comes from your Integrations page and reaches every route. An API Messaging key, one per integrator, only texts.

Locked to your servers

List the exact addresses a key may use, IPv4 or IPv6, no ranges. Optional on the main key, required on a messaging key.

Every read on the record

Each read of calls, texts, faxes, recordings and callers is written to your account’s access log, with the key that made it.

A counter per kind

Reports, texts, faxes, AI agent calls, tickets and questions each count on their own, so one never uses up another.

Counter, per keyMinuteHourDay
DefaultEvery other request6003,600100,000
ReportsGET /v1/calls, GET /v1/messages3003,000100,000
Texts, on the main keyPOST /v1/messages20200
Faxes, per accountPOST /v1/faxes350 sent
AI agent callsPOST /v1/agents/{id}/calls10500
Support ticketsPOST /v1/support/tickets10200
Knowledge/v1/knowledge/answer302,000

An API Messaging key is not held to the 20 and the 200. Its batch is accepted and sent in order at a pace set per key. Faxes count per account, 3 a minute and 50 a day, each a PDF of at most 25 pages, and stop at the account’s monthly allowance. What metered texting costs is on the pricing page.

StatusWhat it means
400, 422The request is malformed or fails a check, such as a window over 366 days or a fax that is not a PDF. The message names what to fix.
401No key, or a key that is wrong or turned off.
403Outside the key’s scope or its address list, or something we refuse, such as texting from a number that is not yours.
404, 410Not found, or not yours. A 410 is a file that is no longer there.
409Already done or busy, such as a queued text already sent. Honor Retry-After.
413A fax document over 20 MB.
429A counter is full. Wait the seconds in the Retry-After header.
502, 503A service behind the API could not do it just now. A text answered 503 was not sent and is safe to retry.
504A text was not confirmed and may have gone out. Check GET /v1/messages before you retry.

Every error, shape by shape

Straight answers

Questions developers ask us first.

“Does the API cost extra?”

No. The API, webhooks and contact directory are in every seat, with nothing to license. Only texting past the included allowance is metered, through a key of its own, and the pricing page says how.

“Where does the key come from?”

Your company’s Integrations page in the portal. A login that may edit the company presses Generate, the key shows there and is never emailed, and Regenerate replaces it at once.

“Can the API change our phone settings?”

No. It reads and sends. Forwarding, voicemail, menus and the rest are changed in the portal, and the API creates no logins. If you need something it does not do, tell us.

“Can we call it from a web page or an app?”

No. It is for servers only and sends no CORS headers, because a key in a browser is a key anyone can read. Call it from your server and keep the key in an environment variable.

“How do we test without sending anything?”

A text or a fax sent with test set to true is checked in full and sent nowhere. For a webhook, its test route sends your endpoint a signed test event at once, before any real one.

“What happens when our server is down?”

A failed delivery is tried five times over about two and a half hours, then stays listed at GET /v1/webhooks/failures for seven days, with no replay. Fill any gap from the call, message and fax lists.

“Can an AI write the integration for us?”

Yes, and the guide is written for it. Hand your assistant the plain-text guide and the OpenAPI file, and paste the rules on the AI page so its code is safe the first time.

“Is there a person to ask?”

Yes. Call or text 718.395.1550, or email office@vocatech.com, with the time, the path and the status you got. The people who built the API pick up. Never send us your key.

In every seat

Make a key, and start building.

The guide walks through every job with working code. The reference has every route with its fields, its answers and its errors.