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

# Verify website site

> Check a site now: fetch its home page and up to five key page URLs, look for the loader with this site's key, store the result and apply the health rule. Any page carrying the key verifies the site; a key page without it is flagged in last_check_result.pages. A loader installed through a tag manager is not in the page source: such a site is verified by its first hit instead, so loader_missing on a receiving site is not a fault. A disabled site is 409 invalid_transition. Up to a minute.

Contract:
- MCP tool `verify_website_site`, registry package `mcp.signals/website_sites`, mount `signals.website`.
- Operation `action`, response envelope `action`.
- Flags: none.



## OpenAPI

````yaml /api-reference/signals/openapi.yaml post /api/website-sites/{sid}/verify
openapi: 3.0.3
info:
  title: 'GetSales public contract: gs.service.signals'
  description: >-
    The signals service, its website lane: the team's registered sites with
    their key pages and tracked events, the team switch for the codes in links,
    and what the tracking plane saw: every visit as a session with its pages,
    forms and network, the browsers behind them and the people they were bound
    to; and, since P0 of its LinkedIn leg, who looked at a sender profile's
    LinkedIn profile (the sightings of the premium list, read once a day).


    GENERATED. This document is projected from the Zod MCP tool registry in
    `product/mcp/gs.mcp` (one tool per public endpoint, 1:1). Do not edit it by
    hand; edit the tool definition and regenerate with `pnpm openapi:public`.


    Surface: the public `/api` contract of `gs.service.signals`, 30 operations.
    This is the only OpenAPI document the platform publishes. Internal
    (`/internal`) and health endpoints are deliberately absent: they are not
    part of any contract, they can change without notice, and the service source
    is their only description.


    Conventions:

    - Auth is a bearer JWT, optionally narrowed by the `Team-SID` header.

    - Every success body is an MCP envelope: `success: true` plus one typed
    `operation` shape (`search`, `get`, `create`, `update`, `delete`, `metrics`,
    `group_by`, `action`), and a `meta` block with `trace_id` for support.

    - Every failure is the same `McpError` envelope with a code from a fixed
    16-code taxonomy, so a client maps errors once.

    - Lists page with `page_size` (0 to 500, default 50) plus an opaque forward
    `cursor`; `page_size: 0` returns counts only.

    - On `GET` and `DELETE`, object-valued query parameters (`filter`, `sort`)
    travel as JSON text and array-valued ones repeat as `name[]=value`.

    - The MCP-only `_meta` field (usage analytics) never reaches the backend and
    is not part of this contract.
  version: '1.0'
  contact:
    name: GetSales
    url: https://getsales.io
    email: support@getsales.io
  license:
    name: Proprietary
    url: https://getsales.io/terms
servers:
  - url: https://beta.getsales.io/signals/v1
    description: >-
      Production (the gateway path on the beta ring; the origin is provisioned
      per DEPLOY_MAP.md)
security:
  - BearerJwt: []
    TeamSid: []
tags:
  - name: profile_view_sightings
    description: >-
      Registry package `mcp.signals/profile_view_sightings`, served on MCP mount
      `signals.visits`.
  - name: signal_preferences
    description: >-
      Registry package `mcp.signals/signal_preferences`, served on MCP mount
      `signals.website`.
  - name: signal_settings
    description: >-
      Registry package `mcp.signals/signal_settings`, served on MCP mount
      `signals.website`.
  - name: website_key_pages
    description: >-
      Registry package `mcp.signals/website_key_pages`, served on MCP mount
      `signals.website`.
  - name: website_session_owners
    description: >-
      Registry package `mcp.signals/website_session_owners`, served on MCP mount
      `signals.visits`.
  - name: website_sessions
    description: >-
      Registry package `mcp.signals/website_sessions`, served on MCP mount
      `signals.visits`.
  - name: website_sites
    description: >-
      Registry package `mcp.signals/website_sites`, served on MCP mount
      `signals.website`.
  - name: website_tracked_events
    description: >-
      Registry package `mcp.signals/website_tracked_events`, served on MCP mount
      `signals.website`.
  - name: website_visitors
    description: >-
      Registry package `mcp.signals/website_visitors`, served on MCP mount
      `signals.visits`.
paths:
  /api/website-sites/{sid}/verify:
    post:
      tags:
        - website_sites
      summary: Verify website site
      description: >-
        Check a site now: fetch its home page and up to five key page URLs, look
        for the loader with this site's key, store the result and apply the
        health rule. Any page carrying the key verifies the site; a key page
        without it is flagged in last_check_result.pages. A loader installed
        through a tag manager is not in the page source: such a site is verified
        by its first hit instead, so loader_missing on a receiving site is not a
        fault. A disabled site is 409 invalid_transition. Up to a minute.


        Contract:

        - MCP tool `verify_website_site`, registry package
        `mcp.signals/website_sites`, mount `signals.website`.

        - Operation `action`, response envelope `action`.

        - Flags: none.
      operationId: verify_website_site
      parameters:
        - name: sid
          in: path
          required: true
          description: Website site sid (sg_si_...).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^sg_si_
            description: Website site sid (sg_si_...).
      responses:
        '200':
          description: '`action` success envelope.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VerifyWebsiteSiteResponse'
        4XX:
          $ref: '#/components/responses/McpClientError'
        5XX:
          $ref: '#/components/responses/McpServerError'
components:
  schemas:
    VerifyWebsiteSiteResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
          description: kebab-case verb; matches the route segment.
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
              description: Website site sid (sg_si_...).
            team_sid:
              type: string
              description: 'Owning team (ts_tm_..., external: gs.service.id).'
            domain:
              type: string
              description: >-
                The host as the team typed it, reduced to a bare hostname:
                lowercased, no scheme, port or path, a leading www. dropped.
                Immutable: a different host is a different site.
            include_subdomains:
              type: boolean
              description: Hosts under domain belong to the site (default true).
            site_key:
              type: string
              description: >-
                The public 20-character key the loader carries (gs.k). It names
                the site to the collector; not a secret. Changes only through
                rotate_website_site_key.
            status:
              type: string
              enum:
                - pending
                - verified
                - broken
                - disabled
              description: >-
                pending = waiting for the script (links to it are not coded
                yet); verified = receiving; broken = the health rule flagged it
                (see broken_reason); disabled = switched off by update enabled
                false.
            verified_at:
              type: string
              nullable: true
              description: ISO 8601 UTC, the last transition into verified; null never.
            last_check_at:
              type: string
              nullable: true
              description: >-
                ISO 8601 UTC, the last active check (verify_website_site or the
                daily job); null never.
            last_check_result:
              type: object
              nullable: true
              properties:
                outcome:
                  type: string
                  enum:
                    - found
                    - site_key_mismatch
                    - loader_missing
                    - fetch_failed
                  description: >-
                    The best outcome over pages: found wins over
                    site_key_mismatch, over loader_missing, over fetch_failed.
                pages:
                  type: array
                  items:
                    type: object
                    properties:
                      url:
                        type: string
                        description: The URL requested last for this page.
                      key_page_sid:
                        type: string
                        nullable: true
                        description: >-
                          sg_kp_... the key page this row checked; null for the
                          home page.
                      outcome:
                        type: string
                        enum:
                          - found
                          - site_key_mismatch
                          - loader_missing
                          - fetch_failed
                        description: >-
                          found: the page carries this site's key.
                          site_key_mismatch: a loader with another key.
                          loader_missing: no loader in the page source (a tag
                          manager installs it outside the source, so such a site
                          is verified by its first hit instead). fetch_failed:
                          no page to read, see failure.
                      http_status:
                        type: integer
                        nullable: true
                        description: The final HTTP status; null when no answer arrived.
                      failure:
                        type: string
                        nullable: true
                        enum:
                          - invalid_url
                          - scheme_not_allowed
                          - credentials_in_url
                          - port_not_allowed
                          - ip_literal
                          - host_unresolvable
                          - private_address
                          - redirect_without_location
                          - too_many_redirects
                          - redirected_off_site
                          - connection_failed
                          - http_status
                        description: >-
                          Why the fetch failed, when outcome is fetch_failed:
                          the guard refused the URL (scheme, port, credentials,
                          an IP literal, a private address), the host did not
                          resolve, the redirects ran out or left the site, the
                          connection failed, or the status was outside 2xx. Null
                          otherwise.
                    required:
                      - url
                      - key_page_sid
                      - outcome
                      - http_status
                      - failure
                  description: >-
                    The home page first, then the checkable key pages (a pattern
                    that names one URL).
              required:
                - outcome
                - pages
              description: >-
                What the last active check found, page by page; null while no
                check ran, and cleared by a key rotation.
            broken_reason:
              type: string
              nullable: true
              enum:
                - loader_missing
                - fetch_failed
                - site_key_mismatch
                - no_hits
              description: >-
                Set while broken: loader_missing (the source lost the loader and
                the hits stopped), fetch_failed (two checks in a row could not
                read the site while it was silent), site_key_mismatch (another
                key in the loader), no_hits (a tag-manager install whose hits
                stopped). Null otherwise.
            last_hit_at:
              type: string
              nullable: true
              description: >-
                ISO 8601 UTC, the newest hit the collector reported; null while
                nothing was received.
            hits_count_24h:
              type: integer
              minimum: 0
              description: >-
                Hits in the current UTC hour and the 23 before it, refreshed on
                every hit batch and every check (a rolling window, not "today").
            identification:
              type: string
              enum:
                - companies
                - people
              description: >-
                What a visit to the site may name. companies (default): links
                carry the recipient's company code and a visit shows the
                company, never a person. people: visits from the people the team
                writes to are shown by name.
            identification_confirmation:
              type: object
              nullable: true
              properties:
                identification:
                  type: string
                  enum:
                    - companies
                    - people
                  description: >-
                    The level confirmed: people covers both levels, companies
                    only itself.
                confirmed_at:
                  type: string
                  description: ISO 8601 UTC.
                confirmed_by:
                  type: object
                  properties:
                    actor_type:
                      type: string
                      enum:
                        - user
                        - support
                        - api_key
                        - system
                        - agent
                    actor_sid:
                      type: string
                      nullable: true
                    team_sid:
                      type: string
                    actor_name:
                      type: string
                      nullable: true
                      description: >-
                        The OAuth client that acted ("Claude", "n8n"); null for
                        a user, an API key or a system job.
                    oauth_client_sid:
                      type: string
                      nullable: true
                      description: >-
                        The acting OAuth client (id_oc_*); null off the OAuth
                        path.
                    reason:
                      type: string
                      nullable: true
                      description: >-
                        Why a system actor wrote the row (snapshot_capture_job,
                        ...); null otherwise.
                    permissions:
                      type: object
                      additionalProperties: {}
                      description: >-
                        Internal audit context: the grant set the actor held at
                        write time. Not a contract.
                    cluster_id:
                      type: integer
                      nullable: true
                      description: >-
                        Internal audit context: the cluster that served the
                        write.
                    trace_id:
                      type: string
                      nullable: true
                      description: >-
                        Internal audit context: the trace id of the request that
                        wrote the row.
                  required:
                    - actor_type
                    - actor_sid
                    - team_sid
                    - permissions
                  description: Who confirmed.
              required:
                - identification
                - confirmed_at
                - confirmed_by
              description: >-
                The customer's latest confirmation of its duties for a level, by
                whom and when. Links are coded only while it covers the site's
                level; null = none yet.
            link_codes_enabled:
              type: boolean
              description: >-
                Links to this site get a code (the company's or the person's, by
                identification) when the site is verified,
                identification_confirmation covers its level and the team switch
                (signal_settings.website_link_codes) is on. Default true.
            carrier_linkedin:
              type: string
              enum:
                - fragment
                - query
              description: >-
                Where the code rides in a link sent on LinkedIn: fragment
                (#g_<code>, default) or query (?gs=<code>).
            carrier_email:
              type: string
              enum:
                - fragment
                - query
              description: >-
                Where the code rides in a link sent by email: query (default) or
                fragment.
            consent_mode:
              type: string
              enum:
                - not_required
                - required
              description: >-
                not_required (default): the first-party visitor id is stored on
                the first hit. required: nothing is stored until the site's
                banner calls gs('consent', true); until then a visit is
                attributed by the code in the link alone.
            fingerprint_mode:
              type: string
              enum:
                - 'on'
                - consent
                - 'off'
              description: >-
                on (default): the device fingerprint is collected (answered as
                consent when consent_mode is required); consent: only after
                consent; off: never.
            anonymize_ip:
              type: boolean
              description: >-
                Once a session's network is resolved, keep the address's network
                part only (the last octet, or the last 80 bits of IPv6, zeroed).
                Default false.
            ignored_ips:
              type: array
              items:
                type: string
              description: >-
                IPv4 or IPv6 addresses or CIDR ranges whose visits are internal
                (the office, the VPN egress): shown under their own filter,
                never a fact, never a signal. At most 50.
            live_alerts:
              type: string
              enum:
                - 'off'
                - key_pages
                - all_known
              description: >-
                When a known person on the site alerts the team now: off,
                key_pages (default: a key page reached), all_known (any visit).
            live_alert_tasks:
              type: boolean
              description: >-
                A live alert also opens a task, due now, on each of the person's
                open threads. false: only the notice goes. Default true.
            live_alert_task_minutes:
              type: integer
              nullable: true
              description: >-
                How long that task lives: still open after this many minutes,
                the sweep cancels it and it reads as expired. 5 to 43200 (30
                days); null = it never expires. Default 30.
            inbound_playtable_sid:
              type: string
              nullable: true
              description: >-
                pt_tb_... the table an identified visitor nobody has would be
                handed to; stored only today, nothing reads it yet.
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: >-
                    The OAuth client that acted ("Claude", "n8n"); null for a
                    user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: >-
                    Why a system actor wrote the row (snapshot_capture_job,
                    ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: >-
                    Internal audit context: the grant set the actor held at
                    write time. Not a contract.
                cluster_id:
                  type: integer
                  nullable: true
                  description: 'Internal audit context: the cluster that served the write.'
                trace_id:
                  type: string
                  nullable: true
                  description: >-
                    Internal audit context: the trace id of the request that
                    wrote the row.
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
              description: Actor that registered the site.
            created_at:
              type: string
              description: ISO 8601 UTC.
            updated_at:
              type: string
              description: ISO 8601 UTC.
            deleted_at:
              type: string
              nullable: true
              description: >-
                ISO 8601 UTC; null = live. A deleted site keeps its sessions and
                visitors.
          required:
            - sid
            - team_sid
            - domain
            - include_subdomains
            - site_key
            - status
            - verified_at
            - last_check_at
            - last_check_result
            - broken_reason
            - last_hit_at
            - hits_count_24h
            - identification
            - identification_confirmation
            - link_codes_enabled
            - carrier_linkedin
            - carrier_email
            - consent_mode
            - fingerprint_mode
            - anonymize_ip
            - ignored_ips
            - live_alerts
            - live_alert_tasks
            - live_alert_task_minutes
            - inbound_playtable_sid
            - created_by
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            outcome:
              type: string
              enum:
                - found
                - site_key_mismatch
                - loader_missing
                - fetch_failed
              description: The best outcome over the pages fetched.
            previous_status:
              type: string
              enum:
                - pending
                - verified
                - broken
                - disabled
              description: The status before the check.
            status:
              type: string
              enum:
                - pending
                - verified
                - broken
                - disabled
              description: >-
                The status after the health rule: verified on found; a silent
                verified site may turn broken; pending and broken stay as they
                were on anything but found.
          required:
            - outcome
            - previous_status
            - status
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              description: >-
                The team this call ran in (the token team, or the team_sid
                override). Null when unauthenticated; absent from pre-2026-08-20
                backends.
            actor_type:
              type: string
              nullable: true
              description: >-
                user | agent | api_key | system. Null when unauthenticated;
                absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - operation
        - action
        - item
        - result
        - meta
    McpError:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - false
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - validation_failed
                - nothing_to_update
                - not_found
                - relation_not_found
                - invalid_transition
                - limit_exceeded
                - payment_required
                - duplicate_rejected
                - conflict
                - delete_blocked
                - unauthorized
                - forbidden
                - rate_limited
                - internal_error
                - service_unavailable
                - not_implemented
            message:
              type: string
            recoverable:
              type: boolean
            suggestion:
              type: string
            field_errors:
              type: object
              additionalProperties:
                type: array
                items:
                  type: object
                  properties:
                    rule:
                      type: string
                    message:
                      type: string
                  required:
                    - rule
                    - message
            blockers:
              type: array
              items:
                type: object
                properties:
                  type:
                    type: string
                    description: >-
                      Machine-readable blocker type (active_flow, pending_tasks,
                      …).
                  severity:
                    type: string
                    enum:
                      - hard
                      - soft
                    description: >-
                      hard = external action required; soft = acknowledge is
                      enough.
                  description:
                    type: string
                  entity_sid:
                    type: string
                    nullable: true
                  count:
                    type: integer
                  resolution:
                    type: string
                    description: 'Hard: tool name to call. Soft: code for acknowledge[].'
                  resolution_hint:
                    type: string
                required:
                  - type
                  - severity
                  - description
                  - entity_sid
                  - resolution
                  - resolution_hint
            context:
              type: object
              additionalProperties: {}
          required:
            - code
            - message
            - recoverable
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              description: >-
                The team this call ran in (the token team, or the team_sid
                override). Null when unauthenticated; absent from pre-2026-08-20
                backends.
            actor_type:
              type: string
              nullable: true
              description: >-
                user | agent | api_key | system. Null when unauthenticated;
                absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - error
  responses:
    McpClientError:
      description: >-
        MCP error envelope. `error.code` is one of validation_failed,
        nothing_to_update, not_found, relation_not_found, invalid_transition,
        limit_exceeded, payment_required, duplicate_rejected, conflict,
        delete_blocked, unauthorized, forbidden, rate_limited, not_implemented.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/McpError'
    McpServerError:
      description: >-
        MCP error envelope with `error.code` internal_error or
        service_unavailable.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/McpError'
  securitySchemes:
    BearerJwt:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Access token issued by gs.service.id. Its `access_identity` claim
        carries `team_sid`, `actor_sid` and `actor_type`, and that team scope is
        authoritative.
    TeamSid:
      type: apiKey
      in: header
      name: Team-SID
      description: >-
        Team scope for tokens that do not carry one. Ignored when the token
        already names a team.

````

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