Earthquake Data Platform

API Documentation & Architecture Reference

Architecture Overview

The Earthquake Data Platform is built on AWS serverless architecture, providing scalable earthquake data ingestion, querying, and analytics.

System Architecture

Query Flow Sequence

Database Schema

The platform uses a single DynamoDB table with composite keys, a time-ordered GSI, and TTL-driven log retention. The schema below captures every attribute, key pattern, and access strategy referenced by our ingestion and query services.

Visual Schema

Single-table design with GSI and access patterns

Table Configuration

Physical layout

Table Name
earthquake-events
Billing Mode
On-demand (PAY_PER_REQUEST)
Region
us-east-1 (LocalStack / AWS)
Primary Key
pk (partition key), sk (sort key)
Entities
Earthquake events, request logs
TTL Attribute
ttl (epoch seconds)

TimeOrderedIndex

Global secondary index

Index Name
TimeOrderedIndex
Purpose
Query events by day bucket
Partition Key
gsi1pk (DAY#YYYYMMDD)
Sort Key
gsi1sk (eventTsMs)
Projection
ALL attributes

Earthquake Event Entity

Immutable seismic event records

Attributes

FieldTypeRequirementNotes
pkStringRequiredEVENT#<usgsEventId> composite identifier
skStringRequiredLiteral EVENT for scoped queries
entityStringRequiredAlways EVENT for type guards
eventIdStringRequiredUSGS event identifier (<= 64 chars)
eventTsMsNumberRequiredEvent timestamp (epoch ms)
magNumberRequiredMagnitude clamped to -2.0 .. 10.0
placeStringRequiredHuman-readable location (<= 512 chars)
latNumberRequiredLatitude -90 .. 90
lonNumberRequiredLongitude -180 .. 180
depthNumber | nullOptionalDepth in km (non-negative)
dayBucketStringRequiredYYYYMMDD derived from eventTsMs
gsi1pkStringRequiredDAY#<dayBucket> partition for GSI
gsi1skNumberRequiredeventTsMs reused as GSI sort key
sourceStringRequiredData source (USGS)
ingestedAtNumberRequiredIngestion timestamp (epoch ms)

Request Log Entity

Operational telemetry for ingestion/query endpoints

Attributes

FieldTypeRequirementNotes
pkStringRequiredLOG#<YYYYMMDD> day bucket
skStringRequired<epochMs>#<requestId> composite sorter
entityStringRequiredAlways LOG
logTypeStringRequiredINGEST or QUERY
requestIdStringRequiredUUID v4 for traceability
timestampNumberRequiredRequest start time (epoch ms)
routeStringRequiredAPI path (/ingest/recent, /earthquakes, etc.)
statusNumberRequiredHTTP status code (200-599)
latencyMsNumberRequiredEnd-to-end latency
fetchedNumberOptionalEvents fetched from upstream (INGEST)
upsertedNumberOptionalEvents inserted (INGEST)
skippedNumberOptionalDuplicates filtered (INGEST)
retriesNumberOptionalRetry attempts
upstreamSizeNumberOptionalUSGS payload size in bytes
upstreamHashStringOptionalSHA-256 fingerprint of upstream payload
starttimeNumberOptionalQuery parameter, epoch ms
endtimeNumberOptionalQuery parameter, epoch ms
minmagnitudeNumberOptionalQuery parameter, magnitude floor
pageSizeNumberOptionalPage size used for query
resultCountNumberOptionalReturned items for the page
hasNextTokenBooleanOptionalIndicates paginated response
bucketsScannedNumberOptionalDay buckets traversed during query
errorStringOptionalStable error code for failures
ttlNumberRequiredExpiration timestamp (now + 7 days)

Canonical Access Patterns

How services interact with the table

Insert Event (Idempotent)

PutItem with condition attribute_not_exists(pk) to prevent duplicates during ingestion.

Query Events by Day

Query TimeOrderedIndex with gsi1pk = DAY#YYYYMMDD and gsi1sk BETWEEN bounds; filter on magnitude if needed.

Insert Request Log

Unconditional PutItem scoped by LOG#YYYYMMDD partition; ttl controls retention.

Query Request Logs

Query base table where pk = LOG#YYYYMMDD to inspect ingestion or query activity.

API Reference

Interactive documentation for all API endpoints

Loading API Documentation...