Connecting IP Telephony
Aelo ingests completed calls from Ukrainian IP-telephony providers via webhook, and historical calls via CDR backfill. Four providers are supported: Stream Telecom and Binotel are verified on production traffic; Unitalk and Ringostat are in beta.
General flow
Section titled “General flow”- Under Sources → Telephony, pick a provider and enter its credentials.
- Copy the webhook address the wizard shows into the provider’s settings — not the bare
webhookUrlfrom the API. Every provider except Binotel also needs the webhook secret Aelo generates, and without it every webhook is rejected: for Stream Telecom the wizard’s address already carries it as?token=…; for Unitalk and Ringostat it goes into theAuthorizationheader. - Click Test connection — Aelo calls the provider’s CDR API.
Stream Telecom
Section titled “Stream Telecom”- Credentials:
username+password+api_key(Administration → Company Profile → API KEY). Not a Bearer token. - Webhook: an event stream; the terminal event is
Hangupwith a synchronousrecordUrl. Configured by emailing support@streamtele.com. - Webhook address is secret: it carries a token (
?token=…), and a call sent to the address without it is rejected. The wizard puts the full address into the support email; to get it later, open Settings → Data Sources → Connection → Real-time call webhook and press Show address — available to the owner and to admins. Send it to Stream Telecom support only. - CDR backfill: window ≤30 days.
Binotel
Section titled “Binotel”- Credentials:
key+secret(issued by support@binotel.ua, bound to your IP). - Event:
apiCallCompleted(form-urlencoded). The webhook carries no recording URL — Aelo fetches it on demand right before download (the link lives ~15 min). - IP allowlist: Binotel’s public IPs are allowed by default.
- Aelo always responds 200 to avoid provider re-deliveries.
Unitalk
Section titled “Unitalk”- Credentials: project API key (sent in the
Authorizationheader). - Setup: after saving, Aelo generates a webhook secret. Paste it into the
Authorizationheader of the Unitalk event handler — otherwise every webhook is rejected. - Getting the secret back: it is not shown on screen by default, because the connection status is readable by everyone in your organization. Open Settings → Data Sources → Connection → Real-time call webhook and press Show secret — available to the owner and to admins. The secret does not change when you rotate the API key or reconnect the source: the copy already pasted into Unitalk keeps working.
- Timezone: Unitalk timestamps have no offset; defaults to
Europe/Kyiv(editable in the form). - Event:
CALL_END. The recording becomes available after ~10–15 min (Aelo waits for it).
Ringostat
Section titled “Ringostat”- Credentials: API key — the only field the form asks for.
- Setup: in Ringostat, open Integrations → Webhooks 2.0, set the issued URL as the
destination and add the header
Authorizationwith the valueBearer <secret>, using the webhook secret Aelo generates after saving. Without the header every webhook is rejected. The secret is shown in the wizard and later under Show secret, as for Unitalk. - Recording: arrives inside the webhook itself, so there is no follow-up fetch.
- No CDR backfill: historical calls cannot be imported — only calls that arrive after the connection is set up.
- Status: beta. The payload schema is inherited from an earlier integration and has never been confirmed against live data; Test connection therefore reports success without calling Ringostat.
Hybrid mode: telephony as an audio-only source
Section titled “Hybrid mode: telephony as an audio-only source”Some CRMs register a call but never attach its recording. Bitrix24, for example, can log a call as an activity that only links into the telephony provider’s own web archive instead of carrying a file. For that case, a telephony installation can serve as an audio-only source instead of its default record source role: it creates no records of its own and supplies the recording a CRM record is missing. A telephony that is bringing records right now is not switched in place — disconnect it first, then add it as an audio source.
- Vendor: only Binotel today. Aelo fetches a Binotel recording on demand by call id; Stream Telecom, Unitalk and Ringostat hand their recording only inside their own webhook and cannot mint one for a call they did not receive directly.
- Setup: with a CRM already connected, its card under Settings → Data Sources → Connection offers Add telephony as an audio source. It opens the connection wizard with the role already set and lists only the vendors that can supply a recording; the CRM is not touched, and the Change confirmation is not shown. The role can also be chosen in the wizard itself, on the credentials step. Both appear only where they mean something: the vendor must be able to mint a recording URL from a call id, and the record source must be a CRM Aelo fetches recordings from — Bitrix24 today. Connecting an audio-only source does not switch off the telephony your records arrive through: one active telephony per role, not per organization. An audio-only source skips the bulk-import step (it imports no records) and shows up under Settings → Data Sources → Connection as its own card, badged as the additional source, with its webhook URL, its own Change and its own Disconnect. Rotating credentials keeps the role: the wizard opens on the role the installation already has. A telephony that is bringing records right now is not switched to the audio role in place — that would stop its records — so disconnect it first, then connect it again as an audio source.
- Matching: Aelo first looks for a call id already present in the CRM activity; if none is found, it matches by phone number, call time and duration against Binotel’s call index. The live webhook adds a call to that index as soon as it has ended, answered or not. An outcome of “nobody picked up” or “line busy” is what lets Aelo stop waiting for a recording that will never appear. Any other unanswered outcome (the caller hung up while it was still ringing, the network failed) is indexed too, but Aelo keeps asking the operator for the recording until the 24-hour ceiling, because such an outcome cannot be told apart from one Aelo does not recognize yet. A durable historical import, started with backlog processing, covers whatever the live webhook never saw — a dropped event, or a call from before the installation was connected.
- Data lifetime: the matching index contains only phone-number tails and call metadata. Each row expires after at most 30 days, sooner when the organization’s configured transcript retention is shorter, and it is included in organization purge.
- When it gives up: two answers let Aelo close the record with a reason of its own instead of waiting for a recording. “No recording at the source” — the call is in the index with an outcome that says the operator never made one. “Several calls match” — more than one indexed call still fits after narrowing, and guessing would put a stranger’s recording on the card. Everything else waits out the usual 24-hour window and then closes as “Call not found at the source” — provided the operator is answering at that moment. If it is not, the record ends as an error instead: an operator that has gone silent says nothing about the call.