WEBAPI + WEBHOOK BUNDLE

Automatic outgoing calls with 3CX

Let your CRM, dialer or script start calls through 3CX with one API request. 3CX calls the customer first and sends the answered call to a queue, IVR, ring group or Call Flow app, so agents only talk to people who picked up.

Every attempt comes back to your system as a webhook: answered or not, why it failed, how long it lasted, the recording and an AI summary.

Works with 3CX on Debian or Windows, on your own server or VPS. From €438 per year, see pricing.
3CX automatic outgoing calls through the MakeCall API to an IVR or agents

What you get

Built on standard HTTP requests, so it works with any CRM, dialer or script
  • One request per call

    A GET request with the customer's number and the queue, IVR, ring group or Call Flow app that takes the call
  • Customer first, agent second

    3CX calls the customer, and only an answered call goes to the queue and the next free agent
  • Result of every attempt

    Answered or not, with the reason it failed: declined, busy and more, so you can plan retries
  • Track each call by chid

    The makecall response returns the call ID, and every webhook of that call carries it
  • Call recordings

    A link to the MP3 or WAV recording of each answered call
  • AI summary

    Transcription, summary and sentiment score show what the customer agreed to

How an automatic call works

1. Your system sends one request. makecall?first=801&second=381629759787, where first is a queue, IVR, ring group or Call Flow app and second is the customer's number. The response contains the chid of the new call.

2. 3CX calls the customer. If nobody answers, your system gets an outgoing webhook with finishtype: Missed and the reason in termination_reason_details.

3. The customer answers and goes to the queue or IVR. When an agent picks up, a webhook tells your system which agent took the call, so the CRM can open the customer's card for that agent.

4. The call ends. Your system gets the duration, the recording link and, after transcription, the AI summary.

Your system decides whom to call and when: lists, schedules, retries. WebAPI places the calls on 3CX and reports every result back.

Typical uses: appointment reminders, callbacks, sales and service campaigns, delivery notifications, surveys. See also 3CX automatic outgoing calls.
Watch: automated dialing with 3CX
How the MakeCall API starts automatic outgoing calls on 3CX

Integration guide

What your developer needs to do, step by step. Full field reference: Webhook documentation and WebAPI documentation.
Before you start

  1. Install the WebAPI + Webhook bundle on your 3CX server (Debian or Windows, your own server or VPS; 3CX hosted by 3CX is not supported).
  2. Create the queue, IVR, ring group or Call Flow app that will take the answered calls, and note its number.
  3. Create an HTTPS endpoint in your system that accepts POST requests with a JSON body (Content-Type: application/json) from the IP address of your 3CX server and returns HTTP 200.
  4. In the [Webhooks] section of TCXWebAPI.ini, set POST = 1 and WEBHOOK_URL = your endpoint, for example https://crm.company.com/webhooks/. Set RECORDING_FULL_INFO = 1 to get call details together with the recording link. Restart the WebAPI service. All webhook settings
  5. Create an access key in AuthKeys.csv and allow your system's IP address in AllowedIP.txt.
Step 1. Start an automatic call with a GET request
  • {AccessKey} - access key from AuthKeys.csv
  • {3CXFQDN} - address of your 3CX server
  • first - number of the queue, IVR, ring group or Call Flow app that takes the answered call
  • second - customer's external number
  • timeout - response timeout in milliseconds
GET /webapi/{AccessKey}/makecall?first=801&second=381629759787&timeout=2000 HTTP/1.1
Host: {3CXFQDN}
Save the chid from the response: the following webhooks of this call carry the same chid
{
    "chid": "00000000-01dc-27fa-d1eb-64b00000002e"
}
Step 2. Log an unanswered call with the reason, for example to schedule a retry
  • callerid - external number of customer
  • user - user extension
  • termination_reason_details - rejection reason
  • source_presentation - outgoing DID number
POST /webhooks/ HTTP/1.1
Host: crm.company.com
Content-Type: application/json

{
    "event": "outgoing",
    "callerid": "381629759787",
    "user": "801",
    "finishtype": "Missed",
    "transfer": "False",
    "breakside": "Undef",
    "did": "",
    "title": "Unanswered call to 381629759787",
    "id": "250917194513_46-0",
    "chid": "00000000-01dc-27fa-d1eb-64b00000002e",
    "inbound_did": "381629759787",
    "sip_displayname": "",
    "phonebook": "",
    "call_id1": "mf5zBO50gjyzLA3rLgaZkA..;from-tag=3510c33e;to-tag=2c2c4b61",
    "call_id2": "a2c4c06a-21d7-4d43-b58c-db3871740d61;to-tag=59329b7a;from-tag=81865a8a-e9a9-4bf6-a597-9e496bfda25a",
    "termination_reason_details": "declined",
    "source_presentation": "381213220030"
}
Step 3. Open the customer's card for the agent on the pickupoutgoing event
  • callerid - external number of customer
  • user - user extension
  • chid - unique ID of the call chain
  • source_presentation - outgoing DID number
POST /webhooks/ HTTP/1.1
Host: crm.company.com
Content-Type: application/json

{
    "callerid": "381629759787",
    "event": "pickupoutgoing",
    "user": "105",
    "did": "",
    "trtype": "NotDef",
    "id": "250917195359_47-1",
    "chid": "00000000-01dc-27fc-0bdb-88fd0000002f",
    "inbound_did": "",
    "sip_displayname": "",
    "phonebook": "",
    "call_id1": "170f530d-7af4-4081-9af1-6c3d88afc411;to-tag=3d10a53b;from-tag=eca65e6e-efc4-436a-8bcf-041f27b8267c",
    "call_id2": "0-I_xdErJxAvrSrfWr4eNA..;from-tag=ba2c291a;to-tag=as0775c705"
}
Step 4. Log the result and duration of an answered call and attach the .mp3 or .wav recording
  • callerid - external number of customer
  • user - user extension
  • chid - unique ID of the call chain
  • source_presentation - outgoing DID number
POST /webhooks/ HTTP/1.1
Host: crm.company.com
Content-Type: application/json

{
    "FILES": [
        "https://{3CXFQDN}/webapi/recording/250917195359_47-1-1.mp3"
    ],
    "event": "outgoing",
    "callerid": "381629759787",
    "user": "105",
    "finishtype": "Ok",
    "transfer": "False",
    "breakside": "Internal",
    "did": "",
    "title": "Successful call to 381629759787 (0:05)",
    "id": "250917195359_47-1",
    "chid": "00000000-01dc-27fc-0bdb-88fd0000002f",
    "inbound_did": "381629759787",
    "sip_displayname": "",
    "phonebook": "",
    "call_id1": "MQdyDv4dHEvGFw8FZ6u49w..;from-tag=2950160b;to-tag=34643343",
    "call_id2": "170f530d-7af4-4081-9af1-6c3d88afc411;to-tag=3d10a53b;from-tag=eca65e6e-efc4-436a-8bcf-041f27b8267c",
    "termination_reason_details": "polling",
    "source_presentation": "381213220030"
}
Step 5. Add the AI transcription and summary (a separate webhook after the call)
POST /webhooks/ HTTP/1.1
Host: crm.company.com
Content-Type: application/json

{
    "event": "ai",
    "id": "250917195359_47-1",
    "summary": "Customer received a positive outbound call about a weekend swimming pool discount and accepted the offer.",
    "transcription": "Hello this is the call center we have a special offer for you there is a weekend discount for the swimming pool would you like to take advantage. Yes that sounds great thank you very much. Wonderful have a nice day",
    "sentiment_score": "5"
}
“
The fastest and simplest integration our team has ever done. It took us just 3 days to fully integrate a CRM system with 3CX using the WebAPI + Webhook bundle from Creomate.
— SAP CRM developer

Pricing

Annual license for the WebAPI + Webhook bundle, priced by simultaneous calls (SC). The license must cover the same number of SC as your 3CX license. Support is included; taxes and VAT are not.
8 SC
— WebAPI + Webhook
— Support included
€438
per year
16 SC
— WebAPI + Webhook
— Support included
€658
per year
24 SC
— WebAPI + Webhook
— Support included
€878
per year
32 SC
— WebAPI + Webhook
— Support included
€1 098
per year

FAQ

More answers in the 3CX WebAPI FAQ