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

# Get a watch run summary

> Returns one run in full: its counts, its per-stage activity log, and every delivery attempt with
the records it carried under `notifications[].payload.notifications[]`. That is the same record
shape your channel receives, so a watch is readable here even when no channel is configured.

Records are returned only for a run whose `status` is `SUCCESS`. A run can leave rows behind
without ever paying for or delivering them, and those rows must not be readable. The run itself,
with its status, counts, and logs, is still returned so you can see what happened.




## OpenAPI

````yaml /openapi-specs/2025-11-01/watch.yaml get /watch/{dataset}/{watch_id}/runs/{run_id}/summary
openapi: 3.0.3
info:
  title: Watch API
  version: '2025-11-01'
  description: >
    The Watch API turns a Crustdata query into a recurring feed. A watch runs on
    your schedule and

    delivers only what is new or what changed since its previous run, to a
    webhook, Slack, Google Chat,

    or email.


    There are two kinds of watch, and the kind decides the URL:


    - **Discovery watches** (`/watch/{dataset}/search`) re-run a *search filter*
    and deliver records that
      newly match it. Use one to find people, companies, or jobs you do not know yet. Available for
      `person`, `company`, and `job`.
    - **Entity watches** (`/watch/{dataset}`) monitor a *list you supply* and
    deliver a notification when
      a tracked field on one of those records changes. Use one to follow a known set. Available for
      `person` and `company`.

    Both kinds share the same `config`, `notifications`, and run-history
    surfaces, and both start with a

    free baseline run: a discovery watch delivers a sample of up to 5 current
    matches, an entity watch

    records each subject's starting values and never fires. Every request needs
    an `Authorization` Bearer

    API key and the `x-api-version: 2025-11-01` header.


    **Credits.** A discovery watch is charged per new record delivered: 0.5 for
    a person, 2 for a company,

    0.5 for a job. An entity watch is charged per notification, tiered by
    `config.refresh_frequency_days`:

    5 credits at the 30-day default, 10 at 14 days, 20 at 7 days, 50 at 3 days,
    150 at 1 day. A run that

    finds nothing costs nothing, and the baseline run is free for both kinds.


    **Rate limit.** Watch-management requests are limited to 10 requests per
    minute per API key.


    **Access.** Creating a watch is open to any authenticated API customer, and
    the 10-requests-per-minute

    limit is what bounds abuse. What is gated is the data underneath: a create
    is rejected with `403` when

    the key is not entitled to the dataset, or when `fields` or `track` name
    field groups the key may not

    receive. Contact info@crustdata.com to request access.
servers:
  - url: https://api.crustdata.com
    description: Production API server
security:
  - bearerAuth: []
tags:
  - name: Watch APIs
    description: Recurring feeds over the Crustdata datasets
  - name: Discovery Watches
    description: Watches that re-run a search filter and deliver newly matching records
  - name: Entity Watches
    description: >-
      Watches that monitor a supplied list of people or companies for field
      changes
  - name: Watch Runs
    description: Run history and per-run delivery detail, shared by both watch kinds
paths:
  /watch/{dataset}/{watch_id}/runs/{run_id}/summary:
    get:
      tags:
        - Watch APIs
        - Watch Runs
      summary: Get one run with the records it delivered
      description: >
        Returns one run in full: its counts, its per-stage activity log, and
        every delivery attempt with

        the records it carried under `notifications[].payload.notifications[]`.
        That is the same record

        shape your channel receives, so a watch is readable here even when no
        channel is configured.


        Records are returned only for a run whose `status` is `SUCCESS`. A run
        can leave rows behind

        without ever paying for or delivering them, and those rows must not be
        readable. The run itself,

        with its status, counts, and logs, is still returned so you can see what
        happened.
      operationId: getWatchRunSummary
      parameters:
        - $ref: '#/components/parameters/DatasetPath'
        - $ref: '#/components/parameters/WatchId'
        - name: run_id
          in: path
          required: true
          description: The run's id, from `runs[].id` on the run-history endpoint.
          schema:
            type: integer
            example: 54811
        - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: The run, its logs, and its deliveries.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WatchRunSummary'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: No such watch for this key, or no such run on that watch.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SimpleErrorResponse'
              examples:
                watch:
                  summary: Unknown watch
                  value:
                    error: Watch not found
                run:
                  summary: Unknown run
                  value:
                    error: Run not found
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  parameters:
    DatasetPath:
      name: dataset
      in: path
      required: true
      description: The dataset the watch is built on.
      schema:
        type: string
        enum:
          - person
          - company
          - job
        example: person
    WatchId:
      name: watch_id
      in: path
      required: true
      description: The watch's `id`, returned when it was created.
      schema:
        type: integer
        example: 46936
    ApiVersion:
      name: x-api-version
      in: header
      required: true
      schema:
        type: string
        enum:
          - '2025-11-01'
        default: '2025-11-01'
        example: '2025-11-01'
      description: >
        API version to use. `2025-11-01` is the only accepted value. Send it on
        every call: it is

        enforced today on `POST /watch/{dataset}/search`, where a missing or
        unrecognized value returns

        `400`, and the other watch routes accept a request without it rather
        than relying on that.
  schemas:
    WatchRunSummary:
      type: object
      description: One run in full, with its counts, its activity log, and its deliveries.
      properties:
        id:
          type: integer
          example: 64200
        started_at:
          type: string
          format: date-time
          example: '2026-07-16T03:19:00Z'
        completed_at:
          type: string
          format: date-time
          nullable: true
          example: '2026-07-16T03:20:00Z'
        status:
          type: string
          enum:
            - RUNNING
            - SUCCESS
            - FAILED
            - SKIPPED
          example: SUCCESS
        failure_reason:
          type: string
          nullable: true
          example: null
        records_searched:
          type: integer
          description: Records the run's query matched before any filtering.
          example: 1204
        records_after_filter:
          type: integer
          description: Records left after filtering, before the new-record check.
          example: 12
        new_records_count:
          type: integer
          description: Records this run delivered.
          example: 1
        credits_deducted:
          type: number
          example: 5
        logs:
          type: array
          description: The run's per-stage activity log.
          items:
            $ref: '#/components/schemas/RunLogEntry'
        notifications:
          type: array
          description: >
            Every delivery this run attempted, with the records it carried.
            Empty unless `status` is

            `SUCCESS`: a run can leave rows behind without ever paying for or
            delivering them, and

            those rows are not readable here.
          items:
            $ref: '#/components/schemas/RunDelivery'
    SimpleErrorResponse:
      type: object
      description: Error payload with a single human-readable message.
      required:
        - error
      example:
        error: Watch not found
      properties:
        error:
          type: string
          description: Human-readable description of what went wrong.
          example: Watch not found
    RunLogEntry:
      type: object
      description: >-
        One entry in the run's activity log, recording what a pipeline stage did
        and when.
      properties:
        activity:
          type: string
          description: What happened at this point in the run.
          example: 25 new records
        timestamp:
          type: string
          format: date-time
          example: '2026-08-24T15:23:13.847993+00:00'
    RunDelivery:
      type: object
      description: One delivery attempt made by this run, with the records it carried.
      properties:
        sent_at:
          type: string
          format: date-time
          nullable: true
          example: '2026-07-16T03:20:00Z'
        http_status:
          type: integer
          nullable: true
          example: 200
        payload:
          type: object
          description: The delivered content, in its stored form.
          properties:
            subscription_id:
              type: integer
              example: 46936
            event_type:
              type: string
              description: The watch's internal event type, `indb:<kind>:<dataset>`.
              example: indb:entity:person
            timestamp:
              type: string
              format: date-time
              nullable: true
              example: '2026-07-16T03:20:00Z'
            notifications:
              type: array
              description: >
                One entry per delivered record, in its stored form. Every entry
                carries a stable

                `uid` and the record itself under `record`. An entity entry adds
                `changes`; a

                discovery entry adds `entity_id` and `updated_at`. The `record`
                is the same

                shape your channel receives, so a watch's results are readable
                here even when no

                channel is configured.
              items:
                type: object
                additionalProperties: true
              example:
                - uid: person_6324687_64200
                  changes:
                    - field: experience.employment_details.current
                      type: added
                      new_elements:
                        - title: Head of Data
                          name: Example Corp
                          start_date: '2026-07-01'
                  record:
                    crustdata_person_id: 6324687
                    basic_profile:
                      name: Sherry Robinson
                      current_title: Head of Data
    AuthErrorResponse:
      type: object
      description: >
        Authentication error payload. The message distinguishes the two
        failures: `Missing API key in

        request` when no `Authorization` header was sent, and `Invalid API key
        in request` when the

        Bearer token is not a valid key.
      required:
        - message
      example:
        message: Invalid API key in request
      properties:
        message:
          type: string
          description: Human-readable authentication error message.
          example: Invalid API key in request
    StructuredErrorResponse:
      type: object
      description: >-
        Structured error payload, used for rate-limit and API-version failures.
        The flatter `SimpleErrorResponse` shape is used elsewhere, so parse
        defensively.
      required:
        - error
      example:
        error:
          type: rate_limit_error
          message: >-
            Rate limit exceeded for this endpoint. Please write to
            gtm@crustdata.co.
          metadata: []
      properties:
        error:
          type: object
          required:
            - type
            - message
          properties:
            type:
              type: string
              description: Machine-readable error type identifier.
              example: rate_limit_error
            message:
              type: string
              description: Human-readable description of what went wrong.
              example: >-
                Rate limit exceeded for this endpoint. Please write to
                gtm@crustdata.co.
            metadata:
              type: array
              description: Extra context, empty on most errors.
              items:
                type: object
                additionalProperties: true
              example: []
  responses:
    Unauthorized:
      description: The API key is missing or not valid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/AuthErrorResponse'
          examples:
            invalid_api_key:
              summary: Bearer token present but not a valid key
              value:
                message: Invalid API key in request
            missing_api_key:
              summary: No Authorization header at all
              value:
                message: Missing API key in request
    RateLimited:
      description: >
        Too many watch requests. The per-endpoint limit is 10 requests per
        minute per API key, which is

        what bounds bursty create and update loops. Steady use is unaffected.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/StructuredErrorResponse'
          example:
            error:
              type: rate_limit_error
              message: >-
                Rate limit exceeded for this endpoint. Please write to
                gtm@crustdata.co.
              metadata: []
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: API key passed as a Bearer token in the Authorization header.

````

## Related topics

- [Get an entity watch](/api-reference/watch-apis/get-one-entity-watch.md)
- [Get a discovery watch](/api-reference/watch-apis/get-one-discovery-watch.md)
- [List watch runs](/api-reference/watch-apis/list-a-watchs-runs.md)
- [Test a discovery watch](/api-reference/watch-apis/send-a-test-notification-from-a-discovery-watch.md)
- [Test an entity watch](/api-reference/watch-apis/send-a-test-notification-from-an-entity-watch.md)
