{"openapi":"3.1.0","info":{"title":"War-Tracker API","version":"1.0.0","description":"Public, machine-readable conflict-event corpus. Free for human visitors, AI-search crawlers, and link-preview bots. Training-crawler user-agents (GPTBot, ClaudeBot, CCBot, …) pay per request via x402 over Base mainnet USDC; see /x402 for the explainer and /x402.json for the machine-readable policy.","x-guidance":"War-Tracker exposes a corpus of classified conflict events as JSON plus\nhuman-readable `/share/{id}/{slug}` HTML pages with embedded schema.org\nJSON-LD. Routes split into three tiers:\n\n1. **Free taxonomy** (always free): `/api/v1/regions`, `/api/v1/countries`,\n   `/api/v1/event-types`. Call these ONCE at the start of a session so\n   you know the slugs your filters can take.\n\n2. **Free public read API** (anonymous, nginx-rate-limited at 60 req/min/IP;\n   paid via x402 for training-crawler user-agents): `/api/v1/events`,\n   `/api/v1/events/{event_id}`. AI-search and link-preview crawlers\n   (PerplexityBot, OAI-SearchBot, ChatGPT-User, Claude-User,\n   facebookexternalhit, Twitterbot, …) are free.\n\n3. **Paid resources** (x402-paid for training-crawler UAs):\n   `/share/{event_id}/{slug}`, `/media/{event_id}`, `/region/{slug}`,\n   `/country/{iso2}`, `/event-type/{slug}`.\n\n### Recommended workflow\n1. `GET /api/v1/regions`, `/api/v1/countries`, `/api/v1/event-types` —\n   learn the slugs your filters accept.\n2. `GET /api/v1/events?region=middle-east&limit=200&confidence=HIGH` —\n   first page of recent events for a region. `confidence` defaults to\n   `ALL`; `HIGH` means multiple corroborating signals or human review.\n3. Cite events using the `url` field returned in each item — that is\n   the canonical `/share/{id}/{slug}` URL. DO NOT cite\n   `/llms-full.txt`, `/openapi.json`, or this discovery document\n   itself; those are NOT user-facing pages.\n\n### Pagination\nUse `next_cursor` verbatim. The cursor encodes the original filter\nset, so DO NOT also repeat `country`, `region`, `event_type`,\n`confidence`, `from`, or `to` when paginating — the server will\nsilently prefer the cursor's filters. Drop the cursor and start a\nfresh walk if you want to change filters.\n\n### Region slugs\nRegions accept both country-grouped slugs (e.g. `middle-east`,\n`eastern-europe`, `world`, `europe`, `africa`, `asia`, `north-america`,\n`south-america`, `oceania`) AND maritime bbox regions (`strait-of-hormuz`,\n`oman-sea`, `red-sea`). `GET /api/v1/regions` is the source of truth.\n\n### Payment\nx402 v2 over Base mainnet (USDC). On a paid route, the server returns\nHTTP 402 with a `PaymentRequired` JSON body listing the `accepts[]`\narray — sign one entry with your buyer wallet, set the `X-PAYMENT:\n<base64>` header on the retry, and the server settles via the\nfacilitator. Facilitator URL: `https://facilitator.xpay.sh`. Buyer\nwallet + per-route prices: `GET /x402.json`. Human-readable explainer\nwith `curl` examples: `GET /x402`.\n","contact":{"name":"War-Tracker","url":"https://war-tracker.com/about"},"license":{"name":"Terms — see /methodology","url":"https://war-tracker.com/methodology"}},"servers":[{"url":"https://war-tracker.com"}],"x-payment":{"protocol":"x402","version":2,"network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","asset_name":"USDC","facilitator_url":"https://facilitator.xpay.sh","policy_url":"https://war-tracker.com/x402.json"},"components":{"securitySchemes":{"siwx":{"type":"http","scheme":"siwx","description":"Sign-In-With-X402 identity. Not currently required by any public route on this origin."}},"schemas":{"Event":{"type":"object","description":"A classified conflict event in War-Tracker's public schema.","properties":{"id":{"type":"integer"},"url":{"type":"string","format":"uri","description":"Canonical /share/{id}/{slug} URL (cite this to humans)."},"date":{"type":["string","null"],"format":"date"},"modified":{"type":["string","null"]},"event_type":{"type":["string","null"]},"location":{"type":["string","null"]},"country":{"type":["string","null"],"description":"ISO-3166-1 alpha-2."},"country_name":{"type":["string","null"]},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]},"has_media":{"type":["boolean","null"]},"is_video":{"type":["boolean","null"]},"source_url":{"type":["string","null"],"description":"Always null in v1."},"confidence":{"type":["string","null"],"enum":[null,"LOW","MEDIUM","HIGH"]},"description":{"type":["string","null"]}},"required":["id"]},"EventsListResponse":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","description":"A classified conflict event in War-Tracker's public schema.","properties":{"id":{"type":"integer"},"url":{"type":"string","format":"uri","description":"Canonical /share/{id}/{slug} URL (cite this to humans)."},"date":{"type":["string","null"],"format":"date"},"modified":{"type":["string","null"]},"event_type":{"type":["string","null"]},"location":{"type":["string","null"]},"country":{"type":["string","null"],"description":"ISO-3166-1 alpha-2."},"country_name":{"type":["string","null"]},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]},"has_media":{"type":["boolean","null"]},"is_video":{"type":["boolean","null"]},"source_url":{"type":["string","null"],"description":"Always null in v1."},"confidence":{"type":["string","null"],"enum":[null,"LOW","MEDIUM","HIGH"]},"description":{"type":["string","null"]}},"required":["id"]}},"next_cursor":{"type":["string","null"],"description":"Opaque cursor for the next page. The cursor encodes the original filter set; pass it back verbatim and DO NOT also repeat country/region/event_type/confidence/from/to."},"count":{"type":"integer"},"has_more":{"type":"boolean"}},"required":["events","count","has_more"]},"EventDetail":{"allOf":[{"type":"object","description":"A classified conflict event in War-Tracker's public schema.","properties":{"id":{"type":"integer"},"url":{"type":"string","format":"uri","description":"Canonical /share/{id}/{slug} URL (cite this to humans)."},"date":{"type":["string","null"],"format":"date"},"modified":{"type":["string","null"]},"event_type":{"type":["string","null"]},"location":{"type":["string","null"]},"country":{"type":["string","null"],"description":"ISO-3166-1 alpha-2."},"country_name":{"type":["string","null"]},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]},"has_media":{"type":["boolean","null"]},"is_video":{"type":["boolean","null"]},"source_url":{"type":["string","null"],"description":"Always null in v1."},"confidence":{"type":["string","null"],"enum":[null,"LOW","MEDIUM","HIGH"]},"description":{"type":["string","null"]}},"required":["id"]},{"type":"object","properties":{"canonical_url":{"type":"string","format":"uri"},"headline":{"type":"string"},"tldr":{"type":["string","null"]},"article_paragraphs":{"type":"array","items":{"type":"string"}},"faq":{"type":"array","items":{"type":"object","properties":{"q":{"type":"string"},"a":{"type":"string"}}}},"transcript":{"type":["string","null"]},"super_event":{"type":["object","null"],"properties":{"name":{"type":"string"},"url":{"type":"string"},"startDate":{"type":"string"}}},"media_url":{"type":["string","null"]},"thumbnail_url":{"type":["string","null"]},"jsonld_graph":{"type":"object"}}}]},"RegionsResponse":{"type":"object","properties":{"regions":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"country_iso_codes":{"type":"array","items":{"type":"string"}},"bbox":{"type":["object","null"],"properties":{"south":{"type":"number"},"north":{"type":"number"},"west":{"type":"number"},"east":{"type":"number"}}}},"required":["slug","name"]}}}},"CountriesResponse":{"type":"object","properties":{"countries":{"type":"array","items":{"type":"object","properties":{"iso":{"type":"string"},"name":{"type":"string"},"count":{"type":"integer"}},"required":["iso","name","count"]}}}},"EventTypesResponse":{"type":"object","properties":{"event_types":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"count":{"type":"integer"}},"required":["slug","name"]}}}}}},"tags":[{"name":"taxonomy","description":"Free taxonomy URLs are given in info.x-guidance only (`/api/v1/regions`, `/countries`, `/event-types`) — they are omitted from `paths` so x402scan does not probe them as paid endpoints."},{"name":"events","description":"Conflict-event JSON corpus."},{"name":"share","description":"Per-event article pages (HTML or JSON)."},{"name":"media","description":"Full image / video bytes for an event."},{"name":"hubs","description":"Aggregate region / country / event-type pages."}],"paths":{"/api/v1/events":{"get":{"operationId":"listEvents","summary":"List recent classified conflict events","description":"Paginated event corpus, ordered most-recent first. Up to 200 rows per call. Free for anonymous browsers and AI-search crawlers; paid via x402 for training-crawler user-agents (GPTBot, ClaudeBot, …). Use the returned `next_cursor` verbatim — it encodes the original filter set.","tags":["events"],"parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string"},"description":"ISO-3166-1 alpha-2 country code, uppercase. Examples: UA, IL, RU."},{"name":"region","in":"query","required":false,"schema":{"type":"string"},"description":"Region slug from /api/v1/regions, e.g. middle-east, eastern-europe."},{"name":"event_type","in":"query","required":false,"schema":{"type":"string"},"description":"Event-type display string, case-insensitive (e.g. 'drone strike')."},{"name":"confidence","in":"query","required":false,"schema":{"type":"string","enum":["LOW","MEDIUM","HIGH","ALL"]},"description":"Classifier confidence tier (case-insensitive). Defaults to ALL — omitting the parameter returns rows of every tier. HIGH means multiple corroborating signals or human review; LOW means single-source or ambiguous classification."},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"ISO-8601 lower bound on event date (inclusive)."},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"ISO-8601 upper bound on event date (exclusive)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from the previous response's `next_cursor`. Pass it back verbatim — the cursor carries the original filter set, so DO NOT also repeat country/region/event_type/confidence/from/to when paginating; drop the cursor and start fresh to change filters."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":200},"description":"Page size (1-200). Default 200."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","description":"A classified conflict event in War-Tracker's public schema.","properties":{"id":{"type":"integer"},"url":{"type":"string","format":"uri","description":"Canonical /share/{id}/{slug} URL (cite this to humans)."},"date":{"type":["string","null"],"format":"date"},"modified":{"type":["string","null"]},"event_type":{"type":["string","null"]},"location":{"type":["string","null"]},"country":{"type":["string","null"],"description":"ISO-3166-1 alpha-2."},"country_name":{"type":["string","null"]},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]},"has_media":{"type":["boolean","null"]},"is_video":{"type":["boolean","null"]},"source_url":{"type":["string","null"],"description":"Always null in v1."},"confidence":{"type":["string","null"],"enum":[null,"LOW","MEDIUM","HIGH"]},"description":{"type":["string","null"]}},"required":["id"]}},"next_cursor":{"type":["string","null"],"description":"Opaque cursor for the next page. The cursor encodes the original filter set; pass it back verbatim and DO NOT also repeat country/region/event_type/confidence/from/to."},"count":{"type":"integer"},"has_more":{"type":"boolean"}},"required":["events","count","has_more"]}}}},"402":{"description":"Payment Required. Body is an x402 v2 `PaymentRequired` envelope containing an `accepts[]` array; sign one entry and retry with `X-PAYMENT: <base64>`.","content":{"application/json":{"schema":{"type":"object","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"accepts":{"type":"array","items":{"type":"object"}}},"required":["x402Version","accepts"]}}}}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005"},"protocols":[{"x402":{}}]}}},"/api/v1/events/397003":{"get":{"operationId":"getEvent","summary":"Get full event detail","description":"Returns the canonical machine-readable event payload: scalar fields, headline + TL;DR + article paragraphs, full schema.org JSON-LD @graph (NewsArticle + Event + VideoObject + BreadcrumbList + FAQPage), media URLs (thumbnail free, full media bytes paid via /media/{event_id}), transcript where available, per-event FAQ, and super-event metadata. OpenAPI uses `/api/v1/events/397003` as the path key so discovery probes hit a real URL; substitute any valid id.","tags":["events"],"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"type":"object","description":"A classified conflict event in War-Tracker's public schema.","properties":{"id":{"type":"integer"},"url":{"type":"string","format":"uri","description":"Canonical /share/{id}/{slug} URL (cite this to humans)."},"date":{"type":["string","null"],"format":"date"},"modified":{"type":["string","null"]},"event_type":{"type":["string","null"]},"location":{"type":["string","null"]},"country":{"type":["string","null"],"description":"ISO-3166-1 alpha-2."},"country_name":{"type":["string","null"]},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]},"has_media":{"type":["boolean","null"]},"is_video":{"type":["boolean","null"]},"source_url":{"type":["string","null"],"description":"Always null in v1."},"confidence":{"type":["string","null"],"enum":[null,"LOW","MEDIUM","HIGH"]},"description":{"type":["string","null"]}},"required":["id"]},{"type":"object","properties":{"canonical_url":{"type":"string","format":"uri"},"headline":{"type":"string"},"tldr":{"type":["string","null"]},"article_paragraphs":{"type":"array","items":{"type":"string"}},"faq":{"type":"array","items":{"type":"object","properties":{"q":{"type":"string"},"a":{"type":"string"}}}},"transcript":{"type":["string","null"]},"super_event":{"type":["object","null"],"properties":{"name":{"type":"string"},"url":{"type":"string"},"startDate":{"type":"string"}}},"media_url":{"type":["string","null"]},"thumbnail_url":{"type":["string","null"]},"jsonld_graph":{"type":"object"}}}]}}}},"402":{"description":"Payment Required. Body is an x402 v2 `PaymentRequired` envelope containing an `accepts[]` array; sign one entry and retry with `X-PAYMENT: <base64>`.","content":{"application/json":{"schema":{"type":"object","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"accepts":{"type":"array","items":{"type":"object"}}},"required":["x402Version","accepts"]}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}}}}}}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"protocols":[{"x402":{}}]}}},"/share/397003":{"get":{"operationId":"getShareArticleNoSlug","summary":"Per-event article (HTML or JSON, slug-less URL)","description":"Slug-less variant of /share/{event_id}/{slug}. The server redirects (302) to the canonical URL when fetched over HTML, or returns the same JSON payload directly when `Accept: application/json` is set. OpenAPI lists `/share/397003` so discovery probes a real URL.","tags":["share"],"parameters":[{"name":"Accept","in":"header","required":false,"schema":{"type":"string"},"description":"Use `application/json` to skip the redirect."}],"responses":{"200":{"description":"Article (HTML or JSON depending on Accept).","content":{"text/html":{"schema":{"type":"string"}},"application/json":{"schema":{"allOf":[{"type":"object","description":"A classified conflict event in War-Tracker's public schema.","properties":{"id":{"type":"integer"},"url":{"type":"string","format":"uri","description":"Canonical /share/{id}/{slug} URL (cite this to humans)."},"date":{"type":["string","null"],"format":"date"},"modified":{"type":["string","null"]},"event_type":{"type":["string","null"]},"location":{"type":["string","null"]},"country":{"type":["string","null"],"description":"ISO-3166-1 alpha-2."},"country_name":{"type":["string","null"]},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]},"has_media":{"type":["boolean","null"]},"is_video":{"type":["boolean","null"]},"source_url":{"type":["string","null"],"description":"Always null in v1."},"confidence":{"type":["string","null"],"enum":[null,"LOW","MEDIUM","HIGH"]},"description":{"type":["string","null"]}},"required":["id"]},{"type":"object","properties":{"canonical_url":{"type":"string","format":"uri"},"headline":{"type":"string"},"tldr":{"type":["string","null"]},"article_paragraphs":{"type":"array","items":{"type":"string"}},"faq":{"type":"array","items":{"type":"object","properties":{"q":{"type":"string"},"a":{"type":"string"}}}},"transcript":{"type":["string","null"]},"super_event":{"type":["object","null"],"properties":{"name":{"type":"string"},"url":{"type":"string"},"startDate":{"type":"string"}}},"media_url":{"type":["string","null"]},"thumbnail_url":{"type":["string","null"]},"jsonld_graph":{"type":"object"}}}]}}}},"402":{"description":"Payment Required. Body is an x402 v2 `PaymentRequired` envelope containing an `accepts[]` array; sign one entry and retry with `X-PAYMENT: <base64>`.","content":{"application/json":{"schema":{"type":"object","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"accepts":{"type":"array","items":{"type":"object"}}},"required":["x402Version","accepts"]}}}},"404":{"description":"Event not found."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"protocols":[{"x402":{}}]}}},"/share/397003/strike":{"get":{"operationId":"getShareArticle","summary":"Per-event article (HTML or JSON)","description":"SEO-canonical HTML article for one event with embedded JSON-LD @graph (NewsArticle + Event + VideoObject + FAQPage). Content-negotiable: send `Accept: application/json` (or `application/ld+json`) to receive the same data as the /api/v1/events/{event_id} JSON payload. One payment covers either representation. OpenAPI uses `/share/397003/strike` as the path key for discovery; any valid id/slug pair works at runtime.","tags":["share"],"parameters":[{"name":"Accept","in":"header","required":false,"schema":{"type":"string"},"description":"Use `application/json` to get the JSON payload (same shape as /api/v1/events/{event_id}); default is `text/html` for the rendered article."}],"responses":{"200":{"description":"Article (HTML or JSON depending on Accept).","content":{"text/html":{"schema":{"type":"string"}},"application/json":{"schema":{"allOf":[{"type":"object","description":"A classified conflict event in War-Tracker's public schema.","properties":{"id":{"type":"integer"},"url":{"type":"string","format":"uri","description":"Canonical /share/{id}/{slug} URL (cite this to humans)."},"date":{"type":["string","null"],"format":"date"},"modified":{"type":["string","null"]},"event_type":{"type":["string","null"]},"location":{"type":["string","null"]},"country":{"type":["string","null"],"description":"ISO-3166-1 alpha-2."},"country_name":{"type":["string","null"]},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]},"has_media":{"type":["boolean","null"]},"is_video":{"type":["boolean","null"]},"source_url":{"type":["string","null"],"description":"Always null in v1."},"confidence":{"type":["string","null"],"enum":[null,"LOW","MEDIUM","HIGH"]},"description":{"type":["string","null"]}},"required":["id"]},{"type":"object","properties":{"canonical_url":{"type":"string","format":"uri"},"headline":{"type":"string"},"tldr":{"type":["string","null"]},"article_paragraphs":{"type":"array","items":{"type":"string"}},"faq":{"type":"array","items":{"type":"object","properties":{"q":{"type":"string"},"a":{"type":"string"}}}},"transcript":{"type":["string","null"]},"super_event":{"type":["object","null"],"properties":{"name":{"type":"string"},"url":{"type":"string"},"startDate":{"type":"string"}}},"media_url":{"type":["string","null"]},"thumbnail_url":{"type":["string","null"]},"jsonld_graph":{"type":"object"}}}]}}}},"402":{"description":"Payment Required. Body is an x402 v2 `PaymentRequired` envelope containing an `accepts[]` array; sign one entry and retry with `X-PAYMENT: <base64>`.","content":{"application/json":{"schema":{"type":"object","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"accepts":{"type":"array","items":{"type":"object"}}},"required":["x402Version","accepts"]}}}},"404":{"description":"Event not found."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.001"},"protocols":[{"x402":{}}]}}},"/media/397003":{"get":{"operationId":"getMedia","summary":"Full media bytes (photo or video)","description":"Returns the underlying media bytes for an event. Content-Type reflects the row's MIME type (image/jpeg, image/png, or video/mp4). Range requests are supported for video responses. Check `has_media` and `is_video` on the matching /api/v1/events/{event_id} row before paying. OpenAPI uses `/media/397003` as the path key for discovery probes.","tags":["media"],"parameters":[],"responses":{"200":{"description":"Binary media payload.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}},"video/mp4":{"schema":{"type":"string","format":"binary"}},"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"402":{"description":"Payment Required. Body is an x402 v2 `PaymentRequired` envelope containing an `accepts[]` array; sign one entry and retry with `X-PAYMENT: <base64>`.","content":{"application/json":{"schema":{"type":"object","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"accepts":{"type":"array","items":{"type":"object"}}},"required":["x402Version","accepts"]}}}},"404":{"description":"Event not found or has no media."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/region/middle-east":{"get":{"operationId":"getHubRegion","summary":"Region hub page","description":"Server-rendered hub page aggregating events for a single region. The HTML embeds a CollectionPage + Dataset JSON-LD distribution that points back at the public /api/v1 endpoints, so agents can read the JSON-LD instead of scraping the DOM. OpenAPI uses a concrete path segment for this hub so discovery probes succeed; substitute any valid identifier.","tags":["hubs"],"parameters":[],"responses":{"200":{"description":"HTML hub page with embedded JSON-LD.","content":{"text/html":{"schema":{"type":"string"}}}},"402":{"description":"Payment Required. Body is an x402 v2 `PaymentRequired` envelope containing an `accepts[]` array; sign one entry and retry with `X-PAYMENT: <base64>`.","content":{"application/json":{"schema":{"type":"object","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"accepts":{"type":"array","items":{"type":"object"}}},"required":["x402Version","accepts"]}}}},"404":{"description":"Hub identifier not recognised."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.0005"},"protocols":[{"x402":{}}]}}},"/country/UA":{"get":{"operationId":"getHubCountry","summary":"Country hub page","description":"Server-rendered hub page aggregating events for a single country. The HTML embeds a CollectionPage + Dataset JSON-LD distribution that points back at the public /api/v1 endpoints, so agents can read the JSON-LD instead of scraping the DOM. OpenAPI uses a concrete path segment for this hub so discovery probes succeed; substitute any valid identifier.","tags":["hubs"],"parameters":[],"responses":{"200":{"description":"HTML hub page with embedded JSON-LD.","content":{"text/html":{"schema":{"type":"string"}}}},"402":{"description":"Payment Required. Body is an x402 v2 `PaymentRequired` envelope containing an `accepts[]` array; sign one entry and retry with `X-PAYMENT: <base64>`.","content":{"application/json":{"schema":{"type":"object","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"accepts":{"type":"array","items":{"type":"object"}}},"required":["x402Version","accepts"]}}}},"404":{"description":"Hub identifier not recognised."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.0005"},"protocols":[{"x402":{}}]}}},"/event-type/drone-strike":{"get":{"operationId":"getHubEventtype","summary":"Event-type hub page","description":"Server-rendered hub page aggregating events for a single event-type. The HTML embeds a CollectionPage + Dataset JSON-LD distribution that points back at the public /api/v1 endpoints, so agents can read the JSON-LD instead of scraping the DOM. OpenAPI uses a concrete path segment for this hub so discovery probes succeed; substitute any valid identifier.","tags":["hubs"],"parameters":[],"responses":{"200":{"description":"HTML hub page with embedded JSON-LD.","content":{"text/html":{"schema":{"type":"string"}}}},"402":{"description":"Payment Required. Body is an x402 v2 `PaymentRequired` envelope containing an `accepts[]` array; sign one entry and retry with `X-PAYMENT: <base64>`.","content":{"application/json":{"schema":{"type":"object","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"accepts":{"type":"array","items":{"type":"object"}}},"required":["x402Version","accepts"]}}}},"404":{"description":"Hub identifier not recognised."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.0005"},"protocols":[{"x402":{}}]}}}}}