Private pages
If the target page changes based on cookies, authorization, locale, or geolocation, the extraction rules are only half the problem. You also need the request to reach the right page variant. The general patterns for headers, secrets, endpoint selection, and proxy are covered in private pages patterns.
This page shows the data-extraction-specific setup.
Extraction with non-sensitive headers PRO
The following examples show how to use the Microlink API with CLI, cURL, JavaScript, Python, Ruby, PHP & Golang, targeting 'https://example.com' URL with 'data', 'meta' & 'headers' API parameters:
CLI Microlink API example
microlink https://example.com&data.title.selector=h1&data.title.attr=text&headers.accept-language=en-UScURL Microlink API example
curl -G "https://api.microlink.io" \
-d "url=https://example.com" \
-d "data.title.selector=h1" \
-d "data.title.attr=text" \
-d "meta=false" \
-d "headers.accept-language=en-US"JavaScript Microlink API example
import mql from '@microlink/mql'
const { data } = await mql('https://example.com', {
data: {
title: {
selector: "h1",
attr: "text"
}
},
meta: false,
headers: {
"accept-language": "en-US"
}
})Python Microlink API example
import requests
url = "https://api.microlink.io/"
querystring = {
"url": "https://example.com",
"data.title.selector": "h1",
"data.title.attr": "text",
"meta": "false",
"headers.accept-language": "en-US"
}
response = requests.get(url, params=querystring)
print(response.json())Ruby Microlink API example
require 'uri'
require 'net/http'
base_url = "https://api.microlink.io/"
params = {
url: "https://example.com",
data.title.selector: "h1",
data.title.attr: "text",
meta: "false",
headers.accept-language: "en-US"
}
uri = URI(base_url)
uri.query = URI.encode_www_form(params)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
response = http.request(request)
puts response.bodyPHP Microlink API example
<?php
$baseUrl = "https://api.microlink.io/";
$params = [
"url" => "https://example.com",
"data.title.selector" => "h1",
"data.title.attr" => "text",
"meta" => "false",
"headers.accept-language" => "en-US"
];
$query = http_build_query($params);
$url = $baseUrl . '?' . $query;
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET"
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #: " . $err;
} else {
echo $response;
}Golang Microlink API example
package main
import (
"fmt"
"net/http"
"net/url"
"io"
)
func main() {
baseURL := "https://api.microlink.io"
u, err := url.Parse(baseURL)
if err != nil {
panic(err)
}
q := u.Query()
q.Set("url", "https://example.com")
q.Set("data.title.selector", "h1")
q.Set("data.title.attr", "text")
q.Set("meta", "false")
q.Set("headers.accept-language", "en-US")
u.RawQuery = q.Encode()
req, err := http.NewRequest("GET", u.String(), nil)
if err != nil {
panic(err)
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(body))
}import mql from '@microlink/mql'
const { data } = await mql('https://example.com', {
data: {
title: {
selector: "h1",
attr: "text"
}
},
meta: false,
headers: {
"accept-language": "en-US"
}
})Use
headers for public request shaping. For cookies or authorization tokens, use the x-api-header-* pattern described in private pages patterns.Extraction with sensitive credentials
Use
x-api-header-* to forward secrets without exposing them in the URL:curl -G https://pro.microlink.io \
-d url=https://example.com/private \
-d data.title.selector=h1 \
-d data.title.attr=text \
-d meta=false \
-H 'x-api-key: YOUR_API_TOKEN' \
-H 'x-api-header-cookie: session=YOUR_SESSION_COOKIE'When private extraction still fails
If the target blocks headless traffic, geofences content, or rate-limits the origin, use proxy
PRO
. If the API returns EPROXYNEEDED, that confirms it.For other errors, continue with troubleshooting.
Next step
If extraction still fails after the auth setup is correct, continue with troubleshooting.