Skip to content

Troubleshooting

When a generated PDF looks wrong, the cause is usually one of five things: the print layout is wrong, the page was not ready yet, the request ran out of time, the site blocked automation, or the request used the wrong auth or plan setup.
For timeouts, blocked sites, auth/plan errors, and debug headers that apply to all workflows, see common troubleshooting.

The PDF layout looks wrong

Pick the control that matches the problem:
ProblemBest fix
You need a standard printable document sizepdf.format
You need exact custom page dimensionspdf.width + pdf.height
You need a wide documentpdf.landscape
You need more whitespace around the contentpdf.margin
You need more or less content per pagepdf.scale
You want on-screen design instead of print CSSmediaType: 'screen'
You only need part of the final documentpdf.pageRanges
A common fix is to keep the paper format but switch to screen CSS and add predictable margins:

The following examples show how to use the Microlink API with CLI, cURL, JavaScript, Python, Ruby, PHP & Golang, targeting 'https://blog.alexmaccaw.com/advice-to-my-younger-self' URL with 'pdf', 'mediaType' & 'meta' API parameters:

CLI Microlink API example

microlink https://blog.alexmaccaw.com/advice-to-my-younger-self&pdf.format=Letter&pdf.margin=1cm&pdf.scale=0.9&mediaType=screen

cURL Microlink API example

curl -G "https://api.microlink.io" \
  -d "url=https://blog.alexmaccaw.com/advice-to-my-younger-self" \
  -d "pdf.format=Letter" \
  -d "pdf.margin=1cm" \
  -d "pdf.scale=0.9" \
  -d "mediaType=screen" \
  -d "meta=false"

JavaScript Microlink API example

import mql from '@microlink/mql'

const { data } = await mql('https://blog.alexmaccaw.com/advice-to-my-younger-self', {
  pdf: {
    format: "Letter",
    margin: "1cm",
    scale: 0.9
  },
  mediaType: "screen",
  meta: false
})

Python Microlink API example

import requests

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

querystring = {
    "url": "https://blog.alexmaccaw.com/advice-to-my-younger-self",
    "pdf.format": "Letter",
    "pdf.margin": "1cm",
    "pdf.scale": "0.9",
    "mediaType": "screen",
    "meta": "false"
}

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://blog.alexmaccaw.com/advice-to-my-younger-self",
  pdf.format: "Letter",
  pdf.margin: "1cm",
  pdf.scale: "0.9",
  mediaType: "screen",
  meta: "false"
}

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://blog.alexmaccaw.com/advice-to-my-younger-self",
    "pdf.format" => "Letter",
    "pdf.margin" => "1cm",
    "pdf.scale" => "0.9",
    "mediaType" => "screen",
    "meta" => "false"
];

$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://blog.alexmaccaw.com/advice-to-my-younger-self")
    q.Set("pdf.format", "Letter")
    q.Set("pdf.margin", "1cm")
    q.Set("pdf.scale", "0.9")
    q.Set("mediaType", "screen")
    q.Set("meta", "false")
    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 PDF feels too cramped, too wide, or overly "print-like," adjust layout controls before reaching for custom scripts.

The PDF is missing content or printed too early

Start with a fast navigation event, then wait for the exact content you need:

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

CLI Microlink API example

microlink https://dev.to&pdf&waitUntil=domcontentloaded&waitForSelector=article

cURL Microlink API example

curl -G "https://api.microlink.io" \
  -d "url=https://dev.to" \
  -d "pdf=true" \
  -d "meta=false" \
  -d "waitUntil=domcontentloaded" \
  -d "waitForSelector=article"

JavaScript Microlink API example

import mql from '@microlink/mql'

const { data } = await mql('https://dev.to', {
  pdf: true,
  meta: false,
  waitUntil: "domcontentloaded",
  waitForSelector: "article"
})

Python Microlink API example

import requests

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

querystring = {
    "url": "https://dev.to",
    "pdf": "true",
    "meta": "false",
    "waitUntil": "domcontentloaded",
    "waitForSelector": "article"
}

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://dev.to",
  pdf: "true",
  meta: "false",
  waitUntil: "domcontentloaded",
  waitForSelector: "article"
}

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://dev.to",
    "pdf" => "true",
    "meta" => "false",
    "waitUntil" => "domcontentloaded",
    "waitForSelector" => "article"
];

$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://dev.to")
    q.Set("pdf", "true")
    q.Set("meta", "false")
    q.Set("waitUntil", "domcontentloaded")
    q.Set("waitForSelector", "article")
    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))
}
This is usually more reliable than waiting a fixed number of seconds.
If the page still needs cleanup:
  • Use click to open tabs or dismiss UI before printing.
  • Use styles to hide sticky headers, banners, or controls.
  • Use mediaType: 'screen' if the print stylesheet removes important content.

Still stuck

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

Back to guides

See the guides overview for more Microlink guides.