{
 "openapi": "3.1.0",
 "info": {
  "title": "Großwald Data API",
  "version": "1.0.0",
  "summary": "Read-only JSON mirror of the published Großwald corpus.",
  "description": "Every published Großwald article and every tracked entity as JSON. No key, no authentication, no rate limit. Only published posts are mirrored — drafts and editorial holds are excluded by construction. Retrieval and citation are permitted with attribution; see the terms at https://www.grosswald.org/data/terms.txt.",
  "termsOfService": "https://www.grosswald.org/data/terms.txt",
  "license": {
   "name": "Großwald terms of use",
   "url": "https://www.grosswald.org/data/terms.txt"
  },
  "contact": {
   "name": "Großwald (Veilmark LLC)",
   "url": "https://www.grosswald.org/"
  },
  "x-built": "2026-08-16T20:42:55Z",
  "x-post-count": 690,
  "x-entity-count": 56
 },
 "servers": [
  {
   "url": "https://www.grosswald.org",
   "description": "Production"
  }
 ],
 "externalDocs": {
  "url": "https://www.grosswald.org/data/docs",
  "description": "Documentation"
 },
 "tags": [
  {
   "name": "data",
   "description": "Structured corpus records."
  },
  {
   "name": "text",
   "description": "Plain-text layer for language models."
  }
 ],
 "security": [],
 "paths": {
  "/data/index.json": {
   "get": {
    "operationId": "getManifest",
    "tags": [
     "data"
    ],
    "summary": "Manifest",
    "description": "Build timestamp, counts, every article slug with its last update, the entity list and the endpoint list. Start here.",
    "responses": {
     "200": {
      "description": "Manifest",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Manifest"
        }
       }
      }
     },
     "404": {
      "description": "No such slug in the published corpus."
     }
    }
   }
  },
  "/data/changes.json": {
   "get": {
    "operationId": "getChanges",
    "tags": [
     "data"
    ],
    "summary": "Changes since the previous build",
    "description": "Articles added and updated since the last build, plus the entities they touch. Poll this instead of re-crawling the corpus.",
    "responses": {
     "200": {
      "description": "Changes since the previous build",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Changes"
        }
       }
      }
     },
     "404": {
      "description": "No such slug in the published corpus."
     }
    }
   }
  },
  "/data/status.json": {
   "get": {
    "operationId": "getStatus",
    "tags": [
     "data"
    ],
    "summary": "Status",
    "description": "Health and freshness of the machine-readable layer.",
    "responses": {
     "200": {
      "description": "Status",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Status"
        }
       }
      }
     },
     "404": {
      "description": "No such slug in the published corpus."
     }
    }
   }
  },
  "/data/articles/{slug}.json": {
   "get": {
    "operationId": "getArticle",
    "tags": [
     "data"
    ],
    "summary": "One article",
    "description": "Full record for a single published article.",
    "responses": {
     "200": {
      "description": "One article",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Article"
        }
       }
      }
     },
     "404": {
      "description": "No such slug in the published corpus."
     }
    }
   },
   "parameters": [
    {
     "name": "slug",
     "in": "path",
     "required": true,
     "description": "Article slug, identical to the slug in the public URL and in /data/index.json.",
     "schema": {
      "type": "string",
      "pattern": "^[a-z0-9-]+$"
     },
     "example": "signal-no-121-an-apache-depot-dated-2036"
    }
   ]
  },
  "/data/entities/{slug}.json": {
   "get": {
    "operationId": "getEntity",
    "tags": [
     "data"
    ],
    "summary": "One entity dossier",
    "description": "Coverage timeline, co-occurring entities and sources for a tracked entity.",
    "responses": {
     "200": {
      "description": "One entity dossier",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Entity"
        }
       }
      }
     },
     "404": {
      "description": "No such slug in the published corpus."
     }
    }
   },
   "parameters": [
    {
     "name": "slug",
     "in": "path",
     "required": true,
     "description": "Entity slug, as listed in /data/index.json under \"entities\".",
     "schema": {
      "type": "string",
      "pattern": "^[a-z0-9-]+$"
     },
     "example": "airbus"
    }
   ]
  },
  "/data/sitemap.xml": {
   "get": {
    "operationId": "getDataSitemap",
    "tags": [
     "data"
    ],
    "summary": "Sitemap of the data layer",
    "description": "Every data endpoint with a lastmod date.",
    "responses": {
     "200": {
      "description": "Sitemap of the data layer",
      "content": {
       "application/xml": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "No such slug in the published corpus."
     }
    }
   }
  },
  "/data/terms.txt": {
   "get": {
    "operationId": "getTerms",
    "tags": [
     "data"
    ],
    "summary": "Usage terms",
    "description": "What is permitted and what is reserved.",
    "responses": {
     "200": {
      "description": "Usage terms",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "No such slug in the published corpus."
     }
    }
   }
  },
  "/llms.txt": {
   "get": {
    "operationId": "getLlmsTxt",
    "tags": [
     "text"
    ],
    "summary": "Text index",
    "description": "Publication overview, taxonomy and latest coverage.",
    "responses": {
     "200": {
      "description": "Text index",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "No such slug in the published corpus."
     }
    }
   }
  },
  "/llms-full.txt": {
   "get": {
    "operationId": "getLlmsFullTxt",
    "tags": [
     "text"
    ],
    "summary": "Full text index",
    "description": "Every published article with date, type and excerpt.",
    "responses": {
     "200": {
      "description": "Full text index",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "404": {
      "description": "No such slug in the published corpus."
     }
    }
   }
  }
 },
 "components": {
  "schemas": {
   "Article": {
    "type": "object",
    "description": "One published article, mirrored in full from the live post.",
    "properties": {
     "slug": {
      "type": "string"
     },
     "title": {
      "type": "string"
     },
     "url": {
      "type": "string",
      "format": "uri"
     },
     "canonical": {
      "type": "string",
      "format": "uri"
     },
     "type": {
      "type": "string",
      "enum": [
       "signal",
       "curated",
       "dispatch",
       "article",
       "system",
       "perspective"
      ],
      "description": "Editorial format: daily Signal, weekly Curated, atomic Dispatch, long-form article, evergreen system profile, or perspective piece."
     },
     "published": {
      "type": "string",
      "format": "date-time"
     },
     "updated": {
      "type": "string",
      "format": "date-time"
     },
     "excerpt": {
      "type": "string"
     },
     "countries": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Editorial facet — tag-derived, never machine-written."
     },
     "domains": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "capabilities": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "tags": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "sources": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Source"
      }
     },
     "entities": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Slugs resolvable at /data/entities/{slug}.json."
     },
     "inferred": {
      "type": "object",
      "description": "Machine-derived facets, kept separate from the editorial ones.",
      "properties": {
       "countries": {
        "type": "array",
        "items": {
         "type": "string"
        }
       },
       "domains": {
        "type": "array",
        "items": {
         "type": "string"
        }
       },
       "capabilities": {
        "type": "array",
        "items": {
         "type": "string"
        }
       }
      }
     }
    },
    "required": [
     "slug",
     "title",
     "url",
     "type",
     "published",
     "sources"
    ]
   },
   "Entity": {
    "type": "object",
    "description": "Dossier for a tracked actor, programme or system.",
    "properties": {
     "slug": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "type": {
      "type": "string",
      "enum": [
       "country",
       "company",
       "institution",
       "programme",
       "system"
      ]
     },
     "aliases": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "coverage": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "slug": {
         "type": "string"
        },
        "title": {
         "type": "string"
        },
        "url": {
         "type": "string",
         "format": "uri"
        },
        "type": {
         "type": "string",
         "enum": [
          "signal",
          "curated",
          "dispatch",
          "article",
          "system",
          "perspective"
         ]
        },
        "date": {
         "type": "string",
         "format": "date-time"
        }
       }
      },
      "description": "Every article covering this entity, newest first."
     },
     "last_covered": {
      "type": "string",
      "format": "date-time",
      "description": "Freshness of coverage — not a verification date."
     },
     "co_occurring": {
      "type": "array",
      "description": "Entities appearing alongside this one, by article count.",
      "items": {
       "type": "object",
       "properties": {
        "slug": {
         "type": "string"
        },
        "count": {
         "type": "integer"
        }
       }
      }
     },
     "sources": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Source"
      }
     }
    },
    "required": [
     "slug",
     "name",
     "type",
     "coverage",
     "last_covered"
    ]
   },
   "Source": {
    "type": "object",
    "description": "A source as recorded in the editorial source registry.",
    "properties": {
     "source": {
      "type": "string",
      "description": "Publisher or venue that carried it."
     },
     "date": {
      "type": "string",
      "description": "Publication date as printed, e.g. \"11 Aug 2026\"."
     },
     "url": {
      "type": "string",
      "format": "uri"
     },
     "context": {
      "type": "string",
      "description": "What this source was used for."
     }
    },
    "required": [
     "source",
     "url"
    ]
   },
   "Manifest": {
    "type": "object",
    "properties": {
     "built": {
      "type": "string",
      "format": "date-time"
     },
     "post_count": {
      "type": "integer"
     },
     "entity_count": {
      "type": "integer"
     },
     "posts": {
      "type": "object",
      "description": "slug → last-updated timestamp.",
      "additionalProperties": {
       "type": "string"
      }
     },
     "endpoints": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "terms": {
      "type": "string"
     },
     "entities": {
      "type": "array",
      "items": {
       "type": "string"
      }
     }
    }
   },
   "Changes": {
    "type": "object",
    "properties": {
     "built": {
      "type": "string",
      "format": "date-time"
     },
     "added": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "slug": {
         "type": "string"
        },
        "published": {
         "type": "string",
         "format": "date-time"
        }
       }
      }
     },
     "updated": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "slug": {
         "type": "string"
        },
        "updated": {
         "type": "string",
         "format": "date-time"
        }
       }
      }
     },
     "entities_touched": {
      "type": "array",
      "items": {
       "type": "string"
      }
     }
    }
   },
   "Status": {
    "type": "object",
    "properties": {
     "status": {
      "type": "string",
      "enum": [
       "ok"
      ]
     },
     "built": {
      "type": "string",
      "format": "date-time"
     },
     "post_count": {
      "type": "integer"
     },
     "entity_count": {
      "type": "integer"
     },
     "endpoints": {
      "type": "array",
      "items": {
       "type": "string"
      }
     }
    }
   }
  }
 }
}