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. Cache the URL, let our renderers fan out. CDN-ready output.
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 verbatim with timestamp and a hash. PDF or PNG, your call.
Image URL or full SDK.
<!-- Drop into any <img> tag for an instant screenshot URL -->
<img
src="https://api.ujeebu.com/screenshot?key=YOUR_KEY&url=https://stripe.com&w=1200&h=630"
width="1200" height="630"
alt="stripe.com"
/>
<!-- Perfect for OG images, blog thumbnails, dashboard tiles. -->
<!-- Result is cached by our CDN for 1 hour by default. -->
# Returns binary PNG; pipe to file:
curl "https://api.ujeebu.com/screenshot" \
-H "Authorization: Bearer YOUR_KEY" \
-d url=https://stripe.com \
-d full_page=true \
-d block_ads=true \
--output stripe.png
from ujeebu import Client
uj = Client("YOUR_KEY")
png_bytes = uj.screenshot(
url="https://stripe.com",
full_page=True,
block_ads=True,
wait_for=".hero",
)
with open("stripe.png", "wb") as f:
f.write(png_bytes)
import { Ujeebu } from "ujeebu";
import fs from "fs";
const uj = new Ujeebu("YOUR_KEY");
const png = await uj.screenshot({
url: "https://stripe.com",
device: "iphone_14",
full_page: true,
});
fs.writeFileSync("stripe.png", png);
package main
import (
"io"
"net/http"
"net/url"
"os"
"strings"
)
func main() {
form := url.Values{}
form.Set("url", "https://stripe.com")
form.Set("full_page", "true")
form.Set("block_ads", "true")
req, _ := http.NewRequest("POST", "https://api.ujeebu.com/screenshot", strings.NewReader(form.Encode()))
req.Header.Set("Authorization", "Bearer YOUR_KEY")
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
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)
}
# Python SDK
pip install ujeebu
from ujeebu import Client
uj = Client("YOUR_KEY")
# Node.js SDK
npm install ujeebu
import { Ujeebu } from "ujeebu";
const uj = new Ujeebu("YOUR_KEY");
# Full reference and examples: /docs
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.
CDN-cached output.
Screenshots are cached for 1 hour by default (configurable to 7 days). Hot URLs serve in <50ms straight from CDN, with no extra credits charged.
Pay only for what works.
DNS error, page crash, timeout? You pay $0. Failed renders don't count toward your credit pool.
Failed requests 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 1 credit. Full-page is 2. PDF is 3. Failed captures don't count. 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?▼
1,000 free credits. Your first PNG in 60 seconds.
No credit card. No sales call. Drop the URL into an <img> tag and ship.