## Table of Contents

- [Troubleshooting](#troubleshooting)
- [The fields are missing or null](#the-fields-are-missing-or-null)
  - [CLI Microlink API example](#cli-microlink-api-example)
  - [cURL Microlink API example](#curl-microlink-api-example)
  - [JavaScript Microlink API example](#javascript-microlink-api-example)
  - [Python Microlink API example](#python-microlink-api-example)
  - [Ruby Microlink API example](#ruby-microlink-api-example)
  - [PHP Microlink API example](#php-microlink-api-example)
  - [Golang Microlink API example](#golang-microlink-api-example)
- [The page variant is wrong](#the-page-variant-is-wrong)
- [Still stuck](#still-stuck)

---

[](https://microlink.io/docs/api/getting-started/overview)

[API](https://microlink.io/docs/api/getting-started/overview)

[](https://microlink.io/docs/guides)

GUIDES

[](https://microlink.io/docs/mql/getting-started/overview)

MQL

[](https://microlink.io/docs/sdk/getting-started/overview)

SDK

[](https://microlink.io/docs/cards/getting-started/overview)

CARDS

## 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](https://microlink.io/docs/guides/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

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

### cURL Microlink API example

``` bash
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

``` javascript
import mql from '@microlink/mql'

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

### Python Microlink API example

``` python
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

``` ruby
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
<?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

``` bash
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))
}
```

``` javascript
import mql from '@microlink/mql'

const { data } = await mql('https://vercel.com', {

  meta: {

    title: true,

    description: true

  },

  prerender: true

})
```

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](https://microlink.io/docs/guides/metadata/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](https://microlink.io/docs/guides/metadata/private-pages) and use `headers`, `x-api-header-*`, or `proxy` as needed.

## Still stuck

Check the full [error codes reference](https://microlink.io/docs/api/basics/error-codes) or see [common troubleshooting](https://microlink.io/docs/guides/common/troubleshooting) for timeout, auth, and plan errors. If the issue is auth-specific, return to [private pages](https://microlink.io/docs/guides/metadata/private-pages).