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

# Alert delivery log API

> The delivery history for one alert — what was sent, when, and whether your endpoint accepted it. Free.

## Frequently asked questions

<AccordionGroup>
  <Accordion title="What does truncated mean on a delivery?">
    More events matched than the 100-per-delivery cap. Truncation *is* pagination: the remainder arrives on the next sweep, because the watermark stopped at the cut. On an `hourly` alert that is an hour later; on a `daily` alert it is roughly 24 hours later, so a scope producing more than 100 events a day will only ever drain 100 a day. If you see persistent truncation, either switch to `hourly` or narrow the scope.
  </Accordion>

  <Accordion title="Why would response_status be null?">
    The request never got a response — a timeout, a DNS failure or a connection refusal. The `error` field carries the detail. Failures like these keep the watermark in place, so the same window is re-delivered on the next sweep.
  </Accordion>

  <Accordion title="How long is history kept?">
    Deliveries older than 30 days are pruned daily, but the newest 20 per alert are always retained regardless of age.
  </Accordion>

  <Accordion title="How do I see the actual events that were sent?">
    Pass `include_events=true`. It is opt-in because an events payload can reach roughly 30KB per delivery.
  </Accordion>
</AccordionGroup>


## OpenAPI

````yaml GET /v1/alerts/{id}/deliveries
openapi: 3.1.0
info:
  title: TechnologyChecker API
  description: >-
    Discover technology stacks, track market trends, and enrich data with
    company intelligence.
  version: 1.0.0
  contact:
    name: TechnologyChecker Support
    email: support@technologychecker.io
    url: https://technologychecker.io
servers:
  - url: https://api.technologychecker.io
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Domain technologies
    description: Look up technologies detected on any domain
  - name: Technology data
    description: Search, look up, and get details on tracked technologies
  - name: Market intelligence
    description: Technology stats, trends, and market share
  - name: Company data
    description: Firmographic and company intelligence
  - name: Live detection
    description: Real-time technology detection with browser rendering
  - name: Signals
    description: >-
      Intent signals derived from technology state transitions: who adopted, who
      churned, who switched, and who has a gap in their stack.
  - name: Alerts
    description: >-
      Saved signal queries delivered to your webhook. Every signal you can
      query, you can subscribe to.
  - name: Audiences
    description: >-
      Saved groups of domains — uploaded lists or computed recipes — that you
      can profile, slice and monitor.
  - name: Lead lists
    description: >-
      Build and export targeted domain lists combining technology detection with
      company data.
paths:
  /v1/alerts/{id}/deliveries:
    get:
      tags:
        - Alerts
      summary: Alert delivery log API
      description: >-
        The delivery history for one alert — what was sent, when, and whether
        your endpoint accepted it. This is the activity feed behind the
        dashboard and the answer to "what did you send me?".


        Deliveries older than 30 days are pruned, always keeping the newest 20
        per alert. Free.
      operationId: listAlertDeliveries
      parameters:
        - name: id
          in: path
          required: true
          description: The alert id.
          schema:
            type: string
            example: alrt_9f2c4a1e
        - name: limit
          in: query
          required: false
          description: Deliveries returned. Maximum 100.
          schema:
            type: integer
            default: 20
            maximum: 100
        - name: offset
          in: query
          required: false
          description: Pagination offset.
          schema:
            type: integer
            default: 0
        - name: include_events
          in: query
          required: false
          description: >-
            Embed the delivered event rows in each record. Opt-in because the
            payload can reach roughly 30KB per delivery.
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: Delivery records, newest first
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    type: object
                    properties:
                      deliveries:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                              example: dlv_7a1c3e9f
                            fired_at:
                              type: string
                              example: '2026-06-10 17:39:39'
                            event_count:
                              type: integer
                              example: 3
                            truncated:
                              type: boolean
                              description: >-
                                More events existed than the 100-per-delivery
                                cap; the remainder arrives on the next sweep.
                              example: false
                            is_test:
                              type: boolean
                              example: false
                            response_status:
                              type: integer
                              nullable: true
                              example: 200
                            success:
                              type: boolean
                              example: true
                            duration_ms:
                              type: integer
                              example: 214
                            error:
                              type: string
                              nullable: true
                            events:
                              type: array
                              description: Only present when `include_events=true`.
                              items:
                                $ref: '#/components/schemas/SignalEvent'
                      count:
                        type: integer
                        example: 20
                      limit:
                        type: integer
                        example: 20
                      offset:
                        type: integer
                        example: 0
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  schemas:
    SignalEvent:
      type: object
      description: >-
        One adoption or churn event: a domain and the technology transition
        observed on it.
      properties:
        domain:
          type: string
          example: example.com
        subdomain:
          type: string
          example: WWW.EXAMPLE.COM
        detection_url:
          type: string
          description: >-
            The URL the crawler loaded for this row. An event on
            `docs.example.com` is not an event on the apex — show this host, not
            just `domain`.
          example: https://www.example.com
        technology_id:
          type: integer
          example: 900783
        technology_name:
          type: string
          example: Google Workspace
        event_at:
          type: string
          description: When the transition was observed (scan time).
          example: '2026-05-31 14:10:33'
        last_detected:
          type: string
          nullable: true
          example: '2026-04-18 07:39:59'
        detection_rate:
          type: number
          format: float
          description: '`detection_count / scan_count` for this host.'
          example: 0.86
        detection_count:
          type: integer
          description: How many distinct scans actually saw this technology.
          example: 6
        churn_reliability:
          type: string
          nullable: true
          enum:
            - high
            - medium
            - low
            - null
          description: Reliability class of the detection method. Present on churn rows.
        confidence:
          $ref: '#/components/schemas/SignalConfidence'
        company:
          $ref: '#/components/schemas/CompanyCard'
    SignalConfidence:
      type: object
      description: >-
        Per-event trust score combining detection method reliability,
        persistence (how many distinct scans saw the technology) and consistency
        (detection rate). A single-scan detection caps at `medium`; a churn with
        `detection_count` below 2 caps at `low`.
      properties:
        score:
          type: integer
          minimum: 0
          maximum: 100
          example: 79
        label:
          type: string
          enum:
            - high
            - medium
            - low
          example: high
        guard:
          type: string
          nullable: true
          description: >-
            Present when a churn guard capped this score in place, e.g.
            `scan_flap`.
          example: scan_flap
    CompanyCard:
      type: object
      nullable: true
      description: >-
        LinkedIn company card attached when firmographic enrichment is on.
        `null` when the domain has no LinkedIn match (roughly 23–30% of
        technology domains match).
      properties:
        name:
          type: string
          example: Ghostcircusapparel
        industry:
          type: string
          example: Retail Apparel and Fashion
        industry_code:
          type: integer
          example: 18
        employees:
          type: string
          example: 51-200
        country:
          type: string
          example: united states
        city:
          type: string
          nullable: true
        state:
          type: string
          nullable: true
        founded:
          type: integer
          nullable: true
          example: 2015
        company_type:
          type: string
          example: Privately Held
    ApiError:
      type: object
      properties:
        success:
          type: boolean
          example: false
        error:
          type: object
          properties:
            code:
              type: string
              example: UNAUTHORIZED
            message:
              type: string
              example: Missing or invalid API key
  responses:
    Unauthorized:
      description: Missing or invalid API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    RateLimited:
      description: Rate limit exceeded
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        API key in format `tapi_live_[32-char]` (live) or `tapi_test_[32-char]`
        (test)

````