Monitor workflow · Developer

Signed webhook application

Receive a durable signal when new disruption coverage appears near a Red Sea operating area, then hydrate application state with complete API results.

The webhook contains at most ten representative matches; the run replay request retrieves the complete result with QU. Verify the signature over timestamp plus raw bytes before parsing, enforce the five-minute replay window, and deduplicate event IDs. localhost HTTP is allowed only behind the local development flag; production destinations must be public HTTPS. Use custom QU-backed polling only when the deliberately constrained Monitor builder cannot express the recurring logic. volume_spike is deferred; the trigger is new_matches.

POST /api/v2/monitors  # specification 1 of 1
{
  "name": "Red Sea operating-area disruption",
  "description": "Signed webhook intake for new shipping disruption coverage near the southern Red Sea.",
  "subject": {
    "type": "place",
    "latitude": 15,
    "longitude": 42,
    "radius_km": 250
  },
  "criteria": {
    "data": "events_and_stories",
    "search": "port closure, vessel attack, shipping disruption",
    "countries": [],
    "family_filters": {
      "cameoplus": {
        "domains": [
          "ECONOMIC",
          "INFRASTRUCTURE"
        ],
        "subcategories": []
      },
      "conflict": {
        "categories": [
          "Explosions/Remote violence",
          "Strategic developments"
        ],
        "subcategories": []
      },
      "story": {
        "categories": [
          "cameoplus_infrastructure",
          "conflict_security"
        ]
      }
    },
    "fatalities_only": false,
    "collapse_duplicates": true
  },
  "trigger": {
    "type": "new_matches"
  },
  "schedule": {
    "cadence": "hourly",
    "timezone": "UTC",
    "daily_hour": 8
  },
  "delivery": {
    "email": false,
    "webhook_url": "http://127.0.0.1:8787/webhooks/gdelt"
  }
}

Expected notification result

Email summarizes the same run. Signed webhooks use this typed Constitution fixture; total, included, and truncation are explicit.

[
  {
    "name": "test",
    "payload": {
      "schema_version": "1",
      "id": "evt_demo_test_001",
      "type": "monitor.test",
      "created_at": "2026-08-24T12:00:00.000Z",
      "monitor": {
        "id": "mon_demo_test",
        "name": "Webhook setup test"
      },
      "run": null,
      "trigger": null,
      "data": {
        "matches": []
      },
      "test": {
        "status": "ok",
        "message": "GDELT Cloud Monitor webhook test"
      },
      "links": {
        "monitor": "https://gdeltcloud.com/monitors/mon_demo_test",
        "run": null,
        "matches": null
      }
    }
  },
  {
    "name": "mixed",
    "payload": {
      "schema_version": "1",
      "id": "evt_demo_mixed_001",
      "type": "monitor.triggered",
      "created_at": "2026-08-24T12:00:00.000Z",
      "monitor": {
        "id": "mon_demo_region",
        "name": "Regional risk watch"
      },
      "run": {
        "id": "run_demo_mixed_001",
        "scheduled_for": "2026-08-24T12:00:00.000Z",
        "window_start": "2026-08-24T11:00:00.000Z",
        "window_end": "2026-08-24T12:00:00.000Z",
        "cadence": "hourly"
      },
      "trigger": {
        "type": "new_matches",
        "total_matches": 2,
        "included_matches": 2,
        "truncated": false,
        "next_cursor": "eyJvIjowfQ"
      },
      "data": {
        "matches": [
          {
            "kind": "event",
            "family": "cameoplus",
            "item": {
              "id": "cameoplus:demo-event-003",
              "url": null,
              "primary_story_url": null,
              "family": "cameoplus",
              "title": "Regulator opens a formal inquiry",
              "title_source": "coder_title",
              "summary": null,
              "event_date": "2026-08-24",
              "observed_at": null,
              "event_date_basis": "publication_day_inference",
              "event_date_evidence": null,
              "coded_at": "2026-08-24T11:00:00.000Z",
              "updated_at": "2026-08-24T11:00:00.000Z",
              "processed_at": "2026-08-24T11:00:00.000Z",
              "category": "Legal and regulatory",
              "subcategory": "LR01",
              "subcategory_label": "Regulatory Action",
              "taxonomy_status": "coded",
              "domain": "LEGAL",
              "event_code": "LR01",
              "geo": {
                "country": "Singapore",
                "region": "South-eastern Asia",
                "continent": "Asia",
                "admin1": null,
                "location": "Singapore",
                "latitude": 1.3521,
                "longitude": 103.8198,
                "geo_precision": 1,
                "geo_precision_label": "city"
              },
              "geo_context": {
                "location_country": "Singapore",
                "actor_origin_countries": [
                  "Singapore"
                ]
              },
              "actors": [
                {
                  "name": "Regulator",
                  "country": "Singapore",
                  "role": "source",
                  "primary": true
                },
                {
                  "name": "Operator",
                  "country": null,
                  "role": "target",
                  "primary": true
                }
              ],
              "metrics": {
                "significance": 0.66,
                "severity_tier": "moderate",
                "goldstein_scale": null,
                "magnitude": 0.5,
                "systemic_importance": 0.59,
                "propagation_potential": 0.46,
                "market_sensitivity": 0.63,
                "confidence": 0.9,
                "article_count": 3,
                "evidence_source_count": 2,
                "supporting_story_count": 1
              },
              "has_fatalities": null,
              "fatalities": null,
              "fatalities_basis": null,
              "fatalities_corroboration": null,
              "fatalities_evidence": null,
              "fatalities_supporting_source_count": null,
              "injured": null,
              "civilians_killed": null,
              "civilians_injured": null,
              "civilian_targeting": null,
              "civilian_targeting_label": null,
              "story_refs": [],
              "entity_refs": [],
              "top_articles": [],
              "language_breakdown": [],
              "top_language": null,
              "search_score": null,
              "incident": {
                "uid": "cameoplus:demo-event-003",
                "resolution": "unadjudicated",
                "confidence": null
              }
            }
          },
          {
            "kind": "story",
            "item": {
              "id": "story-demo-003",
              "url": null,
              "title": "Industry groups respond to inquiry",
              "story_date": "2026-08-24",
              "updated_at": "2026-08-24T11:10:00.000Z",
              "processed_at": "2026-08-24T11:10:00.000Z",
              "category": "Economy and business",
              "category_code": "economy_business",
              "subcategory": null,
              "geo": {
                "country": "Singapore",
                "region": "South-eastern Asia",
                "continent": "Asia",
                "admin1": null,
                "location": "Singapore",
                "latitude": 1.3521,
                "longitude": 103.8198,
                "geo_precision": 1,
                "geo_precision_label": "city"
              },
              "geo_provenance": null,
              "geo_context": {
                "location_country": "Singapore",
                "actor_origin_countries": [
                  "Singapore"
                ]
              },
              "metrics": {
                "significance": 0.51,
                "article_count": 5,
                "linked_event_count": 1,
                "max_linked_event_significance": 0.66,
                "civilian_targeting_event_count": 0
              },
              "has_events": true,
              "has_fatalities": null,
              "has_civilian_targeting": false,
              "fatalities": null,
              "linked_events": [
                {
                  "id": "cameoplus:demo-event-003",
                  "title": "Regulator opens a formal inquiry"
                }
              ],
              "entity_refs": [],
              "matched_categories": [
                {
                  "code": "LEGAL",
                  "label": "Legal and regulatory"
                }
              ],
              "top_articles": [],
              "language_breakdown": [],
              "top_language": null,
              "search_score": null
            }
          }
        ]
      },
      "links": {
        "monitor": "https://gdeltcloud.com/monitors/mon_demo_region",
        "run": "https://gdeltcloud.com/monitors/mon_demo_region/runs/run_demo_mixed_001",
        "matches": "https://gdeltcloud.com/api/v2/monitors/mon_demo_region/runs/run_demo_mixed_001/matches"
      }
    }
  },
  {
    "name": "truncated",
    "payload": {
      "schema_version": "1",
      "id": "evt_demo_truncated_001",
      "type": "monitor.triggered",
      "created_at": "2026-08-24T12:00:00.000Z",
      "monitor": {
        "id": "mon_demo_high_volume",
        "name": "High-volume country watch"
      },
      "run": {
        "id": "run_demo_truncated_001",
        "scheduled_for": "2026-08-24T12:00:00.000Z",
        "window_start": "2026-08-24T11:00:00.000Z",
        "window_end": "2026-08-24T12:00:00.000Z",
        "cadence": "hourly"
      },
      "trigger": {
        "type": "new_matches",
        "total_matches": 37,
        "included_matches": 1,
        "truncated": true,
        "next_cursor": "eyJvIjowfQ"
      },
      "data": {
        "matches": [
          {
            "kind": "story",
            "item": {
              "id": "story-demo-truncated",
              "url": null,
              "title": "Representative result from a larger run",
              "story_date": "2026-08-24",
              "updated_at": null,
              "processed_at": null,
              "category": null,
              "category_code": null,
              "subcategory": null,
              "geo": {
                "country": "Brazil",
                "region": "South America",
                "continent": "South America",
                "admin1": null,
                "location": null,
                "latitude": null,
                "longitude": null,
                "geo_precision": null,
                "geo_precision_label": null
              },
              "geo_provenance": null,
              "geo_context": {
                "location_country": "Brazil",
                "actor_origin_countries": []
              },
              "metrics": {
                "significance": 0.42,
                "article_count": 2,
                "linked_event_count": 0,
                "max_linked_event_significance": 0,
                "civilian_targeting_event_count": 0
              },
              "has_events": false,
              "has_fatalities": null,
              "has_civilian_targeting": false,
              "fatalities": null,
              "linked_events": [],
              "entity_refs": [],
              "matched_categories": [],
              "top_articles": [],
              "language_breakdown": [],
              "top_language": null,
              "search_score": null
            }
          }
        ]
      },
      "links": {
        "monitor": "https://gdeltcloud.com/monitors/mon_demo_high_volume",
        "run": "https://gdeltcloud.com/monitors/mon_demo_high_volume/runs/run_demo_truncated_001",
        "matches": "https://gdeltcloud.com/api/v2/monitors/mon_demo_high_volume/runs/run_demo_truncated_001/matches"
      }
    }
  }
]

The stored Monitor specification

All three views use this same public API object.

{
  "name": "Red Sea operating-area disruption",
  "description": "Signed webhook intake for new shipping disruption coverage near the southern Red Sea.",
  "subject": {
    "type": "place",
    "latitude": 15,
    "longitude": 42,
    "radius_km": 250
  },
  "criteria": {
    "data": "events_and_stories",
    "search": "port closure, vessel attack, shipping disruption",
    "countries": [],
    "family_filters": {
      "cameoplus": {
        "domains": [
          "ECONOMIC",
          "INFRASTRUCTURE"
        ],
        "subcategories": []
      },
      "conflict": {
        "categories": [
          "Explosions/Remote violence",
          "Strategic developments"
        ],
        "subcategories": []
      },
      "story": {
        "categories": [
          "cameoplus_infrastructure",
          "conflict_security"
        ]
      }
    },
    "fatalities_only": false,
    "collapse_duplicates": true
  },
  "trigger": {
    "type": "new_matches"
  },
  "schedule": {
    "cadence": "hourly",
    "timezone": "UTC",
    "daily_hour": 8
  },
  "delivery": {
    "email": false,
    "webhook_url": "http://127.0.0.1:8787/webhooks/gdelt"
  }
}

After the notification

Scheduled checks cost 0 QU. Investigation and application calls use QU.

Persist X-GDELT-Event-Id with the application side effect so retries are idempotent.

Execute the run replay_requests for the complete Event/Story result window.

Use custom recurring QU polling only for unsupported multi-endpoint logic, custom state, or custom schedules.