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

# Try a signed demo webhook

> Explicitly sends one sample monitor.test event to GDELT Cloud’s temporary first-party receiver and returns the signed request and verified response. Takes only an optional name; no customer URL, email or Monitor ID is accepted. Creates no saved Monitor and sends no email. The receiver capability expires after 120 seconds and is not returned. This demonstrates signed transport only, not query matching, scheduling or retries. Costs 0 QU; limited to 20 attempts per organization per hour. Requires authenticated organization access and the Monitor policy gate. Preview remains non-delivering. Takes no query parameters.



## OpenAPI

````yaml /api-reference/openapi-v2.json post /api/v2/monitors/demo-webhook
openapi: 3.0.3
info:
  title: GDELT Cloud API v2
  version: 2.0.0
  description: >-
    Clean v2 REST API for generated GDELT Cloud structured Events, clustered
    Stories, linked Entities, summaries, admin1 discovery, significance ranking,
    and paginated article evidence.


    Event significance is a family-scoped weighted blend, renormalized so every
    event family spans a true 0-1: each event's raw total is divided by the
    maximum its own family can reach (Conflict 1.00, CAMEO+ POLITICAL 0.90,
    other CAMEO+ domains 0.65). All events: Goldstein severity 0.25, article
    evidence 0.05, confidence 0.05. Conflict only: fatalities 0.55 (log-scaled
    by body count) and civilian targeting 0.10. CAMEO+ only: magnitude 0.20,
    systemic importance 0.15, propagation potential 0.10, market sensitivity
    0.10. When magnitude is unmeasured its term AND its 0.20 weight are both
    dropped. The four CAMEO+ metrics are rubric scores produced by published
    formulas - ordinal ranking signals, not measurements, probabilities, or
    predicted price moves. goldstein_scale is one canonical public metric,
    populated for Conflict Events and CAMEO+ POLITICAL Events where meaningful.
    Story linked_event_count is a Story-to-Event link aggregate, not a distinct
    Event total.
servers:
  - url: https://gdeltcloud.com
    description: Production
  - url: http://localhost:3000
    description: Local development
security:
  - ApiKeyAuth: []
tags:
  - name: Events
    description: Coded CAMEO+ / conflict events — search, fetch, and summarize.
  - name: Stories
    description: Clustered narratives (stories) and their articles.
  - name: Situations
    description: >-
      One real-world occurrence as the Stories and coded Events that belong to
      it — stored, adjudicated membership (`meta.situation_source: curated`) or
      a walked neighbourhood around a Story. Discovery, detail, four
      independently paged member lists, and the only write on the core surface
      (5 QU with an Idempotency-Key).
  - name: Entities
    description: >-
      People & organizations — resolve a name to an entity, then fetch its
      profile and tone. Also the publication activity journal
      (/api/v2/activity): observed evidence of what was published about
      identities and records — committed batches only, cursor-paged, never
      source intake.
  - name: Unified Search
    description: >-
      One fuzzy lookup across every id-space — start here with a name, take the
      entity id, then reuse it on every other surface. This is the resolver the
      rest of the API assumes you called first.
  - name: Media Intelligence
    description: >-
      Press-coverage tone over time and share of voice against a peer set.
      Requires the `can_use_tone` / `can_use_share_of_voice` entitlement; social
      signal is an admin-only preview.
  - name: Facilities
    description: >-
      Unified physical-asset directory — GEM energy assets, World Port Index
      ports and Epoch AI data centers on one keyed surface, resolved to spine
      owners. Requires the `can_use_facilities` entitlement.
  - name: Monitors
    description: >-
      Organization-shared scheduled checks over the Core API, with email and
      signed-webhook delivery. Monitor execution does not consume query units.
  - name: Geography
    description: >-
      Country context and admin-1 geography: /api/v2/countries (publication
      activity, reporting counts, dated economic and resource fundamentals,
      facility and office inventories, directory mode over every registered
      country) and admin-1 lookups.
  - name: Government
    description: >-
      US federal awards (USAspending) and foreign-influence registrations (DOJ
      NSD FARA), resolved onto the entity spine. Requires the `can_use_gov`
      entitlement.
  - name: Political Offices
    description: >-
      Public political offices and who holds them — legislatures, cabinets,
      heads of state, courts and IGO posts, with the office start/end dates the
      publisher states (valid time), resolved onto the entity spine. Actor
      context for geopolitical analysis; NOT a PEP or sanctions-screening tool.
      Requires the `can_use_offices` entitlement.
  - name: Filings
    description: >-
      SEC EDGAR filings, XBRL financials, and relations extracted from filing
      text. Requires the `can_use_filings` entitlement.
  - name: Reference Data
    description: >-
      The GLEIF Global LEI Index — legal-entity reference data, consolidation
      relationships, and LEI↔ISIN mappings. Requires the `can_use_gleif`
      entitlement.
  - name: Energy
    description: Global Energy Monitor assets + ownership registry.
  - name: AI Compute
    description: >-
      Epoch AI datasets — models, hardware, data centers, companies and chip
      sales. Requires the `can_use_epoch_ai` entitlement.
  - name: Macro Finance
    description: >-
      FRED economic time series — catalog, point-in-time observations and
      releases. Requires the `can_use_macro` entitlement.
  - name: Screening and Reference
    description: >-
      Restricted-party lists, name screening and ownership-chain exposure.
      Requires the `can_use_screening` / `can_use_exposure` entitlement.
      Analytical coverage, not an audit-grade compliance control.
  - name: China
    description: >-
      China overseas development finance (AidData GCDF). Requires the
      `can_use_china` entitlement.
  - name: Maritime
    description: >-
      AIS-derived vessel flow — chokepoint transits, last-known vessel
      positions, carriers, dwell and AIS-dark gaps. Terrestrial AIS only, so
      coverage thins in open ocean. Requires the `can_use_maritime` entitlement.
  - name: Atlas Intelligence
    description: >-
      Geopolitical-risk and posture indices computed from GDELT Cloud’s own
      coded events, normalized to each place’s own frozen baseline.
  - name: Briefs
    description: Source-backed monitoring briefs.
  - name: Meta
    description: >-
      Machine-readable discovery: the value vocabularies, the endpoint
      contracts, and the query-unit cost model. Unmetered, so a client can check
      before it spends.
paths:
  /api/v2/monitors/demo-webhook:
    post:
      tags:
        - Monitors
      summary: Try a signed demo webhook
      description: >-
        Explicitly sends one sample monitor.test event to GDELT Cloud’s
        temporary first-party receiver and returns the signed request and
        verified response. Takes only an optional name; no customer URL, email
        or Monitor ID is accepted. Creates no saved Monitor and sends no email.
        The receiver capability expires after 120 seconds and is not returned.
        This demonstrates signed transport only, not query matching, scheduling
        or retries. Costs 0 QU; limited to 20 attempts per organization per
        hour. Requires authenticated organization access and the Monitor policy
        gate. Preview remains non-delivering. Takes no query parameters.
      operationId: demo-monitor-webhook-v2
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MonitorDemoWebhookRequest'
            example: {}
      responses:
        '200':
          description: >-
            Signed first-party transport transcript. Inspect demo.delivered and
            demo.signature.verified.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorDemoWebhookResponse'
        '400':
          description: Invalid or unsupported parameter (see `code` and `details`)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Plan does not include this surface
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: >-
            `MONITOR_PREVIEW_RATE_LIMITED` — The free first-party webhook
            demonstration has reached its organization-scoped hourly limit. The
            real Preview query already completed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    MonitorDemoWebhookRequest:
      type: object
      properties:
        name:
          type: string
          default: Webhook demonstration
          minLength: 1
          maxLength: 100
      additionalProperties: false
    MonitorDemoWebhookResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        demo:
          type: object
          properties:
            delivered:
              type: boolean
            expires_at:
              type: string
              nullable: true
            request:
              type: object
              properties:
                headers:
                  type: object
                  additionalProperties:
                    type: string
                body:
                  $ref: '#/components/schemas/MonitorTestWebhookEvent'
                raw_body:
                  type: string
              required:
                - headers
                - body
                - raw_body
              nullable: true
            signature:
              type: object
              properties:
                algorithm:
                  type: string
                  enum:
                    - HMAC-SHA256
                verified:
                  type: boolean
              required:
                - algorithm
                - verified
            response:
              type: object
              properties:
                status:
                  type: number
                body: {}
                body_truncated:
                  type: boolean
              required:
                - status
                - body
                - body_truncated
              nullable: true
            error:
              type: string
              nullable: true
          required:
            - delivered
            - expires_at
            - request
            - signature
            - response
            - error
      required:
        - success
        - demo
    ErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - false
        error:
          type: string
        code:
          type: string
        details:
          type: object
          description: >-
            Recoverable validation context when available, such as param,
            invalid_value, accepted_values, nearest_values, and a corrected
            example.
          additionalProperties: true
    MonitorTestWebhookEvent:
      type: object
      required:
        - schema_version
        - id
        - type
        - created_at
        - monitor
        - run
        - trigger
        - data
        - test
        - links
      properties:
        schema_version:
          type: string
          enum:
            - '1'
        id:
          type: string
        type:
          type: string
          enum:
            - monitor.test
        created_at:
          type: string
          format: date-time
        monitor:
          type: object
          required:
            - id
            - name
          properties:
            id:
              type: string
              format: uuid
            name:
              type: string
        run:
          nullable: true
          enum:
            - null
        trigger:
          nullable: true
          enum:
            - null
        data:
          type: object
          required:
            - matches
          properties:
            matches:
              type: array
              maxItems: 0
              items:
                $ref: '#/components/schemas/MonitorMatch'
        test:
          type: object
          required:
            - status
            - message
          properties:
            status:
              type: string
              enum:
                - ok
            message:
              type: string
              enum:
                - GDELT Cloud Monitor webhook test
        links:
          type: object
          required:
            - monitor
            - run
          properties:
            monitor:
              type: string
              format: uri
            run:
              nullable: true
              enum:
                - null
    MonitorMatch:
      oneOf:
        - type: object
          required:
            - kind
            - item
          properties:
            kind:
              type: string
              enum:
                - story
            item:
              $ref: '#/components/schemas/StoryCard'
        - type: object
          required:
            - kind
            - family
            - item
          properties:
            kind:
              type: string
              enum:
                - event
            family:
              type: string
              enum:
                - cameoplus
            item:
              $ref: '#/components/schemas/EventCard'
        - type: object
          required:
            - kind
            - family
            - item
          properties:
            kind:
              type: string
              enum:
                - event
            family:
              type: string
              enum:
                - conflict
            item:
              $ref: '#/components/schemas/EventCard'
    StoryCard:
      type: object
      properties:
        recorded_at:
          type: string
          description: >-
            First committed availability time for the matching publication;
            present for recorded-interval queries.
        published_at:
          type: string
          description: >-
            Original publication timestamp; present for recorded-interval
            queries.
        id:
          type: string
        url:
          type: string
          nullable: true
        title:
          type: string
          nullable: true
        story_date:
          type: string
        updated_at:
          type: string
          nullable: true
        processed_at:
          type: string
          nullable: true
        category:
          type: string
          nullable: true
        category_code:
          type: string
          nullable: true
        subcategory:
          type: string
          nullable: true
        geo:
          type: object
          properties:
            country:
              type: string
              nullable: true
            region:
              type: string
              nullable: true
            continent:
              type: string
              nullable: true
            admin1:
              type: string
              nullable: true
            location:
              type: string
              nullable: true
            latitude:
              type: number
              nullable: true
            longitude:
              type: number
              nullable: true
            geo_precision:
              type: number
              nullable: true
            geo_precision_label:
              type: string
              nullable: true
          required:
            - country
            - region
            - continent
            - admin1
            - location
            - latitude
            - longitude
            - geo_precision
            - geo_precision_label
        geo_provenance:
          type: object
          properties:
            method:
              type: string
              enum:
                - representative_linked_event
            event_id:
              type: string
          required:
            - method
            - event_id
          nullable: true
        geo_context:
          type: object
          properties:
            location_country:
              type: string
              nullable: true
            actor_origin_countries:
              type: array
              items:
                type: string
          required:
            - location_country
            - actor_origin_countries
        metrics:
          type: object
          properties:
            significance:
              type: number
            article_count:
              type: number
            linked_event_count:
              type: number
            max_linked_event_significance:
              type: number
            civilian_targeting_event_count:
              type: number
          required:
            - significance
            - article_count
            - linked_event_count
            - max_linked_event_significance
            - civilian_targeting_event_count
        has_events:
          type: boolean
        has_fatalities:
          type: boolean
          nullable: true
        has_civilian_targeting:
          type: boolean
        fatalities:
          type: number
          nullable: true
        linked_events:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              title:
                type: string
                nullable: true
            required:
              - id
              - title
        entity_refs:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              public_official:
                type: object
                properties:
                  checked:
                    type: boolean
                    description: >-
                      False when office evidence or canonical identity could not
                      be checked.
                  is_public_official:
                    type: boolean
                    nullable: true
                    description: >-
                      Published office evidence exists. Null means unavailable,
                      not a negative finding.
                  status:
                    type: string
                    enum:
                      - current
                      - former
                      - unknown
                    nullable: true
                    description: >-
                      Publisher status across recorded terms. Former requires
                      all terms to be explicitly ended; missing dates never
                      infer status.
                  total:
                    type: number
                    nullable: true
                    description: >-
                      Distinct recorded offices, independent of the bounded
                      preview.
                  offices:
                    type: array
                    items:
                      type: object
                      properties:
                        office_id:
                          type: string
                        name:
                          type: string
                        country_iso3:
                          type: string
                          nullable: true
                          description: Office jurisdiction, not citizenship.
                        status:
                          type: string
                          enum:
                            - current
                            - ended
                            - unknown
                        start_date:
                          type: string
                          nullable: true
                        end_date:
                          type: string
                          nullable: true
                        evidence_date:
                          type: string
                          nullable: true
                        sources:
                          type: array
                          items:
                            type: object
                            properties:
                              source_key:
                                type: string
                              url:
                                type: string
                                nullable: true
                            required:
                              - source_key
                              - url
                      required:
                        - office_id
                        - name
                        - country_iso3
                        - status
                        - start_date
                        - end_date
                        - evidence_date
                        - sources
                  truncated:
                    type: boolean
                required:
                  - checked
                  - is_public_official
                  - status
                  - total
                  - offices
                  - truncated
            required:
              - id
              - name
        matched_categories:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
              label:
                type: string
            required:
              - code
              - label
        top_articles:
          type: array
          items:
            type: object
            properties:
              url:
                type: string
              title:
                type: string
                nullable: true
              domain:
                type: string
                nullable: true
              rank:
                type: number
            required:
              - url
              - title
              - domain
              - rank
        language_breakdown:
          type: array
          items:
            type: object
            properties:
              language:
                type: string
              count:
                type: number
            required:
              - language
              - count
        top_language:
          type: string
          nullable: true
        entity_link:
          type: object
          properties:
            entity:
              type: string
              description: >-
                The entity handle AS RESOLVED — the canonical id the scope
                actually used, which is not necessarily the string you sent
                (`entities=` takes the first member; ids are decoded and
                collapsed through the arbiter). Echoed so a caller passing
                several handles can tell which one answered.
            mode:
              type: string
              enum:
                - coverage
              description: >-
                The effective entity-match policy: coverage through Stories
                mentioning or linking the entity.
            via:
              type: string
              enum:
                - story
                - office
              description: >-
                The row qualifies through Story co-occurrence, not an assertion
                that the entity acted in the Event. `office` means it was
                reached through an OFFICE-HOLDER of the `office=` sent; `entity`
                then names the holder.
            role:
              type: string
              nullable: true
            decision:
              type: string
              enum:
                - coverage
            materiality_confidence:
              type: number
              nullable: true
              description: Reserved; null for coverage matching.
            resolution_confidence:
              type: number
              nullable: true
            resolution_method:
              type: string
              nullable: true
            evidence:
              nullable: true
            story_id:
              type: string
              description: >-
                The story that carried the entity — retrieve it at
                `/api/v2/stories/{story_id}` to read the evidence yourself. This
                is the most recent story linking the entity to this event. In
                ~0.2% of cases (measured over 3 production days: 17 of 8,295)
                the story has since been merged away, and that endpoint answers
                `STORY_MERGED` carrying the surviving id.
            story_date:
              type: string
              description: >-
                The story's cluster date, `YYYY-MM-DD`. Pass it as `date=`
                alongside `story_id` — the story endpoints are date-partitioned
                and resolving the date costs an extra lookup without it.
          required:
            - entity
            - mode
            - via
            - role
            - decision
            - materiality_confidence
            - resolution_confidence
            - resolution_method
            - evidence
            - story_date
        search_score:
          type: number
          nullable: true
          description: >-
            Semantic relevance for a `search=` request. NULL when the request
            had no `search=`, and NULL on a `match_type: "name"` hit — a literal
            match has no computed distance. Higher is closer; set your own floor
            rather than assuming one.
        match_type:
          type: string
          enum:
            - semantic
            - name
          description: >-
            How this row was retrieved by `search=`: `semantic` (embedding
            similarity, carries a `search_score`) or `name` (literal match,
            `search_score` is null). Absent entirely on non-search requests.
      required:
        - id
        - url
        - title
        - story_date
        - updated_at
        - processed_at
        - category
        - category_code
        - subcategory
        - geo
        - geo_provenance
        - geo_context
        - metrics
        - has_events
        - has_fatalities
        - has_civilian_targeting
        - fatalities
        - linked_events
        - entity_refs
        - matched_categories
        - top_articles
        - language_breakdown
        - top_language
        - search_score
    EventCard:
      type: object
      properties:
        recorded_at:
          type: string
          description: >-
            First committed availability time for the matching publication;
            present for recorded-interval queries.
        published_at:
          type: string
          description: >-
            Original publication timestamp; present for recorded-interval
            queries.
        id:
          type: string
        url:
          type: string
          nullable: true
        primary_story_url:
          type: string
          nullable: true
        family:
          type: string
          enum:
            - conflict
            - cameoplus
        title:
          type: string
          nullable: true
        title_source:
          type: string
          enum:
            - coder_title
            - cluster_label
            - event_description
            - actor_pair
            - actor
            - sub_event_type
            - event_type_in_location
            - event_type
            - domain_in_location
            - domain
            - fallback
        summary:
          type: string
          nullable: true
        event_date:
          type: string
        observed_at:
          type: string
          nullable: true
        event_date_basis:
          type: string
          enum:
            - explicit_date
            - relative_date
            - publication_day_inference
            - ongoing_event_update
          nullable: true
        event_date_evidence:
          type: string
          nullable: true
        coded_at:
          type: string
          nullable: true
        updated_at:
          type: string
          nullable: true
        processed_at:
          type: string
          nullable: true
        category:
          type: string
          nullable: true
        subcategory:
          type: string
          nullable: true
          description: >-
            Taxonomy subcategory IDENTIFIER — a CAMEO+ code (e.g. "EC04", "042")
            or, for the conflict family, the ACLED sub-event type (e.g.
            "Peaceful protest"). This is exactly what the `subcategory` filter
            accepts. For the human-readable name, read `subcategory_label`.
        subcategory_label:
          type: string
          nullable: true
          description: >-
            Human-readable name for `subcategory` (e.g. "Trade Policy Action").
            NULL when the code is not one the taxonomy declares — see
            `taxonomy_status`. Not a filter value; filter on `subcategory`.
        event_description:
          type: string
          nullable: true
          description: >-
            The coder's free-text description of this specific event (e.g.
            "Landslide"), usually more specific than `subcategory_label`, which
            names the CODE. CAMEO+ only; NULL for the conflict family. Free text
            — not stable, not a filter value, and not safe to group by: group on
            `subcategory`.
        taxonomy_status:
          type: string
          enum:
            - coded
            - detail_missing
            - undeclared_code
        domain:
          type: string
          nullable: true
        event_code:
          type: string
          nullable: true
        geo:
          type: object
          properties:
            country:
              type: string
              nullable: true
            region:
              type: string
              nullable: true
            continent:
              type: string
              nullable: true
            admin1:
              type: string
              nullable: true
            location:
              type: string
              nullable: true
            latitude:
              type: number
              nullable: true
            longitude:
              type: number
              nullable: true
            geo_precision:
              type: number
              nullable: true
            geo_precision_label:
              type: string
              nullable: true
          required:
            - country
            - region
            - continent
            - admin1
            - location
            - latitude
            - longitude
            - geo_precision
            - geo_precision_label
        geo_context:
          type: object
          properties:
            location_country:
              type: string
              nullable: true
            actor_origin_countries:
              type: array
              items:
                type: string
          required:
            - location_country
            - actor_origin_countries
        actors:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              country:
                type: string
                nullable: true
              role:
                type: string
                enum:
                  - source
                  - target
                  - actor1
                  - actor2
                description: >-
                  The part this actor played. CAMEO+ events are directed:
                  `source` acted, `target` was acted upon. Conflict (ACLED)
                  events are undirected and use `actor1`/`actor2`, which imply
                  no initiator. The two pairs never mix on one card — `family`
                  determines which you get.
              primary:
                type: boolean
                description: >-
                  True for the coder's PRIMARY actor in this role — the one
                  entity the event is chiefly about on that side, and the one
                  carried in the `source_actor` / `target_actor` columns and
                  filters. False for a co-actor: another entity in the same role
                  in the same action. `actors[]` is ordered primaries-first, and
                  there is at most one `primary: true` per role.
            required:
              - name
              - country
              - role
              - primary
        metrics:
          type: object
          properties:
            significance:
              type: number
            severity_tier:
              type: string
            goldstein_scale:
              type: number
              nullable: true
              description: >-
                Goldstein conflict-cooperation scale, -10 to +10. NULL is
                DETERMINISTIC, not sparse coverage: it is populated for CAMEO+
                POLITICAL events and for every conflict (ACLED) event, and is
                NULL for the other nine CAMEO+ domains because Goldstein is not
                defined there. Measured on one production day that is 100% /
                100% / 0%, i.e. ~42% of all events — complete wherever the scale
                means anything.
            magnitude:
              type: number
              nullable: true
            systemic_importance:
              type: number
              nullable: true
            propagation_potential:
              type: number
              nullable: true
            market_sensitivity:
              type: number
              nullable: true
            confidence:
              type: number
              nullable: true
            article_count:
              type: number
              nullable: true
              description: >-
                Canonical Story article count. NULL when the Event has no
                canonical Story measurement; never fabricated from source URL
                count.
            evidence_source_count:
              type: number
              description: Distinct source URLs attached directly to the Event evidence.
            supporting_story_count:
              type: number
              description: Number of canonical Story references attached to the Event.
            metric_inputs:
              description: >-
                The EVIDENCE BEHIND THE SCORES — for each metric, the sub-factor
                values the coder read off the article and the reason it gave for
                each, keyed by metric. This is what makes a metric auditable
                rather than something to trust: the published formula turns
                these inputs into the served value, so you can recompute it
                yourself. Shape is `{<metric>: {<sub_factor>: value, why:
                "…"}}`. Present on most CAMEO+ events; OMITTED where no
                sub-factor evidence was recorded, which is not the same as none
                existing — events coded before the field was stored carry
                nothing, and a backfill has not run. Sub-factor definitions and
                the formulas: https://docs.gdeltcloud.com/reference/metrics
            metric_version:
              type: string
          required:
            - significance
            - severity_tier
            - goldstein_scale
            - magnitude
            - systemic_importance
            - propagation_potential
            - market_sensitivity
            - confidence
            - article_count
            - evidence_source_count
            - supporting_story_count
        has_fatalities:
          type: boolean
          nullable: true
        fatalities:
          type: number
          nullable: true
        fatalities_basis:
          type: string
          enum:
            - reported_exact
            - reported_minimum
            - reported_range
            - estimated
            - none_reported
          nullable: true
        fatalities_corroboration:
          type: string
          enum:
            - multi_source_independent
            - single_source
            - party_to_conflict_claim
            - contested
            - none_reported
          nullable: true
        fatalities_evidence:
          type: string
          nullable: true
        fatalities_supporting_source_count:
          type: number
          nullable: true
        injured:
          type: number
          nullable: true
        civilians_killed:
          type: number
          nullable: true
        civilians_injured:
          type: number
          nullable: true
        civilian_targeting:
          type: boolean
          nullable: true
        civilian_targeting_label:
          type: string
          nullable: true
        story_refs:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              url:
                type: string
                nullable: true
              title:
                type: string
                nullable: true
              story_date:
                type: string
                nullable: true
              article_count:
                type: number
            required:
              - id
              - url
              - title
              - story_date
              - article_count
        entity_refs:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              public_official:
                type: object
                properties:
                  checked:
                    type: boolean
                    description: >-
                      False when office evidence or canonical identity could not
                      be checked.
                  is_public_official:
                    type: boolean
                    nullable: true
                    description: >-
                      Published office evidence exists. Null means unavailable,
                      not a negative finding.
                  status:
                    type: string
                    enum:
                      - current
                      - former
                      - unknown
                    nullable: true
                    description: >-
                      Publisher status across recorded terms. Former requires
                      all terms to be explicitly ended; missing dates never
                      infer status.
                  total:
                    type: number
                    nullable: true
                    description: >-
                      Distinct recorded offices, independent of the bounded
                      preview.
                  offices:
                    type: array
                    items:
                      type: object
                      properties:
                        office_id:
                          type: string
                        name:
                          type: string
                        country_iso3:
                          type: string
                          nullable: true
                          description: Office jurisdiction, not citizenship.
                        status:
                          type: string
                          enum:
                            - current
                            - ended
                            - unknown
                        start_date:
                          type: string
                          nullable: true
                        end_date:
                          type: string
                          nullable: true
                        evidence_date:
                          type: string
                          nullable: true
                        sources:
                          type: array
                          items:
                            type: object
                            properties:
                              source_key:
                                type: string
                              url:
                                type: string
                                nullable: true
                            required:
                              - source_key
                              - url
                      required:
                        - office_id
                        - name
                        - country_iso3
                        - status
                        - start_date
                        - end_date
                        - evidence_date
                        - sources
                  truncated:
                    type: boolean
                required:
                  - checked
                  - is_public_official
                  - status
                  - total
                  - offices
                  - truncated
            required:
              - id
              - name
        top_articles:
          type: array
          items:
            type: object
            properties:
              url:
                type: string
              title:
                type: string
                nullable: true
              domain:
                type: string
                nullable: true
              domain_avatar_url:
                type: string
                nullable: true
              rank:
                type: number
            required:
              - url
              - title
              - domain
              - domain_avatar_url
              - rank
        language_breakdown:
          type: array
          items:
            type: object
            properties:
              language:
                type: string
              count:
                type: number
            required:
              - language
              - count
        top_language:
          type: string
          nullable: true
        story_date:
          type: string
        search_score:
          type: number
          nullable: true
          description: >-
            Semantic relevance for a `search=` request. NULL when the request
            had no `search=`, and NULL on a `match_type: "name"` hit — a literal
            match has no computed distance. Higher is closer; set your own floor
            rather than assuming one.
        match_type:
          type: string
          enum:
            - semantic
            - name
          description: >-
            How this row was retrieved by `search=`: `semantic` (embedding
            similarity, carries a `search_score`) or `name` (literal match,
            `search_score` is null). Absent entirely on non-search requests.
        entity_link:
          type: object
          properties:
            entity:
              type: string
              description: >-
                The entity handle AS RESOLVED — the canonical id the scope
                actually used, which is not necessarily the string you sent
                (`entities=` takes the first member; ids are decoded and
                collapsed through the arbiter). Echoed so a caller passing
                several handles can tell which one answered.
            mode:
              type: string
              enum:
                - coverage
              description: >-
                The effective entity-match policy: coverage through Stories
                mentioning or linking the entity.
            via:
              type: string
              enum:
                - story
                - office
              description: >-
                The row qualifies through Story co-occurrence, not an assertion
                that the entity acted in the Event. `office` means it was
                reached through an OFFICE-HOLDER of the `office=` sent; `entity`
                then names the holder.
            role:
              type: string
              nullable: true
            decision:
              type: string
              enum:
                - coverage
            materiality_confidence:
              type: number
              nullable: true
              description: Reserved; null for coverage matching.
            resolution_confidence:
              type: number
              nullable: true
            resolution_method:
              type: string
              nullable: true
            evidence:
              nullable: true
            story_id:
              type: string
              description: >-
                The story that carried the entity — retrieve it at
                `/api/v2/stories/{story_id}` to read the evidence yourself. This
                is the most recent story linking the entity to this event. In
                ~0.2% of cases (measured over 3 production days: 17 of 8,295)
                the story has since been merged away, and that endpoint answers
                `STORY_MERGED` carrying the surviving id.
            story_date:
              type: string
              description: >-
                The story's cluster date, `YYYY-MM-DD`. Pass it as `date=`
                alongside `story_id` — the story endpoints are date-partitioned
                and resolving the date costs an extra lookup without it.
          required:
            - entity
            - mode
            - via
            - role
            - decision
            - materiality_confidence
            - resolution_confidence
            - resolution_method
            - evidence
            - story_date
        incident:
          type: object
          properties:
            uid:
              type: string
              description: >-
                The incident key. Group or `uniqExact` on this instead of
                `event_uid` to count INCIDENTS rather than coded stories. Equal
                to `event_uid` unless a judge confirmed this event duplicates
                another, in which case it is the surviving event of the group.
                ALWAYS read `resolution` before trusting it: on an
                `unadjudicated` row this value is a fallback, not a verdict.
            resolution:
              type: string
              enum:
                - unadjudicated
                - self
                - llm
              description: >-
                How `uid` was decided. `unadjudicated` — this event was never
                compared to anything, and `uid` defaults to `event_uid`. `self`
                — compared and found unique. `llm` — an independent adversarial
                judge confirmed a duplicate and `uid` names the survivor.
                Coverage is deliberately partial and visible: only events that
                were candidates for a duplicate are ever adjudicated.
            confidence:
              type: number
              nullable: true
              description: >-
                The judge's confidence in the merge, 0–1, and NULL unless
                `resolution` is `llm`. For a group of three or more this is the
                WEAKEST link that holds the group together, not the average — a
                group joined transitively is only as good as its worst edge.
          required:
            - uid
            - resolution
            - confidence
      required:
        - id
        - url
        - primary_story_url
        - family
        - title
        - title_source
        - summary
        - event_date
        - observed_at
        - event_date_basis
        - event_date_evidence
        - coded_at
        - updated_at
        - processed_at
        - category
        - subcategory
        - subcategory_label
        - event_description
        - taxonomy_status
        - domain
        - event_code
        - geo
        - geo_context
        - actors
        - metrics
        - has_fatalities
        - fatalities
        - fatalities_basis
        - fatalities_corroboration
        - fatalities_evidence
        - fatalities_supporting_source_count
        - injured
        - civilians_killed
        - civilians_injured
        - civilian_targeting
        - civilian_targeting_label
        - story_refs
        - entity_refs
        - top_articles
        - language_breakdown
        - top_language
        - search_score
        - incident
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: gdelt_sk_...
      description: 'GDELT Cloud API key. Send as `Authorization: Bearer gdelt_sk_...`.'

````