Jump to content
KAZOOcon: hackathon signup and details here! ×

Search the Community

Showing results for tags 'resource'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Welcome to the 2600Hz Forums!
    • Forum Rules & Announcements
    • Upcoming Events: Come Meet Us!
    • 2600Hz News
    • Introductions
  • Platform Basics
    • Product Discussion
    • Tips and Feedback
    • Starting Out and Training
  • Advanced Topics
  • 2600Hz Mobile
    • 2600Hz Mobile
  • 2600Hz Open Source Developers
    • General OS Kazoo Questions
  • Vendor Discussion
    • Hardware Endpoints
    • PSTN, Software, and Services

Categories

  • 2600Hz Mobile
    • Sales and Marketing
  • Accounts Manager
    • User Resources
    • Sales and Marketing
  • Advanced Provisioner
    • Sales and Marketing
    • User Resources
  • Authentication
    • User Resources
    • Sales and Marketing
  • Billing and Transactions
  • Blocklist Numbers
    • Sales and Marketing
    • User Resources
  • Branding Manager
    • User Resources
    • Sales and Marketing
  • Callflows | Advanced Callflows
    • User Resources
    • Sales and Marketing
  • Call Center
    • Sales and Marketing
  • Call Recording
    • User Resources
    • Sales and Marketing
  • CallThru.us
    • User Resources
    • Sales and Marketing
  • Cluster Manager
    • Sales and Marketing
    • User Resources
  • comm.land Desktop User Portal
    • User Resources
    • Sales and Marketing
  • Conference Manager
    • User Resources
    • Sales and Marketing
  • CSV Onboarding
    • User Resources
    • Sales and Marketing
  • Debug Tool
  • Dial Plan Manager
    • User Resources
    • Sales and Marketing
  • Duo Integration
    • User Resources
    • Sales and Marketing
  • Dynamic Caller ID
    • User Resources
    • Sales and Marketing
    • Sales and Marketing
  • Fax Manager
    • Sales and Marketing
  • Integration | Connector Tools
    • User Resources
    • Sales and Marketing
  • Language Pack Editor
    • User Resources
    • Sales and Marketing
  • Migration Application
    • User Resources
    • Sales and Marketing
  • Number Manager
    • Sales and Marketing
    • User Resources
  • Operator Console
    • User Resources
    • Sales and Marketing
  • Operator Console Pro
    • User Resources
    • Sales and Marketing
  • PBX Connector
    • User Resources
    • Sales and Marketing
  • Pivot
    • User Resources
    • Sales and Marketing
  • Porting Manager
    • User Resources
    • Sales and Marketing
  • Reseller Reporting
    • Sales and Marketing
  • Smart PBX
    • User Resources
    • Video Tutorials
    • Sales and Marketing
  • T-Mobile
    • User Resources
    • Sales and Marketing
  • User Portal
    • User Resources
    • Sales and Marketing
  • Voicemail Manager
    • Sales and Marketing
  • WebHooks
    • Sales and Marketing
  • Websockets
    • Sales and Marketing
  • Zapier
    • User Resources
    • Sales and Marketing
  • General
    • How To Docs
    • General Notes

Calendars

  • Open Source Calendar
  • General Announcements
  • Industry Events

Categories

  • Open Source Community Contributions

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Full Name


About Me


Company Name


Job Role


Company Website


I am using Kazoo via:


I use Kazoo:

Found 3 results

  1. I have recently started to explore Kazoo for one of our official projects. Our goal is below To make an Outbound call to the PSTN number using Flowroute as Carrier at Kazoo from a web app After answering the call, run an IVR which instructions need to fetch from a web server using Pivot While trying to do a POC for this, first I was facing some difficulties due to the lack of specific documentation. Then I have started to communicate with the 2600hz developer forum and finally, I am able to meet my goal after applying suggestions from the forum. Now I am decided to document every step that I follow which may be helpful for others to implement the same flow. The following tasks need to be done which I will describe in detail later Setup Flowroute as a resource in Kazoo Setup an extension in callflows that has a Pivot as the action Create a clicktocall endpoint that connects to the created extension in step 2 Use created clicktocall endpoint in step 3 for making the PSTN call Prerequisite I have used kazoo crossbar API to accomplish my task. Almost for every request to Crossbar API, an authentication credential is required. Crossbar provides a number of ways of authenticating a request. The most common way is to authenticate as a user and receive a token usable on subsequent requests. In this method, you provide the credentials of your user just for login and crossbar will generate an authentication token in response. User credential is the MD5 hash of USERNAME:PASSWORD. For generating MD5 of a text in terminal I have used md5sum (in Linux) or md5 (in macOS) as following where I assume john as USERNAME and 12345 is PASSWORD. echo-n 'john:12345 | md5sum Output : 82a2dc91686ec828a67152d45a5c5ef7 Then I have called user_auth API to get an authentication token. Details of user_auth API request is as below URL : https://{SERVER}:8000/v2/user_auth Method : PUT Header : "Content-Type: application/json" Request Body : { "data": { "credentials": "82a2dc91686ec828a67152d45a5c5ef7", "account_name": "YOUR_ACCOUNT_NAME" }, "method": "[md5 | sha1]" } Use your generated MD5 output for the value of the credential and replace "YOUR_ACCOUNT_NAME" with your actual Kazoo Account Name. If the request body is correct, then it will give below success response { "auth_token": "{AUTH_TOKEN}", "data": { "account_id": "{ACCOUNT_ID}", "apps": [], "is_reseller": true, "language": "en-US", "owner_id": "{OWNER_ID}", "reseller_id": "{RESELLER_ID}" }, "node": "{API_NODE}", "request_id": "{REQUEST_ID}", "revision": "{REVISION}", "status": "success", "timestamp": "{TIMESTAMP}", "version": "{VERSION}", } Here{AUTH_TOKEN}, the authentication token, is a long list of characters that you need to use in future requests. Step 1: Setup Flowroute as a resource in Kazoo First, we need to add flowroute as a resource in the kazoo. There are two levels of resources, global (or system-wide), and per-account (or local). I have used local resources. URL : http://{SERVER}:8000/v2/accounts/{ACCOUNT_ID}/resources *** Please replace {ACCOUNT_ID} with your actual ACCOUNT_ID Method: PUT Header : 1 . "Content-Type: application/json" 2 . “X-Auth-Token: {AUTH_TOKEN}" *** Replace {AUTH_TOKEN} with the actual AUTH_TOKEN that you retrieved from user_auth API described in the above prerequisite section. Request Body { "data": { "name": "flowroute", "format_from_uri": true, "rules": [ ".{7,}" ], "flags": [ "Use_Flowroute" ], "formatters": { "from": [{ "regex": "\\+?1?(\\d{10})$", "direction": "outbound" }], "diversion":[{ "match_invite_format":true, "direction":"outbound" }], "outbound_caller_id_number": [{ "value": "YOUR_CALLER_ID_NUMBER" }], "outbound_caller_id_name": [{ "value": "YOUR_CALLER_ID_NAME" }] }, "gateways": [{ "caller_id_type": "external", "channel_selection": "ascending", "codecs": ["PCMU", "PCMA","OPUS"], "custom_sip_headers": {}, "emergency": false, "enabled": true, "endpoint_type": "sip", "format_from_uri": true, "invite_format": "route", "password": "YOUR_FLOWROUTE_PASSWORD", "prefix": "YOUR_FLOWROUTE_TECH_PREFIX*", "progress_timeout": "30", "realm": "us-east-nj.sip.flowroute.com", "server": "us-east-nj.sip.flowroute.com", "skype_rr": false, "suffix": "", "username": "YOUR_FLOWROUTE_USER_NAME" }] } } *** Replace YOUR_FLOWROUTE_USER_NAME with your actual Flowroute user name *** Replace YOUR_FLOWROUTE_PASSWORD with your actual Flowroute password *** Replace YOUR_FLOWROUTE_TECH_PREFIX with your actual Flowroute Tech Prefix followed by * *** Replace YOUR_CALLER_ID_NUMBER with your desired caller_id_number *** Replace YOUR_CALLER_ID_NAME with your desired caller_id_name *** If you use different Flowroute PoP other than “us-east-nj.sip.flowroute.com” then use your preferred PoP in “realm” and “server” fields. Step 2: Setup an extension in callflows that has a Pivot as the action URL : http://{SERVER}:8000/v2/accounts/{ACCOUNT_ID}/callflows *** Please replace {ACCOUNT_ID} with your actual ACCOUNT_ID Method: PUT Header : 1 . "Content-Type: application/json" 2 . “X-Auth-Token: {AUTH_TOKEN}" *** Replace {AUTH_TOKEN} with the actual AUTH_TOKEN that you retrieved from user_auth API described in above prerequisite section. Request Body { "data": { "numbers": ["1"], "flow": { "data": { "method": "GET", "req_timeout": "60", "req_format": "kazoo", "voice_url": "YOUR_PIVOT_API_URL", "debug": false }, "module": "pivot" } } } *** Replace "YOUR_PIVOT_API_URL" with your actual pivot API URL. Step 3: Create a clicktocall endpoint that connects to the created callflow of mentioned extension (value of numbers key in the request body) in step 2 Click-to-call allows you to create URLs that can be POSTed to with a phone number or SIP URI and create a phone call from the provided contact information to a destination you have pre-determined. I have created an clicktocall endpoint and connected it to the created extension in step 2 URL : http://{SERVER}:8000/v2/accounts/{ACCOUNT_ID}/clicktocall *** Please replace {ACCOUNT_ID} with your actual ACCOUNT_ID Method: PUT Header : 1 . "Content-Type: application/json" 2 . “X-Auth-Token: {AUTH_TOKEN}" *** Replace {AUTH_TOKEN} with the actual AUTH_TOKEN that you retrieved from user_auth API described in above prerequisite section. Request Body { "data": { "name": "call_1", "auth_required": false, "extension":"1", "caller_id_number":"YOUR_CALLER_ID_NUMBER" } } *** Replace YOUR_CALLER_ID_NUMBER with your desired caller_id_number Response { "auth_token":"{AUTH_TOKEN}", "data": { "auth_required": false, "custom_application_vars": {}, "extension": "{EXTENSION}", "id": "{C2C_ID}", "name": "{NAME}" }, "node": "{NODE_HASH}", "request_id": "{REQUEST_ID}", "revision": "{REVISION}", "status": "success", "timestamp": "{TIMESTAMP}", "version": "4.3.1" } We will use this "{C2C_ID}" in step 4 to make the actual outbound call Step 4: Use created clicktocall endpoint in step 3 for making the PSTN call URL : http://{SERVER}:8000/v2/accounts/{ACCOUNT_ID}/clicktocall/{C2C_ID}/connect?contact={CONTACT} *** Please replace {ACCOUNT_ID} with your actual ACCOUNT_ID , {C2C_ID} with the ID you got at step 3 and {CONTACT} with the PSTN number you want to call For example, if you want to make a call at the number 12223334444 then your URL should be as below http://{SERVER}:8000/v2/accounts/{ACCOUNT_ID}/clicktocall/{C2C_ID}/connect?contact=12223334444 Method: GET Header : 1 . "Content-Type: application/json" 2 . “X-Auth-Token: {AUTH_TOKEN}" *** Replace {AUTH_TOKEN} with the actual AUTH_TOKEN that you retrieved from user_auth API described in the above prerequisite section. You should receive a phone call now at the number you have called from your API and After answering the call, an IVR should be played whose callflow instructions will be fetched from your Pivot URL.
  2. I have recently started to investigate to figure out how I can instruct kazoo to route the call to my specified resource from Click2Call API. With suggestions from 2600hz community forum and after some trial & error, finally, I am able to design a solution to achieve this goal. Let’s first understand my goal in detail. For example, I have two remote PBX (asterisk1 & asterisk2) which I have added as resources in kazoo. Both asterisk1 and asterisk2 instances have the same extension 70003. Now if I use clicktocall for dialing 70003, how can I instruct kazoo from clicktocall so that it will dial 70003@asterisk1, not 70003@asterisk2? As I am calling ClicktoCall API from my web app and resource selection logic is also resides in my web app, somehow I need to tell ClicktoCall API which resource to route the call while invoking from the web app. To accomplish this, I have used The rules key on the resource which matches the number dialled. Actually, I have added a unique prefix before the regex pattern in the rules key for each resource. The rules key supports capture groups, in parenthesis. Those will throw away whatever is outside the parenthesis before sending it to the resource. As per my example, For the Asterisk1 resource, I am putting “1(.{5})” for the value of rules, and For the Asterisk2 resource, I am putting “2(.{5})” for the value of rules. So when my web app hits my clicktocall endpoint with the dialled extension of 270003, it will get sent through Asterisk server #2 as 70003. When my clicktocall executes 170003, it will send the call to 70003 on Asterisk server 1, etc. Resource Details Details of my resource setup are as below Asterisk1 { “data”: { “name”: “Asterisk1”, “format_from_uri”: true, “rules”: [ “1(.{5})” ], “flags”: [ “Use_Asterisk1” ], “weight_cost”: 60, “formatters”: { “diversion”: [ { “match_invite_format”: true, “direction”: “outbound” } ], “outbound_caller_id_number”: [ { “value”: “70001” } ], “outbound_caller_id_name”: [ { “value”: “kazoo” } ] }, “gateways”: [ { “caller_id_type”: “external”, “channel_selection”: “ascending”, “codecs”: [ “PCMU”, “PCMA”, “OPUS” ], “custom_sip_headers”: {}, “emergency”: false, “enabled”: true, “endpoint_type”: “sip”, “format_from_uri”: true, “invite_format”: “route”, “password”: “asterisk1_password”, “prefix”: “”, “progress_timeout”: 30, “realm”: “asterisk1_ip”, “server”: “asterisk1_ip”, “skype_rr”: false, “suffix”: “”, “username”: “asterisk1_username”, “force_port”: false, “port”: 5060 } ], “emergency”: false, “enabled”: true, “from_account_realm”: false, “grace_period”: 5, “rules_test”: [], “id”: “c1ad847e401cb9c7a3f264a2840b2fff” }, “revision”: “26-db769ea7891fb82a1d2425a2fe269814”, “timestamp”: “2021–11–01T20:20:14Z”, “version”: “4.3.140”, “node”: “yMeslQexQufV5c-zOCJ0Ow”, “request_id”: “d20e9b4223a47931f4d19b0a5012ddc8”, “status”: “success”, “auth_token”: “auth_token” } Asterisk 2 { “data”: { “name”: “Asterisk”, “format_from_uri”: true, “rules”: [ “2(.{5})” ], “flags”: [ “Use_Asterisk2” ], “weight_cost”: 70, “formatters”: { “diversion”: [ { “match_invite_format”: true, “direction”: “outbound” } ], “outbound_caller_id_number”: [ { “value”: “70001” } ], “outbound_caller_id_name”: [ { “value”: “kazoo” } ] }, “gateways”: [ { “caller_id_type”: “external”, “channel_selection”: “ascending”, “codecs”: [ “PCMU”, “PCMA”, “OPUS” ], “custom_sip_headers”: {}, “emergency”: false, “enabled”: true, “endpoint_type”: “sip”, “format_from_uri”: true, “invite_format”: “route”, “password”: “asterisk2_password”, “prefix”: “”, “progress_timeout”: 30, “realm”: “asterisk2_ip”, “server”: “asterisk2_ip”, “skype_rr”: false, “suffix”: “”, “username”: “asterisk2_username”, “force_port”: false, “port”: 5060 } ], “emergency”: false, “enabled”: true, “from_account_realm”: false, “grace_period”: 5, “rules_test”: [], “id”: “c1ad847e401cb9c7a3f264a2840b2fff” }, “revision”: “26-db769ea7891fb82a1d2425a2fe269814”, “timestamp”: “2021–11–01T20:20:14Z”, “version”: “4.3.140”, “node”: “yMeslQexQufV5c-zOCJ0Ow”, “request_id”: “d20e9b4223a47931f4d19b0a5012ddc8”, “status”: “success”, “auth_token”: “auth_token” } So if my web app decides, it needs to make call to 70003 extension of Asterisk1 instance, then it will append prefix 1 for Asterisk1 (Setup in rules for Asterisk1 described earlier) before the extension 70003 in the value of contact field. https://crossbarserver.tld/v2/accounts/5123456789098765432abcd/clicktocall/my_cool_pivot_c2c/connect?contact=170003 Similarly, if my web app decides, it needs to make call to 70003 extension of Asterisk2 instance,then it will append prefix 2 for Asterisk2 (Setup in rules for Asterisk1 described earlier) before the extension 70003 in the value of contact field. https://crossbarserver.tld/v2/accounts/5123456789098765432abcd/clicktocall/my_cool_pivot_c2c/connect?contact=270003
  3. A question was posed about how to set an offnet resource to match more than one regex pattern match in the rules[ ] array. There are 2 methods to achieve this behavior. Both (as far as I know) are acceptable, and vary only in readability. When viewing a carrier document in the offnet database in couch, you'll notice there is an array element for "rules". In the world of regular expressions, capture groups are separated by a pipe "|". So if you're looking for one regular expression to match more than one string, you can use the method listed below. In my example, I want this carrier to match a specific number in Italy, and also any calls to the Netherlands, country code 31. In order to match, the number must be exactly "+390805345208", OR +31 followed by at least 9 digits. "rules": [ "^\\+(390805345208)$|^\\+((31)\\d{9,})$" ] Looking above, this may be hard for some people to read, so it can also be written as 2 individual expressions because the rules element is an array: "rules": [ "^\\+(390805345208)$", "^\\+((31)\\d{9,})$" ]
×
×
  • Create New...