New features, improvements, and fixes to Dial

July 27, 2026

Added

Free-account limits on the account object

GET /api/v1/account now returns a limits object — maxCallDurationSeconds and maxConcurrentCalls — for accounts that have never added credit and never subscribed, and null for accounts that have paid. Read it instead of hardcoding the values.

1{
2 "maxCallDurationSeconds": 300,
3 "limits": { "maxCallDurationSeconds": 300, "maxConcurrentCalls": 2 }
4}

The same response now also carries maxCallDurationSeconds, the account-wide cap. It was already part of the documented Account object but had been omitted from the response.

Changed

Asking for more than the free call cap now returns 400

Breaking for free accounts. A maxCallDurationSeconds sent explicitly above the free ceiling (300 seconds) is now rejected with 400 on POST /api/v1/calls, PATCH /api/v1/numbers/{id}, and PATCH /api/v1/account. Previously the value was accepted and silently reduced to 300, so a call requested at 30 minutes ended at 5 with nothing to explain why.

A cap inherited from the number or account chain is unaffected — it is still clamped to 300 and the call proceeds. Only a value you send in the request can be rejected.

If you place calls with an explicit duration from a free account, either lower it to 300 or below, or read limits.maxCallDurationSeconds from GET /api/v1/account and bound your request by it. See Free accounts.

PATCH /api/v1/account returns the account object directly

It now answers with the bare Account object — the shape this endpoint has always been documented to return, and the same shape GET /api/v1/account returns — instead of wrapping it in an { "account": … } envelope. If you read response.account, read the response body itself instead.