Newscatcher CatchAll Web Search API

CatchAll is a recall-first web search API designed for AI agents and enterprise workflows requiring comprehensive information coverage. It supports Lite and Base retrieval modes, monitor slots for scheduled queries, configurable search depth up to a full archive, and up to 1,000 max results per call. Plans are credit-based with monthly rollovers and optional Deep Search available on Enterprise tiers. Authentication uses API keys issued instantly via the self-service platform dashboard.

OpenAPI Specification

newscatcher-web-search-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: NewsCatcher CatchAll API
  version: 1.6.1
  description: |
    CatchAll is a web search API that generates unique datasets that don't exist anywhere else on the web. Built on NewsCatcher's proprietary real-world event index, it delivers state-of-the-art recall—finding all relevant events, not just top results.

    ### Authentication

    All endpoints except /health and /version require `x-api-key` header. If the key is invalid or missing, the API returns the `403 Forbidden` error.

    ### Job workflow

    1. (Optional) Get suggestions via /catchAll/initialize
    2. Submit a query via /catchAll/submit with optional date ranges and custom validators/enrichments
    3. Poll /catchAll/status/{job_id} until completed (10-15 minutes)
    4. Retrieve results via /catchAll/pull/{job_id}

    ### Monitor workflow

    1. Create successful job via /catchAll/submit
    2. Create monitor via /catchAll/monitors/create with schedule
    3. Retrieve aggregated results via /catchAll/monitors/pull/{monitor_id}

    ### Webhook workflow

    1. Create a webhook via `POST /catchAll/webhooks`
    2. Attach it to a job or monitor via `POST /catchAll/webhooks/{webhook_id}/resources`,
       or pass `webhook_ids` at job or monitor creation time
    3. Receive HTTP notifications at the configured URL when each job completes

    ### Company search workflow

    1. Create a dataset via `POST /catchAll/datasets/` or `POST /catchAll/datasets/upload`
    2. Wait for the dataset `latest_status` to reach `ready`
    3. Submit a job with `connected_dataset_ids` pointing to your dataset
    4. Retrieve results — each record includes a `connected_entities` array
       with relevance scores per matched company

    ### Important notes

    **Dynamic schemas**: Response schemas are generated dynamically by LLMs. Field names in the `enrichment` object may vary and are not deterministic across jobs unless explicitly specified.

  contact:
    name: NewsCatcher
    url: https://newscatcherapi.com
    email: [email protected]

externalDocs:
  description: Find out more about NewsCatcher CatchAll API
  url: https://www.newscatcherapi.com/docs/web-search-api/get-started/introduction

servers:
  - url: https://catchall.newscatcherapi.com
    description: Production server

tags:
  - name: Jobs
    description: Operations to create, monitor, and retrieve job results.
    externalDocs:
      description: Learn about job lifecycle and status tracking
      url: https://www.newscatcherapi.com/docs/web-search-api/get-started/quickstart
  - name: Monitors
    description: Operations to create, operate and retrieve monitor results.
    externalDocs:
      description:
        Automate recurring queries with scheduled jobs and webhook
        notifications.
      url: https://www.newscatcherapi.com/docs/web-search-api/guides-and-concepts/monitors
  - name: Webhooks
    description: |
      Operations to create and manage reusable webhook endpoints.

      A webhook is a named HTTP endpoint that receives a POST notification
      when a job or monitor completes. Create webhooks once at the organization
      level and attach them to any number of jobs or monitors via `webhook_ids`.
      Supports Slack, Microsoft Teams, and generic HTTP targets with configurable
      delivery modes, authentication, and headers.
    externalDocs:
      description: Learn about centralized webhooks and notification setup
      url: https://www.newscatcherapi.com/docs/web-search-api/guides-and-concepts/webhooks
  - name: Entities
    description: |
      Operations to create, update, and delete company entities.

      Entities are the building blocks of Company Watchlist. Each entity represents
      a company (or person) you want to track. Add identifying information such as
      domain, alternative names, and key persons to improve matching quality.
    externalDocs:
      description: Learn about Company Watchlist and entities
      url: https://www.newscatcherapi.com/docs/web-search-api/guides-and-concepts/company-search
  - name: Datasets
    description: |
      Operations to create and manage datasets of entities.

      A dataset is a named collection of entities — think of it as a watchlist or
      portfolio. Connect a dataset to a job via `connected_dataset_ids` to activate
      Company Watchlist. Datasets can be reused across multiple jobs and monitors.
    externalDocs:
      description: Learn about datasets and Company Watchlist
      url: https://www.newscatcherapi.com/docs/web-search-api/guides-and-concepts/company-search
  - name: Projects
    description: |
      Operations to create, organize, and manage projects.

      A project is a named container for jobs, monitors, and datasets. Group
      related resources by use case, team, or client, and share them with
      teammates. Resources can be assigned at creation time or post-hoc.
    externalDocs:
      description: Learn about projects and resource organization
      url: https://www.newscatcherapi.com/docs/web-search-api/guides-and-concepts/projects
  - name: Meta
    description: Operations to check API health and version.

security:
  - ApiKeyAuth: []

paths:
  # ── Jobs ──────────────────────────────────────────────────────────────

  /catchAll/jobs/user:
    get:
      tags:
        - Jobs
      summary: List user jobs
      description: Returns all jobs created by the authenticated user.
      operationId: getUserJobs
      externalDocs:
        description: Learn about job management
        url: https://www.newscatcherapi.com/docs/web-search-api/api-reference/jobs/list-user-jobs
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PageSize"
        - $ref: "#/components/parameters/Search"
        - $ref: "#/components/parameters/Ownership"
        - $ref: "#/components/parameters/ProjectIdQuery"
      responses:
        "200":
          $ref: "#/components/responses/ListUserJobsResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"

  /catchAll/validate:
    post:
      tags:
        - Jobs
      summary: Validate query
      description: |
        Checks whether a query is well-formed and likely to produce good results before submitting a job.

        Returns a quality assessment with a status level, identified issues, and actionable suggestions.
      operationId: validateQuery
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ValidateQueryRequestDto"
            example:
              query: "Series B funding rounds for SaaS startups"
      responses:
        "200":
          $ref: "#/components/responses/ValidateQueryResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/initialize:
    post:
      tags:
        - Jobs
      summary: Initialize job
      description:
        Get suggested validators, enrichments, and date ranges for a query.
      operationId: initialize
      externalDocs:
        description: Learn about validator and enrichment suggestions
        url: https://www.newscatcherapi.com/docs/web-search-api/api-reference/jobs/initialize-job
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/InitializeRequestDto"
            example:
              query: "Series B funding rounds for SaaS startups"
              context: "Focus on funding amount and company name"
      responses:
        "200":
          $ref: "#/components/responses/InitializeResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/submit:
    post:
      tags:
        - Jobs
      summary: Create job
      description: Submit a query to create a new processing job.
      operationId: createJob
      externalDocs:
        description: Detailed documentation for job creation
        url: https://www.newscatcherapi.com/docs/web-search-api/api-reference/jobs/create-job
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SubmitRequestDto"
            example:
              query: "Series B funding rounds for SaaS startups"
              context: "Focus on funding amount and company name"
              start_date: "2026-02-18T00:00:00Z"
              end_date: "2026-02-23T00:00:00Z"
              limit: 10
              mode: "base"
      responses:
        "200":
          $ref: "#/components/responses/SubmitResponse"
        "400":
          $ref: "#/components/responses/BadRequestError"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/status/{job_id}:
    get:
      tags:
        - Jobs
      summary: Get job status
      description: Retrieve the current processing status of a job.
      operationId: getJobStatus
      externalDocs:
        description: Understanding job statuses and polling
        url: https://www.newscatcherapi.com/docs/web-search-api/api-reference/jobs/get-job-status
      parameters:
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          $ref: "#/components/responses/StatusResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"

  /catchAll/pull/{job_id}:
    get:
      tags:
        - Jobs
      summary: Get job results
      description: Retrieve the final results for a completed job.
      operationId: getJobResults
      externalDocs:
        description: Working with job results and dynamic schemas
        url: https://www.newscatcherapi.com/docs/web-search-api/api-reference/jobs/get-job-results
      parameters:
        - $ref: "#/components/parameters/JobId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PageSize"
      responses:
        "200":
          $ref: "#/components/responses/PullJobResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"

  /catchAll/continue:
    post:
      tags:
        - Jobs
      summary: Continue job
      description:
        Continue an existing job to process more records beyond the initial limit.
      operationId: continueJob
      externalDocs:
        description: Learn about job continuation and limits
        url: https://www.newscatcherapi.com/docs/web-search-api/api-reference/jobs/continue-job
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ContinueRequestDto"
            example:
              job_id: "5f0c9087-85cb-4917-b3c7-e5a5eff73a0c"
              new_limit: 100
      responses:
        "200":
          $ref: "#/components/responses/ContinueResponse"
        "400":
          $ref: "#/components/responses/BadRequestError"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/jobs/{job_id}:
    delete:
      tags:
        - Jobs
      summary: Delete job
      description: |
        Soft-deletes a job. The job is flagged as deleted and no longer appears in list results. The underlying data is retained.

        Only the job owner can delete a job. Returns `404` if the job is not found or does not belong to the authenticated user.

        Deleting an already-deleted job returns `200`.
      operationId: deleteJob
      parameters:
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          $ref: "#/components/responses/DeleteJobResponse"
        "401":
          $ref: "#/components/responses/UnauthorizedError"
        "404":
          $ref: "#/components/responses/NotFoundError"

  # ── Monitors ──────────────────────────────────────────────────────────────

  /catchAll/monitors:
    get:
      tags:
        - Monitors
      summary: List monitors
      description: Returns all monitors created by the authenticated user.
      operationId: listMonitors
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PageSize"
        - $ref: "#/components/parameters/Search"
        - $ref: "#/components/parameters/Ownership"
        - $ref: "#/components/parameters/ProjectIdQuery"
      responses:
        "200":
          $ref: "#/components/responses/ListMonitorsResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/monitors/create:
    post:
      tags:
        - Monitors
      summary: Create monitor
      description: Create a scheduled monitor based on a reference job.
      operationId: createMonitor
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateMonitorRequestDto"
            example:
              reference_job_id: "5f0c9087-85cb-4917-b3c7-e5a5eff73a0c"
              schedule: "every day at 12 PM"
              timezone: "UTC"
              backfill: true
              limit: 10
              webhook_ids:
                - "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
      responses:
        "200":
          $ref: "#/components/responses/CreateMonitorResponse"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/monitors/pull/{monitor_id}:
    get:
      tags:
        - Monitors
      summary: Get monitor results
      description:
        Retrieve aggregated results from all jobs executed by a monitor.
      operationId: pullMonitorResults
      parameters:
        - name: monitor_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: Monitor identifier.
      responses:
        "200":
          $ref: "#/components/responses/PullMonitorResponse"
        "404":
          $ref: "#/components/responses/NotFoundError"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/monitors/{monitor_id}/jobs:
    get:
      tags:
        - Monitors
      summary: List monitor jobs
      description: Return all jobs executed by a monitor.
      operationId: listMonitorJobs
      parameters:
        - name: monitor_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: Monitor identifier.
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum: ["asc", "desc"]
            default: "asc"
          description: Sort by start_date (asc or desc).
      responses:
        "200":
          $ref: "#/components/responses/ListMonitorJobsResponse"
        "404":
          $ref: "#/components/responses/NotFoundError"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/monitors/{monitor_id}/status:
    get:
      tags:
        - Monitors
      summary: Get monitor status history
      description: |
        Returns the full execution history of a monitor as a list of status entries, ordered from newest to oldest.
      operationId: getMonitorStatusHistory
      parameters:
        - name: monitor_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: Monitor identifier.
      responses:
        "200":
          $ref: "#/components/responses/MonitorStatusHistoryResponse"
        "401":
          $ref: "#/components/responses/UnauthorizedError"
        "404":
          $ref: "#/components/responses/NotFoundError"

  /catchAll/monitors/{monitor_id}/enable:
    post:
      tags:
        - Monitors
      summary: Enable monitor
      description: Resume scheduled job execution for a monitor.
      operationId: enableMonitor
      parameters:
        - name: monitor_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: Monitor identifier.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnableMonitorRequestDto"
            example:
              backfill: true
      responses:
        "200":
          description: Monitor enabled successfully
          content:
            application/json:
              schema:
                type: object
                required:
                  - success
                  - message
                  - monitor_id
                properties:
                  success:
                    type: boolean
                    description: True if the operation succeeded; false otherwise.
                    example: true
                  message:
                    type: string
                    description: Human-readable success message.
                    example: "Monitor enabled successfully."
                  monitor_id:
                    type: string
                    format: uuid
                    description: ID of the enabled monitor.
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/monitors/{monitor_id}/disable:
    post:
      tags:
        - Monitors
      summary: Disable monitor
      description: Stop scheduled job execution for a monitor.
      operationId: disableMonitor
      parameters:
        - name: monitor_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: Monitor identifier.
      responses:
        "200":
          description: Monitor disabled successfully
          content:
            application/json:
              schema:
                type: object
                required:
                  - success
                  - message
                  - monitor_id
                properties:
                  success:
                    type: boolean
                    description: True if the operation succeeded; false otherwise.
                    example: true
                  message:
                    type: string
                    description: Human-readable success message.
                    example: "Monitor disabled successfully."
                  monitor_id:
                    type: string
                    format: uuid
                    description: ID of the disabled monitor.
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/monitors/{monitor_id}:
    patch:
      tags:
        - Monitors
      summary: Update monitor
      description: Update the webhook configuration for an existing monitor.
      operationId: updateMonitor
      externalDocs:
        description: Learn about monitor configuration
        url: https://www.newscatcherapi.com/docs/web-search-api/how-to/configure-monitors
      parameters:
        - name: monitor_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: Monitor identifier.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateMonitorRequestDto"
            example:
              webhook_ids:
                - "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
      responses:
        "200":
          $ref: "#/components/responses/UpdateMonitorResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"
        "422":
          $ref: "#/components/responses/ValidationError"

    delete:
      tags:
        - Monitors
      summary: Delete monitor
      description: |
        Soft-deletes a monitor. The monitor is flagged as deleted, stops
        executing scheduled jobs immediately, and no longer appears in list
        results.

        Only the monitor owner can delete a monitor. Returns `404` if the
        monitor is not found or does not belong to the authenticated user.

        Deleting an already-deleted monitor returns `200`.
      operationId: deleteMonitor
      parameters:
        - name: monitor_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: Monitor identifier.
      responses:
        "200":
          $ref: "#/components/responses/DeleteMonitorResponse"
        "401":
          $ref: "#/components/responses/UnauthorizedError"
        "404":
          $ref: "#/components/responses/NotFoundError"

  # ── Webhooks ──────────────────────────────────────────────────────────────

  /catchAll/webhooks:
    post:
      tags:
        - Webhooks
      summary: Create webhook
      description: |
        Creates a new webhook endpoint for the organization.
      operationId: createWebhook
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateWebhookRequestDto"
            example:
              name: "Layoffs Alert"
              url: "https://hooks.slack.com/services/T000/B000/xxx"
              type: "slack"
              delivery_mode: "full"
      responses:
        "201":
          $ref: "#/components/responses/CreateWebhookResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "422":
          $ref: "#/components/responses/ValidationError"

    get:
      tags:
        - Webhooks
      summary: List webhooks
      description: Returns a paginated list of webhooks belonging to the organization.
      operationId: listWebhooks
      parameters:
        - $ref: "#/components/parameters/Page"
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            default: 100
            minimum: 1
            maximum: 500
          description: Number of webhooks per page.
        - $ref: "#/components/parameters/Search"
      responses:
        "200":
          $ref: "#/components/responses/ListWebhooksResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/webhooks/{webhook_id}:
    get:
      tags:
        - Webhooks
      summary: Get webhook
      description: Returns the full configuration of a single webhook by ID.
      operationId: getWebhook
      parameters:
        - $ref: "#/components/parameters/WebhookId"
      responses:
        "200":
          $ref: "#/components/responses/GetWebhookResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"
        "422":
          $ref: "#/components/responses/ValidationError"

    patch:
      tags:
        - Webhooks
      summary: Update webhook
      description: |
        Updates one or more fields of an existing webhook.
      operationId: updateWebhook
      parameters:
        - $ref: "#/components/parameters/WebhookId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateWebhookRequestDto"
            example:
              name: "Layoffs Alert (EU)"
              is_active: false
      responses:
        "200":
          $ref: "#/components/responses/UpdateWebhookResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"
        "422":
          $ref: "#/components/responses/ValidationError"

    delete:
      tags:
        - Webhooks
      summary: Delete webhook
      description: |
        Permanently deletes a webhook and removes all resource assignments. 
        
        Assigned jobs and monitors no longer trigger delivery to this webhook. This operation cannot be undone.
      operationId: deleteWebhook
      parameters:
        - $ref: "#/components/parameters/WebhookId"
      responses:
        "204":
          description: Webhook deleted successfully. No response body.
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"

  /catchAll/webhooks/{webhook_id}/test:
    post:
      tags:
        - Webhooks
      summary: Test webhook delivery
      description: |
        Sends a test HTTP request to the webhook URL using the webhook's configured method, headers, and auth. Returns the response from the target endpoint.

        Use this to verify URL reachability and authentication before attaching the webhook to a live job or monitor.
      operationId: testWebhook
      parameters:
        - $ref: "#/components/parameters/WebhookId"
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TestWebhookRequestDto"
            example:
              payload:
                test: true
                message: "CatchAll webhook test"
      responses:
        "200":
          $ref: "#/components/responses/TestWebhookResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/webhooks/{webhook_id}/resources:
    post:
      tags:
        - Webhooks
      summary: Assign resource to webhook
      description: |
        Attaches a job, monitor, or monitor group to the webhook. When the
        resource completes, the webhook receives a delivery.

        A single webhook can be assigned to multiple resources. Each resource
        can have up to 5 webhooks assigned.
      operationId: assignWebhookResource
      parameters:
        - $ref: "#/components/parameters/WebhookId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AssignWebhookResourceRequestDto"
            example:
              resource_type: "monitor"
              resource_id: "3fec5b07-8786-46d7-9486-d43ff67eccd4"
      responses:
        "200":
          $ref: "#/components/responses/AssignWebhookResourceResponse"
        "400":
          $ref: "#/components/responses/BadRequestError"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"
        "422":
          $ref: "#/components/responses/ValidationError"

    get:
      tags:
        - Webhooks
      summary: List webhook resources
      description: |
        Returns a paginated list of resources currently assigned to this webhook.
      operationId: listWebhookResources
      parameters:
        - $ref: "#/components/parameters/WebhookId"
        - name: resource_type
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/MappableResourceType"
        - $ref: "#/components/parameters/Page"
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            default: 100
            minimum: 1
            maximum: 500
          description: Number of assignments per page.
      responses:
        "200":
          $ref: "#/components/responses/ListWebhookResourcesResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/webhooks/{webhook_id}/resources/{resource_type}/{resource_id}:
    delete:
      tags:
        - Webhooks
      summary: Remove resource from webhook
      description: |
        Detaches a resource from this webhook. Completions of the resource no longer trigger delivery to this webhook.

        The webhook and the resource itself are not deleted.
      operationId: removeWebhookResource
      parameters:
        - $ref: "#/components/parameters/WebhookId"
        - $ref: "#/components/parameters/WebhookResourceType"
        - $ref: "#/components/parameters/WebhookResourceId"
      responses:
        "204":
          description: Resource removed from webhook. No response body.
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"

  /catchAll/resources/{resource_type}/{resource_id}/webhooks:
    get:
      tags:
        - Webhooks
      summary: List webhooks for resource
      description: |
        Returns all webhooks currently assigned to the given resource.
      operationId: listWebhooksForResource
      parameters:
        - $ref: "#/components/parameters/WebhookResourceType"
        - $ref: "#/components/parameters/WebhookResourceId"
        - name: is_active
          in: query
          required: false
          schema:
            type: boolean
          description: Filter by active status. Omit to return webhooks regardless of status.
        - $ref: "#/components/parameters/Page"
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            default: 100
            minimum: 1
            maximum: 500
          description: Number of webhooks per page.
      responses:
        "200":
          $ref: "#/components/responses/ListResourceWebhooksResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"
        "422":
          $ref: "#/components/responses/ValidationError"

  /catchAll/webhook-history:
    get:
      tags:
        - Webhooks
      summary: Get delivery history
      description: |
        Returns a paginated delivery log for a given resource, ordered by timestamp descending. 
        
        Each record shows the webhook dispatched, the HTTP status code returned, delivery outcome, and any error or warning messages. Use this to debug failed deliveries or audit dispatch activity.
      operationId: getWebhookDeliveryHistory
      parameters:
        - name: resource_type
          in: query
          required: true
          schema:
            $ref: "#/components/schemas/MappableResourceType"
          description: Type of the resource to retrieve delivery history for.
        - name: resource_id
          in: query
          required: true
          schema:
            type: string
            format: uuid
          description: Identifier of the resource to retrieve delivery history for.
          example: "3fec5b07-8786-46d7-9486-d43ff67eccd4"
        - $ref: "#/components/parameters/Page"
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            default: 50
            minimum: 1
            maximum: 500
          description: Number of records per page.
      responses:
        "200":
          $ref: "#/components/responses/DeliveryHistoryResponse"
        "403":
          $ref: "#/components/responses/ForbiddenError"
        "404":
          $ref: "#/components/responses/NotFoundError"
        "422":
          $ref: "#/components/responses/ValidationError"

  # ── Entities ────────────────────────────────────────

# --- truncated at 32 KB (199 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/newscatcher/refs/heads/main/openapi/newscatcher-web-search-api-openapi.yml