Skip to content

Troubleshooting

When metadata looks wrong, the cause is usually one of five things: the page did not render the right variant, the metadata is not present in the initial HTML, the request timed out, the site blocked automation, or the field you want is simply not exposed in a normalized way.
For timeouts, blocked sites, auth/plan errors, and debug headers that apply to all workflows, see common troubleshooting.

The fields are missing or null

If a page is client-rendered, start by forcing browser rendering:

The following examples show how to use the Microlink API with CLI, cURL, JavaScript, Python, Ruby, PHP & Golang, targeting 'https://vercel.com' URL with 'meta' & 'prerender' API parameters:

CLI Microlink API example

microlink https://vercel.com&meta.title&meta.description&prerender

cURL Microlink API example

curl -G "https://api.microlink.io" \
  -d "url=https://vercel.com" \
  -d "meta.title=true" \
  -d "meta.description=true" \
  -d "prerender=true"

JavaScript Microlink API example

import mql from '@microlink/mql'

const { data } = await mql('https://vercel.com', {
  meta: {
    title: true,
    description: true
  },
  prerender: true
})

Python Microlink API example

import requests

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

querystring = {
    "url": "https://vercel.com",
    "meta.title": "true",
    "meta.description": "true",
    "prerender": "true"
}

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://vercel.com",
  meta.title: "true",
  meta.description: "true",
  prerender: "true"
}

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://vercel.com",
    "meta.title" => "true",
    "meta.description" => "true",
    "prerender" => "true"
];

$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://vercel.com")
    q.Set("meta.title", "true")
    q.Set("meta.description", "true")
    q.Set("prerender", "true")
    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))
}
When the initial HTML does not contain the metadata you need, prerender: true can expose the real page state.
If a field is still missing after that:
  • Confirm the site actually exposes it.
  • Try the default metadata set instead of a narrowed meta object.
  • Add a site-specific fallback with data in extending results.

The page variant is wrong

Sometimes the metadata is correct for the page Microlink saw, but not for the variant you expected.
Common causes:
  • Locale-specific content
  • Logged-in vs logged-out variants
  • Geofencing or regional content
  • Request-header-based personalization
If that sounds like the problem, continue with private pages and use headers, x-api-header-*, or proxy as needed.

Still stuck

Check the full error codes reference or see common troubleshooting for timeout, auth, and plan errors. If the issue is auth-specific, return to private pages.

Back to guides

See the guides overview for more Microlink guides.