# Civic Telemetry Spine — United States and India (`civicdataforge/civic-telemetry-spine`) Actor

Current official U.S. weather, earthquake and water telemetry plus India's SACHET public-safety alerts, normalized into one provenance-bound schema with freshness, source-rights, change and run receipts.

- **URL**: https://apify.com/civicdataforge/civic-telemetry-spine.md
- **Developed by:** [Bryan](https://apify.com/civicdataforge) (community)
- **Categories:** Automation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Civic Telemetry Spine

One run acquires current telemetry from official United States and India publications, normalizes every observation into one stable schema, and emits cryptographic source, rights, freshness, change, and run receipts.

### Official sources

| Source | Scope | Reuse basis |
| --- | --- | --- |
| NOAA/NWS active alerts | Selected U.S. state/territory area codes | NWS open data; free lawful use; attribution preserved |
| USGS earthquake GeoJSON | Global events in the selected rolling window | USGS-produced data is U.S. public-domain material |
| USGS latest continuous water | Selected U.S. state and parameter codes | USGS Water Data API public-domain government observations |
| NDMA SACHET CAP alerts | Pan-India alerts from IMD, CWC and state/territory disaster authorities | The official SACHET portal invites external agencies to consume and further disseminate its public alerts; source authority and language are preserved |

The Actor does not scrape login walls, solve CAPTCHAs, ingest restricted feeds, or claim ownership of publisher data. Each row identifies its publisher, source record, observed/published clocks, attribution, raw fingerprint, rights receipt and normalized-record receipt. Provisional USGS values stay provisional; SACHET alert language, dissemination state and issuing authority stay explicit. IMD's direct API is not used because it requires network whitelisting from this runtime; current IMD and CWC alerts arrive through the official NDMA SACHET aggregation route.

### Freshness and change safety

- Source and publisher clocks are separate.
- A complete scope may advance its stored baseline and report appeared, changed and disappeared records.
- A user-bounded result is explicitly quarantined from disappearance comparisons, preventing a row limit from masquerading as a real-world deletion.
- NWS feeds can validly return zero active alerts; that is a complete, meaningful result.

### Example input

```json
{
  "sources": ["nws_alerts", "usgs_earthquakes", "usgs_water", "india_sachet_alerts"],
  "weatherAreas": ["FL"],
  "waterStateCodes": ["12"],
  "waterParameterCodes": ["00060", "00065"],
  "earthquakeWindow": "day",
  "minMagnitude": 1,
  "maxRecordsPerSource": 1000,
  "snapshot": true
}
```

### Outputs

- Default dataset: normalized telemetry rows.
- `SOURCE-MANIFEST`: exact URLs, response hashes, publisher clocks, completeness and rights receipts.
- `CHANGE-RECEIPT`: baseline/change result and any bounded-scope quarantine.
- `RUN-RECEIPT`: counts plus hashes binding the run to both receipts.

Telemetry is evidence, not a safety, legality, causation or prediction verdict.

# Actor input Schema

## `sources` (type: `array`):

Official feeds to retrieve.

## `weatherAreas` (type: `array`):

One to ten two-letter U.S. state or territory area codes.

## `waterStateCodes` (type: `array`):

One to ten two-digit ANSI/FIPS state codes; Florida is 12.

## `waterParameterCodes` (type: `array`):

One to ten five-digit USGS parameter codes; defaults are discharge and gage height.

## `earthquakeWindow` (type: `string`):

Rolling official USGS feed window used for global earthquake observations.

## `minMagnitude` (type: `number`):

Discard earthquake observations below this magnitude after retrieving the selected official feed.

## `maxRecordsPerSource` (type: `integer`):

Hard per-source output bound. Bounded scopes never advance disappearance-monitoring baselines.

## `snapshot` (type: `boolean`):

Persist complete source snapshots and emit appeared, changed and disappeared receipts.

## Actor input object example

```json
{
  "sources": [
    "nws_alerts",
    "usgs_earthquakes",
    "usgs_water",
    "india_sachet_alerts"
  ],
  "weatherAreas": [
    "FL"
  ],
  "waterStateCodes": [
    "12"
  ],
  "waterParameterCodes": [
    "00060",
    "00065"
  ],
  "earthquakeWindow": "day",
  "minMagnitude": 0,
  "maxRecordsPerSource": 1000,
  "snapshot": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `sourceManifest` (type: `string`):

No description

## `changeReceipt` (type: `string`):

No description

## `runReceipt` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("civicdataforge/civic-telemetry-spine").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("civicdataforge/civic-telemetry-spine").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call civicdataforge/civic-telemetry-spine --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,civicdataforge/civic-telemetry-spine"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vaZpBQLhRXQUfdUb1/builds/mGBo1ysUucJ2Y1815/openapi.json
