Introduction

A REST API for screenshots, scraping, and page-change monitoring — one key, one base URL, every output.

For AI agents: https://bytekit.com/llms.txt — every docs page is available as markdown by appending .md

What ByteKit is

ByteKit is a REST API for capturing what a webpage looks like and what it says — screenshots, raw HTML or clean markdown, and page-change monitoring. One API key, one base URL, every output you'd otherwise stitch together from a headless-browser farm and a scraping proxy.

Integrate in 60 seconds

  • Base URL: https://api.bytekit.com
  • Auth: send Authorization: Bearer $BYTEKIT_API_KEY on every request. Create a key in the ByteKit dashboard and export it as BYTEKIT_API_KEY.
  • Install: npm install @hunt-labs/bytekit-sdk for TypeScript, or pip install bytekit-sdk for Python (import name bytekit).
  • Try it without paying: a new pay-as-you-go account receives a one-time starter grant of 100 MB of bandwidth and 100 credits, issued once per account and not a purchase. It does not expire, and real requests draw it down. Details on the balance page.

The npm package is @hunt-labs/bytekit-sdk — not bytekit, which is an unrelated package.

The first call with curl is in the Quickstart. With the TypeScript SDK:

import { ByteKit } from '@hunt-labs/bytekit-sdk';

const client = new ByteKit({ apiKey: process.env.BYTEKIT_API_KEY! });
const result = await client.scrape.create({ url: 'https://example.com', formats: ['markdown'] });
if (result.status === 'success') {
  console.log(result.metadata.title);
  console.log(result.formats.markdown);
} else {
  console.log(result); // the queued receipt; a failed scrape throws ByteKitError instead
}

The same call with the Python SDK:

import os

from bytekit import ByteKit
from bytekit.models import ScrapeSuccessEnvelope

client = ByteKit(api_key=os.environ["BYTEKIT_API_KEY"])
result = client.scrape.create(url="https://example.com", formats=["markdown"])
if isinstance(result, ScrapeSuccessEnvelope):
    print(result.metadata.title)
    print(result.formats.markdown)
else:
    print(result)  # the queued receipt; a non-2xx response or a failed scrape raises ByteKitError

Full SDK guides: TypeScript and Python.

What you can do with it

  • Scrape — Fetch a URL as raw HTML, clean markdown, or structured content.
  • Screenshot — Capture full-page or viewport PNG/JPEG.
  • Monitor — Watch a URL on a schedule and webhook you when the rendered output changes.
  • Bulk — Fan out thousands of URLs in parallel and receive one webhook when the job completes.
  • Sitemap — Discover URLs from a domain's sitemap or by light crawling.
  • Fetch — Low-latency raw HTTP fetch: the target's response comes back as the body, with metadata in headers.
  • Search — Run a web search and get ranked organic results.
  • Schema extraction — Extract structured JSON from a URL against a JSON Schema.

Scrape and screenshot calls can both be made asynchronous: send "async": true in the JSON body or ?async=true in the query string (either one is enough, on either endpoint). The API then returns 202 with a sc_… (scrape) or ss_… (screenshot) ID immediately, which you poll (scrapes can also deliver via webhook). Without it, screenshots hold up to 28s and return 200.

Authentication and accounts

Every request carries a Bearer API key, prefixed sk_live_. Manage keys from the dashboard — up to 50 active keys per account, with per-key billing attribution so you can split usage cleanly across services.

Full details in the Authentication guide.

Where to go next

  • Quickstart — first call in under five minutes, no SDK required.
  • Client Libraries — official TypeScript and Python SDKs.
  • Scraping — formats, options, async polling.
  • Rate Limits — usage counting, concurrency slots, response headers.
  • Monitors — schedule-based change detection with webhooks.
  • API Reference — every endpoint, request, and response.