Telephony through an API for sales and support teams

The agent clicks the customer's number in the CRM. The platform rings the agent's mobile, then the customer, from the company's landline number. Inbound calls reach the right agent. Your CRM hears about every step through webhooks and gets the recording at the end.

The CRM requests the call, the platform rings the agent, then the customer, connects them and sends the events to the CRMCRMyour systemPlatformvoice-api.2l.roAgentmobile phoneCustomerany Romanian numberPOST /v1/callscall.createdrings the agent's mobileanswers (and confirms with a key)call.agent_answeredrings the customer from 031 234 5678 (company number)answerscall.answeredrecording notice, then the conversationcall.endedcall.recording_ready
request or answerringingconversationsigned webhook to the CRM
  1. The CRM requests the callPOST /v1/calls with the agent and the customer number
  2. The agent's mobile ringsThe agent answers and, if the company requires it, confirms with a key.
  3. The customer is rungThe customer sees the company's landline number.
  4. The conversationBoth hear the recording notice, then talk. The conversation is recorded.
  5. The CRM knows everythingA webhook for every step, then the recording.
Agent's phone
Their own mobile. No app, softphone or headset.
Number the customer sees
The company's landline number, with a Romanian prefix
Inbound calls
Working hours, key menu, queues, voicemail
Recording
Stereo: agent on the left, customer on the right
Integration
REST + JSON, webhooks signed with HMAC-SHA256
Hosting
AWS Frankfurt, data stays in the EU

Calls from the CRM

A call starts with a single request. The rest happens on the phones.

  • Agents use the mobile phone they already have. It works the same from the office, in the field or in the car.
  • The customer sees the company's landline number, not the agent's mobile.
  • The company can require the agent to confirm with a key before the customer is rung.
  • When the customer answers, both hear the recording notice, then talk.
  • The CRM can attach its own data to the call (for example the lead ID) and gets it back in every event.

Inbound calls

When a customer calls the company's number, the platform looks for the right person before queueing the call.

  1. Working hoursPer line or per queue, with Romanian public holidays filled in. Outside working hours the caller hears the closed message and can leave a voicemail.
  2. The customer's agentThe agent who last talked to this customer in the past 30 days rings first, or the one your CRM picks within 1.5 s.
  3. MenuOne level of keys, for example 1 for sales, 2 for service.
  4. QueueMusic, periodic announcements and the caller’s position. Agents are rung in turn, longest idle first, or all at once.
  5. VoicemailUp to 120 s, sent to the CRM as an audio file.

Agents log in or out by calling the company's number from their mobile: 1 to log in, 2 to log out.

Recordings

Each voice on its own channel, so you can analyse what the agent says and what the customer says separately.

Channels
Agent on the left, customer on the right. Voicemail is mono.
What is recorded
Only the conversation, after the recording notice. Never the ring tone or the notice.
Format
MP3 (16 kHz, 48 kbps) or WAV (PCM 16 bit, 8 kHz), the company's choice
Access
Download through the API. Every download is written to the audit log.
Retention
7 days by default, configurable per company. Deleted on request, for GDPR.

API and webhooks

REST and JSON, with a public OpenAPI reference and a separate test environment.

Request the call:

curl -X POST https://voice-api.2l.ro/v1/calls \
  -H "Authorization: Bearer $TENANT_KEY" \
  -d '{"agent_id": "ag_…", "to": "+40733987654",
       "external_ref": {"lead_id": 612}}'

When the call ends, the CRM receives:

POST https://crm.example.com/telephony/events
X-Signature: sha256=…

{ "event": "call.ended",
  "call": { "status": "ANSWERED", "talk_seconds": 236,
            "agent": { "external_ref": "41" },
            "external_ref": { "lead_id": 612 } } }

Then download the recording:

curl -o call.mp3 https://voice-api.2l.ro/v1/calls/c_…/recording \
  -H "Authorization: Bearer $TENANT_KEY"
  • Separate keys for test and production
  • Two active keys per company, so you can rotate without downtime
  • Keys optionally restricted to a list of IP addresses
  • A repeated request never places a second call (Idempotency-Key)
  • Webhooks signed with HMAC-SHA256
  • Retries for 24 hours: 10 s, 30 s, 1 min, 5 min, 15 min, 30 min, then hourly
  • Every event carries the full state of the call
  • A timeline for every call, with every delivery attempt

Events

  • call.created
  • call.ringing_agent
  • call.agent_answered
  • call.answered
  • call.ivr_selected
  • call.transferred
  • call.ended
  • call.recording_ready
  • call.recording_failed
  • agent.status_changed

Getting started

You integrate on staging first, which only calls your test numbers. Then you move to production with new keys.

  1. You get accessWe give you a partner key and add your test numbers on staging.
  2. Create a company and its keyEach of your customers is a separate company with its own key. We allocate its landline numbers.
  3. Set up the webhookThe CRM address that receives the events, with the secret for the signature.
  4. Add the agentsWith their mobile number and their ID in your CRM.
  5. Place the first callFollow the events and download the recording.
  6. Inbound calls, optionalTell the platform where to ask your CRM who takes the call.

Web console

For administrators and supervisors, no code needed.

  • Calls in progress, with hang-up from the console
  • Call history with filters and the timeline of every call
  • Agents, lines, queues, working hours and menus
  • Users with roles and two-factor authentication
  • API keys, webhook deliveries, audio prompts and the audit log

Partners also get Grafana logs and dashboards for their calls and deliveries, with IP-restricted access.

Open the console

For integrators

If you run a CRM with several customers, you are a partner. The partner key creates your customer companies and their keys. Each company has its own agents, lines, queues and data, kept apart from the others. Your customers don't need an account with us.

Infrastructure and security

Hosting
AWS Frankfurt (eu-central-1). Data and recordings stay in the EU, recordings are encrypted.
Isolation
Each company's data is separated in the database itself (row-level security in Postgres).
Test environment
A separate staging that only calls the numbers on your list.
Destinations
Romanian mobile and landline numbers. Premium-rate numbers are blocked.
Voice prompts
In Romanian, with a natural voice. You can replace them with your own recordings.

In progress: packages with minutes, concurrent calls, lines and agents, usage reports, blocklists and an emergency stop.

Try it on staging

Write to us and we will create a test account, with your numbers on the list of allowed destinations.

Write to voice@2l.ro