voepy

Calls, conferences, and numbers.

One API. One balance.

Place a call from a curl command. Hold a conference in code. Pay by the second. Read the ledger while the call is still in progress.

What the API does

POST /v1/calls places a call. You give us a destination, a caller ID you own, and a webhook URL. We dial. Your endpoint hears call.initiated, then call.answered or call.failed. The call object stays around after the call ends, so duration, end-reason, recordings, and cost all read off the same id without a second request.

Inbound is the same shape in reverse. Point a phone number at a webhook and we deliver each call with the caller's number, the dialed number, and the metadata we have. Answer it, route it, transfer it, drop it onto a conference, or reject it — every choice is one HTTP call back to /v1/calls/{id}/actions/.... No proprietary markup language sits between your code and the carrier.

How the bill works

You top up a balance with a card. Stripe handles the charge. Every call, recording, transcription, conference minute, and number rental draws from that balance by the second. When the balance crosses a threshold you set, you get an email from noreply@voepy.com. When it hits zero, we stop placing calls — the API returns a 402 and the dashboard shows the empty balance until the next top-up.

Spend caps are hard, not advisory. Set a daily cap, a monthly cap, both, or neither. If a call would push past the cap, we don't dial it; the API returns a 403naming the cap that blocked the call. That's the cap doing its job.

The ledger is append-only and per-tenant. Every charge gets a row with the call id, the duration in seconds, the underlying carrier cost, and the markup applied. When a call attempt fails on our side after the balance was debited, a refund row posts back automatically. Top-up receipts and monthly invoices arrive by email and stay in the dashboard for the life of the account.

Pricing

Pay for what you use. Cap what you don't.

All prices in USD. Direct per-minute carrier rates plus a flat plan multiplier — 1.40× on Starter, 1.25× on Pro, 1.10× on Enterprise. Every charge shows up line by line in the ledger. No premium routes hidden in fine print, no per-API-call surcharges, no annual commit to unlock the price you see.

Starter

$0/mo
Pay-as-you-go
Outbound
1.40×
Inbound
1.40×
Conferences
1.40×
Streaming
1.40×
Spend cap
$50/day

Pro

$99/mo
+ $1k call credit
Outbound
1.25×
Inbound
1.25×
Conferences
1.25×
Streaming
1.25×
Spend cap
$1,000/day

Enterprise

Custom
+ negotiated minimums
Outbound
1.10×
Inbound
1.10×
Conferences
1.10×
Streaming
1.10×
Spend cap
Custom

Per-country, per-minute rates and number-leasing prices live on the full pricing page → /pricing

FAQ

Is there a free trial?
Yes. New accounts on a paid plan are credited with a starting balance the moment the subscription activates, so the first calls go out without a top-up. Free-tier accounts can still create an API key and explore the surface; they just need to top up before placing a billable call.
What does it cost to make a call?
Calls bill in 1-second increments from the moment the carrier reports answer. The per-minute rate depends on the destination country and the plan you're on (multiplier is 1.40× / 1.25× / 1.10× for Starter / Pro / Enterprise). The full rate sheet is at /pricing.
Can I bring my own phone number?
Yes. Numbers port in from another provider through the dashboard, and port-out works the same way — we don't lock you in. Porting fees, when they apply, are line items on your balance like any other charge.
Do you have SDKs?
Not yet. Today the API is REST over HTTPS, and the documentation uses cURL. Python and Node SDKs are next on the roadmap; until they ship, every endpoint is callable from any HTTP client.
How do webhooks stay secure?
Every payload is signed HMAC-SHA256 with a secret you set on the endpoint. Reject any request whose signature doesn't verify. The webhook secret is rotatable from the dashboard without a redeploy.
What happens if my webhook endpoint is down?
We retry with exponential backoff for several hours, then mark the delivery failed. Every delivery — successful, retried, or failed — is recorded in the dashboard with the full request, the response code, and the timestamp, so you can see exactly what we sent.
Can I cap how much my account can spend?
Yes. Daily caps, monthly caps, or both. Caps are hard stops, not soft targets. A call that would push the account over a cap is not dialed, and the API returns a 403 naming the cap.
Who can I add to the account?
Teammates by email, each assigned one of the seeded roles — owner, admin, billing, or member — or a custom role you build from a permissions checklist. Every action they take lands in the audit log with their email and the timestamp.

Open an account. Make a call. Read the bill.

Signup, key, top-up, call. The whole loop is one tab.