v1.0.0
OpenAPI 3.0.3

VibeBoost API

Server-side rendering service for client-side (React/SPA) apps. Renders pages via Puppeteer and returns fully-hydrated HTML or screenshots, enabling social crawlers and AI bots to read content they would otherwise miss.

Caching

Responses pass through three layers in order:

  1. CDN — Vercel Edge CDN (s-maxage=86400, stale-while-revalidate=604800) 2. KV — Upstash Redis, in-region, 24 h TTL 3. Blob — Vercel Blob, global, persistent. Fresh for 24 h; served stale with background re-render up to 7 days. Every response reports its cache state via two headers:
  • x-vb-cache: HIT | MISS — whether VibeBoost served it from cache or rendered fresh - x-vb-cache-age: <seconds> — how old the served cache entry is (0 on a MISS) (X-Cache additionally reports which layer served it: KV-HIT, BLOB-HIT, BLOB-STALE, or MISS.)

Bypassing the cache

To force a fresh render (applies to /api/render and /api/screenshot):

  • ?refresh=<value> (recommended). The value is arbitrary — VibeBoost only checks that refresh is present, so any value bypasses the KV + Blob caches. Use a value that changes on every request (a timestamp or random string) because it becomes part of the URL and must differ to also miss Vercel's edge cache; reuse the same value and the edge may replay its cached copy. refresh is excluded from the cache key, so the fresh result is stored under the normal key for later (non-refresh) requests. Examples:

    /api/screenshot?url=https://example.com&refresh=1725000000   # unix timestamp
    /api/render?url=https://example.com&refresh=b3f9c1            # random string
    

    In code: `?refresh=${Date.now()}` or `?refresh=${crypto.randomUUID()}`.

  • Cache-Control: no-cache request header — same function-level bypass, but Vercel's edge strips this header before it reaches the function, so on Vercel it only takes effect on an edge miss. Prefer refresh.

  • Cache-Control: no-store request header — bypass and do not store the result (the response is also marked non-cacheable for the CDN).

Pro features

Some options require authentication with a personal API key. Send it as a Bearer token — Authorization: Bearer vibe_… — or, for <img> embeds where headers aren't possible, as an ?api_key=vibe_… query parameter. Create and manage keys at /account. Pro-gated options: | Endpoint | Option | Effect | |---|---|---| | /api/screenshot | 🔒 fullPage=true | Capture the full scrollable page | | /api/screenshot | 🔒 scrollTo=<text> | Scroll to matching text and frame it in the screenshot | | /api/screenshot, /api/render | 🔒 hideCookies=true | Auto-hide & dismiss cookie consent banners | A request that uses one of these options without a valid key returns 401 Unauthorized.

Server:https://vibeboost.me

Production

No authentication selected
Client Libraries

Rendering

Puppeteer-based page rendering

Render page HTML

Loads the target URL in a headless Chromium browser and returns the fully-hydrated HTML after JavaScript has executed. Intended for social crawlers and AI bots that cannot run JavaScript. The hideCookies option is a Pro feature and requires an API token.

Query Parameters
  • url
    Type: string Format: uri
    required

    The page URL to render. Must be an http or https URL.

  • width
    Type: integer
    min:  
    1
    max:  
    2560

    Viewport width in pixels

  • height
    Type: integer
    min:  
    1
    max:  
    1440

    Viewport height in pixels

  • waitUntil
    Type: string enum

    Puppeteer navigation strategy — controls when the browser considers the page "ready" before the optional delay starts. | Value | Fires when… | |---|---| | load | The load event fires (all resources downloaded). Default. Recommended for apps that use WebSockets (e.g. Supabase Realtime), because those keep connections open and networkidle0 would wait forever. | | domcontentloaded | The DOM is parsed; external resources may still be loading. Fastest option. | | networkidle0 | No more than 0 open network connections for 500 ms. Do not use with Supabase or any app that holds persistent WebSocket connections — it will timeout. | | networkidle2 | No more than 2 open network connections for 500 ms. |

    values
    • load
    • domcontentloaded
    • networkidle0
    • networkidle2
  • delay
    Type: integer
    min:  
    0
    max:  
    5000

    Extra milliseconds to wait after the waitUntil event before capturing the page. Gives JavaScript frameworks time to finish rendering after the page load event fires.

  • hideCookies
    Type: boolean

    🔒 Pro — requires an API token. When true, injects CSS to hide cookie consent banners (OneTrust, Cookiebot, Quantcast Choice, TrustArc, Osano, and generic patterns) before navigation, then attempts to click accept buttons after the page loads. Works independently of customCss. Requests using this option without a valid key return 401.

  • customCss
    Type: string

    URL-encoded CSS injected into the page before capture. Use to hide banners or overlays not covered by hideCookies, or for any other style overrides. Works with or without hideCookies=true. Example: %23my-banner%7Bdisplay%3Anone%7D decodes to #my-banner{display:none}.

  • refresh
    Type: string

    Force a fresh render, bypassing VibeBoost's caches (the fresh result is still stored). The value is arbitrary — any value bypasses the cache — but use a value that changes on every request (e.g. a Unix timestamp or a random string like crypto.randomUUID()), because it becomes part of the URL and must differ to also miss Vercel's edge cache. Reuse the same value and the edge may replay its cached copy. refresh is excluded from the cache key, so nothing else about caching changes.

Responses
  • text/html
  • application/json
  • application/json
  • application/json
Request Example for get/api/render
curl 'https://vibeboost.me/api/render?url=https%3A%2F%2Fwww.vibehunt.me%2Fapp%2Fpfirsi-ch'
string

Capture page screenshot

Loads the target URL in a headless Chromium browser and returns a PNG or JPEG screenshot of the rendered viewport. The fullPage, hideCookies, and scrollTo options are Pro features and require an API token.

Query Parameters
  • url
    Type: string Format: uri
    required

    The page URL to render. Must be an http or https URL.

  • width
    Type: integer
    min:  
    1
    max:  
    2560

    Viewport width in pixels

  • height
    Type: integer
    min:  
    1
    max:  
    1440

    Viewport height in pixels

  • waitUntil
    Type: string enum

    Puppeteer navigation strategy — controls when the browser considers the page "ready" before the optional delay starts. | Value | Fires when… | |---|---| | load | The load event fires (all resources downloaded). Default. Recommended for apps that use WebSockets (e.g. Supabase Realtime), because those keep connections open and networkidle0 would wait forever. | | domcontentloaded | The DOM is parsed; external resources may still be loading. Fastest option. | | networkidle0 | No more than 0 open network connections for 500 ms. Do not use with Supabase or any app that holds persistent WebSocket connections — it will timeout. | | networkidle2 | No more than 2 open network connections for 500 ms. |

    values
    • load
    • domcontentloaded
    • networkidle0
    • networkidle2
  • delay
    Type: integer
    min:  
    0
    max:  
    5000

    Extra milliseconds to wait after the waitUntil event before capturing the page. Gives JavaScript frameworks time to finish rendering after the page load event fires.

  • hideCookies
    Type: boolean

    🔒 Pro — requires an API token. When true, injects CSS to hide cookie consent banners (OneTrust, Cookiebot, Quantcast Choice, TrustArc, Osano, and generic patterns) before navigation, then attempts to click accept buttons after the page loads. Works independently of customCss. Requests using this option without a valid key return 401.

  • customCss
    Type: string

    URL-encoded CSS injected into the page before capture. Use to hide banners or overlays not covered by hideCookies, or for any other style overrides. Works with or without hideCookies=true. Example: %23my-banner%7Bdisplay%3Anone%7D decodes to #my-banner{display:none}.

  • refresh
    Type: string

    Force a fresh render, bypassing VibeBoost's caches (the fresh result is still stored). The value is arbitrary — any value bypasses the cache — but use a value that changes on every request (e.g. a Unix timestamp or a random string like crypto.randomUUID()), because it becomes part of the URL and must differ to also miss Vercel's edge cache. Reuse the same value and the edge may replay its cached copy. refresh is excluded from the cache key, so nothing else about caching changes.

  • format
    Type: string enum

    Image format

    values
    • png
    • jpeg
  • quality
    Type: integer
    min:  
    1
    max:  
    100

    JPEG compression quality (ignored for PNG)

  • fullPage
    Type: boolean

    🔒 Pro — requires an API token. Capture the full scrollable page instead of just the viewport. Requests using this option without a valid key return 401.

  • scrollTo
    Type: string

    🔒 Pro — requires an API token. Scroll to the first occurrence of this text and centre it in the viewport before capturing. Matching is case-insensitive and whitespace-normalised. Forces a viewport capture (fullPage is ignored). Returns 404 if the text is not found. Only matches text within a single element; shadow DOM and iframes are not searched.

  • highlight
    Type: boolean

    When used with scrollTo, wraps the matched text in a highlight so it stands out in the screenshot. Has no effect without scrollTo.

  • occurrence
    Type: integer
    min:  
    1

    When used with scrollTo, selects which match to scroll to (1-based). Has no effect without scrollTo.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/screenshot
curl 'https://vibeboost.me/api/screenshot?url=https%3A%2F%2Fwww.vibehunt.me%2Fapp%2Fpfirsi-ch'
string

URLs (Collapsed)

Tracked URL registry

Cache (Collapsed)

Cache management

Cache Operations

Ops (Collapsed)

Operational endpoints

Ops Operations

Models