Spraakverificatie (OTP)
Het model "Wij bellen u, wij lezen de code voor": u geeft het nummer door, de telefooncentrale belt en leest de verificatiecode cijfer voor cijfer voor aan wie opneemt (druk op 1 om te herhalen) en hangt op. U kunt de code zelf aanleveren of door Buluthat laten genereren en eenmalig in het antwoord laten teruggeven. De code staat in de database alleen hash wordt opgeslagen als; status komt niet voor in het antwoord.
Endpoint: https://api.buluthat.com/api/voice_otp.php — Integratiesleutel (bt_…, bereik voice_otp / autocall / voicebot / *). In het account voice_otp de module moet zijn ingeschakeld.
POSTsend
{
"action": "send",
"phone": "05551112233",
"code": "482913",
"length": 6,
"reference": "CARI-451",
"caller_id": "02124119610",
"trunk_slug": "hat-1",
"repeat": 2,
"ttl_minutes": 5,
"company_name": "Byfix",
"webhook_url": "https://crm.example.com/otp-sonuc.php",
"webhook_secret": "gizli"
}
| Veld | Verplicht | Omschrijving |
|---|---|---|
phone | ja | Te bellen nummer |
code | nee | Uw eigen code; indien leeg genereert Buluthat hem |
length | nee | Aantal cijfers van de te genereren code (4-8, standaard 6) |
reference | nee | Uw eigen opname; status/list om te vinden met |
caller_id, trunk_slug | nee | Nummerweergave en lijn |
repeat | nee | Hoe vaak de code wordt voorgelezen (1-5, standaard 2) |
ttl_minutes | nee | Geldigheid van de code (maximaal 60, standaard 5) |
company_name | nee | Bedrijfsnaam in de openingsaankondiging; indien leeg de accountnaam |
webhook_url, webhook_secret | nee | Statusmelding |
Antwoord:
{ "ok": true, "code": "482913", "data": { "id": 17, "status": "calling", "expires_at": "2026-09-18 10:17:03" } }
code wordt alleen teruggegeven als Buluthat hem genereerde; als u hem zelf verstuurde null.
Fouten (422): ongeldig nummer, meer dan 3 oproepen naar hetzelfde nummer binnen 10 minuten (rate_limited), dagelijks maximum (daily_limit), lopende oproep (in_progress), geen lijn, geen spraaksleutel, de telefooncentrale kon de oproep niet opzetten (reden in het bericht).
POSTverify
{ "action": "verify", "id": 17, "code": "482913" }
id in plaats van phone (+ reference) kan ook worden opgegeven; de laatste opname naar dat nummer wordt gebruikt.
- Juist:
{ "ok": true, "verified": true } - Fout:
422enerror:wrong_code(resterende proefberichten in het bericht),expired,too_many_attempts(5),not_delivered(oproep niet opgezet),not_found
De code, als de oproep is opgenomen (answered/delivered) kan worden geverifieerd — ook als de persoon na het horen van de code ophangt.
GETstatus
GET https://api.buluthat.com/api/voice_otp.php?action=status&id=17
Statussen: pending → calling → answered → delivered → verified; mislukte no_answer, busy, failed, expired. final: true is de oproep afgelopen. Vraag elke 2-3 seconden op of gebruik een webhook.
GETlist
GET ?action=list&phone=0555…&reference=CARI-451&limit=20
GETcaller_ids · trunks
Opties voor nummerweergave en lijn (zelfde als de API voor automatisch bellen).
Webhook
webhook_url indien opgegeven, bij statuswijzigingen (delivered, verified, no_answer, busy, failed, expired) wordt gepost:
{ "event": "voice_otp.delivered", "request": { "id": 17, "status": "delivered", "reference": "CARI-451", "phone": "05551112233" } }
Headers X-Buluthat-Event, X-Buluthat-Delivery, webhook_secret indien opgegeven X-Buluthat-Signature: sha256=<hmac>. Bij een antwoord buiten 2xx wordt na 1 min, 5 min, 15 min, 1 u, 3 u, 6 u opnieuw geprobeerd.
PHP-client
Gedownload uit het paneel buluthat-voice-otp-client.php:
require 'buluthat-voice-otp-client.php';
$otp = new BuluthatVoiceOtp('https://api.buluthat.com', 'bt_xxx');
$r = $otp->send('05551112233', ['reference' => 'CARI-451']); // $r['code'], $r['data']['id']
// ... kullanıcı kodu girer ...
$v = $otp->verify($r['data']['id'], $girilenKod); // $v['ok'] === true
Waarom in plaats van SMS?
- Vereist geen İYS-toestemming en SMS-afzendernaam, werkt ook op een vaste lijn.
- Geen problemen met niet-bezorgde SMS: duidelijk of de oproep is opgenomen en de code is voorgelezen.
- Voor oudere of slechtziende gebruikers is een code beluisteren makkelijker dan lezen.
- Alleen voor opgenomen oproepen wordt gefactureerd, volgens uw pakketregels.
