TuWasGutes API — Dokumentation

Base URL: https://tuwasgutes.app

Alle Endpunkte geben JSON zurück. Sprache wählbar via lang=de oder lang=en (Default: de).

Terminologie: In der App und in dieser Dokumentation heißt es immer Aktion — das ist der Begriff, den Nutzer sehen. Technisch (JSON-Keys, Endpunkt-Pfade) lautet der interne Name cause. Beide Begriffe meinen dasselbe Objekt.

Was ist das?

Die TuWasGutes API gibt deiner App oder Plattform täglich eine kuratierte zivile Aktion — spenden, Petition unterschreiben, Brief schreiben. Ein API-Call, vollständig automatisiert, kein Redaktionsteam nötig. Inhalte stammen aus verifizierten deutschen NGOs, werden KI-angereichert mit Dringlichkeitskontext und Wirkungsaussagen, und täglich um 02:00 Uhr CET aktualisiert.

Authentifizierung

Sende deinen API-Key als HTTP-Header in jedem Request:

X-Api-Key: your-key-here

Fehlende oder ungültige Keys liefern HTTP 401. Keys werden manuell ausgestellt — siehe „API-Key anfragen" unten.

Rate Limits

Keine Call-Limits. Kein Usage-Metering. Pauschalpreis pro Produkt.

Zur technischen Missbrauchsprävention gilt ein Limit von 1 Request pro Sekunde pro API-Key. Dieses Limit wird bei normalem Nutzungsverhalten niemals ausgelöst.

Bei Überschreitung: HTTP 429, Body {"error":"Rate limit exceeded. Retry after 1 second."} — nach 1 Sekunde erneut versuchen.

Endpunkte

GET /api/v1/daily-action

Gibt die algorithmisch ausgewählte Aktion des Tages zurück (cause-Objekt + action-Objekt). Für alle API-Key-Inhaber an einem Tag identisch. Aktualisierung täglich um 02:00 Uhr CET.

ParameterTypDefaultBeschreibung
langstringdeSprachcode: de oder en

Response 200:

{
  "cause": {
    "id": "abc123",
    "slug": "seenotrettung-im-mittelmeer-stoppen",
    "title": "Seenotrettung im Mittelmeer stoppen",
    "summary": "Tausende Menschen riskieren ihr Leben auf der Flucht...",
    "category": "Petition",
    "organisationName": "WeAct",
    "organisationUrl": "https://weact.campact.de",
    "imageUrl": "https://assets.tuwasgutes.app/causes/abc123.jpg",
    "fundingProgressPct": 94,
    "deadline": "2026-05-31",
    "urgency_score": {
      "total": 80,
      "breakdown": {
        "deadline_proximity": 60,
        "funding_gap": 20,
        "recency": 0,
        "engagement": 0
      },
      "signals": {
        "days_until_deadline": 5,
        "progress_percentage": 94,
        "days_since_import": 18,
        "has_above_average_ctr": false
      }
    },
    "source_name": "betterplace",
    "source_url": "https://www.betterplace.org/...",
    "original_platform": "betterplace",
    "refreshed_at": "2026-05-17T02:00:00Z"
  },
  "action": {
    "type": "Petition",
    "headline": "Jetzt unterzeichnen und den Druck erhöhen",
    "whyNow": "Der Bundestag stimmt nächste Woche über neue Grenzschutzgesetze ab...",
    "whyYou": "Deine Unterschrift zählt — 132 Abgeordnete sind noch unentschlossen.",
    "impactStatement": "Mit deiner Unterschrift erhöhst du den öffentlichen Druck...",
    "isAiGenerated": true,
    "language": "de"
  }
}
FeldNullableHinweise
cause.deadlineJaNull wenn keine Deadline existiert
cause.imageUrlJaNull wenn die Quelle kein Bild liefert
cause.fundingProgressPctJaNull wenn keine Funding- oder Unterschriftendaten vorhanden
cause.urgency_scoreNeinImmer vorhanden — live berechnet aus den gespeicherten Signalen
cause.urgency_score.signals.has_above_average_ctrNeinProxy: cause.urgencyScore > 75 — echte CTR wird derzeit nicht pro Cause gespeichert
cause.source_name / source_url / original_platformNeinPflichtattribution — muss in der Integration sichtbar bleiben
actionJaNull wenn noch keine KI-Aktion für diese Cause und Sprache generiert wurde
action.whyNow / impactStatementNeinKI-generiert — immer vorhanden wenn action nicht null

GET /api/v1/causes

Paginierte Liste aller aktiven Aktionen (cause-Objekte), sortiert nach Urgency Score absteigend.

ParameterTypDefaultBeschreibung
pageinteger1Seitennummer, 1-basiert
pageSizeinteger20Einträge pro Seite, max. 50
categorystringFilter: Spenden, Petition, Brief
langstringdeSprachcode: de oder en
{
  "total": 142,
  "page": 1,
  "pageSize": 20,
  "items": [
    {
      /* cause object: gleiche Felder wie cause in /daily-action */
      /* inkl. urgency_score breakdown, source_name, source_url, original_platform */
      /* ohne: description, fundingGoal, fundingCurrent, leverageScore, actionsToTippingPoint */
      /* kein action-Objekt in der Liste */
    }
  ]
}

GET /api/v1/causes/{slug}

Einzelne Aktion nach Slug, inklusive vollständigem Urgency Score.

Urgency Score — vollständige Spezifikation

Der Urgency Score ist der Kernalgorithmus von TuWasGutes. Er bestimmt, welche Aktion als Tagesaktion ausgewählt wird, und wie Aktionen in der Gesamtliste gereiht werden. Der Score ist transparent und in jeder API-Antwort vollständig enthalten.

Score-Struktur

{
  "urgency_score": {
    "total": 80,
    "breakdown": {
      "deadline_proximity": 60,
      "funding_gap": 20,
      "recency": 0,
      "engagement": 0
    },
    "signals": {
      "days_until_deadline": 5,
      "progress_percentage": 94,
      "days_since_import": 18,
      "has_above_average_ctr": false
    }
  }
}

Scoring-Regeln

SignalBedingungPunkte
deadline_proximityDeadline innerhalb 30 Tage+30
deadline_proximityDeadline innerhalb 7 Tage+60 (ersetzt +30)
deadline_proximityKeine Deadline0
funding_gapFortschritt zwischen 70% und 95%+20
funding_gapAußerhalb dieses Bereichs oder unbekannt0
recencyImportiert innerhalb der letzten 14 Tage+10
recencyÄlter als 14 Tage0
engagementÜberdurchschnittliche CTR (min. 10 Impressions)+10
engagementUnterdurchschnittlich oder unzureichende Daten0

Maximal möglicher Score: 100 Punkte.

Suppressionsregeln

Supprimierte Aktionen erscheinen nicht in /api/v1/daily-action, aber mit intaktem Score in /api/v1/causes.

Beispiel-Scores

Beispiel A — Hohe Dringlichkeit

Petition, 94% unterschrieben, Deadline in 5 Tagen, importiert vor 18 Tagen

deadline_proximity+60
funding_gap+20
recency0
engagement0
Total: 80
Beispiel B — Neue Cause, keine Deadline

Spendenkampagne, 40% finanziert, keine Deadline, importiert vor 3 Tagen

deadline_proximity0
funding_gap0
recency+10
engagement0
Total: 10
Beispiel C — Viral, kurz vor Ziel

Petition, 88% unterschrieben, Deadline in 25 Tagen, hohe CTR

deadline_proximity+30
funding_gap+20
recency0
engagement+10
Total: 60

Preise

Pauschalpreis. Keine Call-Limits, kein Usage-Metering, keine Überraschungen.

Kostenlos testen
€0 / erster Monat

Kein Risiko. Einfach anfangen.

  • Alle API-Endpunkte inklusive
  • Tägliche Aktualisierung
  • Kategoriefilter nach Thema
  • Keine Kreditkarte nötig
API-Zugang
€49/Monat

Alles inklusive, monatlich kündbar.

  • Alle API-Endpunkte inklusive
  • Tägliche Aktualisierung
  • Kategoriefilter nach Thema
  • Support per E-Mail

Alle Preise zzgl. MwSt. Monatlich kündbar. Größere Integration geplant? Schreib uns einfach.

Attribution

Alle Integrationen müssen überall, wo eine Cause angezeigt wird, folgende Attribution sichtbar darstellen:

Quelle: TuWasGutes (tuwasgutes.app)

Das Feld source_url in jeder Antwort muss als anklickbarer Attributionslink gerendert werden.

Code-Beispiele

JavaScript

const response = await fetch(
  'https://tuwasgutes.app/api/v1/daily-action?lang=de',
  { headers: { 'X-Api-Key': 'your-key-here' } }
);
const cause = await response.json();

console.log(cause.title);
console.log(`Urgency score: ${cause.urgency_score.total}`);
console.log(`Days until deadline: ${cause.urgency_score.signals.days_until_deadline}`);

C#

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-Api-Key", "your-key-here");

var cause = await client.GetFromJsonAsync<CauseDto>(
  "https://tuwasgutes.app/api/v1/daily-action?lang=de"
);

Console.WriteLine(cause.Title);
Console.WriteLine($"Urgency score: {cause.UrgencyScore.Total}");

Fehler-Responses

401{ "error": "Missing X-Api-Key header." }
401{ "error": "Invalid or expired API key." }
403{ "error": "This endpoint requires Growth or Enterprise tier." }
429{ "error": "Rate limit exceeded. Retry after 1 second." }
503{ "error": "No action available today." }

API-Key anfragen

Schreib eine E-Mail an api@tuwasgutes.app mit:


Keys werden innerhalb von 48 Stunden ausgestellt.

Jetzt API-Key anfragen

Erster Monat kostenlos  ·  kein Vertrag  ·  kein Call-Limit   ← API für Unternehmen