Querying the Reporting API

This guide explains how to call the Piwik API to request your web analytics data. There are two methods:

Call the Piwik API using the HTTP API over HTTP

If you want to request data in any language (PHP, Python, Ruby, ASP, C++, Java, etc.) you can use the HTTP API. It is a simple way to request data via standard HTTP GET.

Security Notice: if the API call requires the token_auth and the HTTP request is sent over untrusted networks, we highly advise that you use an encrypted request. Otherwise, your token_auth is exposed to eavesdroppers. This can be done using https instead of http. In the following example, replace the string "http" by "https".

You can, for example, get your top 100 search engine keywords used to find your website during the current week. Here is an example in PHP:

<?php
exit; // REMOVE this line to run the script

// this token is used to authenticate your API request. 
// You can get the token on the API page inside your Piwik interface
$token_auth = 'anonymous';

// we call the REST API and request the 100 first keywords for the last month for the idsite=7
$url = "http://demo.piwik.org/";
$url .= "?module=API&method=Referrers.getKeywords";
$url .= "&idSite=7&period=month&date=yesterday";
$url .= "&format=PHP&filter_limit=20";
$url .= "&token_auth=$token_auth";

$fetched = file_get_contents($url);
$content = unserialize($fetched);

// case error
if (!$content) {
    print("Error, content fetched = " . $fetched);
}

print("<h1>Keywords for the last month</h1>");
foreach ($content as $row) {
    $keyword = htmlspecialchars(html_entity_decode(urldecode($row['label']), ENT_QUOTES), ENT_QUOTES);
    $hits = $row['nb_visits'];

    print("<b>$keyword</b> ($hits hits)<br>");
}

Here is the output of this code:

<h1>Keywords for the last month</h1><b>Keyword not defined</b> (12955 hits)<br><b>xxxxxxxxxxxx.com</b> (20 hits)<br><b>http://forum.piwik.org/read.php?2,87124</b> (5 hits)<br><b>piwik forum</b> (5 hits)<br><b>xxxxxxxxxxxx com</b> (4 hits)<br><b>piwik</b> (3 hits)<br><b>protocol https not supported or disabled in libcurl</b> (3 hits)<br><b>remote_addr not set</b> (3 hits)<br><b>unique pageviews</b> (3 hits)<br><b>www.xxxx</b> (3 hits)<br><b>xxx_com</b> (3 hits)<br><b>1.1.1/login.html</b> (2 hits)<br><b>downloads anzeigen</b> (2 hits)<br><b>gg racing</b> (2 hits)<br><b>how to active pdo in xamp</b> (2 hits)<br><b>http://www.googleadservices.com/pagead/aclk?sa=l</b> (2 hits)<br><b>log-analytics/import_logs.py&quot;, line 1718, in &lt;module&gt;     config = configuration()</b> (2 hits)<br><b>magento doesn&#039;t load</b> (2 hits)<br><b>phpinfo doesn&#039;t show anything jetty</b> (2 hits)<br><b>piwik buch</b> (2 hits)<br>

Call the Piwik API in PHP

If you want to request data in a PHP script that is on the same server as Piwik, you can use this simple technique. This is a more efficient solution as it doesn't require network calls. You directly call the PHP Piwik runtime and get the PHP data structure back.

If you are developing a plugin, you have to use this technique.

<?php
use Piwik\API\Request;
use Piwik\FrontController;

define('PIWIK_INCLUDE_PATH', realpath('../..'));
define('PIWIK_USER_PATH', realpath('../..'));
define('PIWIK_ENABLE_DISPATCH', false);
define('PIWIK_ENABLE_ERROR_HANDLER', false);
define('PIWIK_ENABLE_SESSION_START', false);

// if you prefer not to include 'index.php', you must also define here PIWIK_DOCUMENT_ROOT
// and include "libs/upgradephp/upgrade.php" and "core/Loader.php"
require_once PIWIK_INCLUDE_PATH . "/index.php";
require_once PIWIK_INCLUDE_PATH . "/core/API/Request.php";

FrontController::getInstance()->init();

// This inits the API Request with the specified parameters
$request = new Request('
			module=API
			&method=UserSettings.getResolution
			&idSite=7
			&date=yesterday
			&period=week
			&format=XML
			&filter_limit=3
			&token_auth=anonymous
');
// Calls the API and fetch XML data back
$result = $request->process();
echo $result;

Here is the output of this script:

<?xml version="1.0" encoding="utf-8" ?>
<result>
	<row>
		<label>1920x1080</label>
		<nb_visits>962</nb_visits>
		<nb_actions>2158</nb_actions>
		<max_actions>39</max_actions>
		<sum_visit_length>164580</sum_visit_length>
		<bounce_count>623</bounce_count>
		<nb_visits_converted>28</nb_visits_converted>
		<sum_daily_nb_uniq_visitors>842</sum_daily_nb_uniq_visitors>
	</row>
	<row>
		<label>1366x768</label>
		<nb_visits>592</nb_visits>
		<nb_actions>1181</nb_actions>
		<max_actions>24</max_actions>
		<sum_visit_length>77934</sum_visit_length>
		<bounce_count>428</bounce_count>
		<nb_visits_converted>19</nb_visits_converted>
		<sum_daily_nb_uniq_visitors>540</sum_daily_nb_uniq_visitors>
	</row>
	<row>
		<label>1280x1024</label>
		<nb_visits>368</nb_visits>
		<nb_actions>886</nb_actions>
		<max_actions>50</max_actions>
		<sum_visit_length>89883</sum_visit_length>
		<bounce_count>225</bounce_count>
		<nb_visits_converted>10</nb_visits_converted>
		<sum_daily_nb_uniq_visitors>304</sum_daily_nb_uniq_visitors>
	</row>
</result>