> ## Documentation Index
> Fetch the complete documentation index at: https://cactal.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Capture an external page

> Renders an external public page in a real browser and returns the image, to study a reference site or the user's existing site: its layout, hierarchy, density, and feel. Consent banners and overlays are dismissed first. Focus with `selector` (plus `padding`) or `clip` and page down with `scrollTo`; external pages render in their own color scheme and never full page. Capture your own website with `websitePreview.capture`. Charged in AI credits to the website's organization.



## OpenAPI

````yaml /api-reference/openapi.json post /webResearch/screenshot
openapi: 3.1.0
info:
  title: Cactal API
  version: 1.0.0
  description: >-
    The Cactal public API. Create, edit, publish, and operate websites
    programmatically. Authenticate every request with an API key sent as
    `Authorization: Bearer <key>`.
servers:
  - url: https://api.cactal.ai/v1
security:
  - apiKey: []
tags:
  - name: Documentation
    description: >-
      Search and read the Cactal product documentation for concepts, guides,
      agent workflows, platform behavior, and API operations.
  - name: Feedback
    description: >-
      Submit free-form product feedback from users and agents to the Cactal
      feedback inbox.
  - name: Websites
    description: >-
      Create and manage websites — the top-level resource that owns source code,
      content, assets, domains, and analytics.
  - name: Website editors
    description: >-
      Grant, list, and revoke website-scoped editor access, and invite
      collaborators to a single website by email.
  - name: API keys
    description: >-
      Create, scope, rotate, and revoke the API keys that authenticate
      programmatic and agent access.
  - name: Source code
    description: >-
      Read and edit the framework source files of a website draft. Mutations
      require an edit lease.
  - name: Publishing
    description: Validate, build, publish, and roll back website versions.
  - name: CMS collections
    description: >-
      Define the content model: collections of structured content owned by a
      website.
  - name: CMS fields
    description: Manage the typed fields that make up a collection schema.
  - name: CMS items
    description: >-
      Create, query, publish, and organize the content entries inside a
      collection.
  - name: Domains
    description: >-
      Manage platform subdomains and custom domains, including DNS verification
      and the primary domain.
  - name: Assets
    description: Upload and manage website files and images served from the Cactal CDN.
  - name: Media generation
    description: >-
      Generate reference-guided website images that are stored as ordinary
      Cactal CDN assets.
  - name: Web research
    description: >-
      Look at the public web for a website's work: screenshots and measurements
      of external pages, a business's own pages read into profiles, and many
      images at once on numbered contact sheets.
  - name: Project Context
    description: >-
      Upload private durable reference material that the website agent can
      search, read, and inspect.
  - name: Analytics
    description: >-
      Read first-party traffic analytics for a website and export datasets as
      CSV.
  - name: Forms
    description: >-
      Read and triage website form submissions, manage notification recipients,
      and configure per-form settings. Visitors submit to `POST
      /_cactal/forms/{name}` on the website itself.
  - name: Server functions
    description: >-
      Inspect a website's server function runs and run its `http` functions on
      the draft. Visitors call `http` functions with `POST
      /_framework/server/{name}` on the website itself.
  - name: Secrets
    description: >-
      Manage a website's write-only secrets, which its server functions read
      from `env`. Values can be set and deleted but are never returned.
  - name: Organizations
    description: Manage organizations, members, and organization-wide invitations.
  - name: Audit log
    description: >-
      Read the immutable record of actions performed in an organization by users
      and API keys.
  - name: Billing
    description: >-
      Read billing state and manage plans, site capacity, and prepaid usage
      balance. Every billing operation requires the organization owner role,
      which API keys cannot hold — today these operations are performed from the
      dashboard, return 403 for API-key callers, and are hidden from MCP tool
      lists.
paths:
  /webResearch/screenshot:
    post:
      tags:
        - Web research
      summary: Capture an external page
      description: >-
        Renders an external public page in a real browser and returns the image,
        to study a reference site or the user's existing site: its layout,
        hierarchy, density, and feel. Consent banners and overlays are dismissed
        first. Focus with `selector` (plus `padding`) or `clip` and page down
        with `scrollTo`; external pages render in their own color scheme and
        never full page. Capture your own website with `websitePreview.capture`.
        Charged in AI credits to the website's organization.
      operationId: webResearch.screenshot
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                websiteId:
                  type: string
                  minLength: 1
                  description: >-
                    A website you can edit; its organization pays for the call
                    in AI credits.
                url:
                  type: string
                  maxLength: 2048
                  format: uri
                  description: Absolute public http(s) URL of the page to capture.
                viewport:
                  default: desktop
                  description: Device class to render at.
                  type: string
                  enum:
                    - desktop
                    - tablet
                    - mobile
                selector:
                  description: >-
                    Crop to the first element matching this CSS selector,
                    scrolled into view. Preferred: it follows the layout at
                    every viewport.
                  type: string
                  minLength: 1
                padding:
                  description: >-
                    CSS pixels of surrounding page to include on every side of
                    the `selector` match.
                  type: integer
                  minimum: 0
                  maximum: 500
                clip:
                  description: >-
                    Crop to this rectangle, in CSS pixels from the top-left of
                    the rendered page at the chosen viewport; it is scrolled
                    into view and must fit within the viewport. Only for regions
                    no selector frames.
                  type: object
                  properties:
                    x:
                      type: number
                      minimum: 0
                      maximum: 100000
                    'y':
                      type: number
                      minimum: 0
                      maximum: 100000
                    width:
                      type: number
                      minimum: 1
                      maximum: 2000
                    height:
                      type: number
                      minimum: 1
                      maximum: 2000
                  required:
                    - x
                    - 'y'
                    - width
                    - height
                scrollTo:
                  description: >-
                    Scroll to a CSS selector or an absolute Y offset before
                    capturing.
                  anyOf:
                    - type: string
                      minLength: 1
                    - type: integer
                      minimum: 0
                      maximum: 9007199254740991
                waitForSelector:
                  description: Wait for this CSS selector to match before capturing.
                  type: string
                  minLength: 1
                delayMs:
                  description: Extra settle time before capturing, in milliseconds.
                  type: integer
                  minimum: 0
                  maximum: 5000
                freezeAnimations:
                  default: true
                  description: >-
                    Fast-forward CSS animations and transitions to their end
                    state so captures are deterministic.
                  type: boolean
              required:
                - websiteId
                - url
      responses:
        '200':
          description: Rendered page image.
          content:
            image/jpeg:
              schema:
                type: string
                format: binary
        '400':
          description: >-
            Validation failed. The response `message` names the first invalid
            field.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceError'
        '401':
          description: Missing, invalid, expired, or revoked API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceError'
        '403':
          description: The authenticated principal lacks the required capability.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceError'
        '404':
          description: >-
            The resource does not exist or is outside the principal’s access
            scope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceError'
        '429':
          description: >-
            Rate limit exceeded. Retry after the number of seconds in the
            `Retry-After` header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceError'
components:
  schemas:
    ServiceError:
      type: object
      required:
        - kind
        - message
      description: >-
        Canonical error body returned by every non-2xx response. Extra fields
        carry error-specific details.
      properties:
        kind:
          type: string
          enum:
            - validation
            - unauthorized
            - forbidden
            - not_found
            - conflict
            - rate_limited
            - internal
          description: Stable, machine-readable error category.
        message:
          type: string
          description: Human-readable explanation of the failure.
        suggestion:
          type: string
          description: >-
            What to do next when the failure has a known fix; may name the exact
            operation to call.
        validValues:
          type: array
          items:
            type: string
          description: The acceptable values for the failing field, when the set is closed.
      additionalProperties: true
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: >-
        Cactal API key. Create one in the dashboard or via `POST /apiKeys`. The
        plaintext key is shown once at creation.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.