Skip to content

Private pages

Metadata extraction from private dashboards, localized experiences, or staged environments requires the right auth setup. The general patterns for headers, secrets, endpoint selection, and proxy are covered in private pages patterns.
This page shows the metadata-specific setup.

Metadata 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 'meta' & 'headers' API parameters:

CLI Microlink API example

microlink https://example.com&meta.title&meta.description&headers.Accept-Language=es-ES

cURL Microlink API example

curl -G "https://api.microlink.io" \
  -d "url=https://example.com" \
  -d "meta.title=true" \
  -d "meta.description=true" \
  -d "headers.Accept-Language=es-ES"

JavaScript Microlink API example

import mql from '@microlink/mql'

const { data } = await mql('https://example.com', {
  meta: {
    title: true,
    description: true
  },
  headers: {
    "Accept-Language": "es-ES"
  }
})

Python Microlink API example

import requests

url = "https://api.microlink.io/"

querystring = {
    "url": "https://example.com",
    "meta.title": "true",
    "meta.description": "true",
    "headers.Accept-Language": "es-ES"
}

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",
  meta.title: "true",
  meta.description: "true",
  headers.Accept-Language: "es-ES"
}

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.body

PHP Microlink API example

<?php

$baseUrl = "https://api.microlink.io/";

$params = [
    "url" => "https://example.com",
    "meta.title" => "true",
    "meta.description" => "true",
    "headers.Accept-Language" => "es-ES"
];

$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("meta.title", "true")
    q.Set("meta.description", "true")
    q.Set("headers.Accept-Language", "es-ES")
    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))
}
Good for locale and request shaping. For cookies or authorization tokens, use the x-api-header-* pattern described in private pages patterns.

Metadata 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 meta.title=true \
  -d meta.description=true \
  -H 'x-api-key: YOUR_API_TOKEN' \
  -H 'x-api-header-cookie: session=abc123'

When private metadata 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

Learn how to debug missing fields, wrong page variants, and blocked sites in troubleshooting.