A tutorial on exporting data
Updated Jan. 3, 2012The Scenario
Mixpanel provides a robust API for exporting data. For purposes of this tutorial, we will assume you are measuring a "Player Created" event in a game. Below is the graph of the event in the Segmentation report:
This is the data we'll pull programatically.
The goal of this tutorial is to pull down the data points programmatically. We'll use PHP, but any language will do.
Get your project's key, and secret
To grab the data for the segmentation report, the first thing you'll need is your project's key and secret. These are available in the settings page of your account
Download a library for the language of your choice
Though you could craft an HTTP request manually using the details here, for this tutorial we'll use the PHP library. Data export libraries are available for Python, PHP, Ruby and Javascript.
Create a new instance of the Mixpanel class
Include the Mixpanel class either above the following code or by including it. Then create a new instance of it with your key and secret as constructor arguments. Using the key and secret from before as an example:
$api_key = 'a18776c73645814738da01a5130caf67';
$api_secret = 'c07c26e129c2ebb30e9d5439a24659d0';
$mp = new Mixpanel($api_key, $api_secret);
Choose your API endpoint
In this case, we just want the raw totals for a certain event, broken out by day. The best API endpoint to use for this is the Segmentation endpoint. The documentation tells us that the URI for this is "http://mixpanel.com/api/2.0/segmentation/." Any part of the URI that comes after "http://mixpanel.com/api/2.0/" (in this case, 'segmentation') is the identifier the library uses to identify the endpoint. It will be the first argument of the request() method. Note, it should be submitted as the only element of an array:
$endpoint = array('segmentation');
$data = $mp->request($endpoint,... //to be continued
Pick your parameters
The segmentation endpoint requires that you set the following parameters:
Parameters
| Required | Name | Type | Description |
| required | event | string |
The event that you wish to segment on. |
| required | from_date | string |
The date in yyyy-mm-dd format from which to begin querying for the event from. This date is inclusive. |
| required | to_date | string |
The date in yyyy-mm-dd format from which to stop querying for the event from. This date is inclusive. The date range may not be more than 30 days. |
In this case, the event is "Player Create", the from_date is "2011-11-06" and the to_date is "2011-11-08." These should be submitted as the second argument of request(), as an associative array:
$parameters = array(
'event' => 'Player Create',
'from_date' => '2011-11-06',
'to_date' => '2011-11-08',
)
$data = $mp->request($endpoint,$parameters);
Putting it all together
Here is the completed program
<!--?php
/*
* PHP library for Mixpanel data API -- http://www.mixpanel.com/
* Requires PHP 5.2 with JSON
*/
class Mixpanel
{
private $api_url = 'http://mixpanel.com/api';
private $version = '2.0';
private $api_key;
private $api_secret;
public function __construct($api_key, $api_secret) {
$this->api_key = $api_key;
$this->api_secret = $api_secret;
}
public function request($methods, $params, $format='json') {
// $end_point is an API end point such as events, properties, funnels, etc.
// $method is an API method such as general, unique, average, etc.
// $params is an associative array of parameters.
// See http://mixpanel.com/api/docs/guides/api/
if (count($params) < 1)
return false;
if (!isset($params['api_key']))
$params['api_key'] = $this->api_key;
$params['format'] = $format;
if (!isset($params['expire'])) {
$current_utc_time = time() - date('Z');
$params['expire'] = $current_utc_time + 100000; // Default 10 minutes
}
$param_query = '';
foreach ($params as $param => &$value) {
if (is_array($value))
$value = json_encode($value);
$param_query .= '&' . urlencode($param) . '=' . urlencode($value);
}
$sig = $this->signature($params);
$uri = '/' . $this->version . '/' . join('/', $methods) . '/';
$request_url = $uri . '?sig=' . $sig . $param_query;
$curl_handle=curl_init();
curl_setopt($curl_handle,CURLOPT_URL,$this->api_url . $request_url);
curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2);
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1);
$data = curl_exec($curl_handle);
curl_close($curl_handle);
return json_decode($data);
}
private function signature($params) {
ksort($params);
$param_string ='';
foreach ($params as $param => $value) {
$param_string .= $param . '=' . $value;
}
return md5($param_string . $this->api_secret);
}
}
//Insert Key and Secret
$api_key = 'a18776c73645814738da01a5130caf67';
$api_secret = 'c07c26e129c2ebb30e9d5439a24659d0';
//Create Mixpanel Object
$mp = new Mixpanel($api_key, $api_secret);
//Create single-entry array with API endpoint
$endpoint = array('segmentation');
//Create array of properties to send
$parameters = array(
'event' => 'Player Create',
'from_date' => '2011-11-06',
'to_date' => '2011-11-08'
);
//Make the request
$data = $mp->request($endpoint,$parameters);
//print the result
print_r($data);
?>
Understanding the returned data
Most libraries return the results as an object. Here is the printed display of the object returned for our query:
stdClass Object
(
[legend_size] => 1
[data] => stdClass Object
(
[series] => Array
(
[0] => 2011-11-06
[1] => 2011-11-07
[2] => 2011-11-08
)
[values] => stdClass Object
(
[Player Create] => stdClass Object
(
[2011-11-06] => 3592
[2011-11-07] => 4052
[2011-11-08] => 7137
)
)
)
)
The API returned the event totals for the three days that we queried it for.
