<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>How to Use OxyLabs Proxy (OxyLabs User Manual Navigation) &#8211; ProxySP</title>
	<atom:link href="https://proxysp.com/manuals/oxylabs-proxy/feed/" rel="self" type="application/rss+xml" />
	<link>https://proxysp.com</link>
	<description>The Best Proxy Service Provider Reviewed for 2025</description>
	<lastBuildDate>Thu, 01 Jan 1970 00:00:00 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.7</generator>

<image>
	<url>https://proxysp.com/wp-content/uploads/2021/01/icon-90x90.jpeg</url>
	<title>How to Use OxyLabs Proxy (OxyLabs User Manual Navigation) &#8211; ProxySP</title>
	<link>https://proxysp.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">149675634</site>	<item>
		<title>How to Use OxyLabs Proxy [Part 2]: OxyLabs Residential Proxies Manual</title>
		<link>https://proxysp.com/oxylabs-residential-proxies/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oxylabs-residential-proxies</link>
					<comments>https://proxysp.com/oxylabs-residential-proxies/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
				<category><![CDATA[How to Use OxyLabs Proxy (OxyLabs User Manual Navigation)]]></category>
		<guid isPermaLink="false">https://www.proxysp.com/?p=7621</guid>

					<description><![CDATA[Want to use OxyLabs' residential proxies? Then you can't miss this article. It is the most comprehensive OxyLabs residential proxies user guide. Quick Start This is &#8230;<p class="read-more"> <a class="ast-button" href="https://proxysp.com/oxylabs-residential-proxies/"> <span class="screen-reader-text">How to Use OxyLabs Proxy [Part 2]: OxyLabs Residential Proxies Manual</span> Read More &#187;</a></p>]]></description>
										<content:encoded><![CDATA[<blockquote><p>Want to use OxyLabs' residential proxies? Then you can't miss this article. It is the most comprehensive OxyLabs residential proxies user guide.</p></blockquote>
<h2 id="quick-start">Quick Start</h2>
<p>This is by far the fastest way to start using Residential Proxies. You will make a request to <code>https://ipinfo.io</code> using a residential proxy from a random location through our <a href="#basic-query">Backconnect Entry</a>. Don't forget to replace <code>USERNAME</code> and <code>PASSWORD</code> with your proxy user credentials.</p>
<pre>curl -x pr.oxylabs.io:7777 -U "customer-USERNAME:PASSWORD" https://ipinfo.io
</pre>
<p>Let's make a request using a proxy from France. All you need to do is add <code>cc-FR</code> to your username string. Below is an example in cURL, and <a href="#select-country">here</a> you can find code samples in other languages.</p>
<pre>curl -x pr.oxylabs.io:7777 -U "customer-USERNAME-cc-FR:PASSWORD" https://ipinfo.io
</pre>
<p>Here is one more example of a request that goes through a proxy from London, United Kingdom. Adding <code>cc-GB-city-london</code> to username string enables you to do just that. Click <a href="#select-city">here</a> to get more information on how to master city-level proxy targeting.</p>
<pre>curl -x pr.oxylabs.io:7777 -U "customer-USERNAME-cc-GB-city-london:PASSWORD" https://ipinfo.io
</pre>
<p>What if you want to keep the same proxy for more than one request? <a href="#session-control">Session control</a> enables that. Just add <code>sessid-abc12345</code> to your username string, where <code>abc12345</code> can be any random string, and as long as you keep sending requests with this string (session ID), we will try our best to give you the same proxy IP.</p>
<pre>curl -x pr.oxylabs.io:7777 -U "customer-USERNAME-sessid-randomString123:PASSWORD" https://ipinfo.io
</pre>
<p>Check out our <a href="#3rd-party-integrations">integration tutorials</a> with the most popular 3rd party tools, such as <a href="#multilogin">Multilogin</a>, <a href="#shadowrocket">ShadowRocket</a>, or <a href="#switchyomega">SwitchyOmega</a>.</p>
<p>If you have any additional questions, please contact your account manager or our support team at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<p>To find out your usage statistics, generated traffic, request count and more, please login to <a class="custom_link" href="https://dashboard.oxylabs.io/" target="_blank" rel="nofollow noopener">dashboard.oxylabs.io</a>. You can also add proxy users (subusers) and track their statistics separately.</p>
<hr />
<h2 id="backconnect-entry-node">Backconnect Entry Node</h2>
<pre>pr.oxylabs.io:7777
</pre>
<p>The single backconnect proxy enables to choose a specific country or city proxy via additional parameters in the username. This approach also supports session control. Below is a sample credentials structure:</p>
<pre>customer-USERNAME-cc-US-city-CITY-sessid-abcde12345:PASSWORD
</pre>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Parameter</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code class="required"><code>customer</code></code></td>
<td>Username</td>
</tr>
<tr>
<td><code>cc</code></td>
<td>Case insensitive country code in 2-letter <a class="custom_link" href="https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2" target="_blank" rel="nofollow noopener">3166-1 alpha-2 format</a>. For example, <code>DE</code> for Germany, <code>GB</code> for United Kingdom, <code>TH</code> for Thailand. More details on how to use country-specific proxies can be found <a href="#select-country">here</a>.</td>
</tr>
<tr>
<td><code>city</code></td>
<td>Case insensitive city name in English. This parameter has to accompanied by <code>cc</code> for better accuracy. For example, <code>cc-GB-city-london</code> for London, United Kingdom; <code>cc-DE-city-berlin</code> for Berlin, Germany. For a city with more than two words, replace space with <code>_</code>, for example <code>city-st_petersburg</code> or <code>city-rio_de_janeiro</code>.</p>
<p>We support every city in the world, but we do not guarantee we will have proxies there. Most popular cities are well covered, and will have many proxies to choose from. For reference, you can check <a class="custom_link" href="https://docs.oxylabs.io/resources/supported_cities.csv" target="_blank" rel="noopener">this list</a> of what cities you can expect to find. Click <a href="#select-city">here</a> for more information on city-level targeting.</td>
</tr>
<tr>
<td><code>st</code></td>
<td>Case insensitive US state name with us_ in the beginning, for example <code>us_california</code>, <code>us_illinois</code>. Full list of supported cities in TXT format can be downloaded <a class="custom_link" href="https://docs.oxylabs.io/resources/us_states.txt" target="_blank" rel="nofollow noopener">here</a>.</td>
</tr>
<tr>
<td><code>sessid</code></td>
<td>Session ID to keep the same IP with upcoming queries. Session expires after 10 minutes, after that a new IP is assigned to that ID. Random string; 0-9, A-z characters are supported.</td>
</tr>
<tr>
<td><code class="required"><code>password</code></code></td>
<td>Password</td>
</tr>
</tbody>
</table>
<p><code class="required">  </code> &#8211; required parameter</p>
</div>
We also support targeting by ASN number. It enables to choose proxies from specific carriers. This feature is enabled upon request.</p>
<p>If you add more than one <em>location</em> parameter in the username, the system will ignore all but one. Therefore it's important to understand which parameters get prioritized. The hierarchy is as follows:</p>
<ol>
<li><code>city</code></li>
<li><code>state</code></li>
<li><code>cc</code></li>
</ol>
<p>For example, if your query has these parameters <code>customer-username-cc-US-city-paris-st-us_california</code>, you will get a proxy from Paris, US.</p>
<hr />
<h3 id="entry-node-for-china">Entry Node for China</h3>
<pre>https://a81298871.com:8000 - Hong Kong
</pre>
<pre>https://cnt9t1is.com:8000 - Beijing
</pre>
<p>For better connectivity from China, we have configured entry nodes in Hong Kong and Beijing regions. Note that it is an HTTPS proxy node. All username parameters are identical to the regular entry node.</p>
<p>Please note that some 3rd party tools currently do not work with Hong Kong and Beijing entry nodes. 3rd party tools that work with said entry nodes are:</p>
<ol>
<li style="list-style-type: none;">
<ol>
<li style="list-style-type: none;">
<ol>
<li><a href="#oxylabs-proxy-manager">Oxylabs Proxy Manager</a></li>
<li><a href="#switchyomega">SwitchyOmega</a></li>
<li><a href="#shadowrocket">Shadowrocket</a></li>
<li><a href="#postern">Postern</a></li>
</ol>
</li>
</ol>
</li>
</ol>
<p><span style="font-size: 16px;">We are currently working on fixing the rest of the integrations on which HTTPS protocol will be supported.</span></p>
<p>If you are connecting to our residential network from China and still have issues with provided entry nodes, please get in touch at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a> and we will figure out a solution together.</p>
<hr />
<h2 id="basic-query">Basic Query</h2>
<p>Basic query only requires to pass <code>username</code> and <code>password</code>. No other parameters are needed. Such query will result in the request being made from a random IP address (proxy). Every new request will use a different proxy.</p>
<p>In this example a query to <code>ipinfo.io</code> is performed from a random IP:</p>
<pre>curl -x pr.oxylabs.io:7777 -U "customer-USERNAME:PASSWORD" https://ipinfo.io
</pre>
<hr />
<h2 id="select-country">Select Country</h2>
<p><img decoding="async" class="size-full wp-image-8123 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxies-Select-Country.png" alt="OxyLabs Residential Proxies Select Country" width="270" height="22" /></p>
<p>Adding <code>cc</code> flag to the authorization header enables to specify which country IP to use to process the request. The value of this parameter is a case insensitive country code in 2-letter <a class="custom_link" href="https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2" target="_blank" rel="nofollow noopener">3166-1 alpha-2 format</a>. For example, <code>DE</code> for Germany, <code>GB</code> for the United Kingdom, <code>TH</code> for Thailand proxy. See examples for more details.</p>
<p>In this example a query to <code>ipinfo.io</code> is performed from a random IP address from Germany:</p>
<pre>curl -x pr.oxylabs.io:7777 -U "customer-USERNAME-cc-DE:PASSWORD" https://ipinfo.io
</pre>
<hr />
<h2 id="select-state">Select State</h2>
<p><img decoding="async" class="size-full wp-image-8124 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxies-Select-State.png" alt="OxyLabs Residential Proxies Select State" width="272" height="24" /></p>
<p>To get proxy from a specified US state, add <code>st</code> flag to the authorization string. For example, <code>us_california</code>, <code>us_illinois</code>. Full list of supported cities in TXT format can be downloaded <a class="custom_link" href="https://docs.oxylabs.io/resources/us_states.txt" target="_blank" rel="nofollow noopener">here</a>.</p>
<p>In this example a query to <code>ipinfo.io</code> is performed from a random IP address from California, USA:</p>
<pre>curl -x pr.oxylabs.io:7777 -U "customer-USERNAME-st-us_california:PASSWORD" https://ipinfo.io
</pre>
<hr />
<h2 id="select-city">Select City</h2>
<p><img decoding="async" class="size-full wp-image-8125 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxies-Select-City.png" alt="OxyLabs Residential Proxies Select City" width="271" height="31" /></p>
<p>To narrow down to a city-level targeting, a <code>city</code> parameter needs to be added. For example, <code>cc-DE-city-munich</code> means that a proxy from Munich, Germany, will handle the query. We support every city in the world, but we do not guarantee we will have proxies there. Most popular cities are well covered, and will have many proxies to choose from.</p>
<p>Here are a few examples of valid combinations of <code>cc</code> and <code>city</code> parameters:<br />
<code>cc-US-city-los_angeles</code><br />
<code>cc-IT-city-rome</code><br />
<code>cc-TH-city-bangkok</code><br />
<code>cc-JP-city-tokyo</code><br />
<code>cc-AU-city-sydney</code><br />
<code>cc-ES-city-barcelona</code></p>
<p>In this example a query to <code>ipinfo.io</code> is performed from a random IP address from Munich, Germany:</p>
<pre>curl -x pr.oxylabs.io:7777 -U "customer-USERNAME-cc-DE-city-munich:PASSWORD" https://ipinfo.io
</pre>
<hr />
<h2 id="session-control">Session Control</h2>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8126 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxies-Session-Control.png" alt="OxyLabs Residential Proxies Session Control" width="268" height="29" /></p>
<p>Adding <code>sessid</code> parameter with session ID string, for example <code>sessid-abc12345</code>, enables session control. This means that the proxy will not change with the following requests. The example below shows how session control works:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8127" src="https://www.proxysp.com/wp-content/uploads/2021/09/session-control.gif" alt="session-control" width="853" height="378" /></p>
<p>The system keeps the same IP associated with a particular session ID as long as there is some activity (requests). After 60 seconds of inactivity, the IP is automatically changed to a different one.</p>
<p>For example: * Your initial query with <code>sessid-random123</code> got assigned proxy IP address <code>1.1.1.1</code> * As long as you keep sending new requests with the same session ID and that IP address is online and available, the system will route your queries through <code>1.1.1.1</code> * If you stop sending requests or the IP address is no longer online, the system will assign a new proxy IP after 60 seconds. * This means that your next query with <code>sessid-random123</code> will be routed through a different IP address.</p>
<p>Standard session time is 10 minutes, but it can be increased. Contact your account manager to learn more.</p>
<p>German IP will be chosen for the first request, and then the same IP will be kept with new queries (session control):</p>
<pre>curl -x pr.oxylabs.io:7777 -U "customer-USERNAME-cc-DE-sessid-abcde12345:PASSWORD" https://ipinfo.io
</pre>
<hr />
<h2 id="country-specific-entry-nodes">Country Specific Entry Nodes</h2>
<h3 id="random-proxy-entry-nodes">Random Proxy Entry Nodes</h3>
<p>Oxylabs residential network has coverage in almost every country in the world. Country-specific random proxy entry point will return new IP with every new request.</p>
<p>You do not need to pass any additional parameters, just <code>customer-username:password</code>. If you have whitelisted IPs, you do not need to pass login credentials. Country-specific ports do not support city-level results.</p>
<p>Please see the dashboard for entry point information or download a full list of random entry points in XLS <a class="custom_link" href="https://docs.oxylabs.io/resources/random-proxy-entry-points-oxylabs.xls" target="_blank" rel="nofollow noopener">here</a>.</p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="443">
<tbody>
<tr>
<td style="font-weight: 400;" width="138">Random</td>
<td style="font-weight: 400;" width="140">USA</td>
<td style="font-weight: 400;" width="165">Canada</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">pr.oxylabs.io:7777</td>
<td style="font-weight: 400;" width="140">us-pr.oxylabs.io:10000</td>
<td style="font-weight: 400;" width="165">ca-pr.oxylabs.io:30000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">GB</td>
<td style="font-weight: 400;" width="140">Germany</td>
<td style="font-weight: 400;" width="165">France</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">gb-pr.oxylabs.io:20000</td>
<td style="font-weight: 400;" width="140">de-pr.oxylabs.io:30000</td>
<td style="font-weight: 400;" width="165">fr-pr.oxylabs.io:40000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Spain</td>
<td style="font-weight: 400;" width="140">Italy</td>
<td style="font-weight: 400;" width="165">Sweden</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">es-pr.oxylabs.io:10000</td>
<td style="font-weight: 400;" width="140">it-pr.oxylabs.io:20000</td>
<td style="font-weight: 400;" width="165">se-pr.oxylabs.io:30000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Greece</td>
<td style="font-weight: 400;" width="140">Portugal</td>
<td style="font-weight: 400;" width="165">Netherlands</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">gr-pr.oxylabs.io:40000</td>
<td style="font-weight: 400;" width="140">pt-pr.oxylabs.io:10000</td>
<td style="font-weight: 400;" width="165">nl-pr.oxylabs.io:20000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Belgium</td>
<td style="font-weight: 400;" width="140">Russia</td>
<td style="font-weight: 400;" width="165">Ukraine</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">be-pr.oxylabs.io:30000</td>
<td style="font-weight: 400;" width="140">ru-pr.oxylabs.io:40000</td>
<td style="font-weight: 400;" width="165">ua-pr.oxylabs.io:10000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Poland</td>
<td style="font-weight: 400;" width="140">Israel</td>
<td style="font-weight: 400;" width="165">Turkey</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">pl-pr.oxylabs.io:20000</td>
<td style="font-weight: 400;" width="140">il-pr.oxylabs.io:20000</td>
<td style="font-weight: 400;" width="165">tr-pr.oxylabs.io:30000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Australia</td>
<td style="font-weight: 400;" width="140">Malaysia</td>
<td style="font-weight: 400;" width="165">Thailand</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">au-pr.oxylabs.io:40000</td>
<td style="font-weight: 400;" width="140">my-pr.oxylabs.io:10000</td>
<td style="font-weight: 400;" width="165">th-pr.oxylabs.io:20000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">South Korea</td>
<td style="font-weight: 400;" width="140">Japan</td>
<td style="font-weight: 400;" width="165">Philippines</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">kr-pr.oxylabs.io:30000</td>
<td style="font-weight: 400;" width="140">jp-pr.oxylabs.io:40000</td>
<td style="font-weight: 400;" width="165">ph-pr.oxylabs.io:10000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Singapore</td>
<td style="font-weight: 400;" width="140">China</td>
<td style="font-weight: 400;" width="165">Hong Kong</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">sg-pr.oxylabs.io:20000</td>
<td style="font-weight: 400;" width="140">cn-pr.oxylabs.io:30000</td>
<td style="font-weight: 400;" width="165">hk-pr.oxylabs.io:40000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Taiwan</td>
<td style="font-weight: 400;" width="140">India</td>
<td style="font-weight: 400;" width="165">Pakistan</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">tw-pr.oxylabs.io:10000</td>
<td style="font-weight: 400;" width="140">in-pr.oxylabs.io:20000</td>
<td style="font-weight: 400;" width="165">pk-pr.oxylabs.io:30000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Iran</td>
<td style="font-weight: 400;" width="140">Indonesia</td>
<td style="font-weight: 400;" width="165">Azerbaijan</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">ir-pr.oxylabs.io:40000</td>
<td style="font-weight: 400;" width="140">id-pr.oxylabs.io:10000</td>
<td style="font-weight: 400;" width="165">az-pr.oxylabs.io:20000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Kazakhstan</td>
<td style="font-weight: 400;" width="140">UAE</td>
<td style="font-weight: 400;" width="165">Mexico</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">kz-pr.oxylabs.io:30000</td>
<td style="font-weight: 400;" width="140">ae-pr.oxylabs.io:40000</td>
<td style="font-weight: 400;" width="165">mx-pr.oxylabs.io:10000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Brazil</td>
<td style="font-weight: 400;" width="140">Argentina</td>
<td style="font-weight: 400;" width="165">Chile</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">br-pr.oxylabs.io:20000</td>
<td style="font-weight: 400;" width="140">ar-pr.oxylabs.io:30000</td>
<td style="font-weight: 400;" width="165">cl-pr.oxylabs.io:40000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Peru</td>
<td style="font-weight: 400;" width="140">Ecuador</td>
<td style="font-weight: 400;" width="165">Colombia</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">pe-pr.oxylabs.io:10000</td>
<td style="font-weight: 400;" width="140">ec-pr.oxylabs.io:20000</td>
<td style="font-weight: 400;" width="165">co-pr.oxylabs.io:30000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">South Africa</td>
<td style="font-weight: 400;" width="140">Egypt</td>
<td style="font-weight: 400;" width="165">Angola</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">za-pr.oxylabs.io:40000</td>
<td style="font-weight: 400;" width="140">eg-pr.oxylabs.io:10000</td>
<td style="font-weight: 400;" width="165">ao-pr.oxylabs.io:40000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Cameroon</td>
<td style="font-weight: 400;" width="140">Central African Republic</td>
<td style="font-weight: 400;" width="165">Chad</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">cm-pr.oxylabs.io:41000</td>
<td style="font-weight: 400;" width="140">cf-pr.oxylabs.io:42000</td>
<td style="font-weight: 400;" width="165">td-pr.oxylabs.io:43000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Benin</td>
<td style="font-weight: 400;" width="140">Ethiopia</td>
<td style="font-weight: 400;" width="165">Djibouti</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">bj-pr.oxylabs.io:44000</td>
<td style="font-weight: 400;" width="140">et-pr.oxylabs.io:45000</td>
<td style="font-weight: 400;" width="165">dj-pr.oxylabs.io:46000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Gambia</td>
<td style="font-weight: 400;" width="140">Ghana</td>
<td style="font-weight: 400;" width="165">Côte d'Ivoire</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">gm-pr.oxylabs.io:47000</td>
<td style="font-weight: 400;" width="140">gh-pr.oxylabs.io:48000</td>
<td style="font-weight: 400;" width="165">ci-pr.oxylabs.io:49000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Kenya</td>
<td style="font-weight: 400;" width="140">Liberia</td>
<td style="font-weight: 400;" width="165">Madagascar</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">ke-pr.oxylabs.io:10000</td>
<td style="font-weight: 400;" width="140">lr-pr.oxylabs.io:11000</td>
<td style="font-weight: 400;" width="165">mg-pr.oxylabs.io:12000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Mali</td>
<td style="font-weight: 400;" width="140">Mauritania</td>
<td style="font-weight: 400;" width="165">Mauritius</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">ml-pr.oxylabs.io:13000</td>
<td style="font-weight: 400;" width="140">mr-pr.oxylabs.io:14000</td>
<td style="font-weight: 400;" width="165">mu-pr.oxylabs.io:15000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Morocco</td>
<td style="font-weight: 400;" width="140">Mozambique</td>
<td style="font-weight: 400;" width="165">Nigeria</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">ma-pr.oxylabs.io:16000</td>
<td style="font-weight: 400;" width="140">mz-pr.oxylabs.io:17000</td>
<td style="font-weight: 400;" width="165">ng-pr.oxylabs.io:18000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Senegal</td>
<td style="font-weight: 400;" width="140">Seychelles</td>
<td style="font-weight: 400;" width="165">Zimbabwe</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">sn-pr.oxylabs.io:19000</td>
<td style="font-weight: 400;" width="140">sc-pr.oxylabs.io:20000</td>
<td style="font-weight: 400;" width="165">zw-pr.oxylabs.io:21000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">South Sudan</td>
<td style="font-weight: 400;" width="140">Sudan</td>
<td style="font-weight: 400;" width="165">Togo</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">ss-pr.oxylabs.io:22000</td>
<td style="font-weight: 400;" width="140">sd-pr.oxylabs.io:23000</td>
<td style="font-weight: 400;" width="165">tg-pr.oxylabs.io:24000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Tunisia</td>
<td style="font-weight: 400;" width="140">Uganda</td>
<td style="font-weight: 400;" width="165">Zambia</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">tn-pr.oxylabs.io:25000</td>
<td style="font-weight: 400;" width="140">ug-pr.oxylabs.io:26000</td>
<td style="font-weight: 400;" width="165">zm-pr.oxylabs.io:27000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Afghanistan</td>
<td style="font-weight: 400;" width="140">Bahrain</td>
<td style="font-weight: 400;" width="165">Bangladesh</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">af-pr.oxylabs.io:28000</td>
<td style="font-weight: 400;" width="140">bh-pr.oxylabs.io:29000</td>
<td style="font-weight: 400;" width="165">bd-pr.oxylabs.io:30000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Armenia</td>
<td style="font-weight: 400;" width="140">Bhutan</td>
<td style="font-weight: 400;" width="165">Myanmar</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">am-pr.oxylabs.io:31000</td>
<td style="font-weight: 400;" width="140">bt-pr.oxylabs.io:32000</td>
<td style="font-weight: 400;" width="165">mm-pr.oxylabs.io:33000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Cambodia</td>
<td style="font-weight: 400;" width="140">Georgia</td>
<td style="font-weight: 400;" width="165">Iraq</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">kh-pr.oxylabs.io:34000</td>
<td style="font-weight: 400;" width="140">ge-pr.oxylabs.io:36000</td>
<td style="font-weight: 400;" width="165">iq-pr.oxylabs.io:37000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Jordan</td>
<td style="font-weight: 400;" width="140">Lebanon</td>
<td style="font-weight: 400;" width="165">Maldives</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">jo-pr.oxylabs.io:38000</td>
<td style="font-weight: 400;" width="140">lb-pr.oxylabs.io:39000</td>
<td style="font-weight: 400;" width="165">mv-pr.oxylabs.io:40000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Mongolia</td>
<td style="font-weight: 400;" width="140">Oman</td>
<td style="font-weight: 400;" width="165">Qatar</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">mn-pr.oxylabs.io:41000</td>
<td style="font-weight: 400;" width="140">om-pr.oxylabs.io:42000</td>
<td style="font-weight: 400;" width="165">qa-pr.oxylabs.io:43000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Saudi Arabia</td>
<td style="font-weight: 400;" width="140">Vietnam</td>
<td style="font-weight: 400;" width="165">Turkmenistan</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">sa-pr.oxylabs.io:44000</td>
<td style="font-weight: 400;" width="140">vn-pr.oxylabs.io:45000</td>
<td style="font-weight: 400;" width="165">tm-pr.oxylabs.io:46000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Uzbekistan</td>
<td style="font-weight: 400;" width="140">Yemen</td>
<td style="font-weight: 400;" width="165">Albania</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">uz-pr.oxylabs.io:47000</td>
<td style="font-weight: 400;" width="140">ye-pr.oxylabs.io:48000</td>
<td style="font-weight: 400;" width="165">al-pr.oxylabs.io:49000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Andorra</td>
<td style="font-weight: 400;" width="140">Austria</td>
<td style="font-weight: 400;" width="165">Bosnia and Herzegovina</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">ad-pr.oxylabs.io:10000</td>
<td style="font-weight: 400;" width="140">at-pr.oxylabs.io:11000</td>
<td style="font-weight: 400;" width="165">ba-pr.oxylabs.io:13000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Bulgaria</td>
<td style="font-weight: 400;" width="140">Belarus</td>
<td style="font-weight: 400;" width="165">Croatia</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">bg-pr.oxylabs.io:14000</td>
<td style="font-weight: 400;" width="140">by-pr.oxylabs.io:15000</td>
<td style="font-weight: 400;" width="165">hr-pr.oxylabs.io:16000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Cyprus</td>
<td style="font-weight: 400;" width="140">Czech Republic</td>
<td style="font-weight: 400;" width="165">Denmark</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">cy-pr.oxylabs.io:35000</td>
<td style="font-weight: 400;" width="140">cz-pr.oxylabs.io:18000</td>
<td style="font-weight: 400;" width="165">dk-pr.oxylabs.io:19000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Estonia</td>
<td style="font-weight: 400;" width="140">Finland</td>
<td style="font-weight: 400;" width="165">Hungary</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">ee-pr.oxylabs.io:20000</td>
<td style="font-weight: 400;" width="140">fi-pr.oxylabs.io:21000</td>
<td style="font-weight: 400;" width="165">hu-pr.oxylabs.io:23000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Iceland</td>
<td style="font-weight: 400;" width="140">Ireland</td>
<td style="font-weight: 400;" width="165">Latvia</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">is-pr.oxylabs.io:24000</td>
<td style="font-weight: 400;" width="140">ie-pr.oxylabs.io:25000</td>
<td style="font-weight: 400;" width="165">lv-pr.oxylabs.io:26000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Liechtenstein</td>
<td style="font-weight: 400;" width="140">Lithuania</td>
<td style="font-weight: 400;" width="165">Luxembourg</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">li-pr.oxylabs.io:27000</td>
<td style="font-weight: 400;" width="140">lt-pr.oxylabs.io:28000</td>
<td style="font-weight: 400;" width="165">lu-pr.oxylabs.io:29000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Malta</td>
<td style="font-weight: 400;" width="140">Monaco</td>
<td style="font-weight: 400;" width="165">Moldova</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">mt-pr.oxylabs.io:30000</td>
<td style="font-weight: 400;" width="140">mc-pr.oxylabs.io:31000</td>
<td style="font-weight: 400;" width="165">md-pr.oxylabs.io:32000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Montenegro</td>
<td style="font-weight: 400;" width="140">Norway</td>
<td style="font-weight: 400;" width="165">Romania</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">me-pr.oxylabs.io:33000</td>
<td style="font-weight: 400;" width="140">no-pr.oxylabs.io:34000</td>
<td style="font-weight: 400;" width="165">ro-pr.oxylabs.io:35000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Serbia</td>
<td style="font-weight: 400;" width="140">Slovakia</td>
<td style="font-weight: 400;" width="165">Slovenia</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">rs-pr.oxylabs.io:36000</td>
<td style="font-weight: 400;" width="140">sk-pr.oxylabs.io:37000</td>
<td style="font-weight: 400;" width="165">si-pr.oxylabs.io:38000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Switzerland</td>
<td style="font-weight: 400;" width="140">Macedonia</td>
<td style="font-weight: 400;" width="165">Bahamas</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">ch-pr.oxylabs.io:39000</td>
<td style="font-weight: 400;" width="140">mk-pr.oxylabs.io:40000</td>
<td style="font-weight: 400;" width="165">bs-pr.oxylabs.io:41000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Belize</td>
<td style="font-weight: 400;" width="140">British Virgin Islands</td>
<td style="font-weight: 400;" width="165">Costa Rica</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">bz-pr.oxylabs.io:42000</td>
<td style="font-weight: 400;" width="140">vg-pr.oxylabs.io:43000</td>
<td style="font-weight: 400;" width="165">cr-pr.oxylabs.io:44000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Cuba</td>
<td style="font-weight: 400;" width="140">Dominica</td>
<td style="font-weight: 400;" width="165">Haiti</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">cu-pr.oxylabs.io:45000</td>
<td style="font-weight: 400;" width="140">dm-pr.oxylabs.io:46000</td>
<td style="font-weight: 400;" width="165">ht-pr.oxylabs.io:47000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Honduras</td>
<td style="font-weight: 400;" width="140">Jamaica</td>
<td style="font-weight: 400;" width="165">Aruba</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">hn-pr.oxylabs.io:48000</td>
<td style="font-weight: 400;" width="140">jm-pr.oxylabs.io:49000</td>
<td style="font-weight: 400;" width="165">aw-pr.oxylabs.io:10000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Panama</td>
<td style="font-weight: 400;" width="140">Puerto Rico</td>
<td style="font-weight: 400;" width="165">Trinidad and Tobago</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">pa-pr.oxylabs.io:11000</td>
<td style="font-weight: 400;" width="140">pr-pr.oxylabs.io:12000</td>
<td style="font-weight: 400;" width="165">tt-pr.oxylabs.io:13000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Fiji</td>
<td style="font-weight: 400;" width="140">New Zealand</td>
<td style="font-weight: 400;" width="165">Bolivia</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">fj-pr.oxylabs.io:14000</td>
<td style="font-weight: 400;" width="140">nz-pr.oxylabs.io:15000</td>
<td style="font-weight: 400;" width="165">bo-pr.oxylabs.io:16000</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">Paraguay</td>
<td style="font-weight: 400;" width="140">Uruguay</td>
<td style="font-weight: 400;" width="165">Venezuela</td>
</tr>
<tr>
<td style="font-weight: 400;" width="138">py-pr.oxylabs.io:17000</td>
<td style="font-weight: 400;" width="140">uy-pr.oxylabs.io:18000</td>
<td style="font-weight: 400;" width="165">ve-pr.oxylabs.io:19000</td>
</tr>
</tbody>
</table>
</div>
<p>In this example a query to <code>ipinfo.io</code> is performed from a random Turkey IP:</p>
<pre>curl -x tr-pr.oxylabs.io:30000 -U "customer-USERNAME:PASSWORD" https://ipinfo.io
</pre>
<pre>pr.oxylabs.io:7777
us-pr.oxylabs.io:10000
ca-pr.oxylabs.io:30000
gb-pr.oxylabs.io:20000
de-pr.oxylabs.io:30000
fr-pr.oxylabs.io:40000
es-pr.oxylabs.io:10000
it-pr.oxylabs.io:20000
se-pr.oxylabs.io:30000
gr-pr.oxylabs.io:40000
pt-pr.oxylabs.io:10000
nl-pr.oxylabs.io:20000
be-pr.oxylabs.io:30000
ru-pr.oxylabs.io:40000
ua-pr.oxylabs.io:10000
pl-pr.oxylabs.io:20000
il-pr.oxylabs.io:20000
tr-pr.oxylabs.io:30000
au-pr.oxylabs.io:40000
my-pr.oxylabs.io:10000
th-pr.oxylabs.io:20000
kr-pr.oxylabs.io:30000
jp-pr.oxylabs.io:40000
ph-pr.oxylabs.io:10000
sg-pr.oxylabs.io:20000
cn-pr.oxylabs.io:30000
hk-pr.oxylabs.io:40000
tw-pr.oxylabs.io:10000
in-pr.oxylabs.io:20000
pk-pr.oxylabs.io:30000
ir-pr.oxylabs.io:40000
id-pr.oxylabs.io:10000
az-pr.oxylabs.io:20000
kz-pr.oxylabs.io:30000
ae-pr.oxylabs.io:40000
mx-pr.oxylabs.io:10000
br-pr.oxylabs.io:20000
ar-pr.oxylabs.io:30000
cl-pr.oxylabs.io:40000
pe-pr.oxylabs.io:10000
ec-pr.oxylabs.io:20000
co-pr.oxylabs.io:30000
za-pr.oxylabs.io:40000
eg-pr.oxylabs.io:10000
sa-pr.oxylabs.io:44000
dk-pr.oxylabs.io:19000
ao-pr.oxylabs.io:40000
cm-pr.oxylabs.io:41000
cf-pr.oxylabs.io:42000
td-pr.oxylabs.io:43000
bj-pr.oxylabs.io:44000
et-pr.oxylabs.io:45000
dj-pr.oxylabs.io:46000
gm-pr.oxylabs.io:47000
gh-pr.oxylabs.io:48000
ci-pr.oxylabs.io:49000
ke-pr.oxylabs.io:10000
lr-pr.oxylabs.io:11000
mg-pr.oxylabs.io:12000
ml-pr.oxylabs.io:13000
mr-pr.oxylabs.io:14000
mu-pr.oxylabs.io:15000
ma-pr.oxylabs.io:16000
mz-pr.oxylabs.io:17000
ng-pr.oxylabs.io:18000
sn-pr.oxylabs.io:19000
sc-pr.oxylabs.io:20000
zw-pr.oxylabs.io:21000
ss-pr.oxylabs.io:22000
sd-pr.oxylabs.io:23000
tg-pr.oxylabs.io:24000
tn-pr.oxylabs.io:25000
ug-pr.oxylabs.io:26000
zm-pr.oxylabs.io:27000
af-pr.oxylabs.io:28000
bh-pr.oxylabs.io:29000
bd-pr.oxylabs.io:30000
am-pr.oxylabs.io:31000
bt-pr.oxylabs.io:32000
mm-pr.oxylabs.io:33000
kh-pr.oxylabs.io:34000
ge-pr.oxylabs.io:36000
iq-pr.oxylabs.io:37000
jo-pr.oxylabs.io:38000
lb-pr.oxylabs.io:39000
mv-pr.oxylabs.io:40000
mn-pr.oxylabs.io:41000
om-pr.oxylabs.io:42000
qa-pr.oxylabs.io:43000
sa-pr.oxylabs.io:44000
vn-pr.oxylabs.io:45000
tm-pr.oxylabs.io:46000
uz-pr.oxylabs.io:47000
ye-pr.oxylabs.io:48000
al-pr.oxylabs.io:49000
ad-pr.oxylabs.io:10000
at-pr.oxylabs.io:11000
ba-pr.oxylabs.io:13000
bg-pr.oxylabs.io:14000
by-pr.oxylabs.io:15000
hr-pr.oxylabs.io:16000
cy-pr.oxylabs.io:35000
cz-pr.oxylabs.io:18000
dk-pr.oxylabs.io:19000
ee-pr.oxylabs.io:20000
fi-pr.oxylabs.io:21000
hu-pr.oxylabs.io:23000
is-pr.oxylabs.io:24000
ie-pr.oxylabs.io:25000
lv-pr.oxylabs.io:26000
li-pr.oxylabs.io:27000
lt-pr.oxylabs.io:28000
lu-pr.oxylabs.io:29000
mt-pr.oxylabs.io:30000
mc-pr.oxylabs.io:31000
md-pr.oxylabs.io:32000
me-pr.oxylabs.io:33000
no-pr.oxylabs.io:34000
ro-pr.oxylabs.io:35000
rs-pr.oxylabs.io:36000
sk-pr.oxylabs.io:37000
si-pr.oxylabs.io:38000
ch-pr.oxylabs.io:39000
mk-pr.oxylabs.io:40000
bs-pr.oxylabs.io:41000
bz-pr.oxylabs.io:42000
vg-pr.oxylabs.io:43000
cr-pr.oxylabs.io:44000
cu-pr.oxylabs.io:45000
dm-pr.oxylabs.io:46000
ht-pr.oxylabs.io:47000
hn-pr.oxylabs.io:48000
jm-pr.oxylabs.io:49000
aw-pr.oxylabs.io:10000
pa-pr.oxylabs.io:11000
pr-pr.oxylabs.io:12000
tt-pr.oxylabs.io:13000
fj-pr.oxylabs.io:14000
nz-pr.oxylabs.io:15000
bo-pr.oxylabs.io:16000
py-pr.oxylabs.io:17000
uy-pr.oxylabs.io:18000
ve-pr.oxylabs.io:19000
kw-pr.oxylabs.io:20000
</pre>
<hr />
<h3 id="sticky-proxy-entry-nodes">Sticky Proxy Entry Nodes</h3>
<p>Country-specific sticky proxy entry point will return the same IP with every new request while you will use the same port. IP stickiness works for up to 10 minutes. After that, the IP is replaced with a new one.</p>
<p>You do not need to pass any additional parameters, just <code>customer-username:password</code>. If you have whitelisted IPs, you do not need to pass login credentials. Country-specific ports do not support city-level results.</p>
<p>Please see the dashboard for entry point information or download a full list of sticky entry points in XLS <a class="custom_link" href="https://docs.oxylabs.io/resources/sticky-proxy-entry-points-oxylabs.xls" target="_blank" rel="nofollow noopener">here</a>.</p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="678">
<tbody>
<tr>
<td style="font-weight: 400;" width="197">Random</td>
<td style="font-weight: 400;" width="223">USA</td>
<td style="font-weight: 400;" width="258">Canada</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">pr.oxylabs.io:10000 &#8211; 49999</td>
<td style="font-weight: 400;" width="223">us-pr.oxylabs.io:10001 &#8211; 19999</td>
<td style="font-weight: 400;" width="258">ca-pr.oxylabs.io:30001 &#8211; 39999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">Great Britain</td>
<td style="font-weight: 400;" width="223">Germany</td>
<td style="font-weight: 400;" width="258">France</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">gb-pr.oxylabs.io:20001 &#8211; 29999</td>
<td style="font-weight: 400;" width="223">de-pr.oxylabs.io:30001 &#8211; 39999</td>
<td style="font-weight: 400;" width="258">fr-pr.oxylabs.io:40001 &#8211; 49999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">Spain</td>
<td style="font-weight: 400;" width="223">Italy</td>
<td style="font-weight: 400;" width="258">Sweden</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">es-pr.oxylabs.io:10001 &#8211; 19999</td>
<td style="font-weight: 400;" width="223">it-pr.oxylabs.io:20001 &#8211; 29999</td>
<td style="font-weight: 400;" width="258">se-pr.oxylabs.io:30001 &#8211; 39999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">Greece</td>
<td style="font-weight: 400;" width="223">Portugal</td>
<td style="font-weight: 400;" width="258">Netherlands</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">gr-pr.oxylabs.io:40001 &#8211; 49999</td>
<td style="font-weight: 400;" width="223">pt-pr.oxylabs.io:10001 &#8211; 19999</td>
<td style="font-weight: 400;" width="258">nl-pr.oxylabs.io:20001 &#8211; 29999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">Belgium</td>
<td style="font-weight: 400;" width="223">Russia</td>
<td style="font-weight: 400;" width="258">Ukraine</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">be-pr.oxylabs.io:30001 &#8211; 39999</td>
<td style="font-weight: 400;" width="223">ru-pr.oxylabs.io:40001 &#8211; 49999</td>
<td style="font-weight: 400;" width="258">ua-pr.oxylabs.io:10001 &#8211; 19999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">Poland</td>
<td style="font-weight: 400;" width="223">Israel</td>
<td style="font-weight: 400;" width="258">Turkey</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">pl-pr.oxylabs.io:20001 &#8211; 29999</td>
<td style="font-weight: 400;" width="223">il-pr.oxylabs.io:20001 &#8211; 29999</td>
<td style="font-weight: 400;" width="258">tr-pr.oxylabs.io:30001 &#8211; 39999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">Australia</td>
<td style="font-weight: 400;" width="223">Malaysia</td>
<td style="font-weight: 400;" width="258">Thailand</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">au-pr.oxylabs.io:40001 &#8211; 49999</td>
<td style="font-weight: 400;" width="223">my-pr.oxylabs.io:10001 &#8211; 19999</td>
<td style="font-weight: 400;" width="258">th-pr.oxylabs.io:20001 &#8211; 29999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">South Korea</td>
<td style="font-weight: 400;" width="223">Japan</td>
<td style="font-weight: 400;" width="258">Philippines</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">kr-pr.oxylabs.io:30001 &#8211; 39999</td>
<td style="font-weight: 400;" width="223">jp-pr.oxylabs.io:40001 &#8211; 49999</td>
<td style="font-weight: 400;" width="258">ph-pr.oxylabs.io:10001 &#8211; 19999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">Singapore</td>
<td style="font-weight: 400;" width="223">China</td>
<td style="font-weight: 400;" width="258">Hong Kong</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">sg-pr.oxylabs.io:20001 &#8211; 29999</td>
<td style="font-weight: 400;" width="223">cn-pr.oxylabs.io:30001 &#8211; 39999</td>
<td style="font-weight: 400;" width="258">hk-pr.oxylabs.io:40001 &#8211; 49999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">Taiwan</td>
<td style="font-weight: 400;" width="223">India</td>
<td style="font-weight: 400;" width="258">Pakistan</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">tw-pr.oxylabs.io:10001 &#8211; 19999</td>
<td style="font-weight: 400;" width="223">in-pr.oxylabs.io:20001 &#8211; 29999</td>
<td style="font-weight: 400;" width="258">pk-pr.oxylabs.io:30001 &#8211; 39999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">Iran</td>
<td style="font-weight: 400;" width="223">Indonesia</td>
<td style="font-weight: 400;" width="258">Azerbaijan</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">ir-pr.oxylabs.io:40001 &#8211; 49999</td>
<td style="font-weight: 400;" width="223">id-pr.oxylabs.io:10001 &#8211; 19999</td>
<td style="font-weight: 400;" width="258">az-pr.oxylabs.io:20001 &#8211; 29999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">Kazakhstan</td>
<td style="font-weight: 400;" width="223">UAE</td>
<td style="font-weight: 400;" width="258">Mexico</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">kz-pr.oxylabs.io:30001 &#8211; 39999</td>
<td style="font-weight: 400;" width="223">ae-pr.oxylabs.io:40001 &#8211; 49999</td>
<td style="font-weight: 400;" width="258">mx-pr.oxylabs.io:10001 &#8211; 19999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">Brazil</td>
<td style="font-weight: 400;" width="223">Argentina</td>
<td style="font-weight: 400;" width="258">Chile</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">br-pr.oxylabs.io:20001 &#8211; 29999</td>
<td style="font-weight: 400;" width="223">ar-pr.oxylabs.io:30001 &#8211; 39999</td>
<td style="font-weight: 400;" width="258">cl-pr.oxylabs.io:40001 &#8211; 49999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">Peru</td>
<td style="font-weight: 400;" width="223">Ecuador</td>
<td style="font-weight: 400;" width="258">Colombia</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">pe-pr.oxylabs.io:10001 &#8211; 19999</td>
<td style="font-weight: 400;" width="223">ec-pr.oxylabs.io:20001 &#8211; 29999</td>
<td style="font-weight: 400;" width="258">co-pr.oxylabs.io:30001 &#8211; 39999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">South Africa</td>
<td style="font-weight: 400;" width="223">Egypt</td>
<td style="font-weight: 400;" width="258">Saudi Arabia</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">za-pr.oxylabs.io:40001 &#8211; 49999</td>
<td style="font-weight: 400;" width="223">eg-pr.oxylabs.io:10001 &#8211; 19999</td>
<td style="font-weight: 400;" width="258">sa-pr.oxylabs.io:44001 &#8211; 44999</td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">Denmark</td>
<td style="font-weight: 400;" rowspan="2" width="223"></td>
<td style="font-weight: 400;" rowspan="2" width="258"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="197">dk-pr.oxylabs.io:19001 &#8211; 19999</td>
</tr>
</tbody>
</table>
</div>
<p>In this example, a query to <code>ipinfo.io</code> is performed from Turkey IP, and the same IP will stay for up to 10 minutes with each request. We have chosen port 30001, however, Turkey sticky entry points cover ports from 30001 to 39999.</p>
<pre>curl -x tr-pr.oxylabs.io:30001 -U "customer-USERNAME:PASSWORD" https://ipinfo.io
</pre>
<pre>pr.oxylabs.io:10000 - 49999
us-pr.oxylabs.io:10001 - 19999
ca-pr.oxylabs.io:30001 - 39999
gb-pr.oxylabs.io:20001 - 29999
de-pr.oxylabs.io:30001 - 39999
fr-pr.oxylabs.io:40001 - 49999
es-pr.oxylabs.io:10001 - 19999
it-pr.oxylabs.io:20001 - 29999
se-pr.oxylabs.io:30001 - 39999
gr-pr.oxylabs.io:40001 - 49999
pt-pr.oxylabs.io:10001 - 19999
nl-pr.oxylabs.io:20001 - 29999
be-pr.oxylabs.io:30001 - 39999
ru-pr.oxylabs.io:40001 - 49999
ua-pr.oxylabs.io:10001 - 19999
pl-pr.oxylabs.io:20001 - 29999
il-pr.oxylabs.io:20001 - 29999
tr-pr.oxylabs.io:30001 - 39999
au-pr.oxylabs.io:40001 - 49999
my-pr.oxylabs.io:10001 - 19999
th-pr.oxylabs.io:20001 - 29999
kr-pr.oxylabs.io:30001 - 39999
jp-pr.oxylabs.io:40001 - 49999
ph-pr.oxylabs.io:10001 - 19999
sg-pr.oxylabs.io:20001 - 29999
cn-pr.oxylabs.io:30001 - 39999
hk-pr.oxylabs.io:40001 - 49999
tw-pr.oxylabs.io:10001 - 19999
in-pr.oxylabs.io:20001 - 29999
pk-pr.oxylabs.io:30001 - 39999
ir-pr.oxylabs.io:40001 - 49999
id-pr.oxylabs.io:10001 - 19999
az-pr.oxylabs.io:20001 - 29999
kz-pr.oxylabs.io:30001 - 39999
ae-pr.oxylabs.io:40001 - 49999
mx-pr.oxylabs.io:10001 - 19999
br-pr.oxylabs.io:20001 - 29999
ar-pr.oxylabs.io:30001 - 39999
cl-pr.oxylabs.io:40001 - 49999
pe-pr.oxylabs.io:10001 - 19999
ec-pr.oxylabs.io:20001 - 29999
co-pr.oxylabs.io:30001 - 39999
za-pr.oxylabs.io:40001 - 49999
eg-pr.oxylabs.io:10001 - 19999
sa-pr.oxylabs.io:44001 - 44999
dk-pr.oxylabs.io:19001 - 19999
</pre>
<hr />
<h2 id="additional-information">Additional Information</h2>
<h3 id="country-state-city-mapping">Country, State, City Mapping</h3>
<p>We use <a class="custom_link" href="https://www.maxmind.com/en/geoip2-databases" target="_blank" rel="nofollow noopener">MaxMind GeoIP2</a> database to assign our exit nodes <code>cc</code>, <code>st</code> and <code>city</code> values. This database is updated weekly.</p>
<p>Some other public IP databases may show different locations. In cases where location mismatch is crucial, we encourage to double-check if the location of the assigned proxy is the same on the IP database used by the target website.</p>
<hr />
<h3 id="response-codes">Response Codes</h3>
<p>These are the most common response codes that you can get while using our residential proxy pool. If you receive any other response code, get in touch with your dedicated account manager for more information.</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Response</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>400</code> Bad Request</td>
<td>Proxy server can return this error code if the request did not contain a host to connect to or there was a generic error when parsing HTTP request. Make sure your request is correctly formed and make sure to include URL in the request then try again.</td>
</tr>
<tr>
<td><code>407</code> Proxy Authentication Required</td>
<td>Request lacks proxy authentication information or username or password is invalid. Include Proxy-Authorization header in your request and make sure your username and password are correctly formed and then try again.</td>
</tr>
<tr>
<td><code>500</code> Internal Server Error</td>
<td>Proxy server has encountered an internal error. Retry request at a later time.</td>
</tr>
<tr>
<td><code>502</code> Bad Gateway</td>
<td>Proxy server received an invalid response from the upstream server. Retry request.</p>
<p>Response Code <code>502</code> signifies that the IP assigned to your session ID is no longer available. If you encounter this error, there are two ways to work around it. The first is to wait for one minute and the system will automatically assign a new IP address to your session ID. Another approach is to simply switch to a new session ID (i.e. change the sessid parameter) – this way you will receive a new IP address.</td>
</tr>
<tr>
<td><code>522</code> Timeout</td>
<td>Proxy server did not receive a response from the upstream server in time. Retry request.</td>
</tr>
<tr>
<td><code>525</code> No Exit Found</td>
<td>Custom HTTP status code &#8211; this means proxy was unable to find an exit node which satisfies the request. Change request filter parameters or try again at a later time.</td>
</tr>
</tbody>
</table>
</div>
<hr />
<h3 id="backconnect-entry-ips">Backconnect Entry IPs</h3>
<p>If you want to use your own backconnect entry node DNS name, you can do that by pointing your subdomain/domain to our entry node. To do that, you need to add a DNS <code>CNAME</code> record that has <code>pr.oxylabs.io</code> as the target. This is how such setup looks on Cloudflare DNS manager for <code>entry</code> subdomain:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8129" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxies-Backconnect-Entry-IPs.jpg" alt="OxyLabs Residential Proxies Backconnect Entry IPs" width="878" height="85" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxies-Backconnect-Entry-IPs.jpg 878w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxies-Backconnect-Entry-IPs-300x29.jpg 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxies-Backconnect-Entry-IPs-768x74.jpg 768w" sizes="(max-width: 878px) 100vw, 878px" /></p>
<p>For more information, please contact <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a> or your account manager.</p>
<hr />
<h3 id="restricted-urls">Restricted URLs</h3>
<p>To avoid abuse and unclear activities, some websites are restricted on our residential proxy network. The list includes, but is not limited to websites such as all Google domains including Play, linkedin.com, sonyentertainmentnetwork.com, all Apple domains, including iTunes, netflix.com and others. For more information please contact our support staff at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<hr />
<h2 id="public-api">Public API</h2>
<p>To manage proxy users via Public API, please refer to this documentation in <a class="custom_link" href="https://residential-api.oxylabs.io/v1/docs#/" target="_blank" rel="nofollow noopener">OpenAPI format</a>. The API allows to create, delete, and modify proxy users, set their limits and see current usage, disable and enable them.</p>
<hr />
<h2 id="3rd-party-integrations">3rd Party Integrations</h2>
<p>Please note that you must use an HTTPS protocol when accessing <strong>China entry nodes</strong> for 3rd party tools to work correctly.</p>
<h3 id="oxylabs-proxy-manager">Oxylabs Proxy Manager</h3>
<p><a class="custom_link" href="https://chrome.google.com/webstore/detail/oxylabs-proxy-manager/infajoaodhhdogakhloedbppcbeajhoo" target="_blank" rel="nofollow noopener">Oxylabs Proxy Manager</a> is a proxy management extension for Chrome. It is not only free but also works with any proxy provider of your choice. Enable your proxy without having to jump through settings and menu options. The extension has an additional feature specifically designed to use with Oxylabs Residential Proxies, which enables to easily change Oxylabs Residential Proxy session without editing your username. Download the extension from Chrome Web Store <a class="custom_link" href="https://chrome.google.com/webstore/detail/oxylabs-proxy-manager/infajoaodhhdogakhloedbppcbeajhoo" target="_blank" rel="nofollow noopener">here</a></p>
<ul>
<li>Click the extension icon to open the application</li>
<li>If you haven't added any proxies yet, you will see <code>Add new proxy</code> button. Click it to continue.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8130" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager1.jpg" alt="OxyLabs Residential Proxy Manager1" width="426" height="422" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager1.jpg 426w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager1-300x297.jpg 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager1-150x150.jpg 150w" sizes="(max-width: 426px) 100vw, 426px" /></p>
<ul>
<li>Add proxy profile. Provide a name for the profile under <strong>Enter name</strong>. Enter <code>pr.oxylabs.io</code> as <strong>Proxy server IP</strong> and <code>7777</code> as <strong>Port</strong>. Fill in your <strong>Username</strong> and <strong>Password</strong>. Do not forget to add <code>customer-</code> before your username. Finally, click <strong>Save changes</strong>.</li>
</ul>
<p>You can also use country-specific entries. For example, if you put <code>us-pr.oxylabs.io</code> under <strong>Proxy server IP</strong> and <code>10001</code> under <strong>Port</strong>, you will receive US exit node with sticky session.</p>
<p>If you have whitelisted your IP, you can skip this step.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8131" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager2.png" alt="OxyLabs Residential Proxy Manager2" width="964" height="445" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager2.png 964w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager2-300x138.png 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager2-768x355.png 768w" sizes="(max-width: 964px) 100vw, 964px" /></p>
<ul>
<li>Open the extension and click <strong>Connect</strong>. That's it, you are now using proxies.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8132" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager3.jpg" alt="OxyLabs Residential Proxy Manager3" width="420" height="366" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager3.jpg 420w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager3-300x261.jpg 300w" sizes="(max-width: 420px) 100vw, 420px" /></p>
<ul>
<li>Chrome is notorious for caching proxy credentials, and on many proxy management extensions sticky sessions via username string does not work. If you are using sessions with main entry node (<code>pr.oxylabs.io:7777</code>), we created a special feature that allows rotating session much more easily. First, enter your username with <code>sessid</code> parameter, like this:</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8133" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager4.jpg" alt="OxyLabs Residential Proxy Manager4" width="963" height="450" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager4.jpg 963w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager4-300x140.jpg 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager4-768x359.jpg 768w" sizes="(max-width: 963px) 100vw, 963px" /></p>
<ul>
<li>Then, open the extenion window. Connect to the proxy and you will see a new button &#8211; <strong>Refresh session</strong>. Click it to change session ID and get a new proxy.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8134" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager5.jpg" alt="OxyLabs Residential Proxy Manager5" width="433" height="419" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager5.jpg 433w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Manager5-300x290.jpg 300w" sizes="(max-width: 433px) 100vw, 433px" /></p>
<hr />
<h3 id="switchyomega">SwitchyOmega</h3>
<p>SwitchyOmega is a powerful and reliable proxy manager that works with many popular browsers. First you need to get the plugin. For Chrome, click <a class="custom_link" href="https://chrome.google.com/webstore/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif?hl=en" target="_blank" rel="nofollow noopener">here</a>, for Firefox click <a class="custom_link" href="https://addons.mozilla.org/en-US/firefox/addon/switchyomega/" target="_blank" rel="nofollow noopener">here</a>. Once you have it installed, you should:</p>
<ul>
<li>Open Switchy Omega options.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8135" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega1.png" alt="OxyLabs Residential Proxy SwitchyOmega1" width="203" height="236" /></p>
<ul>
<li>Click <strong>New profile&#8230;</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8136" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega2.jpg" alt="OxyLabs Residential Proxy SwitchyOmega2" width="594" height="555" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega2.jpg 594w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega2-300x280.jpg 300w" sizes="(max-width: 594px) 100vw, 594px" /></p>
<ul>
<li>Give this new profile a name, choose <strong>Proxy Profile</strong> type and click <strong>Create</strong></li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8137" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega3.jpg" alt="OxyLabs Residential Proxy SwitchyOmega3" width="598" height="610" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega3.jpg 598w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega3-294x300.jpg 294w" sizes="(max-width: 598px) 100vw, 598px" /></p>
<ul>
<li>Change <strong>Protocol</strong> to <strong>HTTP</strong>. Under <strong>Server</strong> enter our backconnect entry node <code>pr.oxylabs.io</code>. Under <strong>Port</strong> add <code>7777</code></li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8138" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega4.jpg" alt="OxyLabs Residential Proxy SwitchyOmega4" width="854" height="195" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega4.jpg 854w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega4-300x69.jpg 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega4-768x175.jpg 768w" sizes="(max-width: 854px) 100vw, 854px" /></p>
<ul>
<li>You can also use country-specific entries. For example, if you put <code>us-pr.oxylabs.io</code> under <strong>Server</strong> and <code>10001</code> under <strong>Port</strong>, you will receive US exit node with sticky session.</li>
<li>Next, click the lock button on the right. Fill in your <strong>Username</strong> and <strong>Password</strong>. Do not forget to add <code>customer-</code> before your given username. Finally, click <strong>Save changes</strong>.</li>
</ul>
<p>If you have whitelisted your IP, please skip this step.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8139" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega5.jpg" alt="OxyLabs Residential Proxy SwitchyOmega5" width="599" height="266" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega5.jpg 599w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega5-300x133.jpg 300w" sizes="(max-width: 599px) 100vw, 599px" /></p>
<ul>
<li>Click <strong>Apply changes</strong></li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8140" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega6.jpg" alt="OxyLabs Residential Proxy SwitchyOmega6" width="380" height="383" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega6.jpg 380w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega6-298x300.jpg 298w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega6-150x150.jpg 150w" sizes="(max-width: 380px) 100vw, 380px" /></p>
<ul>
<li>For the final step, click on SwitchyOmega icon and choose your newly configured proxy. You are now ready to go!</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8141" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-SwitchyOmega7.jpg" alt="OxyLabs Residential Proxy SwitchyOmega7" width="209" height="256" /></p>
<hr />
<h3 id="shadowrocket">Shadowrocket</h3>
<p>If you want to use our Residential Proxies with Shadowrocket, you can easily do that by following the instructions below.</p>
<ul>
<li>Open Shadowrocket app.</li>
<li>Click <strong>Add Server</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8143" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket1.png" alt="OxyLabs Residential Proxy Shadowrocket1" width="296" height="341" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket1.png 296w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket1-260x300.png 260w" sizes="(max-width: 296px) 100vw, 296px" /></p>
<ul>
<li>In the following window click on <strong>Type</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8144" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket2.png" alt="OxyLabs Residential Proxy Shadowrocket2" width="297" height="415" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket2.png 297w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket2-215x300.png 215w" sizes="(max-width: 297px) 100vw, 297px" /></p>
<ul>
<li>Choose <strong>HTTP</strong> and go back to the previous screen.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8145" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket3.png" alt="OxyLabs Residential Proxy Shadowrocket3" width="292" height="440" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket3.png 292w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket3-199x300.png 199w" sizes="(max-width: 292px) 100vw, 292px" /></p>
<ul>
<li>Enter proxy and authentication information. Under <strong>Host</strong> type in <code>pr.oxylabs.io</code>. <strong>Port</strong> is <code>7777</code> to use our backconnect entry. Do not forget your crendentials under <strong>User</strong> and <strong>Password</strong>. Do not forget to add <code>customer-</code> before your given username. Once you are done, go back to the previous screen by pressing Back arrow.</li>
</ul>
<p>You can also use country-specific entries. For example, if you put <code>us-pr.oxylabs.io</code> under <strong>Host</strong> and <code>10001</code> under <strong>Port</strong>, you will receive US exit node with a sticky session.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8146" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket4.png" alt="OxyLabs Residential Proxy Shadowrocket4" width="297" height="448" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket4.png 297w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket4-199x300.png 199w" sizes="(max-width: 297px) 100vw, 297px" /></p>
<ul>
<li>You need to turn proxy on. Do that by activating a toggle under <strong>Not Connected</strong></li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8147" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket5.png" alt="OxyLabs Residential Proxy Shadowrocket5" width="301" height="344" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket5.png 301w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket5-263x300.png 263w" sizes="(max-width: 301px) 100vw, 301px" /></p>
<ul>
<li>If that is your first time using Shadowrocket, you will get an iOS prompt to add Shadowrocket to VPN configurations. Click <strong>Add</strong>. You will need to enter your iPhone passcode to confirm.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8148" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket6.png" alt="OxyLabs Residential Proxy Shadowrocket6" width="296" height="413" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket6.png 296w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket6-215x300.png 215w" sizes="(max-width: 296px) 100vw, 296px" /></p>
<ul>
<li>That is it. A toggle at the top of the app should now be activated.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8149" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket7.png" alt="OxyLabs Residential Proxy Shadowrocket7" width="298" height="324" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket7.png 298w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket7-276x300.png 276w" sizes="(max-width: 298px) 100vw, 298px" /></p>
<ul>
<li>You can test if the proxy is working by visiting <strong>icanhazip.com</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8150" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket8.png" alt="OxyLabs Residential Proxy Shadowrocket8" width="298" height="311" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket8.png 298w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Shadowrocket8-287x300.png 287w" sizes="(max-width: 298px) 100vw, 298px" /></p>
<hr />
<h3 id="proxifier">Proxifier</h3>
<p>If you want to use our Residential Proxies with Proxfier, you can easily do that by following the instructions below.</p>
<ul>
<li>Open Proxifier app.</li>
<li>Add proxies. Click on <strong>Proxies (1)</strong>. Click <strong>Add(2)</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8151" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Proxifier1.png" alt="OxyLabs Residential Proxy Proxifier1" width="596" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Proxifier1.png 596w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Proxifier1-300x252.png 300w" sizes="(max-width: 596px) 100vw, 596px" /></p>
<ul>
<li>In the following window enter required information. <strong>Address(1)</strong>, which is <code>pr.oxylabs.io</code>, <strong>Port(2)</strong> which is <code>7777</code>, select <strong>HTTPS(3)</strong> protocol. In authentication box click <strong>Enable(4)</strong> and enter provided <strong>Username(5)</strong> and <strong>Password(6)</strong>. Do not forget to add <code>customer-</code> at the beginning of the username. If you have whitelisted your devices, do not click on <strong>Enable</strong>, your authenticiation will be done without username/password. If you wish, you can enable <strong>Appear as Web Browser</strong> option. Click <strong>OK</strong>.</li>
<li>You can also use country-specific entries. For example, if you put <strong>us-pr.oxylabs.io</strong> under <strong>Address(1)* and **10001</strong> under <strong>Port(2)</strong>, you will receive US exit node with sticky session.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8152" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Proxifier2.jpg" alt="OxyLabs Residential Proxy Proxifier2" width="479" height="499" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Proxifier2.jpg 479w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Proxifier2-288x300.jpg 288w" sizes="(max-width: 479px) 100vw, 479px" /></p>
<ul>
<li>You will be prompted with a window asking <strong>if you want Proxifier to use this proxy by default</strong>? This means that this setup will be user for all of your browsers. It is up to you to decide. If you select <strong>Yes</strong>, you are done setting up. If you wish to use proxies on a particular browser, follow the next steps.</li>
<li>Click on <strong>Rules(1)</strong> and then click <strong>Add&#8230;(2)</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8153" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Proxifier3.jpg" alt="OxyLabs Residential Proxy Proxifier3" width="851" height="464" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Proxifier3.jpg 851w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Proxifier3-300x164.jpg 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Proxifier3-768x419.jpg 768w" sizes="(max-width: 851px) 100vw, 851px" /></p>
<ul>
<li>Click <strong>+(1)</strong> button to add applications that you want to use proxy settings. Select the browser with which you want to use these proxy settings and click on it. Finally, you have to change <strong>Action(2)</strong>. Click on it and select your created proxy.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8154" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Proxifier4.png" alt="OxyLabs Residential Proxy Proxifier4" width="538" height="546" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Proxifier4.png 538w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Proxifier4-296x300.png 296w" sizes="(max-width: 538px) 100vw, 538px" /></p>
<ul>
<li>This is it, all of your requests, while using browser which you defined in your rules of Proxifier, will be done from proxies.</li>
</ul>
<hr />
<h3 id="multilogin">Multilogin</h3>
<p>Our proxies also work with Multilogin app. Setting up is easy, just follow the instructions below.</p>
<ul>
<li>Open <strong>Multilogin</strong> app.</li>
<li>Add proxies. Click on <strong>Create new</strong> under Browser profile.</li>
<li>In the following window enter <strong>Browser profile name</strong> (for example <strong>Oxylabs</strong>). Next, click <strong>Edit proxy settings</strong>.</li>
<li>Choose <strong>HTTP proxy</strong> as <strong>Connection type</strong>. Now fill in the required details: under <strong>New address</strong> and <strong>Port</strong> insert <code>pr.oxylabs.io</code> and <code>7777</code>. Under <strong>Login</strong> enter your username, and <strong>Password</strong>. Do not forget to add <code>customer-</code> at the beginning of the username. If you have whitelisted your devices, you do not need to provide the login credentials.</li>
<li>You can also use country-specific entries. For example, if you put <strong>us-pr.oxylabs.io</strong> under <strong>New address</strong> and <strong>10001</strong> under <strong>Port</strong>, you will receive US exit node with a sticky session.</li>
<li>Click <strong>Check proxy</strong>. If everything is fine, you should get a response indicating <strong>External IP</strong>.</li>
<li>Confirm changes by clicking <strong>Create profile</strong>.</li>
<li>This is it, you are good to go.</li>
</ul>
<hr />
<h3 id="postern">Postern</h3>
<p>Postern is a very popular proxy/VPN management application on Android. You can get it on <a class="custom_link" href="https://play.google.com/store/apps/details?id=com.tunnelworkshop.postern&hl=en" target="_blank" rel="nofollow noopener">Google Play Store</a>. Here is a step-by-step guide how to configure our Residential Proxies on Postern:</p>
<ul>
<li>Open the app.</li>
<li>Click <strong>Add Proxy</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8156" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern1.png" alt="OxyLabs Residential Proxy Postern1" width="348" height="350" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern1.png 348w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern1-298x300.png 298w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern1-150x150.png 150w" sizes="(max-width: 348px) 100vw, 348px" /></p>
<ul>
<li>In the following window enter required proxy information. <strong>Server Name</strong> is <strong>Oxylabs</strong>, <strong>Server Address</strong> is <strong>pr.oxylabs.io</strong>. Under <strong>Server Port</strong> enter <strong>7777</strong>. Click <strong>Server Type</strong> and choose <strong>HTTPS/HTTP CONNECT</strong>. Next, enter your login credentials under <strong>Username</strong> and <strong>Password</strong>. For this to work, you must type <strong>customer-</strong> before you type in your username, e.g., <strong>customer-username</strong>.Finally, click <strong>Save</strong>.</li>
</ul>
<p>You can also use country-specific entries. For example, if you put <strong>us-pr.oxylabs.io</strong> under <strong>Server Address</strong> and <strong>10001</strong> under <strong>Server Port</strong>, you will receive the US exit node with sticky session.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8157" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern2.png" alt="OxyLabs Residential Proxy Postern2" width="351" height="611" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern2.png 351w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern2-172x300.png 172w" sizes="(max-width: 351px) 100vw, 351px" /></p>
<ul>
<li>Now, open the app menu and go to <strong>Rules</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8158" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern3.png" alt="OxyLabs Residential Proxy Postern3" width="348" height="496" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern3.png 348w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern3-210x300.png 210w" sizes="(max-width: 348px) 100vw, 348px" /></p>
<ul>
<li>Click <strong>Add Rule</strong></li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8159" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern4.png" alt="OxyLabs Residential Proxy Postern4" width="346" height="405" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern4.png 346w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern4-256x300.png 256w" sizes="(max-width: 346px) 100vw, 346px" /></p>
<ul>
<li>Under <strong>Match Method</strong> select <strong>Match All</strong>. Choose <strong>Proxy/Tunnel</strong> as the <strong>Rule</strong>. <strong>Proxy/Proxy Group</strong> should automatically fill up with <strong>Oxylabs &#8211; pr.oxylabs.io:7777&#8243;</strong>. Click <strong>Save</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8160" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern5.png" alt="OxyLabs Residential Proxy Postern5" width="348" height="457" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern5.png 348w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern5-228x300.png 228w" sizes="(max-width: 348px) 100vw, 348px" /></p>
<ul>
<li>Now you need to turn on the VPN. Open the app menu and click on <strong>VPN Off</strong> to activate the connection. That is it, you are now using proxies.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8161" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern6.png" alt="OxyLabs Residential Proxy Postern6" width="346" height="499" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern6.png 346w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Postern6-208x300.png 208w" sizes="(max-width: 346px) 100vw, 346px" /></p>
<h4></h4>
<hr />
<h3 id="gologin">GoLogin</h3>
<p>GoLogin is a multi-login browser management application for Windows, Linux and Mac OS. Get it on its official website <a class="custom_link" href="https://gologin.app/" target="_blank" rel="nofollow noopener">here</a>. Here is a step-by-step guide how to configure our Residential Proxies on GoLogin for Windows:</p>
<ul>
<li>Open the app.</li>
<li>Click <strong>Create Your First Profile</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8164" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin1.png" alt="OxyLabs Residential Proxy GoLogin1" width="915" height="275" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin1.png 915w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin1-300x90.png 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin1-768x231.png 768w" sizes="(max-width: 915px) 100vw, 915px" /></p>
<ul>
<li>In the following window enter the required proxy information. Under <strong>Profile Name</strong> write <strong>Oxylabs</strong>. Next, choose <strong>Connection Type</strong> as <strong>HTTP Proxy</strong>. Under <strong>Proxy Host and Port</strong> enter <strong>pr.oxylabs.io</strong> and <strong>7777</strong>. Next, enter your login credentials under <strong>Username</strong> and <strong>Password</strong>. Finally, click <strong>Create Profile</strong>.</li>
</ul>
<p>You can also use country-specific entries. For example, if you put <strong>us-pr.oxylabs.io</strong> and <strong>10001</strong> under <strong>Proxy Host and Port</strong>, you will receive the US exit node with a sticky session. To fully utilize all available Residential Proxies features such as <a href="#session-control">sessions</a> and <a href="#select-country">country</a>, <a href="#select-state">state</a>, <a href="#select-city">city</a> geolocation parameters, please reffer to the corresponding sections in the documentation.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8165" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin2.png" alt="OxyLabs Residential Proxy GoLogin2" width="574" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin2.png 574w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin2-300x261.png 300w" sizes="(max-width: 574px) 100vw, 574px" /></p>
<ul>
<li>All set, now simply click <strong>Run</strong> and wait for the browser to load.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8166" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin3.png" alt="OxyLabs Residential Proxy GoLogin3" width="915" height="344" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin3.png 915w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin3-300x113.png 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin3-768x289.png 768w" sizes="(max-width: 915px) 100vw, 915px" /></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>If everything is fine, a website http://myip.gologin.app will open and show the IP information.</li>
</ul>
</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8167" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin4.png" alt="OxyLabs Residential Proxy GoLogin4" width="692" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin4.png 692w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-GoLogin4-300x217.png 300w" sizes="(max-width: 692px) 100vw, 692px" /></p>
<hr />
<h3 id="kameleo">Kameleo</h3>
<p>Kameleo is a multi-login browser management application for Windows and Android. Get it on its official website <a class="custom_link" href="https://kameleo.io/downloads/" target="_blank" rel="nofollow noopener">here</a>. Here is a step-by-step guide how to configure our Residential Proxies on Kameleo for Windows:</p>
<ul>
<li>Open the app.</li>
<li>Click <strong>APPLICATION SETTINGS</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8168" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Kameleo1.png" alt="OxyLabs Residential Proxy Kameleo1" width="605" height="400" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Kameleo1.png 605w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Kameleo1-300x198.png 300w" sizes="(max-width: 605px) 100vw, 605px" /></p>
<ul>
<li>In the following window enter the required proxy information under <strong>Global proxy settings</strong>. For <strong>Upstream Proxy Type</strong> choose <strong>Http</strong>. Next, fill in <strong>Proxy IP or hostname</strong> with <strong>pr.oxylabs.io</strong>. Under <strong>Proxy Port</strong> enter <strong>7777</strong>. Finally, enter your login credentials under <strong>Username</strong> and <strong>Password</strong>. Close the window to save settings.</li>
</ul>
<p>You can also use country-specific entries. For example, if you put <strong>us-pr.oxylabs.io</strong> under <strong>Proxy IP or hostname</strong> and <strong>10001</strong> under <strong>Proxy Port</strong>, you will receive the US exit node with a sticky session.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8169" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Kameleo2.png" alt="OxyLabs Residential Proxy Kameleo2" width="606" height="339" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Kameleo2.png 606w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Kameleo2-300x168.png 300w" sizes="(max-width: 606px) 100vw, 606px" /></p>
<ul>
<li>That is it, you are ready to go. Either create a <strong>NEW PROFILE</strong> or click <strong>QUICK PROFILE</strong> to launch the browser which now has proxy enabled.</li>
</ul>
<hr />
<h3 id="clonbrowser">ClonBrowser</h3>
<p>ClonBrowser is another multi-login browser management application for Windows and Mac. Get it on its official website <a class="custom_link" href="https://www.clonbrowser.com/download" target="_blank" rel="nofollow noopener">here</a>. Here is a step-by-step guide how to configure our Residential Proxies on ClonBrowser for Windows:</p>
<ul>
<li>Open the app.</li>
<li>Click <strong>Create a New browser profile</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8170" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-ClonBrowser1.jpg" alt="OxyLabs Residential Proxy ClonBrowser1" width="783" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-ClonBrowser1.jpg 783w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-ClonBrowser1-300x192.jpg 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-ClonBrowser1-768x490.jpg 768w" sizes="(max-width: 783px) 100vw, 783px" /></p>
<ul>
<li>Click <strong>Setting</strong> next to <strong>Proxy settings</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8171" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-ClonBrowser2.png" alt="OxyLabs Residential Proxy ClonBrowser2" width="715" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-ClonBrowser2.png 715w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-ClonBrowser2-300x210.png 300w" sizes="(max-width: 715px) 100vw, 715px" /></p>
<ul>
<li>In the following window choose <strong>Http</strong> as the <strong>Connection type</strong>. Under <strong>IP or host</strong> enter <strong>pr.oxylabs.io</strong>. Fill in <strong>7777</strong> for <strong>Port</strong>. Finally, enter your login credentials under <strong>Username</strong> in <strong>customer-username</strong> format and <strong>Password</strong>.</li>
</ul>
<p>You can also use country-specific entries. For example, if you put <strong>us-pr.oxylabs.io</strong> under <strong>Proxy IP or hostname</strong> and <strong>10001</strong> under <strong>Proxy Port</strong>, you will receive the US exit node with a sticky session.</p>
<p>You can check if the proxy works by clicking <strong>Connection test</strong>. If everything is fine, click <strong>Create profile</strong>.</p>
<ul>
<li>That is all, you can now launch the browser by clicking <strong>Start</strong> under <strong>Option</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-8172" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-ClonBrowser3.png" alt="OxyLabs Residential Proxy ClonBrowser3" width="858" height="236" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-ClonBrowser3.png 956w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-ClonBrowser3-300x83.png 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-ClonBrowser3-768x211.png 768w" sizes="(max-width: 858px) 100vw, 858px" /></p>
<hr />
<h3 id="adspower">AdsPower</h3>
<p>AdsPower is a multi-login browser management application for Windows and Mac. You get it on its official website <a class="custom_link" href="https://www.adspower.net/?code=fmtc1m&source=oxylabs" target="_blank" rel="nofollow noopener">here</a>. Here is the step-by-step guide how to configure our Residential Proxies on AdsPower for Windows:</p>
<ul>
<li>Open the app.</li>
<li>Click <strong>Upload.</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8173" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-AdsPower1.png" alt="OxyLabs Residential Proxy AdsPower1" width="258" height="191" /></p>
<ul>
<li>Under <strong>Proxy Type</strong> choose <strong>http</strong>. Now fill in the form bellow. Enter <strong>pr.oxylabs.io</strong> for <strong>Proxy Host</strong> and <strong>7777</strong> for <strong>Proxy Port</strong>. Enter your login credentials <strong>customer-username</strong> under <strong>Proxy User</strong> and your <strong>password</strong> for <strong>Password</strong>.</li>
</ul>
<p>You can also use country specific entries. For example, if you put <strong>us-pr.oxylabs.io</strong> under <strong>Proxy Host</strong> and <strong>10001</strong> under *<em>Proxy Port</em>, you will receive US exit node with sticky session.</p>
<p>You can check if the proxy works by clicking <strong>Check Proxy</strong>. If everything is fine, click <strong>Create profile</strong>.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8174" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-AdsPower2.png" alt="OxyLabs Residential Proxy AdsPower2" width="689" height="393" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-AdsPower2.png 689w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-AdsPower2-300x171.png 300w" sizes="(max-width: 689px) 100vw, 689px" /></p>
<ul>
<li>That's all, you can now launch the browser by clicking <strong>Open</strong> under <strong>Account Management</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8175" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-AdsPower3.png" alt="OxyLabs Residential Proxy AdsPower3" width="564" height="250" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-AdsPower3.png 564w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-AdsPower3-300x133.png 300w" sizes="(max-width: 564px) 100vw, 564px" /></p>
<hr />
<h3 id="vmlogin">VMLogin</h3>
<p>Virtual Multi Login, or VMLogin, is a tool for creating virtual browser profiles that help control browser fingerprinting, setup business workflows, and develop web automation, among other things. To use VMLogin with Oxylabs Residential Proxies, download the latest version of VMLogin <a class="custom_link" href="https://vmlogin.us/download.html" target="_blank" rel="nofollow noopener">here</a>.</p>
<ul>
<li>Launch VMLogin and create a new browser profile. You can either click <strong>Get random profile</strong> (1), or select your settings.</li>
<li>Click on <strong>Setting proxy server</strong> (2)</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8177" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-VMLogin1.png" alt="OxyLabs Residential Proxy VMLogin1" width="675" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-VMLogin1.png 675w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-VMLogin1-300x222.png 300w" sizes="(max-width: 675px) 100vw, 675px" /></p>
<ul>
<li>Create a new Residential Proxy user.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-8178" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-VMLogin2.png" alt="OxyLabs Residential Proxy VMLogin2" width="815" height="317" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-VMLogin2.png 961w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-VMLogin2-300x117.png 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-VMLogin2-768x299.png 768w" sizes="(max-width: 815px) 100vw, 815px" /></p>
<ul>
<li>Click on <strong>Setting proxy server</strong> and choose <strong>HTTP Proxy</strong> as the Connection type. Under IP or host enter <strong>pr.oxylabs.io</strong>. Fill in <strong>7777</strong> for <strong>Port</strong>. Finally, enter your login credentials under <strong>Username</strong> (in customer-username format) and <strong>Password</strong>. You can check if the proxy works by clicking <strong>Test Proxy</strong>. If everything is fine, save profile and launch the browser.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8179" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-VMLogin3.png" alt="OxyLabs Residential Proxy VMLogin3" width="686" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-VMLogin3.png 686w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-VMLogin3-300x219.png 300w" sizes="(max-width: 686px) 100vw, 686px" /></p>
<ul>
<li>You can also use country specific entries. For example, if you put <strong>us-pr.oxylabs.io</strong> under Proxy <strong>IP address</strong> and <strong>10001</strong> under Proxy <strong>Port</strong>, you will receive a US exit node with a sticky session.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8180" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-VMLogin4.png" alt="OxyLabs Residential Proxy VMLogin4" width="714" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-VMLogin4.png 714w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-VMLogin4-300x210.png 300w" sizes="(max-width: 714px) 100vw, 714px" /></p>
<ul>
<li>This is all, you are ready to use Residential Proxies with VMLogin.</li>
</ul>
<hr />
<h3 id="undetectable">Undetectable</h3>
<p>Firstly, you will need to get Undetectable. To do that, simply go to <a class="custom_link" href="https://undetectable.io/" target="_blank" rel="nofollow noopener">undetectable.io</a>, sign up, and download the browser.</p>
<p>Then, open the application and click &#8220;+&#8221; to create a new profile.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-8181" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable1.png" alt="OxyLabs Residential Proxy Undetectable1" width="679" height="456" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable1.png 745w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable1-300x201.png 300w" sizes="(max-width: 679px) 100vw, 679px" /></p>
<p>In the following window, under <em>New Profile</em>, enter the new profile name. Choose the settings (OS, browser, configurations, and screen) of how you want your browser to be recognized by websites.</p>
<p>Also, you can select the main and additional languages, while geo-location will be determined by your proxy.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8182" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable2.png" alt="OxyLabs Residential Proxy Undetectable2" width="749" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable2.png 749w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable2-300x200.png 300w" sizes="(max-width: 749px) 100vw, 749px" /></p>
<p>Go to the <em>Proxy</em> tab and select the <em>&#8220;New proxy&#8221;</em> option in the box.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8183" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable3.png" alt="OxyLabs Residential Proxy Undetectable3" width="747" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable3.png 747w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable3-300x201.png 300w" sizes="(max-width: 747px) 100vw, 747px" /></p>
<p>You can choose either SOCKS5 or HTTP (select HTTP proxy as a connection type). Now fill in proxy and authentication details: type <strong>pr.oxylabs.io</strong> for your Host and use <strong>7777</strong> for <em>Port</em>. Enter your credentials in the <em>Login</em> and <em>Password</em> spaces. Do not forget to add customer- at the beginning of your username. If you have whitelisted your devices, you do not need to provide login credentials.</p>
<p>You can also use country-specific entries. For example, if you put <strong>us- pr.oxylabs.io</strong> under <em>Host</em> and <strong>10001</strong> under Port, you will receive US exit node with a sticky session. Please check out our <a href="#country-specific-entry-nodes">complete list of country-secific entry nodes</a>.</p>
<p>Click the <em>Check</em> button. If everything is fine, you should get a response indicating External IP. Press the Save Proxy button to confirm the changes.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8184" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable4.png" alt="OxyLabs Residential Proxy Undetectable4" width="750" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable4.png 750w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable4-300x200.png 300w" sizes="(max-width: 750px) 100vw, 750px" /></p>
<p>Now save the profile by pressing the <em>Save</em> button, and you will see it appear on the left side menu. Edit your profiles easily by simply clicking on them.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8185" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable5.png" alt="OxyLabs Residential Proxy Undetectable5" width="748" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable5.png 748w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Residential-Proxy-Undetectable5-300x201.png 300w" sizes="(max-width: 748px) 100vw, 748px" /></p>
<p>That's it! You have successfully set up your proxies with Undetectable.io.</p>
<hr />
<h3 id="puppeteer">Puppeteer</h3>
<p>Before getting started with Puppeteer, you’ll need to install some basic tools: Node.js and a code editor of your choice. After that, create a Node.js project and install the required packages. You may find a detailed guide on how to install and run Puppeteer on our <a href="https://oxylabs.io/blog/puppeteer-tutorial" target="_blank" rel="nofollow noopener">blog post</a>.</p>
<p>Once everything is set up, we can move on to the next part – Oxylabs Residential Proxies integration with Puppeteer.</p>
<ul>
<li>Within Puppeteer, fill in the value, for example:</li>
</ul>
<p><code>pr.oxylabs.io:7777</code></p>
<ul>
<li>Under ‘page.authenticate’ input your Oxylabs proxy sub-user username in the ‘username’ value and your password.</li>
<li>The example of a code looks like this:</li>
</ul>
<pre>const puppeteer = require('puppeteer');
(async () =&gt; {
  const browser = await puppeteer.launch({
    headless: false,
    args: ['--proxy-server=pr.oxylabs.io:7777]  
});
  const page = await browser.newPage();
    await page.authenticate({
        username: 'USERNAME',
        password: 'PASSWORD'
    });
    await page.goto('https://ip.oxylabs.io');
    await page.screenshot({path: 'example.png'});
    await browser.close();
})();
</pre>
<p>You can also use country-specific entries. For example, if you put <code>us-pr.oxylabs.io</code> under ‘host’ and <code>10001</code> under ‘port’, you will receive a US exit node with a sticky session. Please check out our <a href="#quick-start">documentation</a> for a complete list of country-specific entry nodes.</p>
<p>And that’s it! You’ve successfully integrated Oxylabs Residential proxies with Puppeteer.</p>
<hr />
<h4>References,</h4>
<p><a href="https://docs.oxylabs.io/residential/index.html" target="_blank" rel="nofollow noopener">https://docs.oxylabs.io/residential/index.html</a></p>
<hr />
<blockquote><p><strong>Disclaimer</strong>: This part of the content is mainly from the merchant. If the merchant does not want it to be displayed on my website, please <a href="https://www.proxysp.com/contact-us/">contact us</a> to delete your content.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://proxysp.com/oxylabs-residential-proxies/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7621</post-id>	</item>
		<item>
		<title>How to Use OxyLabs Proxy [Part 1]: OxyLabs Datacenter Proxies Manual</title>
		<link>https://proxysp.com/oxylabs-datacenter-proxies/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oxylabs-datacenter-proxies</link>
					<comments>https://proxysp.com/oxylabs-datacenter-proxies/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
				<category><![CDATA[How to Use OxyLabs Proxy (OxyLabs User Manual Navigation)]]></category>
		<guid isPermaLink="false">https://www.proxysp.com/?p=7589</guid>

					<description><![CDATA[Want to use OxyLabs' datacenter proxies? Then you can't miss this article. It is the most comprehensive OxyLabs datacenter proxies user guide. Quick Start Before we &#8230;<p class="read-more"> <a class="ast-button" href="https://proxysp.com/oxylabs-datacenter-proxies/"> <span class="screen-reader-text">How to Use OxyLabs Proxy [Part 1]: OxyLabs Datacenter Proxies Manual</span> Read More &#187;</a></p>]]></description>
										<content:encoded><![CDATA[<blockquote><p>Want to use OxyLabs' datacenter proxies? Then you can't miss this article. It is the most comprehensive OxyLabs datacenter proxies user guide.</p></blockquote>
<h2>Quick Start</h2>
<p>Before we begin, please make sure you have received a username, password, and all URLs linking to your IP list from a Sales Representative, Dedicated Account Manager, or Support Team.</p>
<p>There are two ways you can get to your IP list. You can either access the IP list directly from your browser by opening the URL you received (e.g.: <code>https://proxy.oxylabs.io/all</code>). You will then be asked to enter your login credentials (HTTP Basic Auth).</p>
<p>Or you can retrieve the list by making a GET request to the URL you received (for example: <code>https://proxy.oxylabs.io/all</code>). Don't forget to replace <code>USERNAME</code> and <code>PASSWORD</code> with your proxy user credentials.</p>
<div class="inside-code">
<pre>curl <span class="nt">-u</span> <span class="s2">"USERNAME:PASSWORD"</span> https://proxy.oxylabs.io/all</pre>
<p><span style="font-size: 16px;">To make a request using a proxy, you will need to choose an IP address from the acquired list and specify it in the request parameters. You can see an example in cURL below. You can find more code samples in other languages </span><a href="#making-requests">here</a> <span style="font-size: 16px;">or</span><span style="font-size: 16px;"> full code examples on our </span><a class="custom_link" style="font-size: 16px; background-color: #ffffff;" href="https://github.com/oxylabs/product-integrations/tree/master/datacenter-proxies" target="_blank" rel="nofollow noopener">GitHub</a>.</p>
</div>
<div class="inside-code">
<pre>curl <span class="nt">-x</span> 1.2.3.4:60000 <span class="nt">-U</span> <span class="s2">"USERNAME:PASSWORD"</span> http://ip.oxylabs.io</pre>
<p><span style="font-size: 16px;">If there are any questions we have not covered in this doccumentation, please contact your Dedicated Account Manager or our Support at </span><a class="custom_link" style="font-size: 16px; background-color: #ffffff;" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a><span style="font-size: 16px;">.</span></p>
</div>
<hr />
<h2>Proxy Lists</h2>
<hr />
<h3>Basic</h3>
<p>You should receive a URL to your proxy list from your Dedicated Account Manager or our Support and it should look something like this:</p>
<pre>https://proxy.oxylabs.io/key/a27c5343ce4c4637a85a9297ddf1cace</pre>
<p>Simply open this URL in your browser (or any other prefered software). You will then be asked to enter your login credentials (HTTP Basic Auth):</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8075" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxy-Authentication-Required.jpg" alt="OxyLabs Proxy Authentication Required" width="358" height="238" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxy-Authentication-Required.jpg 358w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxy-Authentication-Required-300x199.jpg 300w" sizes="(max-width: 358px) 100vw, 358px" /></p>
<p>Once you do that, the list of proxies will be shown in a plain text.</p>
<p>If you have multiple lists and wish to get all IPs assigned to your account, you can use this URL:</p>
<pre>https://proxy.oxylabs.io/all</pre>
<p>You can also include <code>?showCountry</code> or <code>?showCity</code> at the end of your URL to get IPs with their corresponding locations.</p>
<hr />
<h3>RESTful</h3>
<h4 id="showing-all-available-proxy-lists">Showing All Available Proxy Lists</h4>
<p>With this endpoint, you can retrieve proxy lists that belong to your user:</p>
<div class="endpoint">
<pre class="endpoint-body">GET https://api.oxylabs.io/v1/proxies/lists</pre>
</div>
<pre>curl -U username:password "https://api.oxylabs.io/v1/proxies/lists"
</pre>
<p><strong>Sample output:</strong></p>
<pre class="highlight json tab-json">[
{
"uuid": "123e4567-e89b-12d3-a456-426655440000",
"key": "12345678",
"updated_timestamp": "2016-09-28T13:03:50+0300",
"ips_count": 2000,
"href": "http://api.oxylabs.io/v1/proxies/lists/123e4567-e89b-12d3-a456-426655440000"
}
]</pre>
<hr />
<h4>Retrieving a Specific Proxy List</h4>
<p>With this endpoint, you can retrieve a specific proxy list:</p>
<pre class="endpoint-body">GET https://api.oxylabs.io/v1/proxies/lists/{uuid}</pre>
<p>Request parameters:<br />
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Parameter</th>
<th> Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>uuid</code></td>
<td>The uuid of the proxy-list to retrieve</td>
</tr>
</tbody>
</table>
</div>
<pre>curl -u username:password "https://api.oxylabs.io/v1/proxies/lists/{uuid}"
</pre>
<p><strong>Sample output:</strong></p>
<pre>[
{
"ip": "127.0.0.1",
"port": "60000",
"country": "US"
},
{ 
"ip": "127.0.0.2",
"port": "60000",
"country": "GB"
}
]</pre>
<hr />
<h2 id="making-requests">Making Requests</h2>
<p>By default, Oxylabs proxies and Proxy Rotator use a basic <a class="custom_link" href="https://en.wikipedia.org/wiki/Basic_access_authentication" target="_blank" rel="nofollow noopener">HTTP authentication</a> that requires you to provide a username and password. You can get your credentials by contacting your Dedicated Account Manager or our Support Team at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<p>We also support authentication based on whitelisted IP addresses. See <a href="#whitelisting-ips">Whitelisting IPs</a>.</p>
<p>Depending on your authentication method, you might need to change the proxy port:</p>
<p><strong>Proxy</strong></p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Port</th>
<th>Usage</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>60000</code></td>
<td>Required with proxies when login credentials are used (username and password). This port is used with proxy <a href="#proxy-rotator">Proxy Rotator </a>as well when used with both login credentials and whitelisted IPs.</td>
</tr>
<tr>
<td><code>65432</code></td>
<td>Required with proxies when authorization is done via whitelisted IPs</td>
</tr>
</tbody>
</table>
</div>
<p>If you want to use Datacenter Proxies via user/pass authentification method:</p>
<pre>curl -x 1.2.3.4:60000 -U user1:pass1 http://ip.oxylabs.io</pre>
<p>If you want to use Datacenter Proxies via Whitelisted IP authentification method:</p>
<pre>curl -x 1.2.3.4:65432 http://ip.oxylabs.io</pre>
<hr />
<h2 id="whitelisting-ips">Whitelisting IPs</h2>
<h3 id="dashboard">Dashboard</h3>
<p>We also support authentication based on an IP address. If you are using proxies directly (without proxy <a class="custom_link" href="#proxy-rotator">Proxy Rotator</a>), you can whitelist your IPs by yourself. Just log into <a class="custom_link" href="https://stats.oxylabs.io/" target="_blank" rel="nofollow noopener">https://stats.oxylabs.io</a> and on the sidebar at the bottom you will see a section named &#8220;Add Whitelist&#8221;. After clicking on the link you will be navigated to self-whitelist page which looks like this:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8076" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Whitelisting-IPs.png" alt="OxyLabs Whitelisting IPs" width="607" height="195" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Whitelisting-IPs.png 607w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Whitelisting-IPs-300x96.png 300w" sizes="(max-width: 607px) 100vw, 607px" /></p>
<h2></h2>
<p>Here you can manage your whitelisted IPs that you can use to access proxies. You can whitelist individual IPs, as well as up to 24 subnets. If you would like to whitelist a larger subnet, please contact your Dedicated Account Manager or Support Team at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<p>If you are using proxy <a class="custom_link" href="#proxy-rotator">Proxy Rotator</a> or <a href="https://www.proxysp.com/socks-proxy/" target="_blank" rel="noopener">SOCKS proxies</a>, you cannot whitelist your IP address by yourself. Instead, you will have to give us a list of IP address you want to use to connect to proxies. We will whitelist them (add them to firewall exception rules). After doing so, you will be able to access your proxies without login credentials.</p>
<p>Bear in mind, that if you are using whitelisted IPs to access your proxies, you will need to use port <code>65432</code>. For proxy <a class="custom_link" href="#proxy-rotator">Proxy Rotator</a>, the port remains <code>60000</code>.</p>
<hr />
<h3 id="restful-2">RESTful</h3>
<p>You can also whitelist IPs by sending queries directly to our endpoints. Please note there is a 5-minute cooldown for confirming any changes to your whitelisted IP list.</p>
<h4 id="getting-whitelisted-ips-list">Getting Whitelisted IPs List</h4>
<pre>GET https://api.oxylabs.io/v1/whitelisted_ips</pre>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Response</th>
<th> Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>200</code></td>
<td>Success. Response body contains all currently whitelisted IPs and their ids.</td>
</tr>
</tbody>
</table>
</div>
<pre>curl -U username:password "https://api.oxylabs.io/v1/whitelisted_ips"</pre>
<p>Sample output:</p>
<pre>{
"data": [
{
"id": 9765,
"address": "127.0.0.1"
},
{
"id": 9766,
"address": "127.0.0.2"
}
]
}</pre>
<hr />
<h4 id="adding-a-whitelisted-ip">Adding a Whitelisted IP</h4>
<pre>POST https://api.oxylabs.io/v1/whitelisted_ips</pre>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Response</th>
<th> Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>201</code></td>
<td>Success. The IP address has been added to the list. Response body contains the newly added <code>address</code> and <code>id</code>.</td>
</tr>
<tr>
<td><code>422</code></td>
<td>Error. Request body contains an invalid IP address. Response body contains the error message.</td>
</tr>
</tbody>
</table>
</div>
<pre>curl -X POST -u username:password "https://api.oxylabs.io/v1/whitelisted_ips"
--header "Content-Type: application/json" --data '{"address": "127.0.0.1"}'</pre>
<pre>{
"error": {
"message": "This is not a valid IP address.",
"code": 422
}
}</pre>
<p>Sample output:</p>
<pre>{
"id": 9767,
"address": "127.0.0.1"
}</pre>
<hr />
<h4 id="removing-a-whitelisted-ip">Removing a Whitelisted IP</h4>
<pre>DELETE https://api.oxylabs.io/v1/whitelisted_ips/{id}</pre>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Parameter</th>
<th> Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>id</code></td>
<td>The <code>id</code> of the IP address you want to delete (you can get it from GET whitelisted IPs endpoint)</td>
</tr>
</tbody>
</table>
</div>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Response</th>
<th>  Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>204</code></td>
<td>Success. The IP address has been removed from the list. Response body is empty.</td>
</tr>
<tr>
<td><code>403</code></td>
<td>Error. Request contains an invalid <code>id</code>. Response body contains the error message &#8220;Access Denied&#8221;.</td>
</tr>
</tbody>
</table>
</div>
<pre>curl -X DELETE -u username:password "https://api.oxylabs.io/v1/whitelisted_ips/{id}"</pre>
<hr />
<h4 id="saving-changes-5min-cooldown">Saving Changes (5min Cooldown)</h4>
<pre>POST https://api.oxylabs.io/v1/whitelisted_ips/upload_to_servers</pre>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Response</th>
<th> Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>202</code></td>
<td>Success. Changes to your whitelisted IP list have been confirmed. Response body is empty.</td>
</tr>
<tr>
<td><code>429</code></td>
<td>Error. Changes have not been confirmed, the endpoint is on a 5 minute cooldown. Response body contains the error message &#8220;You have exceed the rate limit for the endpoint. Please try again later&#8221;</td>
</tr>
</tbody>
</table>
</div>
<pre>curl -X POST -u username:password "https://api.oxylabs.io/v1/whitelisted_ips/upload_to_servers"</pre>
<hr />
<h2>Datacenter Proxy API</h2>
<h3 id="replacing-subnet-ips">Replacing subnet IPs</h3>
<pre>POST https://api.oxylabs.io/v1/proxy-list/rest/proxy-lists/{PROXY_LIST_UUID}/by-uuid/network-modification-requests/replace</pre>
<p>For you to replace IPs from a specific subnet in your existing proxy list while using Proxy Management API, you will need to make a POST request to the endpoint above with specific subnets you want to replace. To make it work correctly, you must insert a proxy list UUID that can be queried from the API (as described <a href="#showing-all-available-proxy-lists">here</a>).</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Response</th>
<th> Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>id</code></td>
<td>Initiated replacement process ID</td>
</tr>
<tr>
<td><code>status</code></td>
<td>Status describes the state of initiated replacement process</td>
</tr>
<tr>
<td><code>message</code></td>
<td>Initiated process type</td>
</tr>
<tr>
<td><code>created_at</code></td>
<td>Timestamp of the initiated process</td>
</tr>
<tr>
<td><code>link_to_list_plain</code></td>
<td>Link to the list of proxies in plain text</td>
</tr>
<tr>
<td><code>link_to_list_json</code></td>
<td>Link to the list of proxies formatted in JSON</td>
</tr>
</tbody>
</table>
</div>
<pre>curl -X POST -H "Content-Type: application/json" -d '{"subnets": ["x.x.x.0/24","y.y.y.0/24"]}' https://api.oxylabs.io/v1/proxy-list/rest/proxy-lists/{PROXY_LIST_UUID}/by-uuid/subnet-replacement-requests -u user:pass</pre>
<p>Sample output:</p>
<pre>{
    "id": "1", 
    "status": "processing", 
    "message": None, 
    "type": "replace", 
    "created_at": "2021-01-01T00:00:00+00:00", 
    "link_to_list_plain": "https://proxy.oxylabs.io/key/4f34fe5862603138c1bc5ce28b181aef", 
    "link_to_list_json": "https://api.oxylabs.io/v1/proxies/lists/8f11274c-a900-11eb-b910-901b0ec4424b"
}
</pre>
<hr />
<h3 id="checking-replacement-status">Checking replacement status</h3>
<pre>GET https://api.oxylabs.io/v1/proxy-list/rest/subnet-replacement-requests/{INITIATED_REPLACEMENT_PROCESS_ID}
</pre>
<p>To confirm that the subnet replacement was a success, you must make a GET request to the endpoint above while inserting <em>Initiated replacement process ID</em> from the replacement process initiated before.</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Response</th>
<th> Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>id</code></td>
<td>Initiated replacement process ID</td>
</tr>
<tr>
<td><code>status</code></td>
<td>Status describes the state of initiated replacement process</td>
</tr>
<tr>
<td><code>message</code></td>
<td>Initiated process type</td>
</tr>
<tr>
<td><code>created_at</code></td>
<td>Timestamp of the initiated process</td>
</tr>
<tr>
<td><code>link_to_list_plain</code></td>
<td>Link to the list of proxies in plain text</td>
</tr>
<tr>
<td><code>link_to_list_json</code></td>
<td>Link to the list of proxies formatted in JSON</td>
</tr>
</tbody>
</table>
</div>
<pre>curl -u user:pass https://api.oxylabs.io/v1/proxy-list/rest/subnet-replacement-requests/{INITIATED_REPLACEMENT_PROCESS_ID}"
</pre>
<p>Sample output:</p>
<pre>{
    "created_at": "2021-01-01T00:00:00+00:00",
    "id": "1",
    "link_to_list_json": "https://api.oxylabs.io/v1/proxies/lists/8f11274c-a900-11eb-b910-901b0ec4424b",
    "link_to_list_plain": "https://proxy.oxylabs.io/key/4f34fe5862603138c1bc5ce28b181aef",
    "message": None,
    "status": "completed",
    "type": "replace"
}
</pre>
<hr />
<h3 id="listing-replaced-and-new-ips">Listing replaced and new IPs</h3>
<pre>GET https://api.oxylabs.io/v1/proxy-list/rest/network-modification-requests/{INITIATED_REPLACEMENT_PROCESS_ID}/ips
</pre>
<p>When the replacement request has been processed, removed IPs can be found by making a GET request to the endpoint above while inserting initiated replacement process ID from the replacement process initiated before.</p>
<p>Only 100 replaced IPs will be displayed with the initial request, and pagination metadata will be in the response. In order to fetch the remaining list of replaced IPs, pagination must be used. For pagination, please format the endpoint below:</p>
<pre>GET https://api.oxylabs.io/v1/proxy-list/rest/network-modification-requests/{INITIATED_REPLACEMENT_PROCESS_ID}/ips?fields=metadata.total&after={metadata_after}
</pre>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Response</th>
<th> Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>items</code></td>
<td>A list that contains replaced IP IDs, IPs adressed, and subnet addresses</td>
</tr>
<tr>
<td><code>id</code></td>
<td>Proxy ID within the replacement process</td>
</tr>
<tr>
<td><code>ip</code></td>
<td>Proxy IP adress</td>
</tr>
<tr>
<td><code>subnet</code></td>
<td>Subnet from which the IP is assigned</td>
</tr>
<tr>
<td><code>type</code></td>
<td><code>redundant</code> &#8211; IP that have been replaced, <code>new</code>&#8211; New IP that have been assigned instead of <code>redundant</code>one</td>
</tr>
<tr>
<td><code>metadata</code></td>
<td>Cursor pagination data showing boundaries from which IP address in the replaced IPs list data it has been fetched</td>
</tr>
</tbody>
</table>
</div>
<pre>curl -u user:pass "https://api.oxylabs.io/v1/proxy-list/rest/network-modification-requests/{INITIATED_REPLACEMENT_PROCESS_ID}/ips"
</pre>
<p>Sample output:</p>
<pre>{
  "items": [
    {
      "id": "1",
      "ip": "127.1.0.1",
      "subnet": "127.1.0.0/24",
      "type": "redundant"
    },
    {
      "id": "2",
      "ip": "127.1.1.2",
      "subnet": "127.1.1.0/24",
      "type": "new"
    }
  ],
  "metadata": {
    "after": "'100'",
    "before": "'None'",
    "total": 100
  }
}
</pre>
<hr />
<h2 id="proxy-rotator">Proxy Rotator &#8211; Optional</h2>
<p>This service is optional and is not included in subscription. Instead of connecting to individual IPs, we provide you with a single endpoint to your assigned proxy list. With every request, the endpoint fetches a different IP. To learn how to use the endpoint as a proxy, please see the example on the right.</p>
<p><strong>Note</strong>: Proxy Rotator should be used only with port <code>60000</code>.</p>
<pre>curl --proxy vm.oxylabs.io:60000 http://ip.oxylabs.io
</pre>
<hr />
<h3>Session Control Using Proxy Rotator</h3>
<p>It is possible to keep the same IP address with the Proxy Rotator. Firstly, you will need to know how many proxies your Proxy Rotator has. Then simply add <code>--proxy-header "Proxy-Server: sXXX"</code> header to your request, where <code>sXXX</code> is the number of the proxy, for example, <code>s5</code> or <code>s2541</code>.</p>
<pre>user1@machine:~$ curl -x vm.oxylabs.io:60000 -U user:pass http://ip.oxylabs.io --proxy-header "Proxy-Server: s10"
1.2.30.40
user1@machine:~$ curl -x vm.oxylabs.io:60000 -U user:pass http://ip.oxylabs.io --proxy-header "Proxy-Server: s10"
1.2.30.40
user1@machine:~$ curl -x vm.oxylabs.io:60000 -U user:pass http://ip.oxylabs.io --proxy-header "Proxy-Server: s10"
1.2.30.40
</pre>
<hr />
<h2>Response Codes</h2>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Response</th>
<th> Error Message</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>407</code></td>
<td>Proxy Authentication Required</td>
<td>You are accessing proxy through 60000 port, but you have not provided authorization header, or your credentials are incorrect.</td>
</tr>
<tr>
<td><code>504</code></td>
<td>Gateway Timeout</td>
<td>Proxy server timed out. Waiting for a response from the target server. Usually about 60s.</td>
</tr>
<tr>
<td><code>503</code></td>
<td>Service Unavailable</td>
<td>Failed to connect to the target server. DNS failure to resolve the target server address.</td>
</tr>
<tr>
<td><code>401</code></td>
<td>Unauthorized</td>
<td>Incorrect credentials.</td>
</tr>
<tr>
<td><code>404</code></td>
<td>Not Found</td>
<td>The resource specified could not be found.</td>
</tr>
<tr>
<td><code>500</code></td>
<td>Internal Server Error</td>
<td>We had a problem with our server. Try again later.</td>
</tr>
</tbody>
</table>
</div>
<p>These are the most common response codes that you can get while using our Datacentre Proxies. If you receive any other response code, please get in touch with your Dedicated Account Manager for more information.</p>
<hr />
<h2>3rd Party Integrations</h2>
<h3 id="oxylabs-proxy-manager">Oxylabs Proxy Manager</h3>
<p><a class="custom_link" href="https://chrome.google.com/webstore/detail/oxylabs-proxy-manager/infajoaodhhdogakhloedbppcbeajhoo" target="_blank" rel="nofollow noopener">Oxylabs Proxy Manager</a> is a proxy management extension for Chrome. It is not only free but also works with any proxy provider of your choice. Enable your proxy without having to jump through settings and menu options. Download the extension from Chrome Web Store <a class="custom_link" href="https://chrome.google.com/webstore/detail/oxylabs-proxy-manager/infajoaodhhdogakhloedbppcbeajhoo" target="_blank" rel="nofollow noopener">here</a></p>
<ul>
<li>Click the extension icon to open the application</li>
<li>If you haven't added any proxies yet, you will see <strong>Add new proxy</strong> button. Click it to continue.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8078" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Add-new-proxy.jpg" alt="OxyLabs Add new proxy" width="434" height="431" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Add-new-proxy.jpg 434w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Add-new-proxy-300x298.jpg 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Add-new-proxy-150x150.jpg 150w" sizes="(max-width: 434px) 100vw, 434px" /></p>
<ul>
<li>Add proxy profile. Provide a name for the profile under <strong>Enter name</strong>. Enter on of the proxies you have purchased from us as <strong>Proxy server IP</strong> and <code>60000</code> as <strong>Port</strong> if you are using username:password authentication method, and <code>65432</code> if you are using whitelisted IPs.</li>
</ul>
<p>Fill in your <strong>Username</strong> and <strong>Password</strong>. Finally, click <strong>Save changes</strong>. If you have whitelisted your IP, you don't need to do this step at all.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-8079" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Save-changes.png" alt="OxyLabs Save changes" width="829" height="383" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Save-changes.png 963w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Save-changes-300x139.png 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Save-changes-768x355.png 768w" sizes="(max-width: 829px) 100vw, 829px" /></p>
<ul>
<li>Open the extension and click <strong>Connect</strong>. That's it, you are now using datacenter proxies.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8080" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-click-Connect.jpg" alt="OxyLabs click Connect" width="430" height="371" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-click-Connect.jpg 430w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-click-Connect-300x259.jpg 300w" sizes="(max-width: 430px) 100vw, 430px" /></p>
<hr />
<h3 id="switchyomega">SwitchyOmega</h3>
<p>SwitchyOmega is a powerful and reliable proxy manager that works with many popular browsers. From our own experience, it is one of the best proxy plugins out there. We highly recommend using SwitchyOmega with our proxies. To do that, you will need to get the plugin. For Chrome, click <a class="custom_link" href="https://chrome.google.com/webstore/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif?hl=en" target="_blank" rel="nofollow noopener">here</a>, for Firefox click <a class="custom_link" href="https://addons.mozilla.org/en-US/firefox/addon/switchyomega/" target="_blank" rel="nofollow noopener">here</a>. Once you have it installed, you should:</p>
<ul>
<li>Open Switchy Omega options.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8081" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega1.png" alt="OxyLabs SwitchyOmega1" width="195" height="230" /></p>
<ul>
<li>Click <strong>New profile&#8230;</strong></li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-8082" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega2.jpg" alt="OxyLabs SwitchyOmega2" width="537" height="461" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega2.jpg 579w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega2-300x258.jpg 300w" sizes="(max-width: 537px) 100vw, 537px" /></p>
<ul>
<li>Give the new profile a name, choose <strong>Proxy Profile</strong> type and click <strong>Create</strong></li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-8083" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega3.jpg" alt="OxyLabs SwitchyOmega3" width="543" height="557" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega3.jpg 590w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega3-293x300.jpg 293w" sizes="(max-width: 543px) 100vw, 543px" /></p>
<ul>
<li>Change <strong>Protocol</strong> to <strong>HTTP</strong>. Under <strong>Server</strong> enter one of the proxies you have purchased from us. Under <strong>Port</strong> add <code>60000</code> if you are using username:password authentication method, and <code>65432</code> if you are using whitelisted IPs.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-8084" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega4.jpg" alt="OxyLabs SwitchyOmega4" width="793" height="177" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega4.jpg 856w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega4-300x67.jpg 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega4-768x171.jpg 768w" sizes="(max-width: 793px) 100vw, 793px" /></p>
<ul>
<li>Next, click the lock button on the right. Fill in your <strong>Username</strong> and <strong>Password</strong>. Click <strong>Save changes</strong>.</li>
</ul>
<p>If you have whitelisted your IP, you don't need to do this step at all.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8085" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega5.jpg" alt="OxyLabs SwitchyOmega5" width="297" height="230" /></p>
<ul>
<li>Click <strong>Apply changes</strong></li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8086" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega6.jpg" alt="OxyLabs SwitchyOmega6" width="378" height="380" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega6.jpg 378w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega6-298x300.jpg 298w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega6-150x150.jpg 150w" sizes="(max-width: 378px) 100vw, 378px" /></p>
<ul>
<li>For the final step, click on SwitchyOmega icon and choose your newly configured proxy. You are now ready to go!</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8087" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-SwitchyOmega7.png" alt="OxyLabs SwitchyOmega7" width="198" height="255" /></p>
<hr />
<h3 id="foxyproxy">FoxyProxy</h3>
<p>FoxyProxy is a simple proxy manager that works with many popular browsers. First, you will need to get FoxyProxy. For Chrome, click <a class="custom_link" href="https://chrome.google.com/webstore/detail/foxyproxy-standard/gcknhkkoolaabfmlnjonogaaifnjlfnp?hl=en" target="_blank" rel="nofollow noopener">here</a>, for Firefox click <a class="custom_link" href="https://addons.mozilla.org/en-US/firefox/addon/foxyproxy-standard/" target="_blank" rel="nofollow noopener">here</a>. Once you have it installed, you should:</p>
<ul>
<li>Open FoxyProxy Options.</li>
<li>Click <strong>Add</strong>.</li>
<li>In <strong>IP address, DNS name, server name</strong> fields enter one of the proxies.</li>
<li>In <strong>Port</strong> field enter port. If you use user/pass authentication port is <code>60000</code>. If you have whitelisted your IP the port is <code>65432</code>.</li>
<li>In <strong>Username (optional)</strong> field you should enter your username. If you have whitelisted your IP, leave this field blank as the plugin will authorize through it and ignore everything you write in this field.</li>
<li>In <strong>Password (Optional)</strong> field you should enter your password. If you have whitelisted your IP and wish to authorise through it, leave this field blank.</li>
<li>After filling in all fields press <strong>Save</strong>.</li>
<li>In order to get all of your requests running through this setup, you must press on the FoxyProxy plugin icon (1) and click on <em>Use proxy Proxy for all URLs (ignore patterns)</em> (2).</li>
</ul>
<p>(1)</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8089" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-FoxyProxy1.jpg" alt="OxyLabs FoxyProxy1" width="421" height="326" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-FoxyProxy1.jpg 421w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-FoxyProxy1-300x232.jpg 300w" sizes="(max-width: 421px) 100vw, 421px" /></p>
<p>(2)</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-8090" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-FoxyProxy2.png" alt="OxyLabs FoxyProxy2" width="851" height="436" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-FoxyProxy2.png 955w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-FoxyProxy2-300x154.png 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-FoxyProxy2-768x393.png 768w" sizes="(max-width: 851px) 100vw, 851px" /></p>
<ul>
<li>That is it, you are done!</li>
</ul>
<hr />
<h3 id="proxifier">Proxifier</h3>
<p>To use Datacenter Proxies with Proxfier, simply follow these steps:</p>
<ul>
<li>Open Proxifier app.</li>
<li>Add proxies. Click on <strong>Proxies (1)</strong>. Click <strong>Add(2)</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8091" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxifier1.png" alt="OxyLabs Proxifier1" width="592" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxifier1.png 592w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxifier1-300x253.png 300w" sizes="(max-width: 592px) 100vw, 592px" /></p>
<ul>
<li>In the following window, enter the required information. <strong>IP Address(1)</strong>, <strong>Port(2)</strong> which for the username/pass authentication is <code>60000</code> and for whitelisted IP authentication &#8211; <code>65432</code> , select <strong>HTTPS(3)</strong> protocol. In the authentication box click <strong>Enable(4)</strong> and enter provided <strong>Username(5)</strong> and <strong>Password(6)</strong>.</li>
</ul>
<p>Do not forget to add <code>customer-</code> at the beginning of the username. If you have whitelisted your devices, do not click on <strong>Enable</strong>, your authenticiation will be done without username/password. If you wish, you can enable <strong>Appear as Web Browser</strong> option. Click <strong>OK</strong>.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8092" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxifier2.png" alt="OxyLabs Proxifier2" width="468" height="510" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxifier2.png 468w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxifier2-275x300.png 275w" sizes="(max-width: 468px) 100vw, 468px" /></p>
<ul>
<li>You will be asked <strong>Do you want Proxifier to use this proxy by default</strong>? This means that this setup will be used for all of your browsers. It is up to you to decide whether you want that or not. If you select <strong>Yes</strong>, you are done setting up. If you wish to use proxies just on a particular browser, follow these next steps.</li>
<li>Click on <strong>Rules(1)</strong> and then click <strong>Add&#8230;(2)</strong>.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8093" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxifier3.png" alt="OxyLabs Proxifier3" width="846" height="461" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxifier3.png 846w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxifier3-300x163.png 300w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxifier3-768x418.png 768w" sizes="(max-width: 846px) 100vw, 846px" /></p>
<ul>
<li>Click <strong>+(1)</strong> button to add applications that you want to use the proxy settings with. Select a browser that you want to use these proxy settings with and click on it. Finally, you have to change <strong>Action(2)</strong>. Click on it and select your created proxy.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8094" src="https://www.proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxifier4.png" alt="OxyLabs Proxifier4" width="527" height="543" srcset="https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxifier4.png 527w, https://proxysp.com/wp-content/uploads/2021/09/OxyLabs-Proxifier4-291x300.png 291w" sizes="(max-width: 527px) 100vw, 527px" /></p>
<ul>
<li>That is it. Now all of your requests (while using a browser) will be made via proxies.</li>
</ul>
<hr />
<h4>References</h4>
<p><a href="https://docs.oxylabs.io/dc/index.html#quick-start" target="_blank" rel="nofollow noopener">https://docs.oxylabs.io/dc/index.html</a></p>
<hr />
<p>&nbsp;</p>
<blockquote><p><strong>Disclaimer</strong>: This part of the content is mainly from the merchant. If the merchant does not want it to be displayed on my website, please <a href="https://www.proxysp.com/contact-us/">contact us</a> to delete your content.</p></blockquote>
<p>&nbsp;</p>
<pre></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://proxysp.com/oxylabs-datacenter-proxies/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7589</post-id>	</item>
		<item>
		<title>How to Use OxyLabs Proxy [Part 3]: OxyLabs Next-Gen Residential Proxies</title>
		<link>https://proxysp.com/oxylabs-next-gen-residential-proxies/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oxylabs-next-gen-residential-proxies</link>
					<comments>https://proxysp.com/oxylabs-next-gen-residential-proxies/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
				<category><![CDATA[How to Use OxyLabs Proxy (OxyLabs User Manual Navigation)]]></category>
		<guid isPermaLink="false">https://www.proxysp.com/?p=7622</guid>

					<description><![CDATA[Did you heard of the Next-Gen Residential Proxies by Oxylabs? This article will show you how to use it in detail. Quick Start Next-Gen Residential Proxies &#8230;<p class="read-more"> <a class="ast-button" href="https://proxysp.com/oxylabs-next-gen-residential-proxies/"> <span class="screen-reader-text">How to Use OxyLabs Proxy [Part 3]: OxyLabs Next-Gen Residential Proxies</span> Read More &#187;</a></p>]]></description>
										<content:encoded><![CDATA[<blockquote><p>Did you heard of the Next-Gen Residential Proxies by Oxylabs? This article will show you how to use it in detail.</p></blockquote>
<h2 id="quick-start">Quick Start</h2>
<p>Next-Gen Residential Proxies are built for heavy-duty data retrieval operations. They enable effortless web data extraction without any delays or errors. The product is as customizable as a regular proxy, but at the same time it guarantees a much higher success rate. Custom headers and IP stickiness are both supported, alongside reusable cookies and POST requests.</p>
<p>If you have ever used regular proxies for data scraping, integrating Next-Gen Residential Proxies will be a breeze. The only difference is that we require to accept our certificate, or ignore it altogether with <code>-k</code> or <code>--insecure</code> cURL flags (or an equivalent expression in the language of your choice).</p>
<p>To make a request using Next-Gen Residential Proxies, we need to use <code>ngrp.oxylabs.io:60000</code> endpoint. Below is an example in cURL. You can find code samples in other languages <a href="#making-requests">here</a> or full code examples on our <a class="custom_link" href="https://github.com/oxylabs/product-integrations/tree/master/next-gen-residential-proxies" target="_blank" rel="nofollow noopener">GitHub</a>.</p>
<pre>curl -k -x ngrp.oxylabs.io:60000 -U "USERNAME:PASSWORD" http://ip.oxylabs.io
</pre>
<p>If you have any questions not covered by this documentation, please contact your account manager or our support staff at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<hr />
<h2 id="making-requests">Making requests</h2>
<pre>GET ngrp.oxylabs.io:60000
</pre>
<p>The easiest way to start is to send us a simple query without any custom options. We will add all standard headers on our end, pick the fastest proxy and deliver you the response body.</p>
<p>To utilize desired functionalities of Next-Gen Residential Proxies such as setting up proxy geolocation or reusing the same IP via session control, we need to send additional headers with the request.</p>
<p>Here's the full list of supported functionalities and headers:</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Parameter</th>
<th>Description</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>X-Oxylabs-Session-Id</code></td>
<td>If you need to reuse the same IP for multiple requests, add a session ID which can be a random string of characters</td>
<td></td>
</tr>
<tr>
<td><code>X-Oxylabs-Geo-Location</code></td>
<td>To use an IP address from a specific location, specify a country of or a city, for example <code>Germany</code>. Supported geo-locations can be found <a class="custom_link" href="https://docs.oxylabs.io/resources/universal-supported-geo_location-values.csv" target="_blank" rel="noopener">here</a>.</td>
<td></td>
</tr>
<tr>
<td><code>Headers</code></td>
<td>You can add your own headers such as <code>User-Agent</code>, or any other, insted of using pre-generated ones.</td>
<td></td>
</tr>
<tr>
<td><code>Cookies</code></td>
<td>You can add your own cookies, for example <code>Cookie: NID=1234567890</code>, to your requests.</td>
<td></td>
</tr>
<tr>
<td><code>X-Oxylabs-Status-Code</code></td>
<td>In case your target returns a custom status code with a successful response, you can send the status code of the response and our system will not retry the request.</td>
<td></td>
</tr>
<tr>
<td><code>X-Oxylabs-Render</code></td>
<td>If you wish to render JavaScript use <code>html</code> to get a rendered HTML or <code>png</code> to get a screenshot of the page.</td>
<td></td>
</tr>
<tr>
<td><code>X-Oxylabs-Parser-Type</code></td>
<td>This header can be used to select parser type. Currently <code>ecommerce-product</code> is supported.</td>
<td></td>
</tr>
<tr>
<td><code>X-Oxylabs-Parse</code></td>
<td>THe headers is used to to parse the data from the website. Value <code>1</code> must pe passed to enable parsing.</td>
</tr>
</tbody>
</table>
</div>
<pre>curl -k -v -x ngrp.oxylabs.io:60000 -U user:pass1 "https://ip.oxylabs.io"
</pre>
<hr />
<h3 id="session">Session</h3>
<p>If you want to use the same proxy to make multiple requests, you can do that by adding the <code>X-Oxylabs-Session-Id</code> header with a randomly-generated string for the session ID. We will assign a proxy to this ID and keep it for up to 10 minutes. After that a new proxy will be assigned to that particular session ID.</p>
<pre>curl -k -v -x ngrp.oxylabs.io:60000 -U user:pass1 "https://ip.oxylabs.io" -H "X-Oxylabs-Session-Id: 123randomString"
</pre>
<hr />
<h3 id="geo-location">Geo-Location</h3>
<p>Some websites will not serve content if accessed from unsupported geo-locations. You can specify in your request which country you want to access the target from. Just add the <code>X-Oxylabs-Geo-Location</code> header with the value set to a country name, for example, <code>Germany</code> for Germany or <code>United States</code> for the United States.</p>
<p>Next-Gen Residential Proxies also support city-level targeting. If you want to add a city, simply add the city name before the country, e.g,: <code>Munich, Germany</code>.</p>
<p>The full list of supported geo-location parameter values can be found <a class="custom_link" href="https://docs.oxylabs.io/resources/universal-supported-geo_location-values.csv" target="_blank" rel="noopener">here</a>.</p>
<pre>curl -k -v -x ngrp.oxylabs.io:60000 -U user:pass1 "https://ip.oxylabs.io" -H "X-Oxylabs-Geo-Location: Munich,Germany"
</pre>
<hr />
<h3 id="headers">Headers</h3>
<p>If you know more than we do about a particular target, you can add your own headers to your request. It can be both standard headers, such as <code>User-Agent</code> or <code>Accept-Language</code>, and something completely custom and target-specific.</p>
<pre>curl -k -v -x ngrp.oxylabs.io:60000 -U user:pass1 "https://ip.oxylabs.io" -H "Your-Custom-Header: interesting header content" -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/73.0.3683.86 Chrome/73.0.3683.86 Safari/537.36" -H "Accept-Language: en-US"
</pre>
<hr />
<h3 id="cookies">Cookies</h3>
<p>The system also allows setting custom cookies to target website. With your initial request we will return all response headers and cookies. You can modify them on your end and send them back to our system with the next request. It may be a good idea to reuse the cookies if you use the same IP address to make a few consecutive requests (see <a href="#session">Session</a> for more)</p>
<pre>curl -k -v -x ngrp.oxylabs.io:60000 -U user:pass1 "https://ip.oxylabs.io" -H "Cookie: NID=1234567890; 1P_JAR=0987654321"
</pre>
<hr />
<h3 id="custom-status-code">Custom Status Code</h3>
<p>By default we assume that the request is successful as long as it returns a 2xx or a 4xx status code. However, sometimes websites return the required content together with a non-standard HTTPS status code. If one of your targets does that, you can indicate which status codes are acceptable and actually valuable for you. Simply add <code>X-Oxylabs-Status-Code</code> header with all HTTP response codes that actually work for you. Please note that 2xx and 4xx will still be automatically marked as successful.</p>
<pre>curl -k -v -x ngrp.oxylabs.io:60000 -U user:pass1 "https://ip.oxylabs.io" -H "X-Oxylabs-Status-Code: 500,501,502,503" 
</pre>
<hr />
<h3 id="post-requests">POST Requests</h3>
<p>Next-Gen Residential Proxies don't only support sending <code>GET</code> requests, but also let you <code>POST</code> to a web endpoint of your choice. This means that you can send data to a target website, which can then make the website return a different result.</p>
<pre>curl -X POST -k -v -x ngrp.oxylabs.io:60000 -U user:pass1 "https://ip.oxylabs.io" -d "@/path/to/file.json"
</pre>
<hr />
<h3 id="javascript-rendering">JavaScript rendering</h3>
<p>Enable JavaScript rendering. Use when the target requires JavaScript to load content. There are two available values for this parameter: <code>html</code> (get raw output) and <code>png</code> (get a Base64-encoded screenshot).</p>
<pre>curl -k -v -x ngrp.oxylabs.io:60000 -U user:pass1 "https://ip.oxylabs.io" -H "X-Oxylabs-Render: html"
</pre>
<hr />
<h3 id="adaptive-parsing">Adaptive parsing</h3>
<p>Adaptive parsing is capable of parsing the most important fields from any e-commerce product page. To enable adaptive parsing for e-commerce product pages it is required to send two additional headers: <code>X-Oxylabs-Parser-Type: ecommerce_product</code> to select the parser type and <code>X-Oxylabs-Parse: 1</code> to parse the retrieved page.</p>
<p>Fields that can be parsed by Next-Gen Residential Proxies Adaptive Parsing for e-commerce product pages:</p>
<ul>
<li>Title</li>
<li>Regular price</li>
<li>Offer price</li>
<li>Currency</li>
<li>Product description</li>
<li>Product IDs</li>
<li>Image URLs</li>
<li>URLs from the page</li>
</ul>
<pre>curl -v -k -x ngrp.oxylabs.io:60000 -U user:pass1 "https://ip.oxylabs.io" -H "X-Oxylabs-Parser-Type: ecommerce_product" -H "X-Oxylabs-Parse: 1"
</pre>
<p>Sample output:</p>
<pre>{
    "results": [
        {
            "content": {
                "url": "https://ip.oxylabs.io/product/product_example.html",
                "body": {
                    "price": 11.99,
                    "title": "Example product title",
                    "currency": "$",
                    "old_price": 15.99,
                    "description": null,
                    "image_links": [
                        "https://ip.oxylabs.io/img/product_example.png"
                    ],
                    "ids_from_url": [],
                    "simple_links": [
                        {
                            "link": "https://ip.oxylabs.io/product/another_example.html",
                            "description": "Another product example"
                        }
                    ],
                    "ids_from_html": [
                        {
                            "Product number": "14158288"
                        }
                    ],
                    "price_range_lower": null,
                    "price_range_upper": null
                },
                "meta": {
                    "title": "Example product meta title",
                    "keywords": [],
                    "description": "Example product description"
                },
                "parse_status_code": 12000
            },
            "created_at": "2020-01-01 10:00:00",
            "updated_at": "2020-01-01 10:00:07",
            "id": 29964797,
            "page": 1,
            "url": "https://ip.oxylabs.io/product/product_example.html",
            "job_id": "6699272813062145025",
            "status_code": 200
        }
    ]
}
</pre>
<hr />
<h2 id="usage-statistics">Usage Statistics</h2>
<p>You can find your usage statistics by visiting our <a class="custom_link" href="https://client-monitor.oxylabs.io/v1/dashboard" target="_blank" rel="nofollow noopener">Dashboard</a> or by querying the following endpoint:</p>
<pre>GET https://data.oxylabs.io/v1/stats
</pre>
<p>By default the API will return all time usage statistics. Adding <code>?group_by=month</code> will return monthly stats, while <code>?group_by=day</code> will return daily numbers. Traffic is being displayed in bytes.</p>
<p>his query will return all time statistics. You can find your daily and monthly usage by adding either <code>?group_by=day</code> or <code>?group_by=month</code>. Traffic is being displayed in bytes.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/stats'
</pre>
<p>Sample output:</p>
<pre>{
    "meta": {
        "group_by": null,
        "date_from": null,
        "date_to": null,
        "source": null
    },
    "data": {
        "sources": [
            {
                "results_count_all": "1482",
                "results_count": "0",
                "realtime_results_count": "0",
                "super_api_results_count": "12777",
                "render": "0",
                "geo_location": "0",
                "average_response_time": 2.18,
                "request_traffic": "6629", 
                "response_traffic": "17850",
                "title": "universal"
            }
        ]
    }
}
</pre>
<hr />
<h2 id="sample-response">Sample Response</h2>
<p>This is what the response looks like. To see headers and cookies, Verbose mode must be enabled.</p>
<pre>HTTP/1.1 200 OK
X-Job-Id: 1234567890123456
X-Session-Id: 123randomString
cf-cache-status: DYNAMIC
cf-ray: 55c2ab837eddcba8-VIE
content-encoding: gzip
content-length: 72657
content-type: text/html
date: Tue, 1 Jan 2020 00:00:01 GMT,expect-ct: max-age=604800,report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
last-modified: Tue, 1 Dec 2020 00:00:00 GMT
server: cloudflare
status: 200
strict-transport-security: max-age=31536000
X-DNS-Prefetch-Control: off
Set-Cookie: NID=1234567890; expires=Wed, 29-Jul-2020 10:56:21 GMT
Set-Cookie: 1P_JAR=0987654321; expires=Wed, 29-Jul-2020 10:56:21 GMT
x-cache: MISS from localhost
x-cache-lookup: MISS from localhost:3129content here
</pre>
<p>&nbsp;</p>
<hr />
<h4>References</h4>
<p><a href="https://docs.oxylabs.io/next-gen-residential-proxies/index.html#quick-start" target="_blank" rel="nofollow noopener">https://docs.oxylabs.io/next-gen-residential-proxies/index.html#quick-start</a></p>
<hr />
<blockquote><p><strong>Disclaimer:</strong> This part of the content is mainly from the merchant. If the merchant does not want it to be displayed on my website, please <a href="https://www.proxysp.com/contact-us/">contact us</a> to delete your content.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://proxysp.com/oxylabs-next-gen-residential-proxies/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7622</post-id>	</item>
		<item>
		<title>How to Use OxyLabs Real-Time Crawler [Part 1]: Real-Time Crawler for Google</title>
		<link>https://proxysp.com/oxylabs-real-time-crawler/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oxylabs-real-time-crawler</link>
					<comments>https://proxysp.com/oxylabs-real-time-crawler/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
				<category><![CDATA[How to Use OxyLabs Proxy (OxyLabs User Manual Navigation)]]></category>
		<guid isPermaLink="false">https://www.proxysp.com/?p=7623</guid>

					<description><![CDATA[Do you know how to use OxyLabs Real-time Crawler for Google? This is the most comprehensive introduction from OxyLabs official. Quick Start Real-Time Crawler is built &#8230;<p class="read-more"> <a class="ast-button" href="https://proxysp.com/oxylabs-real-time-crawler/"> <span class="screen-reader-text">How to Use OxyLabs Real-Time Crawler [Part 1]: Real-Time Crawler for Google</span> Read More &#187;</a></p>]]></description>
										<content:encoded><![CDATA[<blockquote>
<p class="src grammarSection" data-group="1-1">Do you know how to use OxyLabs Real-time Crawler for Google? This is the most comprehensive introduction from OxyLabs official.</p>
</blockquote>
<h2 id="quick-start">Quick Start</h2>
<p>Real-Time Crawler is built for heavy-duty data retrieval operations. You can use Real-Time Crawler to access various Google pages, including regular search, hotel availability and Google Shopping. It enables effortless web data extraction from search engines without any delays or errors.</p>
<p>Real-Time Crawler for Google uses <a class="custom_link" href="https://en.wikipedia.org/wiki/Basic_access_authentication" target="_blank" rel="nofollow noopener">basic HTTP authentication</a> that requires sending username and password.</p>
<p>This is by far the fastest way to start using Real-Time Crawler for Google. You will send a query <code>adidas</code> to <code>google_search</code> using <a href="#realtime">Realtime</a> integration method. Don't forget to replace <code>USERNAME</code> and <code>PASSWORD</code> with your proxy user credentials.</p>
<pre>curl --user "USERNAME:PASSWORD" 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json" -d '{"source": "google_search", "domain": "com", "query": "adidas"}'
</pre>
<p>If you have any questions not covered by this documentation, please contact your account manager or our support staff at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<hr />
<h2 id="postman">Postman</h2>
<p>Download and import <a class="custom_link" href="https://docs.oxylabs.io/resources/Real-Time%20Crawler%20-%20Google.postman_collection.json" target="_blank" rel="noopener">this Postman collection </a>to try out all of the Google crawler functions and data delivery methods documented on this page.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8201" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Postman.png" alt="Real-Time Crawler for Google Postman" width="296" height="442" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Postman.png 296w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Postman-201x300.png 201w" sizes="(max-width: 296px) 100vw, 296px" /></p>
<hr />
<h2 id="integration-methods">Integration Methods</h2>
<p>Real-Time Crawler for Google supports three integration methods which have their unique benefits:</p>
<ul>
<li><a href="#push-pull">Push-Pull</a>. Using this method it is now required to mainain an active connection with our endpoint to retrieve the data. Upon making a request, our system is able to automatically ping users server when the job is done (see <a href="#callback">Callback</a>). This method saves computing resources and can be scaled easily.</li>
<li><a href="#realtime">Realtime</a>. The method requires user to maintain an active connection with our endpoint in order to get the results successfully when the job is completed. This method can be implemented into one service while Push-Pull method is a two step process.</li>
<li><a href="#superapi">SuperAPI</a>. This method is very similar to Realtime but instead posting data to our endpoint, user can use HTML Cralwer as a proxy. To retrieve the data, user must set up a proxy endpoint and make GET request to a desired URL. Additional parameters must be added using headers.</li>
</ul>
<p>Our recommended data extraction method is <a href="#push-pull">Push-Pull</a>.</p>
<hr />
<h3 id="push-pull">Push-Pull</h3>
<p>This is the most simple yet the most reliable and recommended data delivery method. In Push-Pull scenario you send us a query, we return you job <code>id</code>, and once the job is done you can use that <code>id</code> to retrieve content from <code>/results</code> endpoint. You can check job completion status yourself, or you can set up a simple listener that is able to accept POST queries. This way we will send you a callback message once the job is ready to be retrieved. In this particular example the results will be automatically <a href="#upload-to-storage">uploaded to your S3 bucket</a> named <code>YOUR_BUCKET_NAME</code>.</p>
<p>You can also try and see how Push-Pull method works via Postman. Download <a class="custom_link" href="https://docs.oxylabs.io/resources/Real-Time%20Crawler%20-%20Google.postman_collection.json" target="_blank" rel="noopener">this file</a> to get started.</p>
<hr />
<h4><strong>Single Query</strong></h4>
<p>The following endpoint will handle single queries for one keyword or URL. The API will return a confirmation message containing job information, including job <code>id</code>. You can check job completion status using that <code>id</code>, or you can ask us to ping your callback endpoint once the scraping task is finished by adding <code>callback_url</code> in the query.</p>
<pre>POST https://data.oxylabs.io/v1/queries
</pre>
<p>You need to post query parameters as data in JSON body.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json" 
 -d '{"source": "google_search", "domain": "com", "query": "adidas", "callback_url": "https://your.callback.url", "storage_type": "s3", "storage_url": "YOUR_BUCKET_NAME"}'
</pre>
<p>The API will respond with query information in JSON format, by printing it in response body, similar to this:</p>
<pre>{
  "callback_url": "https://your.callback.url",
  "client_id": 5,
  "context": [
    {
      "key": "results_language",
      "value": null
    },
    {
      "key": "safe_search",
      "value": null
    },
    {
      "key": "tbm",
      "value": null
    },
    {
      "key": "cr",
      "value": null
    },
    {
      "key": "filter",
      "value": null
    }
  ],
  "created_at": "2019-10-01 00:00:01",
  "domain": "com",
  "geo_location": null,
  "id": "12345678900987654321",
  "limit": 10,
  "locale": null,
  "pages": 1,
  "parse": false,
  "render": null,
  "query": "adidas",
  "source": "google_search",
  "start_page": 1,
  "status": "pending",
  "storage_type": "s3",
  "storage_url": "YOUR_BUCKET_NAME/12345678900987654321.json",
  "subdomain": "www",
  "updated_at": "2019-10-01 00:00:01",
  "user_agent_type": "desktop",
  "_links": [
    {
      "rel": "self",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321",
      "method": "GET"
    },
    {
      "rel": "results",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
      "method": "GET"
    }
  ]
}
</pre>
<h4 id="check-job-status"><strong>Check Job Status</strong></h4>
<p>If your query had <code>callback_url</code>, we will send you a message containing link to content once the scraping task is done. However, if there was no <code>callback_url</code> in the query, you will need to check job status yourself. For that you need to use the URL in <code>href</code> under <code>rel</code>:<code>self</code> in the response message you received after submitting your query to our API. It should look similar to this: <code>http://data.oxylabs.io/v1/queries/12345678900987654321</code>.</p>
<pre>GET https://data.oxylabs.io/v1/queries/{id}
</pre>
<p>Querying this link will return job information, including its <code>status</code>. There are 3 possible <code>status</code> values:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<tbody>
<tr>
<td><code>pending</code></td>
<td>The job is still in the queue and has not been completed.</td>
</tr>
<tr>
<td><code>done</code></td>
<td>The job is completed, you may retrieve the result by querying the URL in <code>href</code> under <code>rel</code>:<code>results</code> : <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code></td>
</tr>
<tr>
<td><code>faulted</code></td>
<td>There was an issue with the job and we couldn't complete it, most likely due to a server error on the target site's side.</td>
</tr>
</tbody>
</table>
</div>
<pre>curl --user user:pass1 'http://data.oxylabs.io/v1/queries/12345678900987654321'
</pre>
<p>The API will respond with query information in JSON format, by printing it in response body. Notice that job <code>status</code> has been changed to <code>done</code>. You can now retrieve content by querying <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code>.</p>
<p>You can also see that the task has been <code>updated_at</code> <code>2019-10-01 00:00:15</code> &#8211; the query took 14 seconds to complete.</p>
<pre>{
  "client_id": 5,
  "context": [
    {
      "key": "results_language",
      "value": null
    },
    {
      "key": "safe_search",
      "value": null
    },
    {
      "key": "tbm",
      "value": null
    },
    {
      "key": "cr",
      "value": null
    },
    {
      "key": "filter",
      "value": null
    }
  ],
  "created_at": "2019-10-01 00:00:01",
  "domain": "com",
  "geo_location": null,
  "id": "12345678900987654321",
  "limit": 10,
  "locale": null,
  "pages": 1,
  "parse": false,
  "render": null,
  "query": "adidas",
  "source": "google_search",
  "start_page": 1,
  "status": "done",
  "subdomain": "www",
  "updated_at": "2019-10-01 00:00:15",
  "user_agent_type": "desktop",
  "_links": [
    {
      "rel": "self",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321",
      "method": "GET"
    },
    {
      "rel": "results",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
      "method": "GET"
    }
  ]
}
</pre>
<hr />
<h4 id="retrieve-job-content"><strong>Retrieve Job Content</strong></h4>
<p>Once you know the job is ready to retrieved either by checking its status or receiving a callback from us, you can GET it using the URL in <code>href</code> under <code>rel</code>:<code>results</code> in either our initial response or in callback message. It should look similar to this: <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code>.</p>
<pre>GET https://data.oxylabs.io/v1/queries/{id}/results
</pre>
<p>The results can be automatically retrieved without periodically checking job status by setting up <a href="#callback">Callback</a> service. User needs to specfy the IP or domain of the server where the Callback service is running. When our system completes a job, it will send a message to the provided IP or domain and the Callback service will download the results as described in the <a href="#callback">Callback implementation example</a>.</p>
<pre>curl --user user:pass1 'http://data.oxylabs.io/v1/queries/12345678900987654321/results'
</pre>
<p>The API will return job content:</p>
<pre>{
  "results": [
    {
      "content": "&lt;!doctype html&gt;
        CONTENT      
      ",
      "created_at": "2019-10-01 00:00:01",
      "updated_at": "2019-10-01 00:00:15",
      "page": 1,
      "url": "https://www.google.com/search?q=adidas&hl=en&gl=US",
      "job_id": "12345678900987654321",
      "status_code": 200
    }
  ]
}
</pre>
<hr />
<h4 id="callback"><strong>Callback</strong></h4>
<p>A callback is a <code>POST</code> request we send to your machine, informing that the data extraction task is completed and providing URL to download scraped content. This means that you no longer need to <a href="#check-job-status">check job status</a> manually. Once the data is here, we will let you know, and all you need to do now is <a href="#retrieve-job-content">retrieve it</a>.</p>
<pre># Please see code samples in Python and PHP.
</pre>
<p>Sample callback output</p>
<pre>{  
   "created_at":"2019-10-01 00:00:01",
   "updated_at":"2019-10-01 00:00:15",
   "locale":null,
   "client_id":163,
   "user_agent_type":"desktop",
   "source":"google_search",
   "pages":1,
   "subdomain":"www",
   "status":"done",
   "start_page":1,
   "parse":0,
   "render":null,
   "priority":0,
   "ttl":0,
   "origin":"api",
   "persist":true,
   "id":"12345678900987654321",
   "callback_url":"http://your.callback.url/",
   "query":"adidas",
   "domain":"com",
   "limit":10,
   "geo_location":null,
   {...}
   "_links":[
      {  
         "href":"https://data.oxylabs.io/v1/queries/12345678900987654321",
         "method":"GET",
         "rel":"self"
      },
      {  
         "href":"https://data.oxylabs.io/v1/queries/12345678900987654321/results",
         "method":"GET",
         "rel":"results"
      }
   ],
}
</pre>
<hr />
<h4 id="batch-query"><strong>Batch Query</strong></h4>
<p>Real-Time Crawler also supports executing multiple keywords, up to 1,000 keywords with each batch. The following endpoint will submit multiple keywords to the extraction queue.</p>
<pre>POST https://data.oxylabs.io/v1/queries/batch
</pre>
<p>You need to post query parameters as data in JSON body.</p>
<p>The system will handle every keyword as a separate request. If you provided callback URL, you will get a separate call for each keyword. Otherwise, our initial response will contain job <code>id</code>s for all keywords. For example, if you sent 50 keywords, we will return 50 unique job <code>id</code>s.</p>
<p>Important! <code>query</code> is the only parameter that can have multiple values. All other parameters are the same for that batch query.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries/batch' -H 'Content-Type: application/json'
 -d '@keywords.json'
</pre>
<p><code>keywords.json</code> content:</p>
<pre>{  
   "query":[  
      "adidas",
      "nike",
      "reebok"
   ],
   "source": "google_search",
   "domain": "com",
   "callback_url": "https://your.callback.url"
}
</pre>
<p>The API will respond with query information in JSON format, by printing it in response body, similar to this:</p>
<pre>{
  "queries": [
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "12345678900987654321",
      {...}
      "query": "adidas",
      "source": "google_search",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
          "method": "GET"
        }
      ]
    },
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "12345678901234567890",
      {...}
      "query": "nike",
      "source": "google_search",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/12345678901234567890/results",
          "method": "GET"
        }
      ]
    },
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "01234567899876543210",
      {...}
      "query": "reebok",
      "source": "google_search",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/01234567899876543210/results",
          "method": "GET"
        }
      ]
    }
  ]
}
</pre>
<hr />
<h4 id="get-notifier-ip-address-list"><strong>Get Notifier IP Address List</strong></h4>
<p>You may want to whitelist the IPs sending you callback messages or get the list of these IPs for other purposes. This can be done by <code>GET</code>ing this endpoint: <code>https://data.oxylabs.io/v1/info/callbacker_ips</code>.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/info/callbacker_ips'
</pre>
<p>The API will return the list of IPs making callback requests to your system:</p>
<pre>{
    "ips": [
        "x.x.x.x",
        "y.y.y.y"
    ]
}
</pre>
<hr />
<h4 id="upload-to-storage"><strong>Upload to Storage</strong></h4>
<p>By default RTC job results are stored in our databases. This means that you will need to query our results endpoint and retrieve content yourself. Custom storage feature allows you to store results in your own cloud storage. The advantage of this feature is that you don't have to make extra requests in order to fetch results &#8211; everything goes directly to your storage bucket.</p>
<p>We support Amazon S3 and Google Cloud Storage. If you would like to use a different type of storage, please contact your account manager to discuss the feature delivery timeline.</p>
<p id="amazon-s3"><strong>Amazon S3</strong></p>
<p>To get your job results uploaded to your Amazon S3 bucket, please set up access permissions for our service. To do that, go to <code>https://s3.console.aws.amazon.com/ &gt; S3 &gt; Storage &gt; Bucket Name (if don't have one, create new) &gt; Permissions &gt; Bucket Policy</code></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8202" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Upload-to-Storage1.png" alt="Real-Time Crawler for Google Upload to Storage1" width="478" height="324" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Upload-to-Storage1.png 478w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Upload-to-Storage1-300x203.png 300w" sizes="(max-width: 478px) 100vw, 478px" /></p>
<p>You can find bucket policy in this <a class="custom_link" href="https://docs.oxylabs.io/resources/s3_bucket_policy.json" target="_blank" rel="noopener">JSON</a> or in code sample area on the right. Don't forget to change bucket name under <code>YOUR_BUCKET_NAME</code>. This policy allows us to write to your bucket, give access to uploaded files to you, and know bucket location.</p>
<p id="google-cloud-storage"><strong>Google Cloud Storage</strong></p>
<p>To get your job results uploaded to your Google Cloud Storage bucket, please set up special permissions for our service. To do that, please create a custom role with the <code>storage.objects.create</code> permission and assign it to the Oxylabs service account email <code>oxyserps-storage@oxyserps-storage.iam.gserviceaccount.com</code>.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8203" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Upload-to-Storage2.png" alt="Real-Time Crawler for Google Upload to Storage2" width="480" height="305" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Upload-to-Storage2.png 480w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Upload-to-Storage2-300x191.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8204" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Upload-to-Storage3.png" alt="Real-Time Crawler for Google Upload to Storage3" width="483" height="667" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Upload-to-Storage3.png 483w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Upload-to-Storage3-217x300.png 217w" sizes="(max-width: 483px) 100vw, 483px" /></p>
<p id="usage"><strong>Usage</strong></p>
<p>To use this feature, please specify two additional parameters in your requests. Learn more <a href="#direct">here</a>.</p>
<p>The upload path looks like this: <code>YOUR_BUCKET_NAME/job_ID.json</code>. You will find job ID in response body that you receive from us after submitting a request. In <a href="#single-query">this example</a> job ID is <code>12345678900987654321</code>.</p>
<pre>{
    "Version": "2012-10-17",
    "Id": "Policy1577442634787",
    "Statement": [
        {
            "Sid": "Stmt1577442633719",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::324311890426:user/oxylabs.s3.uploader"
            },
            "Action": "s3:GetBucketLocation",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME"
        },
        {
            "Sid": "Stmt1577442633719",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::324311890426:user/oxylabs.s3.uploader"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
        }
    ]
}
</pre>
<hr />
<h3 id="realtime">Realtime</h3>
<p>The data submission is the same as in Push-Pull method, but Realtime case we will return the content on open connection. You send us a query, the connection remains open, we retrieve the content and bring it to you. The endpoint that handles that is this:</p>
<pre>POST https://realtime.oxylabs.io/v1/queries
</pre>
<p>There is a timeout limit of 150 seconds for open connections, therefore in rare cases of heavy load we may not be able to ensure the data gets to you.</p>
<p>You need to post query parameters as data in JSON body. Please see example for more details.</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json" 
 -d '{"source": "google_search", "domain": "com", "query": "adidas"}'
</pre>
<p>Example response body that will be returned on open connection:</p>
<pre>{
  "results": [
    {
      "content": "
      CONTENT
      "
      "created_at": "2019-10-01 00:00:01",
      "updated_at": "2019-10-01 00:00:15",
      "id": null,
      "page": 1,
      "url": "https://www.google.com/search?q=adidas&hl=en&gl=US",
      "job_id": "12345678900987654321",
      "status_code": 200
    }
  ]
}
</pre>
<hr />
<h3 id="superapi">SuperAPI</h3>
<p>If you ever used regular proxies for data scraping, integrating SuperAPI delivery method will be a breeze. All that needs to be done is to use our entry node as proxy, authorize with Real-Time Crawler credentials, and ignore certificates. In <code>cURL</code> it's <code>-k</code> or <code>--insecure</code>. Your data will reach you on open connection.</p>
<pre>GET realtime.oxylabs.io:60000
</pre>
<p>SuperAPI only supports a handful of parameters since it <strong>only works with a <a href="#direct">Direct</a> data source</strong> where full URL is provided. These parameters should be sent as headers. This is a list of accepted parameters:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<tbody>
<tr>
<td><code>X-OxySERPs-User-Agent-Type</code></td>
<td>There is no way to indicate a specific User-Agent, but you can let us know which browser and platform to use. A list of supported User-Agents can be found <a href="#user-agent">here</a>.</td>
</tr>
<tr>
<td><code>X-OxySERPs-Geo-Location</code></td>
<td>In some cases you may need to indicate the geographical location that the result should be adapted for. This parameter corresponds to the <code>geo_location</code>. Read about our suggested <code>geo_location</code> parameter structures <a href="#geo_location">here</a>.</td>
</tr>
</tbody>
</table>
</div>
<p>If you need help setting up SuperAPI, drop a line at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<pre>curl -k -x realtime.oxylabs.io:60000 -U user:pass1 -H "X-OxySERPs-User-Agent-Type: desktop_chrome" -H "X-OxySERPs-Geo-Location: New York,New York,United States" "https://www.google.com/search?q=adidas"
</pre>
<hr />
<h2 id="content-type">Content Type</h2>
<p>Real-Time Crawler can return either <strong>raw HTML</strong>, or <strong>structured (parsed) JSON</strong>. Bear in mind that not all data sources can be returned structured. An icon under each data source in this documentation will indicate whether we are able to parse it, or we can only return raw HTML.</p>
<p>Please see <a href="#parsed-data">Parsed Data</a> to see which fields we return with each Data Source.</p>
<hr />
<h2 id="data-sources">Data Sources</h2>
<p>There are multiple approaches how to retrieve data from Google using Real-Time Crawler. You can give us full URL via <a href="#direct">Direct</a>, or you can specify parameters via specifically built data sources, such as <a href="#search">Search</a>, <a href="#shopping-product">Shopping Product</a> or <a href="#images">Images</a>.</p>
<p>Technically not a content type, but Real-Time Crawler is able to render JavaScript when scraping. This is necessary in some Google pages, such as Flights and Patents. A checkmark under <code>Render JS</code> will indicate whether a particular data source can be scraped with JavaScript enabled.</p>
<p>If you are unsure which way to choose, drop us a line at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a> or contact your account manager.</p>
<hr />
<h3 id="direct">Direct</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8206 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Direct-1.png" alt="Real-Time Crawler for Google Direct" width="473" height="19" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Direct-1.png 473w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Direct-1-300x12.png 300w" sizes="(max-width: 473px) 100vw, 473px" /></p>
<p><code>google</code> source is designed to retrieve content of direct URLs of various Google pages. This means that instead of sending multiple parameters, you can provide us with a direct URL to required Google page. We do not strip any parameters or alter your URLs in any other way.</p>
<p>This data source also supports parsed data (Parsed JSON), as long as the URL submitted is for Google Search (SERP page). If we are unable to confirm this is a SERP page request, a failure message will be returned.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">google</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">url</td>
<td style="font-weight: 400;" width="72">Direct URL (link) to Google page</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found<a href="#user-agent"> here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">render</td>
<td style="font-weight: 400;" width="72">Enable JavaScript rendering. Use when the target requires JavaScript to load content. Only works via Push-Pull (a.k.a. Callback) method. There are two available values for this parameter: html(get raw output) and png (get a Base64-encoded screenshot).</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">The geographical location that the result should be adapted for. Using this parameter correctly is extremely important to get the right data. For more information, read about our suggested geo_location parameter structures <a href="#geo_location">here</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">parse</td>
<td style="font-weight: 400;" width="72">true will return parsed data, as long as the URL submitted is for Google Search. See <a href="#parsed-data">Parsed Data </a>for more information.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the <a href="#upload-to-storage">Upload to Storage </a>page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>In this example the API will retrieve Google Scholar search for keyword <code>newton</code> in Push-Pull method:</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google", "url": "https://scholar.google.com/scholar?hl=en&q=newton&btnG=&as_sdt=1%2C5&as_sdtp="}'
</pre>
<p>Here is the same example in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google", "url": "https://scholar.google.com/scholar?hl=en&q=newton&btnG=&as_sdt=1%2C5&as_sdtp="}'
</pre>
<p>And via SuperAPI:</p>
<pre>curl -k -x realtime.oxylabs.io:60000 -U user:pass1 "https://scholar.google.com/scholar?hl=en&q=newton&btnG=&as_sdt=1%2C5&as_sdtp="
</pre>
<hr />
<h3 id="search">Search</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8207 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Search.png" alt="Real-Time Crawler for Google Search" width="561" height="24" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Search.png 561w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Search-300x13.png 300w" sizes="(max-width: 561px) 100vw, 561px" /></p>
<p><code>google_search</code> source is designed to retrieve Google Search results (SERP).</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">google_search</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">domain</td>
<td style="font-weight: 400;" width="72">Domain localization</td>
<td style="font-weight: 400;" width="72">com</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">query</td>
<td style="font-weight: 400;" width="72">UTF-encoded keyword</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">start_page</td>
<td style="font-weight: 400;" width="72">Starting page number</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">pages</td>
<td style="font-weight: 400;" width="72">Number of pages to retrieve</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">limit</td>
<td style="font-weight: 400;" width="72">Number of results to retrieve in each page</td>
<td style="font-weight: 400;" width="72">10</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">locale</td>
<td style="font-weight: 400;" width="72">Accept-Language header value. This will change Google search page web interface language (not results). For example if you use domain com and use locale parameter de-DE, the results will still be American, but Accept-Language will be set to de-DE,de;q=0.8. This would imitate person from US searching in com domain, who has his browser's UI set to German. If you don't use this parameter we will set &#8216;Accept-Language' parameter according to domain (i.e. en-US for com). List of available Google locales can be found <a href="#locale">here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">The geographical location that the result should be adapted for. Using this parameter correctly is extremely important to get the right data. For more information, read about our suggested geo_location parameter structures <a href="#geo_location">here</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found<a href="#user-agent"> here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">render</td>
<td style="font-weight: 400;" width="72">Enable JavaScript rendering. Use when the target requires JavaScript to load content. Only works via Push-Pull (a.k.a. Callback) method. There are two available values for this parameter: html(get raw output) and png (get a Base64-encoded screenshot).</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">parse</td>
<td style="font-weight: 400;" width="72">true will return parsed data. See <a href="#parsed-data">Parsed Data </a>for more information.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">parser_type</td>
<td style="font-weight: 400;" width="72">Leave blank to get the default layout, or set the value to v2 to make use of the updated Google Search parsed output schema and/or receive the result in CSV format (only works with Google Web Search). See<a href="#parsed-data"> Parsed Data </a>for more information.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Setting the fpstate value to aig will make Google load more apps. This parameter is only useful if used together with the render parameter.</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">fpstate</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">true will turn off spelling auto-correction.</td>
<td style="font-weight: 400;" rowspan="2" width="72">FALSE</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">nfpr</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Results language. List of supported Google languages can be found<a href="#results-language"> here.</a></td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">results_language</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">To-be-matched or tbm parameter. Accepted values are: app, blg, bks, dsc, isch, nws, pts, plcs, rcp, lcl</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">tbm</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">tbs parameter. This parameter is like a container for more obscure google parameters, like limiting/sorting results by date as well as other filters some of which depend on the tbm parameter (e.g. tbs=app_os:1 is only available with tbm value app). More info<a href="https://stenevang.wordpress.com/2013/02/22/google-advanced-power-search-url-request-parameters/" target="_blank" rel="noopener"> here.</a></td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">tbs</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the  <a class="custom_link" href="https://docs.oxylabs.io/rtc/source/google/index.html?shell#upload-to-storage" target="_blank" rel="noopener">Upload to Storage</a>  page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>API makes request to <code>google.nl</code> to retrieve search results pages from number 11 to number 20 for keyword <code>adidas</code>. The results will be displayed in French, since <code>results_language</code> parameter is also passed through via <code>context</code>. The API will post a JSON request to <code>your.callback.url</code> containing the URL to download the raw HTML output once the data retrieval task is successfully finished. This is Push-Pull:</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_search", "domain": "nl", "query": "adidas", "start_page": 11, "pages": 10, "callback_url": "https://your.callback.url", "context": [{"key": "results_language", "value": "fr"}]}}'
</pre>
<p>And here is the same example in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_search", "domain": "nl", "query": "adidas", "start_page": 11, "pages": 10, "callback_url": "https://your.callback.url", "context": [{"key": "results_language", "value": "fr"}]}}'
</pre>
<hr />
<h3 id="ads">Ads</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8210 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Ads.png" alt="Real-Time Crawler for Google Ads" width="472" height="26" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Ads.png 472w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Ads-300x17.png 300w" sizes="(max-width: 472px) 100vw, 472px" /></p>
<p><code>google_ads</code> source is optimized to retrieve Google Search results page (SERP) with paid ads. This source will return only 10 results per page, ensuring highest changes of paid results showing up. Other than that, it supports the same parameters as regular <a href="#search">Search</a></p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">google_ads</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">domain</td>
<td style="font-weight: 400;" width="72">Domain localization</td>
<td style="font-weight: 400;" width="72">com</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">query</td>
<td style="font-weight: 400;" width="72">UTF-encoded keyword</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">start_page</td>
<td style="font-weight: 400;" width="72">Starting page number</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">pages</td>
<td style="font-weight: 400;" width="72">Number of pages to retrieve</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">locale</td>
<td style="font-weight: 400;" width="72">Accept-Language header value. This will change Google search page web interface language (not results). For example if you use domain com and use locale parameter de-DE, the results will still be American, but Accept-Language will be set to de-DE,de;q=0.8. This would imitate person from US searching in com domain, who has his browser's UI set to German. If you don't use this parameter we will set &#8216;Accept-Language' parameter according to domain (i.e. en-US for com). List of available Google locales can be found<a href="#locale"> here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">The geographical location that the result should be adapted for. Using this parameter correctly is extremely important to get the right data. For more information, read about our suggested geo_location parameter structures<a href="#geo_location"> here</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found<a href="#user-agent"> here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">parse</td>
<td style="font-weight: 400;" width="72">true will return parsed data. See <a href="#parsed-data">Parsed Data</a> for more information.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">true will turn off spelling auto-correction.</td>
<td style="font-weight: 400;" rowspan="2" width="72">FALSE</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">nfpr</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Results language. List of supported Google languages can be found <a href="#results-language">here.</a></td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">results_language</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">To-be-matched or tbm parameter. Accepted values are: app, blg, bks, dsc, isch, nws, pts, plcs, rcp, lcl</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">tbm</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">tbs parameter. This parameter is like a container for more obscure google parameters, like limiting/sorting results by date as well as other filters some of which depend on the tbm parameter (e.g. tbs=app_os:1 is only available with tbm value app). More info<a href="https://stenevang.wordpress.com/2013/02/22/google-advanced-power-search-url-request-parameters/" target="_blank" rel="nofollow noopener"> here.</a></td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">tbs</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the <a href="#upload-to-storage">Upload to Storage </a>page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>API makes request to <code>google.nl</code> to retrieve search results for keyword <code>adidas</code>. The API will post a JSON request to <code>your.callback.url</code> containing the URL to download the raw HTML output once the data retrieval task is successfully finished. This is Push-Pull:</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_ads", "domain": "nl", "query": "adidas", "callback_url": "https://your.callback.url"}'
</pre>
<p>And here is the same example in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_ads", "domain": "nl", "query": "adidas"}'
</pre>
<hr />
<h3 id="hotels">Hotels</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8211 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Hotels.png" alt="Real-Time Crawler for Google Hotels" width="480" height="24" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Hotels.png 480w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Hotels-300x15.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></p>
<p><code>google_hotels</code> data source is designed to retrieve Google Hotel search results.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">google_hotels</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">domain</td>
<td style="font-weight: 400;" width="72">Domain localization</td>
<td style="font-weight: 400;" width="72">com</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">query</td>
<td style="font-weight: 400;" width="72">UTF-encoded keyword</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">start_page</td>
<td style="font-weight: 400;" width="72">Starting page number</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">pages</td>
<td style="font-weight: 400;" width="72">Number of pages to retrieve</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">limit</td>
<td style="font-weight: 400;" width="72">Number of results to retrieve in each page</td>
<td style="font-weight: 400;" width="72">10</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">locale</td>
<td style="font-weight: 400;" width="72">Accept-Language header value. This will change Google search page web interface language (not results). For example if you use domain com and use locale parameter de-DE, the results will still be American, but Accept-Language will be set to de-DE,de;q=0.8. This would imitate person from US searching in com domain, who has his browser's UI set to German. If you don't use this parameter we will set &#8216;Accept-Language' parameter according to domain (i.e. en-US for com). List of available Google locales can be found <a href="#locale">here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">results_language</td>
<td style="font-weight: 400;" width="72">Results language. List of supported Google languages can be found <a href="#results-language">here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">The geographical location that the result should be adapted for. Using this parameter correctly is extremely important to get the right data. For more information, read about our suggested geo_location parameter structures <a href="#geo_location">here</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found <a href="#user-agent">here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">render</td>
<td style="font-weight: 400;" width="72">Enable JavaScript rendering. Use when the target requires JavaScript to load content. Only works via Push-Pull (a.k.a. Callback) method. There are two available values for this parameter: html(get raw output) and png (get a Base64-encoded screenshot).</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">true will turn off spelling auto-correction.</td>
<td style="font-weight: 400;" rowspan="2" width="72">FALSE</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">nfpr</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Number of guests</td>
<td style="font-weight: 400;" rowspan="2" width="72">2</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">hotel_occupancy</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Length for staying in the hotel, from &#8211; to. Example: 2017-07-12,2017-07-13</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">hotel_dates</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the <a href="#upload-to-storage">Upload to Storage </a>page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>Please note that with Google hotels you always need to send a keyword with &#8216;hotels' word inside, for example &#8216;hotels in Los Angeles', &#8216;hotels in Paris, France', etc. Both &#8216;hotel' and &#8216;hotels' work. Google also supports local languages, so you can send &#8216;Hotelli Helsingissä' for hotels in Helsinki or &#8216;viešbučiai Vilnius' for hotels in Vilnius.</p>
<p>In this example API will retrieve first 3 pages of hotel availability for <code>1</code> guest between <code>2019-10-01</code> and <code>2019-10-10</code> for <code>hotels in Paris</code> from <code>google.com</code>. This is Push-Pull method.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_hotels", "domain": "com", "pages": 3, "query": "hotels in Paris", "context": [{"key": "hotel_occupancy", "value": 1}, {"key": "hotel_dates", "value": "2019-10-01,2019-10-10"}]}'
</pre>
<p>This is in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_hotels", "domain": "com", "pages": 3, "query": "hotels in Paris", "context": [{"key": "hotel_occupancy", "value": 1}, {"key": "hotel_dates", "value": "2019-10-01,2019-10-10"}]}'
</pre>
<hr />
<h3 id="travel-hotels">Travel: Hotels</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8212 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Travel-Hotels.png" alt="Real-Time Crawler for Google Travel Hotels" width="470" height="20" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Travel-Hotels.png 470w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Travel-Hotels-300x13.png 300w" sizes="(max-width: 470px) 100vw, 470px" /></p>
<p><code>google_travel_hotels</code> data source is designed to retrieve Google Travel service's hotel search results.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">google_travel_hotels</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">domain</td>
<td style="font-weight: 400;" width="72">Domain localization</td>
<td style="font-weight: 400;" width="72">com</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">query</td>
<td style="font-weight: 400;" width="72">UTF-encoded keyword</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">start_page</td>
<td style="font-weight: 400;" width="72">Starting page number</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">locale</td>
<td style="font-weight: 400;" width="72">Accept-Language header value. This will change Google search page web interface language (not results). For example if you use domain com and use locale parameter de-DE, the results will still be American, but Accept-Language will be set to de-DE,de;q=0.8. This would imitate person from US searching in com domain, who has his browser's UI set to German. If you don't use this parameter we will set &#8216;Accept-Language' parameter according to domain (i.e. en-US for com). List of available Google locales can be found <a href="#locale">here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">The geographical location that the result should be adapted for. Using this parameter correctly is extremely important to get the right data. Please note that this source can accept a limited number of geo_location values &#8211; please check <a href="https://docs.oxylabs.io/resources/google_travel_hotels-bad_geo_locations.csv" target="_blank" rel="noopener">this file </a>to see geo_location values that don't yield accurate results.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found <a href="#user-agent">here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">render</td>
<td style="font-weight: 400;" width="72">Enable JavaScript rendering. Use when the target requires JavaScript to load content. Only works via Push-Pull (a.k.a. Callback) method. There are two available values for this parameter: html(get raw output) and png (get a Base64-encoded screenshot). Please note that without JavaScript rendering, Google Travel Hotels will not return any useful content.</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Number of guests</td>
<td style="font-weight: 400;" rowspan="2" width="72">2</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">hotel_occupancy</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Filter results by # of hotel stars. You may specify one or more values between 2 and 5. Example: [3,4]</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">hotel_classes</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Dates for staying at the hotel, from &#8211; to. Example: 2017-07-12,2017-07-13</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">hotel_dates</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. At the moment only Amazon S3 is supported: s3. Full implementation can be found on the <a href="#upload-to-storage">Upload to Storage</a> page.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your Amazon S3 bucket name</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>Please note that with Google hotels you always need to send a keyword with &#8216;hotels' word inside, for example &#8216;hotels in Los Angeles', &#8216;hotels in Paris, France', etc. Both &#8216;hotel' and &#8216;hotels' work. Google also supports local languages, so you can send &#8216;Hotelli Helsingissä' for hotels in Helsinki or &#8216;viešbučiai Vilnius' for hotels in Vilnius.</p>
<p>In this example API will retrieve the 2nd page of results for of hotel availability for <code>2</code> guests between <code>2020-10-01</code> and <code>2020-10-10</code> for <code>hotels in Paris</code> from <code>google.com</code>. The results will be filtered to only show 2 and 4 star hotels. This is Push-Pull method.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_travel_hotels", "domain": "com", "start_page": 2, "query": "hotels in Paris", "callback_url": "https://your.callback.url", "context": [{"key": "hotel_occupancy", "value": 2}, {"key": "hotel_dates", "value": "2020-10-01,2020-10-10"}, {"key": "hotel_classes", "value": [2,4]}]}'
</pre>
<p>This is in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_travel_hotels", "domain": "com", "start_page": 2, "query": "hotels in Paris", "context": [{"key": "hotel_occupancy", "value": 2}, {"key": "hotel_dates", "value": "2020-10-01,2020-10-10"}, {"key": "hotel_classes", "value": [2,4]}]}'
</pre>
<hr />
<h3 id="shopping-search">Shopping Search</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8213 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Search.png" alt="Real-Time Crawler for Google Shopping Search" width="474" height="26" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Search.png 474w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Search-300x16.png 300w" sizes="(max-width: 474px) 100vw, 474px" /></p>
<p><code>google_shopping_search</code> source is designed to retrieve Google Shopping search results.</p>
<pre>POST https://data.oxylabs.io/v1/queries
</pre>
<p>Query parameters</p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">google_shopping_search</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">domain</td>
<td style="font-weight: 400;" width="72">Domain localization</td>
<td style="font-weight: 400;" width="72">com</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">query</td>
<td style="font-weight: 400;" width="72">UTF-encoded keyword</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">start_page</td>
<td style="font-weight: 400;" width="72">Starting page number</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">pages</td>
<td style="font-weight: 400;" width="72">Number of pages to retrieve</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">locale</td>
<td style="font-weight: 400;" width="72">Accept-Language header value. This will change Google search page web interface language (not results). For example if you use domain com and use locale parameter de-DE, the results will still be American, but Accept-Language will be set to de-DE,de;q=0.8. This would imitate person from US searching in com domain, who has his browser's UI set to German. If you don't use this parameter we will set &#8216;Accept-Language' parameter according to domain (i.e. en-US for com). List of available Google locales can be found <a href="#locale">here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">results_language</td>
<td style="font-weight: 400;" width="72">Results language. List of supported Google languages can be found <a href="#results-language">here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">The geographical location that the result should be adapted for. Using this parameter correctly is extremely important to get the right data. For more information, read about our suggested geo_location parameter structures <a href="#geo_location">here</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found <a href="#user-agent">here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">render</td>
<td style="font-weight: 400;" width="72">Enable JavaScript rendering. Use when the target requires JavaScript to load content. Only works via Push-Pull (a.k.a. Callback) method. There are two available values for this parameter: html(get raw output) and png (get a Base64-encoded screenshot).</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">parse</td>
<td style="font-weight: 400;" width="72">true will return <a href="#parsed-data">parsed data</a>. See Parsed Data for more information.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">true will turn off spelling auto-correction.</td>
<td style="font-weight: 400;" rowspan="2" width="72">FALSE</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">nfpr</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Sort product list by given criteria. r applies default Google sorting, rv &#8211; by review score, p &#8211; by price ascending, pd &#8211; by price descending</td>
<td style="font-weight: 400;" rowspan="2" width="72">r</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">sort_by</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Minimum price of products to filter</td>
<td style="font-weight: 400;" rowspan="2" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">min_price</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Maximum price of products to filter</td>
<td style="font-weight: 400;" rowspan="2" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">max_price</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the<a href="#upload-to-storage"> Upload to Storage </a>page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>The API will download first <code>4</code> pages of Google Shopping search for keyword <code>adidas</code>, sorted by descending price and minimum price of $20. This is how it's done in Push-Pull:</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_shopping_search", "domain": "com", "query": "adidas", "pages": 4, "context": [{"key": "sort_by", "value": "pd"}, {"key": "min_price", "value": 20}]}'
</pre>
<p>Here is the same example in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_shopping_search", "domain": "com", "query": "adidas", "pages": 4, "context": [{"key": "sort_by", "value": "pd"}, {"key": "min_price", "value": 20}]}'
</pre>
<hr />
<h3 id="shopping-product">Shopping Product</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8214 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Product.png" alt="Real-Time Crawler for Google Shopping Product" width="467" height="26" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Product.png 467w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Product-300x17.png 300w" sizes="(max-width: 467px) 100vw, 467px" /></p>
<p><code>google_shopping_product</code> source is designed to retrieve Google Shopping product page for specified product.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">google_shopping_product</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">domain</td>
<td style="font-weight: 400;" width="72">Domain localization</td>
<td style="font-weight: 400;" width="72">com</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">query</td>
<td style="font-weight: 400;" width="72">UTF-encoded product code</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">start_page</td>
<td style="font-weight: 400;" width="72">Starting page number</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">pages</td>
<td style="font-weight: 400;" width="72">Number of pages to retrieve</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">locale</td>
<td style="font-weight: 400;" width="72">Accept-Language header value. This will change Google search page web interface language (not results). For example if you use domain com and use locale parameter de-DE, the results will still be American, but Accept-Language will be set to de-DE,de;q=0.8. This would imitate person from US searching in com domain, who has his browser's UI set to German. If you don't use this parameter we will set &#8216;Accept-Language' parameter according to domain (i.e. en-US for com). List of available Google locales can be found <a href="#locale">here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">results_language</td>
<td style="font-weight: 400;" width="72">Results language. List of supported Google languages can be found <a href="#results-language">here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">The geographical location that the result should be adapted for. Using this parameter correctly is extremely important to get the right data. For more information, read about our suggested geo_location parameter structures <a href="#geo_location">here</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found <a href="#user-agent">here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">render</td>
<td style="font-weight: 400;" width="72">Enable JavaScript rendering. Use when the target requires JavaScript to load content. Only works via Push-Pull (a.k.a. Callback) method. There are two available values for this parameter: html(get raw output) and png (get a Base64-encoded screenshot).</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">parse</td>
<td style="font-weight: 400;" width="72">true will return parsed data. See <a href="#parsed-data">Parsed Data</a> for more information.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the <a href="#upload-to-storage">Upload to Storage</a> page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>Here the API will download product page for product ID <code>5007040952399054528</code> from Google Shopping on <code>google.com</code>. It will also get first 4 pages with pricing information. This is how it looks in Push-Pull:</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_shopping_product", "domain": "com", "query": "5007040952399054528"}'
</pre>
<p>The same in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_shopping_product", "domain": "com", "query": "5007040952399054528"}'
</pre>
<hr />
<h3 id="shopping-product-pricing">Shopping Product Pricing</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8215 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Product-Pricing.png" alt="Real-Time Crawler for Google Shopping Product Pricing" width="475" height="23" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Product-Pricing.png 475w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Product-Pricing-300x15.png 300w" sizes="(max-width: 475px) 100vw, 475px" /></p>
<p><code>google_shopping_pricing</code> source is designed to retrieve Google Shopping product pricing page for specified product.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">google_shopping_pricing</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">domain</td>
<td style="font-weight: 400;" width="72">Domain localization</td>
<td style="font-weight: 400;" width="72">com</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">query</td>
<td style="font-weight: 400;" width="72">UTF-encoded product code</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">start_page</td>
<td style="font-weight: 400;" width="72">Starting page number</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">pages</td>
<td style="font-weight: 400;" width="72">Number of pages to retrieve</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">locale</td>
<td style="font-weight: 400;" width="72">Accept-Language header value. This will change Google search page web interface language (not results). For example if you use domain com and use locale parameter de-DE, the results will still be American, but Accept-Language will be set to de-DE,de;q=0.8. This would imitate person from US searching in com domain, who has his browser's UI set to German. If you don't use this parameter we will set &#8216;Accept-Language' parameter according to domain (i.e. en-US for com). List of available Google locales can be found <a href="#locale">here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">results_language</td>
<td style="font-weight: 400;" width="72">Results language. List of supported Google languages can be found <a href="#results-language">here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">The geographical location that the result should be adapted for. Using this parameter correctly is extremely important to get the right data. For more information, read about our suggested geo_location parameter structures <a href="#geo_location">here</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found <a href="#user-agent">here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">render</td>
<td style="font-weight: 400;" width="72">Enable JavaScript rendering. Use when the target requires JavaScript to load content. Only works via Push-Pull (a.k.a. Callback) method. There are two available values for this parameter: html(get raw output) and png (get a Base64-encoded screenshot).</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">parse</td>
<td style="font-weight: 400;" width="72">true will return parsed data. See <a href="#parsed-data">Parsed Data</a> for more information.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the<a href="#upload-to-storage"> Upload to Storage</a> page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>Here the API will download product pricing page for product ID <code>5007040952399054528</code> from Google Shopping on <code>google.com</code>. Here is an example in Push-Pull:</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_shopping_pricing", "domain": "com", "query": "5007040952399054528"}'
</pre>
<p>The same in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_shopping_pricing", "domain": "com", "query": "5007040952399054528"}'
</pre>
<hr />
<h3 id="images">Images</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8216 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Images.png" alt="Real-Time Crawler for Google Images" width="477" height="27" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Images.png 477w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Images-300x17.png 300w" sizes="(max-width: 477px) 100vw, 477px" /></p>
<p><code>google_images</code> source is designed to retrieve Images search page for images that are similar to the one provided with <code>query</code> parameter, as well as websites containing those images.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">google_images</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">domain</td>
<td style="font-weight: 400;" width="72">Domain localization</td>
<td style="font-weight: 400;" width="72">com</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">query</td>
<td style="font-weight: 400;" width="72">URL to image</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">start_page</td>
<td style="font-weight: 400;" width="72">Starting page number</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">pages</td>
<td style="font-weight: 400;" width="72">Number of pages to retrieve</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">locale</td>
<td style="font-weight: 400;" width="72">Accept-Language header value. This will change Google search page web interface language (not results). For example if you use domain com and use locale parameter de-DE, the results will still be American, but Accept-Language will be set to de-DE,de;q=0.8. This would imitate person from US searching in com domain, who has his browser's UI set to German. If you don't use this parameter we will set &#8216;Accept-Language' parameter according to domain (i.e. en-US for com). List of available Google locales can be found <a href="#locale">here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">The geographical location that the result should be adapted for. Using this parameter correctly is extremely important to get the right data. For more information, read about our suggested geo_location parameter structures <a href="#geo_location">here</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found <a href="#user-agent">here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">render</td>
<td style="font-weight: 400;" width="72">Enable JavaScript rendering. Use when the target requires JavaScript to load content. Only works via Push-Pull (a.k.a. Callback) method. There are two available values for this parameter: html(get raw output) and png (get a Base64-encoded screenshot).</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">true will turn off spelling auto-correction.</td>
<td style="font-weight: 400;" rowspan="2" width="72">FALSE</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">nfpr</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Results language. List of supported Google languages can be found <a href="#results-language">here.</a></td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">results_language</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the <a href="#upload-to-storage">Upload to Storage</a> page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>In this example the API will download Image search page of similar images for image <code>https://newsneakernews-wpengine.netdna-ssl.com/wp-content/uploads/2017/03/adidas-boost-march-25-2017.jpg</code> from <code>google.com</code>. This is Push-Pull method:</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_images", "domain": "com", "query": "https://newsneakernews-wpengine.netdna-ssl.com/wp-content/uploads/2017/03/adidas-boost-march-25-2017.jpg"}'
</pre>
<p>And this is the same request in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_images", "domain": "com", "query": "https://www.example.com/img/image.jpg"}'
</pre>
<hr />
<h3 id="suggestions">Suggestions</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8217 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Suggestions.png" alt="Real-Time Crawler for Google Suggestions" width="476" height="25" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Suggestions.png 476w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Suggestions-300x16.png 300w" sizes="(max-width: 476px) 100vw, 476px" /></p>
<p><code>google_suggest</code> source is designed to retrieve Google keyword suggestions.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">google_suggest</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">query</td>
<td style="font-weight: 400;" width="72">UTF-encoded keyword</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">locale</td>
<td style="font-weight: 400;" width="72">Accept-Language header value. This will change Google search page web interface language (not results). For example if you use domain com and use locale parameter de-DE, the results will still be American, but Accept-Language will be set to de-DE,de;q=0.8. This would imitate person from US searching in com domain, who has his browser's UI set to German. If you don't use this parameter we will set &#8216;Accept-Language' parameter according to domain (i.e. en-US for com). List of available Google locales can be found<a href="#locale"> here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">The geographical location that the result should be adapted for. Using this parameter correctly is extremely important to get the right data. For more information, read about our suggested geo_location parameter structures <a href="#geo_location">here</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found<a href="#user-agent"> here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">render</td>
<td style="font-weight: 400;" width="72">Enable JavaScript rendering. Use when the target requires JavaScript to load content. Only works via Push-Pull (a.k.a. Callback) method. There are two available values for this parameter: html(get raw output) and png (get a Base64-encoded screenshot).</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the<a href="#upload-to-storage"> Upload to Storage</a> page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>API makes request to Google Suggestions page to retrieve suggestions for keyword <code>adidas</code>. The API will post a JSON payload to <code>your.callback.url</code> containing the URL to download the result once the task is finished. Here is an example with Push-Pull:</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_suggest", "query": "adidas", "callback_url": "https://your.callback.url"}'
</pre>
<p>The same request with Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "google_suggest", "query": "adidas"}'
</pre>
<hr />
<h3 id="keyword-data">Keyword Data</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8218 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Keyword-Data.png" alt="Real-Time Crawler for Google Keyword Data" width="472" height="23" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Keyword-Data.png 472w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Keyword-Data-300x15.png 300w" sizes="(max-width: 472px) 100vw, 472px" /></p>
<p><code>google_msv</code> data source will retrieve Google keyword data for specified keywords, as well as suggested keywords (unless passing ideas=False in context). Keywords are passed in query parameter as a string. Keywords are separated by commas. Commas within a keyword are not supported, so a keyword &#8220;Water Bottle 5,0L&#8221; will actually be interpreted as 2 keywords: &#8220;Water Bottle 5&#8221; and &#8220;0L&#8221;. See output example on the right for more details.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">google_msv</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">query</td>
<td style="font-weight: 400;" width="72">UTF-encoded keywords, separated by commas</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">The geographical location that the result should be adapted for. Using this parameter correctly is extremely important to get the right data. For more information, read about our suggested geo_location parameter structures<a href="#geo_location"> here</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Language, for example english or french. No parameter or empty value will return results for all languages.</td>
<td style="font-weight: 400;" rowspan="2" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">language</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">3-symbol currency code</td>
<td style="font-weight: 400;" rowspan="2" width="72">EUR</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">currency</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">If true, returns keyword ideas, false will return only data for requested keywords</td>
<td style="font-weight: 400;" rowspan="2" width="72">TRUE</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">ideas</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">When fetching ideas, will limit the number of idea keywords to retrieve to provided limit rounded up to the nearest multiple of 50 (e.g. 20 -&gt; 50, 123 -&gt; 150). 0 means no limit.</td>
<td style="font-weight: 400;" rowspan="2" width="72">0</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">ideas_limit</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">When fetching ideas, will filter out idea keywords that have a lower average monthly search volume than the provided number. 0 means no filter.</td>
<td style="font-weight: 400;" rowspan="2" width="72">0</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">min_amsv</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">When fetching ideas, will filter out idea keywords that have a higher average monthly search volume than the provided number. 0 means no filter.</td>
<td style="font-weight: 400;" rowspan="2" width="72">0</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">max_amsv</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">When fetching ideas, will filter out idea keywords that do not fall into the provided category. Available categories in .</td>
<td style="font-weight: 400;" rowspan="2" width="72">null</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">category</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the <a href="#upload-to-storage">Upload to Storage</a> page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
In this example API will keyword data for <code>meilleur restaurant</code> and all suggested keywords. Keyword language is <code>french</code>, and geo location is <code>Paris,Ile-de-France,France</code> and currency is <code>EUR</code>.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
-d '{"source": "google_msv", "query": "meilleur restaurant", "geo_location": "Paris,Ile-de-France,France", "context": [{"key": "language", "value": "french"},{"key": "currency", "value": "EUR"}, {"key": "ideas", "value": true}]}'

# OR if you don't want ideas:

curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
-d '{"source": "google_msv", "query": "meilleur restaurant", "geo_location": "Paris,Ile-de-France,France", "context": [{"key": "language", "value": "french"},{"key": "currency", "value": "EUR"}, {"key": "ideas", "value": false}]}'
</pre>
<p>Sample output (historicalSearchVolume entries and ideas entries cut):</p>
<pre>{
    "results": [
    {
        "content":
        {
            "ideas": [
            {
                "cpc": 4.712038,
                "keyword": "meilleur restaurant a paris",
                "currency": "EUR",
                "competition": 0.3385383889238515,
                "averageSearchVolume": 1900,
                "historicalSearchVolume": [
                {
                    "date": "201803",
                    "searchVolume": 1600
                },
                {
                    "date": "201802",
                    "searchVolume": 1900
                }]
            }],
            "seeds": [
            {
                "cpc": 4.05351,
                "keyword": "meilleur restaurant",
                "currency": "EUR",
                "competition": 0.3385341239238515,
                "averageSearchVolume": 2900,
                "historicalSearchVolume": [
                {
                    "date": "201803",
                    "searchVolume": 3600
                },
                {
                    "date": "201802",
                    "searchVolume": 2900
                }]
            }]
        }
    }]
}
</pre>
<hr />
<h2 id="parsed-data">Parsed data</h2>
<p>Google Web Search (SERP) page is the only one that is extensively supported in parsed data delivery. Below you can find which particular SERP page fields we parse. Structure data is available with <a href="#search">Search</a> (all the time) and <a href="#direct">Direct</a> (as long as SERP page URL is submitted).</p>
<p>Google Web Search (<code>"source": "google_search"</code>) supports CSV output. To access it, please include these parameters in your Google Web Search job <code>{"source": "google_search", "parse": true, "parser_type": "v2"}</code>. The result retrieval URL for a CSV job is structured like this: <code>http://data.oxylabs.io/v1/queries/{job_id}/results/normalized?format=csv</code>.</p>
<hr />
<h3 id="search-2">Search</h3>
<h4 id="organic-amp-paid"><strong>Organic & Paid</strong></h4>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8220" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Organic-Paid.png" alt="Real-Time Crawler for Google Organic & Paid" width="603" height="437" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Organic-Paid.png 603w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Organic-Paid-300x217.png 300w" sizes="(max-width: 603px) 100vw, 603px" /></p>
<pre>"results": {
  "paid": [
    {
      "pos": 1,
      "url": "https://www.adidas.com/us",
      "desc": "New York · 10 locations nearby",
      "title": "adidas.com | adidas® Official Site | Official adidas® Online Store‎",
      "url_shown": "www.adidas.com/Official/Site",
      "pos_overall": 1
    }
  ],
  "organic": [
    {
      "pos": 1,
      "url": "https://www.adidas.com/us",
      "desc": "Welcome to adidas Shop for adidas shoes, clothing and view new collections for adidas Originals, running, football, training and much more.",
      "title": "adidas Official Website | adidas US",
      "url_shown": "https://www.adidas.com › ...",
      "pos_overall": 2
    },
    {
      "pos": 2,
      "url": "https://www.mena.adidas.com/",
      "desc": "Browse for adidas shoes, clothing and collections, adidas Originals, Running, Football, Training and more on the official adidas website.",
      "title": "adidas Official Website | adidas",
      "url_shown": "https://www.mena.adidas.com",
      "pos_overall": 6
    },
    {
      "pos": 3,
      "url": "https://www.adidas-group.com/",
      "desc": "adidas AG Supervisory Board announces candidates as shareholder ... adidas celebrates its 70th anniversary and the opening of the Arena building. August 9 ...",
      "title": "adidas - Home",
      "url_shown": "https://www.adidas-group.com",
      "pos_overall": 7
    },
    {
      "pos": 4,
      "url": "https://www.nycgo.com/shopping/the-adidas-store",
      "desc": "You don't so much shop in this flagship Adidas store as you experience it. With an interior modeled on a high school stadium, this four-story Midtown outlet—the  ...",
      "title": "The Adidas Store (Midtown) | NYCgo - NYCgo.com",
      "url_shown": "https://www.nycgo.com › shopping › the-adidas-store",
      "pos_overall": 8
    },
    {
      "pos": 5,
      "url": "https://www.yelp.com/search?find_desc=adidas+store&find_loc=Manhattan%2C+NY",
      "desc": "Reviews on Adidas Store in Manhattan, NY - Adidas, Adidas Originals New York SoHo, adidas Sport Performance, Upper 90 Soccer - Manhattan, Nike Soho, ...",
      "title": "Adidas Store Manhattan, NY - Last Updated August 2019 - Yelp",
      "url_shown": "https://www.yelp.com › search › find_desc=adidas+store",
      "pos_overall": 9
    },
    {
      "pos": 6,
      "url": "https://en.wikipedia.org/wiki/Adidas",
      "desc": "Adidas AG is a multinational corporation, founded and headquartered in Herzogenaurach, Germany, that designs and manufactures shoes, clothing and ...",
      "title": "Adidas - Wikipedia",
      "url_shown": "https://en.wikipedia.org › wiki › Adidas",
      "pos_overall": 10
    }
  ]
</pre>
<hr />
<h4 id="product-listing-ads"><strong>Product Listing Ads</strong></h4>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8221" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Product-Listing-Ads.png" alt="Real-Time Crawler for Google Product Listing Ads" width="605" height="429" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Product-Listing-Ads.png 605w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Product-Listing-Ads-300x213.png 300w" sizes="(max-width: 605px) 100vw, 605px" /></p>
<pre>"pla": [
  {
    "pos": 1,
    "url": "http://www.adidas.com/us/asweego-shoes/F37038.html?cm_mmc=AdieSEM_Feeds-_-GoogleProductAds-_-NA-_-F37038&cm_mmca1=US&cm_mmca2=NA&kpid=F37038&sourceid=543457011",
    "price": "$40.00",
    "title": "adidas Asweego Shoes Black 10.5 - Mens Running Shoes",
    "seller": "adidas",
    "source": ""
  },
  {
    "pos": 2,
    "url": "http://www.adidas.com/us/baseline-shoes/AW4299.html?cm_mmc=AdieSEM_Feeds-_-GoogleProductAds-_-NA-_-AW4299&cm_mmca1=US&cm_mmca2=NA&kpid=AW4299&sourceid=543457011",
    "price": "$50.00",
    "title": "adidas Baseline Shoes White 13K - Originals Shoes",
    "seller": "adidas",
    "source": ""
  },
  ...
  {
    "pos": 29,
    "url": "https://www.zappos.com/product/8466374/color/21766",
    "price": "$79.95",
    "title": "adidas Superstar W Originals Women's Classic Shoes White/Black/White : 9 B - Medium",
    "seller": "Zappos.com",
    "source": ""
  }
]
</pre>
<hr />
<h4 id="top-stories"><strong>Top Stories</strong></h4>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8222" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Top-Stories.png" alt="Real-Time Crawler for Google Top Stories" width="609" height="427" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Top-Stories.png 609w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Top-Stories-300x210.png 300w" sizes="(max-width: 609px) 100vw, 609px" /></p>
<pre>"top_stories": [
  {
    "url": "https://www.cnet.com/news/spacex-starhopper-prototype-takes-giant-leap-for-elon-musk/",
    "source": "Cnet",
    "headline": "SpaceX Starhopper rocket prototype takes giant leap for Elon Musk",
    "timeframe": "13 hours ago"
  },
  {
    "url": "https://electrek.co/2019/08/27/elon-musk-tesla-china-made-model-3-rumor/",
    "source": "Electrek",
    "headline": "Elon Musk is rumored to unveil first China-made Tesla Model 3 at event this \nweek",
    "timeframe": "16 hours ago"
  },
  {
    "url": "https://www.bloomberg.com/news/articles/2019-08-28/musk-to-join-china-ai-summit-despite-trump-ordering-firms-out",
    "source": "Bloomberg",
    "headline": "Elon Musk and Jack Ma Will Debate AI at China Summit",
    "timeframe": "4 hours ago"
  }
]
</pre>
<hr />
<h4 id="featured-snippet"><strong>Featured Snippet</strong></h4>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8223" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Featured-Snippet.png" alt="Real-Time Crawler for Google Featured Snippet" width="612" height="435" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Featured-Snippet.png 612w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Featured-Snippet-300x213.png 300w" sizes="(max-width: 612px) 100vw, 612px" /></p>
<pre>"featured_snippet": [
  {
    "url": "https://en.wikipedia.org/wiki/Contract_for_difference",
    "desc": "In finance, a contract for difference (CFD) is a contract between two parties, typically described as \"buyer\" and \"seller\", stipulating that the seller will pay to the buyer the difference between the current value of an asset and its value at contract time (if the difference is negative, then the buyer pays instead to ...",
    "title": "Contract for difference - Wikipedia",
    "url_shown": "https://en.wikipedia.org › wiki › Contract_for_difference",
    "pos_overall": 1
  }
]
</pre>
<hr />
<h4 id="knowledge-base"><strong>Knowledge Base</strong></h4>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8224" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Knowledge-Base.png" alt="Real-Time Crawler for Google Knowledge Base" width="611" height="430" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Knowledge-Base.png 611w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Knowledge-Base-300x211.png 300w" sizes="(max-width: 611px) 100vw, 611px" /></p>
<pre>"knowledge": {
  "title": "Adidas",
  "factoids": [
    {
      "title": "Stock price",
      "content": "ADDDF (OTCMKTS) $291.81 +2.74 (+0.95%)Aug 23, 4:00 PM EDT - Disclaimer"
    },
    {
      "title": "Founder",
      "content": "Adolf Dassler"
    },
    {
      "title": "Founded",
      "content": "August 18, 1949, Herzogenaurach, Germany"
    },
    {
      "title": "Headquarters",
      "content": "Herzogenaurach, Germany"
    },
    {
      "title": "Subsidiaries",
      "content": "Reebok, Five Ten Footwear, Runtastic, Ashworth, MORE"
    },
    {
      "title": "Website",
      "content": "https://www.adidas.com/us"
    }
  ],
  "subtitle": "Design company",
  "description": "DescriptionAdidas AG is a multinational corporation, founded and headquartered in Herzogenaurach, Germany, that designs and manufactures shoes, clothing and accessories. It is the largest sportswear manufacturer in Europe, and the second largest in the world, after Nike. Wikipedia"
}
</pre>
<hr />
<h4 id="local-pack"><strong>Local Pack</strong></h4>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8225" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Local-Pack.png" alt="Real-Time Crawler for Google Local Pack" width="613" height="434" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Local-Pack.png 613w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Local-Pack-300x212.png 300w" sizes="(max-width: 613px) 100vw, 613px" /></p>
<pre>"local_pack": [
  {
    "links": [
      {
        "href": "https://www.adidas.com/us?utm_source=gmb&utm_medium=organic&utm_campaign=US470198_local",
        "title": "Website"
      },
      {
        "href": "#",
        "title": "Directions"
      }
    ],
    "phone": "",
    "title": "adidas Originals Flagship Store",
    "rating": 0,
    "address": "Open ⋅ Closes 7PM",
    "subtitle": "(212) 966-0954",
    "pos_overall": 3,
    "rating_count": 0
  }
]
</pre>
<hr />
<h4 id="twitter-feed"><strong>Twitter Feed</strong></h4>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8226" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Twitter-Feed.png" alt="Real-Time Crawler for Google Twitter Feed" width="617" height="433" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Twitter-Feed.png 617w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Twitter-Feed-300x211.png 300w" sizes="(max-width: 617px) 100vw, 617px" /></p>
<pre>"twitter": [
  {
    "pos": 1,
    "url": "https://twitter.com/elonmusk",
    "title": "Elon Musk (@elonmusk) · Twitter",
    "tweets": [
      {
        "url": "https://twitter.com/elonmusk/status/1166081488648949760?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Etweet",
        "content": "Starhopper flight currently tracking to 5pm Texas time for 150m / ~500ft hover test",
        "timeframe": "11 hours ago"
      },
      {
        "url": "https://twitter.com/elonmusk/status/1165377786338406400?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Etweet",
        "content": "Looks like @SpaceX Starhopper flight may be as soon as Monday. FAA support is much appreciated!",
        "timeframe": "2 days ago"
      },
      {
        "url": "https://twitter.com/elonmusk/status/1165371975528640512?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Etweet",
        "content": "If you’re a utility or public utilities commission, please consider using the Tesla Megapack. Better for the environment & usually lower cost than fossil fuel peaker plants! www.tesla.com/megapack",
        "timeframe": "2 days ago"
      }
    ],
    "pos_overall": 1
  }
]
</pre>
<hr />
<h4 id="job-listings"><strong>Job Listings</strong></h4>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8227" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Job-Listings.png" alt="Real-Time Crawler for Google Job Listings" width="620" height="432" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Job-Listings.png 620w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Job-Listings-300x209.png 300w" sizes="(max-width: 620px) 100vw, 620px" /></p>
<pre>"jobs": {
  "listings": [
    {
      "title": "SR SOFTWARE DEVELOPER",
      "source": "via LinkedIn",
      "employer": "Jobs @ TheJobNetwork",
      "location": "Tulsa, OK",
      "extra_details": [
        "1 day ago",
        "Full-time"
      ]
    },
    {
      "title": "Autonomous Vehicle Simulation Software Engineer",
      "source": "via Built In Colorado",
      "employer": "Azevtec",
      "location": "United States",
      "extra_details": [
        "17 hours ago",
        "Full-time"
      ]
    },
    {
      "title": "Senior Software Engineer - Oracle Transportation Management",
      "source": "via LinkedIn",
      "employer": "XPO Logistics, Inc.",
      "location": "United States",
      "extra_details": [
        "21 hours ago",
        "Full-time"
      ]
    }
  ],
  "location_header": "Near United States"
}
</pre>
<hr />
<h4 id="carousel"><strong>Carousel</strong></h4>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8229" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Carousel.png" alt="Real-Time Crawler for Google Carousel" width="617" height="437" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Carousel.png 617w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Carousel-300x212.png 300w" sizes="(max-width: 617px) 100vw, 617px" /></p>
<pre>"item_carousel": {
  "items": [
    {
      "title": "Chris Evans",
      "subtitle": "Captain America"
    },
    {
      "title": "Mark Ruffalo",
      "subtitle": "Hulk"
    },
    {
      "title": "Tom Holland",
      "subtitle": "Spider-Man"
    },
    {
      "title": "Stan Lee",
      "subtitle": "Old Man in TV Report, Bus Driver"
    },
    {
      "title": "Chris Pratt",
      "subtitle": "Star-Lord"
    }
  ],
  "title": "The Avengers/Cast"
}
</pre>
<hr />
<h4 id="images-2"><strong>Images</strong></h4>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8230" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Parsed-data-Images.png" alt="Real-Time Crawler for Google Parsed data Images" width="610" height="435" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Parsed-data-Images.png 610w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Parsed-data-Images-300x214.png 300w" sizes="(max-width: 610px) 100vw, 610px" /></p>
<pre>"images": [
  {
    "alt": "Image result for contemporary wall clock",
    "href": "/search?q=contemporary+wall+clock&safe=off&hl=en&gl=US&tbm=isch&source=iu&ictx=1&fir=Qspcw8WiAmXYzM%253A%252C-m-5575uWYilbM%252C_&vet=1&usg=AI4_-kTGLIU9LAzoCJxO8gp7kK322MV8Yg&sa=X&ved=2ahUKEwjFy8rSy7HkAhWkDrkGHck7A24Q9QEwAXoECAkQBg#imgrc=Qspcw8WiAmXYzM:",
    "source": "https://www.allmodern.com/decor-pillows/sb0/wall-clocks-c429917.html"
  },
  {
    "alt": "Image result for contemporary wall clock",
    "href": "/search?q=contemporary+wall+clock&safe=off&hl=en&gl=US&tbm=isch&source=iu&ictx=1&fir=G0pFK8TQ91ls6M%253A%252Cr5nLxZQfxnA3MM%252C_&vet=1&usg=AI4_-kStPZh1tpSdQ5vTAZUIXwW4zThzQg&sa=X&ved=2ahUKEwjFy8rSy7HkAhWkDrkGHck7A24Q9QEwAnoECAkQCQ#imgrc=G0pFK8TQ91ls6M:",
    "source": "https://www.wayfair.com/decor-pillows/cat/modern-wall-clocks-c1869680.html"
  },
  ...
  {
    "alt": "Image result for contemporary wall clock",
    "href": "/search?q=contemporary+wall+clock&safe=off&hl=en&gl=US&tbm=isch&source=iu&ictx=1&fir=o4ZXIngZyr9HAM%253A%252C-m-5575uWYilbM%252C_&vet=1&usg=AI4_-kTIJMWyTs07HFcVKHTfTd6otLL82w&sa=X&ved=2ahUKEwjFy8rSy7HkAhWkDrkGHck7A24Q9QEwCnoECAkQIQ#imgrc=o4ZXIngZyr9HAM:",
    "source": "https://www.allmodern.com/decor-pillows/sb0/wall-clocks-c429917.html"
  }
]
</pre>
<hr />
<h4 id="related-questions"><strong>Related Questions</strong></h4>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8231" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Related-Questions.png" alt="Real-Time Crawler for Google Related Questions" width="625" height="433" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Related-Questions.png 625w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Related-Questions-300x208.png 300w" sizes="(max-width: 625px) 100vw, 625px" /></p>
<pre>"related_questions": [
  {
    "pos": 1,
    "question": "What does Adidas stand for?"
  },
  {
    "pos": 2,
    "question": "Is Adidas German?"
  },
  {
    "pos": 3,
    "question": "Are Jordans Adidas?"
  },
  {
    "pos": 4,
    "question": "What shoe brands does adidas own?"
  }
]
</pre>
<hr />
<h3 id="shopping-search-2">Shopping Search</h3>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8232" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Search2.png" alt="Real-Time Crawler for Google Shopping Search2" width="612" height="398" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Search2.png 612w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Search2-300x195.png 300w" sizes="(max-width: 612px) 100vw, 612px" /></p>
<pre>...
"organic": [
            {
              "pos": 1,
              "url": "/aclk?sa=l&ai=DChcSEwju8fmd84jpAhUPTxgKHQshDIcYABAHGgJsZQ&sig=AOD64_1BTHVcnNzI5775j9xNkILrCU2KYA&ctype=5&q=&ved=0ahUKEwjpr_Sd84jpAhVI2aYKHYn1CeMQvxMI4wQ&adurl=",
              "type": "grid",
              "price": 85,
              "title": "Adidas Women's Swift Run Casual Shoes in White ...",
              "merchant": {
                "url": "/aclk?sa=l&ai=DChcSEwju8fmd84jpAhUPTxgKHQshDIcYABAHGgJsZQ&sig=AOD64_1BTHVcnNzI5775j9xNkILrCU2KYA&ctype=5&q=&ved=0ahUKEwjpr_Sd84jpAhVI2aYKHYn1CeMQg-UECOoE&adurl=",
                "name": "Finish Line"
              },
              "price_str": "$85.00.",
              "pos_overall": 1
            },
            {
              "pos": 2,
              "url": "/shopping/product/4092922174439754197?uule=w+CAIQICIXQ29sb3JhZG8sIFVuaXRlZCBTdGF0ZXM&q=adidas&prds=epd:6096059639745774212,paur:ClkAsKraX5cxKGk1E_r15f66xbFqydL47KoF9cO04jau1Hw_EeaJnz0EV5mb_JEjRlE5_m7N_B5Vg-krR5766rvdESfkczSSBqkGVDV7A5Ts8BlTUCNfpUxgtxIZAFPVH73vXbe47J5qGlzkfYH83D9zVPSv8w,prmr:1&sa=X&ved=0ahUKEwjpr_Sd84jpAhVI2aYKHYn1CeMQvxMI7AQ",
              "type": "grid",
              "price": 139.97,
              "title": "adidas Mens Alphaboost Training Shoes White ...",
              "merchant": {
                "url": "/aclk?sa=l&ai=DChcSEwju8fmd84jpAhUPTxgKHQshDIcYABAEGgJsZQ&sig=AOD64_3S0xuLlA1GOzNxCvYQdpeTLZkRyQ&ctype=5&q=&ved=0ahUKEwjpr_Sd84jpAhVI2aYKHYn1CeMQg-UECPQE&adurl=",
                "name": "Baseball Savings.com"
              },
              "price_str": "$139.97.",
              "pos_overall": 2
            },
...
</pre>
<hr />
<h3 id="shopping-product-2">Shopping Product</h3>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8233" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Product2.png" alt="Real-Time Crawler for Google Shopping Product2" width="611" height="429" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Product2.png 611w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Product2-300x211.png 300w" sizes="(max-width: 611px) 100vw, 611px" /></p>
<pre>...
{
  "type": "Bundle",
  "items": [
    {
      "value": "Console Only",
      "selected": true,
      "available": true,
      "product_id": "5007040952399054528"
    },
    {
      "value": "Splatoon 2 Bundle",
      "available": false,
      "product_id": "6767220879106424425"
    },
    {
      "value": "Super Mario Odyssey Edition",
      "available": false,
      "product_id": "11634753303078094444"
    }
  ]
}
...
</pre>
<hr />
<h3 id="shopping-product-pricing-2">Shopping Product Pricing</h3>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8234" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Product-Pricing2.png" alt="Real-Time Crawler for Google Shopping Product Pricing2" width="614" height="432" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Product-Pricing2.png 614w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Google-Shopping-Product-Pricing2-300x211.png 300w" sizes="(max-width: 614px) 100vw, 614px" /></p>
<pre>"content": {
  "url": "https://www.google.com/shopping/product/5007040952399054528/online",
  "title": "Nintendo Switch with Joy-Con - 32 GB - Gray/Black",
  "rating": 4.5,
  "pricing": [
    {
      "price": 319.99,
      "seller": "Electronic Express",
      "details": "Free shipping",
      "currency": "$",
      "price_tax": 0,
      "price_total": 319.99,
      "seller_link": "/aclk?sa=l&ai=DChcSEwi9t9HqoJ7mAhVCXw0KHdyPBEYYABABGgJxYg&sig=AOD64_2gaL_J1BQ5J5PR-JazDM86N23Nww&adurl=&ctype=5&q=",
      "price_shipping": 0
    },
    {
      "price": 334.99,
      "seller": "ShopZodys",
      "details": "Arrives Dec 9 – 13",
      "currency": "$",
      "price_tax": 27.69,
      "price_total": 412.67,
      "seller_link": "/aclk?sa=l&ai=DChcSEwi9t9HqoJ7mAhVCXw0KHdyPBEYYABADGgJxYg&sig=AOD64_1Rqy4wxKvZXAaoX9FNDBy379EAAA&adurl=&ctype=5&q=",
      "price_shipping": 49.99
    }
</pre>
<hr />
<h2 id="parameter-values">Parameter Values</h2>
<h3 id="user-agent">User-Agent</h3>
<p>Download full list of <code>user_agent_type</code> values in JSON <a class="custom_link" href="https://docs.oxylabs.io/resources/user_agent_type.json" target="_blank" rel="noopener">here</a>.</p>
<pre>[
  {
    "user_agent_type": "desktop",
    "description": "Random desktop browser User-Agent"
  },
  {
    "user_agent_type": "desktop_firefox",
    "description": "Random User-Agent of one of the latest versions of desktop Firefox"
  },
  {
    "user_agent_type": "desktop_chrome",
    "description": "Random User-Agent of one of the latest versions of desktop Chrome"
  },
  {
    "user_agent_type": "desktop_opera",
    "description": "Random User-Agent of one of the latest versions of desktop Opera"
  },
  {
    "user_agent_type": "desktop_edge",
    "description": "Random User-Agent of one of the latest versions of desktop Edge"
  },
  {
    "user_agent_type": "desktop_safari",
    "description": "Random User-Agent of one of the latest versions of desktop Safari"
  },
  {
    "user_agent_type": "mobile",
    "description": "Random mobile browser User-Agent"
  },
  {
    "user_agent_type": "mobile_android",
    "description": "Random User-Agent of one of the latest versions of Android browser"
  },
  {
    "user_agent_type": "mobile_ios",
    "description": "Random User-Agent of one of the latest versions of iPhone browser"
  },
  {
    "user_agent_type": "tablet",
    "description": "Random tablet browser User-Agent"
  },
  {
    "user_agent_type": "tablet_android",
    "description": "Random User-Agent of one of the latest versions of Android tablet"
  },
  {
    "user_agent_type": "tablet_ios",
    "description": "Random User-Agent of one of the latest versions of iPad tablet"
  }
]
</pre>
<hr />
<h3 id="locale">Locale</h3>
<p>Download full list of <code>locale</code> values in JSON <a class="custom_link" href="https://docs.oxylabs.io/resources/locale.json" target="_blank" rel="noopener">here</a>.</p>
<pre>[  
   {  
      "locale":{  
         "en-ai":{  
            "description":"Anguilla - English",
            "domain":"com.ai"
         },
         "es-pr":{  
            "description":"Puerto Rico - Spanish",
            "domain":"com.pr"
         },
         ...
         "en-by":{  
            "description":"Belarus - English",
            "domain":"by"
         },
         "en-in":{  
            "description":"India - English",
            "domain":"co.in"
         }
      }
   }
]
</pre>
<hr />
<h3 id="results-language">Results Language</h3>
<p>Download full list of <code>results_language</code> values in JSON <a class="custom_link" href="https://docs.oxylabs.io/resources/results_language.json" target="_blank" rel="noopener">here</a>.</p>
<pre>[
 {
   "results_language": "af",
   "language": "Afrikaans"
 },
 {
   "results_language": "ar",
   "language": "Arabic"
 },
 ...
 {
   "results_language": "vi",
   "language": "Vietnamese"
 }
]
</pre>
<hr />
<h3 id="geo_location">Geo_location</h3>
<p>There are a few ways you can use the <code>geo_location</code> parameter to get correctly-localized Google results.</p>
<ul>
<li><strong>Using Google’s Canonical Location Name</strong>. This is very straightforward. Just pass us one of the values found on the CSV download <a class="custom_link" href="https://developers.google.com/adwords/api/docs/appendix/geotargeting" target="_blank" rel="nofollow noopener">here</a>. Example: <code>“geo_location”: “New York,New York,United States”</code>.</li>
<li><strong>Using a state name</strong>. Strip the first part of a Google's Canonical Location Name and pass a <code>geo_location</code> value in a <code>“State,Country”</code> format. Works with United States, Australia, India and other countries with federated states. Example: <code>“geo_location”: “California,United States”</code>.</li>
<li><strong>Using a country name</strong>. To get results localized for the geographical center point of a country, pass an official country name. Example: <code>“geo_location”: “United Kingdom”</code>.</li>
<li><strong>Using coordinates and radius</strong>. To get hyperlocal search results (especially useful for searches such as “restaurants near me”), you can pass latitude, longitude and radius values. The following example passes the coordinates of Space Needle in Seattle, WA: <code>“geo_location”: “lat: 47.6205, lng: -122.3493, rad: 25000”</code>.</li>
</ul>
<p>If you pass a misspelled <code>geo_location</code> parameter, chances are, either us or Google will interpret and correct it for you. Nonetheless, we recommend using the parameter structures outlined above, combined with the <code>locale</code> and <code>domain</code> parameters, to get the most accurate results.</p>
<hr />
<h2 id="account-status">Account Status</h2>
<h3 id="usage-statistics">Usage Statistics</h3>
<p>You can find your usage statistics by querying the following endpoint:</p>
<pre>GET https://data.oxylabs.io/v1/stats
</pre>
<p>By default the API will return all time usage statistics. Adding <code>?group_by=month</code> will return monthly stats, while <code>?group_by=day</code> will return daily numbers.</p>
<p>This query will return all time statistics. You can find your daily and monthly usage by adding either <code>?group_by=day</code> or <code>?group_by=month</code></p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/stats'
</pre>
<p>Sample output:</p>
<pre>{
    "data": {
        "sources": [
            {
                "realtime_results_count": "90",
                "results_count": "10",
                "title": "google_hotels"
            },
            {
                "realtime_results_count": "19",
                "results_count": "87",
                "title": "google_search"
            }
        ]
    },
    "meta": {
        "group_by": null
    }
}
</pre>
<hr />
<h3 id="limits">Limits</h3>
<p>The following endpoint will give your monthly commitment information as well as how much has already been used:</p>
<pre>GET https://data.oxylabs.io/v1/stats/limits
</pre>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/stats/limits'
</pre>
<p>Sample output:</p>
<pre>{
    "monthly_requests_commitment": 4500000,
    "used_requests": 985000
}
</pre>
<hr />
<h2 id="response-codes">Response Codes</h2>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Code</th>
<th>Status</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>204</code></td>
<td>No Content</td>
<td>You are trying to retrieve a job that has not been completed yet.</td>
</tr>
<tr>
<td><code>400</code></td>
<td>Multiple error messages</td>
<td>Bad request structure, could be a misspelled parameter or invalid value. Response body will have more specific error message.</td>
</tr>
<tr>
<td><code>401</code></td>
<td>&#8216;Authorization header not provided' / &#8216;Invalid authorization header' / &#8216;Client not found'</td>
<td>Missing authorization header or incorrect login credentials.</td>
</tr>
<tr>
<td><code>403</code></td>
<td>Forbidden</td>
<td>Your account does not have access to this resource.</td>
</tr>
<tr>
<td><code>404</code></td>
<td>Not Found</td>
<td>Job ID you are looking for is no longer available.</td>
</tr>
<tr>
<td><code>429</code></td>
<td>Too many requests</td>
<td>Exceeded rate limit. Please contact your account manager to increase limits.</td>
</tr>
<tr>
<td><code>500</code></td>
<td>Unknown Error</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>524</code></td>
<td>Timeout</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>612</code></td>
<td>Undefined Internal Error</td>
<td>Something went wrong and we failed the job you submitted. You can try again at no extra cost, as we don't charge you for <code>faulted</code> jobs. If that doesn't work, give us a shout.</td>
</tr>
<tr>
<td><code>613</code></td>
<td>Faulted After Too Many Retries</td>
<td>We tried scraping the job you submitted, but gave up after reaching our retry limit. You can try again at no extra cost, as we don't charge you for <code>faulted</code> jobs. If that doesn't work, give us a shout.</td>
</tr>
</tbody>
</table>
</div>
<p>Parsed data response codes:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Code</th>
<th>Status</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>12000</code></td>
<td>Success</td>
<td>The parsed content returned is full and there should be no missing or broken fields.</td>
</tr>
<tr>
<td><code>12002</code></td>
<td>Failure</td>
<td>We couldn't parse the page entirely. There may be an issue with the target website changing its HTML structure.</td>
</tr>
<tr>
<td><code>12003</code></td>
<td>Not Supported</td>
<td>The web page you asked us to parse is not supported.</td>
</tr>
<tr>
<td><code>12004</code></td>
<td>Partial Success</td>
<td>We were able to parse the majority of the page, but there are a few missing fields.</td>
</tr>
<tr>
<td><code>12005</code></td>
<td>Partial Success</td>
<td>We were able to parse the majority of the page, but there might be some fields with default values because we could not find them in the HTML.</td>
</tr>
<tr>
<td><code>12006</code></td>
<td>Failure</td>
<td>Unexpected error. Let us know you got this response and we'll check what went wrong.</td>
</tr>
<tr>
<td><code>12007</code></td>
<td>Unknown</td>
<td>Unknown parsed data status. The actual result could range anywhere from a complete failure to a total success.</td>
</tr>
<tr>
<td><code>12008</code></td>
<td>Failure</td>
<td>Parsed content is missing.</td>
</tr>
<tr>
<td><code>12009</code></td>
<td>Failure</td>
<td>Product not found. Check the URL you submitted.</td>
</tr>
</tbody>
</table>
</div>
<p>Cloud storage upload response codes:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Code</th>
<th>Status</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>10001</code></td>
<td>Unexpected Exception</td>
<td>Something terribly wrong happened. We probably know about this already and are fixing it. Let us know anyway.</td>
</tr>
<tr>
<td><code>13000</code></td>
<td>Upload Success</td>
<td>All good!</td>
</tr>
<tr>
<td><code>13001</code></td>
<td>Upload Failed</td>
<td>We couldn't upload job results your bucket.</td>
</tr>
<tr>
<td><code>13102</code></td>
<td>No Such Path</td>
<td>We couldn't find a bucket with such name. Please double check.</td>
</tr>
<tr>
<td><code>13103</code></td>
<td>Access Denied</td>
<td>Bucket doesn't have required permissions. To find out how to give us required access, see <a href="#upload-to-storage">here</a>.</td>
</tr>
</tbody>
</table>
</div>
<hr />
<h4>References</h4>
<ul>
<li><a href="https://docs.oxylabs.io/rtc/source/google/index.html" target="_blank" rel="nofollow noopener">https://docs.oxylabs.io/rtc/source/google/index.html</a></li>
<li><a href="https://docs.oxylabs.io/rtc/source/google/index.html" target="_blank" rel="nofollow noopener">https://docs.oxylabs.io/rtc/index.html</a></li>
</ul>
<p>&nbsp;</p>
<hr />
<blockquote><p><strong>Disclaimer:</strong> This part of the content is mainly from the merchant. If the merchant does not want it to be displayed on my website, please <a href="https://www.proxysp.com/contact-us/">contact us</a> to delete your content.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://proxysp.com/oxylabs-real-time-crawler/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7623</post-id>	</item>
		<item>
		<title>How to Use OxyLabs Real-Time Crawler [Part 2]: Real-Time Crawler for Yandex</title>
		<link>https://proxysp.com/oxylabs-yandex-real-time-crawler/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oxylabs-yandex-real-time-crawler</link>
					<comments>https://proxysp.com/oxylabs-yandex-real-time-crawler/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
				<category><![CDATA[How to Use OxyLabs Proxy (OxyLabs User Manual Navigation)]]></category>
		<guid isPermaLink="false">https://www.proxysp.com/?p=7633</guid>

					<description><![CDATA[Do you know how to use OxyLabs Real-time Crawler for Yandex? This is the most comprehensive introduction from OxyLabs official. Quick Start Real-Time Crawler is built &#8230;<p class="read-more"> <a class="ast-button" href="https://proxysp.com/oxylabs-yandex-real-time-crawler/"> <span class="screen-reader-text">How to Use OxyLabs Real-Time Crawler [Part 2]: Real-Time Crawler for Yandex</span> Read More &#187;</a></p>]]></description>
										<content:encoded><![CDATA[<blockquote><p>Do you know how to use OxyLabs Real-time Crawler for Yandex? This is the most comprehensive introduction from OxyLabs official.</p></blockquote>
<h2 id="quick-start">Quick Start</h2>
<p>Real-Time Crawler is built for heavy-duty data retrieval operations. You can use Real-Time Crawler to access various Yandex pages. It enables effortless web data extraction from search engines without any delays or errors.</p>
<p>Real-Time Crawler for Yandex uses <a class="custom_link" href="https://en.wikipedia.org/wiki/Basic_access_authentication" target="_blank" rel="nofollow noopener">basic HTTP authentication</a> that requires sending username and password.</p>
<p>This is by far the fastest way to start using Real-Time Crawler for Yandex. You will send a query <code>adidas</code> to <code>yandex_search</code> using <a href="#realtime">Realtime</a> integration method. Don't forget to replace <code>USERNAME</code> and <code>PASSWORD</code> with your proxy user credentials.</p>
<pre>curl --user "USERNAME:PASSWORD" 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json" -d '{"source": "yandex_search", "domain": "com", "query": "adidas"}'
</pre>
<p>If you have any questions not covered by this documentation, please contact your account manager or our support staff at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<hr />
<h2 id="integration-methods">Integration Methods</h2>
<p>Real-Time Crawler for Yandex supports three integration methods which have their unique benefits:</p>
<ul>
<li><a href="#push-pull">Push-Pull</a>. Using this method it is now required to mainain an active connection with our endpoint to retrieve the data. Upon making a request, our system is able to automatically ping users server when the job is done (see <a href="#callback">Callback</a>). This method saves computing resources and can be scaled easily.</li>
<li><a href="#realtime">Realtime</a>. The method requires user to maintain an active connection with our endpoint in order to get the results successfully when the job is completed. This method can be implemented into one service while Push-Pull method is a two step process.</li>
<li><a href="#superapi">SuperAPI</a>. This method is very similar to Realtime but instead posting data to our endpoint, user can use HTML Cralwer as a proxy. To retrieve the data, user must set up a proxy endpoint and make GET request to a desired URL. Additional parameters must be added using headers.</li>
</ul>
<p>Our recommended data extraction method is <a href="#push-pull">Push-Pull</a>.</p>
<hr />
<h3 id="push-pull">Push-Pull</h3>
<p>This is the most simple yet the most reliable and recommended data delivery method. In Push-Pull scenario you send us a query, we return you job <code>id</code>, and once the job is done you can use that <code>id</code> to retrieve content from <code>/results</code> endpoint. You can check job completion status yourself, or you can set up a simple listener that is able to accept POST queries.</p>
<p>This way we will send you a callback message once the job is ready to be retrieved. In this particular example the results will be automatically <a href="#upload-to-storage">uploaded to your S3 bucket</a> named <code>YOUR_BUCKET_NAME</code>.</p>
<hr />
<h4 id="single-query"><strong>Single Query</strong></h4>
<p>The following endpoint will handle single queries for one keyword or URL. The API will return a confirmation message containing job information, including job <code>id</code>. You can check job completion status using that <code>id</code>, or you can ask us to ping your callback endpoint once the scraping task is finished by adding <code>callback_url</code> in the query.</p>
<pre>POST https://data.oxylabs.io/v1/queries
</pre>
<p>You need to post query parameters as data in JSON body.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json" 
 -d '{"source": "yandex_search", "domain": "com", "query": "adidas", "callback_url": "https://your.callback.url", "storage_type": "s3", "storage_url": "YOUR_BUCKET_NAME"}'
</pre>
<p>The API will respond with query information in JSON format, by printing it in response body, similar to this:</p>
<pre>{
  "callback_url": "https://your.callback.url",
  "client_id": 5,
  "created_at": "2019-10-01 00:00:01",
  "domain": "com",
  "geo_location": null,
  "id": "12345678900987654321",
  "limit": 10,
  "locale": null,
  "pages": 1,
  "parse": false,
  "render": null,
  "query": "adidas",
  "source": "yandex_search",
  "start_page": 1,
  "status": "pending",
  "storage_type": "s3",
  "storage_url": "YOUR_BUCKET_NAME/12345678900987654321.json",
  "subdomain": "www",
  "updated_at": "2019-10-01 00:00:01",
  "user_agent_type": "desktop",
  "_links": [
    {
      "rel": "self",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321",
      "method": "GET"
    },
    {
      "rel": "results",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
      "method": "GET"
    }
  ]
}
</pre>
<hr />
<h4 id="check-job-status"><strong>Check Job Status</strong></h4>
<p>If your query had <code>callback_url</code>, we will send you a message containing link to content once the scraping task is done. However, if there was no <code>callback_url</code> in the query, you will need to check job status yourself. For that you need to use the URL in <code>href</code> under <code>rel</code>:<code>self</code> in the response message you received after submitting your query to our API. It should look similar to this: <code>http://data.oxylabs.io/v1/queries/12345678900987654321</code>.</p>
<pre>GET https://data.oxylabs.io/v1/queries/{id}
</pre>
<p>Querying this link will return job information, including its <code>status</code>. There are 3 possible <code>status</code> values:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<tbody>
<tr>
<td><code>pending</code></td>
<td>The job is still in the queue and has not been completed.</td>
</tr>
<tr>
<td><code>done</code></td>
<td>The job is completed, you may retrieve the result by querying the URL in <code>href</code> under <code>rel</code>:<code>results</code> : <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code></td>
</tr>
<tr>
<td><code>faulted</code></td>
<td>There was an issue with the job and we couldn't complete it, most likely due to a server error on the target site's side.</td>
</tr>
</tbody>
</table>
</div>
<pre>curl --user user:pass1 'http://data.oxylabs.io/v1/queries/12345678900987654321'
</pre>
<p>The API will respond with query information in JSON format, by printing it in response body. Notice that job <code>status</code> has been changed to <code>done</code>. You can now retrieve content by querying <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code>.</p>
<p>You can also see that the task has been <code>updated_at</code> <code>2019-10-01 00:00:15</code> &#8211; the query took 14 seconds to complete.</p>
<pre>{
  "client_id": 5,
  "created_at": "2019-10-01 00:00:01",
  "domain": "com",
  "geo_location": null,
  "id": "12345678900987654321",
  "limit": 10,
  "locale": null,
  "pages": 1,
  "parse": false,
  "render": null,
  "query": "adidas",
  "source": "yandex_search",
  "start_page": 1,
  "status": "done",
  "subdomain": "www",
  "updated_at": "2019-10-01 00:00:15",
  "user_agent_type": "desktop",
  "_links": [
    {
      "rel": "self",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321",
      "method": "GET"
    },
    {
      "rel": "results",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
      "method": "GET"
    }
  ]
}
</pre>
<hr />
<h4 id="retrieve-job-content"><strong>Retrieve Job Content</strong></h4>
<p>Once you know the job is ready to retrieved either by checking its status or receiving a callback from us, you can GET it using the URL in <code>href</code> under <code>rel</code>:<code>results</code> in either our initial response or in callback message. It should look similar to this: <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code>.</p>
<pre>GET https://data.oxylabs.io/v1/queries/{id}/results
</pre>
<p>The results can be automatically retrieved without periodically checking job status by setting up <a href="#callback">Callback</a> service. User needs to specfy the IP or domain of the server where the Callback service is running. When our system completes a job, it will send a message to the provided IP or domain and the Callback service will download the results as described in the <a href="#callback">Callback implementation example</a>.</p>
<pre>curl --user user:pass1 'http://data.oxylabs.io/v1/queries/12345678900987654321/results'
</pre>
<p>The API will return job content:</p>
<pre>{
  "results": [
    {
      "content": "&lt;!doctype html&gt;
        CONTENT      
      ",
      "created_at": "2019-10-01 00:00:01",
      "updated_at": "2019-10-01 00:00:15",
      "page": 1,
      "url": "https://www.yandex.com/search?q=adidas&hl=en&gl=US",
      "job_id": "12345678900987654321",
      "status_code": 200
    }
  ]
}
</pre>
<hr />
<h4 id="callback"><strong>Callback</strong></h4>
<p>A callback is a <code>POST</code> request we send to your machine, informing that the data extraction task is completed and providing URL to download scraped content. This means that you no longer need to <a href="#check-job-status">check job status</a> manually. Once the data is here, we will let you know, and all you need to do now is <a href="#retrieve-job-content">retrieve it</a>.</p>
<pre># Please see code samples in Python and PHP.
</pre>
<p>Sample callback output</p>
<pre>{  
   "created_at":"2019-10-01 00:00:01",
   "updated_at":"2019-10-01 00:00:15",
   "locale":null,
   "client_id":163,
   "user_agent_type":"desktop",
   "source":"yandex_search",
   "pages":1,
   "subdomain":"www",
   "status":"done",
   "start_page":1,
   "parse":0,
   "render":null,
   "priority":0,
   "ttl":0,
   "origin":"api",
   "persist":true,
   "id":"12345678900987654321",
   "callback_url":"http://your.callback.url/",
   "query":"adidas",
   "domain":"com",
   "limit":10,
   "geo_location":null,
   {...}
   "_links":[
      {  
         "href":"https://data.oxylabs.io/v1/queries/12345678900987654321",
         "method":"GET",
         "rel":"self"
      },
      {  
         "href":"https://data.oxylabs.io/v1/queries/12345678900987654321/results",
         "method":"GET",
         "rel":"results"
      }
   ],
}
</pre>
<hr />
<h4 id="batch-query"><strong>Batch Query</strong></h4>
<p>Real-Time Crawler also supports executing multiple keywords, up to 1,000 keywords with each batch. The following endpoint will submit multiple keywords to the extraction queue.</p>
<pre>POST https://data.oxylabs.io/v1/queries/batch
</pre>
<p>You need to post query parameters as data in JSON body.</p>
<p>The system will handle every keyword as a separate request. If you provided callback URL, you will get a separate call for each keyword. Otherwise, our initial response will contain job <code>id</code>s for all keywords. For example, if you sent 50 keywords, we will return 50 unique job <code>id</code>s.</p>
<p>Important! <code>query</code> is the only parameter that can have multiple values. All other parameters are the same for that batch query.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries/batch' -H 'Content-Type: application/json'
 -d '@keywords.json'
</pre>
<p><code>keywords.json</code> content:</p>
<pre>{  
   "query":[  
      "adidas",
      "nike",
      "reebok"
   ],
   "source": "yandex_search",
   "domain": "com",
   "callback_url": "https://your.callback.url"
}
</pre>
<p>The API will respond with query information in JSON format, by printing it in response body, similar to this:</p>
<pre>{
  "queries": [
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "12345678900987654321",
      {...}
      "query": "adidas",
      "source": "yandex_search",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
          "method": "GET"
        }
      ]
    },
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "12345678901234567890",
      {...}
      "query": "nike",
      "source": "yandex_search",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/12345678901234567890/results",
          "method": "GET"
        }
      ]
    },
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "01234567899876543210",
      {...}
      "query": "reebok",
      "source": "yandex_search",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/01234567899876543210/results",
          "method": "GET"
        }
      ]
    }
  ]
}
</pre>
<hr />
<h4 id="get-notifier-ip-address-list"><strong>Get Notifier IP Address List</strong></h4>
<p>You may want to whitelist the IPs sending you callback messages or get the list of these IPs for other purposes. This can be done by <code>GET</code>ing this endpoint: <code>https://data.oxylabs.io/v1/info/callbacker_ips</code>.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/info/callbacker_ips'
</pre>
<p>The API will return the list of IPs making callback requests to your system:</p>
<pre>{
    "ips": [
        "x.x.x.x",
        "y.y.y.y"
    ]
}
</pre>
<hr />
<h4 id="upload-to-storage"><strong>Upload to Storage</strong></h4>
<p>By default RTC job results are stored in our databases. This means that you will need to query our results endpoint and retrieve content yourself. Custom storage feature allows you to store results in your own cloud storage. The advantage of this feature is that you don't have to make extra requests in order to fetch results &#8211; everything goes directly to your storage bucket.</p>
<p>We support Amazon S3 and Google Cloud Storage. If you would like to use a different type of storage, please contact your account manager to discuss the feature delivery timeline.</p>
<p id="amazon-s3"><strong>Amazon S3</strong></p>
<p>To get your job results uploaded to your Amazon S3 bucket, please set up access permissions for our service. To do that, go to <code>https://s3.console.aws.amazon.com/ &gt; S3 &gt; Storage &gt; Bucket Name (if don't have one, create new) &gt; Permissions &gt; Bucket Policy</code></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8241" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Upload-to-Storage1.png" alt="Real-Time Crawler for Yandex Upload to Storage1" width="486" height="325" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Upload-to-Storage1.png 486w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Upload-to-Storage1-300x201.png 300w" sizes="(max-width: 486px) 100vw, 486px" /></p>
<p>You can find bucket policy in this <a class="custom_link" href="https://docs.oxylabs.io/resources/s3_bucket_policy.json" target="_blank" rel="noopener">JSON</a> or in code sample area on the right. Don't forget to change bucket name under <code>YOUR_BUCKET_NAME</code>. This policy allows us to write to your bucket, give access to uploaded files to you, and know bucket location.</p>
<p id="google-cloud-storage"><strong>Google Cloud Storage</strong></p>
<p>To get your job results uploaded to your Google Cloud Storage bucket, please set up special permissions for our service. To do that, please create a custom role with the <code>storage.objects.create</code> permission and assign it to the Oxylabs service account email <code>oxyserps-storage@oxyserps-storage.iam.gserviceaccount.com</code>.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8242" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Upload-to-Storage2.png" alt="Real-Time Crawler for Yandex Upload to Storage2" width="480" height="331" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Upload-to-Storage2.png 480w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Upload-to-Storage2-300x207.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8243" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Upload-to-Storage3.png" alt="Real-Time Crawler for Yandex Upload to Storage3" width="481" height="666" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Upload-to-Storage3.png 481w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Upload-to-Storage3-217x300.png 217w" sizes="(max-width: 481px) 100vw, 481px" /></p>
<p id="usage"><strong>Usage</strong></p>
<p>To use this feature, please specify two additional parameters in your requests. Learn more <a href="#direct">here</a>.</p>
<p>The upload path looks like this: <code>YOUR_BUCKET_NAME/job_ID.json</code>. You will find job ID in response body that you receive from us after submitting a request. In <a href="#single-query">this example</a> job ID is <code>12345678900987654321</code>.</p>
<pre>{
    "Version": "2012-10-17",
    "Id": "Policy1577442634787",
    "Statement": [
        {
            "Sid": "Stmt1577442633719",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::324311890426:user/oxylabs.s3.uploader"
            },
            "Action": "s3:GetBucketLocation",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME"
        },
        {
            "Sid": "Stmt1577442633719",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::324311890426:user/oxylabs.s3.uploader"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
        }
    ]
}
</pre>
<hr />
<h3 id="realtime">Realtime</h3>
<p>The data submission is the same as in Push-Pull method, but Realtime case we will return the content on open connection. You send us a query, the connection remains open, we retrieve the content and bring it to you. The endpoint that handles that is this:</p>
<pre>POST https://realtime.oxylabs.io/v1/queries
</pre>
<p>There is a timeout limit of 150 seconds for open connections, therefore in rare cases of heavy load we may not be able to ensure the data gets to you.</p>
<p>You need to post query parameters as data in JSON body. Please see example for more details.</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json" 
 -d '{"source": "yandex_search", "domain": "com", "query": "adidas"}'
</pre>
<p>Example response body that will be returned on open connection:</p>
<pre>{
  "results": [
    {
      "content": "
      CONTENT
      "
      "created_at": "2019-10-01 00:00:01",
      "updated_at": "2019-10-01 00:00:15",
      "id": null,
      "page": 1,
      "url": "https://www.yandex.com/search?q=adidas&hl=en&gl=US",
      "job_id": "12345678900987654321",
      "status_code": 200
    }
  ]
}
</pre>
<hr />
<h3 id="superapi">SuperAPI</h3>
<p>If you ever used regular proxies for data scraping, integrating SuperAPI delivery method will be a breeze. All that needs to be done is to use our entry node as proxy, authorize with Real-Time Crawler credentials, and ignore certificates. In <code>cURL</code> it's <code>-k</code> or <code>--insecure</code>. Your data will reach you on open connection.</p>
<pre>GET realtime.oxylabs.io:60000
</pre>
<p>SuperAPI only supports a handful of parameters since it <strong>only works with <a href="#direct">Direct</a> data source</strong> where full URL is provided. These parameters should be sent as headers. This is a list of accepted parameters:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<tbody>
<tr>
<td><code>X-OxySERPs-User-Agent-Type</code></td>
<td>There is no way to indicate a specific User-Agent, but you can let us know which browser and platform to use. A list of supported User-Agents can be found <a href="#user-agent">here</a>.</td>
</tr>
<tr>
<td><code>X-OxySERPs-Geo-Location</code></td>
<td>Geographical location in Yandex <code>rstr</code> format</td>
</tr>
</tbody>
</table>
</div>
<p>If you need help setting up SuperAPI, drop a line at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<pre>curl -k -x realtime.oxylabs.io:60000 -U user:pass1 -H "X-OxySERPs-User-Agent-Type: desktop_chrome" 
-H "X-OxySERPs-Geo-Location: 15550" "https://yandex.com/search/?text=nike"
</pre>
<hr />
<h2 id="content-type">Content Type</h2>
<p>Real-Time Crawler returns <strong>raw HTML</strong>.</p>
<hr />
<h2 id="data-sources">Data Sources</h2>
<p>There are two approaches on how to retrieve data from Yandex using Real-Time Crawler. You can give us full URL via <a href="#direct">Direct</a>, or you can specify parameters via specifically built data source &#8211; <a href="#search">Search</a>.</p>
<p>Technically not a content type, but Real-Time Crawler is able to render JavaScript when scraping. This may be necessary in some Yandex pages. A checkmark under <code>Render JS</code> will indicate whether a particular data source can be scraped with JavaScript enabled.</p>
<p>If you are unsure which way to choose, drop us a line at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a> or contact your account manager.</p>
<hr />
<h3 id="direct">Direct</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8248 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Direct.png" alt="Real-Time Crawler for Yandex Direct" width="442" height="25" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Direct.png 442w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Direct-300x17.png 300w" sizes="(max-width: 442px) 100vw, 442px" /></p>
<p><code>yandex</code> source is designed to retrieve content of direct URLs of various Yandex pages. This means that instead of sending multiple parameters, you can provide us with a direct URL to required Yandex page. We do not strip any parameters or alter your URLs in any other way.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">yandex</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">url</td>
<td style="font-weight: 400;" width="72">Direct URL (link) to Yandex page</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found <a href="#user-agent">here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">render</td>
<td style="font-weight: 400;" width="72">Enable JavaScript rendering. Use when the target requires JavaScript to load content. Only works via Push-Pull (a.k.a. Callback) method. There are two available values for this parameter: html(get raw output) and png (get a Base64-encoded screenshot).</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the<a href="#upload-to-storage"> Upload to Storage </a>page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>In this example the API will retrieve Yandex search for keyword <code>nike</code> in Push-Pull method:</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "yandex", "url": "https://yandex.com/search/?text=nike&"}'
</pre>
<p>Here is the same example in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "yandex", "url": "https://yandex.com/search/?text=nike&"}'
</pre>
<p>And via SuperAPI:</p>
<pre>curl -k -x realtime.oxylabs.io:60000 -U user:pass1 "https://yandex.com/search/?text=nike&"
</pre>
<hr />
<h3 id="search">Search</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8250 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Search.png" alt="Real-Time Crawler for Yandex Search" width="424" height="27" srcset="https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Search.png 424w, https://proxysp.com/wp-content/uploads/2021/09/Real-Time-Crawler-for-Yandex-Search-300x19.png 300w" sizes="(max-width: 424px) 100vw, 424px" /></p>
<p><code>yandex_search</code> source is designed to retrieve Yandex Search results (SERP).</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">yandex_search</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">domain</td>
<td style="font-weight: 400;" width="72">Domain localization. Available domains: com, ru, ua, by, kz, tr</td>
<td style="font-weight: 400;" width="72">com</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">query</td>
<td style="font-weight: 400;" width="72">UTF-encoded keyword</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">start_page</td>
<td style="font-weight: 400;" width="72">Starting page number</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">pages</td>
<td style="font-weight: 400;" width="72">Number of pages to retrieve</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">limit</td>
<td style="font-weight: 400;" width="72">Number of results to retrieve in each page</td>
<td style="font-weight: 400;" width="72">10</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">locale</td>
<td style="font-weight: 400;" width="72">Language. Available languages: en, ru, by, fr, de, id, kk, tt, tr, uk.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">Geographical location in Yandex rstr format</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found<a href="#user-agent"> here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the <a href="#upload-to-storage">Upload to Storage </a>page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p id="search">API makes request to <code>yandex.com</code> to retrieve search results pages from number 11 to number 20 for keyword <code>adidas</code>. The API will post a JSON request to <code>your.callback.url</code> containing the URL to download the raw HTML output once the data retrieval task is successfully finished. This is Push-Pull:</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "yandex_search", "domain": "com", "query": "adidas", "start_page": 11, "pages": 10, "callback_url": "https://your.callback.url"}'
</pre>
<p>And here is the same example in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "yandex_search", "domain": "com", "query": "adidas", "start_page": 11, "pages": 10, "callback_url": "https://your.callback.url"}'
</pre>
<hr />
<h2 id="parameter-values">Parameter Values</h2>
<h3 id="user-agent">User-Agent</h3>
<p>Download full list of <code>user_agent_type</code> values in JSON <a class="custom_link" href="https://docs.oxylabs.io/resources/user_agent_type.json" target="_blank" rel="noopener">here</a>.</p>
<pre>[
  {
    "user_agent_type": "desktop",
    "description": "Random desktop browser User-Agent"
  },
  {
    "user_agent_type": "desktop_firefox",
    "description": "Random User-Agent of one of the latest versions of desktop Firefox"
  },
  {
    "user_agent_type": "desktop_chrome",
    "description": "Random User-Agent of one of the latest versions of desktop Chrome"
  },
  {
    "user_agent_type": "desktop_opera",
    "description": "Random User-Agent of one of the latest versions of desktop Opera"
  },
  {
    "user_agent_type": "desktop_edge",
    "description": "Random User-Agent of one of the latest versions of desktop Edge"
  },
  {
    "user_agent_type": "desktop_safari",
    "description": "Random User-Agent of one of the latest versions of desktop Safari"
  },
  {
    "user_agent_type": "mobile",
    "description": "Random mobile browser User-Agent"
  },
  {
    "user_agent_type": "mobile_android",
    "description": "Random User-Agent of one of the latest versions of Android browser"
  },
  {
    "user_agent_type": "mobile_ios",
    "description": "Random User-Agent of one of the latest versions of iPhone browser"
  },
  {
    "user_agent_type": "tablet",
    "description": "Random tablet browser User-Agent"
  },
  {
    "user_agent_type": "tablet_android",
    "description": "Random User-Agent of one of the latest versions of Android tablet"
  },
  {
    "user_agent_type": "tablet_ios",
    "description": "Random User-Agent of one of the latest versions of iPad tablet"
  }
]
</pre>
<hr />
<h2 id="account-status">Account Status</h2>
<h3 id="usage-statistics">Usage Statistics</h3>
<p>You can find your usage statistics by querying the following endpoint:</p>
<pre>GET https://data.oxylabs.io/v1/stats
</pre>
<p>By default the API will return all time usage statistics. Adding <code>?group_by=month</code> will return monthly stats, while <code>?group_by=day</code> will return daily numbers.</p>
<p>This query will return all time statistics. You can find your daily and monthly usage by adding either <code>?group_by=day</code> or <code>?group_by=month</code></p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/stats'
</pre>
<p>Sample output:</p>
<pre>{
    "data": {
        "sources": [
            {
                "realtime_results_count": "90",
                "results_count": "10",
                "title": "yandex"
            },
            {
                "realtime_results_count": "19",
                "results_count": "87",
                "title": "yandex_search"
            }
        ]
    },
    "meta": {
        "group_by": null
    }
}
</pre>
<hr />
<h3 id="limits">Limits</h3>
<p>The following endpoint will give your monthly commitment information as well as how much has already been used:</p>
<pre>GET https://data.oxylabs.io/v1/stats/limits
</pre>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/stats/limits'
</pre>
<p>Sample output:</p>
<pre>{
    "monthly_requests_commitment": 4500000,
    "used_requests": 985000
}
</pre>
<hr />
<h2 id="response-codes">Response Codes</h2>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Code</th>
<th>Status</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>204</code></td>
<td>No Content</td>
<td>You are trying to retrieve a job that has not been completed yet.</td>
</tr>
<tr>
<td><code>400</code></td>
<td>Multiple error messages</td>
<td>Bad request structure, could be a misspelled parameter or invalid value. Response body will have more specific error message.</td>
</tr>
<tr>
<td><code>401</code></td>
<td>&#8216;Authorization header not provided' / &#8216;Invalid authorization header' / &#8216;Client not found'</td>
<td>Missing authorization header or incorrect login credentials.</td>
</tr>
<tr>
<td><code>403</code></td>
<td>Forbidden</td>
<td>Your account does not have access to this resource.</td>
</tr>
<tr>
<td><code>404</code></td>
<td>Not Found</td>
<td>Job ID you are looking for is no longer available.</td>
</tr>
<tr>
<td><code>429</code></td>
<td>Too many requests</td>
<td>Exceeded rate limit. Please contact your account manager to increase limits.</td>
</tr>
<tr>
<td><code>500</code></td>
<td>Unknown Error</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>524</code></td>
<td>Timeout</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>612</code></td>
<td>Undefined Internal Error</td>
<td>Something went wrong and we failed the job you submitted. You can try again at no extra cost, as we don't charge you for <code>faulted</code> jobs. If that doesn't work, give us a shout.</td>
</tr>
<tr>
<td><code>613</code></td>
<td>Faulted After Too Many Retries</td>
<td>We tried scraping the job you submitted, but gave up after reaching our retry limit. You can try again at no extra cost, as we don't charge you for <code>faulted</code> jobs. If that doesn't work, give us a shout.</td>
</tr>
</tbody>
</table>
</div>
<p>Cloud storage upload response codes:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Code</th>
<th>Status</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>10001</code></td>
<td>Unexpected Exception</td>
<td>Something terribly wrong happened. We probably know about this already and are fixing it. Let us know anyway.</td>
</tr>
<tr>
<td><code>13000</code></td>
<td>Upload Success</td>
<td>All good!</td>
</tr>
<tr>
<td><code>13001</code></td>
<td>Upload Failed</td>
<td>We couldn't upload job results your bucket.</td>
</tr>
<tr>
<td><code>13102</code></td>
<td>No Such Path</td>
<td>We couldn't find a bucket with such name. Please double check.</td>
</tr>
<tr>
<td><code>13103</code></td>
<td>Access Denied</td>
<td>Bucket doesn't have required permissions. To find out how to give us required access, see <a href="#upload-to-storage">here</a>.</td>
</tr>
</tbody>
</table>
</div>
<hr />
<h4>References</h4>
<ul>
<li><a href="https://docs.oxylabs.io/rtc/source/yandex/index.html#quick-start" target="_blank" rel="nofollow noopener">https://docs.oxylabs.io/rtc/source/yandex/index.html</a></li>
<li><a href="https://docs.oxylabs.io/rtc/index.html" target="_blank" rel="nofollow noopener">https://docs.oxylabs.io/rtc/index.html</a></li>
</ul>
<p>&nbsp;</p>
<hr />
<blockquote><p><strong>Disclaimer:</strong> This part of the content is mainly from the merchant. If the merchant does not want it to be displayed on my website, please <a href="https://www.proxysp.com/contact-us/">contact us</a> to delete your content.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://proxysp.com/oxylabs-yandex-real-time-crawler/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7633</post-id>	</item>
		<item>
		<title>How to Use Bing Real-Time Crawler [Part 3]: Oxylabs Real-Time Crawler for Bing</title>
		<link>https://proxysp.com/oxylabs-bing-real-time-crawler/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oxylabs-bing-real-time-crawler</link>
					<comments>https://proxysp.com/oxylabs-bing-real-time-crawler/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
				<category><![CDATA[How to Use OxyLabs Proxy (OxyLabs User Manual Navigation)]]></category>
		<guid isPermaLink="false">https://www.proxysp.com/?p=7634</guid>

					<description><![CDATA[Do you know how to use OxyLabs Real-time Crawler for Bing? This is the most comprehensive introduction from OxyLabs official. Quick Start Real-Time Crawler is built &#8230;<p class="read-more"> <a class="ast-button" href="https://proxysp.com/oxylabs-bing-real-time-crawler/"> <span class="screen-reader-text">How to Use Bing Real-Time Crawler [Part 3]: Oxylabs Real-Time Crawler for Bing</span> Read More &#187;</a></p>]]></description>
										<content:encoded><![CDATA[<blockquote><p>Do you know how to use OxyLabs Real-time Crawler for Bing? This is the most comprehensive introduction from OxyLabs official.</p></blockquote>
<h2 id="quick-start">Quick Start</h2>
<p>Real-Time Crawler is built for heavy-duty data retrieval operations. You can use Real-Time Crawler to access various Bing pages. It enables effortless web data extraction from search engines without any delays or errors.</p>
<p>Real-Time Crawler for Bing uses <a class="custom_link" href="https://en.wikipedia.org/wiki/Basic_access_authentication" target="_blank" rel="nofollow noopener">basic HTTP authentication</a> that requires sending username and password.</p>
<p>This is by far the fastest way to start using Real-Time Crawler for Bing. You will send a query <code>adidas</code> to <code>bing_search</code> using <a href="#realtime">Realtime</a> integration method. Don't forget to replace <code>USERNAME</code> and <code>PASSWORD</code> with your proxy user credentials.</p>
<pre>curl --user "USERNAME:PASSWORD" 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json" -d '{"source": "bing_search", "domain": "com", "query": "adidas"}'
</pre>
<p>If you have any questions not covered by this documentation, please contact your account manager or our support staff at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<hr />
<h2 id="integration-methods">Integration Methods</h2>
<p>Real-Time Crawler for Bing supports three integration methods which have their unique benefits:</p>
<ul>
<li><a href="#push-pull">Push-Pull</a>. Using this method it is now required to mainain an active connection with our endpoint to retrieve the data. Upon making a request, our system is able to automatically ping users server when the job is done (see <a href="#callback">Callback</a>). This method saves computing resources and can be scaled easily.</li>
<li><a href="#realtime">Realtime</a>. The method requires user to maintain an active connection with our endpoint in order to get the results successfully when the job is completed. This method can be implemented into one service while Push-Pull method is a two step process.</li>
<li><a href="#superapi">SuperAPI</a>. This method is very similar to Realtime but instead posting data to our endpoint, user can use HTML Cralwer as a proxy. To retrieve the data, user must set up a proxy endpoint and make GET request to a desired URL. Additional parameters must be added using headers.</li>
</ul>
<p>Our recommended data extraction method is <a href="#push-pull">Push-Pull</a>.</p>
<hr />
<h3 id="push-pull">Push-Pull</h3>
<p>This is the most simple yet the most reliable and recommended data delivery method. In Push-Pull scenario you send us a query, we return you job <code>id</code>, and once the job is done you can use that <code>id</code> to retrieve content from <code>/results</code> endpoint. You can check job completion status yourself, or you can set up a simple listener that is able to accept POST queries.</p>
<p>This way we will send you a callback message once the job is ready to be retrieved. In this particular example the results will be automatically <a href="#upload-to-storage">uploaded to your S3 bucket</a> named <code>YOUR_BUCKET_NAME</code>.</p>
<hr />
<h4 id="single-query"><strong>Single Query</strong></h4>
<p>The following endpoint will handle single queries for one keyword or URL. The API will return a confirmation message containing job information, including job <code>id</code>. You can check job completion status using that <code>id</code>, or you can ask us to ping your callback endpoint once the scraping task is finished by adding <code>callback_url</code> in the query.</p>
<pre>POST https://data.oxylabs.io/v1/queries
</pre>
<p>You need to post query parameters as data in JSON body.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json" 
 -d '{"source": "bing_search", "domain": "com", "query": "adidas", "callback_url": "https://your.callback.url", "storage_type": "s3", "storage_url": "YOUR_BUCKET_NAME"}'
</pre>
<p>The API will respond with query information in JSON format, by printing it in response body, similar to this:</p>
<pre>{
  "callback_url": "https://your.callback.url",
  "client_id": 5,
  "context": [
    {
      "key": "safe_search",
      "value": null
    }
  ],
  "created_at": "2019-10-01 00:00:01",
  "domain": "com",
  "geo_location": null,
  "id": "12345678900987654321",
  "limit": 10,
  "locale": null,
  "pages": 1,
  "render": null,
  "query": "adidas",
  "source": "bing_search",
  "start_page": 1,
  "status": "pending",  
  "storage_type": "s3",
  "storage_url": "YOUR_BUCKET_NAME/12345678900987654321.json",
  "subdomain": "www",
  "updated_at": "2019-10-01 00:00:01",
  "user_agent_type": "desktop",
  "_links": [
    {
      "rel": "self",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321",
      "method": "GET"
    },
    {
      "rel": "results",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
      "method": "GET"
    }
  ]
}
</pre>
<hr />
<h4 id="check-job-status"><strong>Check Job Status</strong></h4>
<p>If your query had <code>callback_url</code>, we will send you a message containing link to content once the scraping task is done. However, if there was no <code>callback_url</code> in the query, you will need to check job status yourself. For that you need to use the URL in <code>href</code> under <code>rel</code>:<code>self</code> in the response message you received after submitting your query to our API. It should look similar to this: <code>http://data.oxylabs.io/v1/queries/12345678900987654321</code>.</p>
<pre>GET https://data.oxylabs.io/v1/queries/{id}
</pre>
<p>Querying this link will return job information, including its <code>status</code>. There are 3 possible <code>status</code> values:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<tbody>
<tr>
<td><code>pending</code></td>
<td>The job is still in the queue and has not been completed.</td>
</tr>
<tr>
<td><code>done</code></td>
<td>The job is completed, you may retrieve the result by querying the URL in <code>href</code> under <code>rel</code>:<code>results</code> : <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code></td>
</tr>
<tr>
<td><code>faulted</code></td>
<td>There was an issue with the job and we couldn't complete it, most likely due to a server error on the target site's side.</td>
</tr>
</tbody>
</table>
</div>
<pre>curl --user user:pass1 'http://data.oxylabs.io/v1/queries/12345678900987654321'
</pre>
<p>The API will respond with query information in JSON format, by printing it in response body. Notice that job <code>status</code> has been changed to <code>done</code>. You can now retrieve content by querying <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code>.</p>
<p>You can also see that the task has been <code>updated_at</code> <code>2019-10-01 00:00:15</code> &#8211; the query took 14 seconds to complete.</p>
<pre>{
  "client_id": 5,
  "context": [
    {
      "key": "safe_search",
      "value": null
    }
  ],
  "created_at": "2019-10-01 00:00:01",
  "domain": "com",
  "geo_location": null,
  "id": "12345678900987654321",
  "limit": 10,
  "locale": null,
  "pages": 1,
  "render": null,
  "query": "adidas",
  "source": "bing_search",
  "start_page": 1,
  "status": "done",
  "subdomain": "www",
  "updated_at": "2019-10-01 00:00:15",
  "user_agent_type": "desktop",
  "_links": [
    {
      "rel": "self",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321",
      "method": "GET"
    },
    {
      "rel": "results",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
      "method": "GET"
    }
  ]
}
</pre>
<hr />
<h4 id="retrieve-job-content"><strong>Retrieve Job Content</strong></h4>
<p>Once you know the job is ready to retrieved either by checking its status or receiving a callback from us, you can GET it using the URL in <code>href</code> under <code>rel</code>:<code>results</code> in either our initial response or in callback message. It should look similar to this: <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code></p>
<pre>GET https://data.oxylabs.io/v1/queries/{id}/results
</pre>
<p>The results can be automatically retrieved without periodically checking job status by setting up <a href="#callback">Callback</a> service. User needs to specfy the IP or domain of the server where the Callback service is running. When our system completes a job, it will send a message to the provided IP or domain and the Callback service will download the results as described in the <a href="#callback">Callback implementation example</a>.</p>
<pre>curl --user user:pass1 'http://data.oxylabs.io/v1/queries/12345678900987654321/results'
</pre>
<p>The API will return job content:</p>
<pre>{
  "results": [
    {
      "content": "&lt;!doctype html&gt;
        CONTENT      
      ",
      "created_at": "2019-10-01 00:00:01",
      "updated_at": "2019-10-01 00:00:15",
      "page": 1,
      "url": "https://www.bing.com/search?q=adidas",
      "job_id": "12345678900987654321",
      "status_code": 200
    }
  ]
}
</pre>
<hr />
<h4 id="callback"><strong>Callback</strong></h4>
<p>A callback is a <code>POST</code> request we send to your machine, informing that the data extraction task is completed and providing URL to download scraped content. This means that you no longer need to <a href="#check-job-status">check job status</a> manually. Once the data is here, we will let you know, and all you need to do now is <a href="#retrieve-job-content">retrieve it</a>.</p>
<pre># Please see code samples in Python and PHP.
</pre>
<p>Sample callback output</p>
<pre>{  
   "created_at":"2019-10-01 00:00:01",
   "updated_at":"2019-10-01 00:00:15",
   "locale":null,
   "client_id":163,
   "user_agent_type":"desktop",
   "source":"bing_search",
   "pages":1,
   "subdomain":"www",
   "status":"done",
   "start_page":1,
   "render":null,
   "priority":0,
   "ttl":0,
   "origin":"api",
   "persist":true,
   "id":"12345678900987654321",
   "callback_url":"http://your.callback.url/",
   "query":"adidas",
   "domain":"com",
   "limit":10,
   "geo_location":null,
   {...}
   "_links":[
      {  
         "href":"https://data.oxylabs.io/v1/queries/12345678900987654321",
         "method":"GET",
         "rel":"self"
      },
      {  
         "href":"https://data.oxylabs.io/v1/queries/12345678900987654321/results",
         "method":"GET",
         "rel":"results"
      }
   ],
}
</pre>
<hr />
<h4 id="batch-query"><strong>Batch Query</strong></h4>
<p>Real-Time Crawler also supports executing multiple keywords, up to 1,000 keywords with each batch. The following endpoint will submit multiple keywords to the extraction queue.</p>
<pre>POST https://data.oxylabs.io/v1/queries/batch
</pre>
<p>You need to post query parameters as data in JSON body.</p>
<p>The system will handle every keyword as a separate request. If you provided callback URL, you will get a separate call for each keyword. Otherwise, our initial response will contain job <code>id</code>s for all keywords. For example, if you sent 50 keywords, we will return 50 unique job <code>id</code>s.</p>
<p>Important! <code>query</code> is the only parameter that can have multiple values. All other parameters are the same for that batch query.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries/batch' -H 'Content-Type: application/json'
 -d '@keywords.json'
</pre>
<p><code>keywords.json</code> content:</p>
<pre>{  
   "query":[  
      "adidas",
      "nike",
      "reebok"
   ],
   "source": "bing_search",
   "domain": "com",
   "callback_url": "https://your.callback.url"
}
</pre>
<p>The API will respond with query information in JSON format, by printing it in response body, similar to this:</p>
<pre>{
  "queries": [
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "12345678900987654321",
      {...}
      "query": "adidas",
      "source": "bing_search",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
          "method": "GET"
        }
      ]
    },
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "12345678901234567890",
      {...}
      "query": "nike",
      "source": "bing_search",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/12345678901234567890/results",
          "method": "GET"
        }
      ]
    },
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "01234567899876543210",
      {...}
      "query": "reebok",
      "source": "bing_search",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/01234567899876543210/results",
          "method": "GET"
        }
      ]
    }
  ]
}
</pre>
<hr />
<h4 id="get-notifier-ip-address-list"><strong>Get Notifier IP Address List</strong></h4>
<p>You may want to whitelist the IPs sending you callback messages or get the list of these IPs for other purposes. This can be done by <code>GET</code>ing this endpoint: <code>https://data.oxylabs.io/v1/info/callbacker_ips</code>.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/info/callbacker_ips'
</pre>
<p>The API will return the list of IPs making callback requests to your system:</p>
<pre>{
    "ips": [
        "x.x.x.x",
        "y.y.y.y"
    ]
}
</pre>
<hr />
<h4 id="upload-to-storage"><strong>Upload to Storage</strong></h4>
<p>By default RTC job results are stored in our databases. This means that you will need to query our results endpoint and retrieve content yourself. Custom storage feature allows you to store results in your own cloud storage. The advantage of this feature is that you don't have to make extra requests in order to fetch results &#8211; everything goes directly to your storage bucket.</p>
<p>We support Amazon S3 and Google Cloud Storage. If you would like to use a different type of storage, please contact your account manager to discuss the feature delivery timeline.</p>
<p id="amazon-s3"><strong>Amazon S3</strong></p>
<p>To get your job results uploaded to your Amazon S3 bucket, please set up access permissions for our service. To do that, go to <code>https://s3.console.aws.amazon.com/ &gt; S3 &gt; Storage &gt; Bucket Name (if don't have one, create new) &gt; Permissions &gt; Bucket Policy</code></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8257" src="https://www.proxysp.com/wp-content/uploads/2021/09/oxylabs-Real-Time-Crawler-for-Bing-Upload-to-Storage1.png" alt="oxylabs Real-Time Crawler for Bing Upload to Storage1" width="485" height="325" srcset="https://proxysp.com/wp-content/uploads/2021/09/oxylabs-Real-Time-Crawler-for-Bing-Upload-to-Storage1.png 485w, https://proxysp.com/wp-content/uploads/2021/09/oxylabs-Real-Time-Crawler-for-Bing-Upload-to-Storage1-300x201.png 300w" sizes="(max-width: 485px) 100vw, 485px" /></p>
<p>You can find bucket policy in this <a class="custom_link" href="https://docs.oxylabs.io/resources/s3_bucket_policy.json" target="_blank" rel="noopener">JSON</a> or in code sample area on the right. Don't forget to change bucket name under <code>YOUR_BUCKET_NAME</code>. This policy allows us to write to your bucket, give access to uploaded files to you, and know bucket location.</p>
<p id="google-cloud-storage"><strong>Google Cloud Storage</strong></p>
<p>To get your job results uploaded to your Google Cloud Storage bucket, please set up special permissions for our service. To do that, please create a custom role with the <code>storage.objects.create</code> permission and assign it to the Oxylabs service account email <code>oxyserps-storage@oxyserps-storage.iam.gserviceaccount.com</code>.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8258" src="https://www.proxysp.com/wp-content/uploads/2021/09/oxylabs-Real-Time-Crawler-for-Bing-Upload-to-Storage2.png" alt="oxylabs Real-Time Crawler for Bing Upload to Storage2" width="484" height="311" srcset="https://proxysp.com/wp-content/uploads/2021/09/oxylabs-Real-Time-Crawler-for-Bing-Upload-to-Storage2.png 484w, https://proxysp.com/wp-content/uploads/2021/09/oxylabs-Real-Time-Crawler-for-Bing-Upload-to-Storage2-300x193.png 300w" sizes="(max-width: 484px) 100vw, 484px" /></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8259" src="https://www.proxysp.com/wp-content/uploads/2021/09/oxylabs-Real-Time-Crawler-for-Bing-Upload-to-Storage3.png" alt="oxylabs Real-Time Crawler for Bing Upload to Storage3" width="484" height="668" srcset="https://proxysp.com/wp-content/uploads/2021/09/oxylabs-Real-Time-Crawler-for-Bing-Upload-to-Storage3.png 484w, https://proxysp.com/wp-content/uploads/2021/09/oxylabs-Real-Time-Crawler-for-Bing-Upload-to-Storage3-217x300.png 217w" sizes="(max-width: 484px) 100vw, 484px" /></p>
<p id="usage"><strong>Usage</strong></p>
<p>To use this feature, please specify two additional parameters in your requests. Learn more <a href="#direct">here</a>.</p>
<p>The upload path looks like this: <code>YOUR_BUCKET_NAME/job_ID.json</code>. You will find job ID in response body that you receive from us after submitting a request. In <a href="#single-query">this example</a> job ID is <code>12345678900987654321</code>.</p>
<pre>{
    "Version": "2012-10-17",
    "Id": "Policy1577442634787",
    "Statement": [
        {
            "Sid": "Stmt1577442633719",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::324311890426:user/oxylabs.s3.uploader"
            },
            "Action": "s3:GetBucketLocation",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME"
        },
        {
            "Sid": "Stmt1577442633719",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::324311890426:user/oxylabs.s3.uploader"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
        }
    ]
}
</pre>
<hr />
<h3 id="realtime">Realtime</h3>
<p>The data submission is the same as in Push-Pull method, but Realtime case we will return the content on open connection. You send us a query, the connection remains open, we retrieve the content and bring it to you. The endpoint that handles that is this:</p>
<pre>POST https://realtime.oxylabs.io/v1/queries
</pre>
<p>There is a timeout limit of 150 seconds for open connections, therefore in rare cases of heavy load we may not be able to ensure the data gets to you.</p>
<p>You need to post query parameters as data in JSON body. Please see example for more details.</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json" 
 -d '{"source": "bing_search", "domain": "com", "query": "adidas"}'
</pre>
<p>Example response body that will be returned on open connection:</p>
<pre>{
  "results": [
    {
      "content": "
      CONTENT
      "
      "created_at": "2019-10-01 00:00:01",
      "updated_at": "2019-10-01 00:00:15",
      "id": null,
      "page": 1,
      "url": "https://www.bing.com/search?q=adidas",
      "job_id": "12345678900987654321",
      "status_code": 200
    }
  ]
}
</pre>
<hr />
<h3 id="superapi">SuperAPI</h3>
<p>If you ever used regular proxies for data scraping, integrating SuperAPI delivery method will be a breeze. All that needs to be done is to use our entry node as proxy, authorize with Real-Time Crawler credentials, and ignore certificates. In <code>cURL</code> it's <code>-k</code> or <code>--insecure</code>. Your data will reach you on open connection.</p>
<pre>GET realtime.oxylabs.io:60000
</pre>
<p>SuperAPI only supports a handful of parameters since it <strong>only works with <a href="#direct">Direct</a> data source</strong> where full URL is provided. These parameters should be sent as headers. This is a list of accepted parameters:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<tbody>
<tr>
<td><code>X-OxySERPs-User-Agent-Type</code></td>
<td>There is no way to indicate a specific User-Agent, but you can let us know which browser and platform to use. A list of supported User-Agents can be found <a href="#user-agent">here</a>.</td>
</tr>
<tr>
<td><code>X-OxySERPs-Geo-Location</code></td>
<td>The API uses Canonical Geo Location format to determine request location. It goes like this: <code>City,Region,Country</code>, for example <code>Harrisburg,Arkansas,United States</code>). More information how to create Canonical Geolocation name can be found <a class="custom_link" href="https://developers.google.com/adwords/api/docs/appendix/geotargeting" target="_blank" rel="nofollow noopener">here</a>.</td>
</tr>
</tbody>
</table>
</div>
<p>If you need help setting up SuperAPI, drop a line at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<pre>curl -k -x realtime.oxylabs.io:60000 -U user:pass1 -H "X-OxySERPs-User-Agent-Type: desktop_chrome" 
-H "X-OxySERPs-Geo-Location: 15550" "https://bing.com/search/?text=nike"
</pre>
<hr />
<h2 id="content-type">Content Type</h2>
<p>Real-Time Crawler returns <strong>raw HTML</strong>.</p>
<hr />
<h2 id="data-sources">Data Sources</h2>
<p>There are two approaches on how to retrieve data from Bing using Real-Time Crawler. You can give us full URL via <a href="#direct">Direct</a>, or you can specify parameters via specifically built data source &#8211; <a href="#search">Search</a>.</p>
<p>If you are unsure which way to choose, drop us a line at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a> or contact your account manager.</p>
<hr />
<h3 id="direct">Direct</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8260 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Bing-Direct.png" alt="Oxylabs Real-Time Crawler for Bing Direct" width="424" height="24" srcset="https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Bing-Direct.png 424w, https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Bing-Direct-300x17.png 300w" sizes="(max-width: 424px) 100vw, 424px" /></p>
<p><code>bing</code> source is designed to retrieve content of direct URLs of various Bing pages. This means that instead of sending multiple parameters, you can provide us with a direct URL to required Bing page. We do not strip any parameters or alter your URLs in any other way.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">bing</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">url</td>
<td style="font-weight: 400;" width="72">Direct URL (link) to Bing page</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found <a href="#user-agent">here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">The API uses Canonical Geo Location format to determine request location. It goes like this: City,Region,Country, for example Harrisburg,Arkansas,United States). More information how to create Canonical Geolocation name can be found <a href="https://developers.google.com/adwords/api/docs/appendix/geotargeting" target="_blank" rel="nofollow noopener">here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the <a href="#upload-to-storage">Upload to Storage</a> page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>In this example the API will retrieve Bing search for keyword <code>nike</code> in Push-Pull method:</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "bing", "url": "https://bing.com/search/?text=nike&"}'
</pre>
<p>Here is the same example in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "bing", "url": "https://bing.com/search/?text=nike&"}'
</pre>
<p>And via SuperAPI:</p>
<pre>curl -k -x realtime.oxylabs.io:60000 -U user:pass1 "https://bing.com/search/?text=nike&"
</pre>
<hr />
<h3 id="search">Search</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8262 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Bing-Search.png" alt="Oxylabs Real-Time Crawler for Bing Search" width="443" height="26" srcset="https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Bing-Search.png 443w, https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Bing-Search-300x18.png 300w" sizes="(max-width: 443px) 100vw, 443px" /></p>
<p><code>bing_search</code> source is designed to retrieve Bing Search results (SERP).</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">bing_search</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">domain</td>
<td style="font-weight: 400;" width="72">Domain localization. Available domains: com, ru, ua, by, kz, tr</td>
<td style="font-weight: 400;" width="72">com</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">query</td>
<td style="font-weight: 400;" width="72">UTF-encoded keyword</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">start_page</td>
<td style="font-weight: 400;" width="72">Starting page number</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">pages</td>
<td style="font-weight: 400;" width="72">Number of pages to retrieve</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">limit</td>
<td style="font-weight: 400;" width="72">Number of results to retrieve in each page</td>
<td style="font-weight: 400;" width="72">10</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">locale</td>
<td style="font-weight: 400;" width="72">Language. You can use either a 2-letter ISO country code (ex. en, by, fr, etc.), or a language tag (ex. en-US, de-DE, ar-EG, etc.).</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">The API uses Canonical Geo Location format to determine request location. It goes like this: City,Region,Country, for example Harrisburg,Arkansas,United States). More information how to create Canonical Geolocation name can be found<a href="https://developers.google.com/adwords/api/docs/appendix/geotargeting" target="_blank" rel="nofollow noopener"> here.</a></td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found <a href="#user-agent">here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the <a href="#upload-to-storage">Upload to Storage </a>page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>API makes request to <code>bing.com</code> to retrieve search results pages from number 11 to number 20 for keyword <code>adidas</code>. The API will post a JSON request to <code>your.callback.url</code> containing the URL to download the raw HTML output once the data retrieval task is successfully finished. This is Push-Pull:</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "bing_search", "domain": "com", "query": "adidas", "start_page": 11, "pages": 10, "callback_url": "https://your.callback.url"}'
</pre>
<p>And here is the same example in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "bing_search", "domain": "com", "query": "adidas", "start_page": 11, "pages": 10, "callback_url": "https://your.callback.url"}'
</pre>
<hr />
<h2 id="parameter-values">Parameter Values</h2>
<h3 id="user-agent">User-Agent</h3>
<p>Download full list of <code>user_agent_type</code> values in JSON <a class="custom_link" href="https://docs.oxylabs.io/resources/user_agent_type.json" target="_blank" rel="noopener">here</a>.</p>
<pre>[
  {
    "user_agent_type": "desktop",
    "description": "Random desktop browser User-Agent"
  },
  {
    "user_agent_type": "desktop_firefox",
    "description": "Random User-Agent of one of the latest versions of desktop Firefox"
  },
  {
    "user_agent_type": "desktop_chrome",
    "description": "Random User-Agent of one of the latest versions of desktop Chrome"
  },
  {
    "user_agent_type": "desktop_opera",
    "description": "Random User-Agent of one of the latest versions of desktop Opera"
  },
  {
    "user_agent_type": "desktop_edge",
    "description": "Random User-Agent of one of the latest versions of desktop Edge"
  },
  {
    "user_agent_type": "desktop_safari",
    "description": "Random User-Agent of one of the latest versions of desktop Safari"
  },
  {
    "user_agent_type": "mobile",
    "description": "Random mobile browser User-Agent"
  },
  {
    "user_agent_type": "mobile_android",
    "description": "Random User-Agent of one of the latest versions of Android browser"
  },
  {
    "user_agent_type": "mobile_ios",
    "description": "Random User-Agent of one of the latest versions of iPhone browser"
  },
  {
    "user_agent_type": "tablet",
    "description": "Random tablet browser User-Agent"
  },
  {
    "user_agent_type": "tablet_android",
    "description": "Random User-Agent of one of the latest versions of Android tablet"
  },
  {
    "user_agent_type": "tablet_ios",
    "description": "Random User-Agent of one of the latest versions of iPad tablet"
  }
]
</pre>
<hr />
<h2 id="account-status">Account Status</h2>
<h3 id="usage-statistics">Usage Statistics</h3>
<p>You can find your usage statistics by querying the following endpoint:</p>
<pre>GET https://data.oxylabs.io/v1/stats
</pre>
<p>By default the API will return all time usage statistics. Adding <code>?group_by=month</code> will return monthly stats, while <code>?group_by=day</code> will return daily numbers.</p>
<p>This query will return all time statistics. You can find your daily and monthly usage by adding either <code>?group_by=day</code> or <code>?group_by=month</code></p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/stats'
</pre>
<p>Sample output:</p>
<pre>{
    "data": {
        "sources": [
            {
                "realtime_results_count": "90",
                "results_count": "10",
                "title": "bing"
            },
            {
                "realtime_results_count": "19",
                "results_count": "87",
                "title": "bing_search"
            }
        ]
    },
    "meta": {
        "group_by": null
    }
}
</pre>
<hr />
<h3 id="limits">Limits</h3>
<p>The following endpoint will give your monthly commitment information as well as how much has already been used:</p>
<pre>GET https://data.oxylabs.io/v1/stats/limits
</pre>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/stats/limits'
</pre>
<p>Sample output:</p>
<pre>{
    "monthly_requests_commitment": 4500000,
    "used_requests": 985000
}
</pre>
<hr />
<h2 id="response-codes">Response Codes</h2>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Code</th>
<th>Status</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>204</code></td>
<td>No Content</td>
<td>You are trying to retrieve a job that has not been completed yet.</td>
</tr>
<tr>
<td><code>400</code></td>
<td>Multiple error messages</td>
<td>Bad request structure, could be a misspelled parameter or invalid value. Response body will have more specific error message.</td>
</tr>
<tr>
<td><code>401</code></td>
<td>&#8216;Authorization header not provided' / &#8216;Invalid authorization header' / &#8216;Client not found'</td>
<td>Missing authorization header or incorrect login credentials.</td>
</tr>
<tr>
<td><code>403</code></td>
<td>Forbidden</td>
<td>Your account does not have access to this resource.</td>
</tr>
<tr>
<td><code>404</code></td>
<td>Not Found</td>
<td>Job ID you are looking for is no longer available.</td>
</tr>
<tr>
<td><code>429</code></td>
<td>Too many requests</td>
<td>Exceeded rate limit. Please contact your account manager to increase limits.</td>
</tr>
<tr>
<td><code>500</code></td>
<td>Unknown Error</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>524</code></td>
<td>Timeout</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>612</code></td>
<td>Undefined Internal Error</td>
<td>Something went wrong and we failed the job you submitted. You can try again at no extra cost, as we don't charge you for <code>faulted</code> jobs. If that doesn't work, give us a shout.</td>
</tr>
<tr>
<td><code>613</code></td>
<td>Faulted After Too Many Retries</td>
<td>We tried scraping the job you submitted, but gave up after reaching our retry limit. You can try again at no extra cost, as we don't charge you for <code>faulted</code> jobs. If that doesn't work, give us a shout.</td>
</tr>
</tbody>
</table>
</div>
<p>Cloud storage upload response codes:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<tbody>
<tr>
<td><code>10001</code></td>
<td>Unexpected Exception</td>
<td>Something terribly wrong happened. We probably know about this already and are fixing it. Let us know anyway.</td>
</tr>
<tr>
<td><code>13000</code></td>
<td>Upload Success</td>
<td>All good!</td>
</tr>
<tr>
<td><code>13001</code></td>
<td>Upload Failed</td>
<td>We couldn't upload job results your bucket.</td>
</tr>
<tr>
<td><code>13102</code></td>
<td>No Such Path</td>
<td>We couldn't find a bucket with such name. Please double check.</td>
</tr>
<tr>
<td><code>13103</code></td>
<td>Access Denied</td>
<td>Bucket doesn't have required permissions. To find out how to give us required access, see <a href="#upload-to-storage">here</a>.</td>
</tr>
</tbody>
</table>
</div>
<hr />
<h4>References</h4>
<ul>
<li><a href="https://docs.oxylabs.io/rtc/source/bing/index.html" target="_blank" rel="nofollow noopener">https://docs.oxylabs.io/rtc/source/bing/index.html</a></li>
<li><a href="https://docs.oxylabs.io/rtc/index.html" target="_blank" rel="nofollow noopener">https://docs.oxylabs.io/rtc/index.html</a></li>
</ul>
<p>&nbsp;</p>
<hr />
<blockquote><p><strong>Disclaimer:</strong> This part of the content is mainly from the merchant. If the merchant does not want it to be displayed on my website, please <a href="https://www.proxysp.com/contact-us/">contact us</a> to delete your content.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://proxysp.com/oxylabs-bing-real-time-crawler/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7634</post-id>	</item>
		<item>
		<title>How to Use Baidu Real-Time Crawler [Part 4]: Oxylabs Real-Time Crawler for Baidu</title>
		<link>https://proxysp.com/oxylabs-baidu-real-time-crawler/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oxylabs-baidu-real-time-crawler</link>
					<comments>https://proxysp.com/oxylabs-baidu-real-time-crawler/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
				<category><![CDATA[How to Use OxyLabs Proxy (OxyLabs User Manual Navigation)]]></category>
		<guid isPermaLink="false">https://www.proxysp.com/?p=7635</guid>

					<description><![CDATA[Do you know how to use OxyLabs Real-time Crawler for Baidu? This is the most comprehensive introduction from OxyLabs official. Quick Start Real-Time Crawler is built &#8230;<p class="read-more"> <a class="ast-button" href="https://proxysp.com/oxylabs-baidu-real-time-crawler/"> <span class="screen-reader-text">How to Use Baidu Real-Time Crawler [Part 4]: Oxylabs Real-Time Crawler for Baidu</span> Read More &#187;</a></p>]]></description>
										<content:encoded><![CDATA[<blockquote><p>Do you know how to use OxyLabs Real-time Crawler for Baidu? This is the most comprehensive introduction from OxyLabs official.</p></blockquote>
<h2 id="quick-start">Quick Start</h2>
<p>Real-Time Crawler is built for heavy-duty data retrieval operations. You can use Real-Time Crawler to access various Baidu pages. It enables effortless web data extraction from search engines without any delays or errors.</p>
<p>Real-Time Crawler for Baidu uses <a class="custom_link" href="https://en.wikipedia.org/wiki/Basic_access_authentication" target="_blank" rel="nofollow noopener">basic HTTP authentication</a> that requires sending username and password.</p>
<p>This is by far the fastest way to start using Real-Time Crawler for Baidu. You will send a query <code>adidas</code> to <code>baidu_search</code> using <a href="#realtime">Realtime</a> integration method. Don't forget to replace <code>USERNAME</code> and <code>PASSWORD</code> with your proxy user credentials.</p>
<pre>curl --user "USERNAME:PASSWORD" 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json" -d '{"source": "baidu_search", "domain": "com", "query": "adidas"}'
</pre>
<p>If you have any questions not covered by this documentation, please contact your account manager or our support staff at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<hr />
<h2 id="integration-methods">Integration Methods</h2>
<p>Real-Time Crawler for Baidu supports three integration methods which have their unique benefits:</p>
<ul>
<li><a href="#push-pull">Push-Pull</a>. Using this method it is now required to mainain an active connection with our endpoint to retrieve the data. Upon making a request, our system is able to automatically ping users server when the job is done (see <a href="#callback">Callback</a>). This method saves computing resources and can be scaled easily.</li>
<li><a href="#realtime">Realtime</a>. The method requires user to maintain an active connection with our endpoint in order to get the results successfully when the job is completed. This method can be implemented into one service while Push-Pull method is a two step process.</li>
<li><a href="#superapi">SuperAPI</a>. This method is very similar to Realtime but instead posting data to our endpoint, user can use HTML Cralwer as a proxy. To retrieve the data, user must set up a proxy endpoint and make GET request to a desired URL. Additional parameters must be added using headers.</li>
</ul>
<p>Our recommended data extraction method is <a href="#push-pull">Push-Pull</a>.</p>
<hr />
<h3 id="push-pull">Push-Pull</h3>
<p>This is the most simple yet the most reliable and recommended data delivery method. In Push-Pull scenario you send us a query, we return you job <code>id</code>, and once the job is done you can use that <code>id</code> to retrieve content from <code>/results</code> endpoint. You can check job completion status yourself, or you can set up a simple listener that is able to accept POST queries.</p>
<p>This way we will send you a callback message once the job is ready to be retrieved. In this particular example the results will be automatically <a href="#upload-to-storage">uploaded to your S3 bucket</a> named <code>YOUR_BUCKET_NAME</code>.</p>
<hr />
<h4 id="single-query"><strong>Single Query</strong></h4>
<p>The following endpoint will handle single queries for one keyword or URL. The API will return a confirmation message containing job information, including job <code>id</code>. You can check job completion status using that <code>id</code>, or you can ask us to ping your callback endpoint once the scraping task is finished by adding <code>callback_url</code> in the query.</p>
<pre>POST https://data.oxylabs.io/v1/queries
</pre>
<p>You need to post query parameters as data in JSON body.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json" 
 -d '{"source": "baidu_search", "domain": "com", "query": "adidas", "callback_url": "https://your.callback.url", "storage_type": "s3", "storage_url": "YOUR_BUCKET_NAME"}'
</pre>
<p>The API will respond with query information in JSON format, by printing it in response body, similar to this:</p>
<pre>{
  "callback_url": "https://your.callback.url",
  "client_id": 5,
  "created_at": "2019-10-01 00:00:01",
  "domain": "com",
  "geo_location": null,
  "id": "12345678900987654321",
  "limit": 10,
  "locale": null,
  "pages": 1,
  "render": null,
  "query": "adidas",
  "source": "baidu_search",
  "start_page": 1,
  "status": "pending",
  "storage_type": "s3",
  "storage_url": "YOUR_BUCKET_NAME/12345678900987654321.json",
  "subdomain": "www",
  "updated_at": "2019-10-01 00:00:01",
  "user_agent_type": "desktop",
  "_links": [
    {
      "rel": "self",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321",
      "method": "GET"
    },
    {
      "rel": "results",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
      "method": "GET"
    }
  ]
}
</pre>
<hr />
<h4 id="check-job-status"><strong>Check Job Status</strong></h4>
<p>If your query had <code>callback_url</code>, we will send you a message containing link to content once the scraping task is done. However, if there was no <code>callback_url</code> in the query, you will need to check job status yourself. For that you need to use the URL in <code>href</code> under <code>rel</code>:<code>self</code> in the response message you received after submitting your query to our API. It should look similar to this: <code>http://data.oxylabs.io/v1/queries/12345678900987654321</code>.</p>
<pre>GET https://data.oxylabs.io/v1/queries/{id}
</pre>
<p>Querying this link will return job information, including its <code>status</code>. There are 3 possible <code>status</code> values:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<tbody>
<tr>
<td><code>pending</code></td>
<td>The job is still in the queue and has not been completed.</td>
</tr>
<tr>
<td><code>done</code></td>
<td>The job is completed, you may retrieve the result by querying the URL in <code>href</code> under <code>rel</code>:<code>results</code> : <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code></td>
</tr>
<tr>
<td><code>faulted</code></td>
<td>There was an issue with the job and we couldn't complete it, most likely due to a server error on the target site's side.</td>
</tr>
</tbody>
</table>
</div>
<pre>curl --user user:pass1 'http://data.oxylabs.io/v1/queries/12345678900987654321'
</pre>
<p>The API will respond with query information in JSON format, by printing it in response body. Notice that job <code>status</code> has been changed to <code>done</code>. You can now retrieve content by querying <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code>.</p>
<p>You can also see that the task has been <code>updated_at</code> <code>2019-10-01 00:00:15</code> &#8211; the query took 14 seconds to complete.</p>
<pre>{
  "client_id": 5,
  "created_at": "2019-10-01 00:00:01",
  "domain": "com",
  "geo_location": null,
  "id": "12345678900987654321",
  "limit": 10,
  "locale": null,
  "pages": 1,
  "render": null,
  "query": "adidas",
  "source": "baidu_search",
  "start_page": 1,
  "status": "done",
  "subdomain": "www",
  "updated_at": "2019-10-01 00:00:15",
  "user_agent_type": "desktop",
  "_links": [
    {
      "rel": "self",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321",
      "method": "GET"
    },
    {
      "rel": "results",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
      "method": "GET"
    }
  ]
}
</pre>
<hr />
<h4 id="retrieve-job-content"><strong>Retrieve Job Content</strong></h4>
<p>Once you know the job is ready to retrieved either by checking its status or receiving a callback from us, you can GET it using the URL in <code>href</code> under <code>rel</code>:<code>results</code> in either our initial response or in callback message. It should look similar to this: <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code>.</p>
<pre>GET https://data.oxylabs.io/v1/queries/{id}/results
</pre>
<p>The results can be automatically retrieved without periodically checking job status by setting up <a href="#callback">Callback</a> service. User needs to specfy the IP or domain of the server where the Callback service is running. When our system completes a job, it will send a message to the provided IP or domain and the Callback service will download the results as described in the <a href="#callback">Callback implementation example</a>.</p>
<pre>curl --user user:pass1 'http://data.oxylabs.io/v1/queries/12345678900987654321/results'
</pre>
<p>The API will return job content:</p>
<pre>{
  "results": [
    {
      "content": "&lt;!doctype html&gt;
        CONTENT      
      ",
      "created_at": "2019-10-01 00:00:01",
      "updated_at": "2019-10-01 00:00:15",
      "page": 1,
      "url": "https://www.baidu.com/search?q=adidas&hl=en&gl=US",
      "job_id": "12345678900987654321",
      "status_code": 200
    }
  ]
}
</pre>
<hr />
<h4 id="callback"><strong>Callback</strong></h4>
<p>A callback is a <code>POST</code> request we send to your machine, informing that the data extraction task is completed and providing URL to download scraped content. This means that you no longer need to <a href="#check-job-status">check job status</a> manually. Once the data is here, we will let you know, and all you need to do now is <a href="#retrieve-job-content">retrieve it</a>.</p>
<pre># Please see code samples in Python and PHP.
</pre>
<p>Sample callback output</p>
<pre>{  
   "created_at":"2019-10-01 00:00:01",
   "updated_at":"2019-10-01 00:00:15",
   "locale":null,
   "client_id":163,
   "user_agent_type":"desktop",
   "source":"baidu_search",
   "pages":1,
   "subdomain":"www",
   "status":"done",
   "start_page":1,
   "render":null,
   "priority":0,
   "ttl":0,
   "origin":"api",
   "persist":true,
   "id":"12345678900987654321",
   "callback_url":"http://your.callback.url/",
   "query":"adidas",
   "domain":"com",
   "limit":10,
   "geo_location":null,
   {...}
   "_links":[
      {  
         "href":"https://data.oxylabs.io/v1/queries/12345678900987654321",
         "method":"GET",
         "rel":"self"
      },
      {  
         "href":"https://data.oxylabs.io/v1/queries/12345678900987654321/results",
         "method":"GET",
         "rel":"results"
      }
   ],
}
</pre>
<hr />
<h4 id="batch-query"><strong>Batch Query</strong></h4>
<p>Real-Time Crawler also supports executing multiple keywords, up to 1,000 keywords with each batch. The following endpoint will submit multiple keywords to the extraction queue.</p>
<pre>POST https://data.oxylabs.io/v1/queries/batch
</pre>
<p>You need to post query parameters as data in JSON body.</p>
<p>The system will handle every keyword as a separate request. If you provided callback URL, you will get a separate call for each keyword. Otherwise, our initial response will contain job <code>id</code>s for all keywords. For example, if you sent 50 keywords, we will return 50 unique job <code>id</code>s.</p>
<p>Important! <code>query</code> is the only parameter that can have multiple values. All other parameters are the same for that batch query.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries/batch' -H 'Content-Type: application/json'
 -d '@keywords.json'
</pre>
<p><code>keywords.json</code> content:</p>
<pre>{  
   "query":[  
      "adidas",
      "nike",
      "reebok"
   ],
   "source": "baidu_search",
   "domain": "com",
   "callback_url": "https://your.callback.url"
}
</pre>
<p>The API will respond with query information in JSON format, by printing it in response body, similar to this:</p>
<pre>{
  "queries": [
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "12345678900987654321",
      {...}
      "query": "adidas",
      "source": "baidu_search",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
          "method": "GET"
        }
      ]
    },
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "12345678901234567890",
      {...}
      "query": "nike",
      "source": "baidu_search",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/12345678901234567890/results",
          "method": "GET"
        }
      ]
    },
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "01234567899876543210",
      {...}
      "query": "reebok",
      "source": "baidu_search",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/01234567899876543210/results",
          "method": "GET"
        }
      ]
    }
  ]
}
</pre>
<hr />
<h4 id="get-notifier-ip-address-list"><strong>Get Notifier IP Address List</strong></h4>
<p>You may want to whitelist the IPs sending you callback messages or get the list of these IPs for other purposes. This can be done by <code>GET</code>ing this endpoint: <code>https://data.oxylabs.io/v1/info/callbacker_ips</code>.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/info/callbacker_ips'
</pre>
<p>The API will return the list of IPs making callback requests to your system:</p>
<pre>{
    "ips": [
        "x.x.x.x",
        "y.y.y.y"
    ]
}
</pre>
<hr />
<h4 id="upload-to-storage"><strong>Upload to Storage</strong></h4>
<p>By default RTC job results are stored in our databases. This means that you will need to query our results endpoint and retrieve content yourself. Custom storage feature allows you to store results in your own cloud storage. The advantage of this feature is that you don't have to make extra requests in order to fetch results &#8211; everything goes directly to your storage bucket.</p>
<p>We support Amazon S3 and Google Cloud Storage. If you would like to use a different type of storage, please contact your account manager to discuss the feature delivery timeline.</p>
<p id="amazon-s3"><strong>Amazon S3</strong></p>
<p>To get your job results uploaded to your Amazon S3 bucket, please set up access permissions for our service. To do that, go to <code>https://s3.console.aws.amazon.com/ &gt; S3 &gt; Storage &gt; Bucket Name (if don't have one, create new) &gt; Permissions &gt; Bucket Policy</code></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8268" src="https://www.proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Upload-to-Storage.png" alt="Oxylabs Real-Time Crawler for Baidu Upload to Storage" width="485" height="333" srcset="https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Upload-to-Storage.png 485w, https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Upload-to-Storage-300x206.png 300w" sizes="(max-width: 485px) 100vw, 485px" /></p>
<p>You can find bucket policy in this <a class="custom_link" href="https://docs.oxylabs.io/resources/s3_bucket_policy.json" target="_blank" rel="noopener">JSON</a> or in code sample area on the right. Don't forget to change bucket name under <code>YOUR_BUCKET_NAME</code>. This policy allows us to write to your bucket, give access to uploaded files to you, and know bucket location.</p>
<p id="google-cloud-storage"><strong>Google Cloud Storage</strong></p>
<p>To get your job results uploaded to your Google Cloud Storage bucket, please set up special permissions for our service. To do that, please create a custom role with the <code>storage.objects.create</code> permission and assign it to the Oxylabs service account email <code>oxyserps-storage@oxyserps-storage.iam.gserviceaccount.com</code>.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8270" src="https://www.proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Upload-to-Storage1.png" alt="Oxylabs Real-Time Crawler for Baidu Upload to Storage1" width="479" height="310" srcset="https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Upload-to-Storage1.png 479w, https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Upload-to-Storage1-300x194.png 300w" sizes="(max-width: 479px) 100vw, 479px" /></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8269" src="https://www.proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Upload-to-Storage2.png" alt="Oxylabs Real-Time Crawler for Baidu Upload to Storage2" width="482" height="670" srcset="https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Upload-to-Storage2.png 482w, https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Upload-to-Storage2-216x300.png 216w" sizes="(max-width: 482px) 100vw, 482px" /></p>
<p id="usage"><strong>Usage</strong></p>
<p>To use this feature, please specify two additional parameters in your requests. Learn more <a href="#direct">here</a>.</p>
<p>The upload path looks like this: <code>YOUR_BUCKET_NAME/job_ID.json</code>. You will find job ID in response body that you receive from us after submitting a request. In <a href="#single-query">this example</a> job ID is <code>12345678900987654321</code>.</p>
<hr />
<h3 id="realtime">Realtime</h3>
<p>The data submission is the same as in Push-Pull method, but Realtime case we will return the content on open connection. You send us a query, the connection remains open, we retrieve the content and bring it to you. The endpoint that handles that is this:</p>
<pre>POST https://realtime.oxylabs.io/v1/queries
</pre>
<p>There is a timeout limit of 150 seconds for open connections, therefore in rare cases of heavy load we may not be able to ensure the data gets to you.</p>
<p>You need to post query parameters as data in JSON body. Please see example for more details.</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json" 
 -d '{"source": "baidu_search", "domain": "com", "query": "adidas"}'
</pre>
<p>Example response body that will be returned on open connection:</p>
<pre>{
  "results": [
    {
      "content": "
      CONTENT
      "
      "created_at": "2019-10-01 00:00:01",
      "updated_at": "2019-10-01 00:00:15",
      "id": null,
      "page": 1,
      "url": "https://www.baidu.com/search?q=adidas&hl=en&gl=US",
      "job_id": "12345678900987654321",
      "status_code": 200
    }
  ]
}
</pre>
<hr />
<h3 id="superapi">SuperAPI</h3>
<p>If you ever used regular proxies for data scraping, integrating SuperAPI delivery method will be a breeze. All that needs to be done is to use our entry node as proxy, authorize with Real-Time Crawler credentials, and ignore certificates. In <code>cURL</code> it's <code>-k</code> or <code>--insecure</code>. Your data will reach you on open connection.</p>
<pre>GET realtime.oxylabs.io:60000
</pre>
<p>SuperAPI only supports a handful of parameters since it <strong>only works with <a href="#direct">Direct</a> data source</strong> where full URL is provided. These parameters should be sent as headers. This is a list of accepted parameters:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<tbody>
<tr>
<td><code>X-OxySERPs-User-Agent-Type</code></td>
<td>There is no way to indicate a specific User-Agent, but you can let us know which browser and platform to use. A list of supported User-Agents can be found <a href="#user-agent">here</a>.</td>
</tr>
</tbody>
</table>
</div>
<p>If you need help setting up SuperAPI, drop a line at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<pre>curl -k -x realtime.oxylabs.io:60000 -U user:pass1 -H "X-OxySERPs-User-Agent-Type: desktop_chrome" "https://www.baidu.com/search?q=adidas"
</pre>
<hr />
<h2 id="data-sources">Data Sources</h2>
<p>There are multiple approaches how to retrieve data from Baidu using Real-Time Crawler. You can give us full URL via <a href="#direct">Direct</a>, or you can specify parameters via specifically built data sources, such as <a href="#search">Search</a>, Shopping Product or Images.</p>
<p>If you are unsure which way to choose, drop us a line at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a> or contact your account manager.</p>
<hr />
<h3 id="direct">Direct</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8272 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Direct.png" alt="Oxylabs Real-Time Crawler for Baidu Direct" width="425" height="29" srcset="https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Direct.png 425w, https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Direct-300x20.png 300w" sizes="(max-width: 425px) 100vw, 425px" /></p>
<p><code>baidu</code> source is designed to retrieve content of direct URLs of various Baidu pages. This means that instead of sending multiple parameters, you can provide us with a direct URL to required Baidu page. We do not strip any parameters or alter your URLs in any other way.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">baidu</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">url</td>
<td style="font-weight: 400;" width="72">Direct URL (link) to Baidu page</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found<a href="#user-agent"> here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the <a href="#upload-to-storage">Upload to Storage </a>page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>In this example the API will retrieve Baidu search for keyword <code>adidas</code> in Push-Pull method:</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "baidu", "url": "http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&ch=&tn=baidu&bar=&wd=adidas"}'
</pre>
<p>Here is the same example in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "baidu", "url": "http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&ch=&tn=baidu&bar=&wd=adidas"}'
</pre>
<p>And via SuperAPI:</p>
<pre>curl -k -x realtime.oxylabs.io:60000 -U user:pass1 "http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&ch=&tn=baidu&bar=&wd=adidas"
</pre>
<hr />
<h3 id="search">Search</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8273 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Search.png" alt="Oxylabs Real-Time Crawler for Baidu Search" width="425" height="26" srcset="https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Search.png 425w, https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-Real-Time-Crawler-for-Baidu-Search-300x18.png 300w" sizes="(max-width: 425px) 100vw, 425px" /></p>
<p><code>baidu_search</code> source is designed to retrieve Baidu Search results (SERP) in HTML format.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="72"><strong>Description</strong></td>
<td style="font-weight: 400;" width="72"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">baidu_search</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">domain</td>
<td style="font-weight: 400;" width="72">Domain localization</td>
<td style="font-weight: 400;" width="72">com</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">query</td>
<td style="font-weight: 400;" width="72">UTF-encoded keyword</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">start_page</td>
<td style="font-weight: 400;" width="72">Starting page number</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">pages</td>
<td style="font-weight: 400;" width="72">Number of pages to retrieve</td>
<td style="font-weight: 400;" width="72">1</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">limit</td>
<td style="font-weight: 400;" width="72">Number of results to retrieve in each page</td>
<td style="font-weight: 400;" width="72">10</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found<a href="#user-agent"> here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the <a href="#upload-to-storage">Upload to Storage</a> page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>Real-Time Crawler makes request to baidu.com to retrieve search results pages from number 11 to number 20 for keyword adidas. Real-Time Crawler will post the download URL to raw HTML page output to your.callback.url once the data retrieval task is successfully finished.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "baidu_search", "domain": "com", "query": "adidas", "start_page": 11, "pages": 10, "callback_url": "https://your.callback.url"}'
</pre>
<p>And here is the same example in Realtime:</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json"
 -d '{"source": "baidu_search", "domain": "com", "query": "adidas", "start_page": 11, "pages": 10, "callback_url": "https://your.callback.url"}'
</pre>
<hr />
<h2 id="parameter-values">Parameter Values</h2>
<h3 id="user-agent">User-Agent</h3>
<p>Download full list of <code>user_agent_type</code> values in JSON <a class="custom_link" href="https://docs.oxylabs.io/resources/user_agent_type.json" target="_blank" rel="noopener">here</a>.</p>
<pre>[
  {
    "user_agent_type": "desktop",
    "description": "Random desktop browser User-Agent"
  },
  {
    "user_agent_type": "desktop_firefox",
    "description": "Random User-Agent of one of the latest versions of desktop Firefox"
  },
  {
    "user_agent_type": "desktop_chrome",
    "description": "Random User-Agent of one of the latest versions of desktop Chrome"
  },
  {
    "user_agent_type": "desktop_opera",
    "description": "Random User-Agent of one of the latest versions of desktop Opera"
  },
  {
    "user_agent_type": "desktop_edge",
    "description": "Random User-Agent of one of the latest versions of desktop Edge"
  },
  {
    "user_agent_type": "desktop_safari",
    "description": "Random User-Agent of one of the latest versions of desktop Safari"
  },
  {
    "user_agent_type": "mobile",
    "description": "Random mobile browser User-Agent"
  },
  {
    "user_agent_type": "mobile_android",
    "description": "Random User-Agent of one of the latest versions of Android browser"
  },
  {
    "user_agent_type": "mobile_ios",
    "description": "Random User-Agent of one of the latest versions of iPhone browser"
  },
  {
    "user_agent_type": "tablet",
    "description": "Random tablet browser User-Agent"
  },
  {
    "user_agent_type": "tablet_android",
    "description": "Random User-Agent of one of the latest versions of Android tablet"
  },
  {
    "user_agent_type": "tablet_ios",
    "description": "Random User-Agent of one of the latest versions of iPad tablet"
  }
]
</pre>
<hr />
<h2 id="account-status">Account Status</h2>
<h3 id="usage-statistics">Usage Statistics</h3>
<p>You can find your usage statistics by querying the following endpoint:</p>
<pre>GET https://data.oxylabs.io/v1/stats
</pre>
<p>By default the API will return all time usage statistics. Adding <code>?group_by=month</code> will return monthly stats, while <code>?group_by=day</code> will return daily numbers.</p>
<p>This query will return all time statistics. You can find your daily and monthly usage by adding either <code>?group_by=day</code> or <code>?group_by=month</code></p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/stats'
</pre>
<p>Sample output:</p>
<pre>{
    "data": {
        "sources": [
            {
                "realtime_results_count": "90",
                "results_count": "10",
                "title": "baidu"
            },
            {
                "realtime_results_count": "19",
                "results_count": "87",
                "title": "baidu_search"
            }
        ]
    },
    "meta": {
        "group_by": null
    }
}
</pre>
<hr />
<h3 id="limits">Limits</h3>
<p>The following endpoint will give your monthly commitment information as well as how much has already been used:</p>
<pre>GET https://data.oxylabs.io/v1/stats/limits
</pre>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/stats/limits'
</pre>
<p>Sample output:</p>
<pre>{
    "monthly_requests_commitment": 4500000,
    "used_requests": 985000
}
</pre>
<hr />
<h2 id="response-codes">Response Codes</h2>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Code</th>
<th>Status</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>204</code></td>
<td>No Content</td>
<td>You are trying to retrieve a job that has not been completed yet.</td>
</tr>
<tr>
<td><code>400</code></td>
<td>Multiple error messages</td>
<td>Bad request structure, could be a misspelled parameter or invalid value. Response body will have more specific error message.</td>
</tr>
<tr>
<td><code>401</code></td>
<td>&#8216;Authorization header not provided' / &#8216;Invalid authorization header' / &#8216;Client not found'</td>
<td>Missing authorization header or incorrect login credentials.</td>
</tr>
<tr>
<td><code>403</code></td>
<td>Forbidden</td>
<td>Your account does not have access to this resource.</td>
</tr>
<tr>
<td><code>404</code></td>
<td>Not Found</td>
<td>Job ID you are looking for is no longer available.</td>
</tr>
<tr>
<td><code>429</code></td>
<td>Too many requests</td>
<td>Exceeded rate limit. Please contact your account manager to increase limits.</td>
</tr>
<tr>
<td><code>500</code></td>
<td>Unknown Error</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>524</code></td>
<td>Timeout</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>612</code></td>
<td>Undefined Internal Error</td>
<td>Something went wrong and we failed the job you submitted. You can try again at no extra cost, as we don't charge you for <code>faulted</code> jobs. If that doesn't work, give us a shout.</td>
</tr>
<tr>
<td><code>613</code></td>
<td>Faulted After Too Many Retries</td>
<td>We tried scraping the job you submitted, but gave up after reaching our retry limit. You can try again at no extra cost, as we don't charge you for <code>faulted</code> jobs. If that doesn't work, give us a shout.</td>
</tr>
</tbody>
</table>
</div>
<p>Cloud storage upload response codes:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Code</th>
<th>Status</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>10001</code></td>
<td>Unexpected Exception</td>
<td>Something terribly wrong happened. We probably know about this already and are fixing it. Let us know anyway.</td>
</tr>
<tr>
<td><code>13000</code></td>
<td>Upload Success</td>
<td>All good!</td>
</tr>
<tr>
<td><code>13001</code></td>
<td>Upload Failed</td>
<td>We couldn't upload job results your bucket.</td>
</tr>
<tr>
<td><code>13102</code></td>
<td>No Such Path</td>
<td>We couldn't find a bucket with such name. Please double check.</td>
</tr>
<tr>
<td><code>13103</code></td>
<td>Access Denied</td>
<td>Bucket doesn't have required permissions. To find out how to give us required access, see <a href="#upload-to-storage">here</a>.</td>
</tr>
</tbody>
</table>
</div>
<hr />
<h4>References</h4>
<ul>
<li><a href="https://docs.oxylabs.io/rtc/source/baidu/index.html" target="_blank" rel="nofollow noopener">https://docs.oxylabs.io/rtc/source/baidu/index.html</a></li>
<li><a href="https://docs.oxylabs.io/rtc/index.html" target="_blank" rel="nofollow noopener">https://docs.oxylabs.io/rtc/index.html</a></li>
</ul>
<p>&nbsp;</p>
<hr />
<blockquote><p><strong>Disclaimer:</strong> This part of the content is mainly from the merchant. If the merchant does not want it to be displayed on my website, please <a href="https://www.proxysp.com/contact-us/">contact us</a> to delete your content.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://proxysp.com/oxylabs-baidu-real-time-crawler/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7635</post-id>	</item>
		<item>
		<title>How to Use HTML Crawler API [Part 5]: OxyLabs Real-Time Crawler for Other Sites</title>
		<link>https://proxysp.com/oxylabs-html-crawler-api/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oxylabs-html-crawler-api</link>
					<comments>https://proxysp.com/oxylabs-html-crawler-api/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
				<category><![CDATA[How to Use OxyLabs Proxy (OxyLabs User Manual Navigation)]]></category>
		<guid isPermaLink="false">https://www.proxysp.com/?p=7636</guid>

					<description><![CDATA[Do you know how to use OxyLabs Real-time Crawler for web pages? This is the most comprehensive introduction from OxyLabs official. Quick Start HTML Crawler API &#8230;<p class="read-more"> <a class="ast-button" href="https://proxysp.com/oxylabs-html-crawler-api/"> <span class="screen-reader-text">How to Use HTML Crawler API [Part 5]: OxyLabs Real-Time Crawler for Other Sites</span> Read More &#187;</a></p>]]></description>
										<content:encoded><![CDATA[<blockquote><p>Do you know how to use OxyLabs Real-time Crawler for web pages? This is the most comprehensive introduction from OxyLabs official.</p></blockquote>
<h2 id="quick-start">Quick Start</h2>
<p>HTML Crawler API is built to help you in your heavy-duty data retrieval operations. You can use HTML Crawler API to access various public pages. It enables effortless web data extraction without any delays or errors.</p>
<p>HTML Crawler API uses <a class="custom_link" href="https://en.wikipedia.org/wiki/Basic_access_authentication" target="_blank" rel="nofollow noopener">basic HTTP authentication</a> that requires sending username and password.</p>
<p>This is by far the fastest way to start using HTML Crawler API. You will make a request to <code>https://ip.oxylabs.io</code> using <a href="#realtime">Realtime</a> integration method. Don't forget to replace <code>USERNAME</code> and <code>PASSWORD</code> with your proxy user credentials.</p>
<pre>curl --user "USERNAME:PASSWORD" 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json" -d '{"source": "universal", "url": "https://ip.oxylabs.io"}'
</pre>
<p>If you have any questions not covered by this documentation, please contact your account manager or our support staff at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<hr />
<div class="inside-code">
<h2 id="integration-methods">Integration Methods</h2>
<p>HTML Crawler API supports three integration methods which have their unique benefits:</p>
<ul>
<li><a href="#push-pull">Push-Pull</a>. Using this method it is now required to mainain an active connection with our endpoint to retrieve the data. Upon making a request, our system is able to automatically ping users server when the job is done (see <a href="#callback">Callback</a>). This method saves computing resources and can be scaled easily.</li>
<li><a href="#realtime">Realtime</a>. The method requires user to maintain an active connection with our endpoint in order to get the results successfully when the job is completed. This method can be implemented into one service while Push-Pull method is a two step process.</li>
<li><a href="#superapi">SuperAPI</a>. This method is very similar to Realtime but instead posting data to our endpoint, user can use HTML Cralwer as a proxy. To retrieve the data, user must set up a proxy endpoint and make GET request to a desired URL. Additional parameters must be added using headers.</li>
</ul>
<p>Our recommended data extraction method is <a href="#push-pull">Push-Pull</a>.</p>
<hr />
</div>
<h3 id="push-pull">Push-Pull</h3>
<p>This is the most simple yet the most reliable and recommended data delivery method. In Push-Pull scenario you send us a query, we return you job <code>id</code>, and once the job is done you can use that <code>id</code> to retrieve content from <code>/results</code> endpoint. You can check job completion status yourself, or you can set up a simple listener that is able to accept POST queries.</p>
<p>This way, we will send you a callback message once the job is ready to be retrieved. In this particular example the results will be automatically <a href="#upload-to-storage">uploaded to your S3 bucket</a> named <code>YOUR_BUCKET_NAME</code>.</p>
<hr />
<h4 id="single-query"><strong>Single Query</strong></h4>
<p>The following endpoint will handle single queries for one keyword or URL. The API will return a confirmation message containing job information, including job <code>id</code>. You can check job completion status using that <code>id</code>, or you can ask us to ping your callback endpoint once the scraping task is finished by adding <code>callback_url</code> in the query.</p>
<pre>POST https://data.oxylabs.io/v1/queries
</pre>
<p>You need to post query parameters as data in the JSON body.</p>
<pre>curl --user user:pass1\
'https://data.oxylabs.io/v1/queries' \
-H "Content-Type: application/json" \
-d '{"source": "universal", "url": "https://stackoverflow.com/questions/tagged/python", "callback_url": "https://your.callback.url", "storage_type": "s3", "storage_url": "YOUR_BUCKET_NAME"}'
</pre>
<p>The API will respond with query information in JSON format, by printing it in the response body, similar to this:</p>
<pre>{
  "callback_url": "https://your.callback.url",
  "client_id": 5,
  "created_at": "2019-10-01 00:00:01",
  "domain": "com",
  "geo_location": null,
  "id": "12345678900987654321",
  "limit": 10,
  "locale": null,
  "pages": 1,
  "parse": false,
  "render": null,
  "url": "https://stackoverflow.com/questions/tagged/python",
  "source": "universal",
  "start_page": 1,
  "status": "pending",
  "storage_type": "s3",
  "storage_url": "YOUR_BUCKET_NAME/12345678900987654321.json",
  "subdomain": "www",
  "updated_at": "2019-10-01 00:00:01",
  "user_agent_type": "desktop",
  "_links": [
    {
      "rel": "self",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321",
      "method": "GET"
    },
    {
      "rel": "results",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
      "method": "GET"
    }
  ]
}
</pre>
<hr />
<h4 id="check-job-status"><strong>Check Job Status</strong></h4>
<p>If your query had a <code>callback_url</code>, we will send you a message containing a link to the content once the scraping task is done. However, if there was no <code>callback_url</code> in the query, you will need to check the job status yourself. For that, you need to use the URL in <code>href</code> under <code>rel</code>:<code>self</code> in the response message you received after submitting your query to our API. It should look similar to this: <code>http://data.oxylabs.io/v1/queries/12345678900987654321</code>.</p>
<pre>GET https://data.oxylabs.io/v1/queries/{id}
</pre>
<p>Querying this link will return the job information, including its <code>status</code>. There are three possible <code>status</code> values:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<tbody>
<tr>
<td><code>pending</code></td>
<td>The job is still in the queue and has not been completed.</td>
</tr>
<tr>
<td><code>done</code></td>
<td>The job is completed, you may retrieve the result by querying the URL in <code>href</code> under <code>rel</code>:<code>results</code> : <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code></td>
</tr>
<tr>
<td><code>faulted</code></td>
<td>There was an issue with the job, and we could not complete it, most likely due to a server error on the target site's side.</td>
</tr>
</tbody>
</table>
</div>
<pre>curl --user user:pass1 'http://data.oxylabs.io/v1/queries/12345678900987654321'
</pre>
<p>The API will respond with query information in JSON format, by printing it in the response body. Notice that job <code>status</code> has been changed to <code>done</code>. You can now retrieve content by querying <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code>.</p>
<p>You can also see that the task has been <code>updated_at</code> <code>2019-10-01 00:00:15</code> &#8211; the query took 14 seconds to complete.</p>
<pre>{
  "client_id": 5,
  "created_at": "2019-10-01 00:00:01",
  "domain": "com",
  "geo_location": null,
  "id": "12345678900987654321",
  "limit": 10,
  "locale": null,
  "pages": 1,
  "parse": false,
  "render": null,
  "url": "sofa",
  "source": "universal",
  "start_page": 1,
  "status": "done",
  "subdomain": "www",
  "updated_at": "2019-10-01 00:00:15",
  "user_agent_type": "desktop",
  "_links": [
    {
      "rel": "self",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321",
      "method": "GET"
    },
    {
      "rel": "results",
      "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
      "method": "GET"
    }
  ]
}
</pre>
<hr />
<h4 id="retrieve-job-content"><strong>Retrieve Job Content</strong></h4>
<p>Once you know the job is ready to be retrieved by checking its status, you can GET it using the URL in <code>href</code> under <code>rel</code>:<code>results</code> in our initial response. It should look similar to this: <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code>.</p>
<pre>GET https://data.oxylabs.io/v1/queries/{id}/results
</pre>
<p>The results can be automatically retrieved without periodically checking job status by setting up <a href="#callback">Callback</a> service. User needs to specfy the IP or domain of the server where the Callback service is running. When our system completes a job, it will send a message to the provided IP or domain and the Callback service will download the results as described in the <a href="#callback">Callback implementation example</a>.</p>
<pre>curl --user user:pass1 'http://data.oxylabs.io/v1/queries/12345678900987654321/results'
</pre>
<p>The API will return job content:</p>
<pre>{
  "results": [
    {
      "content": "&lt;!doctype html&gt;
        CONTENT      
      ",
      "created_at": "2019-10-01 00:00:01",
      "updated_at": "2019-10-01 00:00:15",
      "page": 1,
      "url": "https://stackoverflow.com/questions/tagged/python",
      "job_id": "12345678900987654321",
      "status_code": 200
    }
  ]
}
</pre>
<hr />
<h4 id="callback"><strong>Callback</strong></h4>
<p>A callback is a <code>POST</code> request we send to your machine, informing that the data extraction task is completed and providing URL to download scraped content. This means that you no longer need to <a href="#check-job-status">check job status</a> manually. Once the data is here, we will let you know, and all you need to do now is <a href="#retrieve-job-content">retrieve it</a>.</p>
<pre># Please see the code samples in Python and PHP.
</pre>
<p>Sample callback output</p>
<pre>{  
   "created_at":"2019-10-01 00:00:01",
   "updated_at":"2019-10-01 00:00:15",
   "locale":null,
   "client_id":163,
   "user_agent_type":"desktop",
   "source":"universal",
   "pages":1,
   "subdomain":"www",
   "status":"done",
   "start_page":1,
   "parse":0,
   "render":null,
   "priority":0,
   "ttl":0,
   "origin":"api",
   "persist":true,
   "id":"12345678900987654321",
   "callback_url":"http://your.callback.url/",
   "url":"https://stackoverflow.com/questions/tagged/python",
   "domain":"de",
   "limit":10,
   "geo_location":null,
   {...}
   "_links":[
      {  
         "href":"https://data.oxylabs.io/v1/queries/12345678900987654321",
         "method":"GET",
         "rel":"self"
      },
      {  
         "href":"https://data.oxylabs.io/v1/queries/12345678900987654321/results",
         "method":"GET",
         "rel":"results"
      }
   ],
}
</pre>
<hr />
<h4 id="batch-query"><strong>Batch Query</strong></h4>
<p>HTML Crawler API also supports executing multiple keywords, up to 1,000 keywords with each batch. The following endpoint will submit multiple keywords to the extraction queue.</p>
<pre>POST https://data.oxylabs.io/v1/queries/batch
</pre>
<p>You need to post query parameters as data in the JSON body.</p>
<p>The system will handle every keyword as a separate request. If you provided a callback URL, you will get a separate call for each keyword. Otherwise, our initial response will contain job <code>id</code>s for all keywords. For example, if you sent 50 keywords, we will return 50 unique job <code>id</code>s.</p>
<p>Important! <code>query</code> is the only parameter that can have multiple values. All other parameters are the same for that batch query.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/queries/batch' -H 'Content-Type: application/json' \
 -d '@keywords.json'
</pre>
<p><code>keywords.json</code> content:</p>
<pre>{  
   "url":[  
      "https://stackoverflow.com/questions/tagged/python",
      "https://stackoverflow.com/questions/tagged/golang",
      "https://stackoverflow.com/questions/tagged/php"
   ],
   "source": "universal",
   "callback_url": "https://your.callback.url"
}
</pre>
<p>The API will respond with query information in JSON format, by printing it in the response body, similar to this:</p>
<pre>{
  "queries": [
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "12345678900987654321",
      {...}
      "url": "https://stackoverflow.com/questions/tagged/python",
      "source": "universal",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/12345678900987654321/results",
          "method": "GET"
        }
      ]
    },
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "12345678901234567890",
      {...}
      "url": "https://stackoverflow.com/questions/tagged/golang",
      "source": "universal",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/12345678901234567890/results",
          "method": "GET"
        }
      ]
    },
    {
      "callback_url": "https://your.callback.url",
      {...}
      "created_at": "2019-10-01 00:00:01",
      "domain": "com",
      "id": "01234567899876543210",
      {...}
      "url": "https://stackoverflow.com/questions/tagged/php",
      "source": "universal",
      {...}
          "rel": "results",
          "href": "http://data.oxylabs.io/v1/queries/01234567899876543210/results",
          "method": "GET"
        }
      ]
    }
  ]
}
</pre>
<hr />
<h4 id="get-notifier-ip-address-list"><strong>Get Notifier IP Address List</strong></h4>
<p>You may want to whitelist the IPs sending you callback messages or get the list of these IPs for other purposes. This can be done by <code>GET</code>ing this endpoint: <code>https://data.oxylabs.io/v1/info/callbacker_ips</code>.</p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/info/callbacker_ips'
</pre>
<p>The API will return the list of IPs making callback requests to your system:</p>
<pre>{
    "ips": [
        "x.x.x.x",
        "y.y.y.y"
    ]
}
</pre>
<hr />
<h4 id="upload-to-storage"><strong>Upload to Storage</strong></h4>
<p>By default RTC job results are stored in our databases. This means that you will need to query our results endpoint and retrieve content yourself. Custom storage feature allows you to store results in your own cloud storage. The advantage of this feature is that you don't have to make extra requests in order to fetch results &#8211; everything goes directly to your storage bucket.</p>
<p>We support Amazon S3 and Google Cloud Storage. If you would like to use a different type of storage, please contact your account manager to discuss the feature delivery timeline.</p>
<p id="amazon-s3"><strong>Amazon S3</strong></p>
<p>To get your job results uploaded to your Amazon S3 bucket, please set up access permissions for our service. To do that, go to <code>https://s3.console.aws.amazon.com/ &gt; S3 &gt; Storage &gt; Bucket Name (if don't have one, create new) &gt; Permissions &gt; Bucket Policy</code></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8280" src="https://www.proxysp.com/wp-content/uploads/2021/09/Oxylabs-HTML-Crawler-API-Upload-to-Storage1.png" alt="Oxylabs HTML Crawler API Upload to Storage1" width="482" height="323" srcset="https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-HTML-Crawler-API-Upload-to-Storage1.png 482w, https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-HTML-Crawler-API-Upload-to-Storage1-300x201.png 300w" sizes="(max-width: 482px) 100vw, 482px" /></p>
<p>You can find bucket policy in this <a class="custom_link" href="https://docs.oxylabs.io/resources/s3_bucket_policy.json" target="_blank" rel="noopener">JSON</a> or in code sample area on the right. Don't forget to change bucket name under <code>YOUR_BUCKET_NAME</code>. This policy allows us to write to your bucket, give access to uploaded files to you, and know bucket location.</p>
<p id="google-cloud-storage"><strong>Google Cloud Storage</strong></p>
<p>To get your job results uploaded to your Google Cloud Storage bucket, please set up special permissions for our service. To do that, please create a custom role with the <code>storage.objects.create</code> permission and assign it to the Oxylabs service account email <code>oxyserps-storage@oxyserps-storage.iam.gserviceaccount.com</code>.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8281" src="https://www.proxysp.com/wp-content/uploads/2021/09/Oxylabs-HTML-Crawler-API-Upload-to-Storage2.png" alt="Oxylabs HTML Crawler API Upload to Storage2" width="483" height="306" srcset="https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-HTML-Crawler-API-Upload-to-Storage2.png 483w, https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-HTML-Crawler-API-Upload-to-Storage2-300x190.png 300w" sizes="(max-width: 483px) 100vw, 483px" /></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8282" src="https://www.proxysp.com/wp-content/uploads/2021/09/Oxylabs-HTML-Crawler-API-Upload-to-Storage3.png" alt="Oxylabs HTML Crawler API Upload to Storage3" width="486" height="668" srcset="https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-HTML-Crawler-API-Upload-to-Storage3.png 486w, https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-HTML-Crawler-API-Upload-to-Storage3-218x300.png 218w" sizes="(max-width: 486px) 100vw, 486px" /></p>
<p id="usage"><strong>Usage</strong></p>
<p>To use this feature, please specify two additional parameters in your requests. Learn more <a href="#direct">here</a>.</p>
<p>The upload path looks like this: <code>YOUR_BUCKET_NAME/job_ID.json</code>. You will find job ID in response body that you receive from us after submitting a request. In <a href="#single-query">this example</a> job ID is <code>12345678900987654321</code>.</p>
<pre>{
    "Version": "2012-10-17",
    "Id": "Policy1577442634787",
    "Statement": [
        {
            "Sid": "Stmt1577442633719",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::324311890426:user/oxylabs.s3.uploader"
            },
            "Action": "s3:GetBucketLocation",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME"
        },
        {
            "Sid": "Stmt1577442633719",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::324311890426:user/oxylabs.s3.uploader"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
        }
    ]
}
</pre>
<hr />
<h3 id="realtime">Realtime</h3>
<p>The data submission is the same as in Push-Pull method, but with Realtime, we will return the content on open connection. You send us a query, the connection remains open, we retrieve the content, and bring it to you. The endpoint that handles that is this:</p>
<pre>POST https://realtime.oxylabs.io/v1/queries
</pre>
<p>The timeout limit for open connections is 100 seconds. Therefore, in rare cases of heavy load, we may not be able to ensure the data gets to you.</p>
<p>You need to post query parameters as data in the JSON body. Please see an example for more details.</p>
<pre>curl --user user:pass1 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json" \
 -d '{"source": "universal", "url": "https://stackoverflow.com/questions/tagged/python"}'
</pre>
<p>Example response body that will be returned on open connection:</p>
<pre>{
  "results": [
    {
      "content": "
      CONTENT
      "
      "created_at": "2019-10-01 00:00:01",
      "updated_at": "2019-10-01 00:00:15",
      "id": null,
      "page": 1,
      "url": "https://stackoverflow.com/questions/tagged/python",
      "job_id": "12345678900987654321",
      "status_code": 200
    }
  ]
}
</pre>
<hr />
<h3 id="superapi">SuperAPI</h3>
<p>If you have ever used regular proxies for data scraping, integrating SuperAPI delivery method will be a breeze. You simply need to use our entry node as proxy, authorize with HTML Crawler API credentials, and ignore certificates. In <code>cURL</code> it's <code>-k</code> or <code>--insecure</code>. Your data will reach you on open connection.</p>
<pre>GET realtime.oxylabs.io:60000
</pre>
<p>SuperAPI only supports a handful of parameters since it <strong>only works with <a href="#direct">Direct</a> data source</strong> where a full URL is provided. These parameters should be sent as headers. This is a list of accepted parameters:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<tbody>
<tr>
<td><code>X-OxySERPs-User-Agent-Type</code></td>
<td>There is no way to indicate a specific User-Agent, but you can let us know which browser and platform to use. A list of supported User-Agents can be found <a href="#user_agent_type">here</a>.</td>
</tr>
</tbody>
</table>
</div>
<p>If you need help setting up SuperAPI, get in touch with us at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<pre>curl -k \
-x realtime.oxylabs.io:60000 \
-U user:pass1 \
-H "X-OxySERPs-User-Agent-Type: desktop_chrome" \
"https://stackoverflow.com/questions/tagged/python"
</pre>
<hr />
<h2 id="content-type">Content Type</h2>
<p>HTML Crawler API returns <strong>raw HTML</strong>.</p>
<hr />
<h3 id="download-images">Download Images</h3>
<p>It is possible to download images via HTML Crawler API. If you are doing that through SuperAPI, you can simply save the output to image extension. For example:</p>
<p><code>curl -k -x realtime.oxylabs.io:60000 -U user:pass1 "https://example.com/image.jpg" &gt;&gt; image.jpg</code></p>
<p>If you are using <a href="#push-pull">Push-Pull</a> or <a href="#realtime">Realtime</a> methods, you will need to add <code>content_encoding</code> parameter with a value of <code>base64</code>. Once you receive the results, you then need to decode encoded data from <code>content</code> into bytes and save it as an image file. Please find an example in Python on the right.</p>
<hr />
<h2 id="data-sources">Data Sources</h2>
<p>HTML Crawler API accepts URLs, along with additional parameters, such as User-Agent type, proxy location, and others. See this method, which we call <a href="#direct">Direct</a>, described below.</p>
<p>HTML Crawler API is able to render JavaScript when scraping. This enables you to get more data from the web page and get screenshots.</p>
<p>If you are unsure about any part of the documentation, drop us a line at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a> or contact your account manager.</p>
<hr />
<h3 id="direct">Direct</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8283 alignnone" src="https://www.proxysp.com/wp-content/uploads/2021/09/Oxylabs-HTML-Crawler-API-Direct.png" alt="Oxylabs HTML Crawler API Direct" width="429" height="25" srcset="https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-HTML-Crawler-API-Direct.png 429w, https://proxysp.com/wp-content/uploads/2021/09/Oxylabs-HTML-Crawler-API-Direct-300x17.png 300w" sizes="(max-width: 429px) 100vw, 429px" /></p>
<p><code>universal</code> source is designed to retrieve the contents of any URL on the internet. <code>POST</code>-ing the parameters in JSON format to the following endpoint will submit the specified URL to the extraction queue.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72">Parameter</td>
<td style="font-weight: 400;" width="72">Description</td>
<td style="font-weight: 400;" width="72">Default Value</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">universal</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">url</td>
<td style="font-weight: 400;" width="72">Direct URL (link) to Universal page</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found <a href="#user_agent_type">here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">Geo location of proxy used to retrieve the data. The full list of supported locations can be found <a href="#geo_location">here.</a></td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">locale</td>
<td style="font-weight: 400;" width="72">Locale, as expected in Accept-Language header.</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">render</td>
<td style="font-weight: 400;" width="72">Enables JavaScript rendering. Use it when the target requires JavaScript to load content. Only works via Push-Pull (a.k.a. Callback) method. There are two available values for this parameter: html(get raw output) and png (get a Base64-encoded screenshot).</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">content_encoding</td>
<td style="font-weight: 400;" width="72">Add this parameter if you are downloading images. Learn more <a href="#download-images">here.</a></td>
<td style="font-weight: 400;" width="72">base64</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Base64-encoded POST request body. It is only useful if http_method is set to post.</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">content</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Pass your own cookies.</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">cookies</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Indicate whether you would like the scraper to follow redirects (3xx responses with a destination URL) to get the contents of the URL at the end of the redirect chain.</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">follow_redirects</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Pass your own headers.</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">headers</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Set it to post if you would like to make a POST request to your target URL via Universal scraper.</td>
<td style="font-weight: 400;" rowspan="2" width="72">get</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">http_method</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">If you want to use the same proxy with multiple requests, you can do so by using this parameter. Just set your session to any string you like, and we will assign a proxy to this ID and keep it for up to 10 minutes. After that, if you make another request with the same session ID, a new proxy will be assigned to that particular session ID.</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">session_id</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Define a custom HTTP response code (or a few of them), upon which we should consider the scrape successful and return the content to you. May be useful if you want us to return the 503 error page or in some other non-standard cases.</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">successful_status_codes</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. We support Amazon S3 and Google Cloud Storage. The storage_type parameter values for these storage providers are, correspondingly, s3 and gcs. The full implementation can be found on the <a href="#upload-to-storage">Upload to Storage</a> page. This feature only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your storage bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" colspan="3" width="216">   &#8211; required parameter</td>
</tr>
</tbody>
</table>
</div>
<p>In this example, the API will retrieve a universal product page in Push-Pull method. All available parameters are included (though not always necessary or compatible within the same request), to give you an idea on how to format your requests:</p>
<pre>curl --user user:pass1 \
'https://data.oxylabs.io/v1/queries' \
-H "Content-Type: application/json" \
 -d '{"source":"universal","url":"https://stackoverflow.com/questions/tagged/python","user_agent_type":"mobile","context":[{"key":"headers","value":{"Accept-Language":"en-US","Content-Type":"application/octet-stream","Custom-Header":"custom header content"}},{"key":"cookies","value":[{"key":"NID","value":"1234567890"},{"key":"1P JAR","value":"0987654321"}]},{"key":"follow_redirects","value":true},{"key":"http_method","value":"post"},{"key":"content","value":"YmFzZTY0RW5jb2RlZFBPU1RCb2R5"},{"key":"successful_status_codes","value":[808,909]}]}
</pre>
<p>Here is the same example in Realtime:</p>
<pre>curl --user user:pass1 \
'https://data.oxylabs.io/v1/queries' \
-H "Content-Type: application/json" \
-d '{"source": "universal", "url": "https://stackoverflow.com/questions/tagged/python", "user_agent_type": "mobile", "context": [{"key": "headers", "value": ["Accept-Language": "en-US", "Content-Type": "application/octet-stream", "Custom-Header": "custom header content"]}, {"key": "cookies", "value": [{"key": "NID", "value": "1234567890"}, {"key": "1P JAR", "value": "0987654321"}, {"key": "follow_redirects", "value": true}, {"key": "http_method", "value": "post"}, {"key": "content", "value": "base64EncodedPOSTBody"}, {"key": "successful_status_codes", "value": [303, 808, 909]}]}]}'
</pre>
<p>And via SuperAPI:</p>
<pre># A GET request could look something like this:
curl -k \
-x http://realtime.oxylabs.io:60000 \
-U user:pass1 \
"https://stackoverflow.com/questions/tagged/python" \
-H "X-OxySERPs-Session-Id: 1234567890abcdef" \
-H "X-OxySERPs-Geo-Location: India" \
-H "Accept-Language: en-US" \
-H "Content-Type: application/octet-stream" \
-H "Custom-Header: custom header content" \
-H "Cookie: NID=1234567890; 1P_JAR=0987654321" \
-H "X-Status-Code: 303, 808, 909"

# A POST request would have the same structure but contain a parameter specifying that it is a POST request:
curl -X POST \
-k \
-x http://realtime.oxylabs.io:60000 \
-U user:pass1 "https://stackoverflow.com/questions/tagged/python" \
-H "X-OxySERPs-Session-Id: 1234567890abcdef" \
-H "X-OxySERPs-Geo-Location: India" \
-H "Custom-Header: custom header content" \
-H "Cookie: NID=1234567890; 1P_JAR=0987654321" \
-H "X-Status-Code: 303, 808, 909"
</pre>
<hr />
<h2 id="parameter-values">Parameter Values</h2>
<h3 id="geo_location">Geo_Location</h3>
<p>Full list of supported geo locations can be found in CSV format <a class="custom_link" href="https://docs.oxylabs.io/resources/universal-supported-geo_location-values.csv" target="_blank" rel="noopener">here</a>.</p>
<pre>"United Arab Emirates",
"Albania",
"Armenia",
"Angola",
"Argentina",
"Australia",
...
"Uruguay",
"Uzbekistan",
"Venezuela Bolivarian Republic of",
"Viet Nam",
"South Africa",
"Zimbabwe"
</pre>
<hr />
<h3 id="http_method">HTTP_Method</h3>
<p>Universal Crawler supports two HTTP(S) methods: <code>GET</code> (default) and <code>POST</code>.</p>
<pre>"GET",
"POST"
</pre>
<hr />
<h3 id="render">Render</h3>
<p>Universal Crawler can render Javascript and return either a rendered HTML document or a PNG screenshot of the web page.</p>
<pre>"html",
"png"
</pre>
<hr />
<h3 id="user_agent_type">User_Agent_Type</h3>
<p>Download full list of <code>user_agent_type</code> values in JSON <a class="custom_link" href="https://docs.oxylabs.io/resources/user_agent_type.json" target="_blank" rel="noopener">here</a>.</p>
<pre>[
  {
    "user_agent_type": "desktop",
    "description": "Random desktop browser User-Agent"
  },
  {
    "user_agent_type": "desktop_firefox",
    "description": "Random User-Agent of one of the latest versions of desktop Firefox"
  },
  {
    "user_agent_type": "desktop_chrome",
    "description": "Random User-Agent of one of the latest versions of desktop Chrome"
  },
  {
    "user_agent_type": "desktop_opera",
    "description": "Random User-Agent of one of the latest versions of desktop Opera"
  },
  {
    "user_agent_type": "desktop_edge",
    "description": "Random User-Agent of one of the latest versions of desktop Edge"
  },
  {
    "user_agent_type": "desktop_safari",
    "description": "Random User-Agent of one of the latest versions of desktop Safari"
  },
  {
    "user_agent_type": "mobile",
    "description": "Random mobile browser User-Agent"
  },
  {
    "user_agent_type": "mobile_android",
    "description": "Random User-Agent of one of the latest versions of Android browser"
  },
  {
    "user_agent_type": "mobile_ios",
    "description": "Random User-Agent of one of the latest versions of iPhone browser"
  },
  {
    "user_agent_type": "tablet",
    "description": "Random tablet browser User-Agent"
  },
  {
    "user_agent_type": "tablet_android",
    "description": "Random User-Agent of one of the latest versions of Android tablet"
  },
  {
    "user_agent_type": "tablet_ios",
    "description": "Random User-Agent of one of the latest versions of iPad tablet"
  }
]
</pre>
<hr />
<h2 id="account-status">Account Status</h2>
<h3 id="usage-statistics">Usage Statistics</h3>
<p>You can find your usage statistics by querying the following endpoint:</p>
<pre>GET https://data.oxylabs.io/v1/stats
</pre>
<p>By default, the API will return all-time usage statistics. Adding <code>?group_by=month</code> will return monthly stats, while <code>?group_by=day</code> will return daily numbers.</p>
<p>This query will return all-time statistics. You can find your daily and monthly usage by adding either <code>?group_by=day</code> or <code>?group_by=month</code></p>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/stats'
</pre>
<p>Sample output:</p>
<pre>{
    "data": {
        "sources": [
            {
                "realtime_results_count": "90",
                "results_count": "10",
                "title": "universal"
            }
        ]
    },
    "meta": {
        "group_by": null
    }
}
</pre>
<hr />
<h3 id="limits">Limits</h3>
<p>The following endpoint will give your monthly commitment information as well as how much of it has already been used:</p>
<pre>GET https://data.oxylabs.io/v1/stats/limits
</pre>
<pre>curl --user user:pass1 'https://data.oxylabs.io/v1/stats/limits'
</pre>
<p>Sample output:</p>
<pre>{
    "monthly_requests_commitment": 4500000,
    "used_requests": 985000
}
</pre>
<hr />
<h2 id="response-codes">Response Codes</h2>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Code</th>
<th>Status</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>204</code></td>
<td>No Content</td>
<td>You are trying to retrieve a job that has not been completed yet.</td>
</tr>
<tr>
<td><code>400</code></td>
<td>Multiple error messages</td>
<td>Bad request structure, could be a misspelled parameter or invalid value. The response body will have a more specific error message.</td>
</tr>
<tr>
<td><code>401</code></td>
<td>&#8216;Authorization header not provided' / &#8216;Invalid authorization header' / &#8216;Client not found'</td>
<td>Missing authorization header or incorrect login credentials.</td>
</tr>
<tr>
<td><code>403</code></td>
<td>Forbidden</td>
<td>Your account does not have access to this resource.</td>
</tr>
<tr>
<td><code>404</code></td>
<td>Not Found</td>
<td>Job ID you are looking for is no longer available.</td>
</tr>
<tr>
<td><code>429</code></td>
<td>Too many requests</td>
<td>Exceeded rate limit. Please contact your account manager to increase limits.</td>
</tr>
<tr>
<td><code>500</code></td>
<td>Unknown Error</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>524</code></td>
<td>Timeout</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>612</code></td>
<td>Undefined Internal Error</td>
<td>Something went wrong and we failed the job you submitted. You can try again at no extra cost, as we do not charge you for <code>faulted</code> jobs. If that does not work, please get in touch with us.</td>
</tr>
<tr>
<td><code>613</code></td>
<td>Faulted After Too Many Retries</td>
<td>We tried scraping the job you submitted, but gave up after reaching our retry limit. You can try again at no extra cost, as we do not charge you for <code>faulted</code> jobs. If that does not work, please get in touch with us.</td>
</tr>
</tbody>
</table>
</div>
<hr />
<h4>References</h4>
<ul>
<li><a href="https://docs.oxylabs.io/rtc/source/html-crawler-api/index.html" target="_blank" rel="nofollow noopener">https://docs.oxylabs.io/rtc/source/html-crawler-api/index.html</a></li>
<li><a href="https://docs.oxylabs.io/rtc/index.html" target="_blank" rel="nofollow noopener">https://docs.oxylabs.io/rtc/index.html</a></li>
</ul>
<p>&nbsp;</p>
<hr />
<blockquote><p><strong>Disclaimer:</strong> This part of the content is mainly from the merchant. If the merchant does not want it to be displayed on my website, please <a href="https://www.proxysp.com/contact-us/">contact us</a> to delete your content.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://proxysp.com/oxylabs-html-crawler-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7636</post-id>	</item>
		<item>
		<title>How to Use Oxylabs Scraper API [Part 1]: Oxylabs E-Commerce Scraper API</title>
		<link>https://proxysp.com/oxylabs-ecommerce-scraper-api/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oxylabs-ecommerce-scraper-api</link>
					<comments>https://proxysp.com/oxylabs-ecommerce-scraper-api/#respond</comments>
		
		<dc:creator><![CDATA[proxysp]]></dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
				<category><![CDATA[How to Use OxyLabs Proxy (OxyLabs User Manual Navigation)]]></category>
		<guid isPermaLink="false">https://www.proxysp.com/?p=9117</guid>

					<description><![CDATA[Do you know how to use Oxylabs E-Commerce Scraper API? This is the most comprehensive introduction from OxyLabs official. Quick Start Scraper API is built to &#8230;<p class="read-more"> <a class="ast-button" href="https://proxysp.com/oxylabs-ecommerce-scraper-api/"> <span class="screen-reader-text">How to Use Oxylabs Scraper API [Part 1]: Oxylabs E-Commerce Scraper API</span> Read More &#187;</a></p>]]></description>
										<content:encoded><![CDATA[<blockquote><p>Do you know how to use Oxylabs E-Commerce Scraper API? This is the most comprehensive introduction from OxyLabs official.</p></blockquote>
<p><a href="https://www.proxysp.com/redirect/oxylabs" target="_blank" rel="nofollow noopener"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-9221" src="https://www.proxysp.com/wp-content/uploads/2021/11/Oxylabs-E-Commerce-Scraper-API-pricing.jpg" alt="Oxylabs E-Commerce Scraper API pricing" width="921" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/11/Oxylabs-E-Commerce-Scraper-API-pricing.jpg 921w, https://proxysp.com/wp-content/uploads/2021/11/Oxylabs-E-Commerce-Scraper-API-pricing-300x163.jpg 300w, https://proxysp.com/wp-content/uploads/2021/11/Oxylabs-E-Commerce-Scraper-API-pricing-768x417.jpg 768w" sizes="(max-width: 921px) 100vw, 921px" /></a></p>
<h2 id="quick-start">Quick Start</h2>
<p>Scraper API is built to help you in your heavy-duty data retrieval operations. You can use Scraper API to access various public pages. It enables effortless web data extraction without any delays or errors.</p>
<p>Scraper API uses <a class="custom_link" href="https://en.wikipedia.org/wiki/Basic_access_authentication" target="_blank" rel="nofollow noopener">basic HTTP authentication</a> that requires sending username and password.</p>
<p>This is by far the fastest way to start using Scraper API. You will make a request to <code>https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html</code> using <a class="custom_link" href="#realtime">Realtime</a> integration method from United States <code>geo-location</code> and retrieve already <code>parsed</code> data in JSON. If you wish to get page HTML instead of parsed data, simply remove <code>parse</code> and <code>parser_type</code> parameters. Don't forget to replace <code>USERNAME</code> and <code>PASSWORD</code> with your proxy user credentials.</p>
<div class="inside-code">
<div class="highlight inside-code-body"><code>curl <span class="nt">--user</span> <span class="s2">"USERNAME:PASSWORD"</span> 'https://realtime.oxylabs.io/v1/queries' <span class="nt">-H</span> "Content-Type: application/json" <span class="nt">-d</span> '{"source": "universal_ecommerce", "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html", "geo-location": "United States", "parser_type": "ecommerce_product", "parse": true}'</code></div>
<p><span style="font-size: 16px;">If you have any questions not covered by this documentation, please contact your account manager or our support staff at </span><a class="custom_link" style="font-size: 16px; background-color: #ffffff;" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a><span style="font-size: 16px;">.</span></p>
<hr />
</div>
<h2 id="integration-methods">Integration Methods</h2>
<p>Scraper API supports three integration methods which have their unique benefits:</p>
<ul>
<li><a class="custom_link" href="#push-pull">Push-Pull</a>. Using this method it is now required to mainain an active connection with our endpoint to retrieve the data. Upon making a request, our system is able to automatically ping users server when the job is done (see Callback). This method saves computing resources and can be scaled easily.</li>
<li><a class="custom_link" href="#realtime">Realtime</a>. The method requires user to maintain an active connection with our endpoint in order to get the results successfully when the job is completed. This method can be implemented into one service while Push-Pull method is a two step process.</li>
<li><a href="#superapi">SuperAPI</a>. This method is very similar to Realtime but instead posting data to our endpoint, user can use HTML Cralwer as a proxy. To retrieve the data, user must set up a proxy endpoint and make GET request to a desired URL. Additional parameters must be added using headers.</li>
</ul>
<p>Our recommended data extraction method is <a class="custom_link" href="#push-pull">Push-Pull</a>.</p>
<hr />
<h3 id="push-pull">Push-Pull</h3>
<p>This is the most simple yet the most reliable and recommended data delivery method. In Push-Pull scenario you send us a query, we return you job <code>id</code>, and once the job is done you can use that <code>id</code> to retrieve content from <code>/results</code> endpoint. You can check job completion status yourself, or you can set up a simple listener that is able to accept POST queries. This way, we will send you a callback message once the job is ready to be retrieved. In this particular example the results will be automatically <a class="custom_link" href="#upload-to-storage">uploaded to your S3 bucket</a> named <code>YOUR_BUCKET_NAME</code>.</p>
<hr />
<h4 id="single-query">Single Query</h4>
<p>The following endpoint will handle single queries for one keyword or URL. The API will return a confirmation message containing job information, including job <code>id</code>. You can check job completion status using that <code>id</code>, or you can ask us to ping your callback endpoint once the scraping task is finished by adding <code>callback_url</code> in the query.</p>
<div class="endpoint">
<pre><strong>POST https://data.oxylabs.io/v1/queries</strong></pre>
</div>
<p>You need to post query parameters as data in the JSON body.</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1<span class="se">\</span>
<span class="s1">'https://data.oxylabs.io/v1/queries'</span> <span class="se">\</span>
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
-d <span class="s1">'{"source": "universal_ecommerce", "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html", "callback_url": "https://your.callback.url", "storage_type": "s3", "storage_url": "YOUR_BUCKET_NAME"}'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>


<span class="c"># Structure payload.</span>
<span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'source'</span><span class="p">:</span> <span class="s">'universal_ecommerce'</span><span class="p">,</span>
    <span class="s">'url'</span><span class="p">:</span> <span class="s">'https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html'</span><span class="p">,</span>
    <span class="s">'callback_url'</span><span class="p">:</span> <span class="s">'https://your.callback.url'</span><span class="p">,</span>
    <span class="s">'storage_type'</span><span class="p">:</span> <span class="s">'s3'</span><span class="p">,</span>
    <span class="s">'storage_url'</span><span class="p">:</span> <span class="s">'YOUR_BUCKET_NAME'</span>
<span class="p">}</span>

<span class="c"># Get response.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'POST'</span><span class="p">,</span>
    <span class="s">'https://data.oxylabs.io/v1/queries'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Print prettified response to stdout.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$params</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
    <span class="s1">'source'</span> <span class="o">=&gt;</span> <span class="s1">'universal_ecommerce'</span><span class="p">,</span>
    <span class="s1">'url'</span> <span class="o">=&gt;</span> <span class="s1">'https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html'</span><span class="p">,</span>
    <span class="s1">'callback_url'</span> <span class="o">=&gt;</span> <span class="s1">'https://your.callback.url'</span><span class="p">,</span>
    <span class="s1">'storage_type'</span> <span class="o">=&gt;</span> <span class="s1">'s3'</span><span class="p">,</span>
    <span class="s1">'storage_url'</span> <span class="o">=&gt;</span> <span class="s1">'YOUR_BUCKET_NAME'</span>
<span class="p">);</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v1/queries"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POSTFIELDS</span><span class="p">,</span> <span class="nb">json_encode</span><span class="p">(</span><span class="nv">$params</span><span class="p">));</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POST</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$headers</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
<span class="nv">$headers</span><span class="p">[]</span> <span class="o">=</span> <span class="s2">"Content-Type: application/json"</span><span class="p">;</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_HTTPHEADER</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is currently not supported</span></code></pre>
</div></div></div>
<p>The API will respond with query information in JSON format, by printing it in the response body, similar to this:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
  <span class="s2">"callback_url"</span><span class="p">:</span> <span class="s2">"https://your.callback.url"</span><span class="p">,</span>
  <span class="s2">"client_id"</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
  <span class="s2">"created_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
  <span class="s2">"domain"</span><span class="p">:</span> <span class="s2">"com"</span><span class="p">,</span>
  <span class="s2">"geo_location"</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
  <span class="s2">"id"</span><span class="p">:</span> <span class="s2">"12345678900987654321"</span><span class="p">,</span>
  <span class="s2">"limit"</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
  <span class="s2">"locale"</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
  <span class="s2">"pages"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
  <span class="s2">"parse"</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
  <span class="s2">"render"</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
  <span class="s2">"url"</span><span class="p">:</span> <span class="s2">"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"</span><span class="p">,</span>
  <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"universal_ecommerce"</span><span class="p">,</span>
  <span class="s2">"start_page"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
  <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"pending"</span><span class="p">,</span>
  <span class="s2">"storage_type"</span><span class="p">:</span> <span class="s2">"s3"</span><span class="p">,</span>
  <span class="s2">"storage_url"</span><span class="p">:</span> <span class="s2">"YOUR_BUCKET_NAME/12345678900987654321.json"</span><span class="p">,</span>
  <span class="s2">"subdomain"</span><span class="p">:</span> <span class="s2">"www"</span><span class="p">,</span>
  <span class="s2">"updated_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
  <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop"</span><span class="p">,</span>
  <span class="s2">"_links"</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="s2">"rel"</span><span class="p">:</span> <span class="s2">"self"</span><span class="p">,</span>
      <span class="s2">"href"</span><span class="p">:</span> <span class="s2">"http://data.oxylabs.io/v1/queries/12345678900987654321"</span><span class="p">,</span>
      <span class="s2">"method"</span><span class="p">:</span> <span class="s2">"GET"</span>
    <span class="p">},</span>
    <span class="p">{</span>
      <span class="s2">"rel"</span><span class="p">:</span> <span class="s2">"results"</span><span class="p">,</span>
      <span class="s2">"href"</span><span class="p">:</span> <span class="s2">"http://data.oxylabs.io/v1/queries/12345678900987654321/results"</span><span class="p">,</span>
      <span class="s2">"method"</span><span class="p">:</span> <span class="s2">"GET"</span>
    <span class="p">}</span>
  <span class="p">]</span>
<span class="p">}</span></code></pre>
<hr />
<h4 id="check-job-status">Check Job Status</h4>
<p>If your query had a <code>callback_url</code>, we will send you a message containing a link to the content once the scraping task is done. However, if there was no <code>callback_url</code> in the query, you will need to check the job status yourself. For that, you need to use the URL in <code>href</code> under <code>rel</code>:<code>self</code> in the response message you received after submitting your query to our API. It should look similar to this: <code>http://data.oxylabs.io/v1/queries/12345678900987654321</code>.</p>
<div class="endpoint">
<pre><strong>GET https://data.oxylabs.io/v1/queries/{id}</strong></pre>
</div>
<p>Querying this link will return the job information, including its <code>status</code>. There are three possible <code>status</code> values:</p>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<tbody>
<tr>
<td><code>pending</code></td>
<td>The job is still in the queue and has not been completed.</td>
</tr>
<tr>
<td><code>done</code></td>
<td>The job is completed, you may retrieve the result by querying the URL in <code>href</code> under <code>rel</code>:<code>results</code> : <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code></td>
</tr>
<tr>
<td><code>faulted</code></td>
<td>There was an issue with the job, and we could not complete it, most likely due to a server error on the target site's side.</td>
</tr>
</tbody>
</table>
</div>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="s1">'http://data.oxylabs.io/v1/queries/12345678900987654321'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Get a response from the stats endpoint.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="n">method</span><span class="o">=</span><span class="s">'GET'</span><span class="p">,</span>
    <span class="n">url</span><span class="o">=</span><span class="s">'http://data.oxylabs.io/v1/queries/12345678900987654321'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
<span class="p">)</span>

<span class="c"># Print prettified JSON response to stdout.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"http://data.oxylabs.io/v1/queries/12345678900987654321"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_CUSTOMREQUEST</span><span class="p">,</span> <span class="s2">"GET"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is currently not supported</span></code></pre>
</div></div></div>
<p>The API will respond with query information in JSON format, by printing it in the response body. Notice that job <code>status</code> has been changed to <code>done</code>. You can now retrieve content by querying <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code>.</p>
<p>You can also see that the task has been <code>updated_at</code> <code>2019-10-01 00:00:15</code> &#8211; the query took 14 seconds to complete.</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
  <span class="s2">"client_id"</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
  <span class="s2">"created_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
  <span class="s2">"domain"</span><span class="p">:</span> <span class="s2">"com"</span><span class="p">,</span>
  <span class="s2">"geo_location"</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
  <span class="s2">"id"</span><span class="p">:</span> <span class="s2">"12345678900987654321"</span><span class="p">,</span>
  <span class="s2">"limit"</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
  <span class="s2">"locale"</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
  <span class="s2">"pages"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
  <span class="s2">"parse"</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
  <span class="s2">"render"</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
  <span class="s2">"url"</span><span class="p">:</span> <span class="s2">"sofa"</span><span class="p">,</span>
  <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"universal_ecommerce"</span><span class="p">,</span>
  <span class="s2">"start_page"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
  <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"done"</span><span class="p">,</span>
  <span class="s2">"subdomain"</span><span class="p">:</span> <span class="s2">"www"</span><span class="p">,</span>
  <span class="s2">"updated_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:15"</span><span class="p">,</span>
  <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop"</span><span class="p">,</span>
  <span class="s2">"_links"</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="s2">"rel"</span><span class="p">:</span> <span class="s2">"self"</span><span class="p">,</span>
      <span class="s2">"href"</span><span class="p">:</span> <span class="s2">"http://data.oxylabs.io/v1/queries/12345678900987654321"</span><span class="p">,</span>
      <span class="s2">"method"</span><span class="p">:</span> <span class="s2">"GET"</span>
    <span class="p">},</span>
    <span class="p">{</span>
      <span class="s2">"rel"</span><span class="p">:</span> <span class="s2">"results"</span><span class="p">,</span>
      <span class="s2">"href"</span><span class="p">:</span> <span class="s2">"http://data.oxylabs.io/v1/queries/12345678900987654321/results"</span><span class="p">,</span>
      <span class="s2">"method"</span><span class="p">:</span> <span class="s2">"GET"</span>
    <span class="p">}</span>
  <span class="p">]</span>
<span class="p">}</span></code></pre>
<hr />
<h4 id="retrieve-job-content">Retrieve Job Content</h4>
<p>Once you know the job is ready to be retrieved by checking its status, you can GET it using the URL in <code>href</code> under <code>rel</code>:<code>results</code> in our initial response. It should look similar to this: <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code>.</p>
<div class="endpoint">
<pre><strong>GET https://data.oxylabs.io/v1/queries/{id}/results</strong></pre>
</div>
<p>The results can be automatically retrieved without periodically checking job status by setting up Callback service. User needs to specfy the IP or domain of the server where the Callback service is running. When our system completes a job, it will send a message to the provided IP or domain and the Callback service will download the results as described in the Callback implementation example.</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="s1">'http://data.oxylabs.io/v1/queries/12345678900987654321/results'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Get response from the stats endpoint.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="n">method</span><span class="o">=</span><span class="s">'GET'</span><span class="p">,</span>
    <span class="n">url</span><span class="o">=</span><span class="s">'http://data.oxylabs.io/v1/queries/12345678900987654321/results'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
<span class="p">)</span>

<span class="c"># Print the prettified JSON response to stdout.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"http://data.oxylabs.io/v1/queries/12345678900987654321/results"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_CUSTOMREQUEST</span><span class="p">,</span> <span class="s2">"GET"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is currently not supported</span></code></pre>
</div></div></div>
<p>The API will return job content:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
  <span class="s2">"results"</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="s2">"content"</span><span class="p">:</span> <span class="s2">"&lt;!doctype html&gt;&lt;html&gt;
        CONTENT      
      &lt;/html&gt;"</span><span class="p">,</span>
      <span class="s2">"created_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
      <span class="s2">"updated_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:15"</span><span class="p">,</span>
      <span class="s2">"page"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
      <span class="s2">"url"</span><span class="p">:</span> <span class="s2">"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"</span><span class="p">,</span>
      <span class="s2">"job_id"</span><span class="p">:</span> <span class="s2">"12345678900987654321"</span><span class="p">,</span>
      <span class="s2">"status_code"</span><span class="p">:</span> <span class="mi">200</span>
    <span class="p">}</span>
  <span class="p">]</span>
<span class="p">}</span></code></pre>
<hr />
<h4 id="callback">Callback</h4>
<p>A callback is a <code>POST</code> request we send to your machine, informing that the data extraction task is completed and providing URL to download scraped content. This means that you no longer need to <a class="custom_link" href="https://developers.oxylabs.io/scraper-apis/ecommerce_scraper_api/source/universal/index.html?http#check-job-status" target="_blank" rel="noopener">check job status</a> manually. Once the data is here, we will let you know, and all you need to do now is <a class="custom_link" href="#retrieve-job-content">retrieve it</a>.</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code><span class="c"># Please see the code samples in Python and PHP.</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="c"># This is a simple Sanic web server with a route listening for callbacks on localhost:8080.</span>
<span class="c"># It will print job results to stdout.</span>
<span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>
<span class="kn">from</span> <span class="nn">sanic</span> <span class="kn">import</span> <span class="n">Sanic</span><span class="p">,</span> <span class="n">response</span>


<span class="n">AUTH_TUPLE</span> <span class="o">=</span> <span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">)</span>

<span class="n">app</span> <span class="o">=</span> <span class="n">Sanic</span><span class="p">()</span>


<span class="c"># Define /job_listener endpoint that accepts POST requests.</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="s">'/job_listener'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">'POST'</span><span class="p">])</span>
<span class="n">async</span> <span class="k">def</span> <span class="nf">job_listener</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">res</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">json</span>
        <span class="n">links</span> <span class="o">=</span> <span class="n">res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'_links'</span><span class="p">,</span> <span class="p">[])</span>
        <span class="k">for</span> <span class="n">link</span> <span class="ow">in</span> <span class="n">links</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">link</span><span class="p">[</span><span class="s">'rel'</span><span class="p">]</span> <span class="o">==</span> <span class="s">'results'</span><span class="p">:</span>
                <span class="c"># Sanic is async, but requests are synchronous, to fully take</span>
                <span class="c"># advantage of Sanic, use aiohttp.</span>
                <span class="n">res_response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
                    <span class="n">method</span><span class="o">=</span><span class="s">'GET'</span><span class="p">,</span>
                    <span class="n">url</span><span class="o">=</span><span class="n">link</span><span class="p">[</span><span class="s">'href'</span><span class="p">],</span>
                    <span class="n">auth</span><span class="o">=</span><span class="n">AUTH_TUPLE</span><span class="p">,</span>
                <span class="p">)</span>
                <span class="n">pprint</span><span class="p">(</span><span class="n">res_response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span>
                <span class="k">break</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="s">"Listener exception: {}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
    <span class="k">return</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="p">{</span><span class="s">'status'</span><span class="p">:</span> <span class="s">'ok'</span><span class="p">})</span>


<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
    <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s">'0.0.0.0'</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">8080</span><span class="p">)</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>
<span class="nv">$stdout</span> <span class="o">=</span> <span class="nb">fopen</span><span class="p">(</span><span class="s1">'php://stdout'</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">);</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">))</span> <span class="p">{</span>
    <span class="nv">$result</span> <span class="o">=</span> <span class="nb">array_merge</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">,</span> <span class="p">(</span><span class="k">array</span><span class="p">)</span> <span class="nb">json_decode</span><span class="p">(</span><span class="nb">file_get_contents</span><span class="p">(</span><span class="s1">'php://input'</span><span class="p">)));</span>

    <span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

    <span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v1/queries/"</span><span class="o">.</span><span class="nv">$result</span><span class="p">[</span><span class="s1">'id'</span><span class="p">]</span><span class="o">.</span><span class="s1">'/results'</span><span class="p">);</span>
    <span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
    <span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_CUSTOMREQUEST</span><span class="p">,</span> <span class="s2">"GET"</span><span class="p">);</span>
    <span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

    <span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
    <span class="nb">fwrite</span><span class="p">(</span><span class="nv">$stdout</span><span class="p">,</span> <span class="nv">$result</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
        <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is currently not supported</span></code></pre>
</div></div></div>
<p>Sample callback output</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>  
   <span class="s2">"created_at"</span><span class="p">:</span><span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
   <span class="s2">"updated_at"</span><span class="p">:</span><span class="s2">"2019-10-01 00:00:15"</span><span class="p">,</span>
   <span class="s2">"locale"</span><span class="p">:</span><span class="kc">null</span><span class="p">,</span>
   <span class="s2">"client_id"</span><span class="p">:</span><span class="mi">163</span><span class="p">,</span>
   <span class="s2">"user_agent_type"</span><span class="p">:</span><span class="s2">"desktop"</span><span class="p">,</span>
   <span class="s2">"source"</span><span class="p">:</span><span class="s2">"universal_ecommerce"</span><span class="p">,</span>
   <span class="s2">"pages"</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span>
   <span class="s2">"subdomain"</span><span class="p">:</span><span class="s2">"www"</span><span class="p">,</span>
   <span class="s2">"status"</span><span class="p">:</span><span class="s2">"done"</span><span class="p">,</span>
   <span class="s2">"start_page"</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span>
   <span class="s2">"parse"</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span>
   <span class="s2">"render"</span><span class="p">:</span><span class="kc">null</span><span class="p">,</span>
   <span class="s2">"priority"</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span>
   <span class="s2">"ttl"</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span>
   <span class="s2">"origin"</span><span class="p">:</span><span class="s2">"api"</span><span class="p">,</span>
   <span class="s2">"persist"</span><span class="p">:</span><span class="kc">true</span><span class="p">,</span>
   <span class="s2">"id"</span><span class="p">:</span><span class="s2">"12345678900987654321"</span><span class="p">,</span>
   <span class="s2">"callback_url"</span><span class="p">:</span><span class="s2">"http://your.callback.url/"</span><span class="p">,</span>
   <span class="s2">"url"</span><span class="p">:</span><span class="s2">"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"</span><span class="p">,</span>
   <span class="s2">"domain"</span><span class="p">:</span><span class="s2">"de"</span><span class="p">,</span>
   <span class="s2">"limit"</span><span class="p">:</span><span class="mi">10</span><span class="p">,</span>
   <span class="s2">"geo_location"</span><span class="p">:</span><span class="kc">null</span><span class="p">,</span>
   <span class="p">{</span><span class="err">...</span><span class="p">}</span>
   <span class="s2">"_links"</span><span class="p">:[</span>
      <span class="p">{</span>  
         <span class="s2">"href"</span><span class="p">:</span><span class="s2">"https://data.oxylabs.io/v1/queries/12345678900987654321"</span><span class="p">,</span>
         <span class="s2">"method"</span><span class="p">:</span><span class="s2">"GET"</span><span class="p">,</span>
         <span class="s2">"rel"</span><span class="p">:</span><span class="s2">"self"</span>
      <span class="p">},</span>
      <span class="p">{</span>  
         <span class="s2">"href"</span><span class="p">:</span><span class="s2">"https://data.oxylabs.io/v1/queries/12345678900987654321/results"</span><span class="p">,</span>
         <span class="s2">"method"</span><span class="p">:</span><span class="s2">"GET"</span><span class="p">,</span>
         <span class="s2">"rel"</span><span class="p">:</span><span class="s2">"results"</span>
      <span class="p">}</span>
   <span class="p">],</span>
<span class="p">}</span></code></pre>
<hr />
<h4 id="batch-query">Batch Query</h4>
<p>Scraper API also accepts multiple keywords per query, up to 1,000 keywords with each batch. The following endpoint will submit multiple keywords to the extraction queue.</p>
<div class="endpoint">
<pre><strong>POST https://data.oxylabs.io/v1/queries/batch</strong></pre>
</div>
<p>You need to post query parameters as data in the JSON body.</p>
<p>The system will handle every keyword as a separate request. If you provided a callback URL, you will get a separate call for each keyword. Otherwise, our initial response will contain job <code>id</code>s for all keywords. For example, if you sent 50 keywords, we will return 50 unique job <code>id</code>s.</p>
<p>Important! <code>query</code> is the only parameter that can have multiple values. All other parameters are the same for that batch query.</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="s1">'https://data.oxylabs.io/v1/queries/batch'</span> -H <span class="s1">'Content-Type: application/json'</span> <span class="se">\</span>
 -d <span class="s1">'@keywords.json'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">import</span> <span class="nn">json</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>


<span class="c"># Get payload from file.</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s">'keywords.json'</span><span class="p">,</span> <span class="s">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
    <span class="n">payload</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>

<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'POST'</span><span class="p">,</span>
    <span class="s">'https://data.oxylabs.io/v1/queries/batch'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Print prettified response.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$paramsFile</span> <span class="o">=</span> <span class="nb">file_get_contents</span><span class="p">(</span><span class="nb">realpath</span><span class="p">(</span><span class="s2">"keywords.json"</span><span class="p">));</span>
<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v1/queries/batch"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POSTFIELDS</span><span class="p">,</span> <span class="nv">$paramsFile</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POST</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$headers</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
<span class="nv">$headers</span><span class="p">[]</span> <span class="o">=</span> <span class="s2">"Content-Type: application/json"</span><span class="p">;</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_HTTPHEADER</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is currently not supported</span></code></pre>
</div></div></div>
<p><code>keywords.json</code> content:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>  
   <span class="s2">"url"</span><span class="p">:[</span>  
      <span class="s2">"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"</span><span class="p">,</span>
      <span class="s2">"https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html"</span><span class="p">,</span>
      <span class="s2">"https://books.toscrape.com/catalogue/soumission_998/index.html"</span>
   <span class="p">],</span>
   <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"universal_ecommerce"</span><span class="p">,</span>
   <span class="s2">"callback_url"</span><span class="p">:</span> <span class="s2">"https://your.callback.url"</span>
<span class="p">}</span>
</code></pre>
<p>The API will respond with query information in JSON format, by printing it in the response body, similar to this:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
  <span class="s2">"queries"</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="s2">"callback_url"</span><span class="p">:</span> <span class="s2">"https://your.callback.url"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
      <span class="s2">"created_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
      <span class="s2">"domain"</span><span class="p">:</span> <span class="s2">"com"</span><span class="p">,</span>
      <span class="s2">"id"</span><span class="p">:</span> <span class="s2">"12345678900987654321"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
      <span class="s2">"url"</span><span class="p">:</span> <span class="s2">"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"</span><span class="p">,</span>
      <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"universal_ecommerce"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
          <span class="s2">"rel"</span><span class="p">:</span> <span class="s2">"results"</span><span class="p">,</span>
          <span class="s2">"href"</span><span class="p">:</span> <span class="s2">"http://data.oxylabs.io/v1/queries/12345678900987654321/results"</span><span class="p">,</span>
          <span class="s2">"method"</span><span class="p">:</span> <span class="s2">"GET"</span>
        <span class="p">}</span>
      <span class="p">]</span>
    <span class="p">},</span>
    <span class="p">{</span>
      <span class="s2">"callback_url"</span><span class="p">:</span> <span class="s2">"https://your.callback.url"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
      <span class="s2">"created_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
      <span class="s2">"domain"</span><span class="p">:</span> <span class="s2">"com"</span><span class="p">,</span>
      <span class="s2">"id"</span><span class="p">:</span> <span class="s2">"12345678901234567890"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
      <span class="s2">"url"</span><span class="p">:</span> <span class="s2">"https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html"</span><span class="p">,</span>
      <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"universal_ecommerce"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
          <span class="s2">"rel"</span><span class="p">:</span> <span class="s2">"results"</span><span class="p">,</span>
          <span class="s2">"href"</span><span class="p">:</span> <span class="s2">"http://data.oxylabs.io/v1/queries/12345678901234567890/results"</span><span class="p">,</span>
          <span class="s2">"method"</span><span class="p">:</span> <span class="s2">"GET"</span>
        <span class="p">}</span>
      <span class="p">]</span>
    <span class="p">},</span>
    <span class="p">{</span>
      <span class="s2">"callback_url"</span><span class="p">:</span> <span class="s2">"https://your.callback.url"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
      <span class="s2">"created_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
      <span class="s2">"domain"</span><span class="p">:</span> <span class="s2">"com"</span><span class="p">,</span>
      <span class="s2">"id"</span><span class="p">:</span> <span class="s2">"01234567899876543210"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
      <span class="s2">"url"</span><span class="p">:</span> <span class="s2">"https://books.toscrape.com/catalogue/soumission_998/index.html"</span><span class="p">,</span>
      <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"universal_ecommerce"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
          <span class="s2">"rel"</span><span class="p">:</span> <span class="s2">"results"</span><span class="p">,</span>
          <span class="s2">"href"</span><span class="p">:</span> <span class="s2">"http://data.oxylabs.io/v1/queries/01234567899876543210/results"</span><span class="p">,</span>
          <span class="s2">"method"</span><span class="p">:</span> <span class="s2">"GET"</span>
        <span class="p">}</span>
      <span class="p">]</span>
    <span class="p">}</span>
  <span class="p">]</span>
<span class="p">}</span></code></pre>
<hr />
<h4 id="get-notifier-ip-address-list">Get Notifier IP Address List</h4>
<p>You may want to whitelist the IPs sending you callback messages or get the list of these IPs for other purposes. This can be done by <code>GET</code>ing this endpoint: <code>https://data.oxylabs.io/v1/info/callbacker_ips</code>.</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="s1">'https://data.oxylabs.io/v1/info/callbacker_ips'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Get response from the callback IPs endpoint.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="n">method</span><span class="o">=</span><span class="s">'GET'</span><span class="p">,</span>
    <span class="n">url</span><span class="o">=</span><span class="s">'https://data.oxylabs.io/v1/info/callbacker_ips'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
<span class="p">)</span>

<span class="c"># Print the prettified JSON response to stdout.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v1/info/callbacker_ips"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_CUSTOMREQUEST</span><span class="p">,</span> <span class="s2">"GET"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is currently not supported</span></code></pre>
</div></div></div>
<p>The API will return the list of IPs making callback requests to your system:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
    <span class="s2">"ips"</span><span class="p">:</span> <span class="p">[</span>
        <span class="s2">"x.x.x.x"</span><span class="p">,</span>
        <span class="s2">"y.y.y.y"</span>
    <span class="p">]</span>
<span class="p">}</span></code></pre>
<hr />
<h4 id="upload-to-storage">Upload to Storage</h4>
<p>By default, Ecommerce Spraper API's job results are stored in our databases. This means that you will need to query our results endpoint and retrieve the content yourself. Custom storage feature allows you to store results in your own cloud storage. The advantages of this feature are that you do not need extra requests to fetch results &#8211; everything goes directly to your storage bucket.</p>
<p>At the moment, we only support Amazon S3. If you want to use a different type of storage, contact your account manager to discuss the timeline.</p>
<p>In order to upload job results to your Amazon S3 bucket, you need to set up special permissions. To do that, go to <code>https://s3.console.aws.amazon.com/ &gt; S3 &gt; Storage &gt; Bucket Name (if don't have one, create new) &gt; Permissions &gt; Bucket Policy</code></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-9123" src="https://www.proxysp.com/wp-content/uploads/2021/11/Oxylabs-ECommerce-Universal-Scraper-API-Upload-to-Storage.png" alt="Oxylabs ECommerce Universal Scraper API Upload to Storage" width="482" height="319" srcset="https://proxysp.com/wp-content/uploads/2021/11/Oxylabs-ECommerce-Universal-Scraper-API-Upload-to-Storage.png 482w, https://proxysp.com/wp-content/uploads/2021/11/Oxylabs-ECommerce-Universal-Scraper-API-Upload-to-Storage-300x199.png 300w" sizes="(max-width: 482px) 100vw, 482px" /></p>
<p>You can find the bucket policy in this <a class="custom_link" href="https://developers.oxylabs.io/resources/s3_bucket_policy.json" target="_blank" rel="noopener">JSON</a> or in the code sample area on the right. Do not forget to change the bucket name under <code>YOUR_BUCKET_NAME</code>. This policy allows us to write to your bucket, upload files for you, and know the bucket location.</p>
<p>To use this feature and you will need to specify two additional parameters in your requests. Learn more <a class="custom_link" href="#direct">here</a>.</p>
<p>The upload path looks like this: <code>YOUR_BUCKET_NAME/job_ID.json</code>. You will find the job ID in the response body that you will receive from us after submitting a request. In <a class="custom_link" href="#single-query">this example</a> job ID is <code>12345678900987654321</code>.</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
    <span class="s2">"Version"</span><span class="p">:</span> <span class="s2">"2012-10-17"</span><span class="p">,</span>
    <span class="s2">"Id"</span><span class="p">:</span> <span class="s2">"Policy1577442634787"</span><span class="p">,</span>
    <span class="s2">"Statement"</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
            <span class="s2">"Sid"</span><span class="p">:</span> <span class="s2">"Stmt1577442633719"</span><span class="p">,</span>
            <span class="s2">"Effect"</span><span class="p">:</span> <span class="s2">"Allow"</span><span class="p">,</span>
            <span class="s2">"Principal"</span><span class="p">:</span> <span class="p">{</span>
                <span class="s2">"AWS"</span><span class="p">:</span> <span class="s2">"arn:aws:iam::324311890426:user/oxylabs.s3.uploader"</span>
            <span class="p">},</span>
            <span class="s2">"Action"</span><span class="p">:</span> <span class="s2">"s3:GetBucketLocation"</span><span class="p">,</span>
            <span class="s2">"Resource"</span><span class="p">:</span> <span class="s2">"arn:aws:s3:::YOUR_BUCKET_NAME"</span>
        <span class="p">},</span>
        <span class="p">{</span>
            <span class="s2">"Sid"</span><span class="p">:</span> <span class="s2">"Stmt1577442633719"</span><span class="p">,</span>
            <span class="s2">"Effect"</span><span class="p">:</span> <span class="s2">"Allow"</span><span class="p">,</span>
            <span class="s2">"Principal"</span><span class="p">:</span> <span class="p">{</span>
                <span class="s2">"AWS"</span><span class="p">:</span> <span class="s2">"arn:aws:iam::324311890426:user/oxylabs.s3.uploader"</span>
            <span class="p">},</span>
            <span class="s2">"Action"</span><span class="p">:</span> <span class="p">[</span>
                <span class="s2">"s3:PutObject"</span><span class="p">,</span>
                <span class="s2">"s3:PutObjectAcl"</span>
            <span class="p">],</span>
            <span class="s2">"Resource"</span><span class="p">:</span> <span class="s2">"arn:aws:s3:::YOUR_BUCKET_NAME/*"</span>
        <span class="p">}</span>
    <span class="p">]</span>
<span class="p">}</span></code></pre>
<hr />
<h3 id="realtime">Realtime</h3>
<p>The data submission is the same as in Push-Pull method, but with Realtime, we will return the content on open connection. You send us a query, the connection remains open, we retrieve the content, and bring it to you. The endpoint that handles that is this:</p>
<div class="endpoint">
<pre><strong>POST https://realtime.oxylabs.io/v1/queries</strong></pre>
</div>
<p>The timeout limit for open connections is 100 seconds. Therefore, in rare cases of heavy load, we may not be able to ensure the data gets to you.</p>
<p>You need to post query parameters as data in the JSON body. Please see an example for more details.</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="s1">'https://realtime.oxylabs.io/v1/queries'</span> -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
 -d <span class="s1">'{"source": "universal_ecommerce", "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"}'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>


<span class="c"># Structure payload.</span>
<span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'source'</span><span class="p">:</span> <span class="s">'universal_ecommerce'</span><span class="p">,</span>
    <span class="s">'url'</span><span class="p">:</span> <span class="s">'https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html'</span><span class="p">,</span>
<span class="p">}</span>

<span class="c"># Get response.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'POST'</span><span class="p">,</span>
    <span class="s">'https://realtime.oxylabs.io/v1/queries'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Instead of response with job status and results url, this will return the</span>
<span class="c"># JSON response with results.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$params</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
    <span class="s1">'source'</span> <span class="o">=&gt;</span> <span class="s1">'universal_ecommerce'</span><span class="p">,</span>
    <span class="s1">'query'</span> <span class="o">=&gt;</span> <span class="s1">'sofa'</span><span class="p">,</span>
<span class="p">);</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://realtime.oxylabs.io/v1/queries"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POSTFIELDS</span><span class="p">,</span> <span class="nb">json_encode</span><span class="p">(</span><span class="nv">$params</span><span class="p">));</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POST</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$headers</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
<span class="nv">$headers</span><span class="p">[]</span> <span class="o">=</span> <span class="s2">"Content-Type: application/json"</span><span class="p">;</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_HTTPHEADER</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err"># URL has to be encoded to escape `&` and `=` characters. It is not necessary in this example.

https://realtime.oxylabs.io/v1/queries?source=universal_ecommerce&url=https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html&access_token=12345abcde</span></code></pre>
</div></div></div>
<p>Example response body that will be returned on open connection:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
  <span class="s2">"results"</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="s2">"content"</span><span class="p">:</span> <span class="s2">"&lt;html&gt;
      CONTENT
      &lt;/html&gt;"</span>
      <span class="s2">"created_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
      <span class="s2">"updated_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:15"</span><span class="p">,</span>
      <span class="s2">"id"</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
      <span class="s2">"page"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
      <span class="s2">"url"</span><span class="p">:</span> <span class="s2">"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"</span><span class="p">,</span>
      <span class="s2">"job_id"</span><span class="p">:</span> <span class="s2">"12345678900987654321"</span><span class="p">,</span>
      <span class="s2">"status_code"</span><span class="p">:</span> <span class="mi">200</span>
    <span class="p">}</span>
  <span class="p">]</span>
<span class="p">}</span></code></pre>
<hr />
<h3 id="superapi">SuperAPI</h3>
<p>If you have ever used regular proxies for data scraping, integrating SuperAPI delivery method will be a breeze. You simply need to use our entry node as proxy, authorize with Scraper API credentials, and ignore certificates. In <code>cURL</code> it's <code>-k</code> or <code>--insecure</code>. Your data will reach you on open connection.</p>
<div class="endpoint">
<pre><strong>GET realtime.oxylabs.io:60000</strong></pre>
</div>
<p>SuperAPI only supports a handful of parameters since it <strong>only works with <a class="custom_link" href="#direct">Direct</a> data source</strong> where a full URL is provided. These parameters should be sent as headers. This is a list of accepted parameters:</p>
<table>
<tbody>
<tr>
<td><code>X-OxySERPs-User-Agent-Type</code></td>
<td>There is no way to indicate a specific User-Agent, but you can let us know which browser and platform to use. A list of supported User-Agents can be found <a class="custom_link" href="#user_agent_type">here</a>.</td>
</tr>
</tbody>
</table>
<p>If you need help setting up SuperAPI, get in touch with us at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a>.</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl -k <span class="se">\</span>
-x realtime.oxylabs.io:60000 <span class="se">\</span>
-U user:pass1 <span class="se">\</span>
-H <span class="s2">"X-OxySERPs-User-Agent-Type: desktop_chrome"</span> <span class="se">\</span>
<span class="s2">"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Define proxy dict. Do not forget to put your real user and pass here as well.</span>
<span class="n">proxies</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s">'http'</span><span class="p">:</span> <span class="s">'http://user:pass1@realtime.oxylabs.io:60000'</span><span class="p">,</span>
  <span class="s">'https'</span><span class="p">:</span> <span class="s">'https://user:pass1@realtime.oxylabs.io:60000'</span><span class="p">,</span>
<span class="p">}</span>

<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'GET'</span><span class="p">,</span>
    <span class="s">'https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">verify</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>  <span class="c"># Or accept our certificate.</span>
    <span class="n">proxies</span><span class="o">=</span><span class="n">proxies</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Print result page to stdout</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>

<span class="c"># Save returned HTML to result.html file</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s">'result.html'</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
    <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>
<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_PROXY</span><span class="p">,</span> <span class="s1">'realtime.oxylabs.io:60000'</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_PROXYUSERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_SSL_VERIFYPEER</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_SSL_VERIFYHOST</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is not supported with SuperAPI</span></code></pre>
</div></div></div>
<hr />
<h2 id="content-type">Content Type</h2>
<p>Scraper API returns <strong>raw HTML</strong>, as well as <strong>structured JSON</strong>.</p>
<h3 id="download-images">Download Images</h3>
<p>It is possible to download images via Scraper API. If you are doing that through SuperAPI, you can simply save the output to image extension. For example:</p>
<p><code>curl -k -x realtime.oxylabs.io:60000 -U user:pass1 "https://example.com/image.jpg" &gt;&gt; image.jpg</code></p>
<p>If you are using <a class="custom_link" href="#push-pull">Push-Pull</a> or <a class="custom_link" href="#realtime">Realtime</a> methods, you will need to add <code>content_encoding</code> parameter with a value of <code>base64</code>. Once you receive the results, you then need to decode encoded data from <code>content</code> into bytes and save it as an image file. Please find an example in Python on the right.</p>
<hr />
<h2 id="data-sources">Data Sources</h2>
<p>Scraper API accepts URLs, along with additional parameters, such as User-Agent type, proxy location, and others. See this method, which we call <a class="custom_link" href="#direct">Direct</a>, described below.</p>
<p>Scraper API is able to render JavaScript when scraping. This enables you to get more data from the web page and get screenshots.</p>
<p>If you are unsure about any part of the documentation, drop us a line at <a class="custom_link" href="mailto:support@oxylabs.io" target="_blank" rel="nofollow noopener">support@oxylabs.io</a> or contact your account manager.</p>
<hr />
<h3 id="direct">Direct</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-9126 alignleft" src="https://www.proxysp.com/wp-content/uploads/2021/11/Oxylabs-ECommerce-Universal-Scraper-API-Direct.png" alt="Oxylabs ECommerce Universal Scraper API Direct" width="426" height="17" srcset="https://proxysp.com/wp-content/uploads/2021/11/Oxylabs-ECommerce-Universal-Scraper-API-Direct.png 426w, https://proxysp.com/wp-content/uploads/2021/11/Oxylabs-ECommerce-Universal-Scraper-API-Direct-300x12.png 300w" sizes="(max-width: 426px) 100vw, 426px" /></p>
<p>&nbsp;</p>
<p><code>universal_ecommerce</code> source is designed to retrieve the contents of any URL on the internet. <code>POST</code>-ing the parameters in JSON format to the following endpoint will submit the specified URL to the extraction queue.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="216">
<tbody>
<tr>
<td style="font-weight: 400;" width="72">Parameter</td>
<td style="font-weight: 400;" width="72">Description</td>
<td style="font-weight: 400;" width="72">Default Value</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">source</td>
<td style="font-weight: 400;" width="72">Data source</td>
<td style="font-weight: 400;" width="72">universal_ecommerce</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">url</td>
<td style="font-weight: 400;" width="72">Direct URL (link) to Universal page</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">user_agent_type</td>
<td style="font-weight: 400;" width="72">Device type and browser. The full list can be found <a href="#user_agent_type">here.</a></td>
<td style="font-weight: 400;" width="72">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">geo_location</td>
<td style="font-weight: 400;" width="72">Geo location of proxy used to retrieve the data. The full list of supported locations can be found <a href="#geo_location">here.</a></td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">locale</td>
<td style="font-weight: 400;" width="72">Locale, as expected in Accept-Language header.</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">render</td>
<td style="font-weight: 400;" width="72">Enables JavaScript rendering. Use it when the target requires JavaScript to load content. Only works via Push-Pull (a.k.a. Callback) method. There are two available values for this parameter: html(get raw output) and png (get a Base64-encoded screenshot).</td>
<td style="font-weight: 400;" width="72"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">content_encoding</td>
<td style="font-weight: 400;" width="72">Add this parameter if you are downloading images. Learn more <a href="#download-images">here.</a></td>
<td style="font-weight: 400;" width="72">base64</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Base64-encoded POST request body. It is only useful if http_method is set to post.</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">content</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Pass your own cookies.</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">cookies</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Indicate whether you would like the scraper to follow redirects (3xx responses with a destination URL) to get the contents of the URL at the end of the redirect chain.</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">follow_redirects</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Pass your own headers.</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">headers</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Set it to post if you would like to make a POST request to your target URL via E-commerce Universal Scraper.</td>
<td style="font-weight: 400;" rowspan="2" width="72">get</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">http_method</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">If you want to use the same proxy with multiple requests, you can do so by using this parameter. Just set your session to any string you like, and we will assign a proxy to this ID and keep it for up to 10 minutes. After that, if you make another request with the same session ID, a new proxy will be assigned to that particular session ID.</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">session_id</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">context:</td>
<td style="font-weight: 400;" rowspan="2" width="72">Define a custom HTTP response code (or a few of them), upon which we should consider the scrape successful and return the content to you. May be useful if you want us to return the 503 error page or in some other non-standard cases.</td>
<td style="font-weight: 400;" rowspan="2" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">successful_status_codes</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">callback_url</td>
<td style="font-weight: 400;" width="72">URL to your callback endpoint.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">parse</td>
<td style="font-weight: 400;" width="72">true will return structured data, as long as the URL submitted directs to an ecommerce product page. Use this parameter in combination with parser_type parameter to use our Adaptive Parser.</td>
<td style="font-weight: 400;" width="72">FALSE</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">parser_type</td>
<td style="font-weight: 400;" width="72">Set the value to ecommerce_product to access Adaptive Parser.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_type</td>
<td style="font-weight: 400;" width="72">Storage service provider. At the moment, only Amazon S3 is supported: s3. Full implementation can be found on the<a href="#upload-to-storage"> Upload to Storage</a> page. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="72">storage_url</td>
<td style="font-weight: 400;" width="72">Your Amazon S3 bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="72">&#8211;</td>
</tr>
</tbody>
</table>
</div>
<p><code class="required">  </code> &#8211; required parameter</p>
<p>In this example, the API will retrieve a E-commerce universal product page in Push-Pull method. All available parameters are included (though not always necessary or compatible within the same request), to give you an idea on how to format your requests:</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="se">\</span>
<span class="s1">'https://data.oxylabs.io/v1/queries'</span> <span class="se">\</span>
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
 -d <span class="s1">'{"source": "universal_ecommerce", "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html", "user_agent_type": "mobile", "render": "html", 
 "context": [{"key": "headers", "value": ["Accept-Language": "en-US", "Content-Type": "application/octet-stream", "Custom-Header": "custom header content"]}, {"key": "cookies", "value": [{"key": "NID", "value": "1234567890"}, {"key": "1P JAR", "value": "0987654321"}, {"key": "follow_redirects", "value": true}, {"key": "http_method", "value": "get"}, {"key": "content", "value": "base64EncodedPOSTBody"}, {"key": "successful_status_codes", "value": [303, 808, 909]}]}]}'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>


<span class="c"># Structure payload.</span>
<span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'source'</span><span class="p">:</span> <span class="s">'universal_ecommerce'</span><span class="p">,</span>
    <span class="s">'url'</span><span class="p">:</span> <span class="s">'https://www.etsy.com/listing/399423455/big-glass-house-planter-handmade-glass?ref=hp_prn&frs=1'</span><span class="p">,</span>
    <span class="s">'user_agent_type'</span><span class="p">:</span> <span class="s">'desktop'</span><span class="p">,</span>
    <span class="s">'geo_location'</span><span class="p">:</span> <span class="s">'United States'</span><span class="p">,</span>
    <span class="s">'parse'</span><span class="p">:</span> <span class="n">true</span><span class="p">,</span>
    <span class="s">'parser_type'</span><span class="p">:</span> <span class="s">"ecommerce_product"</span><span class="p">,</span>
    <span class="s">'context'</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'session_id'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="s">'1234567890abcdef'</span>
        <span class="p">}</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'headers'</span><span class="p">,</span> <span class="s">'value'</span><span class="p">:</span> 
            <span class="p">{</span>
             <span class="s">'Accept-Language'</span><span class="p">:</span> <span class="s">'en-US'</span><span class="p">,</span>
             <span class="s">'Content-Type'</span><span class="p">:</span> <span class="s">'application/octet-stream'</span><span class="p">,</span>
             <span class="s">'Custom-Header'</span><span class="p">:</span> <span class="s">'custom header content'</span>
            <span class="p">}</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'cookies'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="p">[{</span>
              <span class="s">'key'</span><span class="p">:</span> <span class="s">'NID'</span><span class="p">,</span>
             <span class="s">'value'</span><span class="p">:</span> <span class="s">'1234567890'</span>
           <span class="p">},</span>
           <span class="p">{</span>
              <span class="s">'key'</span><span class="p">:</span> <span class="s">'1P_JAR'</span><span class="p">,</span>
             <span class="s">'value'</span><span class="p">:</span> <span class="s">'0987654321'</span>
           <span class="p">}</span>
         <span class="p">]</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'follow_redirects'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="n">true</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'successful_status_codes'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="p">[</span><span class="mi">303</span><span class="p">,</span> <span class="mi">808</span><span class="p">,</span> <span class="mi">909</span><span class="p">]</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'http_method'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="s">'get'</span>
        <span class="p">}</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'content'</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="s">'base64EncodedPOSTBody'</span>
        <span class="p">}</span>
    <span class="p">],</span>
    <span class="s">'callback_url'</span><span class="p">:</span> <span class="s">'https://your.callback.url'</span><span class="p">,</span>
<span class="p">}</span>

<span class="c"># Get response.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'POST'</span><span class="p">,</span>
    <span class="s">'https://data.oxylabs.io/v1/queries'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Print prettified response to stdout.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$params</span> <span class="o">=</span> <span class="p">[</span>
    <span class="s1">'source'</span> <span class="o">=&gt;</span> <span class="s1">'universal_ecommerce'</span><span class="p">,</span>
    <span class="s1">'url'</span> <span class="o">=&gt;</span> <span class="s1">'https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html'</span><span class="p">,</span>
    <span class="s1">'context'</span> <span class="o">=&gt;</span> <span class="p">[</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'session_id'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'1234567890abcdef'</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'headers'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="p">[</span>
                <span class="s1">'Accept-Language'</span> <span class="o">=&gt;</span> <span class="s1">'en-US'</span><span class="p">,</span>
                <span class="s1">'Content-Type'</span> <span class="o">=&gt;</span> <span class="s1">'application/octet-stream'</span><span class="p">,</span>
                <span class="s1">'Custom-Header'</span> <span class="o">=&gt;</span> <span class="s1">'custom header content'</span>
            <span class="p">],</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'cookies'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="p">[</span>
                <span class="p">[</span><span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'NID'</span><span class="p">,</span> <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'1234567890'</span><span class="p">],</span>
                <span class="p">[</span><span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'1P_JAR'</span><span class="p">,</span> <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'0987654321'</span><span class="p">]</span>
            <span class="p">]</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'follow_redirects'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'true'</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'successful_status_codes'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="mi">303</span><span class="p">,</span> <span class="mi">808</span><span class="p">,</span> <span class="mi">909</span><span class="p">]</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'http_method'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'get'</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'content'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'base64EncodedPOSTBody'</span>
        <span class="p">]</span>
    <span class="p">]</span>
<span class="p">];</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v1/queries"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POSTFIELDS</span><span class="p">,</span> <span class="nb">json_encode</span><span class="p">(</span><span class="nv">$params</span><span class="p">));</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POST</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$headers</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
<span class="nv">$headers</span><span class="p">[]</span> <span class="o">=</span> <span class="s2">"Content-Type: application/json"</span><span class="p">;</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_HTTPHEADER</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is currently not supported with Push-Pull</span></code></pre>
</div></div></div>
<p>Here is the same example in Realtime:</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="se">\</span>
<span class="s1">'https://data.oxylabs.io/v1/queries'</span> <span class="se">\</span>
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
-d <span class="s1">'{"source": "universal_ecommerce", "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html", "user_agent_type": "mobile", "context": [{"key": "headers", "value": ["Accept-Language": "en-US", "Content-Type": "application/octet-stream", "Custom-Header": "custom header content"]}, {"key": "cookies", "value": [{"key": "NID", "value": "1234567890"}, {"key": "1P JAR", "value": "0987654321"}, {"key": "follow_redirects", "value": true}, {"key": "http_method", "value": "get"}, {"key": "content", "value": "base64EncodedPOSTBody"}, {"key": "successful_status_codes", "value": [303, 808, 909]}]}]}'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Structure payload.</span>
<span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'source'</span><span class="p">:</span> <span class="s">'universal_ecommerce'</span><span class="p">,</span>
    <span class="s">'url'</span><span class="p">:</span> <span class="s">'https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html'</span><span class="p">,</span>
    <span class="s">'user_agent_type'</span><span class="p">:</span> <span class="s">'mobile'</span><span class="p">,</span>
    <span class="s">'geo_location'</span><span class="p">:</span> <span class="s">'United States'</span><span class="p">,</span>
    <span class="s">'context'</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'session_id'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="s">'1234567890abcdef'</span>
        <span class="p">}</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'headers'</span><span class="p">,</span> <span class="s">'value'</span><span class="p">:</span> 
            <span class="p">{</span>
             <span class="s">'Accept-Language'</span><span class="p">:</span> <span class="s">'en-US'</span><span class="p">,</span>
             <span class="s">'Content-Type'</span><span class="p">:</span> <span class="s">'application/octet-stream'</span><span class="p">,</span>
             <span class="s">'Custom-Header'</span><span class="p">:</span> <span class="s">'custom header content'</span>
            <span class="p">}</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'cookies'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="p">[{</span>
              <span class="s">'key'</span><span class="p">:</span> <span class="s">'NID'</span><span class="p">,</span>
             <span class="s">'value'</span><span class="p">:</span> <span class="s">'1234567890'</span>
           <span class="p">},</span>
           <span class="p">{</span>
              <span class="s">'key'</span><span class="p">:</span> <span class="s">'1P_JAR'</span><span class="p">,</span>
             <span class="s">'value'</span><span class="p">:</span> <span class="s">'0987654321'</span>
           <span class="p">}</span>
         <span class="p">]</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'follow_redirects'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="n">true</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'successful_status_codes'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="p">[</span><span class="mi">303</span><span class="p">,</span> <span class="mi">808</span><span class="p">,</span> <span class="mi">909</span><span class="p">]</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'http_method'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="s">'get'</span>
        <span class="p">}</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'content'</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="s">'base64EncodedPOSTBody'</span>
        <span class="p">}</span>
    <span class="p">],</span>
<span class="p">}</span>

<span class="c"># Get response.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'POST'</span><span class="p">,</span>
    <span class="s">'https://realtime.oxylabs.io/v1/queries'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Instead of response with job status and results url, this will return the</span>
<span class="c"># JSON response with the result.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$params</span> <span class="o">=</span> <span class="p">[</span>
    <span class="s1">'source'</span> <span class="o">=&gt;</span> <span class="s1">'universal_ecommerce'</span><span class="p">,</span>
    <span class="s1">'url'</span> <span class="o">=&gt;</span> <span class="s1">'https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html'</span><span class="p">,</span>
    <span class="s1">'context'</span> <span class="o">=&gt;</span> <span class="p">[</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'session_id'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'1234567890abcdef'</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'headers'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="p">[</span>
                <span class="s1">'Accept-Language'</span> <span class="o">=&gt;</span> <span class="s1">'en-US'</span><span class="p">,</span>
                <span class="s1">'Content-Type'</span> <span class="o">=&gt;</span> <span class="s1">'application/octet-stream'</span><span class="p">,</span>
                <span class="s1">'Custom-Header'</span> <span class="o">=&gt;</span> <span class="s1">'custom header content'</span>
            <span class="p">],</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'cookies'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="p">[</span>
                <span class="p">[</span><span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'NID'</span><span class="p">,</span> <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'1234567890'</span><span class="p">],</span>
                <span class="p">[</span><span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'1P_JAR'</span><span class="p">,</span> <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'0987654321'</span><span class="p">]</span>
            <span class="p">]</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'follow_redirects'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'true'</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'successful_status_codes'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="mi">303</span><span class="p">,</span> <span class="mi">808</span><span class="p">,</span> <span class="mi">909</span><span class="p">]</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'http_method'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'get'</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'content'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'base64EncodedPOSTBody'</span>
        <span class="p">]</span>
    <span class="p">]</span>
<span class="p">];</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v1/queries"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POSTFIELDS</span><span class="p">,</span> <span class="nb">json_encode</span><span class="p">(</span><span class="nv">$params</span><span class="p">));</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POST</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$headers</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
<span class="nv">$headers</span><span class="p">[]</span> <span class="o">=</span> <span class="s2">"Content-Type: application/json"</span><span class="p">;</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_HTTPHEADER</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err"># The whole string you submit has to be URL-encoded.

https://realtime.oxylabs.io/v1/queries?source=universal_ecommerce&url=https%3A%2F%2Fstackoverflow.com%2Fquestions%2Ftagged%2Fpython&access_token=12345abcde</span></code></pre>
</div></div></div>
<p>And via SuperAPI:</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code><span class="c"># A GET request could look something like this:</span>
curl -k <span class="se">\</span>
-x http://realtime.oxylabs.io:60000 <span class="se">\</span>
-U user:pass1 <span class="se">\</span>
<span class="s2">"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"</span> <span class="se">\</span>
-H <span class="s2">"X-OxySERPs-Session-Id: 1234567890abcdef"</span> <span class="se">\</span>
-H <span class="s2">"X-OxySERPs-Geo-Location: India"</span> <span class="se">\</span>
-H <span class="s2">"Accept-Language: en-US"</span> <span class="se">\</span>
-H <span class="s2">"Content-Type: application/octet-stream"</span> <span class="se">\</span>
-H <span class="s2">"Custom-Header: custom header content"</span> <span class="se">\</span>
-H <span class="s2">"Cookie: NID=1234567890; 1P_JAR=0987654321"</span> <span class="se">\</span>
-H <span class="s2">"X-Status-Code: 303, 808, 909"</span>

<span class="c"># A POST request would have the same structure but contain a parameter specifying that it is a POST request:</span>
curl -X POST <span class="se">\</span>
-k <span class="se">\</span>
-x http://realtime.oxylabs.io:60000 <span class="se">\</span>
-U user:pass1 <span class="s2">"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"</span> <span class="se">\</span>
-H <span class="s2">"X-OxySERPs-Session-Id: 1234567890abcdef"</span> <span class="se">\</span>
-H <span class="s2">"X-OxySERPs-Geo-Location: India"</span> <span class="se">\</span>
-H <span class="s2">"Custom-Header: custom header content"</span> <span class="se">\</span>
-H <span class="s2">"Cookie: NID=1234567890; 1P_JAR=0987654321"</span> <span class="se">\</span>
-H <span class="s2">"X-Status-Code: 303, 808, 909"</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Define proxy dict. Do not forget to put your real user and pass here as well.</span>
<span class="n">proxies</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s">'http'</span><span class="p">:</span> <span class="s">'http://user:pass1@realtime.oxylabs.io:60000'</span><span class="p">,</span>
  <span class="s">'https'</span><span class="p">:</span> <span class="s">'https://user:pass1@realtime.oxylabs.io:60000'</span><span class="p">,</span>
<span class="p">}</span>

<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'GET'</span><span class="p">,</span>
    <span class="s">'https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">verify</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>  <span class="c"># Or accept our certificate.</span>
    <span class="n">proxies</span><span class="o">=</span><span class="n">proxies</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Print result page to stdout</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>

<span class="c"># Save returned HTML to result.html file</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s">'result.html'</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
    <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>
<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_PROXY</span><span class="p">,</span> <span class="s1">'realtime.oxylabs.io:60000'</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_PROXYUSERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_SSL_VERIFYPEER</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_SSL_VERIFYHOST</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is not supported with SuperAPI</span></code></pre>
</div></div></div>
<hr />
<h2 id="parameter-values">Parameter Values</h2>
<h3 id="geo_location">Geo_Location</h3>
<p>Full list of supported geo locations can be found in CSV format <a class="custom_link" href="https://developers.oxylabs.io/resources/universal-supported-geo_location-values.csv" target="_blank" rel="noopener">here</a>.</p>
<pre class="highlight json tab-json"><code><span class="s2">"United Arab Emirates"</span><span class="p">,</span>
<span class="s2">"Albania"</span><span class="p">,</span>
<span class="s2">"Armenia"</span><span class="p">,</span>
<span class="s2">"Angola"</span><span class="p">,</span>
<span class="s2">"Argentina"</span><span class="p">,</span>
<span class="s2">"Australia"</span><span class="p">,</span>
<span class="err">...</span>
<span class="s2">"Uruguay"</span><span class="p">,</span>
<span class="s2">"Uzbekistan"</span><span class="p">,</span>
<span class="s2">"Venezuela Bolivarian Republic of"</span><span class="p">,</span>
<span class="s2">"Viet Nam"</span><span class="p">,</span>
<span class="s2">"South Africa"</span><span class="p">,</span>
<span class="s2">"Zimbabwe"</span></code></pre>
<hr />
<h3 id="http_method">HTTP_Method</h3>
<p>E-commerce Universal Scraper API supports two HTTP(S) methods: <code>GET</code> (default) and <code>POST</code>.</p>
<pre class="highlight json tab-json"><code><span class="s2">"GET"</span><span class="p">,</span>
<span class="s2">"POST"</span></code></pre>
<hr />
<h3 id="render">Render</h3>
<p>E-commerce Universal Scraper API can render Javascript and return either a rendered HTML document or a PNG screenshot of the web page.</p>
<pre class="highlight json tab-json"><code><span class="s2">"html"</span><span class="p">,</span>
<span class="s2">"png"</span></code></pre>
<hr />
<h3 id="user_agent_type">User_Agent_Type</h3>
<p>Download full list of <code>user_agent_type</code> values in JSON <a class="custom_link" href="https://developers.oxylabs.io/resources/user_agent_type.json" target="_blank" rel="noopener">here</a>.</p>
<pre class="highlight json tab-json"><code><span class="p">[</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random desktop browser User-Agent"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop_firefox"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of desktop Firefox"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop_chrome"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of desktop Chrome"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop_opera"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of desktop Opera"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop_edge"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of desktop Edge"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop_safari"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of desktop Safari"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"mobile"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random mobile browser User-Agent"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"mobile_android"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of Android browser"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"mobile_ios"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of iPhone browser"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"tablet"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random tablet browser User-Agent"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"tablet_android"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of Android tablet"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"tablet_ios"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of iPad tablet"</span>
  <span class="p">}</span>
<span class="p">]</span></code></pre>
<hr />
<h2 id="account-status">Account Status</h2>
<h3 id="usage-statistics">Usage Statistics</h3>
<p>You can find your usage statistics by querying the following endpoint:</p>
<div class="endpoint">
<pre><strong>GET https://data.oxylabs.io/v2/stats</strong></pre>
</div>
<p>By default, the API will return all-time usage statistics. Adding <code>?group_by=month</code> will return monthly stats, while <code>?group_by=day</code> will return daily numbers.</p>
<p>This query will return all-time statistics. You can find your daily and monthly usage by adding either <code>?group_by=day</code> or <code>?group_by=month</code></p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="3" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="s1">'https://data.oxylabs.io/v2/stats'</span>
</code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Get response from stats endpoint.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="n">method</span><span class="o">=</span><span class="s">'GET'</span><span class="p">,</span>
    <span class="n">url</span><span class="o">=</span><span class="s">'https://data.oxylabs.io/v2/stats'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
<span class="p">)</span>

<span class="c"># Print prettified JSON response to stdout.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v2/stats"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_CUSTOMREQUEST</span><span class="p">,</span> <span class="s2">"GET"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div></div></div>
<p>Sample output:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
    <span class="s2">"data"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s2">"sources"</span><span class="p">:</span> <span class="p">[</span>
            <span class="p">{</span>
                <span class="s2">"realtime_results_count"</span><span class="p">:</span> <span class="s2">"90"</span><span class="p">,</span>
                <span class="s2">"results_count"</span><span class="p">:</span> <span class="s2">"10"</span><span class="p">,</span>
                <span class="s2">"title"</span><span class="p">:</span> <span class="s2">"universal_ecommerce"</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">},</span>
    <span class="s2">"meta"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s2">"group_by"</span><span class="p">:</span> <span class="kc">null</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre>
<hr />
<h3 id="limits">Limits</h3>
<p>The following endpoint will give your monthly commitment information as well as how much of it has already been used:</p>
<div class="endpoint">
<pre><strong>GET https://data.oxylabs.io/v2/stats/limits</strong></pre>
</div>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="3" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="s1">'https://data.oxylabs.io/v2/stats/limits'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Get response from stats endpoint.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="n">method</span><span class="o">=</span><span class="s">'GET'</span><span class="p">,</span>
    <span class="n">url</span><span class="o">=</span><span class="s">'https://data.oxylabs.io/v2/stats/limits'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
<span class="p">)</span>

<span class="c"># Print prettified JSON response to stdout.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v2/stats/limits"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_CUSTOMREQUEST</span><span class="p">,</span> <span class="s2">"GET"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div></div></div>
<p>Sample output:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
    <span class="s2">"monthly_requests_commitment"</span><span class="p">:</span> <span class="mi">4500000</span><span class="p">,</span>
    <span class="s2">"used_requests"</span><span class="p">:</span> <span class="mi">985000</span>
<span class="p">}</span></code></pre>
<hr />
<h2 id="response-codes">Response Codes</h2>
<table>
<thead>
<tr>
<th>Code</th>
<th>Status</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>204</code></td>
<td>No Content</td>
<td>You are trying to retrieve a job that has not been completed yet.</td>
</tr>
<tr>
<td><code>400</code></td>
<td>Multiple error messages</td>
<td>Bad request structure, could be a misspelled parameter or invalid value. The response body will have a more specific error message.</td>
</tr>
<tr>
<td><code>401</code></td>
<td>&#8216;Authorization header not provided' / &#8216;Invalid authorization header' / &#8216;Client not found'</td>
<td>Missing authorization header or incorrect login credentials.</td>
</tr>
<tr>
<td><code>403</code></td>
<td>Forbidden</td>
<td>Your account does not have access to this resource.</td>
</tr>
<tr>
<td><code>404</code></td>
<td>Not Found</td>
<td>Job ID you are looking for is no longer available.</td>
</tr>
<tr>
<td><code>429</code></td>
<td>Too many requests</td>
<td>Exceeded rate limit. Please contact your account manager to increase limits.</td>
</tr>
<tr>
<td><code>500</code></td>
<td>Unknown Error</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>524</code></td>
<td>Timeout</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>612</code></td>
<td>Undefined Internal Error</td>
<td>Something went wrong and we failed the job you submitted. You can try again at no extra cost, as we do not charge you for <code>faulted</code> jobs. If that does not work, please get in touch with us.</td>
</tr>
<tr>
<td><code>613</code></td>
<td>Faulted After Too Many Retries</td>
<td>We tried scraping the job you submitted, but gave up after reaching our retry limit. You can try again at no extra cost, as we do not charge you for <code>faulted</code> jobs. If that does not work, please get in touch with us.</td>
</tr>
</tbody>
</table>
<hr />
<h4>References</h4>
<ul>
<li style="list-style-type: none;">
<ul>
<li><a href="https://developers.oxylabs.io/scraper-apis/ecommerce_scraper_api/source/universal/index.html#quick-start" target="_blank" rel="nofollow noopener">https://developers.oxylabs.io/scraper-apis/ecommerce_scraper_api/source/universal/index.html#quick-start</a></li>
<li><a href="https://developers.oxylabs.io/scraper-apis/" target="_blank" rel="nofollow noopener">https://developers.oxylabs.io/scraper-apis/ </a></li>
</ul>
</li>
</ul>
<hr />
<blockquote><p><strong>Disclaimer:</strong> This part of the content is mainly from the merchant. If the merchant does not want it to be displayed on my website, please <a href="https://www.proxysp.com/contact-us/">contact us</a> to delete your content.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://proxysp.com/oxylabs-ecommerce-scraper-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">9117</post-id>	</item>
		<item>
		<title>How to Use Oxylabs Scraper API [Part 2]: Oxylabs Web Scraper API</title>
		<link>https://proxysp.com/oxylabs-web-scraper-api/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oxylabs-web-scraper-api</link>
					<comments>https://proxysp.com/oxylabs-web-scraper-api/#respond</comments>
		
		<dc:creator><![CDATA[proxysp]]></dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
				<category><![CDATA[How to Use OxyLabs Proxy (OxyLabs User Manual Navigation)]]></category>
		<guid isPermaLink="false">https://www.proxysp.com/?p=9062</guid>

					<description><![CDATA[Do you know how to use Oxylabs Web Scraper API? This is the most comprehensive introduction from OxyLabs official. Quick Start Web Scraper API is built &#8230;<p class="read-more"> <a class="ast-button" href="https://proxysp.com/oxylabs-web-scraper-api/"> <span class="screen-reader-text">How to Use Oxylabs Scraper API [Part 2]: Oxylabs Web Scraper API</span> Read More &#187;</a></p>]]></description>
										<content:encoded><![CDATA[<blockquote><p>Do you know how to use Oxylabs Web Scraper API? This is the most comprehensive introduction from OxyLabs official.</p></blockquote>
<h2><a href="https://www.proxysp.com/redirect/oxylabs" target="_blank" rel="nofollow noopener"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-9217" src="https://www.proxysp.com/wp-content/uploads/2021/11/Oxylabs-Web-Scraper-API-pricing.jpg" alt="Oxylabs Web Scraper API pricing" width="898" height="500" srcset="https://proxysp.com/wp-content/uploads/2021/11/Oxylabs-Web-Scraper-API-pricing.jpg 898w, https://proxysp.com/wp-content/uploads/2021/11/Oxylabs-Web-Scraper-API-pricing-300x167.jpg 300w, https://proxysp.com/wp-content/uploads/2021/11/Oxylabs-Web-Scraper-API-pricing-768x428.jpg 768w" sizes="(max-width: 898px) 100vw, 898px" /></a></h2>
<h2 id="quick-start">Quick Start</h2>
<p>Web Scraper API is built to help you in your heavy-duty data retrieval operations. You can use Web Scraper API to access various public pages. It enables effortless web data extraction without any delays or errors.</p>
<p>Web Scraper API uses <a class="custom_link" href="https://en.wikipedia.org/wiki/Basic_access_authentication" target="_blank" rel="nofollow noopener">basic HTTP authentication</a> that requires sending username and password.</p>
<p>This is by far the fastest way to start using Web Scraper API. You will make a request to <code>https://ip.oxylabs.io</code> using <a class="custom_link" href="#realtime" target="_blank" rel="noopener">Realtime</a> integration method. Don't forget to replace <code>USERNAME</code> and <code>PASSWORD</code> with your proxy user credentials.</p>
<pre>curl --user "USERNAME:PASSWORD" 'https://realtime.oxylabs.io/v1/queries' -H "Content-Type: application/json" -d '{"source": "universal", "url": "https://ip.oxylabs.io"}'
</pre>
<p>If you have any questions not covered by this documentation, please contact your account manager or our support staff at <a class="custom_link" href="mailto:support@oxylabs.io">support@oxylabs.io</a>.</p>
<hr />
<h2 id="integration-methods">Integration Methods</h2>
<p>Web Scraper API supports three integration methods which have their unique benefits:</p>
<ul>
<li><a href="#push-pull">Push-Pull</a>. Using this method it is now required to mainain an active connection with our endpoint to retrieve the data. Upon making a request, our system is able to automatically ping users server when the job is done (see  <a href="#Callback">Callback</a>). This method saves computing resources and can be scaled easily.</li>
<li><a class="custom_link" href="#realtime">Realtime</a>. The method requires user to maintain an active connection with our endpoint in order to get the results successfully when the job is completed. This method can be implemented into one service while Push-Pull method is a two step process.</li>
<li><a class="custom_link" href="#superapi">SuperAPI</a>. This method is very similar to Realtime but instead posting data to our endpoint, user can use HTML Cralwer as a proxy. To retrieve the data, user must set up a proxy endpoint and make GET request to a desired URL. Additional parameters must be added using headers.</li>
</ul>
<p>Our recommended data extraction method is <a class="custom_link" href="#push-pull">Push-Pull</a>.</p>
<hr />
<h3 id="push-pull">Push-Pull</h3>
<p>This is the most simple yet the most reliable and recommended data delivery method. In Push-Pull scenario you send us a query, we return you job <code>id</code>, and once the job is done you can use that <code>id</code> to retrieve content from <code>/results</code> endpoint. You can check job completion status yourself, or you can set up a simple listener that is able to accept POST queries. This way, we will send you a callback message once the job is ready to be retrieved. In this particular example the results will be automatically <a class="custom_link" href="#upload-to-storage">uploaded to your S3 bucket</a> named <code>YOUR_BUCKET_NAME</code>.</p>
<hr />
<h4 id="single-query">Single Query</h4>
<p>The following endpoint will handle single queries for one keyword or URL. The API will return a confirmation message containing job information, including job <code>id</code>. You can check job completion status using that <code>id</code>, or you can ask us to ping your callback endpoint once the scraping task is finished by adding <code>callback_url</code> in the query.</p>
<div class="endpoint">
<pre><strong>POST https://data.oxylabs.io/v1/queries</strong></pre>
</div>
<p>You need to post query parameters as data in the JSON body.</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1<span class="se">\</span>
<span class="s1">'https://data.oxylabs.io/v1/queries'</span> <span class="se">\</span>
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
-d <span class="s1">'{"source": "universal", "url": "https://stackoverflow.com/questions/tagged/python", "callback_url": "https://your.callback.url", "storage_type": "s3", "storage_url": "YOUR_BUCKET_NAME"}'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>


<span class="c"># Structure payload.</span>
<span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'source'</span><span class="p">:</span> <span class="s">'universal'</span><span class="p">,</span>
    <span class="s">'url'</span><span class="p">:</span> <span class="s">'https://stackoverflow.com/questions/tagged/python'</span><span class="p">,</span>
    <span class="s">'callback_url'</span><span class="p">:</span> <span class="s">'https://your.callback.url'</span><span class="p">,</span>
    <span class="s">'storage_type'</span><span class="p">:</span> <span class="s">'s3'</span><span class="p">,</span>
    <span class="s">'storage_url'</span><span class="p">:</span> <span class="s">'YOUR_BUCKET_NAME'</span>
<span class="p">}</span>

<span class="c"># Get response.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'POST'</span><span class="p">,</span>
    <span class="s">'https://data.oxylabs.io/v1/queries'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Print prettified response to stdout.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$params</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
    <span class="s1">'source'</span> <span class="o">=&gt;</span> <span class="s1">'universal'</span><span class="p">,</span>
    <span class="s1">'url'</span> <span class="o">=&gt;</span> <span class="s1">'https://stackoverflow.com/questions/tagged/python'</span><span class="p">,</span>
    <span class="s1">'callback_url'</span> <span class="o">=&gt;</span> <span class="s1">'https://your.callback.url'</span><span class="p">,</span>
    <span class="s1">'storage_type'</span> <span class="o">=&gt;</span> <span class="s1">'s3'</span><span class="p">,</span>
    <span class="s1">'storage_url'</span> <span class="o">=&gt;</span> <span class="s1">'YOUR_BUCKET_NAME'</span>
<span class="p">);</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v1/queries"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POSTFIELDS</span><span class="p">,</span> <span class="nb">json_encode</span><span class="p">(</span><span class="nv">$params</span><span class="p">));</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POST</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$headers</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
<span class="nv">$headers</span><span class="p">[]</span> <span class="o">=</span> <span class="s2">"Content-Type: application/json"</span><span class="p">;</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_HTTPHEADER</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is currently not supported</span></code></pre>
</div></div></div>
<p>The API will respond with query information in JSON format, by printing it in the response body, similar to this:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
  <span class="s2">"callback_url"</span><span class="p">:</span> <span class="s2">"https://your.callback.url"</span><span class="p">,</span>
  <span class="s2">"client_id"</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
  <span class="s2">"created_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
  <span class="s2">"domain"</span><span class="p">:</span> <span class="s2">"com"</span><span class="p">,</span>
  <span class="s2">"geo_location"</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
  <span class="s2">"id"</span><span class="p">:</span> <span class="s2">"12345678900987654321"</span><span class="p">,</span>
  <span class="s2">"limit"</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
  <span class="s2">"locale"</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
  <span class="s2">"pages"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
  <span class="s2">"parse"</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
  <span class="s2">"render"</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
  <span class="s2">"url"</span><span class="p">:</span> <span class="s2">"https://stackoverflow.com/questions/tagged/python"</span><span class="p">,</span>
  <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"universal"</span><span class="p">,</span>
  <span class="s2">"start_page"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
  <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"pending"</span><span class="p">,</span>
  <span class="s2">"storage_type"</span><span class="p">:</span> <span class="s2">"s3"</span><span class="p">,</span>
  <span class="s2">"storage_url"</span><span class="p">:</span> <span class="s2">"YOUR_BUCKET_NAME/12345678900987654321.json"</span><span class="p">,</span>
  <span class="s2">"subdomain"</span><span class="p">:</span> <span class="s2">"www"</span><span class="p">,</span>
  <span class="s2">"updated_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
  <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop"</span><span class="p">,</span>
  <span class="s2">"_links"</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="s2">"rel"</span><span class="p">:</span> <span class="s2">"self"</span><span class="p">,</span>
      <span class="s2">"href"</span><span class="p">:</span> <span class="s2">"http://data.oxylabs.io/v1/queries/12345678900987654321"</span><span class="p">,</span>
      <span class="s2">"method"</span><span class="p">:</span> <span class="s2">"GET"</span>
    <span class="p">},</span>
    <span class="p">{</span>
      <span class="s2">"rel"</span><span class="p">:</span> <span class="s2">"results"</span><span class="p">,</span>
      <span class="s2">"href"</span><span class="p">:</span> <span class="s2">"http://data.oxylabs.io/v1/queries/12345678900987654321/results"</span><span class="p">,</span>
      <span class="s2">"method"</span><span class="p">:</span> <span class="s2">"GET"</span>
    <span class="p">}</span>
  <span class="p">]</span>
<span class="p">}</span></code></pre>
<hr />
<h4 id="check-job-status">Check Job Status</h4>
<p>If your query had a <code>callback_url</code>, we will send you a message containing a link to the content once the scraping task is done. However, if there was no <code>callback_url</code> in the query, you will need to check the job status yourself. For that, you need to use the URL in <code>href</code> under <code>rel</code>:<code>self</code> in the response message you received after submitting your query to our API. It should look similar to this: <code>http://data.oxylabs.io/v1/queries/12345678900987654321</code>.</p>
<div class="endpoint">
<pre><strong>GET https://data.oxylabs.io/v1/queries/{id}</strong></pre>
</div>
<p>Querying this link will return the job information, including its <code>status</code>. There are three possible <code>status</code> values:</p>
<div class="su-table su-table-responsive">
<table>
<thead>
<tr>
<td><code>pending</code></td>
<td>The job is still in the queue and has not been completed.</td>
</tr>
<tr>
<td><code>done</code></td>
<td>The job is completed, you may retrieve the result by querying the URL in <code>href</code> under <code>rel</code>:<code>results</code> : <code>http://data.oxylabs.io/v1/queries/12345678900987654321/results</code></td>
</tr>
<tr>
<td><code>faulted</code></td>
<td>There was an issue with the job, and we could not complete it, most likely due to a server error on the target site's side.</td>
</tr>
</thead>
</table>
</div>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="s1">'https://data.oxylabs.io/v1/queries/batch'</span> -H <span class="s1">'Content-Type: application/json'</span> <span class="se">\</span>
 -d <span class="s1">'@keywords.json'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">import</span> <span class="nn">json</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>


<span class="c"># Get payload from file.</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s">'keywords.json'</span><span class="p">,</span> <span class="s">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
    <span class="n">payload</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>

<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'POST'</span><span class="p">,</span>
    <span class="s">'https://data.oxylabs.io/v1/queries/batch'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Print prettified response.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$paramsFile</span> <span class="o">=</span> <span class="nb">file_get_contents</span><span class="p">(</span><span class="nb">realpath</span><span class="p">(</span><span class="s2">"keywords.json"</span><span class="p">));</span>
<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v1/queries/batch"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POSTFIELDS</span><span class="p">,</span> <span class="nv">$paramsFile</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POST</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$headers</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
<span class="nv">$headers</span><span class="p">[]</span> <span class="o">=</span> <span class="s2">"Content-Type: application/json"</span><span class="p">;</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_HTTPHEADER</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is currently not supported</span></code></pre>
</div></div></div>
<p><code>keywords.json</code> content:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>  
   <span class="s2">"url"</span><span class="p">:[</span>  
      <span class="s2">"https://stackoverflow.com/questions/tagged/python"</span><span class="p">,</span>
      <span class="s2">"https://stackoverflow.com/questions/tagged/golang"</span><span class="p">,</span>
      <span class="s2">"https://stackoverflow.com/questions/tagged/php"</span>
   <span class="p">],</span>
   <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"universal"</span><span class="p">,</span>
   <span class="s2">"callback_url"</span><span class="p">:</span> <span class="s2">"https://your.callback.url"</span>
<span class="p">}</span>
</code></pre>
<p>The API will respond with query information in JSON format, by printing it in the response body, similar to this:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
  <span class="s2">"queries"</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="s2">"callback_url"</span><span class="p">:</span> <span class="s2">"https://your.callback.url"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
      <span class="s2">"created_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
      <span class="s2">"domain"</span><span class="p">:</span> <span class="s2">"com"</span><span class="p">,</span>
      <span class="s2">"id"</span><span class="p">:</span> <span class="s2">"12345678900987654321"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
      <span class="s2">"url"</span><span class="p">:</span> <span class="s2">"https://stackoverflow.com/questions/tagged/python"</span><span class="p">,</span>
      <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"universal"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
          <span class="s2">"rel"</span><span class="p">:</span> <span class="s2">"results"</span><span class="p">,</span>
          <span class="s2">"href"</span><span class="p">:</span> <span class="s2">"http://data.oxylabs.io/v1/queries/12345678900987654321/results"</span><span class="p">,</span>
          <span class="s2">"method"</span><span class="p">:</span> <span class="s2">"GET"</span>
        <span class="p">}</span>
      <span class="p">]</span>
    <span class="p">},</span>
    <span class="p">{</span>
      <span class="s2">"callback_url"</span><span class="p">:</span> <span class="s2">"https://your.callback.url"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
      <span class="s2">"created_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
      <span class="s2">"domain"</span><span class="p">:</span> <span class="s2">"com"</span><span class="p">,</span>
      <span class="s2">"id"</span><span class="p">:</span> <span class="s2">"12345678901234567890"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
      <span class="s2">"url"</span><span class="p">:</span> <span class="s2">"https://stackoverflow.com/questions/tagged/golang"</span><span class="p">,</span>
      <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"universal"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
          <span class="s2">"rel"</span><span class="p">:</span> <span class="s2">"results"</span><span class="p">,</span>
          <span class="s2">"href"</span><span class="p">:</span> <span class="s2">"http://data.oxylabs.io/v1/queries/12345678901234567890/results"</span><span class="p">,</span>
          <span class="s2">"method"</span><span class="p">:</span> <span class="s2">"GET"</span>
        <span class="p">}</span>
      <span class="p">]</span>
    <span class="p">},</span>
    <span class="p">{</span>
      <span class="s2">"callback_url"</span><span class="p">:</span> <span class="s2">"https://your.callback.url"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
      <span class="s2">"created_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
      <span class="s2">"domain"</span><span class="p">:</span> <span class="s2">"com"</span><span class="p">,</span>
      <span class="s2">"id"</span><span class="p">:</span> <span class="s2">"01234567899876543210"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
      <span class="s2">"url"</span><span class="p">:</span> <span class="s2">"https://stackoverflow.com/questions/tagged/php"</span><span class="p">,</span>
      <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"universal"</span><span class="p">,</span>
      <span class="p">{</span><span class="err">...</span><span class="p">}</span>
          <span class="s2">"rel"</span><span class="p">:</span> <span class="s2">"results"</span><span class="p">,</span>
          <span class="s2">"href"</span><span class="p">:</span> <span class="s2">"http://data.oxylabs.io/v1/queries/01234567899876543210/results"</span><span class="p">,</span>
          <span class="s2">"method"</span><span class="p">:</span> <span class="s2">"GET"</span>
        <span class="p">}</span>
      <span class="p">]</span>
    <span class="p">}</span>
  <span class="p">]</span>
<span class="p">}</span></code></pre>
<hr />
<h4 id="get-notifier-ip-address-list">Get Notifier IP Address List</h4>
<p>You may want to whitelist the IPs sending you callback messages or get the list of these IPs for other purposes. This can be done by <code>GET</code>ing this endpoint: <code>https://data.oxylabs.io/v1/info/callbacker_ips</code>.</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="s1">'https://data.oxylabs.io/v1/info/callbacker_ips'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Get response from the callback IPs endpoint.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="n">method</span><span class="o">=</span><span class="s">'GET'</span><span class="p">,</span>
    <span class="n">url</span><span class="o">=</span><span class="s">'https://data.oxylabs.io/v1/info/callbacker_ips'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
<span class="p">)</span>

<span class="c"># Print the prettified JSON response to stdout.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v1/info/callbacker_ips"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_CUSTOMREQUEST</span><span class="p">,</span> <span class="s2">"GET"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is currently not supported</span></code></pre>
</div></div></div>
<p>The API will return the list of IPs making callback requests to your system:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
    <span class="s2">"ips"</span><span class="p">:</span> <span class="p">[</span>
        <span class="s2">"x.x.x.x"</span><span class="p">,</span>
        <span class="s2">"y.y.y.y"</span>
    <span class="p">]</span>
<span class="p">}</span></code></pre>
<hr />
<h4 id="upload-to-storage">Upload to Storage</h4>
<p>By default, Web Scraper API's job results are stored in our databases. This means that you will need to query our results endpoint and retrieve the content yourself. Custom storage feature allows you to store results in your own cloud storage. The advantages of this feature are that you do not need extra requests to fetch results &#8211; everything goes directly to your storage bucket.</p>
<p>At the moment, we only support Amazon S3. If you want to use a different type of storage, contact your account manager to discuss the timeline.</p>
<p>In order to upload job results to your Amazon S3 bucket, you need to set up special permissions. To do that, go to <code>https://s3.console.aws.amazon.com/ &gt; S3 &gt; Storage &gt; Bucket Name (if don't have one, create new) &gt; Permissions &gt; Bucket Policy</code></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-9064" src="https://www.proxysp.com/wp-content/uploads/2021/11/oxylabs-web-scraper-api-upload-to-storage.png" alt="oxylabs web scraper api upload to storage" width="481" height="321" srcset="https://proxysp.com/wp-content/uploads/2021/11/oxylabs-web-scraper-api-upload-to-storage.png 481w, https://proxysp.com/wp-content/uploads/2021/11/oxylabs-web-scraper-api-upload-to-storage-300x200.png 300w" sizes="(max-width: 481px) 100vw, 481px" /></p>
<p>You can find the bucket policy in this <a class="custom_link" href="https://developers.oxylabs.io/resources/s3_bucket_policy.json" target="_blank" rel="noopener">JSON</a> or in the code sample area on the right. Do not forget to change the bucket name under <code>YOUR_BUCKET_NAME</code>. This policy allows us to write to your bucket, upload files for you, and know the bucket location.</p>
<p>To use this feature and you will need to specify two additional parameters in your requests. Learn more <a href="#direct">here</a>.</p>
<p>The upload path looks like this: <code>YOUR_BUCKET_NAME/job_ID.json</code>. You will find the job ID in the response body that you will receive from us after submitting a request. In <a class="custom_link" href="https://developers.oxylabs.io/scraper-apis/web_scraper_api/source/web-scraper-api/index.html?php#single-query" target="_blank" rel="noopener">this example</a> job ID is <code>12345678900987654321</code>.</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
    <span class="s2">"Version"</span><span class="p">:</span> <span class="s2">"2012-10-17"</span><span class="p">,</span>
    <span class="s2">"Id"</span><span class="p">:</span> <span class="s2">"Policy1577442634787"</span><span class="p">,</span>
    <span class="s2">"Statement"</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
            <span class="s2">"Sid"</span><span class="p">:</span> <span class="s2">"Stmt1577442633719"</span><span class="p">,</span>
            <span class="s2">"Effect"</span><span class="p">:</span> <span class="s2">"Allow"</span><span class="p">,</span>
            <span class="s2">"Principal"</span><span class="p">:</span> <span class="p">{</span>
                <span class="s2">"AWS"</span><span class="p">:</span> <span class="s2">"arn:aws:iam::324311890426:user/oxylabs.s3.uploader"</span>
            <span class="p">},</span>
            <span class="s2">"Action"</span><span class="p">:</span> <span class="s2">"s3:GetBucketLocation"</span><span class="p">,</span>
            <span class="s2">"Resource"</span><span class="p">:</span> <span class="s2">"arn:aws:s3:::YOUR_BUCKET_NAME"</span>
        <span class="p">},</span>
        <span class="p">{</span>
            <span class="s2">"Sid"</span><span class="p">:</span> <span class="s2">"Stmt1577442633719"</span><span class="p">,</span>
            <span class="s2">"Effect"</span><span class="p">:</span> <span class="s2">"Allow"</span><span class="p">,</span>
            <span class="s2">"Principal"</span><span class="p">:</span> <span class="p">{</span>
                <span class="s2">"AWS"</span><span class="p">:</span> <span class="s2">"arn:aws:iam::324311890426:user/oxylabs.s3.uploader"</span>
            <span class="p">},</span>
            <span class="s2">"Action"</span><span class="p">:</span> <span class="p">[</span>
                <span class="s2">"s3:PutObject"</span><span class="p">,</span>
                <span class="s2">"s3:PutObjectAcl"</span>
            <span class="p">],</span>
            <span class="s2">"Resource"</span><span class="p">:</span> <span class="s2">"arn:aws:s3:::YOUR_BUCKET_NAME/*"</span>
        <span class="p">}</span>
    <span class="p">]</span>
<span class="p">}</span></code></pre>
<hr />
<h3 id="realtime">Realtime</h3>
<p>The data submission is the same as in Push-Pull method, but with Realtime, we will return the content on open connection. You send us a query, the connection remains open, we retrieve the content, and bring it to you. The endpoint that handles that is this:</p>
<div class="endpoint">
<pre><strong>POST https://realtime.oxylabs.io/v1/queries</strong></pre>
</div>
<p>The timeout limit for open connections is 100 seconds. Therefore, in rare cases of heavy load, we may not be able to ensure the data gets to you.</p>
<p>You need to post query parameters as data in the JSON body. Please see an example for more details.</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="s1">'https://realtime.oxylabs.io/v1/queries'</span> -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
 -d <span class="s1">'{"source": "universal", "url": "https://stackoverflow.com/questions/tagged/python"}'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>


<span class="c"># Structure payload.</span>
<span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'source'</span><span class="p">:</span> <span class="s">'universal'</span><span class="p">,</span>
    <span class="s">'url'</span><span class="p">:</span> <span class="s">'https://stackoverflow.com/questions/tagged/python'</span><span class="p">,</span>
<span class="p">}</span>

<span class="c"># Get response.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'POST'</span><span class="p">,</span>
    <span class="s">'https://realtime.oxylabs.io/v1/queries'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Instead of response with job status and results url, this will return the</span>
<span class="c"># JSON response with results.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$params</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
    <span class="s1">'source'</span> <span class="o">=&gt;</span> <span class="s1">'universal'</span><span class="p">,</span>
    <span class="s1">'query'</span> <span class="o">=&gt;</span> <span class="s1">'sofa'</span><span class="p">,</span>
<span class="p">);</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://realtime.oxylabs.io/v1/queries"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POSTFIELDS</span><span class="p">,</span> <span class="nb">json_encode</span><span class="p">(</span><span class="nv">$params</span><span class="p">));</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POST</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$headers</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
<span class="nv">$headers</span><span class="p">[]</span> <span class="o">=</span> <span class="s2">"Content-Type: application/json"</span><span class="p">;</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_HTTPHEADER</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err"># URL has to be encoded to escape `&` and `=` characters. It is not necessary in this example.

https://realtime.oxylabs.io/v1/queries?source=universal&url=https://stackoverflow.com/questions/tagged/python&access_token=12345abcde</span></code></pre>
</div></div></div>
<p>Example response body that will be returned on open connection:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
  <span class="s2">"results"</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="s2">"content"</span><span class="p">:</span> <span class="s2">"&lt;html&gt;
      CONTENT
      &lt;/html&gt;"</span>
      <span class="s2">"created_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:01"</span><span class="p">,</span>
      <span class="s2">"updated_at"</span><span class="p">:</span> <span class="s2">"2019-10-01 00:00:15"</span><span class="p">,</span>
      <span class="s2">"id"</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
      <span class="s2">"page"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
      <span class="s2">"url"</span><span class="p">:</span> <span class="s2">"https://stackoverflow.com/questions/tagged/python"</span><span class="p">,</span>
      <span class="s2">"job_id"</span><span class="p">:</span> <span class="s2">"12345678900987654321"</span><span class="p">,</span>
      <span class="s2">"status_code"</span><span class="p">:</span> <span class="mi">200</span>
    <span class="p">}</span>
  <span class="p">]</span>
<span class="p">}</span></code></pre>
<hr />
<h3 id="superapi">SuperAPI</h3>
<p>If you have ever used regular proxies for data scraping, integrating SuperAPI delivery method will be a breeze. You simply need to use our entry node as proxy, authorize with Web Scraper API credentials, and ignore certificates. In <code>cURL</code> it's <code>-k</code> or <code>--insecure</code>. Your data will reach you on open connection.</p>
<div class="endpoint">
<pre><strong>GET realtime.oxylabs.io:60000</strong></pre>
</div>
<p>SuperAPI only supports a handful of parameters since it <strong>only works with <a class="custom_link" href="#direct">Direct</a> data source</strong> where a full URL is provided. These parameters should be sent as headers. This is a list of accepted parameters:</p>
<table>
<tbody>
<tr>
<td><code>X-OxySERPs-User-Agent-Type</code></td>
<td>There is no way to indicate a specific User-Agent, but you can let us know which browser and platform to use. A list of supported User-Agents can be found <a class="custom_link" href="#user_agent_type">here</a>.</td>
</tr>
</tbody>
</table>
<p>If you need help setting up SuperAPI, get in touch with us at <a class="custom_link" href="mailto:support@oxylabs.io">support@oxylabs.io</a>.</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl -k <span class="se">\</span>
-x realtime.oxylabs.io:60000 <span class="se">\</span>
-U user:pass1 <span class="se">\</span>
-H <span class="s2">"X-OxySERPs-User-Agent-Type: desktop_chrome"</span> <span class="se">\</span>
<span class="s2">"https://stackoverflow.com/questions/tagged/python"</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Define proxy dict. Do not forget to put your real user and pass here as well.</span>
<span class="n">proxies</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s">'http'</span><span class="p">:</span> <span class="s">'http://user:pass1@realtime.oxylabs.io:60000'</span><span class="p">,</span>
  <span class="s">'https'</span><span class="p">:</span> <span class="s">'https://user:pass1@realtime.oxylabs.io:60000'</span><span class="p">,</span>
<span class="p">}</span>

<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'GET'</span><span class="p">,</span>
    <span class="s">'https://stackoverflow.com/questions/tagged/python'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">verify</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>  <span class="c"># Or accept our certificate.</span>
    <span class="n">proxies</span><span class="o">=</span><span class="n">proxies</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Print result page to stdout</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>

<span class="c"># Save returned HTML to result.html file</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s">'result.html'</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
    <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>
<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://stackoverflow.com/questions/tagged/python"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_PROXY</span><span class="p">,</span> <span class="s1">'realtime.oxylabs.io:60000'</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_PROXYUSERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_SSL_VERIFYPEER</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_SSL_VERIFYHOST</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is not supported with SuperAPI</span></code></pre>
</div></div></div>
<hr />
<h2 id="content-type">Content Type</h2>
<p>Web Scraper API returns <strong>raw HTML</strong>.</p>
<h3 id="download-images">Download Images</h3>
<p>It is possible to download images via Web Scraper API. If you are doing that through SuperAPI, you can simply save the output to image extension. For example:</p>
<p><code>curl -k -x realtime.oxylabs.io:60000 -U user:pass1 "https://example.com/image.jpg" &gt;&gt; image.jpg</code></p>
<p>If you are using <a class="custom_link" href="#push-pull">Push-Pull</a> or <a class="custom_link" href="#realtime">Realtime</a> methods, you will need to add <code>content_encoding</code> parameter with a value of <code>base64</code>. Once you receive the results, you then need to decode encoded data from <code>content</code> into bytes and save it as an image file. Please find an example in Python on the right.</p>
<hr />
<h2 id="data-sources">Data Sources</h2>
<p>Web Scraper API accepts URLs, along with additional parameters, such as User-Agent type, proxy location, and others. See this method, which we call <a class="custom_link" href="#direct">Direct</a>, described below.</p>
<p>Web Scraper API is able to render JavaScript when scraping. This enables you to get more data from the web page and get screenshots.</p>
<p>If you are unsure about any part of the documentation, drop us a line at <a class="custom_link" href="mailto:support@oxylabs.io">support@oxylabs.io</a> or contact your account manager.</p>
<hr />
<h3 id="direct">Direct</h3>
<p><img loading="lazy" decoding="async" class="size-full wp-image-9103 alignleft" src="https://www.proxysp.com/wp-content/uploads/2021/11/Oxylabs-Web-Scraper-Api-Direct-1.png" alt="Oxylabs Web Scraper Api Direct" width="427" height="21" srcset="https://proxysp.com/wp-content/uploads/2021/11/Oxylabs-Web-Scraper-Api-Direct-1.png 427w, https://proxysp.com/wp-content/uploads/2021/11/Oxylabs-Web-Scraper-Api-Direct-1-300x15.png 300w" sizes="(max-width: 427px) 100vw, 427px" /></p>
<p>&nbsp;</p>
<p>Web Scraper API is designed to retrieve the contents of any URL on the internet. <code>POST</code>-ing the parameters in JSON format to the following endpoint will submit the specified URL to the extraction queue.</p>
<p><span class="test">Query parameters</span></p>
<div class="su-table su-table-responsive su-table-alternate">
<table width="439">
<tbody>
<tr>
<td style="font-weight: 400;" width="159"><strong>Parameter</strong></td>
<td style="font-weight: 400;" width="160"><strong>Description</strong></td>
<td style="font-weight: 400;" width="120"><strong>Default Value</strong></td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">source</td>
<td style="font-weight: 400;" width="160">Data source</td>
<td style="font-weight: 400;" width="120">universal</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">url</td>
<td style="font-weight: 400;" width="160">Direct URL (link) to Universal page</td>
<td style="font-weight: 400;" width="120">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">user_agent_type</td>
<td style="font-weight: 400;" width="160">Device type and browser. The full list can be found<a href="#user_agent_type"> here.</a></td>
<td style="font-weight: 400;" width="120">desktop</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">geo_location</td>
<td style="font-weight: 400;" width="160">Geo location of proxy used to retrieve the data. The full list of supported locations can be found<a href="#geo_location"> here.</a></td>
<td style="font-weight: 400;" width="120"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">locale</td>
<td style="font-weight: 400;" width="160">Locale, as expected in Accept-Language header.</td>
<td style="font-weight: 400;" width="120"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">render</td>
<td style="font-weight: 400;" width="160">Enables JavaScript rendering. Use it when the target requires JavaScript to load content. Only works via Push-Pull (a.k.a. Callback) method. There are two available values for this parameter: html(get raw output) and png (get a Base64-encoded screenshot).</td>
<td style="font-weight: 400;" width="120"></td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">content_encoding</td>
<td style="font-weight: 400;" width="160">Add this parameter if you are downloading images. Learn more<a href="#download-images"> here.</a></td>
<td style="font-weight: 400;" width="120">base64</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">context:</td>
<td style="font-weight: 400;" rowspan="2" width="160">Base64-encoded POST request body. It is only useful if http_method is set to post.</td>
<td style="font-weight: 400;" rowspan="2" width="120">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">content</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">context:</td>
<td style="font-weight: 400;" rowspan="2" width="160">Pass your own cookies.</td>
<td style="font-weight: 400;" rowspan="2" width="120">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">cookies</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">context:</td>
<td style="font-weight: 400;" rowspan="2" width="160">Indicate whether you would like the scraper to follow redirects (3xx responses with a destination URL) to get the contents of the URL at the end of the redirect chain.</td>
<td style="font-weight: 400;" rowspan="2" width="120">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">follow_redirects</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">context:</td>
<td style="font-weight: 400;" rowspan="2" width="160">Pass your own headers.</td>
<td style="font-weight: 400;" rowspan="2" width="120">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">headers</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">context:</td>
<td style="font-weight: 400;" rowspan="2" width="160">Set it to post if you would like to make a POST request to your target URL via Universal scraper.</td>
<td style="font-weight: 400;" rowspan="2" width="120">get</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">http_method</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">context:</td>
<td style="font-weight: 400;" rowspan="2" width="160">If you want to use the same proxy with multiple requests, you can do so by using this parameter. Just set your session to any string you like, and we will assign a proxy to this ID and keep it for up to 10 minutes. After that, if you make another request with the same session ID, a new proxy will be assigned to that particular session ID.</td>
<td style="font-weight: 400;" rowspan="2" width="120">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">session_id</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">context:</td>
<td style="font-weight: 400;" rowspan="2" width="160">Define a custom HTTP response code (or a few of them), upon which we should consider the scrape successful and return the content to you. May be useful if you want us to return the 503 error page or in some other non-standard cases.</td>
<td style="font-weight: 400;" rowspan="2" width="120">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">successful_status_codes</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">callback_url</td>
<td style="font-weight: 400;" width="160">URL to your callback endpoint.</td>
<td style="font-weight: 400;" width="120">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">storage_type</td>
<td style="font-weight: 400;" width="160">Storage service provider. At the moment, only Amazon S3 is supported: s3. Full implementation can be found on the <a href="#upload-to-storage">Upload to Storage </a>page. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="120">&#8211;</td>
</tr>
<tr>
<td style="font-weight: 400;" width="159">storage_url</td>
<td style="font-weight: 400;" width="160">Your Amazon S3 bucket name. Only works via Push-Pull (Callback) method.</td>
<td style="font-weight: 400;" width="120">&#8211;</td>
</tr>
</tbody>
</table>
</div>
<p><code class="required">  </code> &#8211; required parameter</p>
<p>In this example, the API will retrieve a universal product page in Push-Pull method. All available parameters are included (though not always necessary or compatible within the same request), to give you an idea on how to format your requests:</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="se">\</span>
<span class="s1">'https://data.oxylabs.io/v1/queries'</span> <span class="se">\</span>
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
 -d <span class="s1">'{"source": "universal", "url": "https://stackoverflow.com/questions/tagged/python", "user_agent_type": "mobile", "render": "html", 
 "context": [{"key": "headers", "value": ["Accept-Language": "en-US", "Content-Type": "application/octet-stream", "Custom-Header": "custom header content"]}, {"key": "cookies", "value": [{"key": "NID", "value": "1234567890"}, {"key": "1P JAR", "value": "0987654321"}, {"key": "follow_redirects", "value": true}, {"key": "http_method", "value": "get"}, {"key": "content", "value": "base64EncodedPOSTBody"}, {"key": "successful_status_codes", "value": [303, 808, 909]}]}]}'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>


<span class="c"># Structure payload.</span>
<span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'source'</span><span class="p">:</span> <span class="s">'universal'</span><span class="p">,</span>
    <span class="s">'url'</span><span class="p">:</span> <span class="s">'https://www.etsy.com/listing/399423455/big-glass-house-planter-handmade-glass?ref=hp_prn&frs=1'</span><span class="p">,</span>
    <span class="s">'user_agent_type'</span><span class="p">:</span> <span class="s">'desktop'</span><span class="p">,</span>
    <span class="s">'geo_location'</span><span class="p">:</span> <span class="s">'United States'</span><span class="p">,</span>
    <span class="s">'context'</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'session_id'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="s">'1234567890abcdef'</span>
        <span class="p">}</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'headers'</span><span class="p">,</span> <span class="s">'value'</span><span class="p">:</span> 
            <span class="p">{</span>
             <span class="s">'Accept-Language'</span><span class="p">:</span> <span class="s">'en-US'</span><span class="p">,</span>
             <span class="s">'Content-Type'</span><span class="p">:</span> <span class="s">'application/octet-stream'</span><span class="p">,</span>
             <span class="s">'Custom-Header'</span><span class="p">:</span> <span class="s">'custom header content'</span>
            <span class="p">}</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'cookies'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="p">[{</span>
              <span class="s">'key'</span><span class="p">:</span> <span class="s">'NID'</span><span class="p">,</span>
             <span class="s">'value'</span><span class="p">:</span> <span class="s">'1234567890'</span>
           <span class="p">},</span>
           <span class="p">{</span>
              <span class="s">'key'</span><span class="p">:</span> <span class="s">'1P_JAR'</span><span class="p">,</span>
             <span class="s">'value'</span><span class="p">:</span> <span class="s">'0987654321'</span>
           <span class="p">}</span>
         <span class="p">]</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'follow_redirects'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="n">true</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'successful_status_codes'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="p">[</span><span class="mi">303</span><span class="p">,</span> <span class="mi">808</span><span class="p">,</span> <span class="mi">909</span><span class="p">]</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'http_method'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="s">'get'</span>
        <span class="p">}</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'content'</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="s">'base64EncodedPOSTBody'</span>
        <span class="p">}</span>
    <span class="p">],</span>
    <span class="s">'callback_url'</span><span class="p">:</span> <span class="s">'https://your.callback.url'</span><span class="p">,</span>
<span class="p">}</span>

<span class="c"># Get response.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'POST'</span><span class="p">,</span>
    <span class="s">'https://data.oxylabs.io/v1/queries'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Print prettified response to stdout.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$params</span> <span class="o">=</span> <span class="p">[</span>
    <span class="s1">'source'</span> <span class="o">=&gt;</span> <span class="s1">'universal'</span><span class="p">,</span>
    <span class="s1">'url'</span> <span class="o">=&gt;</span> <span class="s1">'https://stackoverflow.com/questions/tagged/python'</span><span class="p">,</span>
    <span class="s1">'context'</span> <span class="o">=&gt;</span> <span class="p">[</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'session_id'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'1234567890abcdef'</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'headers'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="p">[</span>
                <span class="s1">'Accept-Language'</span> <span class="o">=&gt;</span> <span class="s1">'en-US'</span><span class="p">,</span>
                <span class="s1">'Content-Type'</span> <span class="o">=&gt;</span> <span class="s1">'application/octet-stream'</span><span class="p">,</span>
                <span class="s1">'Custom-Header'</span> <span class="o">=&gt;</span> <span class="s1">'custom header content'</span>
            <span class="p">],</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'cookies'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="p">[</span>
                <span class="p">[</span><span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'NID'</span><span class="p">,</span> <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'1234567890'</span><span class="p">],</span>
                <span class="p">[</span><span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'1P_JAR'</span><span class="p">,</span> <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'0987654321'</span><span class="p">]</span>
            <span class="p">]</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'follow_redirects'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'true'</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'successful_status_codes'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="mi">303</span><span class="p">,</span> <span class="mi">808</span><span class="p">,</span> <span class="mi">909</span><span class="p">]</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'http_method'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'get'</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'content'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'base64EncodedPOSTBody'</span>
        <span class="p">]</span>
    <span class="p">]</span>
<span class="p">];</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v1/queries"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POSTFIELDS</span><span class="p">,</span> <span class="nb">json_encode</span><span class="p">(</span><span class="nv">$params</span><span class="p">));</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POST</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$headers</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
<span class="nv">$headers</span><span class="p">[]</span> <span class="o">=</span> <span class="s2">"Content-Type: application/json"</span><span class="p">;</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_HTTPHEADER</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is currently not supported with Push-Pull</span></code></pre>
</div></div></div>
<p>Here is the same example in Realtime:</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="se">\</span>
<span class="s1">'https://data.oxylabs.io/v1/queries'</span> <span class="se">\</span>
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
-d <span class="s1">'{"source": "universal", "url": "https://stackoverflow.com/questions/tagged/python", "user_agent_type": "mobile", "context": [{"key": "headers", "value": ["Accept-Language": "en-US", "Content-Type": "application/octet-stream", "Custom-Header": "custom header content"]}, {"key": "cookies", "value": [{"key": "NID", "value": "1234567890"}, {"key": "1P JAR", "value": "0987654321"}, {"key": "follow_redirects", "value": true}, {"key": "http_method", "value": "get"}, {"key": "content", "value": "base64EncodedPOSTBody"}, {"key": "successful_status_codes", "value": [303, 808, 909]}]}]}'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Structure payload.</span>
<span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'source'</span><span class="p">:</span> <span class="s">'universal'</span><span class="p">,</span>
    <span class="s">'url'</span><span class="p">:</span> <span class="s">'https://stackoverflow.com/questions/tagged/python'</span><span class="p">,</span>
    <span class="s">'user_agent_type'</span><span class="p">:</span> <span class="s">'mobile'</span><span class="p">,</span>
    <span class="s">'geo_location'</span><span class="p">:</span> <span class="s">'United States'</span><span class="p">,</span>
    <span class="s">'context'</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'session_id'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="s">'1234567890abcdef'</span>
        <span class="p">}</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'headers'</span><span class="p">,</span> <span class="s">'value'</span><span class="p">:</span> 
            <span class="p">{</span>
             <span class="s">'Accept-Language'</span><span class="p">:</span> <span class="s">'en-US'</span><span class="p">,</span>
             <span class="s">'Content-Type'</span><span class="p">:</span> <span class="s">'application/octet-stream'</span><span class="p">,</span>
             <span class="s">'Custom-Header'</span><span class="p">:</span> <span class="s">'custom header content'</span>
            <span class="p">}</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'cookies'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="p">[{</span>
              <span class="s">'key'</span><span class="p">:</span> <span class="s">'NID'</span><span class="p">,</span>
             <span class="s">'value'</span><span class="p">:</span> <span class="s">'1234567890'</span>
           <span class="p">},</span>
           <span class="p">{</span>
              <span class="s">'key'</span><span class="p">:</span> <span class="s">'1P_JAR'</span><span class="p">,</span>
             <span class="s">'value'</span><span class="p">:</span> <span class="s">'0987654321'</span>
           <span class="p">}</span>
         <span class="p">]</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'follow_redirects'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="n">true</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'successful_status_codes'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="p">[</span><span class="mi">303</span><span class="p">,</span> <span class="mi">808</span><span class="p">,</span> <span class="mi">909</span><span class="p">]</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'http_method'</span><span class="p">,</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="s">'get'</span>
        <span class="p">}</span>
        <span class="p">{</span>
          <span class="s">'key'</span><span class="p">:</span> <span class="s">'content'</span>
          <span class="s">'value'</span><span class="p">:</span> <span class="s">'base64EncodedPOSTBody'</span>
        <span class="p">}</span>
    <span class="p">],</span>
<span class="p">}</span>

<span class="c"># Get response.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'POST'</span><span class="p">,</span>
    <span class="s">'https://realtime.oxylabs.io/v1/queries'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Instead of response with job status and results url, this will return the</span>
<span class="c"># JSON response with the result.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$params</span> <span class="o">=</span> <span class="p">[</span>
    <span class="s1">'source'</span> <span class="o">=&gt;</span> <span class="s1">'universal'</span><span class="p">,</span>
    <span class="s1">'url'</span> <span class="o">=&gt;</span> <span class="s1">'https://stackoverflow.com/questions/tagged/python'</span><span class="p">,</span>
    <span class="s1">'context'</span> <span class="o">=&gt;</span> <span class="p">[</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'session_id'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'1234567890abcdef'</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'headers'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="p">[</span>
                <span class="s1">'Accept-Language'</span> <span class="o">=&gt;</span> <span class="s1">'en-US'</span><span class="p">,</span>
                <span class="s1">'Content-Type'</span> <span class="o">=&gt;</span> <span class="s1">'application/octet-stream'</span><span class="p">,</span>
                <span class="s1">'Custom-Header'</span> <span class="o">=&gt;</span> <span class="s1">'custom header content'</span>
            <span class="p">],</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'cookies'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="p">[</span>
                <span class="p">[</span><span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'NID'</span><span class="p">,</span> <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'1234567890'</span><span class="p">],</span>
                <span class="p">[</span><span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'1P_JAR'</span><span class="p">,</span> <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'0987654321'</span><span class="p">]</span>
            <span class="p">]</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'follow_redirects'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'true'</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'successful_status_codes'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="mi">303</span><span class="p">,</span> <span class="mi">808</span><span class="p">,</span> <span class="mi">909</span><span class="p">]</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'http_method'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'get'</span>
        <span class="p">],</span>
        <span class="p">[</span>
            <span class="s1">'key'</span> <span class="o">=&gt;</span> <span class="s1">'content'</span><span class="p">,</span>
            <span class="s1">'value'</span> <span class="o">=&gt;</span> <span class="s1">'base64EncodedPOSTBody'</span>
        <span class="p">]</span>
    <span class="p">]</span>
<span class="p">];</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v1/queries"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POSTFIELDS</span><span class="p">,</span> <span class="nb">json_encode</span><span class="p">(</span><span class="nv">$params</span><span class="p">));</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_POST</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$headers</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
<span class="nv">$headers</span><span class="p">[]</span> <span class="o">=</span> <span class="s2">"Content-Type: application/json"</span><span class="p">;</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_HTTPHEADER</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err"># The whole string you submit has to be URL-encoded.

https://realtime.oxylabs.io/v1/queries?source=universal&url=https%3A%2F%2Fstackoverflow.com%2Fquestions%2Ftagged%2Fpython&access_token=12345abcde</span></code></pre>
</div></div></div>
<p>And via SuperAPI:</p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="4" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>HTTP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code><span class="c"># A GET request could look something like this:</span>
curl -k <span class="se">\</span>
-x http://realtime.oxylabs.io:60000 <span class="se">\</span>
-U user:pass1 <span class="se">\</span>
<span class="s2">"https://stackoverflow.com/questions/tagged/python"</span> <span class="se">\</span>
-H <span class="s2">"X-OxySERPs-Session-Id: 1234567890abcdef"</span> <span class="se">\</span>
-H <span class="s2">"X-OxySERPs-Geo-Location: India"</span> <span class="se">\</span>
-H <span class="s2">"Accept-Language: en-US"</span> <span class="se">\</span>
-H <span class="s2">"Content-Type: application/octet-stream"</span> <span class="se">\</span>
-H <span class="s2">"Custom-Header: custom header content"</span> <span class="se">\</span>
-H <span class="s2">"Cookie: NID=1234567890; 1P_JAR=0987654321"</span> <span class="se">\</span>
-H <span class="s2">"X-Status-Code: 303, 808, 909"</span>

<span class="c"># A POST request would have the same structure but contain a parameter specifying that it is a POST request:</span>
curl -X POST <span class="se">\</span>
-k <span class="se">\</span>
-x http://realtime.oxylabs.io:60000 <span class="se">\</span>
-U user:pass1 <span class="s2">"https://stackoverflow.com/questions/tagged/python"</span> <span class="se">\</span>
-H <span class="s2">"X-OxySERPs-Session-Id: 1234567890abcdef"</span> <span class="se">\</span>
-H <span class="s2">"X-OxySERPs-Geo-Location: India"</span> <span class="se">\</span>
-H <span class="s2">"Custom-Header: custom header content"</span> <span class="se">\</span>
-H <span class="s2">"Cookie: NID=1234567890; 1P_JAR=0987654321"</span> <span class="se">\</span>
-H <span class="s2">"X-Status-Code: 303, 808, 909"</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Define proxy dict. Do not forget to put your real user and pass here as well.</span>
<span class="n">proxies</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s">'http'</span><span class="p">:</span> <span class="s">'http://user:pass1@realtime.oxylabs.io:60000'</span><span class="p">,</span>
  <span class="s">'https'</span><span class="p">:</span> <span class="s">'https://user:pass1@realtime.oxylabs.io:60000'</span><span class="p">,</span>
<span class="p">}</span>

<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="s">'GET'</span><span class="p">,</span>
    <span class="s">'https://stackoverflow.com/questions/tagged/python'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
    <span class="n">verify</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>  <span class="c"># Or accept our certificate.</span>
    <span class="n">proxies</span><span class="o">=</span><span class="n">proxies</span><span class="p">,</span>
<span class="p">)</span>

<span class="c"># Print result page to stdout</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>

<span class="c"># Save returned HTML to result.html file</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s">'result.html'</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
    <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>
<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://stackoverflow.com/questions/tagged/python"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_PROXY</span><span class="p">,</span> <span class="s1">'realtime.oxylabs.io:60000'</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_PROXYUSERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_SSL_VERIFYPEER</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_SSL_VERIFYHOST</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;HTTP&lt;/strong&gt;">
<pre class="highlight http tab-http"><code><span class="err">HTTP method is not supported with SuperAPI</span></code></pre>
</div></div></div>
<hr />
<h2 id="parameter-values">Parameter Values</h2>
<h3 id="geo_location">Geo_Location</h3>
<p>Full list of supported geo locations can be found in CSV format <a class="custom_link" href="https://developers.oxylabs.io/resources/universal-supported-geo_location-values.csv" target="_blank" rel="noopener">here</a>.</p>
<pre class="highlight json tab-json"><code><span class="s2">"United Arab Emirates"</span><span class="p">,</span>
<span class="s2">"Albania"</span><span class="p">,</span>
<span class="s2">"Armenia"</span><span class="p">,</span>
<span class="s2">"Angola"</span><span class="p">,</span>
<span class="s2">"Argentina"</span><span class="p">,</span>
<span class="s2">"Australia"</span><span class="p">,</span>
<span class="err">...</span>
<span class="s2">"Uruguay"</span><span class="p">,</span>
<span class="s2">"Uzbekistan"</span><span class="p">,</span>
<span class="s2">"Venezuela Bolivarian Republic of"</span><span class="p">,</span>
<span class="s2">"Viet Nam"</span><span class="p">,</span>
<span class="s2">"South Africa"</span><span class="p">,</span>
<span class="s2">"Zimbabwe"</span></code></pre>
<hr />
<h3 id="http_method">HTTP_Method</h3>
<p>Universal Crawler supports two HTTP(S) methods: <code>GET</code> (default) and <code>POST</code>.</p>
<pre class="highlight json tab-json"><code><span class="s2">"GET"</span><span class="p">,</span>
<span class="s2">"POST"</span></code></pre>
<hr />
<h3 id="render">Render</h3>
<p>Universal Crawler can render Javascript and return either a rendered HTML document or a PNG screenshot of the web page.</p>
<pre class="highlight json tab-json"><code><span class="s2">"html"</span><span class="p">,</span>
<span class="s2">"png"</span></code></pre>
<hr />
<h3 id="user_agent_type">User_Agent_Type</h3>
<p>Download full list of <code>user_agent_type</code> values in JSON <a class="custom_link" href="https://developers.oxylabs.io/resources/user_agent_type.json" target="_blank" rel="noopener">here</a>.</p>
<pre class="highlight json tab-json"><code><span class="p">[</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random desktop browser User-Agent"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop_firefox"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of desktop Firefox"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop_chrome"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of desktop Chrome"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop_opera"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of desktop Opera"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop_edge"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of desktop Edge"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"desktop_safari"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of desktop Safari"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"mobile"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random mobile browser User-Agent"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"mobile_android"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of Android browser"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"mobile_ios"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of iPhone browser"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"tablet"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random tablet browser User-Agent"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"tablet_android"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of Android tablet"</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="s2">"user_agent_type"</span><span class="p">:</span> <span class="s2">"tablet_ios"</span><span class="p">,</span>
    <span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Random User-Agent of one of the latest versions of iPad tablet"</span>
  <span class="p">}</span>
<span class="p">]</span></code></pre>
<hr />
<h2 id="account-status">Account Status</h2>
<h3 id="usage-statistics">Usage Statistics</h3>
<p>You can find your usage statistics by querying the following endpoint:</p>
<div class="endpoint">
<pre><strong>GET https://data.oxylabs.io/v2/stats</strong></pre>
</div>
<p>By default, the API will return all-time usage statistics. Adding <code>?group_by=month</code> will return monthly stats, while <code>?group_by=day</code> will return daily numbers.</p>
<p>This query will return all-time statistics. You can find your daily and monthly usage by adding either <code>?group_by=day</code> or <code>?group_by=month</code></p>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="3" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="s1">'https://data.oxylabs.io/v2/stats'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Get response from stats endpoint.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="n">method</span><span class="o">=</span><span class="s">'GET'</span><span class="p">,</span>
    <span class="n">url</span><span class="o">=</span><span class="s">'https://data.oxylabs.io/v2/stats'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
<span class="p">)</span>

<span class="c"># Print prettified JSON response to stdout.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v2/stats"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_CUSTOMREQUEST</span><span class="p">,</span> <span class="s2">"GET"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div></div></div>
<p>Sample output:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
    <span class="s2">"data"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s2">"sources"</span><span class="p">:</span> <span class="p">[</span>
            <span class="p">{</span>
                <span class="s2">"realtime_results_count"</span><span class="p">:</span> <span class="s2">"90"</span><span class="p">,</span>
                <span class="s2">"results_count"</span><span class="p">:</span> <span class="s2">"10"</span><span class="p">,</span>
                <span class="s2">"title"</span><span class="p">:</span> <span class="s2">"universal"</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">},</span>
    <span class="s2">"meta"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s2">"group_by"</span><span class="p">:</span> <span class="kc">null</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre>
<hr />
<h3 id="limits">Limits</h3>
<p>The following endpoint will give your monthly commitment information as well as how much of it has already been used:</p>
<div class="endpoint">
<pre><strong>GET https://data.oxylabs.io/v2/stats/limits</strong></pre>
</div>
<div class="su-tabs su-tabs-style-default su-tabs-mobile-stack" data-active="3" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-tabs-nav"><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>cURL</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>Python</strong></span><span class="" data-url="" data-target="blank" tabindex="0" role="button"><strong>PHP</strong></span></div><div class="su-tabs-panes"><div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;cURL&lt;/strong&gt;">
<pre class="highlight shell tab-shell"><code>curl --user user:pass1 <span class="s1">'https://data.oxylabs.io/v2/stats/limits'</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;Python&lt;/strong&gt;">
<pre class="highlight python tab-python"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>

<span class="c"># Get response from stats endpoint.</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
    <span class="n">method</span><span class="o">=</span><span class="s">'GET'</span><span class="p">,</span>
    <span class="n">url</span><span class="o">=</span><span class="s">'https://data.oxylabs.io/v2/stats/limits'</span><span class="p">,</span>
    <span class="n">auth</span><span class="o">=</span><span class="p">(</span><span class="s">'user'</span><span class="p">,</span> <span class="s">'pass1'</span><span class="p">),</span>
<span class="p">)</span>

<span class="c"># Print prettified JSON response to stdout.</span>
<span class="n">pprint</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">())</span></code></pre>
</div>
<div class="su-tabs-pane su-u-clearfix su-u-trim" data-title="&lt;strong&gt;PHP&lt;/strong&gt;">
<pre class="highlight php tab-php"><code><span class="cp">&lt;?php</span>

<span class="nv">$ch</span> <span class="o">=</span> <span class="nb">curl_init</span><span class="p">();</span>

<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="s2">"https://data.oxylabs.io/v2/stats/limits"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_CUSTOMREQUEST</span><span class="p">,</span> <span class="s2">"GET"</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_USERPWD</span><span class="p">,</span> <span class="s2">"user"</span> <span class="o">.</span> <span class="s2">":"</span> <span class="o">.</span> <span class="s2">"pass1"</span><span class="p">);</span>

<span class="nv">$result</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nb">curl_errno</span><span class="p">(</span><span class="nv">$ch</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">echo</span> <span class="s1">'Error:'</span> <span class="o">.</span> <span class="nb">curl_error</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">curl_close</span> <span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
<span class="cp">?&gt;</span></code></pre>
</div></div></div>
<p>Sample output:</p>
<pre class="highlight json tab-json"><code><span class="p">{</span>
    <span class="s2">"monthly_requests_commitment"</span><span class="p">:</span> <span class="mi">4500000</span><span class="p">,</span>
    <span class="s2">"used_requests"</span><span class="p">:</span> <span class="mi">985000</span>
<span class="p">}</span></code></pre>
<hr />
<h2 id="response-codes">Response Codes</h2>
<div class="su-table su-table-responsive su-table-alternate">
<table>
<thead>
<tr>
<th>Code</th>
<th>Status</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>204</code></td>
<td>No Content</td>
<td>You are trying to retrieve a job that has not been completed yet.</td>
</tr>
<tr>
<td><code>400</code></td>
<td>Multiple error messages</td>
<td>Bad request structure, could be a misspelled parameter or invalid value. The response body will have a more specific error message.</td>
</tr>
<tr>
<td><code>401</code></td>
<td>&#8216;Authorization header not provided' / &#8216;Invalid authorization header' / &#8216;Client not found'</td>
<td>Missing authorization header or incorrect login credentials.</td>
</tr>
<tr>
<td><code>403</code></td>
<td>Forbidden</td>
<td>Your account does not have access to this resource.</td>
</tr>
<tr>
<td><code>404</code></td>
<td>Not Found</td>
<td>Job ID you are looking for is no longer available.</td>
</tr>
<tr>
<td><code>429</code></td>
<td>Too many requests</td>
<td>Exceeded rate limit. Please contact your account manager to increase limits.</td>
</tr>
<tr>
<td><code>500</code></td>
<td>Unknown Error</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>524</code></td>
<td>Timeout</td>
<td>Service unavailable.</td>
</tr>
<tr>
<td><code>612</code></td>
<td>Undefined Internal Error</td>
<td>Something went wrong and we failed the job you submitted. You can try again at no extra cost, as we do not charge you for <code>faulted</code> jobs. If that does not work, please get in touch with us.</td>
</tr>
<tr>
<td><code>613</code></td>
<td>Faulted After Too Many Retries</td>
<td>We tried scraping the job you submitted, but gave up after reaching our retry limit. You can try again at no extra cost, as we do not charge you for <code>faulted</code> jobs. If that does not work, please get in touch with us.</td>
</tr>
</tbody>
</table>
</div>
<hr />
<h4>References</h4>
<ul>
<li style="list-style-type: none;">
<ul>
<li><a href="https://developers.oxylabs.io/scraper-apis/web_scraper_api/source/web-scraper-api/index.html#quick-start" target="_blank" rel="nofollow noopener">https://developers.oxylabs.io/scraper-apis/web_scraper_api/source/web-scraper-api/index.html#quick-start </a></li>
<li><a href="https://developers.oxylabs.io/scraper-apis/" target="_blank" rel="nofollow noopener">https://developers.oxylabs.io/scraper-apis/ </a></li>
</ul>
</li>
</ul>
<hr />
<blockquote><p><strong>Disclaimer:</strong> This part of the content is mainly from the merchant. If the merchant does not want it to be displayed on my website, please <a href="https://www.proxysp.com/contact-us/">contact us</a> to delete your content.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://proxysp.com/oxylabs-web-scraper-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">9062</post-id>	</item>
	</channel>
</rss>
