Troubleshooting
Quick triage checklist
- Run one analysis at a time before you run both.
- If the result is missing or generic on a SPA, try
prerender: true. - If the request is too slow, remove fixed waits and unnecessary analysis first.
- If the wrong locale, region, or personalization is showing up, use
headersor forwarded auth headersPRO. - If the site blocks automation or geofences content, use
proxywith a proxy URLPRO.
The result is missing or generic
The following examples show how to use the Microlink API with CLI, cURL, JavaScript, Python, Ruby, PHP & Golang, targeting 'https://vercel.com' URL with 'insights', 'meta' & 'prerender' API parameters:
CLI Microlink API example
microlink https://vercel.com&insights.technologies&prerendercURL Microlink API example
curl -G "https://api.microlink.io" \
-d "url=https://vercel.com" \
-d "insights.technologies=true" \
-d "insights.lighthouse=false" \
-d "meta=false" \
-d "prerender=true"JavaScript Microlink API example
import mql from '@microlink/mql'
const { data } = await mql('https://vercel.com', {
insights: {
technologies: true,
lighthouse: false
},
meta: false,
prerender: true
})Python Microlink API example
import requests
url = "https://api.microlink.io/"
querystring = {
"url": "https://vercel.com",
"insights.technologies": "true",
"insights.lighthouse": "false",
"meta": "false",
"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",
insights.technologies: "true",
insights.lighthouse: "false",
meta: "false",
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.bodyPHP Microlink API example
<?php
$baseUrl = "https://api.microlink.io/";
$params = [
"url" => "https://vercel.com",
"insights.technologies" => "true",
"insights.lighthouse" => "false",
"meta" => "false",
"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("insights.technologies", "true")
q.Set("insights.lighthouse", "false")
q.Set("meta", "false")
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))
}import mql from '@microlink/mql'
const { data } = await mql('https://vercel.com', {
insights: {
technologies: true,
lighthouse: false
},
meta: false,
prerender: true
})prerender: true can expose the real page state before analysis runs.waitUntil plus waitForSelector for dynamic pages.The request is too slow or times out
ETIMEOUT or EBRWSRTIMEOUT, reduce the amount of work before you simply raise timeout:The following examples show how to use the Microlink API with CLI, cURL, JavaScript, Python, Ruby, PHP & Golang, targeting 'https://vercel.com' URL with 'insights', 'meta', 'retry' & 'timeout' API parameters:
CLI Microlink API example
microlink https://vercel.com&insights.lighthouse&retry=3&timeout=20scURL Microlink API example
curl -G "https://api.microlink.io" \
-d "url=https://vercel.com" \
-d "insights.technologies=false" \
-d "insights.lighthouse=true" \
-d "meta=false" \
-d "retry=3" \
-d "timeout=20s"JavaScript Microlink API example
import mql from '@microlink/mql'
const { data } = await mql('https://vercel.com', {
insights: {
technologies: false,
lighthouse: true
},
meta: false,
retry: 3,
timeout: "20s"
})Python Microlink API example
import requests
url = "https://api.microlink.io/"
querystring = {
"url": "https://vercel.com",
"insights.technologies": "false",
"insights.lighthouse": "true",
"meta": "false",
"retry": "3",
"timeout": "20s"
}
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",
insights.technologies: "false",
insights.lighthouse: "true",
meta: "false",
retry: "3",
timeout: "20s"
}
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://vercel.com",
"insights.technologies" => "false",
"insights.lighthouse" => "true",
"meta" => "false",
"retry" => "3",
"timeout" => "20s"
];
$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("insights.technologies", "false")
q.Set("insights.lighthouse", "true")
q.Set("meta", "false")
q.Set("retry", "3")
q.Set("timeout", "20s")
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://vercel.com', {
insights: {
technologies: false,
lighthouse: true
},
meta: false,
retry: 3,
timeout: "20s"
})- run only technologies or only Lighthouse, not both
- set
meta: falsewhen the standard metadata payload is not needed - use
filter: 'insights'when you only need the Insights payload - use
prerender: falseif the page already exposes enough information in HTML - replace
waitForTimeoutwithwaitForSelector - disable
javascriptwhen the page does not need it - add
ttlorstaleTtlPROfor repeated runs
Private pages and blocked sites PRO
- use
headersfor non-sensitive request shaping - use
x-api-header-*for cookies or authorization - use
pro.microlink.iowhen sendingx-api-key
proxy:The following examples show how to use the Microlink API with CLI, cURL, JavaScript, Python, Ruby, PHP & Golang, targeting 'https://example.com' URL with 'insights', 'meta' & 'proxy' API parameters:
CLI Microlink API example
microlink https://example.com&insights.technologies&proxy=https://myproxy:[email protected]:8001cURL Microlink API example
curl -G "https://api.microlink.io" \
-d "url=https://example.com" \
-d "insights.technologies=true" \
-d "insights.lighthouse=false" \
-d "meta=false" \
-d "proxy=https://myproxy:[email protected]:8001"JavaScript Microlink API example
import mql from '@microlink/mql'
const { data } = await mql('https://example.com', {
insights: {
technologies: true,
lighthouse: false
},
meta: false,
proxy: "https://myproxy:[email protected]:8001"
})Python Microlink API example
import requests
url = "https://api.microlink.io/"
querystring = {
"url": "https://example.com",
"insights.technologies": "true",
"insights.lighthouse": "false",
"meta": "false",
"proxy": "https://myproxy:[email protected]:8001"
}
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",
insights.technologies: "true",
insights.lighthouse: "false",
meta: "false",
proxy: "https://myproxy:[email protected]:8001"
}
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",
"insights.technologies" => "true",
"insights.lighthouse" => "false",
"meta" => "false",
"proxy" => "https://myproxy:[email protected]:8001"
];
$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("insights.technologies", "true")
q.Set("insights.lighthouse", "false")
q.Set("meta", "false")
q.Set("proxy", "https://myproxy:[email protected]:8001")
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', {
insights: {
technologies: true,
lighthouse: false
},
meta: false,
proxy: "https://myproxy:[email protected]:8001"
})EPROXYNEEDED, that is the clearest signal that the target site needs a proxy-backed request.Auth and plan errors
EAUTH— the API key is missing or invalid.EPRO— you sentx-api-keytoapi.microlink.ioinstead ofpro.microlink.io.EHEADERS—headersrequires aPROplan.EPROXY—proxyrequires aPROplan.ETTLorESTTL— configurable cache parameters require aPROplan.ERATE— you reached the free-tier or plan quota limit.
Useful headers while debugging
x-cache-status— whether the response was aMISS,HIT, orBYPASSx-cache-ttl— the effective cache lifetimex-fetch-mode— whether the request was fetched, prerendered, or proxy-backedx-fetch-time— time spent fetching and renderingx-pricing-plan— whether the request ran on the free or Pro planx-response-time— the total request duration