Developers
Public blog API
This endpoint returns published blog posts as JSON: title, teaser, category, timestamps and stable links to the original pages. Use it for links, “latest posts” lists or simple widgets — no login, HTTP GET only.
Try the API interactively
Requests use the same origin as this page (no API key). Pick a scenario, optionally set slug or category, then run — code snippets update automatically.
https://wischtig.de/api/public/v1/posts
Response (JSON)
No request yet — choose a scenario and click “Send request”.Code snippets
curl -sS "https://wischtig.de/api/public/v1/posts" \
-H "Accept: application/json"What is it for?
Instead of scraping HTML, you can read title, teaser, category, timestamps and stable article URLs (`urls.de` / `urls.en`) as JSON — so integrations keep working when the site layout changes.
Base URL
All examples use the public domain https://wischtig.de (canonical site address).
https://wischtig.de
Post list
HTTP GET, response `application/json`. Query parameters:
- limit (optional): 1–50, default 50.
- offset (optional): for pagination (e.g. second page with limit=20&offset=20).
- category (optional): filter by internal category slug (e.g. organisation, digitalisierung).
Ordering: by publication date (newest first), then by creation date if needed.
GET https://wischtig.de/api/public/v1/posts
GET https://wischtig.de/api/public/v1/posts?limit=10&offset=0&category=organisationSample response (excerpt)
{
"version": "1",
"posts": [
{
"slug": "beispiel-slug",
"title": { "de": "…", "en": "…" },
"excerpt": { "de": "…", "en": "…" },
"urls": {
"de": "https://wischtig.de/blog/beispiel-slug",
"en": "https://wischtig.de/en/blog/beispiel-slug"
},
"category": "organisation",
"readingTimeMinutes": 5,
"publishedAt": "2026-03-01T12:00:00.000Z",
"updatedAt": "2026-03-02T08:00:00.000Z",
"createdAt": "2026-03-01T10:00:00.000Z",
"tags": ["kmu"],
"isSponsored": false,
"sponsoredBy": null
}
],
"meta": {
"total": 42,
"limit": 50,
"offset": 0,
"hasMore": false
}
}Single post
Returns one published post by URL slug. By default without full body; optional Markdown in both languages.
- body=1: also returns `content.de` and `content.en` (Markdown). Use sparingly and link readers to the canonical page.
GET https://wischtig.de/api/public/v1/posts/beispiel-slug
GET https://wischtig.de/api/public/v1/posts/beispiel-slug?body=1CORS and browser use
Responses include Access-Control-Allow-Origin: * and OPTIONS is supported for preflight. Please do not cache aggressively — short CDN cache headers apply; widgets can refresh every few minutes.
Rate limit & caching
Per client IP we apply a sliding window (default: 100 requests per 60 seconds, configurable via env). Response headers: X-RateLimit-Limit, -Remaining, -Reset. If exceeded: HTTP 429, JSON retry_after, Retry-After header. GET responses use short s-maxage at the edge (lists slightly longer than single posts).
Advertising and labelling
Sponsored posts include isSponsored and sponsoredBy. If you reuse content, separate it clearly from your own editorial material and point to the original page.
Fair use
The API is meant for moderate, automated reads. Please do not load-test the production domain or mirror full text without adding value — copyright in the copy remains with the authors.
AGENTS.md — German & English
For AI assistants and developers: expand the section below to view, copy or download the file for the current locale (same as AGENTS.de.md / AGENTS.md in the repo).
Show AGENTS.md for this language
# wischtig.de — Public Blog API (agent guide)
**Language:** English · **Deutsch:** [AGENTS.de.md](./AGENTS.de.md)
This file helps **AI assistants** and developers integrate the **public JSON API** of [wischtig.de](https://wischtig.de) into sites, scripts, or tools.
## Purpose
- **Read-only:** Published blog posts as JSON (list + single post).
- **No login, no Bearer token** for this public API.
- **Canonical article URLs** are in `urls.de` and `urls.en` (full HTTPS URLs).
## Base URL
Production: **`https://wischtig.de`**
All paths below are relative to this origin.
## Endpoints
### 1) Post list
```http
GET /api/public/v1/posts
```
**Optional query parameters**
| Parameter | Description |
|------------|-------------|
| `limit` | 1–50, default 50 |
| `offset` | Pagination |
| `category` | Internal category slug (e.g. `organisation`, `digitalisierung`) |
**Response (core):** `version`, `posts[]`, `meta` (total, limit, offset, hasMore).
Each `posts[]` item includes: `slug`, `title` / `excerpt` (each `{ de, en }`), `urls` (`de`, `en`), `category`, `readingTimeMinutes`, timestamps, `tags`, `isSponsored`, `sponsoredBy`.
### 2) Single post
```http
GET /api/public/v1/posts/{slug}
```
**Optional:** `?body=1` — adds `content.de` and `content.en` (Markdown). Use sparingly; link readers to the HTML page.
**404:** Unknown slug or not published.
## Authentication
None. Only `GET` (and browser `OPTIONS` for CORS).
## Rate limiting
- Per client IP: **sliding window** (default **100 requests / 60 seconds** — configurable server-side).
- Response headers: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`.
- When exceeded: **HTTP 429**, JSON `error: "rate_limited"`, field `retry_after` (seconds), `Retry-After` header.
**Recommendation:** Back off on 429; avoid aggressive polling (e.g. refresh widgets every 1–5+ minutes).
## Caching
- Responses use `Cache-Control` suitable for browsers/CDNs (short `s-maxage` / `stale-while-revalidate`).
- Clients may cache briefly; do not refetch every second.
## Advertising / sponsorship
- `isSponsored === true`: promotional post; `sponsoredBy` may hold a label.
- **UI:** Clearly separate sponsored items from your own editorial content and link to the original page.
## Example: JavaScript (fetch)
```javascript
const base = "https://wischtig.de";
const res = await fetch(`${base}/api/public/v1/posts?limit=10`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
for (const p of data.posts) {
const url = p.urls.de; // or p.urls.en
console.log(p.title.de, url);
}
```
## Example: cURL
```bash
curl -sS "https://wischtig.de/api/public/v1/posts?limit=5" \
-H "Accept: application/json"
```
## Human docs & interactive tester
- **Docs + playground:** [https://wischtig.de/blog-api](https://wischtig.de/blog-api) (English: `/en/blog-api`).
Users can try scenarios and copy **cURL / fetch** snippets.
## Do not invent / assume
- **No internal server details** (monitoring, background jobs, operator env vars) in responses or public copy.
- This public API does **not** create posts; write/admin flows are **out of scope** for this file.
## Fair use
- Moderate traffic; no load tests against production.
- Do not mirror full text without added value; respect **copyright**.
---
*Last updated: 2026 — adjust paths if the live API changes.*