Quickstart
This guide gets you from zero to your first response in a couple of minutes. You'll create an account, grab a project API key, and send your first request.
1. Create an account and a project
Sign up, then create your first project. Every project has its own API key and its own request history, so it's normal to have one project per app or environment (say, production and staging). The project's API key is shown to you as soon as it is created — copy it then, because it is shown only once. Confirm your email address and the key is live.
2. Keep your API key safe
Treat the key like a password: it authenticates every request. We store only a hash of it, so if you lose it, rotate it from the project's Settings → API key and you are shown the new one. See Authentication for the details.
3. Make your first request
Send a POST to any endpoint with your bearer token and a JSON body containing the url. Here we convert a page to Markdown, with sync: true so the result comes straight back in the response:
curl -X POST https://urlpipe.dev/markdown \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "sync": true}'import requests
res = requests.post(
"https://urlpipe.dev/markdown",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"url": "https://example.com", "sync": True},
)
res.raise_for_status()
markdown = res.textconst res = await fetch("https://urlpipe.dev/markdown", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com", sync: true }),
})
if (!res.ok) throw new Error(await res.text())
const markdown = await res.text()$ch = curl_init("https://urlpipe.dev/markdown");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["url" => "https://example.com", "sync" => true]),
]);
$markdown = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status !== 200) {
throw new RuntimeException($markdown);
}That's it — the response body is the Markdown for the page. Every other endpoint, like /screenshot or /meta, takes the exact same request shape.
Prefer a library? The official client libraries for Python, JavaScript, Ruby and Go make the same call in one line, and add retries that never bill twice, typed errors and webhook verification:
# pip install urlpipe
import urlpipe
client = urlpipe.Client() # reads URLPIPE_API_KEY
page = client.markdown("https://example.com")
print(page.data)// npm install @urlpipe/sdk
import Urlpipe from "@urlpipe/sdk";
const client = new Urlpipe(); // reads URLPIPE_API_KEY
const { data } = await client.markdown("https://example.com");
console.log(data);# gem install urlpipe
require "urlpipe"
client = Urlpipe::Client.new # reads ENV["URLPIPE_API_KEY"]
page = client.markdown("https://example.com")
puts page.data// go get github.com/URLpipe/urlpipe-go
client, err := urlpipe.NewClient() // reads URLPIPE_API_KEY
if err != nil {
log.Fatal(err)
}
page, err := client.Markdown(context.Background(), "https://example.com", nil)
if err != nil {
log.Fatal(err)
}
fmt.Println(page.Data)4. Get the result back: async or sync
By default, requests are async: leave out sync and you get a token back immediately, and the result reaches you either at a report_to webhook URL or from GET /result/:token whenever you ask for it. That is the better fit for slow work like Lighthouse audits and for anything you run in bulk; sync: true suits a quick one-off like the one above. Both are covered in Async & sync modes.