> ## 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.

# Get domain tech changes API

> What a single domain recently added and dropped, with confidence scoring and the same accuracy guards as the Signals API. Costs 1 credit.

## Frequently asked questions

<AccordionGroup>
  <Accordion title="How is this different from the domain history endpoint?">
    [History](/docs/api-reference/domain-technologies/get-domain-tech-history-api) lists technologies previously detected on a domain. This endpoint returns *transitions* — what was added and what was dropped inside a window — each with a confidence score and the same accuracy guards the Signals API applies. Use history for a full record, and changes for "what moved recently".
  </Accordion>

  <Accordion title="How does this relate to the signals endpoints?">
    It is the same data asked from the other direction. [Adoption and churn signals](/docs/api-reference/signals/adoption-churn-signals-api) are scoped by technology or category and return many domains. This is scoped by domain and returns many technologies. Same row shape, same confidence model, same first-seen gate.
  </Accordion>

  <Accordion title="What is in the summary block?">
    Counts of technologies added and dropped, bucketed at 30 and 90 days. The 90-day bucket includes the 30-day one. Buckets cover the smaller of your `window` and the bucket size, so a `window=30` request reports 30-day figures in both.
  </Accordion>

  <Accordion title="Why does a confidence object sometimes have a guard field?">
    Because a churn guard capped that score in place. `scan_flap` means the technology has a history of flickering on that host, so an apparent removal is more likely a crawl miss than a real change. The event is still returned — we downgrade rather than hide, so you can explain why a signal looks weak.
  </Accordion>

  <Accordion title="Why do some events show a subdomain host?">
    Every event carries `detection_url`, the URL the crawler actually loaded. A change on `docs.example.com` is not a change on the apex domain. Show `detection_url` rather than assuming the change applies to the root.
  </Accordion>
</AccordionGroup>


## OpenAPI

````yaml GET /v1/domain/{domain}/changes
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/domain/{domain}/changes:
    get:
      tags:
        - Domain technologies
      summary: Get domain tech changes API
      description: >-
        What a single domain recently **added** and **dropped**, with the same
        accuracy stack as the Signals API — the same confidence score, the same
        first-seen gate and the same churn guards. This is the domain-scoped
        sibling of the adoption and churn signals, which are technology- or
        category-scoped.


        Use it to power an account watch view: `GET /v1/domain/{domain}` tells
        you what a domain runs today, and this tells you what changed.


        Costs 1 credit.
      operationId: getDomainChanges
      parameters:
        - name: domain
          in: path
          required: true
          description: The domain to inspect (for example `shopify.com`).
          schema:
            type: string
            example: shopify.com
        - name: window
          in: query
          required: false
          description: >-
            Look-back window in days, 1–365. The response's summary buckets
            cover `min(window, bucket)`.
          schema:
            type: integer
            default: 90
            minimum: 1
            maximum: 365
        - name: include_first_seen
          in: query
          required: false
          description: >-
            `true` disables the first-seen gate on adoptions, turning the feed
            into newly-observed technologies rather than genuine adoptions.
            Echoed back as `excludes_first_seen`.
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: Adoption and churn events for this domain
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    type: object
                    properties:
                      domain:
                        type: string
                        example: shopify.com
                      window_days:
                        type: integer
                        example: 90
                      excludes_first_seen:
                        type: boolean
                        example: true
                      summary:
                        type: object
                        description: >-
                          Counts bucketed by window. The 90-day bucket includes
                          the 30-day one.
                        properties:
                          30d:
                            type: object
                            properties:
                              added:
                                type: integer
                                example: 3
                              dropped:
                                type: integer
                                example: 1
                          90d:
                            type: object
                            properties:
                              added:
                                type: integer
                                example: 7
                              dropped:
                                type: integer
                                example: 2
                      events:
                        type: array
                        items:
                          type: object
                          properties:
                            type:
                              type: string
                              enum:
                                - adoption
                                - churn
                              example: adoption
                            technology_id:
                              type: integer
                              example: 2184
                            technology_name:
                              type: string
                              example: Shopify
                            category:
                              type: string
                              nullable: true
                              example: Ecommerce Platforms
                            subdomain:
                              type: string
                              example: WWW.SHOPIFY.COM
                            detection_url:
                              type: string
                              example: https://www.shopify.com
                            event_at:
                              type: string
                              example: '2026-05-31 14:10:33'
                            detection_count:
                              type: integer
                              example: 6
                            detection_rate:
                              type: number
                              format: float
                              example: 0.86
                            churn_reliability:
                              type: string
                              nullable: true
                            confidence:
                              $ref: '#/components/schemas/SignalConfidence'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  schemas:
    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
    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:
    BadRequest:
      description: Invalid or missing parameters
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
          example:
            success: false
            error:
              code: VALIDATION_ERROR
              message: >-
                Provide exactly one scope: technology_id, technology or
                category_id.
    Unauthorized:
      description: Missing or invalid API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    PaymentRequired:
      description: Not enough credits, or the plan does not include this feature
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
          example:
            success: false
            error:
              code: INSUFFICIENT_CREDITS
              message: Insufficient credits for this request.
              details:
                required: 1
                available: 0
    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)

````