Use a web hosting service to host your web application. There are many inexpensive cloud hosting providers that you can use for just a few dollars a month. Follow the instructions of your hosting provider to host your web application.

Set up a Web Server

Let’s assume your web server is located at example.com. Below is a snippet to set up a route on your webserver. Lets call it response/conference. Now when we send an HTTP request to example.com/response/conference this route will be invoked. You will now have to configure this URL as the Answer URL in your code.
To place the calls into a conference, we need to use the Conference XML. In this route we added a message using the Speak XML and then created a Conference called ‘demo’.

Note: For PHP, the route will be example.com/conference.php.

Copy the relevant code below into a text file and save it. Lets call it conferenceXML.

fromflaskimportFlask,Response,request,make_responseimportplivoxmlapp=Flask(__name__)@app.route('/response/conference/',methods=['GET','POST'])defconference():response=plivoxml.Response()response.addSpeak('You will now be placed into a demo conference. This is brought to you by Plivo. To know more visit us at plivo.com')params={'enterSound':"beep:2",# Used to play a sound when a member enters the conference
'record':"true",# Option to record the call
'action':"https://example.com/response/conf_action/",# URL to which the API can send back parameters
'method':"GET",# method to invoke the action Url
'callbackUrl':"https://example.com/response/conf_callback/",# If specified, information is sent back to this URL
'callbackMethod':"GET"# Method used to notify callbackUrl
# For moderated conference
# 'startConferenceOnEnter' : "true", # When a member joins the conference with this attribute set to true, the conference is started.
# If a member joins a conference that has not yet started, with this attribute value set to false,
# the member is muted and hears background music until another member joins the conference
# 'endConferenceOnExit' : "true" # If a member with this attribute set to true leaves the conference, the conference ends and all
# other members are automatically removed from the conference.
}conference_name="demo"# Conference Room name
response.addConference(conference_name,**params)returnResponse(str(response),mimetype='text/xml')# Action URL Example
@app.route('/response/conf_action/',methods=['GET','POST'])defconf_action():conf_name=request.values.get('ConferenceName')conf_uuid=request.values.get('ConferenceUUID')conf_mem_id=request.values.get('ConferenceMemberID')record_url=request.values.get('RecordUrl')record_id=request.values.get('RecordingID')response=make_response('OK')response.headers['Content-type']='text/plain'print"Conference Name : %s "%(conf_name)print"Conference UUID : %s "%(conf_uuid)print"Conference Member ID : %s "%(conf_mem_id)print"Record URL : %s "%(record_url)print"Recording ID : %s "%(record_id)returnresponse# Callback URL Example
@app.route('/response/conf_callback/',methods=['GET','POST'])defconf_callback():conf_action=request.values.get('ConferenceAction')conf_name=request.values.get('ConferenceName')conf_uuid=request.values.get('ConferenceUUID')conf_mem_id=request.values.get('ConferenceMemberID')call_uuid=request.values.get('CallUUID')record_url=request.values.get('RecordUrl')record_id=request.values.get('RecordingID')response=make_response('OK')response.headers['Content-type']='text/plain'print"Conference Name : %s "%(conf_name)print"Conference UUID : %s "%(conf_uuid)print"Conference Member ID : %s "%(conf_mem_id)print"Record URL : %s "%(record_url)print"Recording ID : %s "%(record_id)returnresponseif__name__=="__main__":app.run(host='0.0.0.0',debug=True)# Outbound Conference
importplivoauth_id="Your AUTH_ID"auth_token="Your AUTH_TOKEN"# Enter your Plivo phone number. This will show up on your caller ID
plivo_number="1111111111"# Enter the URL of where your conferenceXML.py file is
answer_url="https://example.com/response/conference"p=plivo.RestAPI(auth_id,auth_token)call_params={'to':"2222222222<3333333333",# The phone number to which the call has to be placed separated by "<" delimiter
'from':plivo_number,# The phone number to be used as the caller id
'answer_url':answer_url,# The URL invoked by Plivo when the outbound call is answered
'answer_method':"GET"# The method used to call the answer_url
}r=p.make_call(call_params)printstr(r)

require'rubygems'require'sinatra'require'plivo'includePlivoget'/response/conference/'dor=Response.new()r.addSpeak("You will now be placed into a demo conference. This is brought to you by Plivo. To know more visit us at plivo.com")params={'enterSound'=>"beep:2",# Used to play a sound when a member enters the conference'record'=>"true",# Option to record the call'action'=>"https://example.com/response/conf_action/",# URL to which the API can send back parameters'method'=>"GET",# method to invoke the action Url'record'=>"true",# Option to record the call'callbackUrl'=>"https://example.com/response/conf_callback/",# If specified, information is sent back to this URL'callbackMethod'=>"GET"# Method used to notify callbackUrl# For moderated conference# 'startConferenceOnEnter' => "true", # When a member joins the conference with this attribute set to true, the conference is started.# If a member joins a conference that has not yet started, with this attribute value set to false,# the member is muted and hears background music until another member joins the conference# 'endConferenceOnExit' => "true" # If a member with this attribute set to true leaves the conference, the conference ends and all# other members are automatically removed from the conference.}conference_name="demo"r.addConference(conference_name,params)putsr.to_xml()content_type'text/xml'returnr.to_s()endget'/response/conf_action/'doconf_name=params[:ConferenceName]conf_uuid=params[:ConferenceUUID]conf_mem_id=params[:ConferenceMemberID]record_url=params[:RecordUrl]record_id=params[:RecordingID]puts("Conference Name : #{conf_name}, Conference UUID : #{conf_uuid}, Member ID : #{conf_mem_id}, Record URL : #{record_url}, Record ID : #{record_id}")endget'/response/conf_callback/'doconf_action=params[:ConferenceAction]conf_name=params[:ConferenceName]conf_uuid=params[:ConferenceUUID]conf_mem_id=params[:ConferenceMemberID]call_uuid=params[:CallUUID]record_url=params[:RecordUrl]record_id=params[:RecordingID]puts("Conference Action : #{conf_action}, Conference Name : #{conf_name}, Conference UUID : #{conf_uuid}, Member ID : #{conf_mem_id}, Call UUID : #{call_uuid}, Record URL : #{record_url}, Record ID : #{record_id}")end# Outbound Conferencerequire'rubygems'require'plivo'includePlivoAUTH_ID="Your AUTH_ID"AUTH_TOKEN="Your AUTH_TOKEN"p=RestAPI.new(AUTH_ID,AUTH_TOKEN)params={'to'=>'2222222222<3333333333',# The phone number to which the call has to be placed separated by "<" delimiter'from'=>'1111111111',# The phone number to be used as the caller id'answer_url'=>'https://example.com/response/conference/',# The URL invoked by Plivo when the outbound call is answered'answer_method'=>'GET',# The method used to call the answer_url}response=p.make_call(params)printresponse

varplivo=require('plivo');varexpress=require('express');varapp=express();app.set('port',(process.env.PORT||5000));app.use(express.static(__dirname+'/public'));app.all('/conference/',function(request,response){// Generates a Conference XMLvarr=plivo.Response();r.addSpeak("You will now be placed into a demo conference. This is brought to you by Plivo. To know more visit us at plivo.com");varparams={'enterSound':"beep:2",// Used to play a sound when a member enters the conference'record':"true",// Option to record the call'action':"https://intense-brook-8241.herokuapp.com/conf_action/",// URL to which the API can send back parameters'method':"GET",// method to invoke the action Url'callbackUrl':"https://intense-brook-8241.herokuapp.com/conf_callback/",// If specified, information is sent back to this URL'callbackMethod':"GET",// Method used to notify callbackUrl// For moderated conference// 'startConferenceOnEnter' : "true", // When a member joins the conference with this attribute set to true, the conference is started.// If a member joins a conference that has not yet started, with this attribute value set to false,// the member is muted and hears background music until another member joins the conference// 'endConferenceOnExit' : "true" // If a member with this attribute set to true leaves the conference, the conference ends and all// other members are automatically removed from the conference.};varconference_name="demo";// Conference Room namer.addConference(conference_name,params);console.log(r.toXML());response.set({'Content-Type':'text/xml'});response.end(r.toXML());});app.all('/conf_action/',function(request,response){varconf_name=request.param('ConferenceName');varconf_uuid=request.param('ConferenceUUID');varconf_mem_id=request.param('ConferenceMemberID');varrecord_url=request.param('RecordUrl');varrecord_id=request.param('RecordingID');console.log('Conference Name : '+conf_name+' Conference UUID : '+conf_uuid+' Conference Member ID : '+conf_mem_id+' Record Url : '+record_url+' Record ID : '+record_id);});app.all('/conf_callback/',function(request,response){varconf_action=request.param('ConferenceAction')varconf_name=request.param('ConferenceName');varconf_uuid=request.param('ConferenceUUID');varconf_mem_id=request.param('ConferenceMemberID');varcall_uuid=request.param('CallUUID')varrecord_url=request.param('RecordUrl');varrecord_id=request.param('RecordingID');console.log('Conference Action : '+conf_action+' Conference Name : '+conf_name+' Conference UUID : '+conf_uuid+' Conference Member ID : '+conf_mem_id+' Call UUID : '+call_uuid+' Record Url : '+record_url+' Record ID : '+record_id);});app.listen(app.get('port'),function(){console.log('Node app is running on port',app.get('port'));});// Outbound Conferencevarplivo=require('plivo');varp=plivo.RestAPI({authId:'Your AUTH_ID',authToken:'Your AUTH_TOKEN'});varparams={'to':'2222222222<3333333333',// The phone numer to which the all has to be placed separated by "<" delimiter'from':'1111111111',// Enter your Plivo phone number. This will show up on your caller ID'answer_url':"https://intense-brook-8241.herokuapp.com/conference/",// Enter the URL of where your conferenceXML.py file is'answer_method':"GET",// The method used to call the answer_url};// Prints the complete responsep.make_call(params,function(status,response){console.log('Status: ',status);console.log('API Response:\n',response);});

<!--conference.php--><?phprequire'vendor/autoload.php';usePlivo\Response;$r=newResponse();$body="You will now be placed into a demo conference. This is brought to you by Plivo. To know more visit us at plivo.com";$r->addSpeak($body);$params=array('enterSound'=>"beep:2",# Used to play a sound when a member enters the conference'record'=>"true",# Option to record the call'action'=>"https://example.com/conf_action.php",# URL to which the API can send back parameters'method'=>"GET",# method to invoke the action Url'callbackUrl'=>"https://example.com/conf_callback.php",# If specified, information is sent back to this URL'callbackMethod'=>"GET",# Method used to notify callbackUrl# For moderated conference'startConferenceOnEnter'=>"true",# When a member joins the conference with this attribute set to true, the conference is started.# If a member joins a conference that has not yet started, with this attribute value set to false,# the member is muted and hears background music until another member joins the conference'endConferenceOnExit'=>"true"# If a member with this attribute set to true leaves the conference, the conference ends and all# other members are automatically removed from the conference.);$conference_name="demo";$r->addConference($conference_name,$params);Header('Content-type: text/xml');echo($r->toXML());?><!--conf_action.php--><?php$conf_name=$_REQUEST['ConferenceName'];$conf_uuid=$_REQUEST['ConferenceUUID'];$conf_mem_id=$_REQUEST['ConferenceMemberID'];$record_url=$_REQUEST['RecordUrl'];$record_id=$_REQUEST['RecordingID'];error_log("Conference Name : $conf_name, Conference UUID : conf_uuid, Conference Member ID : conf_mem_id, Record URL : $record_url, Record ID : $record_id");echo"Conference Name : $conf_name, Conference UUID : conf_uuid, Conference Member ID : conf_mem_id, Record URL : $record_url, Record ID : $record_id";?><!--conf_callback.php--><?php$conf_action=$_REQUEST['ConferenceAction'];$conf_name=$_REQUEST['ConferenceName'];$conf_uuid=$_REQUEST['ConferenceUUID'];$conf_mem_id=$_REQUEST['ConferenceMemberID'];$call_uuid=$_REQUEST['CallUUID'];$record_url=$_REQUEST['RecordUrl'];$record_id=$_REQUEST['RecordingID'];error_log("Conference Action : $conf_action, Conference Name : $conf_name, Conference UUID : conf_uuid,
Conference Member ID : conf_mem_id, Call UUID : $call_uuid, Record URL : $record_url, Record ID : $record_id");echo"Conference Action : $conf_action, Conference Name : $conf_name, Conference UUID : conf_uuid,
Conference Member ID : conf_mem_id, Call UUID : $call_uuid, Record URL : $record_url, Record ID : $record_id";?><!--outbound_conference.php--><?phprequire'vendor/autoload.php';usePlivo\RestAPI;$auth_id="Your AUTH_ID";$auth_token="Your AUTH_TOKEN";$p=newRestAPI($auth_id,$auth_token);$plivo_number="1111111111";$params=array('to'=>'1111111111<2222222222',# The phon number to be called'from'=>$plivo_number,# The phone number to be used as the caller id'answer_url'=>"https://example.com/response/conference",# The URL invoked by Plivo when the outbound call is answered'answer_method'=>"GET"# The method used to call the answer_url);$response=$p->make_call($params);print_r($response);?>

// conferenceXml.javapackageplivoexample;importjava.io.IOException;importcom.plivo.helper.exception.PlivoException;importcom.plivo.helper.xml.elements.Conference;importcom.plivo.helper.xml.elements.PlivoResponse;importcom.plivo.helper.xml.elements.Speak;importorg.eclipse.jetty.server.Server;importorg.eclipse.jetty.servlet.ServletContextHandler;importorg.eclipse.jetty.servlet.ServletHolder;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassconferenceXmlextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;@OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{PlivoResponseresponse=newPlivoResponse();Speakspk=newSpeak("You will now be placed into a demo conference. This is brought to you by Plivo. To know more visit us at plivo.com");Conferenceconf=newConference("demo");conf.setEnterSound("beep:2");// Used to play a sound when a member enters the conferenceconf.setRecord(true);// Option to record the callconf.setAction("https://example.com/conf_action/");// URL to which the API can send back parametersconf.setMethod("GET");// method to invoke the action Urlconf.setCallbackUrl("https://example.com/conf_callback/");// If specified, information is sent back to this URLconf.setCallbackMethod("GET");// Method used to notify callbackUrl// For moderated conference// conf.setStartConferenceOnEnter(true); // When a member joins the conference with this attribute set to true, the conference is started.// If a member joins a conference that has not yet started, with this attribute value set to false,// the member is muted and hears background music until another member joins the conference// conf.setEndConferenceOnExit(true); // If a member with this attribute set to true leaves the conference, the conference ends and all// other members are automatically removed from the conference.try{response.append(spk);response.append(conf);System.out.println(response.toXML());resp.addHeader("Content-Type","text/xml");resp.getWriter().print(response.toXML());;}catch(PlivoExceptione){e.printStackTrace();}}publicstaticvoidmain(String[]args)throwsException{Stringport=System.getenv("PORT");if(port==null)port="8000";Serverserver=newServer(Integer.valueOf(port));ServletContextHandlercontext=newServletContextHandler(ServletContextHandler.SESSIONS);context.setContextPath("/");server.setHandler(context);context.addServlet(newServletHolder(newconferenceXml()),"/response/conference/");context.addServlet(newServletHolder(newconfAction()),"/conf_action/");context.addServlet(newServletHolder(newconfCallback()),"/conf_callback/");server.start();server.join();}}// confAction.javapackageplivoexample;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassconfActionextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{Stringconf_name=req.getParameter("ConferenceName");Stringconf_uuid=req.getParameter("ConferenceUUID");Stringconf_mem_id=req.getParameter("ConferenceMemberID");Stringrecord_url=req.getParameter("RecordUrl");Stringrecord_id=req.getParameter("RecordingID");System.out.println("Conference Name : "+conf_name+" Conference UUID : "+conf_uuid+" Conference Member ID : "+conf_mem_id+" Record URL : "+record_url+" Record ID : "+record_id);resp.getWriter().print("Conference Name : "+conf_name+" Conference UUID : "+conf_uuid+" Conference Member ID : "+conf_mem_id+" Record URL : "+record_url+" Record ID : "+record_id);}}// confCallback.javapackageplivoexample;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassconfCallbackextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{Stringconf_action=req.getParameter("ConferenceAction");Stringconf_name=req.getParameter("ConferenceName");Stringconf_uuid=req.getParameter("ConferenceUUID");Stringconf_mem_id=req.getParameter("ConferenceMemberID");Stringcall_uuid=req.getParameter("CallUUID");Stringrecord_url=req.getParameter("RecordUrl");Stringrecord_id=req.getParameter("RecordingID");System.out.println("Conference Action : "+conf_action+" Conference Name : "+conf_name+" Conference UUID : "+conf_uuid+" Conference Member ID : "+conf_mem_id+" Call UUID : "+call_uuid+" Record URL : "+record_url+" Record ID : "+record_id);resp.getWriter().print("Conference Action : "+conf_action+"Conference Name : "+conf_name+" Conference UUID : "+conf_uuid+" Conference Member ID : "+conf_mem_id+" Call UUID : "+call_uuid+" Record URL : "+record_url+" Record ID : "+record_id);}}// Outbound Conferencepackagesending_sms.sending_sms;importjava.lang.reflect.Field;importjava.lang.reflect.Modifier;importjava.util.LinkedHashMap;importcom.plivo.helper.api.client.*;importcom.plivo.helper.api.response.call.Call;importcom.plivo.helper.exception.PlivoException;publicclassApp{publicstaticvoidmain(String[]args)throwsIllegalAccessException{Stringauth_id="Your AUTH_ID";Stringauth_token="Your AUTH_TOKEN";RestAPIapi=newRestAPI(authId,authToken,"v1");LinkedHashMap<String,String>parameters=newLinkedHashMap<String,String>();parameters.put("to","2222222222");// The phone number to which the all has to be placedparameters.put("from","1111111111");// The phone number to be used as the caller idparameters.put("answer_url","https://example.com/response/conference");// The URL invoked by Plivo when the outbound call is answeredparameters.put("answer_method","GET");// method to invoke the answer_urltry{Callresp=api.makeCall(parameters);System.out.println(getFields(resp));}catch(PlivoExceptione){System.out.println(e.getLocalizedMessage());}}publicstaticStringgetFields(Objectobj)throwsIllegalAccessException{StringBufferbuffer=newStringBuffer();Field[]fields=obj.getClass().getDeclaredFields();for(Fieldf:fields){if(!Modifier.isStatic(f.getModifiers())){f.setAccessible(true);Objectvalue=f.get(obj);buffer.append(f.getName());buffer.append("=");buffer.append(""+value);buffer.append("\n");}}returnbuffer.toString();}}

usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingRestSharp;usingPlivo.XML;usingNancy;namespaceconference{publicclassProgram:NancyModule{publicProgram(){Get["/response/conference/"]=x=>{Plivo.XML.Responseresp=newPlivo.XML.Response();// Add Speak XML Tagresp.AddSpeak("You will now be placed into a demo conference. This is brought to you by Plivo. To know more, visit us at Plivo.com",newDictionary&lt;string,string&gt;(){});// Add Conference XML Tagresp.AddConference("demo",newDictionary&lt;string,string&gt;(){{"enterSound","beep:2"},// Used to play a sound when a member enters the conference{"record","true"},// Option to record the call{"action","http://example.com/response/conf_action/"},// URL to which the API can send back parameters{"method","GET"},// method to invoke the action Url{"callbackUrl","http://example.com/response/conf_callback/"},// If specified, information is sent back to this URL{"callbackMethod","GET"},// Method used to notify callbackUrl});Console.WriteLine(resp.ToString());varoutput=resp.ToString();varres=(Nancy.Response)output;res.ContentType="text/xml";returnres;};// Action URL ExampleGet["/response/conf_action/"]=x=>{Stringconf_name=Request.Query["ConferenceName"];Stringconf_uuid=Request.Query["ConferenceUUID"];Stringconf_mem_id=Request.Query["ConferenceMemberID"];Stringrecord_url=Request.Query["RecordUrl"];Stringrecord_id=Request.Query["RecordingID"];Console.WriteLine("Conference Name : {0}, Conference UUID : {1}, Conference Member ID : {2}, Record URL : {3}, Record ID : {4}",conf_name,conf_uuid,conf_mem_id,record_url,record_id);return"Done";};// Callback URL ExampleGet["/response/conf_callback/"]=x=>{Stringconf_action=Request.Query["ConferenceAction"];Stringconf_name=Request.Query["ConferenceName"];Stringconf_uuid=Request.Query["ConferenceUUID"];Stringconf_mem_id=Request.Query["ConferenceMemberID"];Stringcall_uuid=Request.Query["CallUUID"];Stringrecord_url=Request.Query["RecordUrl"];Stringrecord_id=Request.Query["RecordingID"];Console.WriteLine("Conference Action : {0}, Conference Name : {1}, Conference UUID : {2}, Conference Member ID : {3}, Call UUID : {4}, Record URL : {5}, Record ID : {6}",conf_action,conf_name,conf_uuid,conf_mem_id,call_uuid,record_url,record_id);return"Done";};}}}// Outbound ConferenceusingSystem;usingSystem.Collections.Generic;usingRestSharp;usingPlivo.API;namespaceconf_call{classProgram{staticvoidMain(string[]args){RestAPIplivo=newRestAPI("Your AUTH_ID","Your AUTH_TOKEN");IRestResponse&lt;Call&gt;resp=plivo.make_call(newDictionary&lt;string,string&gt;(){{"to","2222222222<3333333333"},// The phone number to which the call has to be placed{"from","1111111111"},// The phone number to be used as the caller id{"answer_url","http://example.com/response/conference/"},// The URL invoked by Plivo when the outbound call is answered{"answer_method","GET"}// The method used to call the answer_url});//Prints the message detailsConsole.Write(resp.Content);Console.ReadLine();}}}

To make the outbound calls, copy the last code sample into a text editor and save it as conference.py

Add your ‘from’ (source) phone number. This will show up as your Caller ID. Be sure that all phone numbers include country code, area code, and phone number without spaces or dashes (e.g. 14153336666).

Add your ‘to’ (destination) phone numbers. These are the phone numbers you wish to call to. To place calls in bulk, separate your destination phone numbers with the “<” character (e.g. 14156667777<14157778888<14158889999). Be sure that all phone numbers include country code, area code, and phone number without spaces or dashes (e.g. 14153336666).

Change the answer_url to example.com/response/conference which was created previously.

Create an Application

Give your application a name. Lets call it Conference Call. Enter your server URL (e.g., http://www.example.com/response/conference) in the Answer URL field and set the method as POST. See our Application API docs to learn how to modify your application through our APIs.

Click on Create to save your application.

Assign a Plivo number to your app

Navigate to the Numbers page and select the phone number you want to use for this app.

Select Conference Call (name of the app) from the Plivo App dropdown list.

Click on ‘Update’ to save.

If you don’t have a number, go to the Buy Number page to purchase a Plivo phone number.

Test it out

Whe you make a call to your Plivo number, you will hear the message and then you will be place into a conference.

Sample XML

<Response><Speak>You will now be placed into a demo conference. This is brought to you by Plivo. To know more visit us at plivo.com</Speak><Conferenceaction="https://www.example.com/response/conf_action/"callbackMethod="GET"callbackUrl="https://www.example.com/response/conf_callback/"enterSound="beep:2"method="GET"record="true"startConferenceOnEnter="true"endConferenceOnExit="true">demo
</Conference></Response>