Geht besser.
Geht besser.Einfache Sprache

Über Geht besser.

Offene Daten

Alles, was auf Geht besser. sichtbar ist, kannst du lesen, auf deiner Seite zeigen und verlinken. Für Kommunen, Redaktionen, Forschung und andere Apps. Die Schnittstelle ist nur lesend und braucht weder Schlüssel noch Konto.

10.940Gemeinden mit ihrem Schlüssel

GET /orte

Geht besser. ist kein Angebot einer Behörde. Wer hier liest, liest wie alle anderen: was Menschen an ihrem Ort Zeit kostet, wie viele es kennen und was ihnen geholfen hat.

Auf dieser Seite 13 Abschnitte
  1. Auf einen Blick
  2. Endpunkte
  3. Die Felder
  4. Blättern
  5. Zwischenspeichern
  6. Grenzen
  7. CORS
  8. Fehler
  9. Einbetten
  10. Atom-Feed
  11. oEmbed
  12. Was nie drin ist
  13. Nutzung

Auf einen Blick

Basisadresse
https://gehtbesser.org/api/offen/v1
Format
JSON in UTF-8. Feldnamen auf Englisch, Bezeichnungen auf Deutsch, Zeitpunkte in ISO 8601 und UTC.
Zugang
Ohne Schlüssel, nur GET. Jede Seite darf direkt aus dem Browser lesen.
Beschreibung
OpenAPI 3.1 unter https://gehtbesser.org/api/offen/v1/openapi.json, mit Beispielen, für Clients, Mocks und Codegeneratoren.
Frische
Antworten gelten 60 Sekunden, mit ETag für schnelle Wiederholungen.
Grenze
600 Abfragen in 10 Minuten je Adresse.

Endpunkte

GET /probleme

Sichtbare Probleme, neueste zuerst. Die Filter lassen sich kombinieren.

ParameterWertBedeutung
ortAGS, 8 ZiffernNur Probleme in dieser Gemeinde. Den Schlüssel zu einem Namen findest du mit /orte?q=.
land01 bis 16Nur Probleme in Orten dieses Bundeslands.
themakey aus /themenNur dieses Thema, zum Beispiel buergeramt.
artkey aus /themenNur diese Art, zum Beispiel warten.
statusoffen oder geloestgeloest: eine Lösung hat den meisten geholfen, die sie ausprobiert haben. offen: alle anderen.
seitDatum oder ZeitpunktNur Probleme, die ab dann geschrieben wurden. 2026-10-01 gilt ab 0 Uhr UTC, 2026-10-01T08:00:00+02:00 mit Zone.
limit1 bis 100Wie viele auf eine Seite kommen. Ohne Angabe 20.
cursoraus nextCursorDie nächste Seite, siehe Blättern.

Jeder Parameter darf einmal vorkommen. Unbekannte Parameter lehnt die Schnittstelle ab, damit ein Tippfehler nicht still alles zeigt.

curl -s 'https://gehtbesser.org/api/offen/v1/probleme?ort=09761000&limit=2'
Beispielantwort
{
  "items": [
    {
      "id": "5b0e2c4a-8d1f-4c3b-9a6e-2f7d1c0b9e41",
      "url": "https://gehtbesser.org/p/5b0e2c4a-8d1f-4c3b-9a6e-2f7d1c0b9e41",
      "title": "Der nächste freie Termin für den Ausweis ist in sieben Wochen",
      "body": "Ich brauche einen neuen Personalausweis. Online ist der nächste freie Termin erst Mitte Dezember, am Telefon kommt nur eine Ansage. Kommt man morgens ohne Termin noch dran?",
      "place": {
        "ags": "09761000",
        "name": "Augsburg",
        "land": "09",
        "landName": "Bayern"
      },
      "topic": {
        "key": "buergeramt",
        "label": "Bürgeramt"
      },
      "kind": {
        "key": "warten",
        "label": "Warten und Termine"
      },
      "reach": {
        "key": "hier",
        "label": "Nur an diesem Ort"
      },
      "counts": {
        "kenn": 14,
        "kenn7Days": 9,
        "fixes": 2,
        "fixChecks": 7,
        "fixWorked": 5,
        "timePeople": 0,
        "hours": null
      },
      "solved": true,
      "media": [
        {
          "url": "https://gehtbesser.org/m/0f6c2d9a-41b7-4e58-9c3a-7d2e8b5f1a60/w1080.webp",
          "width": 1080,
          "height": 1440,
          "alt": "Ein Aushang an einer Amtstür: Termine nur nach Vereinbarung.",
          "kind": "photo",
          "poster": null
        }
      ],
      "createdAt": "2026-10-20T07:42:10.123Z",
      "visibleAt": "2026-10-20T09:05:31.000Z"
    },
    {
      "id": "9d3f6a1c-2b8e-4f7a-8c5d-1e0b4a6c3f92",
      "url": "https://gehtbesser.org/p/9d3f6a1c-2b8e-4f7a-8c5d-1e0b4a6c3f92",
      "title": "Am Wochenende fährt der Bus nur einmal in der Stunde",
      "body": "Samstags und sonntags fährt die Linie in unser Viertel nur stündlich, und der letzte Bus fährt vor 22 Uhr. Wer abends arbeitet, kommt nicht mehr nach Hause.",
      "place": {
        "ags": "09761000",
        "name": "Augsburg",
        "land": "09",
        "landName": "Bayern"
      },
      "topic": {
        "key": "bahn",
        "label": "Bahn und Nahverkehr"
      },
      "kind": {
        "key": "warten",
        "label": "Warten und Termine"
      },
      "reach": {
        "key": "hier",
        "label": "Nur an diesem Ort"
      },
      "counts": {
        "kenn": 4,
        "kenn7Days": 4,
        "fixes": 0,
        "fixChecks": 0,
        "fixWorked": 0,
        "timePeople": 0,
        "hours": null
      },
      "solved": false,
      "media": [],
      "createdAt": "2026-10-18T16:20:44.502Z",
      "visibleAt": "2026-10-18T18:02:10.000Z"
    }
  ],
  "nextCursor": "MXwyMDI2LTEwLTE4VDE2OjIwOjQ0LjUwMjkxOHw5ZDNmNmExYy0yYjhlLTRmN2EtOGM1ZC0xZTBiNGE2YzNmOTI",
  "next": "https://gehtbesser.org/api/offen/v1/probleme?ort=09761000&limit=2&cursor=MXwyMDI2LTEwLTE4VDE2OjIwOjQ0LjUwMjkxOHw5ZDNmNmExYy0yYjhlLTRmN2EtOGM1ZC0xZTBiNGE2YzNmOTI"
}

GET /probleme/{id}

Ein sichtbares Problem mit seinen sichtbaren Lösungen, die mit den meisten „hat geholfen“ zuerst. Gibt es den Beitrag nicht oder nicht mehr, kommt 404.

curl -s 'https://gehtbesser.org/api/offen/v1/probleme/5b0e2c4a-8d1f-4c3b-9a6e-2f7d1c0b9e41'
Beispielantwort
{
  "id": "5b0e2c4a-8d1f-4c3b-9a6e-2f7d1c0b9e41",
  "url": "https://gehtbesser.org/p/5b0e2c4a-8d1f-4c3b-9a6e-2f7d1c0b9e41",
  "title": "Der nächste freie Termin für den Ausweis ist in sieben Wochen",
  "body": "Ich brauche einen neuen Personalausweis. Online ist der nächste freie Termin erst Mitte Dezember, am Telefon kommt nur eine Ansage. Kommt man morgens ohne Termin noch dran?",
  "place": {
    "ags": "09761000",
    "name": "Augsburg",
    "land": "09",
    "landName": "Bayern"
  },
  "topic": {
    "key": "buergeramt",
    "label": "Bürgeramt"
  },
  "kind": {
    "key": "warten",
    "label": "Warten und Termine"
  },
  "reach": {
    "key": "hier",
    "label": "Nur an diesem Ort"
  },
  "counts": {
    "kenn": 14,
    "kenn7Days": 9,
    "fixes": 2,
    "fixChecks": 7,
    "fixWorked": 5,
    "timePeople": 0,
    "hours": null
  },
  "solved": true,
  "media": [
    {
      "url": "https://gehtbesser.org/m/0f6c2d9a-41b7-4e58-9c3a-7d2e8b5f1a60/w1080.webp",
      "width": 1080,
      "height": 1440,
      "alt": "Ein Aushang an einer Amtstür: Termine nur nach Vereinbarung.",
      "kind": "photo",
      "poster": null
    }
  ],
  "createdAt": "2026-10-20T07:42:10.123Z",
  "visibleAt": "2026-10-20T09:05:31.000Z",
  "fixes": [
    {
      "id": "e8a4b2c6-7d1f-4a3e-b9c5-6f2d8e0a1b37",
      "title": "Früh hingehen, ohne Termin",
      "body": "Dienstags und donnerstags gibt es ab 7:30 Uhr ein paar Wartenummern für Leute ohne Termin. Ich war um 7:15 Uhr da und um halb neun fertig.",
      "link": null,
      "ownProduct": false,
      "kind": {
        "key": "weg",
        "label": "Weg"
      },
      "counts": {
        "checks": 7,
        "worked": 5
      },
      "media": [],
      "createdAt": "2026-10-21T06:58:02.000Z",
      "visibleAt": "2026-10-21T08:11:40.000Z"
    },
    {
      "id": "3c7e9b2a-5f4d-4e1b-a8c6-0d9f2e7b4a15",
      "title": "Abends im Portal nach abgesagten Terminen schauen",
      "body": "Gegen 20 Uhr tauchen im Terminportal oft Termine für die nächsten Tage auf, die jemand abgesagt hat. Einfach am Abend noch einmal nachsehen.",
      "link": "https://termine.example.org/buergeramt",
      "ownProduct": false,
      "kind": {
        "key": "werkzeug",
        "label": "Werkzeug"
      },
      "counts": {
        "checks": 3,
        "worked": 1
      },
      "media": [],
      "createdAt": "2026-10-22T19:30:12.000Z",
      "visibleAt": "2026-10-22T21:02:55.000Z"
    }
  ]
}

GET /orte?q=

Gemeinden nach Namen, wie in der Ortswahl des Boards: höchstens 12 Treffer, mit dem Kreis, damit zwei Orte gleichen Namens auseinanderbleiben. q braucht mindestens zwei Buchstaben.

curl -s 'https://gehtbesser.org/api/offen/v1/orte?q=Augsburg'
Beispielantwort
{
  "items": [
    {
      "ags": "09761000",
      "name": "Augsburg",
      "land": "09",
      "landName": "Bayern",
      "kreis": "Augsburg",
      "url": "https://gehtbesser.org/api/offen/v1/orte/09761000"
    }
  ]
}

GET /orte/{ags}

Eine Gemeinde mit ihren Zahlen: sichtbare Probleme, davon gelöst, die häufigsten Themen, und die Links zur Liste, zum Feed und zum Einbetten.

curl -s 'https://gehtbesser.org/api/offen/v1/orte/09761000'
Beispielantwort
{
  "ags": "09761000",
  "name": "Augsburg",
  "land": "09",
  "landName": "Bayern",
  "kreis": {
    "ags": "09761",
    "name": "Augsburg"
  },
  "counts": {
    "problems": 37,
    "solved": 6
  },
  "topTopics": [
    {
      "key": "buergeramt",
      "label": "Bürgeramt",
      "problems": 11
    },
    {
      "key": "bahn",
      "label": "Bahn und Nahverkehr",
      "problems": 8
    },
    {
      "key": "schule_kita",
      "label": "Schule und Kita",
      "problems": 5
    }
  ],
  "links": {
    "problems": "https://gehtbesser.org/api/offen/v1/probleme?ort=09761000",
    "feed": "https://gehtbesser.org/api/offen/v1/feed.atom?ort=09761000",
    "embed": "https://gehtbesser.org/einbetten/ort/09761000"
  }
}

GET /themen

Jede Liste, nach der du filtern kannst, vollständig und mit der Zahl sichtbarer Probleme: Themen (topics, Werte für thema), Arten (kinds, für art), Reichweiten (reach) und Bundesländer (lands, für land).

curl -s 'https://gehtbesser.org/api/offen/v1/themen'
Beispielantwort
{
  "topics": [
    {
      "key": "buergeramt",
      "label": "Bürgeramt",
      "problems": 412
    },
    {
      "key": "hochschule",
      "label": "Hochschule",
      "problems": 0
    },
    {
      "key": "bahn",
      "label": "Bahn und Nahverkehr",
      "problems": 288
    },
    {
      "key": "finanzamt",
      "label": "Finanzamt",
      "problems": 0
    },
    {
      "key": "krankenkasse",
      "label": "Krankenkasse",
      "problems": 0
    },
    {
      "key": "jobcenter",
      "label": "Jobcenter und Arbeitsagentur",
      "problems": 0
    },
    {
      "key": "auslaenderbehoerde",
      "label": "Ausländerbehörde",
      "problems": 0
    },
    {
      "key": "zulassung",
      "label": "Kfz-Zulassung",
      "problems": 0
    },
    {
      "key": "schule_kita",
      "label": "Schule und Kita",
      "problems": 0
    },
    {
      "key": "post",
      "label": "Post und Pakete",
      "problems": 0
    },
    {
      "key": "wohnen",
      "label": "Wohnen",
      "problems": 0
    },
    {
      "key": "gesundheit",
      "label": "Arztpraxis und Klinik",
      "problems": 0
    },
    {
      "key": "telekom",
      "label": "Internet und Telefon",
      "problems": 0
    },
    {
      "key": "anderes",
      "label": "Anderes",
      "problems": 0
    }
  ],
  "kinds": [
    {
      "key": "warten",
      "label": "Warten und Termine",
      "problems": 530
    },
    {
      "key": "formular",
      "label": "Formulare und Nachweise",
      "problems": 0
    },
    {
      "key": "portal",
      "label": "Portale und Apps",
      "problems": 0
    },
    {
      "key": "frist",
      "label": "Fristen und Bescheide",
      "problems": 0
    },
    {
      "key": "erreichbar",
      "label": "Niemand erreichbar",
      "problems": 0
    },
    {
      "key": "doppelt",
      "label": "Alles doppelt angeben",
      "problems": 0
    },
    {
      "key": "ort",
      "label": "Orte und Öffnungszeiten",
      "problems": 0
    },
    {
      "key": "anderes",
      "label": "Anderes",
      "problems": 0
    }
  ],
  "reach": [
    {
      "key": "hier",
      "label": "Nur an diesem Ort",
      "problems": 901
    },
    {
      "key": "land",
      "label": "Im ganzen Bundesland",
      "problems": 0
    },
    {
      "key": "bund",
      "label": "Überall in Deutschland",
      "problems": 0
    }
  ],
  "lands": [
    {
      "key": "10",
      "label": "Saarland",
      "problems": 0
    },
    {
      "key": "11",
      "label": "Berlin",
      "problems": 0
    },
    {
      "key": "12",
      "label": "Brandenburg",
      "problems": 0
    },
    {
      "key": "13",
      "label": "Mecklenburg-Vorpommern",
      "problems": 0
    },
    {
      "key": "14",
      "label": "Sachsen",
      "problems": 0
    },
    {
      "key": "15",
      "label": "Sachsen-Anhalt",
      "problems": 0
    },
    {
      "key": "16",
      "label": "Thüringen",
      "problems": 0
    },
    {
      "key": "01",
      "label": "Schleswig-Holstein",
      "problems": 0
    },
    {
      "key": "02",
      "label": "Hamburg",
      "problems": 0
    },
    {
      "key": "03",
      "label": "Niedersachsen",
      "problems": 0
    },
    {
      "key": "04",
      "label": "Bremen",
      "problems": 0
    },
    {
      "key": "05",
      "label": "Nordrhein-Westfalen",
      "problems": 0
    },
    {
      "key": "06",
      "label": "Hessen",
      "problems": 0
    },
    {
      "key": "07",
      "label": "Rheinland-Pfalz",
      "problems": 0
    },
    {
      "key": "08",
      "label": "Baden-Württemberg",
      "problems": 0
    },
    {
      "key": "09",
      "label": "Bayern",
      "problems": 214
    }
  ]
}

GET /feed.atom

Die neuesten Probleme als Atom-Feed, mit denselben Filtern wie /probleme, ohne cursor. Mehr unter Atom-Feed.

curl -s 'https://gehtbesser.org/api/offen/v1/feed.atom?ort=09761000'
Beispielantwort
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
  <id>https://gehtbesser.org/api/offen/v1/feed.atom?ort=09761000</id>
  <title type="text">Probleme in Augsburg · Geht besser.</title>
  <subtitle type="text">Was Menschen Zeit kostet, und was besser geht. Neueste zuerst.</subtitle>
  <updated>2026-10-20T09:05:31.000Z</updated>
  <link rel="self" type="application/atom+xml" href="https://gehtbesser.org/api/offen/v1/feed.atom?ort=09761000"/>
  <link rel="alternate" type="text/html" href="https://gehtbesser.org/"/>
  <author><name>Geht besser.</name><uri>https://gehtbesser.org/</uri></author>
  <icon>https://gehtbesser.org/icon.svg</icon>
  <entry>
    <id>urn:uuid:5b0e2c4a-8d1f-4c3b-9a6e-2f7d1c0b9e41</id>
    <title type="text">Der nächste freie Termin für den Ausweis ist in sieben Wochen</title>
    <link rel="alternate" type="text/html" href="https://gehtbesser.org/p/5b0e2c4a-8d1f-4c3b-9a6e-2f7d1c0b9e41"/>
    <published>2026-10-20T09:05:31.000Z</published>
    <updated>2026-10-20T09:05:31.000Z</updated>
    <category scheme="https://gehtbesser.org/api/offen/v1/themen#thema" term="buergeramt" label="Bürgeramt"/>
    <category scheme="https://gehtbesser.org/api/offen/v1/themen#art" term="warten" label="Warten und Termine"/>
    <category scheme="https://gehtbesser.org/api/offen/v1/orte" term="09761000" label="Augsburg"/>
    <summary type="text">In Augsburg · Bürgeramt · 14 kennen es · eine Lösung hat geholfen</summary>
    <content type="html">&lt;p&gt;Ich brauche einen neuen Personalausweis. Online ist der nächste freie Termin erst Mitte Dezember, am Telefon kommt nur eine Ansage. Kommt man morgens ohne Termin noch dran?&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://gehtbesser.org/m/0f6c2d9a-41b7-4e58-9c3a-7d2e8b5f1a60/w1080.webp&quot; width=&quot;1080&quot; height=&quot;1440&quot; alt=&quot;Ein Aushang an einer Amtstür: Termine nur nach Vereinbarung.&quot;&gt;&lt;/p&gt;&lt;p&gt;In Augsburg · Bürgeramt · 14 kennen es · eine Lösung hat geholfen&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://gehtbesser.org/p/5b0e2c4a-8d1f-4c3b-9a6e-2f7d1c0b9e41&quot;&gt;Auf Geht besser. ansehen&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
</feed>

GET /oembed

oEmbed für Links auf einen Beitrag. Mehr unter oEmbed.

curl -s 'https://gehtbesser.org/api/offen/v1/oembed?url=https%3A%2F%2Fgehtbesser.org%2Fp%2F5b0e2c4a-8d1f-4c3b-9a6e-2f7d1c0b9e41&format=json'
Beispielantwort
{
  "version": "1.0",
  "type": "rich",
  "provider_name": "Geht besser.",
  "provider_url": "https://gehtbesser.org/",
  "title": "Der nächste freie Termin für den Ausweis ist in sieben Wochen",
  "html": "<iframe src=\"https://gehtbesser.org/einbetten/p/5b0e2c4a-8d1f-4c3b-9a6e-2f7d1c0b9e41\" title=\"Der nächste freie Termin für den Ausweis ist in sieben Wochen · Geht besser.\" width=\"480\" height=\"280\" style=\"border:0;max-width:100%\" loading=\"lazy\"></iframe>",
  "width": 480,
  "height": 280,
  "cache_age": 60,
  "thumbnail_url": "https://gehtbesser.org/m/0f6c2d9a-41b7-4e58-9c3a-7d2e8b5f1a60/w640.webp",
  "thumbnail_width": 640,
  "thumbnail_height": 853
}

Die Felder

Ein Problem sieht in jeder Antwort gleich aus. Neue Felder können dazukommen; lies, was du brauchst, und übergeh, was du nicht kennst.

FeldTypBedeutung
idText (UUID)Die id des Problems. Sie ändert sich nie.
urlText (URL)Der Beitrag auf dem Board. Verlinke hierhin.
titleTextDer Titel, so wie er geschrieben wurde.
bodyTextDer Text, so wie er geschrieben wurde. Was beim Schreiben geschwärzt wurde, steht als Platzhalter darin, etwa [Telefonnummer] oder [Name].
placeObjekt oder nullDie Gemeinde: ags (8 Ziffern), name, land (01 bis 16) und landName.
topicObjekt oder nullDas Thema als key und label, etwa buergeramt und Bürgeramt.
kindObjekt oder nullDie Art, etwa warten und Warten und Termine.
reachObjekt oder nullWie weit es reicht: hier, land oder bund.
counts.kennZahlWie oft jemand „Kenn ich.“ gesagt hat.
counts.kenn7DaysZahlDavon in den letzten sieben Tagen.
counts.fixesZahlSichtbare Lösungen.
counts.fixChecksZahlBei der Lösung, die am meisten geholfen hat: wie viele sie ausprobiert haben.
counts.fixWorkedZahlBei derselben Lösung: wie viele sagen, sie hat geholfen.
solvedtrue oder falsetrue, wenn die beste Lösung den meisten geholfen hat, die sie ausprobiert haben: fixWorked mal zwei ist mindestens fixChecks.
mediaListeBis zu vier Fotos oder ein Clip, siehe unten.
createdAtZeitpunktWann es geschrieben wurde. Danach ist die Liste sortiert.
visibleAtZeitpunkt oder nullWann es nach der Prüfung sichtbar wurde.
fixesListeNur bei /probleme/{id}: die sichtbaren Lösungen.

Eine Lösung

FeldTypBedeutung
id, title, bodyTextWie beim Problem.
linkText (URL) oder nullDer Link, den die Person angegeben hat, immer https.
ownProducttrue oder falsetrue, wenn die Person das selbst anbietet.
kindObjekt oder nullwerkzeug, einstellung, anlaufstelle oder weg.
counts.checksZahlWie viele sie ausprobiert haben.
counts.workedZahlWie viele sagen, sie hat geholfen.
media, createdAt, visibleAtWie beim Problem.

Fotos und Clips

FeldTypBedeutung
urlText (URL)Ein Foto 1080 Pixel breit als WebP, ein Clip als MP4 ohne Ton.
width, heightZahlDie Größe der Datei unter url, in Pixeln.
altText oder nullDie Beschreibung, von der Person selbst geschrieben.
kindphoto oder videoFoto oder Clip.
posterText (URL) oder nullDas Standbild eines Clips.

Dasselbe Foto gibt es unter derselben Adresse auch 640 und 1600 Pixel breit und als AVIF: ersetze w1080.webp durch w640.webp, w1600.avif und so weiter. Gesichter sind schon auf dem Telefon der Person unkenntlich gemacht, Metadaten und Ton sind entfernt.

Lade Bilder von hier und speicher sie nicht auf Dauer. Wird ein Beitrag zurückgezogen oder entfernt, verschwindet er aus allen Antworten, seine Adressen antworten mit 404. Wenn du Beiträge bei dir speicherst, gleich sie regelmäßig ab und lösch, was hier nicht mehr steht.

Blättern

/probleme liefert Seiten von bis zu 100 Problemen, neueste zuerst, sortiert nach createdAt und id. Gibt es mehr, steht in nextCursor der Schlüssel zur nächsten Seite und in next gleich die ganze Adresse, auch im Header Link: <…>; rel="next". Auf der letzten Seite sind beide null. Der Cursor gilt nur mit denselben Filtern. Kommt zwischendurch ein neuer Beitrag dazu, verrutscht nichts: Er steht vorn, die Seiten dahinter bleiben, wie sie sind.

let url = 'https://gehtbesser.org/api/offen/v1/probleme?land=09&limit=100'
      while (url) {
        const page = await (await fetch(url)).json()
        for (const p of page.items) console.log(p.createdAt, p.title)
        url = page.next
      }

Neue Beiträge erscheinen erst, wenn eine Person aus dem Team sie gelesen hat. Ein Beitrag kann also mit einem createdAt von gestern heute dazukommen. Wenn du regelmäßig abholst, frag mit seit einen Tag weiter zurück und gleich nach id ab.

Zwischenspeichern

Jede Antwort kommt mit Cache-Control: public, max-age=60, stale-while-revalidate=300: 60 Sekunden lang ist sie frisch, danach darf ein Zwischenspeicher sie noch fünf Minuten zeigen, während er eine neue holt. Dazu kommt ein schwaches ETag. Schick es beim nächsten Mal als If-None-Match mit. Hat sich nichts geändert, kommt 304 Not Modified ohne Inhalt, und du sparst dir das Lesen.

curl -si 'https://gehtbesser.org/api/offen/v1/themen' | grep -i etag
      etag: W/"…"

      curl -si 'https://gehtbesser.org/api/offen/v1/themen' -H 'If-None-Match: W/"…"'
      HTTP/2 304

Browser machen das mit fetch von selbst.

Grenzen

  • 600 Abfragen in 10 Minuten je Adresse, über alle Endpunkte. Darüber kommt 429 mit Retry-After in Sekunden. Eine 304 zählt mit, ist aber schneller und leichter.
  • Höchstens 100 Probleme je Seite.
  • Die Ortssuche braucht mindestens zwei Buchstaben und liefert höchstens 12 Treffer.

Brauchst du mehr, etwa für eine Auswertung, schreib uns über Kontakt.

CORS

Alle Endpunkte unter /api/offen/ antworten mit Access-Control-Allow-Origin: *, auf GET und auf OPTIONS. Du kannst also aus jeder Seite direkt im Browser lesen. Cookies braucht es nicht, und die Schnittstelle setzt keine. Lesbar sind auch die Header ETag, Link und Retry-After.

const res = await fetch('https://gehtbesser.org/api/offen/v1/probleme?thema=bahn&limit=5')
      const { items } = await res.json()

Fehler

Jeder Fehler ist JSON in derselben Form, mit einem Code für dein Programm und einem Satz auf Deutsch, den du so zeigen kannst.

{
  "error": {
    "code": "invalid_parameter",
    "message": "Gib bei „ort“ einen Gemeindeschlüssel (AGS) mit 8 Ziffern an, zum Beispiel 09761000."
  }
}
CodeStatusBedeutung
invalid_parameter400Ein Wert passt nicht, etwa ein ort mit 7 Ziffern.
unknown_parameter400Diesen Parameter gibt es nicht. Das fängt Tippfehler ab.
not_found404Gibt es nicht, oder nicht mehr.
rate_limited429Zu viele Abfragen. Warte so viele Sekunden, wie Retry-After sagt.
not_implemented501oEmbed in einem anderen Format als json.
server_error500Bei uns ist etwas schiefgegangen. Versuch es gleich noch einmal.

Einbetten

Zwei Seiten sind dafür gemacht, in einem iframe auf deiner Seite zu stehen: ein Problem und eine Gemeinde. Sie setzen keine Cookies, speichern nichts auf dem Gerät und zählen niemanden. Jeder Link darin öffnet das Board in einem neuen Tab. Unten steht in jeder Einbettung „Kein Angebot einer Behörde“, damit niemand sie für ein Angebot deiner Verwaltung hält.

Eine Gemeinde

Die Zahlen der Gemeinde und ihre fünf neuesten Probleme. Such dir den Ort aus und kopier den Code.

Dein Code für Augsburg

So sieht es aus

Ein Problem

Ein Problem als Karte, 480 mal 280 Pixel. Sie passt sich jeder Breite ab 280 Pixeln an. Ersetze die id durch die des Beitrags, sie steht in seinem Link.

<iframe src="https://gehtbesser.org/einbetten/p/5b0e2c4a-8d1f-4c3b-9a6e-2f7d1c0b9e41" title="Der nächste freie Termin für den Ausweis ist in sieben Wochen · Geht besser." width="480" height="280" style="border:0;max-width:100%" loading="lazy"></iframe>

Für Seiten, die Links von selbst einbetten, gibt es oEmbed.

Atom-Feed

Für Feedreader und alles, was Feeds liest: die neuesten Probleme, mit denselben Filtern wie /probleme. Jeder Eintrag verlinkt auf den Beitrag auf dem Board, trägt Thema, Art und Ort als Kategorien und zeigt das erste Foto.

  • Eine Gemeinde: https://gehtbesser.org/api/offen/v1/feed.atom?ort=09761000
  • Ein Thema in einem Land: https://gehtbesser.org/api/offen/v1/feed.atom?land=09&thema=bahn
  • Was gelöst ist: https://gehtbesser.org/api/offen/v1/feed.atom?status=geloest

oEmbed

Viele Redaktionssysteme machen aus einem Link von selbst eine Einbettung, wenn der Anbieter oEmbed kann. Der Endpunkt ist https://gehtbesser.org/api/offen/v1/oembed, für Links der Form https://gehtbesser.org/p/{id}. Er antwortet mit dem Typ rich: html ist das iframe der Einbettung oben, nie breiter als maxwidth und nie höher als maxheight. Hat der Beitrag ein Foto, kommt es als Vorschaubild mit.

curl -s 'https://gehtbesser.org/api/offen/v1/oembed?url=https%3A%2F%2Fgehtbesser.org%2Fp%2F5b0e2c4a-8d1f-4c3b-9a6e-2f7d1c0b9e41&maxwidth=400'

Was nie drin ist

Die offenen Daten zeigen, was auf dem Board ohnehin alle sehen. Mehr nicht.

  • Keine Pseudonyme. Wer etwas geschrieben hat, steht nicht in den Daten.
  • Keine Konto-ids und nichts, womit sich Beiträge einer Person zusammenführen ließen. Auch nicht, wer „Kenn ich.“ gesagt oder eine Lösung bewertet hat, nur wie viele.
  • Nichts, was wartet, zurückgezogen oder entfernt wurde. Nur Beiträge, die gerade sichtbar sind.
  • Keine Daten aus der Prüfung: keine Meldungen, keine Fälle, keine Entscheidungen, keine Einschätzung einer Maschine.
  • Keine Adressen: kein Feld für eine Straße, eine Mailadresse oder eine IP-Adresse. Ein Problem steht an einer Gemeinde, nie bei einer Person.

Wie das Board prüft und wie oft Menschen wie entschieden haben, steht als Summe in der Transparenz.

Nutzung

Du darfst die Inhalte zeigen und verlinken. Nenn dabei die Quelle „Geht besser.“ und verlinke den Beitrag, also das Feld url. Die genaue Lizenz folgt vor der Öffnung.

Die Gemeinden und ihre Schlüssel stammen aus dem Gemeindeverzeichnis von Destatis, Gebietsstand 30.09.2026, unter der Datenlizenz Deutschland, Namensnennung 2.0.