NAV Navbar
Logo
php csharp python

Introduction

Welcome to DataForSEO API!

DataForSEO API uses REST technology for interchanging data between your application and our service. The data exchange is made by the HTTP protocol. The benefit of this method is widespread occurrence of the HTTP protocol that’s why REST API can be used almost for all programming languages.

You can create REST class by yourself or find ready to use ones to use this technology. We can provide you with ready to use classes:

Language Description
PHP Simple Rest Client PHP REST Client build with cURL. Author Fabio Agostinho Boris.
Python Simple Rest Client Python REST Client. Author DataForSEO.
C# DataForSEO Client C# DataForSEO Ready Client. Author DataForSEO.

We will show PHP and Python examples of these classes usage.

You can download usage examples from our website:

Language Description
PHP Examples PHP examples.
Python Examples Python examples.
C# Examples C# examples.
POSTMAN Examples POSTMAN examples.
POSTMAN Documenter Online POSTMAN Documenter.

All data exchange should be UTF-8 encoded.

Also, all responses of our service are returned in the JSON format by default. We also support responses in the XML format. For this, in the end of the request you should specify .xml.

For example,
https://api.dataforseo.com/v2/cmn_user.xml
instead of the standard
https://api.dataforseo.com/v2/cmn_user

Authentication

To authorize, use this code:

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com/', null, 'login', 'password');

    //do something

} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
    exit();
}
?>
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task cmn_key_id()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };

            // do something
        }
    }
}
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")

#do something

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

First of all, you should register at our service and then you will be able to use your login and password to start using our API service.

DataForSEO API uses technology Basic Authentication.

It provides you with a possibility to use our API almost for all programming languages.

Rank Tracker API

Rank Tracker API helps to find rankings of a website in the result pages of the search engines that were specified.

The data will look like:

The tasks setting is made by few clients streams. At the same time few other clients streams constantly request our service to pick completed tasks from queue.

It is the most simplified and widespread method of work with Rank Tracker API.

You also can receive results of completed tasks using task_id or we can send them by ourselves as soon as they are ready if you specify postback_url or pingback_url when setting a task.

The time of results delivery depends on task priority and overall system load. Usually, it takes a short time (2 minutes on average per day). However, it might be longer in the span of 1 a.m. to 6 a.m. GMT.

The time of results delivery is less for those tasks which priority is high.

Setting Rank Tasks

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com/', null, 'login', 'password');
} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
    exit();
}


$post_array = array();

//for example, some data selection cycle for tasks
for ($i = 0; $i < 3; $i++) {

    // example #1 - the simplest one
    // you set only a website URL and a search engine URL.
    // This search engine URL string will be searched, compared to our internal parameters
    // and used as:
    // "se_id", "loc_id", "key_id" ( actual and fresh list can be found here: "se_id":
    // https://api.dataforseo.com/v2/cmn_se , "loc_id": https://api.dataforseo.com/v2/cmn_locations ) (see example #3 for details)
    // If a task was set successfully, this *_id will be returned in results: 'v2/rnk_tasks_post' so you can use it.
    // The setting of a task can fail, if you set not-existent search engine, for example.
    // Disadvantages: You cannot work with "map pack", "maps", "mobile"
    $my_unq_id = mt_rand(0,30000000); //your unique ID. We will return it with all results
    $post_array[$my_unq_id] = array(
    "priority" => 1,
    "site" => "ranksonic.com",
    "url" => "https://www.google.co.uk/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
    );

    // example #2 - will return results faster than #1, but is simpler than example #3
    // All parameters should be set in the text format.
    // All data will will be searched, compared to our internal parameters
    // and used as:
    // "se_id", "loc_id", "key_id" ( actual and fresh list can be found here: "se_id": https://api.dataforseo.com/v2/cmn_se ,
    // "loc_id": https://api.dataforseo.com/v2/cmn_locations )
    // If a task was set successfully, this *_id will be returned in results: 'v2/rnk_tasks_post' so you can use it.
    // The setting of a task can fail, if you set not-existent search engine, for example.
    // Disadvantages: The process of search and comparison of provided data to our internal parameters may take some time.
    $my_unq_id = mt_rand(0,30000000); //your unique ID. will be returned with all results
    $post_array[$my_unq_id] = array(
    "priority" => 1,
    "site" => "ranksonic.com",
    "se_name" => "google.co.uk",
    "se_language" => "English",
    "loc_name_canonical"=> "London,England,United Kingdom",
    "key" => mb_convert_encoding("online rank checker", "UTF-8")
    );

    // example #3 - the fastest one. All parameters should be set in our internal format.
    // Actual and fresh list can be found here: "se_id": https://api.dataforseo.com/v2/cmn_se ,
    // "loc_id": https://api.dataforseo.com/v2/cmn_locations
    $my_unq_id = mt_rand(0,30000000); //your unique ID. We will return it with all results
    $post_array[$my_unq_id] = array(
    "priority" => 1,
    "site" => "ranksonic.com",
    "se_id" => 22,
    "loc_id" => 1006886,
    "key_id" => 1095202
    );

    //This example has a cycle of up to 3 elements, but in the case of large number of tasks - send up to 100 elements per POST request
    if (count($post_array) > 99) {
        try {
            // POST /v2/rnk_tasks_post/$data
            // $tasks_data must by array with key 'data'
            $task_post_result = $client->post('v2/rnk_tasks_post', array('data' => $post_array));
            print_r($task_post_result);

            //do something with post results

            $post_array = array();
        } catch (RestClientException $e) {
            echo "\n";
            print "HTTP code: {$e->getHttpCode()}\n";
            print "Error code: {$e->getCode()}\n";
            print "Message: {$e->getMessage()}\n";
            print  $e->getTraceAsString();
            echo "\n";
        }
    }
}

if (count($post_array) > 0) {
    try {
        // POST /v2/rnk_tasks_post/$data
        // $tasks_data must by array with key 'data'
        $task_post_result = $client->post('v2/rnk_tasks_post', array('data' => $post_array));
        print_r($task_post_result);

        //do something with post results

    } catch (RestClientException $e) {
        echo "\n";
        print "HTTP code: {$e->getHttpCode()}\n";
        print "Error code: {$e->getCode()}\n";
        print "Message: {$e->getMessage()}\n";
        print  $e->getTraceAsString();
        echo "\n";
    }
}

$client = null;
?>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task rnk_tasks_post()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };
            var rnd = new Random();
            var postObject = new Dictionary<int, object>
            {
                [rnd.Next(1, 30000000)] = new
                {
                    priority = 1,
                    site = "ranksonic.com",
                    url = "https://www.google.co.uk/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
                },
                [rnd.Next(1, 30000000)] = new
                {
                    priority = 1,
                    site = "ranksonic.com",
                    se_name = "google.co.uk",
                    se_language = "English",
                    loc_name_canonical = "London,England,United Kingdom",
                    key = "online rank checker"
                },
                [rnd.Next(1, 30000000)] = new
                {
                    priority = 1,
                    site = "ranksonic.com",
                    se_id = 22,
                    loc_id = 1006886,
                    key_id = 1095202
                }
            };
            var taskPostResponse = await httpClient.PostAsync("v2/rnk_tasks_post", new StringContent(JsonConvert.SerializeObject(new { data = postObject })));
            var obj = JsonConvert.DeserializeObject<dynamic>(await taskPostResponse.Content.ReadAsStringAsync());
            if (obj.status == "error")
                Console.WriteLine($"error. Code: {obj.error.code} Message: {obj.error.message}");
            else
            {
                foreach (var result in obj.results)
                {
                    var taskState = ((IEnumerable<dynamic>)result).First();
                    if (taskState.status == "error")
                        Console.WriteLine($"Error in task with post_id {taskState.post_id}. Code: {taskState.error.code} Message: {taskState.error.message}");
                    Console.WriteLine(taskState);
                }
            }
        }
    }
}
from random import Random
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")
rnd = Random()
post_data = dict()
post_data[rnd.randint(1, 30000000)] = dict(
    priority=1,
    site="ranksonic.com",
    url="https://www.google.co.uk/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
)
post_data[rnd.randint(1, 30000000)] = dict(
    priority=1,
    site="ranksonic.com",
    se_name="google.co.uk",
    se_language="English",
    loc_name_canonical="London,England,United Kingdom",
    key="online rank checker"
)
post_data[rnd.randint(1, 30000000)] = dict(
    priority=1,
    site="ranksonic.com",
    se_id=22,
    loc_id=1006886,
    key_id=1095202
)

response = client.post("/v2/rnk_tasks_post", dict(data=post_data))
if response["status"] == "error":
    print("error. Code: %d Message: %s" % (response["error"]["code"], response["error"]["message"]))
else:
    print(response["results"])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "0.6490 sec.",
    "results_count": 9,
    "results": {
        "11913049": {
            "post_id": 11913049,
            "post_key": "",
            "post_site": "ranksonic.com",
            "task_id": 404227822,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "20469414": {
            "post_id": 20469414,
            "post_key": "online rank checker",
            "post_site": "ranksonic.com",
            "task_id": 404227823,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "6273173": {
            "post_id": 6273173,
            "post_key": "",
            "post_site": "ranksonic.com",
            "task_id": 404227824,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "27408598": {
            "post_id": 27408598,
            "post_key": "",
            "post_site": "ranksonic.com",
            "task_id": 404227825,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "19840083": {
            "post_id": 19840083,
            "post_key": "online rank checker",
            "post_site": "ranksonic.com",
            "task_id": 404227826,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "6054604": {
            "post_id": 6054604,
            "post_key": "",
            "post_site": "ranksonic.com",
            "task_id": 404227827,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "8626195": {
            "post_id": 8626195,
            "post_key": "",
            "post_site": "ranksonic.com",
            "task_id": 404227828,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "18786140": {
            "post_id": 18786140,
            "post_key": "online rank checker",
            "post_site": "ranksonic.com",
            "task_id": 404227829,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "13056693": {
            "post_id": 13056693,
            "post_key": "",
            "post_site": "ranksonic.com",
            "task_id": 404227830,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        }
    }
}

When we were developing the mechanism of tasks setting we tried to foresee many variations for your convenience. That’s why the range of fields is wide even though some of them are optional. Because of such flexibility for tasks settings it may seem that the process is difficult, but the things are simpler than you think.

We are sure that you will be able to pick the way of task setting that fits you the most.

All POST data should be sent in the JSON format (UTF-8 encoding). The task setting is done using POST method when array of tasks is sent in data field. We recommend to set up to 100 tasks at a time. Such limit was set because of the variations of tasks settings that you will use. If you use the field url then the processing of each task will take more time. If you use our identifiers (se_id, loc_id, key_id) then the processing of tasks will be made faster and you can set more than 100 elements at a time. Each of array elements has such structure:

Name of a field Type Description
priority integer execution priority
optional field
can have such values:
1 - normal execution priority (set by default)
2 - high execution priority
site string a website domain which rankings should be searched for in the SERP
required field
you can use wildcard (‘*’) to specify the search mask in the SERP. But if you decide to use a wildcard and want to include subdomains to the search then you should also specify it using wildcard.
examples:
   “example.com” (standard search)
   “example.com/eng/*” (search example.com and URLs which start with ‘/eng/’ in the SERP, such as ‘example.com/eng/index.html’ and ‘example.com/eng/help/’ etc)
   “*.example.com/eng/*” (search example.com and all its subdomain with URLs which start with ‘/eng/’ in the SERP such as ‘m.example.com/eng/index.html’ and ‘example.com/eng/some_url/’ etc.)
url string direct URL of a search query
optional field
you can specify a direct URL and we will sort it out to the necessary fields. Such method is the most difficult for our API processing and you should exactly specify language and location in the URL. We don’t recommend to use this method.
example:
https://www.google.co.uk/search?q=%20rank%20tracker%20api&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20
se_id integer search engine id
optional field, if you specify se_name
you must choose one of the fields se_id or se_name
the list of available search engines with their se_id you can get by separate request List of Search Engines
also, when the information about set task is returned you will get se_id
se_name string search engine domain
optional field if you specify se_id
you must choose one of the fields se_id or se_name
the list of available search engines with se_name you can get by separate request List of Search Engines
example: “google.co.uk”
se_language string search engine language
required field if se_id is not specified
the list of available search engines with their se_language you can get by separate request List of Search Engines
example: “English”
loc_id integer search engine location id
optional field if you specify loc_name_canonical
you must choose one of the fields loc_id or loc_name_canonical
the list of available locations of search engines with their loc_id you can receive by separate request List of Locations
when the information about set task is returned you will get loc_id
please notice that we use Google Geographical Targeting, that’s why you can specify in the field loc_id appropriate Criteria ID
loc_name_canonical string full name of search engine location
optional field if you specify loc_id
you must choose one of the fields loc_id or loc_name_canonical
the list of available locations of search engines with their loc_name_canonical you can receive by separate request List of Locations
please notice that we use Google Geographical Targeting, that’s why you can specify in the field loc_name_canonical approriate to Canonical Name
example: “London,England,United Kingdom”
key_id integer keyword id
optional field if you specify key
when you set a task for the first time you won’t be able to know this field. But if you plan to collect rankings for this keyword we recommend you to save key_id returned after the task was set and use this field in the future.
key string keyword
optional field if you specify key_id
UTF-8 encoding
all %## will be decoded (plus symbol ‘+’ will be decoded to a space character)
if you need to use the “%” symbol for your key, please specify it as “%25”.

if this field contains ‘site:’ or ‘inurl:’ then the charge per task will be multiplied by 10.
se_param_add string additional parameters of search query
optional field
for example, if you want to disable auto correction of misspelling in the search query for google, you can specify “&nfpr=1”
postback_url string return URL for sending task results
optional field
if you specify this URL there will be no need to pick up tasks using Get Rank Tasks Results. We will send a result of a completed task by POST request for URL as soon as a task is completed.
pingback_url string notification URL of a completed task
optional field
when a task is completed we will notify you by GET request sent to the URL you have specified
you can use string ‘$task_id’ as $task_id variable and ‘$post_id’ as $post_id variable. we will set necessary values before sending of a request. for example:
  http://your-server.com/pingscript?taskId=$task_id
  http://your-server.com/pingscript?taskId=$task_id&postId=$post_id

As a response of API server you will receive JSON array in the field results of which there will be an information appropriate to the set tasks.

Name of a field Type Description
status string general result
“ok” - successful
“error” - error
if status=“error”, then you can see more detailed information of array error error
error array informational array of error
only if status=“error”
the list of possible errors can be found below.
      code integer error code
      message string text description of an error
results_time string execution time, seconds
results_count string number of elements in the array of results results
results array results array of tasks setting
            task_id integer unique task identifier in our system
in the future you will be able to use it within 30 days to request results of this task any time.
            status string results of this task setting
“ok” - successful
“error” - error
if status=“error”, then you can see more detailed information of array error error
            error array informational array of error
only if status=“error”
the list of possible errors can be found below.
                  code integer error code
                  message string text description of an error
            post_id string index in the array received in a POST request
            post_site string site received in a POST request
            post_key string key received in a POST request
if you send key_id without passing key it will be empty
keyword is returned with decoded %## (plus symbol ‘+’ will be decoded to a space character)
            se_id integer search engine id
if status=“ok”, then this field will be always filled
You can use it for finding relations between your and our search engines.
            loc_id integer search engine location id
if status=“ok”, then this field will always be filled
You can use it for finding relations between your and our search engines.
            key_id integer keyword id in our system
if you plan to use this keyword in the future we recommend you to save this id and use it when you set a task as key_id

Possible errors codes

Error Code Meaning
404 “not found or not enough data: site” - you didn’t specify a website in the task
404 “not found or not enough data: search engine” - you’ve specified nonexistent se_id or a search engine wasn’t found by specified se_name
404 “not found or not enough data: location” - you’ve specified nonexistent loc_id or a location of a search engine wasn’t found by specified loc_name_canonical
404 “not enough data: keyword” - you didn’t specify a keyword in the task
501 “invalid ‘data’ field” - probably you haven’t passed data for the tasks in the field data. POST data should be represented as an array and added to the field data: array(‘data’ => $post_array_for_tasks)
501 “invalid data” - Data in the field data isn’t an array with the required structure.
500 “internal error” - some internal error. We did our best to not let this type of error ever happen.

Get Rank Tasks Results

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com', null, 'login', 'password');
} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
}

/*
#1 - get ALL ready results
recommended use of getting results:
run this script by cron with 10-60 streams, every minute with random delay 0-30 sec.
usleep(mt_rand(0,30000000));
*/
try {
    //GET /v2/rnk_tasks_get
    $task_get_result = $client->get('v2/rnk_tasks_get');
    print_r($task_get_result);

    //do something with results

} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
}


/*
#2 - get one result by task_id
*/
try {

    // GET /api/v1/tasks_get/$task_id
    $task_get_result = $client->get('v2/rnk_tasks_get/123456789');
    print_r($task_get_result);

    //do something with result

} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
}

$client = null;
?>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task rnk_tasks_get()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = {Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password")))}
            };

            var response = await httpClient.GetAsync("v2/rnk_tasks_get");
            var obj = JsonConvert.DeserializeObject<dynamic>(await response.Content.ReadAsStringAsync());
            if (obj.status == "error")
                Console.WriteLine($"error. Code: {obj.error.code} Message: {obj.error.message}");
            else if (obj.results_count != 0)
            {
                foreach (var result in obj.results)
                {
                    var resultItem = ((IEnumerable<dynamic>) result).First();
                    Console.WriteLine(resultItem);
                }
            }
            else
                Console.WriteLine("no results");

            var taskid = 123456789;
            response = await httpClient.GetAsync($"v2/rnk_tasks_get/{taskid}");
            obj = JsonConvert.DeserializeObject<dynamic>(await response.Content.ReadAsStringAsync());
            if (obj.status == "error")
                Console.WriteLine($"error. Code: {obj.error.code} Message: {obj.error.message}");
            else if (obj.results_count != 0)
            {
                foreach (var result in obj.results)
                {
                    var resultItem = ((IEnumerable<dynamic>)result).First();
                    Console.WriteLine(resultItem);
                }
            }
            else
                Console.WriteLine("no results");
        }
    }
}
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")
response = client.get("/v2/rnk_tasks_get")
if response["status"] == "error":
    print("error. Code: %d Message: %s" % (response["error"]["code"], response["error"]["message"]))
else:
    print(response["results"])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "0.0549 sec.",
    "results_count": 3,
    "results": {
        "organic": [
            {
                "post_id": 2833944,
                "task_id": 405460981,
                "se_id": 22,
                "loc_id": 1006886,
                "key_id": 1095202,
                "post_key": null,
                "post_site": "ranksonic.com",
                "result_datetime": "2016-12-13 15:33:07 +02:00",
                "result_position": 2,
                "result_url": "https:\/\/ranksonic.com\/",
                "result_title": "RankSonic ⓴⓰ - Rank Tracking SEO software. Website ranking SEO ...",
                "result_snippet_extra": "Rating: 4.6 - ‎6,054 reviews",
                "result_snippet": "⓴⓰ Rank Tracking SEO Software - Keyword Google online search engine seo \n... Check what potential your keywords have to evaluate their competition level.",
                "results_count": 4690000,
                "result_extra": "videos",
                "result_spell": "",
                "result_se_check_url": "https:\/\/google.co.uk\/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
            },
            {
                "post_id": 22195544,
                "task_id": 405460979,
                "se_id": 22,
                "loc_id": 1006886,
                "key_id": 1095202,
                "post_key": "online rank checker",
                "post_site": "ranksonic.com",
                "result_datetime": "2016-12-13 15:32:58 +02:00",
                "result_position": 2,
                "result_url": "https:\/\/ranksonic.com\/",
                "result_title": "RankSonic ⓴⓰ - Rank Tracking SEO software. Website ranking SEO ...",
                "result_snippet_extra": "Rating: 4.6 - ‎6,054 reviews",
                "result_snippet": "⓴⓰ Rank Tracking SEO Software - Keyword Google online search engine seo \n... Check what potential your keywords have to evaluate their competition level.",
                "results_count": 4810000,
                "result_extra": "videos",
                "result_spell": "",
                "result_se_check_url": "https:\/\/google.co.uk\/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
            },
            {
                "post_id": 9084390,
                "task_id": 405460980,
                "se_id": 22,
                "loc_id": 1006886,
                "key_id": 1095202,
                "post_key": null,
                "post_site": "ranksonic.com",
                "result_datetime": "2016-12-13 15:32:58 +02:00",
                "result_position": 2,
                "result_url": "https:\/\/ranksonic.com\/",
                "result_title": "RankSonic ⓴⓰ - Rank Tracking SEO software. Website ranking SEO ...",
                "result_snippet_extra": "Rating: 4.6 - ‎6,054 reviews",
                "result_snippet": "⓴⓰ Rank Tracking SEO Software - Keyword Google online search engine seo \n... Check what potential your keywords have to evaluate their competition level.",
                "results_count": 4690000,
                "result_extra": "videos",
                "result_spell": "",
                "result_se_check_url": "https:\/\/google.co.uk\/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
            }
        ],
        "paid": [
        ]
    }
}

You can receive results in three different ways:

  1. GET https://api.dataforseo.com/v2/rnk_tasks_get
    you will receive all complete results that have not been picked up.
  2. GET https://api.dataforseo.com/v2/rnk_tasks_get/$task_id
    after you’ve set a task there will be unique identifier returned to you in the response of our service. It is specified in the field task_id. You will be able to use it within 30 days to pick the results of the task.
  3. When setting a task (Setting Rank Tasks) you’ve specified pingback_url or postback_url. As soon as the task is completed we will send GET request to the URL you’ve specified as pingback_url or POST request with its results to the URL you specified as postback_url when the task was set.

You will receive array from the API server in the field results where you will find rank tracker results.

Name of a field Type Description
status string general result
“ok” - successful
“error” - error
if status=“error”, then you can see more detailed information of array error error
error array informational array of error
only if status=“error”
the list of possible errors can be found below.
      code integer error code
      message string text description of an error
results_time string execution time, seconds
results_count string number of elements in the array of results results
results array results array of tasks
      organic array results array of organic SERP
            task_id integer unique task identifier in our system
in the future you will be able to use it within 30 days to request results of this task any time.
            post_id string index in the array received in a POST array
            post_site string site received in a POST array
            post_key string keyreceived in a POST array
if you send key_id without passing keyit will be empty
keyword is returned with decoded %## (plus symbol ‘+’ will be decoded to a space character)
            se_id integer search engine id
You can use it for finding relations between your and our search engines.
            loc_id integer search engine location id
You can use it for finding relations between your and our search engines.
            key_id integer keyword id in our system
if you plan to use this keyword in the future we recommend you to save this id and use it when you set a task as key_id
            result_position integer position in the SERP
            result_datetime string date and time when a result was received
in the format “year-month-date:minutes:GMT_difference_hours:GMT_difference_minutes”
for example: “2016-12-13 15:30:34 +02:00”
time zone specified at your profile settings is used
            result_url string relevant URL in the SERP
            result_title string snippet header in the SERP
            result_snippet_extra string additional snippet in the SERP
ratings, price, author, etc
            result_snippet string snippet in the SERP
            results_count integer total number of results in the SERP
            result_extra string additional elements in the SERP
you can see such items separated by commas: app, blog, books, carousel, definition_block, discussions, images, knowledge_graph, maps, news, patents, places, recipes, shopping, videos
            result_spell string auto correction of a search engine
if a search engine provided results for a keyword that was corrected, we will specify the keyword corrected by a search engine
            result_se_check_url string direct URL to search engine results
You can use it to make sure that we provide exact results
      paid array results array of paid SERP
It will be available in the future, for now all the data in this field will always have empty array.
            task_id integer unique task identifier in our system
in the future you will be able to use it within 30 days to request results of this task any time.
            post_id string index in the array received in a POST array
            post_site string site received in a POST array
            post_key string keyreceived in a POST array
if you send key_id without passing keyit will be empty
keyword is returned with decoded %## (plus symbol ‘+’ will be decoded to a space character)
            se_id integer search engine id
You can use it for finding relations between your and our search engines.
            loc_id integer search engine location id
You can use it for finding relations between your and our search engines.
            key_id integer keyword id in our system
if you plan to use this keyword in the future we recommend you to save this id and use it when you set a task as key_id
            result_position integer position in the SERP
            result_datetime string date and time when a result was received
in the format “year-month-date:minutes:GMT_difference_hours:GMT_difference_minutes”
for example: “2016-12-13 15:30:34 +02:00”
time zone specified at your profile settings is used
            result_url string relevant URL in the SERP
            result_title string snippet header in the SERP
            result_snippet_extra string additional snippet in the SERP
ratings, price, author, etc
            result_snippet string snippet in the SERP
            results_count integer total number of results in the SERP
            result_extra string additional elements in the SERP
you can see such items separated by commas: app, blog, books, carousel, definition_block, discussions, images, knowledge_graph, maps, news, patents, places, recipes, shopping, videos
            result_spell string auto correction of a search engine
if a search engine provided results for a keyword that was corrected, we will specify the keyword corrected by a search engine
            result_se_check_url string direct URL to search engine results
You can use it to make sure that we provide exact results

SERP API

SERP API provides you with a possibility to receive SERP (Top 100) results of specified search engines according to a certain keyword.

The operating principle of SERP API is similar to Rank Tracker API. The main difference is that you don’t receive all complete results at once - you receive a list of task_id which results are complete, after you can receive each result separately. This is due to the fact that each of tasks has huge data amount.

The time of results delivery depends on task priority and overall system load. Usually, it takes a short time (2 minutes on average per day). However, it might be longer in the span of 1 a.m. to 6 a.m. GMT.

The time of results delivery is less for those tasks which priority is high.

Setting SERP Tasks

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com/', null, 'login', 'password');
} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
    exit();
}


$post_array = array();

//for example, some data selection cycle for tasks
for ($i = 0; $i < 3; $i++) {

    // example #1 - simplest
    // you set only a website URL and a search engine URL.
    // This search engine URL string will be searched, compared to our internal parameters
    // and used as:
    // "se_id", "loc_id", "key_id" ( actual and fresh list can be found here: "se_id":
    // https://api.dataforseo.com/v2/cmn_se , "loc_id": https://api.dataforseo.com/v2/cmn_locations ) (see example #3 for details)
    // If a task was set successfully, this *_id will be returned in results: 'v2/rnk_tasks_post' so you can use it.
    // The setting of a task can fail, if you set not-existent search engine, for example.
    // Disadvantages: You cannot work with "map pack", "maps", "mobile"
    $my_unq_id = mt_rand(0,30000000); //your unique ID. we will return it with all results. you can set your ID, string, etc.
    $post_array[$my_unq_id] = array(
    "priority" => 1,
    "url" => "https://www.google.co.uk/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
    );

    // example #2 - will return results faster than #1, but is simpler than example #3
    // All parameters should be set in the text format.
    // All data will be will be searched, compared to our internal parameters
    // and used as:
    // "se_id", "loc_id", "key_id" ( actual and
    // fresh list can be found here: "se_id": https://api.dataforseo.com/v2/cmn_se ,
    // "loc_id": https://api.dataforseo.com/v2/cmn_locations )
    // If a task was set successfully, this *_id will be returned in results: 'v2/rnk_tasks_post' so you can use it.
    // The setting of a task can fail, if you set not-existent search engine, for example.
    // Disadvantages: The process of search and comparison of provided data to our internal parameters may take some time.
    $my_unq_id = mt_rand(0,30000000); //your unique ID. we will return it with all results. you can set your ID, string, etc.
    $post_array[$my_unq_id] = array(
    "priority" => 1,
    "se_name" => "google.co.uk",
    "se_language" => "English",
    "loc_name_canonical"=> "London,England,United Kingdom",
    "key" =>  mb_convert_encoding("online rank checker", "UTF-8")
    );

    // example #3 - the fastest one. All parameters should be set in our internal format.
    // Actual and fresh list can be found here: "se_id": https://api.dataforseo.com/v2/cmn_se ,
    // "loc_id": https://api.dataforseo.com/v2/cmn_locations
    $my_unq_id = mt_rand(0,30000000); //your unique ID. we will return it with all results. you can set your ID, string, etc.
    $post_array[$my_unq_id] = array(
    "priority" => 1,
    "se_id" => 22,
    "loc_id" => 1006886,
    "key_id" => 1095202
    );

    //This example has a cycle of up to 3 elements, but in the case of large number of tasks - send up to 100 elements per POST request
    if (count($post_array) > 99) {
        try {
            // POST /v2/srp_tasks_post/$data
            // $tasks_data must by array with key 'data'
            $task_post_result = $client->post('v2/srp_tasks_post', array('data' => $post_array));
            print_r($task_post_result);

            //do something with post results

            $post_array = array();
        } catch (RestClientException $e) {
            echo "\n";
            print "HTTP code: {$e->getHttpCode()}\n";
            print "Error code: {$e->getCode()}\n";
            print "Message: {$e->getMessage()}\n";
            print  $e->getTraceAsString();
            echo "\n";
        }
    }
}

if (count($post_array) > 0) {
    try {
        // POST /v2/srp_tasks_post/$data
        // $tasks_data must by array with key 'data'
        $task_post_result = $client->post('v2/srp_tasks_post', array('data' => $post_array));
        print_r($task_post_result);

        //do something with post results

    } catch (RestClientException $e) {
        echo "\n";
        print "HTTP code: {$e->getHttpCode()}\n";
        print "Error code: {$e->getCode()}\n";
        print "Message: {$e->getMessage()}\n";
        print  $e->getTraceAsString();
        echo "\n";
    }
}

$client = null;
?>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task srp_tasks_post()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };
            var rnd = new Random(); //you can set as "index of post_data" your ID, string, etc. we will return it with all results.
            var postObject = new Dictionary<int, object>
            {
                [rnd.Next(1, 30000000)] = new
                {
                    priority = 1,
                    url = "https://www.google.co.uk/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
                },
                [rnd.Next(1, 30000000)] = new
                {
                    priority = 1,
                    se_name = "google.co.uk",
                    se_language = "English",
                    loc_name_canonical = "London,England,United Kingdom",
                    key = "online rank checker"
                },
                [rnd.Next(1, 30000000)] = new
                {
                    priority = 1,
                    se_id = 22,
                    loc_id = 1006886,
                    key_id = 1095202
                }
            };
            var taskPostResponse = await httpClient.PostAsync("v2/srp_tasks_post", new StringContent(JsonConvert.SerializeObject(new {data = postObject})));
            var obj = JsonConvert.DeserializeObject<dynamic>(await taskPostResponse.Content.ReadAsStringAsync());
            if (obj.status == "error")
                Console.WriteLine($"error. Code: {obj.error.code} Message: {obj.error.message}");
            else
            {
                foreach (var result in obj.results)
                {
                    var taskState = ((IEnumerable<dynamic>) result).First();
                    if (taskState.status == "error")
                        Console.WriteLine($"Error in task with post_id {taskState.post_id}. Code: {taskState.error.code} Message: {taskState.error.message}");
                    Console.WriteLine(taskState);
                }
            }
        }
    }
}
from random import Random
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")
rnd = Random() #you can set as "index of post_data" your ID, string, etc. we will return it with all results.
post_data = dict()
post_data[rnd.randint(1, 30000000)] = dict(
    priority=1,
    url="https://www.google.co.uk/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
)
post_data[rnd.randint(1, 30000000)] = dict(
    priority=1,
    se_name="google.co.uk",
    se_language="English",
    loc_name_canonical="London,England,United Kingdom",
    key="online rank checker"
)
post_data[rnd.randint(1, 30000000)] = dict(
    priority=1,
    se_id=22,
    loc_id=1006886,
    key_id=1095202
)

response = client.post("/v2/srp_tasks_post", dict(data=post_data))
if response["status"] == "error":
    print("error. Code: %d Message: %s" % (response["error"]["code"], response["error"]["message"]))
else:
    print(response["results"])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "0.6490 sec.",
    "results_count": 9,
    "results": {
        "11913049": {
            "post_id": 11913049,
            "post_key": "",
            "task_id": 404227822,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "20469414": {
            "post_id": 20469414,
            "post_key": "online rank checker",
            "task_id": 404227823,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "6273173": {
            "post_id": 6273173,
            "post_key": "",
            "task_id": 404227824,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "27408598": {
            "post_id": 27408598,
            "post_key": "",
            "task_id": 404227825,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "19840083": {
            "post_id": 19840083,
            "post_key": "online rank checker",
            "task_id": 404227826,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "6054604": {
            "post_id": 6054604,
            "post_key": "",
            "task_id": 404227827,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "8626195": {
            "post_id": 8626195,
            "post_key": "",
            "task_id": 404227828,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "18786140": {
            "post_id": 18786140,
            "post_key": "online rank checker",
            "task_id": 404227829,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        },
        "13056693": {
            "post_id": 13056693,
            "post_key": "",
            "task_id": 404227830,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "status": "ok"
        }
    }
}

All POST data should be sent in the JSON format (UTF-8 encoding). Task setting is made by the POST method, passing array of tasks in data field. We recommend to set up to 100 tasks at a time. Such limit was set because of the variations of tasks settings that you will use. If you use the field url then the processing of each task will take more time. If you use our identifiers (se_id, loc_id, key_id), then the processing of tasks will be made faster and you can set more than 100 elements at a time. Each of array elements has such structure.

You also can receive results of completed tasks using task_id or we can send them by ourselves as soon as they are ready if you specify postback_url or pingback_url when setting a task.

Name of a field Type Description
priority integer execution priority
optional field
can have such values:
1 - normal execution priority (set by default)
2 - high execution priority
url string direct URL of a search query
optional field
you can specify a direct URL and we will sort it out to the necessary fields. Such method is the most difficult for our API processing and you should exactly specify language and location in the URL. We don’t recommend to use this method.
example:
https://www.google.co.uk/search?q=%20rank%20tracker%20api&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20
se_id integer search engine id
optional field, if you specify se_name
you must choose one of the fields se_id or se_name
the list of available search engines with se_id you can get by separate request List of Search Engines
also, when the information about set task is returned you will get se_id
se_name string search engine domain
optional field if you specify se_id
you must choose one of the fields se_id or se_name
the list of available search engines with se_name you can get by separate request List of Search Engines
example: “google.co.uk”
se_language string search engine language
required field if se_id is not specified
the list of available search engines with se_language you can get by separate request List of Search Engines
example: “English”
loc_id integer search engine location id
optional field if you specify loc_name_canonical
you must choose one of the fields loc_id or loc_name_canonical
the list of available locations of search engines with loc_id you can get by separate request List of Locations
also when the information about set task is returned you will get loc_id
please notice that we use Google Geographical Targeting including such types of locations as Country State Region Municipality City, that’s why you can specify loc_id appropriate Criteria ID
loc_name_canonical string full name of search engine location
optional field if you specify loc_id
you must choose one of the fields loc_id or loc_name_canonical
the list of available locations of search engines with loc_name_canonical you can get by separate List of Locations
please notice that we use Google Geographical Targeting including such types of locations as Country State Region Municipality City, that’s why you can specify loc_name_canonical appropriate Canonical Name
example: “London,England,United Kingdom”
key_id integer keyword id
optional field if you specify key
when you set a task for the first time you won’t be able to know this field. But if you plan to collect rankings for this keyword we recommend you to save key_id returned after the task was set and use this field in the future.
key string keyword
optional field if you specify key_id
UTF-8 encoding
all %## will be decoded (plus symbol ‘+’ will be decoded to a space character)
if you need to use the “%” symbol for your key, please specify it as “%25”

if this field contains ‘site:’ or ‘inurl:’ then the charge per task will be multiplied by 10.
se_param_add string additional parameters of search query
optional field
for instance, if you want to disable auto correction of misspelling in the search query for google, you can specify “&nfpr=1”
postback_url string return URL for sending task results
optional field
if you specify this URL there will be no need to pick up tasks using Get Rank Tasks Results. We will send a result of a completed task by POST request for URL as soon as a task is completed.
pingback_url string notification URL of a completed task
optional field
when a task is completed we will notify you by GET request sent to the URL you have specified
you can use string ‘$task_id’ as $task_id variable and ‘$post_id’ as $post_id variable. we will set necessary values before sending of a request. for example:
  http://your-server.com/pingscript?taskId=$task_id
  http://your-server.com/pingscript?taskId=$task_id&postId=$post_id

As a response of API server you will receive JSON array in the field results of which there will be an information appropriate to the set tasks.

Name of a field Type Description
status string general result
“ok” - successful
“error” - error
if status=“error”, then you can see more detailed information of array error error
error array informational array of error
only if status=“error”
the list of possible errors can be found below.
      code integer error code
      message string text description of error
results_time string execution time, seconds
results_count string *number of elements in the array of results results
results array results array of tasks setting
            task_id integer unique task identifier in our system
in the future you will be able to use it within 30 days to request results of this task any time.
            status string results of this task setting
“ok” - success
“error” - error
if status=“error”, then you can see more detailed information of array error error
            error array informational array of error
only if status=“error”
the list of possible errors can be found below.
                  code integer error code
                  message string text description of error
            post_id string index in the array received in a POST request
            post_key string key received in a POST request
if you send key_id without passing key it will be empty
keyword is returned with decoded %## (plus symbol ‘+’ will be decoded to a space character)
            se_id integer search engine id
if status=“ok”, then this field will be always filled
You can use it for finding relations between your and our search engines.
            loc_id integer search engine location id
if status=“ok”, then this field will be always filled
You can use it for finding relations between your and our search engines.
            key_id integer keyword id in our system
if you plan to use this keyword in the future we recommend you to save this id and use it when you set a task as key_id

Possible errors codes

Error Code Meaning
404 “not found or not enough data: site” - you didn’t specify a website in the task
404 “not found or not enough data: search engine” - you’ve specified nonexistent se_id or a search engine wasn’t found by specified se_name
404 “not found or not enough data: location” - you’ve specified nonexistent loc_id or a location of a search engine wasn’t found by specified loc_name_canonical
404 “not enough data: keyword” - you didn’t specify a keyword in the task
501 “invalid ‘data’ field” - probably you haven’t passed data for the tasks in the fielddata. POST data should be represented as an array and added to the field data: array(‘data’ => $post_array_for_tasks)
501 “invalid data” - data in the field data isn’t an array with the required structure.
500 “internal error” - some internal error. We did our best to not let this type of error ever happen.

Get SERP Completed Tasks

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com', null, 'login', 'password');

    // #1 - get task_id list of ALL ready results
    //GET /v2/srp_tasks_get
    $tasks_get_result = $client->get('v2/srp_tasks_get');
    print_r($tasks_get_result);

    //get tasks one by one

} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
}

$client = null;
?>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task srp_tasks_get()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };
            var completedTasksResponse = await httpClient.GetAsync("v2/srp_tasks_get");
            var completedTasksObj = JsonConvert.DeserializeObject<dynamic>(await completedTasksResponse.Content.ReadAsStringAsync());
            if (completedTasksObj.status == "error")
                Console.WriteLine($"error. Code: {completedTasksObj.error.code} Message: {completedTasksObj.error.message}");
            else if (completedTasksObj.results_count != 0)
            {
                foreach (var result in completedTasksObj.results)
                {
                    var completedTask = ((IEnumerable<dynamic>)result).First();
                    Console.WriteLine(completedTask);
                }
            }
            else
                Console.WriteLine("No completed tasks");
        }
    }
}
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")
response = client.get("/v2/srp_tasks_get")
if response["status"] == "error":
    print("error. Code: %d Message: %s" % (response["error"]["code"], response["error"]["message"]))
else:
    print(response["results"])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "0.0120 sec.",
    "results_count": 1,
    "results": [
        {
            "task_id": 107,
            "post_id": 11577837,
            "post_key": null,
            "se_id": 22,
            "loc_id": 1006886,
            "key_id": 1095202,
            "results_count": 4690000,
            "result_extra": "videos",
            "result_spell": "",
            "result_se_check_url": "https:\/\/google.co.uk\/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
        }
    ]
}

You will get the list of complete results, that you haven’t collected yet. After you collect a result the task will be removed from this list.

If you specify pingback_url or postback_url you can skip usage of srp_tasks_get to get the list of completed tasks. Our system send you GET request to the pingback_url or send POST request with results to the postback_url.

As a response of API server you will receive array in the field resultsof which there will be a list of complete results.

Name of a field Type Description
status string general result
“ok” - successful
“error” - error
if status=“error”, then you can see more detailed information of array error error
error array informational array of error
only if status=“error”
the list of possible errors can be found below.
      code integer error code
      message string text description of an error
results_time string execution time, seconds
results_count string number of elements in the array of results results
results array results array of tasks
            task_id integer unique task identifier in our system
in the future you will be able to use it within 30 days to request results of this task any time
            post_id string index in the array received in a POST array
            post_key string key received in a POST array
if you send key_idwithout passing key, then it will be empty
keyword is returned with decoded %## (plus symbol ‘+’ will be decoded to a space character)
            se_id integer search engine id
You can use it for finding relations between your and our search engines
            loc_id integer search engine location id
You can use it for finding relations between your and our search engines.
            key_id integer keyword id in our system
if you plan to use this keyword in the future we recommend you to save this id and use it when you set a task as key_id
            results_count integer total number of results in the SERP
            result_extra string additional elements in the SERP
you can see such items separated by commas: app, blog, books, carousel, definition_block, discussions, images, knowledge_graph, maps, news, patents, places, recipes, shopping, videos
            result_spell string auto correction of a search engine
if a search engine provided results for a keyword that was corrected, we will specify the keyword corrected by a search engine
            result_se_check_url string direct URL to search engine results
You can use it to make sure that we provide exact results

Get SERP Results by task_id

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com', null, 'login', 'password');

    // #1 - get task_id list of ALL ready results
    //GET /v2/srp_tasks_get
    $tasks_get_result = $client->get('v2/srp_tasks_get');
    print_r($tasks_get_result);
    if ($tasks_get_result["status"] == "ok") {
        foreach($tasks_get_result["results"] as $tasks_get_row) {
            // #2 - get result by task_id
            //GET /v2/srp_tasks_get/$task_id
            $serp_result = $client->get('v2/srp_tasks_get/'.$tasks_get_row["task_id"]);
            print_r($serp_result);

            //do something with results
        }
    }
} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
}

$client = null;
?>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task srp_tasks_get_by_task_id()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };
            var completedTasksResponse = await httpClient.GetAsync("v2/srp_tasks_get");
            var completedTasksObj = JsonConvert.DeserializeObject<dynamic>(await completedTasksResponse.Content.ReadAsStringAsync());
            if (completedTasksObj.status == "error")
                Console.WriteLine($"error. Code: {completedTasksObj.error.code} Message: {completedTasksObj.error.message}");
            else if (completedTasksObj.results_count != 0)
            {
                foreach (var result in completedTasksObj.results)
                {
                    var completedTask = ((IEnumerable<dynamic>)result).First();
                    var serpResponse = await httpClient.GetAsync($"v2/srp_tasks_get/{completedTask.task_id}");
                    var serpObj = JsonConvert.DeserializeObject<dynamic>(await serpResponse.Content.ReadAsStringAsync());
                    if (serpObj.status == "error")
                        Console.WriteLine($"error. Code: {serpObj.error.code} Message: {serpObj.error.message}");
                    foreach (var serpResult in serpObj.results)
                        Console.WriteLine(((IEnumerable<dynamic>)serpResult).First());
                }
            }
            else
                Console.WriteLine("No completed tasks");
        }
    }
}
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")
completed_tasks_response = client.get("/v2/srp_tasks_get")
if completed_tasks_response["status"] == "error":
    print("error. Code: %d Message: %s" % (completed_tasks_response["error"]["code"], completed_tasks_response["error"]["message"]))
else:
    results = completed_tasks_response["results"]
    print(results)
    for result_id in results:
        result = results[result_id]
        srp_response = client.get("/v2/srp_tasks_get/%d" % (result["task_id"]))
        if srp_response["status"] == "error":
            print("error. Code: %d Message: %s" % (srp_response["error"]["code"], srp_response["error"]["message"]))
        else:
            print(srp_response["results"])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "0.0135 sec.",
    "results_count": 100,
    "results": {
            "organic": [
                {
                    "post_id": 2833944,
                    "task_id": 405460981,
                    "se_id": 22,
                    "loc_id": 1006886,
                    "key_id": 1095202,
                    "post_key": null,
                    "result_datetime": "2016-12-19 14:41:33 +02:00",
                    "result_position": 1,
                    "result_url": "https:\/\/serps.com\/tools\/rank-checker\/",
                    "result_title": "Free Keyword Rank Checker - Google & Yahoo | SERPs.com",
                    "result_snippet_extra": "",
                    "result_snippet": "International and local keyword rankings. Check keyword rankings positions in Google or Yahoo from over 100 country and language combinations.",
                    "results_count": 4690000,
                    "result_extra": "videos",
                    "result_spell": "",
                    "result_se_check_url": "https:\/\/google.co.uk\/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
                },
                {
                    "post_id": 2833944,
                    "task_id": 405460981,
                    "se_id": 22,
                    "loc_id": 1006886,
                    "key_id": 1095202,
                    "post_key": null,
                    "result_datetime": "2016-12-19 14:41:33 +02:00",
                    "result_position": 2,
                    "result_url": "https:\/\/ranksonic.com\/",
                    "result_snippet_extra": "Rating: 4.6 - ‎6,054 reviews",
                    "result_title": "RankSonic ⓴⓰ - Rank Tracking SEO software. Website ranking SEO ...",
                    "result_snippet": "⓴⓰ Rank Tracking SEO Software ? Keyword Google online search engine seo \n... Check what potential your keywords have to evaluate their competition level.",
                    "results_count": 4690000,
                    "result_extra": "videos",
                    "result_spell": "",
                    "result_se_check_url": "https:\/\/google.co.uk\/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
                },


                {
                    "post_id": 2833944,
                    "task_id": 405460981,
                    "se_id": 22,
                    "loc_id": 1006886,
                    "key_id": 1095202,
                    "post_key": null,
                    "result_datetime": "2016-12-19 14:41:33 +02:00",
                    "result_position": 99,
                    "result_url": "http:\/\/www.prcheckingtool.com\/",
                    "result_title": "PR Checking Tool - Website Ranking Checker",
                    "result_snippet_extra": "",
                    "result_snippet": "It is a simple yet powerful tool checking the online ranking of different websites. If you think that its sole utilization is for web ranking only then you are wrong as it ...",
                    "results_count": 4690000,
                    "result_extra": "videos",
                    "result_spell": "",
                    "result_se_check_url": "https:\/\/google.co.uk\/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
                }
        ],


        "paid": [
                {
                    "post_id": 2833944,
                    "task_id": 405460981,
                    "se_id": 22,
                    "loc_id": 1006886,
                    "key_id": 1095202,
                    "post_key": null,
                    "result_datetime": "2016-12-19 14:41:33 +02:00",
                    "result_position": 1,
                    "result_url": "https:\/\/www.seorankmonitor.com\/",
                    "result_title": "SEO Rank Monitor - The Most Complete Rank Checker",
                    "result_snippet_extra": "",
                    "result_snippet": "Everything you need to keep your Website Ranked High - Start a Free Trial Now!",
                    "results_count": 4690000,
                    "result_extra": "videos",
                    "result_spell": "",
                    "result_se_check_url": "https:\/\/google.co.uk\/search?q=online%20rank%20checker&hl=en&gl=GB&uule=w+CAIQICIdTG9uZG9uLEVuZ2xhbmQsVW5pdGVkIEtpbmdkb20"
                }
        ]
    }
}

As a response of API server you will receive array in the field resultsof which there will be a list of complete results.

Name of a field Type Description
status string general result
“ok” - successful
“error” - error
if status=“error”, then you can see more detailed information of array error error
error array informational array of error
only if status=“error”
the list of possible errors can be found below.
      code integer error code
      message string text description of an error
results_time string execution time, seconds
results_count string number of elements in the array of results results
results array results array of tasks setting
      organic array results array of organic SERP
            task_id integer unique task identifier in our system
in the future you will be able to use it within 30 days to request results of this task any time.
            post_id string index in the array received in a POST array
            se_id integer search engine id
in the future you will be able to use it within 30 days to request results of this task any time.
            loc_id integer search engine location id
You can use it for finding relations between your and our search engines.
            key_id integer keyword id in our system
if you plan to use this keyword in the future we recommend you to save this id and use it when you set a task as key_id
            post_key string keyreceived in a POST array
if you send key_id without passing keyit will be empty
keyword is returned with decoded %## (plus symbol ‘+’ will be decoded to a space character)
            result_position integer position in the SERP
            result_datetime string date and time when a result was received
in the format “year-month-date:minutes:GMT_difference_hours:GMT_difference_minutes”
for example: “2016-12-13 15:30:34 +02:00”
the time zone specified at your profile settings is used
            result_url string relevant URL in the SERP
            result_title string snippet header in the SERP
            result_snippet_extra string additional snippet in the SERP
ratings, price, author, etc
            result_snippet string snippet in the SERP
            results_count integer total number of results in the SERP
            result_extra string additional elements in the SERP
you can see such items separated by commas: app, blog, books, carousel, definition_block, discussions, images, knowledge_graph, maps, news, patents, places, recipes, shopping, videos
            result_spell string auto correction of a search engine
if a search engine provided results for a keyword that was corrected, we will specify the keyword corrected by a search engine
            result_se_check_url string direct URL to search engine results
You can use it to make sure that we provide exact results
      paid array results array of paid SERP
            task_id integer unique task identifier in our system
in the future you will be able to use it within 30 days to request results of this task any time.
            post_id string index in the array received in a POST array
            se_id integer search engine id
in the future you will be able to use it within 30 days to request results of this task any time.
            loc_id integer search engine location id
You can use it for finding relations between your and our search engines.
            key_id integer keyword id in our system
if you plan to use this keyword in the future we recommend you to save this id and use it when you set a task as key_id
            post_key string keyreceived in a POST array
if you send key_id without passing keyit will be empty
keyword is returned with decoded %## (plus symbol ‘+’ will be decoded to a space character)
            result_position integer position in the SERP
            result_datetime string date and time when a result was received
in the format “year-month-date:minutes:GMT_difference_hours:GMT_difference_minutes”
for example: “2016-12-13 15:30:34 +02:00”
the time zone specified at your profile settings is used
            result_url string relevant URL in the SERP
            result_title string snippet header in the SERP
            result_snippet_extra string additional snippet in the SERP
ratings, price, author, etc
            result_snippet string snippet in the SERP
            results_count integer total number of results in the SERP
            result_extra string additional elements in the SERP
you can see such items separated by commas: app, blog, books, carousel, definition_block, discussions, images, knowledge_graph, maps, news, patents, places, recipes, shopping, videos
            result_spell string auto correction of a search engine
if a search engine provided results for a keyword that was corrected, we will specify the keyword corrected by a search engine
            result_se_check_url string direct URL to search engine results
You can use it to make sure that we provide exact results

Possible errors codes

Error Code Meaning
102 “task in queue” - the task is being enqueued to handling, please, try again later
201 “task handed” - the task has been received and sent to handling, please, try again later
202 “in progress” - the task is in the handling process, please, try again later
404 “search engine did not return results” - SERP is empty. Check if you have added key correctly
404 “top results not found” - there is no SERP with specified parameters

Keywords Data API

Keywords Data API is a toolkit that was created for keyword selection and analysis of their efficiency. Our system uses Google AdWords API, that’s why the possibilities and limits correspond with this API.

The time to retrieve the result is from 10 to 60 seconds.

Search Volume for Keyword

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com/', null, 'login', 'password');

    $post_array[] = array(
    "language" => "en",
    "loc_name_canonical"=> "United States",
    "key" => "average page rpm adsense"
    );
    $post_array[] = array(
    "language" => "en",
    "loc_id" => 2840,
    "key" => "adsense blank ads how long"
    );
    $post_array[] = array(
    "language" => "en",
    "loc_name_canonical"=> "United States",
    "key" => "leads and prospects"
    );


    $sv_post_result = $client->post('v2/kwrd_sv', array('data' => $post_array));
    print_r($sv_post_result);

    //do something with results

} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
    exit();
}

$client = null;
?>
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task kwrd_sv()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };
            var postArray = new object[]
            {
                new { language = "en", loc_name_canonical = "United States", key = "average page rpm adsense" },
                new { language = "en", loc_id = 2840, key = "adsense blank ads how long" },
                new { language = "en", loc_name_canonical = "United States", key = "leads and prospects" }
            };
            var response = await httpClient.PostAsync("v2/kwrd_sv", new StringContent(JsonConvert.SerializeObject(new { data = postArray })));
            var obj = JsonConvert.DeserializeObject<dynamic>(await response.Content.ReadAsStringAsync());
            if (obj.status == "error")
                Console.WriteLine($"error. Code: {obj.error.code} Message: {obj.error.message}");
            else
            {
                foreach (var result in obj.results)
                    Console.WriteLine(result);
            }
        }
    }
}
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")

keywords_list = [
    dict(
        language="en",
        loc_name_canonical="United States",
        key="average page rpm adsense"
    ),
    dict(
        language="en",
        loc_id=2840,
        key="adsense blank ads how long"
    ),
    dict(
        language="en",
        loc_name_canonical="United States",
        key="leads and prospects"
    )
]

response = client.post("/v2/kwrd_sv", dict(data=keywords_list))
if response["status"] == "error":
    print("error. Code: %d Message: %s" % (response["error"]["code"], response["error"]["message"]))
else:
    print(response["results"])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "2.1886 sec.",
    "results_count": 3,
    "results": [
        {
            "language": "en",
            "loc_id": 2840,
            "key": "leads and prospects",
            "cmp": 0.47619047619048,
            "cpc": 0,
            "sv": 10,
            "ms": [
                {
                    "year": 2016,
                    "month": 10,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 9,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 8,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 7,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 6,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 5,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 4,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 3,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 2,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 1,
                    "count": 10
                },
                {
                    "year": 2015,
                    "month": 12,
                    "count": 10
                },
                {
                    "year": 2015,
                    "month": 11,
                    "count": 10
                }
            ]
        },
        {
            "language": "en",
            "loc_id": 2840,
            "key": "adsense blank ads how long",
            "cmp": 0,
            "cpc": 0,
            "sv": 10,
            "ms": [
                {
                    "year": 2016,
                    "month": 10,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 9,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 8,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 7,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 6,
                    "count": 0
                },
                {
                    "year": 2016,
                    "month": 5,
                    "count": 0
                },
                {
                    "year": 2016,
                    "month": 4,
                    "count": 0
                },
                {
                    "year": 2016,
                    "month": 3,
                    "count": 0
                },
                {
                    "year": 2016,
                    "month": 2,
                    "count": 0
                },
                {
                    "year": 2016,
                    "month": 1,
                    "count": 0
                },
                {
                    "year": 2015,
                    "month": 12,
                    "count": 0
                },
                {
                    "year": 2015,
                    "month": 11,
                    "count": 0
                }
            ]
        },
        {
            "language": "en",
            "loc_id": 2840,
            "key": "average page rpm adsense",
            "cmp": null,
            "cpc": null,
            "sv": null,
            "ms": null
        }
    ]
}

You can receive the search volume data for the last month, search volume trend for the last year (that will let you estimate search volume dynamics), current cost-per-click and competition value for paid search.

You don’t have to group keywords according to the required location/language. Send as many array elements for any language/location as you need. Our system will charge credits per each keyword in the array.

All POST data should be sent in the JSON format (UTF-8 encoding). The keywords are sent by POST method passing tasks array. The data should be specified in the data field of this POST array. We recommend to send up to 100 tasks at a time. Each array element has such structure:

Name of a field Type Description
loc_id integer search engine location id
optional field
you can specify one of the fields loc_id or loc_name_canonical
list of available locations for search engines loc_id you can receive by separate request List of Locations
please notice that we use Google Geographical Targeting, that’s why you are able to point in the field loc_id appropriate Criteria ID
loc_name_canonical string full name of a location for search engine
optional field
you can specify one of the fields loc_id or loc_name_canonical
list of the available locations for search engines with specifying of their loc_name_canonical you can receive by separate request List of Locations
please notice that we use Google Geographical Targeting, that’s why you are able to point in the field loc_name_canonical appropriate Canonical Name
for instance: “London,England,United Kingdom”
language string language
optional field
can have the following values: “ar”, “bg”, “ca”, “zh_cn”, “zh_tw”, “hr”, “cs”, “da”, “nl”, “en”, “et”, “tl”, “fi”, “fr”, “de”, “el”, “iw”, “hi”, “hu”, “is”, “id”, “it”, “ja”, “ko”, “lv”, “lt”, “ms”, “no”, “fa”, “pl”, “pt”, “ro”, “ru”, “sr”, “sk”, “sl”, “es”, “sv”, “th”, “tr”, “uk”, “ur”, “vi”
Source Google AdWords API - Languages available for targeting
key string keyword
required field
all %## are decoded (plus symbol ‘+’ is decoded to a space character)
for instance: “rank tracker api”

As a response of API server you will receive JSON array in the field results of which there will be keywords data.

Name of a field Type Description
status string general result
“ok” - successful
“error” - error
if status=“error”, then you will be able to see more detailed information about array error error
error array informational array of error
only if status=“error”
the list of possible errors can be found below.
      code integer error code
      message string text description of an error
results_time string execution time
results_count string number of elements in the array of results results
results array array of results
            language string language
            loc_id integer search engine location id
            key string keyword
keyword is returned decoded %## (plus symbol ‘+’ is decoded as a space character)
            cmp float competition
represents the relative amount of competition associated with the given keyword idea, relative to other keywords. This value will be between 0 and 1 (inclusive).
If there is no data then the value is null
            cpc float cost-per-click
represents the average cost per click (USD) historically paid for the keyword.
If there is no data then the value is null
            sv integer search volume for the last month
represents either the (approximate) number of searches for the given keyword idea on google.com or google.com and partners, depending on the user’s targeting.
If there is no data then the value is null
            ms array monthly searches
represents the (approximated) number of searches on this keyword idea (as available for the past twelve months), targeted to the specified geographies.
If there is no data then the value is null

Possible errors codes:

Error Code Meaning
404 “not found or not enough data: location” - you have specified nonexistent loc_id, or the location for the search engine wasn’t found according to your loc_name_canonical

Bulk Keyword Search Volume

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com/', null, 'login', 'password');

    $post_array[] = array(
        "language" => "en",
        "loc_name_canonical"=> "United States",
        "keys" => array(
            "average page rpm adsense",
            "adsense blank ads how long",
            "leads and prospects"
        )
    );


    $sv_post_result = $client->post('v2/kwrd_sv_batch', array('data' => $post_array));
    print_r($sv_post_result);

    //do something with results

} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
    exit();
}

$client = null;
?>
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task kwrd_sv()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };
            var postArray = new object[]
            {
                new {
                    language = "en",
                    loc_name_canonical = "United States",
                    keys = new[]
                    {
                        "average page rpm adsense",
                        "adsense blank ads how long",
                        "leads and prospects"
                    }
                }
            };
            var response = await httpClient.PostAsync("v2/kwrd_sv", new StringContent(JsonConvert.SerializeObject(new { data = postArray })));
            var obj = JsonConvert.DeserializeObject<dynamic>(await response.Content.ReadAsStringAsync());
            if (obj.status == "error")
                Console.WriteLine($"error. Code: {obj.error.code} Message: {obj.error.message}");
            else
            {
                foreach (var result in obj.results)
                    Console.WriteLine(result);
            }
        }
    }
}
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")

keyword_list = [
    dict(
        language="en",
        loc_name_canonical="United States",
        keys=[
            "average page rpm adsense",
            "adsense blank ads how long",
            "leads and prospects"
        ]
    )
]


response = client.post("/v2/kwrd_sv", dict(data=keyword_list))
if response["status"] == "error":
    print("error. Code: %d Message: %s" % (response["error"]["code"], response["error"]["message"]))
else:
    print(response["results"])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "2.1886 sec.",
    "results_count": 3,
    "results": [
        {
            "language": "en",
            "loc_id": 2840,
            "key": "leads and prospects",
            "cmp": 0.47619047619048,
            "cpc": 0,
            "sv": 10,
            "ms": [
                {
                    "year": 2016,
                    "month": 10,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 9,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 8,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 7,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 6,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 5,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 4,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 3,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 2,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 1,
                    "count": 10
                },
                {
                    "year": 2015,
                    "month": 12,
                    "count": 10
                },
                {
                    "year": 2015,
                    "month": 11,
                    "count": 10
                }
            ]
        },
        {
            "language": "en",
            "loc_id": 2840,
            "key": "adsense blank ads how long",
            "cmp": 0,
            "cpc": 0,
            "sv": 10,
            "ms": [
                {
                    "year": 2016,
                    "month": 10,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 9,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 8,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 7,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 6,
                    "count": 0
                },
                {
                    "year": 2016,
                    "month": 5,
                    "count": 0
                },
                {
                    "year": 2016,
                    "month": 4,
                    "count": 0
                },
                {
                    "year": 2016,
                    "month": 3,
                    "count": 0
                },
                {
                    "year": 2016,
                    "month": 2,
                    "count": 0
                },
                {
                    "year": 2016,
                    "month": 1,
                    "count": 0
                },
                {
                    "year": 2015,
                    "month": 12,
                    "count": 0
                },
                {
                    "year": 2015,
                    "month": 11,
                    "count": 0
                }
            ]
        },
        {
            "language": "en",
            "loc_id": 2840,
            "key": "average page rpm adsense",
            "cmp": null,
            "cpc": null,
            "sv": null,
            "ms": null
        }
    ]
}

You can receive the search volume data for the last month, search volume trend for the last year (that will let you estimate search volume dynamics), current cost-per-click and competition value for paid search.

You can get the required information in a bulk for up to 700 keywords. For this, create an array of 700 keywords for the same location/language.

If you send more than 700 keywords in one array, the number of keywords will be divided by 700 and the total charged requests rounded up.

For instance, if you send 1500 keywords in one array, the system will charge 300 credits (3 API requests * 100 credits).
If you send 300 keywords in one array, the system will charge 100 credits (one API request).
If you send 700 keywords in one array, the system will also charge 100 credits.

All POST data should be sent in the JSON format (UTF-8 encoding). The keywords are sent by POST method passing tasks array. The data should be specified in the data field of this POST array. We recommend to send up to 1 tasks at a time. Each array element has such structure:

Name of a field Type Description
loc_id integer search engine location id
optional field
you can specify one of the fields loc_id or loc_name_canonical
list of available locations for search engines loc_id you can receive by separate request List of Locations
please notice that we use Google Geographical Targeting, that’s why you are able to point in the field loc_id appropriate Criteria ID
loc_name_canonical string full name of a location for search engine
optional field
you can specify one of the fields loc_id or loc_name_canonical
list of the available locations for search engines with specifying of their loc_name_canonical you can receive by separate request List of Locations
please notice that we use Google Geographical Targeting, that’s why you are able to point in the field loc_name_canonical appropriate Canonical Name
for instance: “London,England,United Kingdom”
language string language
optional field
can have the following values: “ar”, “bg”, “ca”, “zh_cn”, “zh_tw”, “hr”, “cs”, “da”, “nl”, “en”, “et”, “tl”, “fi”, “fr”, “de”, “el”, “iw”, “hi”, “hu”, “is”, “id”, “it”, “ja”, “ko”, “lv”, “lt”, “ms”, “no”, “fa”, “pl”, “pt”, “ro”, “ru”, “sr”, “sk”, “sl”, “es”, “sv”, “th”, “tr”, “uk”, “ur”, “vi”
Source Google AdWords API - Languages available for targeting
keys array array of keywords
required field
all %## are decoded (plus symbol ‘+’ is decoded to a space character)

As a response of API server you will receive JSON array in the field results of which there will be keywords data.

Name of a field Type Description
status string general result
“ok” - successful
“error” - error
if status=“error”, then you will be able to see more detailed information about array error error
error array informational array of error
only if status=“error”
the list of possible errors can be found below.
      code integer error code
      message string text description of an error
results_time string execution time
results_count string number of elements in the array of results results
results array array of results
            language string language
            loc_id integer search engine location id
            key string keyword
keyword is returned decoded %## (plus symbol ‘+’ is decoded as a space character)
            cmp float competition
represents the relative amount of competition associated with the given keyword idea, relative to other keywords. This value will be between 0 and 1 (inclusive).
If there is no data then the value is null
            cpc float cost-per-click
represents the average cost per click (USD) historically paid for the keyword.
If there is no data then the value is null
            sv integer search volume for the last month
represents either the (approximate) number of searches for the given keyword idea on google.com or google.com and partners, depending on the user’s targeting.
If there is no data then the value is null
            ms array monthly searches
represents the (approximated) number of searches on this keyword idea (as available for the past twelve months), targeted to the specified geographies.
If there is no data then the value is null

Possible errors codes:

Error Code Meaning
404 “not found or not enough data: location” - you have specified nonexistent loc_id, or the location for the search engine wasn’t found according to your loc_name_canonical

Keywords for Domain

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com/', null, 'login', 'password');

    $kw_get_result = $client->get('v2/kwrd_for_domain/ranksonic.com/us/en');
    print_r($kw_get_result);

    //do something with results

} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
    exit();
}

$client = null;
?>
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task kwrd_for_domain()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };
            var domain = "ranksonic.com";
            var country = "us";
            var language = "en";
            var response = await httpClient.GetAsync($"v2/kwrd_for_domain/{domain}/{country}/{language}");
            var obj = JsonConvert.DeserializeObject<dynamic>(await response.Content.ReadAsStringAsync());
            if (obj.status == "error")
                Console.WriteLine($"error. Code: {obj.error.code} Message: {obj.error.message}");
            else
            {
                foreach (var result in obj.results)
                    Console.WriteLine(result);
            }
        }
    }
}
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")
domain = "ranksonic.com"
country_code = "us"
language = "en"
response = client.get("/v2/kwrd_for_domain/%s/%s/%s" % (domain, country_code, language))
if response["status"] == "error":
    print("error. Code: %d Message: %s" % (response["error"]["code"], response["error"]["message"]))
else:
    print(response["results"])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "5.6869 sec.",
    "results_count": 700,
    "results": [
        {
            "key": "seo checker",
            "cmp": 0.73449937159615,
            "cpc": 268.914463,
            "sv": 3600,
            "ms": [
                {
                    "year": 2016,
                    "month": 10,
                    "count": 4400
                },
                {
                    "year": 2016,
                    "month": 9,
                    "count": 3600
                },
                {
                    "year": 2016,
                    "month": 8,
                    "count": 4400
                },
                {
                    "year": 2016,
                    "month": 7,
                    "count": 3600
                },
                {
                    "year": 2016,
                    "month": 6,
                    "count": 4400
                },
                {
                    "year": 2016,
                    "month": 5,
                    "count": 3600
                },
                {
                    "year": 2016,
                    "month": 4,
                    "count": 3600
                },
                {
                    "year": 2016,
                    "month": 3,
                    "count": 3600
                },
                {
                    "year": 2016,
                    "month": 2,
                    "count": 3600
                },
                {
                    "year": 2016,
                    "month": 1,
                    "count": 3600
                },
                {
                    "year": 2015,
                    "month": 12,
                    "count": 2900
                },
                {
                    "year": 2015,
                    "month": 11,
                    "count": 2900
                }
            ]
        },
        {
            "key": "seo software",
            "cmp": 0.61448140900196,
            "cpc": 207.076566,
            "sv": 1600,
            "ms": [
                {
                    "year": 2016,
                    "month": 10,
                    "count": 1900
                },
                {
                    "year": 2016,
                    "month": 9,
                    "count": 2400
                },
                {
                    "year": 2016,
                    "month": 8,
                    "count": 1900
                },
                {
                    "year": 2016,
                    "month": 7,
                    "count": 1600
                },
                {
                    "year": 2016,
                    "month": 6,
                    "count": 1300
                },
                {
                    "year": 2016,
                    "month": 5,
                    "count": 1900
                },
                {
                    "year": 2016,
                    "month": 4,
                    "count": 2400
                },
                {
                    "year": 2016,
                    "month": 3,
                    "count": 1300
                },
                {
                    "year": 2016,
                    "month": 2,
                    "count": 1600
                },
                {
                    "year": 2016,
                    "month": 1,
                    "count": 1900
                },
                {
                    "year": 2015,
                    "month": 12,
                    "count": 1300
                },
                {
                    "year": 2015,
                    "month": 11,
                    "count": 1300
                }
            ]
        },


        {
            "key": "check serp ranking for keyword",
            "cmp": 0.097560975609756,
            "cpc": 0,
            "sv": 10,
            "ms": [
                {
                    "year": 2016,
                    "month": 10,
                    "count": 40
                },
                {
                    "year": 2016,
                    "month": 9,
                    "count": 50
                },
                {
                    "year": 2016,
                    "month": 8,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 7,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 6,
                    "count": 0
                },
                {
                    "year": 2016,
                    "month": 5,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 4,
                    "count": 20
                },
                {
                    "year": 2016,
                    "month": 3,
                    "count": 20
                },
                {
                    "year": 2016,
                    "month": 2,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 1,
                    "count": 10
                },
                {
                    "year": 2015,
                    "month": 12,
                    "count": 10
                },
                {
                    "year": 2015,
                    "month": 11,
                    "count": 10
                }
            ]
        }
    ]
}

This option will select keywords for a specified domain. In addition to keyword you will also receive search volume for the last month, search volume trend for the last year (that will let you estimate search volume dynamics), current cost-per-click and competition level for paid search.

The receiving of keywords is made by GET method with such parameters:

Name of a field Type Description
domain string domain
required field
you can also specify URL in single quotes, like
GET https://api.dataforseo.com/v2/kwrd_for_domain/'https://seo.com/page/'/us/en
country_code string ISO country code for this search engine
language string language
can have the following values: “ar”, “bg”, “ca”, “zh_cn”, “zh_tw”, “hr”, “cs”, “da”, “nl”, “en”, “et”, “tl”, “fi”, “fr”, “de”, “el”, “iw”, “hi”, “hu”, “is”, “id”, “it”, “ja”, “ko”, “lv”, “lt”, “ms”, “no”, “fa”, “pl”, “pt”, “ro”, “ru”, “sr”, “sk”, “sl”, “es”, “sv”, “th”, “tr”, “uk”, “ur”, “vi”
Source Google AdWords API - Languages available for targeting
sort_by string column to sort the results
can have the following values: “sv”, “relevance”
default value: “sv”

As a response of API server you will receive JSON array in the field results of which there will be data for the selected keywords. Maximum amount of the selected keywords is 700. Array of results is returned according to the sorted field sv.

Name of a field Type Description
status string general result
“ok” - successful
“error” - error
if status=“error”, then you will be able to see more detailed information about array error error
error array informational array of error
only if status=“error”
the list of possible errors can be found below.
      code integer error code
      message string text description of an error
results_time string execution time, seconds
results_count string number of elements in the array of results results
results array array of results
            key string keyword
            cmp float competition
represents the relative amount of competition associated with the given keyword idea, relative to other keywords. This value will be between 0 and 1 (inclusive).
If there is no data then the value is null
            cpc float cost-per-click
represents the average cost per click (USD) historically paid for the keyword.
If there is no data then the value is null
            sv integer search volume for the last month
represents either the (approximate) number of searches for the given keyword idea on google.com or google.com and partners, depending on the user’s targeting.
If there is no data then the value is null
            ms array monthly searches
represents the (approximated) number of searches on this keyword idea (as available for the past twelve months), targeted to the specified geographies.
If there is no data then the value is null

Keywords for Keywords

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com/', null, 'login', 'password');

    $post_array[] = array(
    "language" => "en",
    "loc_name_canonical"=> "United States",
    "keys" => array("seo", "seo agency", "seo marketing")
    );

    $kw_post_result = $client->post('v2/kwrd_for_keywords', array('data' => $post_array));
    print_r($kw_post_result);

    //do something with results

} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
    exit();
}

$client = null;
?>
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task kwrd_for_domain()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };

            var postArray = new object[]
            {
                new { language = "en", loc_name_canonical = "United States", keys = new {"seo", "seo agency", "seo marketing"} }
            };
            var response = await httpClient.PostAsync("v2/kwrd_for_keywords", new StringContent(JsonConvert.SerializeObject(new { data = postArray })));
            var obj = JsonConvert.DeserializeObject<dynamic>(await response.Content.ReadAsStringAsync());
            if (obj.status == "error")
                Console.WriteLine($"error. Code: {obj.error.code} Message: {obj.error.message}");
            else
            {
                foreach (var result in obj.results)
                    Console.WriteLine(result);
            }
        }
    }
}
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")

keywords_list = [
    dict(
        language="en",
        loc_name_canonical="United States",
        keys=["seo", "seo agency", "seo marketing"]
    )
]
response = client.post("/v2/kwrd_for_keywords", dict(data=keywords_list))
if response["status"] == "error":
    print("error. Code: %d Message: %s" % (response["error"]["code"], response["error"]["message"]))
else:
    print(response["results"])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "5.6869 sec.",
    "results_count": 700,
    "results": [
        {
            "key": "seo checker",
            "cmp": 0.73449937159615,
            "cpc": 268.914463,
            "sv": 3600,
            "ms": [
                {
                    "year": 2016,
                    "month": 10,
                    "count": 4400
                },
                {
                    "year": 2016,
                    "month": 9,
                    "count": 3600
                },
                {
                    "year": 2016,
                    "month": 8,
                    "count": 4400
                },
                {
                    "year": 2016,
                    "month": 7,
                    "count": 3600
                },
                {
                    "year": 2016,
                    "month": 6,
                    "count": 4400
                },
                {
                    "year": 2016,
                    "month": 5,
                    "count": 3600
                },
                {
                    "year": 2016,
                    "month": 4,
                    "count": 3600
                },
                {
                    "year": 2016,
                    "month": 3,
                    "count": 3600
                },
                {
                    "year": 2016,
                    "month": 2,
                    "count": 3600
                },
                {
                    "year": 2016,
                    "month": 1,
                    "count": 3600
                },
                {
                    "year": 2015,
                    "month": 12,
                    "count": 2900
                },
                {
                    "year": 2015,
                    "month": 11,
                    "count": 2900
                }
            ]
        },
        {
            "key": "seo software",
            "cmp": 0.61448140900196,
            "cpc": 207.076566,
            "sv": 1600,
            "ms": [
                {
                    "year": 2016,
                    "month": 10,
                    "count": 1900
                },
                {
                    "year": 2016,
                    "month": 9,
                    "count": 2400
                },
                {
                    "year": 2016,
                    "month": 8,
                    "count": 1900
                },
                {
                    "year": 2016,
                    "month": 7,
                    "count": 1600
                },
                {
                    "year": 2016,
                    "month": 6,
                    "count": 1300
                },
                {
                    "year": 2016,
                    "month": 5,
                    "count": 1900
                },
                {
                    "year": 2016,
                    "month": 4,
                    "count": 2400
                },
                {
                    "year": 2016,
                    "month": 3,
                    "count": 1300
                },
                {
                    "year": 2016,
                    "month": 2,
                    "count": 1600
                },
                {
                    "year": 2016,
                    "month": 1,
                    "count": 1900
                },
                {
                    "year": 2015,
                    "month": 12,
                    "count": 1300
                },
                {
                    "year": 2015,
                    "month": 11,
                    "count": 1300
                }
            ]
        },


        {
            "key": "check serp ranking for keyword",
            "cmp": 0.097560975609756,
            "cpc": 0,
            "sv": 10,
            "ms": [
                {
                    "year": 2016,
                    "month": 10,
                    "count": 40
                },
                {
                    "year": 2016,
                    "month": 9,
                    "count": 50
                },
                {
                    "year": 2016,
                    "month": 8,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 7,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 6,
                    "count": 0
                },
                {
                    "year": 2016,
                    "month": 5,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 4,
                    "count": 20
                },
                {
                    "year": 2016,
                    "month": 3,
                    "count": 20
                },
                {
                    "year": 2016,
                    "month": 2,
                    "count": 10
                },
                {
                    "year": 2016,
                    "month": 1,
                    "count": 10
                },
                {
                    "year": 2015,
                    "month": 12,
                    "count": 10
                },
                {
                    "year": 2015,
                    "month": 11,
                    "count": 10
                }
            ]
        }
    ]
}

This option will select keywords suggestions for specified keywords. In addition to result keywords you will also receive search volume for the last month, search volume trend for the last year (that will let you estimate search volume dynamics), current cost-per-click and competition level for paid search.

All POST data should be sent in the JSON format (UTF-8 encoding). The keywords are sent by POST method passing tasks array. The data should be specified in the data field of this POST array. We recommend to send up to 100 tasks at a time. Each array element has such structure:

Name of a field Type Description
loc_id integer search engine location id
optional field
you can specify one of the fields loc_id or loc_name_canonical
list of available locations for search engines loc_id you can receive by separate request List of Locations
please notice that we use Google Geographical Targeting, that’s why you are able to point in the field loc_id appropriate Criteria ID
loc_name_canonical string full name of a location for search engine
optional field
you can specify one of the fields loc_id or loc_name_canonical
list of the available locations for search engines with specifying of their loc_name_canonical you can receive by separate request List of Locations
please notice that we use Google Geographical Targeting, that’s why you are able to point in the field loc_name_canonical appropriate Canonical Name
for instance: “London,England,United Kingdom”
language string language
optional field
can have the following values: “ar”, “bg”, “ca”, “zh_cn”, “zh_tw”, “hr”, “cs”, “da”, “nl”, “en”, “et”, “tl”, “fi”, “fr”, “de”, “el”, “iw”, “hi”, “hu”, “is”, “id”, “it”, “ja”, “ko”, “lv”, “lt”, “ms”, “no”, “fa”, “pl”, “pt”, “ro”, “ru”, “sr”, “sk”, “sl”, “es”, “sv”, “th”, “tr”, “uk”, “ur”, “vi”
Source Google AdWords API - Languages available for targeting
sort_by string column to sort the results
can have the following values: “sv”, “relevance”
default value: “sv”
keys array array of keywords
required field
all %## are decoded (plus symbol ‘+’ is decoded to a space character)

As a response of API server you will receive JSON array in the field results of which there will be data for the selected keywords. Maximum amount of the selected keywords is 700. Array of results is returned according to the sorted field sv.

Name of a field Type Description
status string general result
“ok” - successful
“error” - error
if status=“error”, then you will be able to see more detailed information about array error error
error array informational array of error
only if status=“error”
the list of possible errors can be found below.
      code integer error code
      message string text description of an error
results_time string execution time, seconds
results_count string number of elements in the array of results results
results array array of results
            key string keyword
            cmp float competition
represents the relative amount of competition associated with the given keyword idea, relative to other keywords. This value will be between 0 and 1 (inclusive).
If there is no data then the value is null
            cpc float cost-per-click
represents the average cost per click (USD) historically paid for the keyword.
If there is no data then the value is null
            sv integer search volume for the last month
represents either the (approximate) number of searches for the given keyword idea on google.com or google.com and partners, depending on the user’s targeting.
If there is no data then the value is null
            ms array monthly searches
represents the (approximated) number of searches on this keyword idea (as available for the past twelve months), targeted to the specified geographies.
If there is no data then the value is null

Competitor Data API

Competitor API will provide you with information about your competitors.

The time to retrieve the result is up to 5 seconds.

Competitor Info

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com/', null, 'login', 'password');

    $cmp_get_result = $client->get('v2/cmp_get/asana.com');
    print_r($cmp_get_result);

    //do something with results

} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
    exit();
}

$client = null;
?>
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task cmp_get()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };
            var domain = "asana.com";
            var response = await httpClient.GetAsync($"v2/cmp_get/{domain}");
            var obj = JsonConvert.DeserializeObject<dynamic>(await response.Content.ReadAsStringAsync());
            if (obj.status == "error")
                Console.WriteLine($"error. Code: {obj.error.code} Message: {obj.error.message}");
            else
            {
                foreach (var result in obj.results)
                    Console.WriteLine(result);
            }
        }
    }
}
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")
domain = "asana.com"
response = client.get("/v2/cmp_get/%s" % (domain))
if response["status"] == "error":
    print("error. Code: %d Message: %s" % (response["error"]["code"], response["error"]["message"]))
else:
    print(response["results"])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "0.6756 sec.",
    "results_count": 1,
    "results": [
        {
            "date": "2017-01-01",
            "site_url": "asana.com",
            "site_title": "Use Asana to track your team’s work & manage projects · Asana",
            "site_description": "It’s free to use, simple to get started, and powerful enough to run your entire business. Sign up for free today.",
            "audience": {
                "visits": 19952871,
                "time_on_site_avg": "00:09:25",
                "page_views_avg": 6.9773123942789,
                "bounce_rate": 35.85
            },
            "traffic": {
                "value": 19952871,
                "percent": 100,
                "countries": [
                    {
                        "country": "United States",
                        "value": 6864349,
                        "percent": 34.4
                    },
                    {
                        "country": "United Kingdom",
                        "value": 1133338,
                        "percent": 5.68
                    },
                    {
                        "country": "Brazil",
                        "value": 705693,
                        "percent": 3.54
                    },
                    {
                        "country": "Canada",
                        "value": 703566,
                        "percent": 3.53
                    },
                    {
                        "country": "Poland",
                        "value": 700182,
                        "percent": 3.51
                    },
                    {
                        "country": "Other",
                        "value": 984474655,
                        "percent": 49.34
                    }
                ],
                "sources": {
                    "direct": {
                        "value": 11200942,
                        "percent": 56.14
                    },
                    "search_organic": {
                        "value": 1516235,
                        "percent": 7.6,
                        "top_keywords": [
                            {
                                "keyword": "asana",
                                "value": 1137732,
                                "percent": 75.04
                            },
                            {
                                "keyword": "asana app",
                                "value": 13908,
                                "percent": 0.92
                            },
                            {
                                "keyword": "independent director positions",
                                "value": 8174,
                                "percent": 0.54
                            },
                            {
                                "keyword": "poczta kwiatkowskiego 2b rzeszow",
                                "value": 7422,
                                "percent": 0.49
                            },
                            {
                                "keyword": "setting yourself up for acquisition",
                                "value": 6074,
                                "percent": 0.4
                            }
                        ]
                    },
                    "search_ad": {
                        "value": 101983,
                        "percent": 0.51,
                        "top_keywords": [
                            {
                                "keyword": "asana",
                                "value": 67707,
                                "percent": 66.39
                            },
                            {
                                "keyword": "timeline",
                                "value": 1288,
                                "percent": 1.26
                            },
                            {
                                "keyword": "to do list",
                                "value": 1181,
                                "percent": 1.16
                            },
                            {
                                "keyword": "task manager",
                                "value": 793,
                                "percent": 0.78
                            },
                            {
                                "keyword": "assana",
                                "value": 779,
                                "percent": 0.76
                            }
                        ]
                    },
                    "referral": {
                        "value": 4479578,
                        "percent": 22.45,
                        "top_referrals": [
                            {
                                "site": "blog.capterra.com",
                                "value": 204328,
                                "percent": 4.56
                            },
                            {
                                "site": "instagantt.com",
                                "value": 189092,
                                "percent": 4.22
                            },
                            {
                                "site": "news.ycombinator.com",
                                "value": 177579,
                                "percent": 3.96
                            },
                            {
                                "site": "github.com",
                                "value": 116090,
                                "percent": 2.59
                            },
                            {
                                "site": "symbaloo.com",
                                "value": 115508,
                                "percent": 2.58
                            }
                        ]
                    },
                    "referral_ad": {
                        "value": 8640,
                        "percent": 0.04,
                        "top_referrals": [
                            {
                                "site": "nytimes.com",
                                "value": 3173,
                                "percent": 36.73
                            },
                            {
                                "site": "recode.net",
                                "value": 1586,
                                "percent": 18.37
                            },
                            {
                                "site": "thenextweb.com",
                                "value": 1057,
                                "percent": 12.24
                            },
                            {
                                "site": "youtube.com",
                                "value": 881,
                                "percent": 10.2
                            },
                            {
                                "site": "inbox.google.com",
                                "value": 352,
                                "percent": 4.08
                            }
                        ]
                    },
                    "social": {
                        "value": 672103,
                        "percent": 3.37,
                        "top_socials": [
                            {
                                "site": "Facebook",
                                "value": 356595,
                                "percent": 53.06
                            },
                            {
                                "site": "Youtube",
                                "value": 135141,
                                "percent": 20.11
                            },
                            {
                                "site": "WhatsApp Webapp",
                                "value": 50327,
                                "percent": 7.49
                            },
                            {
                                "site": "Twitter",
                                "value": 34339,
                                "percent": 5.11
                            },
                            {
                                "site": "Linkedin",
                                "value": 24925,
                                "percent": 3.71
                            }
                        ]
                    },
                    "appstore": {
                        "value": 0,
                        "percent": 0,
                        "top_apps": [
                            {
                                "app_id": "com.asana.app",
                                "app_title": "Asana: Team Tasks & Projects",
                                "app_author": "Asana, Inc.",
                                "app_category": "Business",
                                "app_price": "Free",
                                "app_rating": 4.1412091255188,
                                "app_rating_count": 15948
                            },
                            {
                                "app_id": "489969512",
                                "app_title": "Asana: Team Tasks & Conversations",
                                "app_author": "Asana, Inc.",
                                "app_category": "Business",
                                "app_price": "0.0 EGP",
                                "app_rating": 4,
                                "app_rating_count": 2666
                            },
                            {
                                "app_id": "1175204125",
                                "app_title": "Answers For Lego Heroes Trivia Photo Games Pro",
                                "app_author": "Sukanda Tualek",
                                "app_category": "Games",
                                "app_price": "1.99 USD",
                                "app_rating": 0,
                                "app_rating_count": 0
                            }
                        ]
                    },
                    "mail": {
                        "value": 1973386,
                        "percent": 9.89
                    }
                },
                "estimated": {
                    "2016-08-01": 21392337,
                    "2016-09-01": 20358683,
                    "2016-10-01": 20588723,
                    "2016-11-01": 19146635,
                    "2016-12-01": 17345915,
                    "2017-01-01": 19952871
                }
            }
        }
    ]
}

This feature will provide you with information about traffic and its sources, as well as visits analysis of your competitors websites.

The receiving of information is made by GET method with such parameters:

Name of a field Type Description
domain string domain
required field

As a response of API server you will receive JSON array in the field results of which there will be data for the competitor domain.

Name of a field Type Description
status string general result
“ok” - successful
“error” - error
if status=“error”, then you will be able to see more detailed information about array error error
error array informational array of error
only if status=“error”
the list of possible errors can be found below.
      code integer error code
      message string text description of an error
results_time string execution time, seconds
results_count string number of elements in the array of results
results array array of results
      date string month when the information was received
in the format “year-month-date”
all information provided for this month
      site_url string domain URL
      site_title string main page ‘Title’ metatag
      site_description string main page ‘Description’ metatag
      audience array audience information
         visits integer total visits
         time_on_site_avg string average visit duration
         page_views_avg string average page views by visit
         bounce_rate string bounce rate
      traffic array traffic information
         value integer total traffic value
         percent float total traffic percentage
         countries array traffic by countries
            country string country
            value integer traffic value
            percent float traffic percentage
         sources array traffic sources
            direct array direct source
               value integer traffic value
               percent float traffic percentage
            search_organic array organic search
               value integer traffic value
               percent float traffic percentage
               top_keywords array top 5 organic search keywords
                  keyword string search keyword
                  value integer organic search value
                  percent float organic search percentage
            search_ad array paid search
               value integer traffic value
               percent float traffic percentage
               top_keywords array top 5 keywords
                  keyword string keyword
                  value integer paid search value
                  percent float paid search percentage
            referral array top referring sites
               value integer traffic value
               percent float traffic percentage
               top_referrals array top 5 referring sites
                  site string site
                  value integer referral traffic value
                  percent float referral traffic percentage
            referral_ad array advertising publishers
               value integer traffic value
               percent float traffic percentage
               top_referrals array top 5 publishers
                  site string site
                  value integer advertising referral traffic value
                  percent float advertising referral traffic percentage
            social array traffic from social media
               value integer traffic value
               percent float traffic percentage
               top_socials array top socials
                  site string social
                  value integer social traffic value
                  percent float social traffic percentage
            appstore array related apps
               value integer traffic value
               percent float traffic percentage
               top_apps array top applications
                  app_id string application ID
                  app_title string application title
                  app_author string application author
                  app_category string application category
                  app_price string application price
                  app_rating string application rating
                  app_rating_count string application rating count
            mail array source
               value integer traffic value
               percent float traffic percentage
         estimated array estimated traffic by months
            $month integer this month estimated traffic value

Common API

In this section we’ve collected the features that will be useful for using different API.

List of Search Engines

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com/', null, 'login', 'password');

    $se_get_result = $client->get('v2/cmn_se');
    print_r($se_get_result);

    //do something with se

} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
    exit();
}

$client = null;
?>
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task cmn_se()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };
            var response = await httpClient.GetAsync("v2/cmn_se");
            var obj = JsonConvert.DeserializeObject<dynamic>(await response.Content.ReadAsStringAsync());
            if (obj.status == "error")
                Console.WriteLine($"error. Code: {obj.error.code} Message: {obj.error.message}");
            else
            {
                foreach (var result in obj.results)
                    Console.WriteLine(result);
            }
        }
    }
}
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

client = RestClient("login", "password")
response = client.get("/v2/cmn_se")
if response["status"] == "error":
    print("error. Code: %d Message: %s" % (response["error"]["code"], response["error"]["message"]))
else:
    print(response["results"])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "0.0339 sec.",
    "results_count": 2127,
    "results": [
        {
            "se_id": 37,
            "se_name": "google.com.af",
            "se_country_iso_code": "AF",
            "se_country_name": "Afghanistan",
            "se_language": "Pashto",
            "se_localization": "ps-af"
        },
        {
            "se_id": 1444,
            "se_name": "google.com.af map pack",
            "se_country_iso_code": "AF",
            "se_country_name": "Afghanistan",
            "se_language": "Pashto",
            "se_localization": "ps-af"
        },

        {
            "se_id": 2122,
            "se_name": "google.co.zw news",
            "se_country_iso_code": "ZW",
            "se_country_name": "Zimbabwe",
            "se_language": "Zulu",
            "se_localization": "zu-zw"
        }
    ]
}

You will receive the list of available search engines that you are able to use at Rank Tracker API and SERP API.

As a response of API server you will get JSON array in the field results of which there will be the information about available search engines.

Name of a field Type Description
status string general result
“ok” - successful
“error” - error
if status=“error”, then you will be able to see more detailed information about array error error
error array informational array about error
only if status=“error”
the list of possible errors can be found below.
      code integer error code
      message string text description of an error
results_time string execution time, seconds
results_count string number of elements in the array of results results
results array array of search engines
            se_id integer search engine id
            se_name string search engine domain
            se_country_name string country for the search engine
            se_country_iso_code string ISO country code for the search engine
            se_language string language for the search engine
            se_localization string locale (search engine language + language of search engine interface)

List of Locations

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com/', null, 'login', 'password');

    $loc_get_result = $client->get('v2/cmn_locations');
    print_r($loc_get_result);

    //do something with se

} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
    exit();
}

$client = null;
?>
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task cmn_locations()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };
            var response = await httpClient.GetAsync("v2/cmn_locations");
            var obj = JsonConvert.DeserializeObject<dynamic>(await response.Content.ReadAsStringAsync());
            if (obj.status == "error")
                Console.WriteLine($"error. Code: {obj.error.code} Message: {obj.error.message}");
            else
            {
                foreach (var result in obj.results)
                    Console.WriteLine(result);
            }
        }
    }
}
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")
response = client.get("/v2/cmn_locations")
if response["status"] == "error":
    print("error. Code: %d Message: %s" % (response["error"]["code"], response["error"]["message"]))
else:
    print(response["results"])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "0.0392 sec.",
    "results_count": 36938,
    "results": [
        {
            "loc_id": 2004,
            "loc_id_parent": null,
            "loc_name": "Afghanistan",
            "loc_name_canonical": "Afghanistan",
            "loc_type": "Country",
            "loc_country_iso_code": "AF"
        },

        {
            "loc_id": 9067849,
            "loc_id_parent": 21199,
            "loc_name": "La Trinidad",
            "loc_name_canonical": "La Trinidad,Miranda,Venezuela",
            "loc_type": "City",
            "loc_country_iso_code": "VE"
        },
        {
            "loc_id": 9067850,
            "loc_id_parent": 2850,
            "loc_name": "Christiansted",
            "loc_name_canonical": "Christiansted,U.S. Virgin Islands",
            "loc_type": "City",
            "loc_country_iso_code": "VI"
        }
    ]
}

You will receive the list of available search engines that you are able to use at Rank Tracker API and SERP API.

We use Google Geographical Targeting, that’s why you can use it as a data source. To choose a location use gadw_Target_Type that is relevant ‘Country’, ‘State’, ‘Region’, ‘Municipality’, ‘City’.

As a response of API server you will get JSON array in the field results of which there will be the information about available locations.

Name of a field Type Des
status string general result
“ok” - successful
“error” - error
if status=“error”, then you will be able to see more detailed information about array error error
error array informational array about error
only if status=“error”
the list of possible errors can be found below
      code integer error code
      message string text description of an error
results_time string execution time, seconds
results_count string number of elements in the array of results results
results array array of locations
            loc_id integer location id
            loc_id_parent integer parent location id
            loc_name string location name
            loc_name_canonical string full name of a location
            loc_type string location type
            loc_country_iso_code string ISO country code of location

Get Keyword ID

Instead of ‘login’ and ‘password’ use your credentials from https://my.dataforseo.com/login

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com/', null, 'login', 'password');

    $key_get_result = $client->get('v2/cmn_key_id/online%20rank%20checker');
    print_r($key_get_result);

    //do something with result

} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
    exit();
}

$client = null;
?>
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task cmn_key_id()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };
            var keyword = "online rank checker";
            var response = await httpClient.GetAsync("v2/cmn_key_id/" + keyword);
            var obj = JsonConvert.DeserializeObject<dynamic>(await response.Content.ReadAsStringAsync());
            if (obj.status == "error")
                Console.WriteLine($"error. Code: {obj.error.code} Message: {obj.error.message}");
            else
                Console.WriteLine(obj.results[0].key_id);
        }
    }
}
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")
keyword = "online rank checker"
response = client.get("/v2/cmn_key_id/%s" % keyword)
if response["status"] == "error":
    print("error. Code: %d Message: %s" % (response["error"]["code"], response["error"]["message"]))
else:
    print(response["results"][0]["key_id"])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "0.0115 sec.",
    "results_count": 1,
    "results": [
        {
            "key_id": 1095202
        }
    ]
}

You can receive keyword key_id from our database (if there is no such keyword, it will be added and key_id created and returned), which you are able to use in Rank Tracker API and SERP API. Keyword key_id is unique and can’t be changed.

As a response of API server you will receive JSON array in the field results of which there will be the array of this keyword key_id.

Name of a field Type Description
status string general result
“ok” - successful
“error” - error
if status=“error”, then you will be able to see more detailed information about array error error
error array informational array of error
only if status=“error”
the list of possible errors can be found below.
      code integer error code
      message string text description of an error
results_time string execution time, seconds
results_count string number of the elements in the array of results results
results array
            key_id integer keyword id

User

Instead ‘login’ and ‘password’ use your credentials.

<?php
require('RestClient.php');
//You can download this file from here https://api.dataforseo.com/_examples/php/_php_RestClient.zip

try {
    $client = new RestClient('https://api.dataforseo.com/', null, 'login', 'password');

    $user_get_result = $client->get('v2/cmn_user');
    print_r($user_get_result);

    //do something with result

} catch (RestClientException $e) {
    echo "\n";
    print "HTTP code: {$e->getHttpCode()}\n";
    print "Error code: {$e->getCode()}\n";
    print "Message: {$e->getMessage()}\n";
    print  $e->getTraceAsString();
    echo "\n";
    exit();
}

$client = null;
?>
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task cmn_user()
        {
            var httpClient = new HttpClient {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };
            var response = await httpClient.GetAsync("v2/cmn_user");
            var obj = JsonConvert.DeserializeObject<dynamic>(await response.Content.ReadAsStringAsync());
            if (obj.status == "error")
                Console.WriteLine($"error. Code: {obj.error.code} Message: {obj.error.message}");
            else
                Console.WriteLine(obj.results[0]);
        }
    }
}
from client import RestClient
#You can download this file from here https://api.dataforseo.com/_examples/python/_python_Client.zip

client = RestClient("login", "password")
response = client.get("/v2/cmn_user")
if response["status"] == "error":
    print("error. Code: %d Message: %s" % (response["error"]["code"], response["error"]["message"]))
else:
    print(response["results"][0])

The above command returns JSON structured like this:

{
    "status": "ok",
    "results_time": "0.0173 sec.",
    "results_count": 1,
    "results": [
        {
            "login": "superlogin",
            "timezone": "Europe\/London",
            "rate_limit_per_minute": 1000,
            "rate": 1,
            "credit": 99999999,
            "balance": 99987531.5,
            "count_total": 12467.5,
            "count_rnk": 1466,
            "count_srp": 9149.5,
            "count_kwrd": 3047,
            "count_pg": 0,
            "count_cmp": 0,
            "price": {
                "apiRnk": {
                    "rnk_tasks_post": {
                        "priority_low": {
                            "price_type": "per_result",
                            "price": 1
                        },
                        "priority_normal": {
                            "price_type": "per_result",
                            "price": 1
                        },
                        "priority_high": {
                            "price_type": "per_result",
                            "price": 2
                        },
                        "priority_vip": {
                            "price_type": "per_result",
                            "price": 5
                        }
                    }
                },
                "apiSrp": {
                    "srp_tasks_post": {
                        "priority_low": {
                            "price_type": "per_result",
                            "price": 0
                        },
                        "priority_normal": {
                            "price_type": "per_result",
                            "price": 0
                        },
                        "priority_high": {
                            "price_type": "per_result",
                            "price": 2
                        },
                        "priority_vip": {
                            "price_type": "per_result",
                            "price": 5
                        }
                    },
                    "srp_100": {
                        "priority_low": {
                            "price_type": "per_request",
                            "price": 1
                        },
                        "priority_normal": {
                            "price_type": "per_request",
                            "price": 1
                        },
                        "priority_high": {
                            "price_type": "per_request",
                            "price": 1
                        },
                        "priority_vip": {
                            "price_type": "per_request",
                            "price": 1
                        }
                    },
                    "srp_tasks_get": {
                        "priority_low": {
                            "price_type": "per_request",
                            "price": 1
                        },
                        "priority_normal": {
                            "price_type": "per_request",
                            "price": 1
                        },
                        "priority_high": {
                            "price_type": "per_request",
                            "price": 1
                        },
                        "priority_vip": {
                            "price_type": "per_request",
                            "price": 1
                        }
                    }
                },
                "apiKwrd": {
                    "kwrd_for_domain": {
                        "priority_low": {
                            "price_type": "per_request",
                            "price": 100
                        },
                        "priority_normal": {
                            "price_type": "per_request",
                            "price": 100
                        },
                        "priority_high": {
                            "price_type": "per_request",
                            "price": 100
                        },
                        "priority_vip": {
                            "price_type": "per_request",
                            "price": 100
                        }
                    },
                    "kwrd_sv": {
                        "priority_low": {
                            "price_type": "per_result",
                            "price": 5
                        },
                        "priority_normal": {
                            "price_type": "per_result",
                            "price": 5
                        },
                        "priority_high": {
                            "price_type": "per_result",
                            "price": 5
                        },
                        "priority_vip": {
                            "price_type": "per_result",
                            "price": 5
                        }
                    }
                },
                "apiCmp": {
                    "cmp_get": {
                        "priority_low": {
                            "price_type": "per_request",
                            "price": 10
                        },
                        "priority_normal": {
                            "price_type": "per_request",
                            "price": 10
                        },
                        "priority_high": {
                            "price_type": "per_request",
                            "price": 10
                        },
                        "priority_vip": {
                            "price_type": "per_request",
                            "price": 10
                        }
                    }
                },
                "apiMtr": {
                    "mtr_moz_post": {
                        "priority_low": {
                            "price_type": "per_result",
                            "price": 1
                        },
                        "priority_normal": {
                            "price_type": "per_result",
                            "price": 1
                        },
                        "priority_high": {
                            "price_type": "per_result",
                            "price": 2
                        },
                        "priority_vip": {
                            "price_type": "per_result",
                            "price": 5
                        }
                    },
                    "mtr_maj_post": {
                        "priority_low": {
                            "price_type": "per_result",
                            "price": 1
                        },
                        "priority_normal": {
                            "price_type": "per_result",
                            "price": 1
                        },
                        "priority_high": {
                            "price_type": "per_result",
                            "price": 2
                        },
                        "priority_vip": {
                            "price_type": "per_result",
                            "price": 5
                        }
                    }
                }
            }
        }
    ]
}

Information about current user

As a response from API server you will get JSON array in the field results of which there will be the information about a user.

Name of a field Type Description
status string general result
“ok” - successful
“error” - error
if status=“error”, then you can see more detailed information about array error error
error array informational array of error
only if status=“error”
the list of possible errors can be found below.
      code integer error code
      message string text description of an error
results_time string execution time, seconds
results_count string number of the elements in the array of results results
results array
      login string your login
      timezone string your time zone
can be set at the settings of your profile
      rate_limit_per_minute integer limit of any requests per a minute
this limit is used for load balancing on our servers
      rate integer current number of requests per a minute
      credit integer total amount of credits passed to your account
      balance integer current balance of your account
credit-count_total
      count_total integer total amount of spent credits
count_rnk+count_srp+count_kwrd+count_pg
      count_rnk integer amount of credits spent on Rank Tracker API
      count_srp integer amount of credits spent on SERP API
      count_kwrd integer amount of credits spent on Keywords Data API
      count_pg integer amount of credits spent on On-Page API
      price array
         $api array API abbreviation
            $api_function array API function
               $priority array task priority
                  price_type string charge type
can take the values:
per_result - charge for every row in result array
per_request - charge for GET or POST request
                  price string the cost in credits