Delivery and response shaping
Once your rules work, the next decision is how much of the response you actually want to keep.
Choose a response model
You have four common response patterns:
| Need | Best option | Why |
|---|---|---|
| Metadata plus custom fields | Default JSON response | Useful when your app consumes both normalized metadata and extracted data |
| Only your custom fields | meta: false | Removes the extra metadata pass and keeps the payload simpler |
| A smaller JSON payload | filter | Keeps only the fields you want to return |
| A direct body instead of JSON | embed | Makes the API URL behave like the extracted field itself |
If you are extracting more than one field, JSON is usually the right default. Reach for
embed only when one field is the final output you want to serve.Start with normal JSON
This is the most flexible response shape for applications:
The following examples show how to use the Microlink API with CLI, cURL, JavaScript, Python, Ruby, PHP & Golang, targeting 'https://example.com' URL with 'data' & 'meta' API parameters:
CLI Microlink API example
microlink https://example.com&data.title.selector=h1&data.title.attr=text&data.description.selector=p&data.description.attr=textcURL Microlink API example
curl -G "https://api.microlink.io" \
-d "url=https://example.com" \
-d "data.title.selector=h1" \
-d "data.title.attr=text" \
-d "data.description.selector=p" \
-d "data.description.attr=text" \
-d "meta=false"JavaScript Microlink API example
import mql from '@microlink/mql'
const { data } = await mql('https://example.com', {
data: {
title: {
selector: "h1",
attr: "text"
},
description: {
selector: "p",
attr: "text"
}
},
meta: false
})Python Microlink API example
import requests
url = "https://api.microlink.io/"
querystring = {
"url": "https://example.com",
"data.title.selector": "h1",
"data.title.attr": "text",
"data.description.selector": "p",
"data.description.attr": "text",
"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://example.com",
data.title.selector: "h1",
data.title.attr: "text",
data.description.selector: "p",
data.description.attr: "text",
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.bodyPHP Microlink API example
<?php
$baseUrl = "https://api.microlink.io/";
$params = [
"url" => "https://example.com",
"data.title.selector" => "h1",
"data.title.attr" => "text",
"data.description.selector" => "p",
"data.description.attr" => "text",
"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://example.com")
q.Set("data.title.selector", "h1")
q.Set("data.title.attr", "text")
q.Set("data.description.selector", "p")
q.Set("data.description.attr", "text")
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))
}import mql from '@microlink/mql'
const { data } = await mql('https://example.com', {
data: {
title: {
selector: "h1",
attr: "text"
},
description: {
selector: "p",
attr: "text"
}
},
meta: false
})Normal JSON is the best fit when you want to consume more than one extracted field.
Keep only the fields you need
If the response is still bigger than necessary, use
filter:The following examples show how to use the Microlink API with CLI, cURL, JavaScript, Python, Ruby, PHP & Golang, targeting 'https://example.com' URL with 'data', 'meta' & 'filter' API parameters:
CLI Microlink API example
microlink https://example.com&data.title.selector=h1&data.title.attr=text&data.link.selector=a&data.link.attr=href&data.link.type=url&filter=titlecURL Microlink API example
curl -G "https://api.microlink.io" \
-d "url=https://example.com" \
-d "data.title.selector=h1" \
-d "data.title.attr=text" \
-d "data.link.selector=a" \
-d "data.link.attr=href" \
-d "data.link.type=url" \
-d "meta=false" \
-d "filter=title"JavaScript Microlink API example
import mql from '@microlink/mql'
const { data } = await mql('https://example.com', {
data: {
title: {
selector: "h1",
attr: "text"
},
link: {
selector: "a",
attr: "href",
type: "url"
}
},
meta: false,
filter: "title"
})Python Microlink API example
import requests
url = "https://api.microlink.io/"
querystring = {
"url": "https://example.com",
"data.title.selector": "h1",
"data.title.attr": "text",
"data.link.selector": "a",
"data.link.attr": "href",
"data.link.type": "url",
"meta": "false",
"filter": "title"
}
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",
data.title.selector: "h1",
data.title.attr: "text",
data.link.selector: "a",
data.link.attr: "href",
data.link.type: "url",
meta: "false",
filter: "title"
}
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",
"data.title.selector" => "h1",
"data.title.attr" => "text",
"data.link.selector" => "a",
"data.link.attr" => "href",
"data.link.type" => "url",
"meta" => "false",
"filter" => "title"
];
$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("data.title.selector", "h1")
q.Set("data.title.attr", "text")
q.Set("data.link.selector", "a")
q.Set("data.link.attr", "href")
q.Set("data.link.type", "url")
q.Set("meta", "false")
q.Set("filter", "title")
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', {
data: {
title: {
selector: "h1",
attr: "text"
},
link: {
selector: "a",
attr: "href",
type: "url"
}
},
meta: false,
filter: "title"
})Use
filter when your extractor produces several fields but the consumer only needs one or two of them.filter is especially useful for edge functions, CMS webhooks, or other downstream systems where every byte matters.It also supports dot notation, so nested fields can be targeted with values such as
story.href.Return one extracted field directly
If one field already is your final response body, use
embed:The following examples show how to use the Microlink API with CLI, cURL, JavaScript, Python, Ruby, PHP & Golang, targeting 'https://example.com' URL with 'data', 'meta' & 'embed' API parameters:
CLI Microlink API example
microlink https://example.com&data.title.selector=h1&data.title.attr=text&embed=titlecURL Microlink API example
curl -G "https://api.microlink.io" \
-d "url=https://example.com" \
-d "data.title.selector=h1" \
-d "data.title.attr=text" \
-d "meta=false" \
-d "embed=title"JavaScript Microlink API example
import mql from '@microlink/mql'
const { data } = await mql('https://example.com', {
data: {
title: {
selector: "h1",
attr: "text"
}
},
meta: false,
embed: "title"
})Python Microlink API example
import requests
url = "https://api.microlink.io/"
querystring = {
"url": "https://example.com",
"data.title.selector": "h1",
"data.title.attr": "text",
"meta": "false",
"embed": "title"
}
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",
data.title.selector: "h1",
data.title.attr: "text",
meta: "false",
embed: "title"
}
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",
"data.title.selector" => "h1",
"data.title.attr" => "text",
"meta" => "false",
"embed" => "title"
];
$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("data.title.selector", "h1")
q.Set("data.title.attr", "text")
q.Set("meta", "false")
q.Set("embed", "title")
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', {
data: {
title: {
selector: "h1",
attr: "text"
}
},
meta: false,
embed: "title"
})With
embed, the API URL behaves like the selected field instead of returning the full JSON envelope.This works best for a single text body, a single serialized field such as Markdown, or an extracted asset URL.
Use dot notation when the field lives inside a nested object, such as
embed: 'story.href'.Using the raw URL
You can call the API directly from a browser or HTTP client:
https://api.microlink.io?url=https://example.com&data.title.selector=h1&data.title.attr=text&meta=false&embed=titleUse raw URLs when you want a shareable endpoint or need to plug Microlink directly into another service.
JSON vs embed
| If you need | Use |
|---|---|
| Several extracted fields | JSON |
| Extracted fields plus metadata | JSON |
| One field as the final response body | embed |
| The smallest JSON that still has structure | filter |
Security considerations
If the request needs authentication, session cookies, or other private headers, do not expose those values in a public URL. See private pages for the safe pattern.
Next step
Learn how to speed up repeated extractions with cache controls in caching and performance.