# azsh.uk — GDELT + Japanese Market + Laws Data Service > Machine-readable curated GDELT world events (15-minute, lane/topic classified), Japanese market data (15m/daily/quarterly), and Japanese laws/regulations (bill pool with LLM-extracted rationale). No API key for GDELT, laws, and market DERIVED statistics (baskets/returns/flows); raw market OHLCV is key-gated (license — see the Market access section below and /data/index.json access.gate_rationale). CORS *. HTTP Range + ETag/304 supported. Read /data/index.json first for the full self-describing index. ## How to consume (for AI agents) - Do NOT parse https://azsh.uk/ for content — it is a JavaScript SPA shell (empty
). Fetch the data files directly. - Start here: fetch /data/index.json (self-describing master index with schemas, URL patterns, freshness). - All data files are plain Parquet/JSON under /data/... — anonymous for GDELT/laws/derived-stats (raw market OHLCV needs an API key — see below), CORS *, HTTP Range OK. If you cannot reach / (e.g. a bot-management challenge on the HTML page), the /data/* file endpoints are the access path. ## Periodic polling (recommended procedure for recurring agents) 1. GET https://azsh.uk/status.json (<1 KB) — freshness of all datasets + pipeline health + anomaly flags. If nothing is stale and anomaly.flags is empty, you are done. 2. GET https://azsh.uk/signals.json — cross-domain signals (GDELT x market x laws) with analysis axes. Each signal has suggested_queries: the exact endpoints to fetch for the actual analysis. 3. If GDELT changed: GET /data/gdelt/events?since= for new batches, or /v1/query for aggregates. Send If-None-Match with the previous ETag to get 304 when unchanged. 4. If a signal is interesting: follow its suggested_queries, then form your own analysis. This service presents signals + analysis axes; the actual analysis is yours. - All /data/* endpoints support ETag/304. Polling without changes costs a few bytes. ## Signal detection (cross-domain analysis axes) - /signals.json — every 15 min: GDELT country/topic/lane surges (7d baseline), volume spikes, tone drops, JPX17 sector movers, laws pool updates, and cross-domain geo-market compounds. (A deeper daily cross-domain report with CAMEO action-type backing is at /data/laws/signals/daily/YYYYMMDD.json, daily 06:30 UTC.) - Each signal: {type, domain, severity, key, desc, suggested_queries[]}. severity: high|medium|low. - Cross-domain signals (e.g. cross_geo_market) flag where GDELT surges coincide with market moves — correlation, not causation; confirm with your own analysis. - /status.json.anomaly — hourly Z-score anomaly (event volume spike, tone drop) with baseline stats. ## Time-series query (server-side aggregation, <=64 KB responses) - GET https://azsh.uk/v1/query?from=YYYYMMDD&to=YYYYMMDD&agg=timeline&bucket=1h — event volume/tone per hour (or 1d) - GET /v1/query?agg=top_events&lane=main&actor1=US&max_rows=20 — top events with SOURCEURL + Page_Title (original article links) - GET /v1/query?agg=groupby_country | groupby_lane | groupby_topic — distributions - Filters: lane (main|JP|TCK), topic (economy|diplomacy|military|energy|industry|japan_economy|other), actor1/actor2 (ISO country), q (text on title/desc/actors) - Free tier: max 7-day range. Full 13-month history is parquet (/data/gdelt/parquet/). ## Japanese laws (pre-legislation government intent) - Bill/regulation pool with LLM-extracted rationale (why the government is acting, target sector/JSIC): https://azsh.uk/data/laws/laws/laws_meta.parquet (pool size: https://azsh.uk/data/laws/_manifests/laws_meta.json — DuckDB: SELECT * FROM 'https://azsh.uk/data/laws/laws/laws_meta.parquet') - CAMEO-coded law analysis: https://azsh.uk/data/laws/analysis/laws_cameo_summary.json - **As-Of query** (which pool laws were in force on a date): https://azsh.uk/data/laws/asof?date=YYYYMMDD§or=FINANCE_FINTECH — SCD2 有効期間から時点再現 (valid_from<=date&from=YYYY-MM-DD&until=YYYY-MM-DD&recordPacking=json (full text since 1947, 100 records/req, no CORS — proxy if needed; meeting list: /api/meeting, full meeting text: /api/meeting_list) ## Analysis foundation (frozen market + GDELT + laws — reproducible research layer) - **Period brief (start here for "what happened in [D1,D2]")**: GET https://azsh.uk/data/analysis/manifest?from=YYYYMMDD&to=YYYYMMDD (compact, <32 KB — data versions + per-file sha256 + caveats) → then per-day L0 summaries https://azsh.uk/data/analysis/{YYYYMMDD}.json (~2 KB each, anonymous). Full file list + sha256: &full=1. - **Universe (public, no prices)**: https://azsh.uk/data/analysis/universe.json — ticker + name + sector17 + has_daily/has_15m flags (~3.9k tickers) for selectors. - **Analysis recipes (deterministic procedures, versioned)**: https://azsh.uk/recipes (JSON index with recipe_version) — /recipes/news-market-reaction.md (event-study: event_session, ret_*, ar_*, date-cluster tests), /recipes/period-brief.md (standard [D1,D2] review), /recipes/law-market-impact.md (law event window study), /recipes/chart-analysis.md (shared chart reference: same payload sha256 + through). - **Charts (shared reference point, key required — per-ticker OHLCV)**: https://azsh.uk/api/market/chart?symbol=7203.T&resolution=1d (15m also; from/to slicing; through= pins the exact payload version — same through = same sha256 = same payload). 404 no_chart = not charted; 503 not_ready = backend pending. Human-facing page: https://azsh.uk/chart (fixture demo without a key). - Provenance: **observed** (frozen at observation time — preferred) vs **backfilled** ("today's view" — yfinance retroactive adjustments). L0 is published same-day; the cross-domain (reactions) block completes ~3 days later. Record manifest hash + recipe_version + code git hash with every analysis. ## Machine Index - https://azsh.uk/data/index.json — self-describing master index (schemas, URL patterns, freshness, caveats). **Read this first.** - https://azsh.uk/ai/docs.md — data dictionary for AI agents (column semantics, lane/topic values, tone definitions, what NOT to do) - https://azsh.uk/signals.md — human/agent-readable signal report (same data as signals.json, markdown) - https://azsh.uk/data — landing page (HTML, no JS required) - https://azsh.uk/data/cameo.json — CAMEO 2.0 event code reference (the parquet column EventCodeDescription is misnamed and holds the numeric CAMEO base code; use this for descriptions) ## Quality & reconciliation (trust) - https://azsh.uk/data/quality.json — permanent machine-readable quality status: per-dataset freshness/coverage/reconciliation + integrity method. **Check this for data trust.** - https://azsh.uk/quality — human-readable viewer of the above - https://azsh.uk/data/quality/sha256/{YYYYMMDD}.json — per-date sha256 manifest of GDELT parquet files (verify with: curl -s | sha256sum) - https://azsh.uk/data/quality/gdelt_recon_summary.json — rolling 90-day reconciliation summary: pipeline (curated) vs GDELT 2.0 source, subset property (no fabricated events), retention rate - https://azsh.uk/data/quality/recon_gdelt_YYYYMMDD.json — per-day detail (diff samples: what curation excluded) - Curated pipeline is a strict subset of GDELT source (verified weekly; subset_pass=true = zero fabricated/altered events). Low retention_pct is expected (noise exclusion). ## GDELT 15-minute events (curated, ~1.6k rows/day, live with 15-30 min lag) - File list: https://azsh.uk/data/gdelt/files?date=YYYYMMDD - Download (parquet, Range OK): https://azsh.uk/data/gdelt/parquet/YYYYMMDDHHMMSS.parquet — **storage tiers**: R2 keeps a 90-day hot window (true 15-min files); dates older than that transparently fall back to the HF cold tier (one daily parquet per day, same schema, 15-min rows preserved — response header X-Content-Granularity: daily). Direct cold access: https://azsh.uk/data/gdelt/hf/YYYYMMDD.parquet · file list + per-file sha256: https://azsh.uk/data/gdelt/hf/files · source: https://huggingface.co/datasets/Toshi33/azsh-uk-data (gdelt/daily/) - **Long-horizon pre-aggregates (hourly x country x topic x lane x CAMEO root, 13 months, ~30KB/day)**: https://azsh.uk/data/gdelt/agg/YYYYMMDD.parquet (file list: https://azsh.uk/data/gdelt/agg/files). tone_sum = SUM(AvgTone), same semantics as /v1/query. Load all files into DuckDB/Polars for SQL analysis. - **Latest batch as plain JSON (no DuckDB/pyarrow required)** — for agents that cannot fetch or parse parquet: https://azsh.uk/data/gdelt/events/latest.json (lite view: top 30 rows by NumMentions + key columns, ~12KB, fits 32KB fetch limits). Full batch: /data/gdelt/events/latest_full.json · specific batch: /data/gdelt/events/YYYYMMDDHHMMSS.json (full rows/columns). - Daily summary: https://azsh.uk/data/gdelt/summary/YYYYMMDD.json (or .../latest.json) - Key columns: EventCode (CAMEO 2.0), GoldsteinScale (-10..+10, cooperation/conflict strength — NOT a sentiment score), AvgTone (article-level tone, the event row's tone column), V2Tone (GKG 7-value comma list: tone,positive,negative,polarity,activity,self-reference,word_count — FIRST value is the article tone ~-100..+100; do NOT average the list, last value is word count), Actor1Name/Actor2Name, Actor1/Actor2CountryCode (ISO 3166-1 alpha-3: CHN, JPN), ActionGeo_CountryCode (FIPS 10-4: CH, JA — different system from actor codes), Lane (main=global|JP=Japan-related|TCK=CN/KR/TW-related), Topic (economy|diplomacy|military|energy|industry|japan_economy|other), Page_Title, SOURCEURL, Datetime - Lane/Topic are ETL classifications (human-validated R=91.3%) ## Japanese market ### Access (market gate — raw OHLCV requires an API key) - **API key required** (raw OHLCV, yfinance/Stooq source — not licensed for redistribution): 15m/*, freq=daily/* (incl. per-ticker JSON), quarterly/* - Send header 'X-API-Key: ' or query '?api_key=' (note: '?key=' is the data-key parameter, not auth) - No registration — keys are issued by the operator (request via the site operator). Without a key these endpoints return 401. - **No auth required** (public-statistics redistribution + own classifications/summaries): intl_flows/* (13F=SEC EDGAR, COT=CFTC, jpx_weekly=JPX), baskets/*, _config/*, manifests, list - Anonymous derived data is LIMITED TO NON-REVERSIBLE SECTOR-LEVEL AGGREGATES (yfinance terms target personal use; derived-data treatment unconfirmed). Per-ticker price/return/volatility series stay key-gated. - Freshness manifest: https://azsh.uk/data/market/manifests (check last_written=false = not yet written) - 15m bars (parquet, **key required**): https://azsh.uk/data/market/file?key=15m/YYYYMMDDHHMMSS.parquet - **Latest 15m bars as plain JSON (no DuckDB/pyarrow required)** — for agents that cannot fetch or parse parquet: https://azsh.uk/data/market/file?key=15m/latest.json (specific bar: key=15m/YYYYMMDDHHMMSS.json). Envelope {"ts": "...", "bars": [{ticker, open, high, low, close, volume}]} — ts shared at top level, prices rounded to 4 dp, 232 instruments per bar (~20 KB, fits a 32 KB fetch cap). - Daily bars + technicals (parquet, **key required**): key=freq=daily/year=YYYY/month=MM/market_YYYYMM.parquet (whole month in one file) - **Per-ticker snapshot (latest trading day, ~0.5-1 KB, key required)** — the primary path for agents fetching individual instruments: https://azsh.uk/data/market/file?key=freq=daily/ticker/{TICKER}.json — one row, all 24 columns (price + ma_50d/ma_200d/volatility/beta + instrument master). Example: key=freq=daily/ticker/6758.T.json (SOFTBANK). Updated daily after the Tokyo close. - Latest trading day, all ~3,900 tickers as plain JSON (key required): https://azsh.uk/data/market/file?key=freq=daily/latest.json (~2.3 MB — use the per-ticker endpoint above if your fetch is size-capped) - Quarterly fundamentals (key required): key=quarterly/TICKER_YYYYQN.parquet (parquet-only) - International flows, no auth (public statistics: SEC EDGAR / CFTC / JPX): 13F key=intl_flows/13f/quarter={YYYYQn}/13f_japan_{YYYYQn}.parquet (per-ticker: .../13f_japan_by_ticker_{YYYYQn}.parquet) · COT key=intl_flows/cot/year={YYYY}/cot_nikkei_{YYYY}.parquet · JPX weekly key=intl_flows/jpx_weekly/year={YYYY}/jpx_{YYYY}.parquet — list with: https://azsh.uk/data/market/list?prefix=intl_flows/ - **Disclosure archives (EDINET filings, no auth, permanent mirror — original URLs expire in ~31 days)**: https://azsh.uk/data/disclosures/{docID}.zip (120/160 earnings flash XBRL→CSV) · /{docID}/csv.zip (event filings 130/150/170/180/190/220/230/350/360) · /{docID}/att/{file} (PDF attachments). These are the evidence_url targets of the market signal datasets — fetch them to verify any signal. - **TDnet: NOT redistributed here (since 2026-10-15)** — JPX terms: viewing service serves only 31 days; older filings are paid (TDnet DBS/API); third-party redistribution may incur per-use fees. TDnet evidence_url in signal datasets points to the JPX original (https://www.release.tdnet.info/inbs/{disc_num}.pdf, expires ~31 days). /data/disclosures/tdnet/* returns 410. Inquiry: api-service@jpx.co.jp. - File list: https://azsh.uk/data/market/list?prefix=15m/ ## What does not exist (do not try these) - Market frequencies: **15m and daily only**. There is NO hourly / 5min / 1min / weekly / monthly / yearly data. Other key prefixes return 400 "key not allowed" by design — stop retrying. - No SQL API, no per-ticker history JSON (history = monthly parquet or Hugging Face), no registration/account system (auth = static API key for raw OHLCV only, see Market access section). (There IS a GDELT aggregation query API: /v1/query — see above.) - GDELT: 15-minute batches only. No hourly/daily parquet (use /v1/query or the daily summary JSON for aggregates). - No full-text search over the 13-month GDELT history (7-day query window + parquet for the rest). ## Payload sizes (plan fetches if your tool caps responses, e.g. 32 KB) - GDELT events/latest.json: ~12 KB (lite view: top 30 rows by NumMentions + key columns — fits 32 KB-cap tools; full batch at /data/gdelt/events/latest_full.json) - freq=daily/ticker/{TICKER}.json: ~0.5-1 KB (single instrument, key required) - 15m/latest.json: ~20 KB (all 232 instruments, newest bar, key required) - freq=daily/latest.json: ~2.3 MB (all instruments, key required — use the per-ticker endpoint instead) ## Notes - Country codes are MIXED: Actor1/Actor2CountryCode = ISO 3166-1 alpha-3 (CHN, JPN); ActionGeo_CountryCode (and by_country rollups) = FIPS 10-4 (CH, JA) — convert before joining (codebook: https://api.gdeltproject.org/data/geo-codes-fips10-4.txt) - GDELT parquet readable directly from URL with DuckDB/Polars: SELECT * FROM 'https://azsh.uk/data/gdelt/parquet/...' - GDELT-derived events are a curated subset — do not treat row counts as exhaustive world events. - GDELT data: free for any use with citation (https://gdeltproject.org/about.html). Cited throughout this service. - Market data source is yfinance (Yahoo Finance). Provided for personal research/analysis by visiting agents. NOT licensed for redistribution, resale, or bulk re-hosting. No warranty. Not investment advice.