Pixel-perfect screenshots
of any URL.
Real Chrome, real fonts, JS rendered. Full-page, viewport, mobile, or PDF: one endpoint, every flag you need. OG images, link previews, monitoring captures, archives.
Eight modes. One endpoint.
We don't make you pick between APIs for "full-page" vs "PDF" vs "mobile". Same endpoint, every flag.
Three workflows. One key.
Beautiful link previews on demand.
Generate dynamic Open Graph images, blog thumbnails, and social-share cards. Store the image and serve it from your own CDN.
Visual regression at scale.
Snapshot every release on every breakpoint. Diff against baselines. Catch the dropped padding before your customers do.
Frozen captures for the record.
Marketing claims, regulated landing pages, legal evidence: capture the page as it looked, then store it with your own timestamp and hash. PDF or PNG, your call.
One API call per capture.
# Returns binary PNG; pipe to file:
curl -G "https://api.ujeebu.com/scrape" \
-H "ApiKey: YOUR_KEY" \
--data-urlencode url=https://stripe.com \
-d response_type=screenshot \
-d js=true \
-d screenshot_fullpage=true \
-d block_ads=true \
--output stripe.png
import requests
resp = requests.get(
"https://api.ujeebu.com/scrape",
params={
"url": "https://stripe.com",
"response_type": "screenshot",
"js": "true",
"screenshot_fullpage": "true",
"wait_for": ".hero",
},
headers={"ApiKey": "YOUR_KEY"},
)
with open("stripe.png", "wb") as f:
f.write(resp.content)
import fs from "fs";
const params = new URLSearchParams({
url: "https://stripe.com",
response_type: "screenshot",
js: "true",
device: "mobile",
screenshot_fullpage: "true",
});
const res = await fetch(`https://api.ujeebu.com/scrape?Array`, {
headers: { ApiKey: "YOUR_KEY" },
});
fs.writeFileSync("stripe.png", Buffer.from(await res.arrayBuffer()));
package main
import (
"io"
"net/http"
"net/url"
"os"
)
func main() {
params := url.Values{}
params.Set("url", "https://stripe.com")
params.Set("response_type", "screenshot")
params.Set("js", "true")
params.Set("screenshot_fullpage", "true")
params.Set("block_ads", "true")
req, _ := http.NewRequest("GET", "https://api.ujeebu.com/scrape?"+params.Encode(), nil)
req.Header.Set("ApiKey", "YOUR_KEY")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
f, _ := os.Create("stripe.png")
defer f.Close()
io.Copy(f, resp.Body)
}
What you stop worrying about.
Real Chrome. Real fonts.
Every render runs in headless Chromium with system + Google Fonts pre-loaded. Pages look how your users see them, with no missing emoji, no fallback Helvetica.
Anti-block, anti-CAPTCHA.
Residential proxies, fingerprint randomization, and Cloudflare-aware rendering. If a normal browser can load the page, we can capture it.
Fresh render, every call.
Every request renders the page live, so you capture what is on it right now. Each successful screenshot is 5 credits on the default proxy.
Pay only for what works.
Page crash, block or timeout? You pay $0. Failed renders don't count toward your credit pool.
Blocked requests, timeouts and server errors cost zero. 5,000 credits free, no card. One credit pool across every endpoint. The same key works in production.
Pay per success. Start free.
Screenshots are 5 credits. PDFs are 10. Failed captures don't count (only 200 and 404 responses are billed). The same plans cover every Ujeebu endpoint, one credit pool.
Before you sign up.
How does this compare to Urlbox, ApiFlash, ScreenshotOne?▼
Can it capture pages behind a login?▼
How fresh / cached is the output?▼
Can I add a watermark or custom CSS?▼
PDF: multi-page, headers, page size?▼
Latency at scale?▼
Can I top up if I run out of credits?▼
5,000 free credits. Your first PNG in 60 seconds.
No credit card. No sales call. Drop the URL into an <img> tag and ship.