Kazoo Rating Engine
Build Your Own Rating Engine
Here are the steps to easily add your own rating engine to Kazoo (and bypass the HotOrNot WhApp).
How calls are rated in Kazoo
When a new call is received in the ecallmgr
application, a rating request is published onto the AMQP bus. Any application bound for those rate request events will receive the JSON payload and can optionally respond with a rate response. The first valid response received will be the rate applied to the call.
Rate Request JSON
Kazoo generates a rate request payload published onto the callmgr exchange with a routing key of rate.req. The JSON payload will look something along the lines of:
Rate Request JSON:
{To-DID:+14158867900
,Call-ID:abc123def456ghi789
,Event-Category:rate
,Event-Name:req
,Msg-ID:msg_id_9876
,Server-ID:amqp_queue_name
,App-Name:sending_app
,App-Version:sending_app_ver
,Node:ecallmgr@host.com
,Account-ID:qwerty1234567890
,From-DID:+14158867915
,Options:[]
,Direction:inbound
}
Description of the Rate Request JSON payload:
Value : Required
To-DID: The dialed number
The dialed number off the INVITE
Yes
Call-ID: The unique identifier for this channel
String: Yes
Event-Category: The class of event
Rate: Yes
Event-Name: The name of the event
Req: Yes
Msg-ID: The ID of this rate request message
String: Yes
Server-ID: The name of the AMQP queue of the sender, empty if no response is needed
String: Yes
App-Name: The name of the application that published the request
String: Yes
App-Version: The version of the application that published the request
String: Yes
Node: The **Erlang** VM node name of the sender
String: Yes
Options: Arbitrary list of strings set by sender, usually used by receiving to filter list of applicable rates
List of strings: No
Direction
The direction of the call, relative to Kazoo; outbound: meaning from Kazoo to the endpoint and inbound: meaning from the endpoint to Kazoo inbound/ outbound:No
“ Account-ID: The Kazoo account ID associated with this cal (if any) String: No From-DID : The Caller ID number (if available) String: No
## Route Response JSON
Any application which receives rate requests and wishes to respond will need to publish the response to the targeted exchange using the Server-ID from the rate request payload as the routing key. Assuming the request above, a potential response would be constructed thusly:
**Rate Response JSON:**
{Rate:0.05
,Call-ID:abc123def456ghi78
,Rate-Increment:60
,Rate-Minimum:60
,Discount-Percentage:0
,Surcharge:1.00
,Rate-Name:expensive_rate
,Base-Cost:1.05
,Msg-ID:msg_id_9876
,Update-Callee-ID:true
,Event-Category:rate
,Event-Name:resp
,App-Name:hotornot
,App-Version:1.0.0
,Server-ID:
,Node:whistle_apps@host.com
}
Description of the Rate Response JSON payload:
Value: Required
Rate: The cost of the rate
Float: Yes
Call-ID: Identifier of the channel
String:Yes
Event-Category: Class of message
Rate:Yes
Event-Name: Name of the message type
Resp: Yes
App-Name: Name of the responding application
String: Yes
App-Version: Version of the responding application
String: Yes
Msg-ID: The ID from the request payload that identifies the request message
String: Yes
Node: The responder's node (useful mostly for debugging)
String: Yes
Server-ID: Empty, since no response to this message will be sent
Rate-Increment: How many seconds before Rate is applied
Integer (defaults to 60): No
Rate-Minimum: Minimum number of seconds to bill the call for, regardless of call duration
Integer, defaults to 60: No
Discount-Percentage: Apply a discount to the cost of the call
Integer: No
Surcharge: Flat amount to bill the call (in addition to per-minute charges)
Float: No
Rate-Name: Arbitrary name for the rate
String: No
Base-Cost: (Rate * (Rate-Minimum div 60)) + Rate-Surcharge
Float: No
Update-Caller-ID: If `true`, will prepend the Callee ID name with the rate of the call
Boolean, defaults to `false`: No
Rate Field
The rate
fields (Rate, Rate-Increment, etc) will be set on the channel and available in the
Custom-Channel-Vars of the resulting CDR. A simple formula is used to calculate the cost of the call:
R = Rate
RI = Rate-Increment
RM = Rate-Minimum
Sur = Surcharge
Secs = Billing Seconds
When RM 60 = Sur + ((RM / 60) * R)
When RM = 60 = Sur + ((RM / 60) * R) + ceiling((Secs - RM) / RI) * ((RI / 60) * R)))