Mit der Turq-API trägt dein Gerät selbst ins Logbuch deines Beckens ein: Messwerte von deinem Sensor, Dosierungen deiner Dosierpumpe und erledigte Aufgaben. Es kann dir eine Push-Nachricht aufs Handy schicken und abfragen, was es zum Arbeiten braucht, etwa die Eingabegrenzen eines Parameters oder den letzten Messwert.
Messwerte eintragen, auch mehrere Werte eines Zeitpunkts in einer Anfrage
eine Dosierung festhalten, etwa wenn deine Dosierpumpe gelaufen ist
den aktuell fälligen Termin einer Aufgabe abhaken, zum Beispiel wenn dein Futterautomat gefüttert hat
dir eine Push-Nachricht aufs eigene Handy schicken
deine Becken, Parameter mit Einheit und Eingabegrenzen, Dosierprodukte und Aufgaben-Vorlagen abfragen, auf Wunsch mit Zielbereich, Restmenge und Fälligkeit
den letzten Messwert je Parameter abfragen
mit einem Selbsttest prüfen, ob dein Key funktioniert
Was sie nicht kann
Sie liefert keinen Verlauf. Lesen kannst du nur den letzten Wert je Parameter, keine älteren Messwerte, keine Fotos und kein Journal.
Sie steuert keine Technik. Turq schaltet keine Pumpe, keinen Heizer und kein Licht. Gelesene Werte sind auch nicht dafür gedacht, dass dein Gerät damit Technik schaltet, siehe Nicht zum Steuern.
Sie legt nichts an. Becken, Aufgaben-Vorlagen und Dosierprodukte richtest du in der App ein.
Sie ist kein Alarmsystem. Push-Nachrichten verschickt sie nur, wenn dein Gerät sie auslöst, und ob sie ankommen, hängt auch von Handy, Netz und Push-Dienst ab. Verlass dich bei einer kritischen Störung nicht allein darauf.
Die API ist ohne Abo nutzbar, mit einem kostenlosen, gesicherten Konto. Sie schreibt nur in Becken, die du auch in der App bearbeiten darfst, und liest nur Becken, die du in der App siehst.
Die vollständige technische Referenz findest du weiter unten und als openapi.yaml zum Herunterladen. Sie ist auf Englisch.
Was du brauchst
Ein gesichertes Turq-Konto. Gastkonten können keine Keys anlegen. Das Sichern ist kostenlos und geht in der App.
Ein Becken, das du in der App siehst. Das kann dein eigenes sein oder eines, das jemand mit dir teilt. Zum Eintragen musst du es in der App bearbeiten dürfen; ist es schreibgeschützt, nimmt es über die API nichts an, lesen kannst du es aber weiter.
Für Aufgaben und Dosierungen eine Aufgaben-Vorlage oder ein Dosierprodukt, das du vorher in der App angelegt hast.
Ein Gerät oder Programm, das HTTPS-Anfragen mit eigenem Header senden kann, zum Beispiel Home Assistant, ein ESPHome-Gerät, Node-RED oder cURL.
Für Messwerte eine richtig gestellte Uhr, denn jeder Messwert trägt einen Zeitstempel.
Die Regel dahinter ist einfach: Die API schreibt nur dort, wo du auch in der App schreiben darfst, und liest nur, was du in der App siehst. Verlierst du den Zugriff auf ein geteiltes Becken, kann dein Key dort weder eintragen noch lesen.
Wenn neue Bedingungen erscheinen
Veröffentlicht Turq neue Nutzungsbedingungen oder eine neue Datenschutzerklärung, bittet dich die App beim nächsten Öffnen um deine Zustimmung. Deine Keys laufen dagegen eine Übergangsfrist weiter, damit deine Geräte nicht von einem Tag auf den anderen stehen bleiben. Das gilt, wenn du der vorigen Fassung zugestimmt hattest.
Ende der Frist: Solange sie läuft, tragen die Antworten der API den Header X-Turq-Consent-Deadline. Er nennt das Ende der Frist als ISO-8601-Zeitpunkt in UTC. Die App und die Mail zu den neuen Bedingungen nennen dir den letzten Tag; der Zeitpunkt im Header liegt etwas danach, damit dieser Tag in jeder Zeitzone ganz zählt.
Nach der Frist: Hast du bis dahin nicht zugestimmt, antwortet die API mit 403 und CONSENT_REQUIRED. Keys und Daten bleiben erhalten. Sobald du in der App zustimmst, laufen deine Keys sofort wieder.
Keine Verlängerung: Erscheint während der Frist noch eine neue Fassung, endet die Frist trotzdem zum genannten Zeitpunkt.
Ohne Frist kein Header: Fehlt der Header, hast du zugestimmt, oder es läuft keine Frist. Er nennt nur das Ende der Übergangsfrist, nicht unbedingt das Ende des Zugriffs: Läuft dein Konto aus einem anderen Grund länger weiter, etwa nach einer Ablehnung neuer Bedingungen, ändert sich der Header nicht.
Tipp: Lass dein Gerät den Header auswerten und dir rechtzeitig einen Hinweis zeigen, etwa im Dashboard.
In drei Schritten zum ersten Eintrag
Key anlegen. Öffne in der App Einstellungen › Integrationen › API-Keys und tipp auf „API-Key erstellen“. Gib dem Key einen Namen, etwa „Home Assistant“, und wähl, was er darf und für welche Becken er gilt. Kopier den Key sofort, denn Turq zeigt ihn nur dieses eine Mal.
Verbindung testen. Schick POST https://api.turq.app/v1/ping mit dem Header Authorization: Bearer <dein Key>. Antwortet die API mit "valid": true, passt der Key. Die Antwort nennt auch, was der Key darf, und die IDs seiner Becken. Der Test trägt nichts ein.
Verbindung testenbash
curl -i -X POST "https://api.turq.app/v1/ping" \
-H "Authorization: Bearer <DEIN_API_KEY>"
Befehl einbauen. Direkt nach dem Anlegen, oder später über „Gerät einrichten“ am Key, baut dir die App den passenden Befehl mit deinen IDs, etwa für Home Assistant oder cURL. Füg ihn ein und ersetz die Platzhalter. Nach dem ersten erfolgreichen Eintrag schickt dir Turq eine Push-Nachricht, dass dein Gerät verbunden ist.
Mit deinem Key umgehen
Ein Key ist wie ein Passwort für deine Becken: Wer ihn hat, kann dort in deinem Namen eintragen oder mitlesen, je nachdem, was der Key darf.
Halte ihn geheim. Turq speichert nur einen Hash des Keys. Nach dem Anlegen kann ihn niemand mehr anzeigen, auch wir nicht.
Ein Key pro Gerät. Dann siehst du in jeder Push-Nachricht, von welchem Gerät sie kommt, und kannst ein einzelnes Gerät trennen, ohne die anderen anzufassen. Liest und schreibt ein Gerät, bekommt es trotzdem nur einen Key mit beiden Rechten.
Nur die nötigen Rechte. Ein Temperaturfühler braucht keine Push-Nachrichten und meist auch keine Leserechte. Rechte und Becken legst du beim Anlegen fest; für andere Rechte legst du einen neuen Key an.
Nur in einen Secret-Speicher. In Home Assistant und ESPHome gehört der Key in die secrets.yaml, in Node-RED zu den Zugangsdaten der Node. Nie in JavaScript, das im Browser läuft, etwa in einer Dashboard-Karte: Dort kann ihn jeder auslesen, der das Dashboard öffnet.
Nie in öffentliche Repos, Foren oder Screenshots. Alle Keys beginnen mit turq_sk_. Danach kannst du suchen, bevor du eine Konfiguration teilst.
Widerrufen geht jederzeit unter Einstellungen › Integrationen › API-Keys › „Key widerrufen“. Das wirkt sofort. Ist ein Key in falsche Hände geraten, widerruf ihn und leg einen neuen an.
Was ein Key verrät, wenn er in falsche Hände gerät
Mit Leserechten: die Namen deiner Becken, Dosierprodukte und Aufgaben-Vorlagen, deine Parameter und je nach Rechten auch Zielbereiche, Restmengen, fällige Aufgaben und die letzten Messwerte. Immer nur für die Becken des Keys.
Mit Schreibrechten kann jemand in deinem Namen eintragen und dir, wenn der Key das darf, Push-Nachrichten schicken. Darf der Key auch lesen, findet ein Fremder damit leichter die IDs, die er zum Schreiben braucht, und seine Einträge fallen weniger auf.
Kein Key verrät deine Anmeldedaten, deine E-Mail-Adresse oder Becken, die nicht zu ihm gehören.
Wie viele Keys du gleichzeitig aktiv haben kannst, zeigt dir die App.
Werte und Einstellungen lesen
Dein Gerät kann abfragen, was es zum Arbeiten braucht. Dafür gibt es drei Leserechte. Keins schließt ein anderes ein, du wählst also genau, was ein Key sehen darf. Beim Anlegen findest du sie in der App unter „Darf lesen“; vorausgewählt ist dort nichts.
CONFIG_READ, in der App „Grunddaten“: die Becken des Keys, die Parameter mit Einheit, Nachkommastellen, Schrittweite und plausiblem Bereich, die Dosierprodukte und die Aufgaben-Vorlagen, jeweils mit ihren IDs. So kennt dein Gerät die erlaubten Eingaben, bevor es einen Wert schickt.
STATUS_READ, in der App „Aktueller Stand“: ergänzt diese Antworten um den Zustand: den Zielbereich je Parameter, die Restmenge je Dosierprodukt und ob eine Aufgabe gerade fällig ist und wann sie als Nächstes fällig wird. Allein bringt es nichts, deshalb wählst du es in der App zusammen mit „Grunddaten“.
MEASUREMENTS_READ, in der App „Letzte Messwerte“: den neuesten Wert je Parameter, mit Zeitpunkt und Herkunft. Ältere Werte liefert die API nicht.
Lese- und Schreibrechte lassen sich auf einem Key kombinieren. Ein Gerät, das liest und einträgt, braucht also nur einen Key.
Ältere Keys können nur schreiben. Die Rechte eines Keys lassen sich nicht ändern, auch Keys aus der Zeit vor Version 1.1 bekommen kein Leserecht dazu. Leg zum Lesen einen neuen Key an und widerruf den alten, sobald dein Gerät umgezogen ist.
Schreibgeschützte Becken bleiben lesbar. Nur Einträge lehnt die API dort mit AQUARIUM_LOCKED ab. In der Liste der Becken zeigt readOnly, welche das sind.
Geteilte Becken: Du liest sie, solange du in der App Zugriff hast. Mitglieder eines Beckens, das du teilst, können für ihre Geräte ebenfalls Keys zum Lesen anlegen. Du siehst diese Geräte in der App beim Becken unter „Geräte der Mitglieder“ und kannst sie dort trennen.
Beispiel: ein Drehregler am Becken
Neben dem Becken hängt ein kleiner Drehregler mit Display, etwa auf Basis eines ESP32. Du misst KH mit dem Tropftest, drehst den Wert ein und drückst. Dafür braucht er einen einzigen Key mit CONFIG_READ, MEASUREMENTS_READ und MEASUREMENTS_WRITE:
Beim Start fragt er GET /v1/aquariums/<Becken-ID>/parameters?parameters=kh ab und bekommt Einheit, Schrittweite, Nachkommastellen und den plausiblen Bereich. So bietet der Regler nur Werte an, die Turq auch annimmt.
Dann holt er mit GET …/measurements/latest?parameters=kh den letzten Wert und zeigt ihn mit seinem Alter an.
Nach dem Messen schickt er den eingedrehten Wert mit POST …/measurements und einem Idempotency-Key. So entsteht auch bei einer Wiederholung nach einem Verbindungsabbruch nur ein Eintrag.
Bekommt der Key noch TASKS_WRITE, hakt derselbe Regler die Aufgabe „KH messen“ gleich mit ab. Mit STATUS_READ zeigt er vorher an, ob sie fällig ist.
Wie oft dein Gerät abfragen sollte
Struktur (Becken, Parameter, Dosierprodukte, Aufgaben-Vorlagen): beim Start und danach etwa stündlich. Sie ändert sich selten.
Letzter Wert: höchstens alle 5 Minuten. Öfter fragen macht ihn nicht frischer, denn er ändert sich erst, wenn jemand misst und einträgt.
Bedingt abfragen spart Datenvolumen: Schick den ETag der letzten Antwort als If-None-Match mit. Hat sich nichts geändert, kommt 304 ohne Inhalt. Bei den Grenzen zählt ein 304 aber wie jede andere Abfrage: Er spart Daten, keine Abfragen.
Bei 429 wartest du die Sekunden aus Retry-After ab und machst dann im gewohnten Takt weiter.
Header beim Lesen
ETag (Antwort): kennzeichnet den Inhalt der Antwort. Heb ihn zusammen mit der Antwort auf und schick ihn unverändert zurück, auch mit einem W/ am Anfang.
If-None-Match (Anfrage): der aufgehobene ETag. Antwortet die API mit 304, gilt deine aufgehobene Antwort weiter.
Cache-Control: private, no-store (Antwort): Proxys und Browser speichern Leseantworten nicht. Dein Gerät darf sie selbst aufheben.
Date (Antwort): die Serverzeit. Rechne das Alter eines Werts aus timestamp und diesem Header aus, nicht mit der Uhr deines Geräts.
X-Turq-Consent-Deadline (Antwort): nur während einer Übergangsfrist nach neuen Bedingungen gesetzt.
Wenn das Lesen nicht klappt
SCOPE_DENIED bei einem älteren Key: Er kann nur schreiben. Leg einen neuen Key mit Leserechten an.
SCOPE_DENIED trotz Leserecht: Jede Route braucht ihr eigenes Recht. …/measurements/latest braucht MEASUREMENTS_READ, die anderen Leserouten brauchen CONFIG_READ.
SERVICE_DISABLED nur beim Lesen: Wir haben das Lesen vorübergehend pausiert, Einträge nimmt die API weiter an. Zeig den zuletzt gelesenen Stand mit seinem Alter an und frag später wieder.
CONSENT_REQUIRED: Die Übergangsfrist nach neuen Bedingungen ist vorbei. Sobald du in der App zustimmst, antwortet die API sofort wieder.
AQUARIUM_NOT_ALLOWED: Das Becken gibt es nicht mehr, du hast keinen Zugriff mehr darauf, oder es gehört nicht zum Key. GET /v1/aquariums und der Selbsttest nennen die Becken, die dein Key gerade nutzen kann.
304 ohne Inhalt: kein Fehler. Seit deiner letzten Abfrage hat sich nichts geändert. Hat dein Gerät nichts aufgehoben, etwa nach einem Neustart, frag ohne If-None-Match.
Ein Parameter fehlt in der Antwort: Es gibt noch keinen Wert, der Parameter ist in Turq nicht aktiv, oder sein Schlüssel ist falsch geschrieben. Unbekannte Schlüssel überspringt die API, statt einen Fehler zu melden.
value ist null oder operator ist gesetzt: Der Wert wurde als Grenzangabe eingetragen, etwa „kleiner als“ oder „unter der Nachweisgrenze“ (belowDetection). Zeig das mit an, statt nur eine Zahl.
VALIDATION_FAILED bei ?parameters=: Schick die Schlüssel als eine kommagetrennte Liste, etwa parameters=kh,ca, nicht als parameters[]=.
Nicht zum Steuern von Geräten
Gelesene Werte sind zum Anzeigen da: auf einem Display am Becken, in deinem Dashboard, in einer Erinnerung. Turq unterstützt es nicht, damit Technik zu steuern, also etwa eine Dosierpumpe, einen Heizer oder einen Nachfüller nach einem Turq-Wert zu schalten. Rezepte dafür gibt es hier deshalb nicht.
Der Grund: Ein Wert in Turq ist ein Eintrag im Logbuch, keine Messung in Echtzeit.
Er kann falsch sein. Ein Tippfehler, ein altes Reagenz oder ein driftender Sensor landet im Logbuch wie jeder andere Wert.
Er kann rückdatiert sein.timestamp ist der Zeitpunkt, den der Eintragende angegeben hat, nicht der Eingang bei Turq.
Er kann von jemand anderem stammen. Mitglieder eines geteilten Beckens und ihre Geräte tragen ins selbe Logbuch ein.
Er kann fehlen. Die API kann pausiert sein, eine Grenze kann erreicht sein, oder die Verbindung fehlt. Wir sichern keine Verfügbarkeit zu.
Damit du einen Wert einordnen kannst, trägt er origin (auf welchem Weg er ins Logbuch kam, etwa per App, Laborimport oder API), viaApi (ob ein Gerät ihn mit einem Key eingetragen hat) und timestamp. Zeig das Alter eines Werts immer mit an.
Kurz gesagt
Kann ein falscher oder fehlender Wert deinen Tieren schaden, gehört er nicht in eine Regelung. Regel deine Technik mit Sensoren, die direkt an deinem Steuergerät hängen, und nutze Turq als Logbuch daneben.
Namen nur als Text anzeigen
Die Namen von Becken, Dosierprodukten und Aufgaben-Vorlagen haben Menschen eingetippt, bei geteilten Becken auch Mitglieder. Turq entfernt Steuerzeichen und kürzt lange Namen, prüft aber nicht, was drinsteht.
Zeig sie nur als Text an. Setz sie nie ungeprüft in HTML, Code, Templates oder Befehle ein.
Gib sie nicht an Sprachassistenten oder Chatbots weiter, die Geräte schalten dürfen. Ein Name kann wie eine Anweisung formuliert sein.
Arbeite mit IDs, nicht mit Namen. Namen können sich jederzeit ändern und müssen nicht eindeutig sein.
Rezepte
Hier siehst du für verbreitete Systeme, wie die Anfrage aussieht. Für Home Assistant und cURL baut dir die App den Befehl mit deinen IDs; die Beispiele hier zeigen, was darin steckt. Die Namen der Systeme nennen wir nur, damit du das passende Rezept findest. Turq ist mit keinem dieser Projekte verbunden.
Das ersetzt du in jedem Rezept
den Platzhalter für den Key durch deinen Key (turq_sk_…)
die Becken-ID durch die ID deines Beckens. Sie steht im Befehl aus der App und in der Antwort des Selbsttests.
bei Aufgaben die ID der Aufgaben-Vorlage, bei Dosierungen die ID des Dosierprodukts. Beide stehen im Befehl aus der App; ein Key mit CONFIG_READ kann sie auch selbst abfragen.
bei Messwerten den Schlüssel des Parameters, etwa ph. Den zeigt dir die App beim Einrichten unter „Messwert senden“, und CONFIG_READ liefert ihn ebenfalls.
Zahlen schickst du als Zahl mit Punkt, also 7.4 statt 7,4, und nicht als Text in Anführungszeichen.
Home Assistant schickt die Anfrage mit seinem eingebauten REST-Befehl (rest_command). Eine eigene Turq-Integration gibt es nicht, und du brauchst auch keine. Für Messwerte liest eine Automation im festen Takt deinen Sensor und ruft den Befehl auf. Ersetze den Platzhalter-Sensor durch die Entität deines Sensors und leg den Key als !secret in die secrets.yaml, statt ihn in die configuration.yaml zu schreiben.
Hängt dein ESPHome-Gerät schon an Home Assistant, nimm am besten das Rezept für Home Assistant. Dann liegt der Key nur an einer Stelle. Direkt vom Gerät sendest du mit der Komponente http_request und der Aktion http_request.post. Ein ESP32 prüft dabei das Zertifikat von api.turq.app; auf einem ESP8266 kann ESPHome das nicht, deshalb schickst du von dort besser über Home Assistant. Das Gerät braucht eine Uhrzeit, etwa über die Komponente time mit SNTP, und der Key gehört auch hier in die secrets.yaml. Wichtig: Sende den Messwert als Zahl, nicht als Text.
In Node-RED reicht eine http request-Node mit der Methode POST. Schalte dort die Authentifizierung ein, wähl Bearer und trag deinen Key ein. So legt Node-RED ihn bei seinen Zugangsdaten ab, und er landet nicht im exportierten Flow. Den Inhalt der Anfrage baust du davor in einer function- oder change-Node als Objekt in msg.payload.
Methode: POST
URL: die Adresse der Route, zum Beispiel https://api.turq.app/v1/aquariums/3f9a6b52-1c1e-4d57-8a3a-6f2d3a8b9c01/measurements
Mit cURL probierst du jede Route direkt im Terminal aus. Mit -i siehst du auch die Header der Antwort, etwa den Rest für heute. Für einen festen Takt trägst du die Zeile in deine crontab ein; dort muss das Prozentzeichen als \% stehen. Damit der Key nicht in der Shell-Historie landet, leg ihn in eine Umgebungsvariable.
Key für diese Sitzung setzenbash
read -rs TURQ_API_KEY && export TURQ_API_KEY
Verbindung testenbash
curl -i -X POST "https://api.turq.app/v1/ping" \
-H "Authorization: Bearer $TURQ_API_KEY"
Damit die API für alle zuverlässig läuft, begrenzt Turq, wie oft gelesen und wie oft und wie viel geschrieben wird. Die Grenzen gelten für alle gleich, mit und ohne Pro. Feste Zahlen stehen hier bewusst nicht, weil wir sie im Betrieb anpassen. Dein Gerät erfährt alles Nötige aus den Antworten.
Zu viele Anfragen auf einmal: Die API antwortet mit 429 und RATE_LIMITED. Der Header Retry-After nennt die Sekunden, die du warten sollst.
Tagesgrenze je Becken: Für Messwerte und Dosierungen gibt es zusätzlich eine Grenze pro Becken und Tag. Erfolgreiche Antworten tragen die Header X-Turq-Daily-Limit (Grenze) und X-Turq-Daily-Remaining (Rest für heute). Bei Messwerten zählt jeder einzelne Wert, nicht jede Anfrage. Der Tag beginnt um 00:00 UTC.
Grenze erreicht: Dann kommt 429 mit DAILY_LIMIT_REACHED, und Retry-After zählt bis Mitternacht UTC. In der App findest du dazu einen Hinweis bei den Benachrichtigungen.
Abgelehnte Anfragen und Wiederholungen mit demselben Idempotency-Key zählen nicht mit.
Lesen hat eigene Grenzen, getrennt vom Schreiben. Auch dort kommt bei zu vielen Anfragen 429 mit RATE_LIMITED und Retry-After. Eine Tagesgrenze je Becken gibt es beim Lesen nicht, und ein 304 zählt wie jede andere Abfrage.
So bleibst du gelassen darunter
Schick Messwerte im festen Takt statt bei jeder kleinen Änderung. Die Befehle aus der App senden alle 15 Minuten; Wasserwerte ändern sich langsam.
Bündle die Werte eines Zeitpunkts in einer Anfrage, etwa Temperatur und pH zusammen.
Wiederhole fehlgeschlagene Anfragen nicht in einer engen Schleife. Halte dich an Retry-After und warte bei Fehlern ohne diesen Header jedes Mal etwas länger.
Schick Push-Nachrichten nur bei Ereignissen, nicht im Takt.
Frag Werte nur so oft ab, wie dein Gerät sie braucht. Den passenden Takt findest du unter Lesen.
Doppelte Einträge vermeiden
Gib Schreibanfragen den Header Idempotency-Key mit einem eindeutigen Wert je Ereignis mit, etwa einer UUID, und nimm bei einer Wiederholung derselben Anfrage denselben Wert: Dann trägt Turq das Ereignis nur einmal ein und antwortet beim zweiten Mal mit "replayed": true. Läuft die erste Anfrage noch, kommt 409 mit IDEMPOTENCY_IN_PROGRESS und Retry-After, und derselbe Wert mit anderem Inhalt ergibt 409 mit IDEMPOTENCY_KEY_REUSED.
Fehler
Jeder Fehler hat dasselbe Format: {"error": {"code": …, "message": …, "requestId": …}}. Werte in deinem Code den code aus, nicht den Text in message, denn der kann sich ändern. Die requestId brauchen wir, wenn du dich bei uns meldest.
Code
Status
Bedeutung
Das hilft
UNAUTHORIZED
401
Der Key fehlt, ist falsch geschrieben oder widerrufen.
Header Authorization: Bearer <Key> prüfen; widerrufene Keys durch einen neuen ersetzen.
ACCOUNT_NOT_SECURED
403
Das Konto hinter dem Key ist ein Gastkonto.
Konto in der App sichern.
CONSENT_REQUIRED
403
Das Konto hinter dem Key hat den aktuellen Nutzungsbedingungen oder der Datenschutzerklärung noch nicht zugestimmt, und eine Übergangsfrist läuft nicht oder nicht mehr.
App öffnen und zustimmen. Danach laufen die Keys sofort wieder.
API_KEY_SUSPENDED
403
Wir haben den Key oder die API für dieses Konto gesperrt.
In der App unter Hilfe & Feedback nachfragen.
SCOPE_DENIED
403
Der Key hat das Recht für diese Route nicht, etwa ein älterer Key beim Lesen.
Neuen Key mit dem passenden Recht anlegen; die Rechte eines Keys lassen sich nicht ändern.
AQUARIUM_NOT_ALLOWED
403
Der Key gehört nicht zu diesem Becken, das Becken gibt es nicht mehr, oder du hast keinen Zugriff mehr darauf.
Becken-ID prüfen; der Selbsttest und GET /v1/aquariums nennen die Becken deines Keys.
AQUARIUM_LOCKED
403
Das Becken ist in der App schreibgeschützt. Lesen geht weiter, nur Einträge nimmt es nicht an.
In der App steht am Key, wie das Becken wieder Daten annimmt. Bei geteilten Becken hängt das am Konto, dem es gehört.
VALIDATION_FAILED
400
Die Anfrage passt nicht zur Referenz, etwa Text statt Zahl, ein unbekannter Parameter, ein unplausibler Zeitstempel oder beim Lesen eine falsch geformte Liste in parameters.
message gibt einen Hinweis; Anfrage mit der Referenz vergleichen.
NOT_FOUND
404
Etwas aus der Anfrage, etwa die Aufgaben-Vorlage oder das Dosierprodukt, gibt es in diesem Becken nicht.
ID aus dem Befehl der App übernehmen oder mit CONFIG_READ abfragen.
NO_DUE_TASK
404
Für diese Aufgabe ist gerade nichts fällig, oder der aktuelle Termin ist schon abgehakt, etwa weil heute jemand anderes gefüttert hat. Ältere offene Termine holt die API nicht nach.
Nichts. Das ist ein normales Ergebnis.
IDEMPOTENCY_IN_PROGRESS
409
Eine Anfrage mit demselben Idempotency-Key läuft noch.
Nach Retry-After wiederholen.
IDEMPOTENCY_KEY_REUSED
409
Derselbe Idempotency-Key kam schon mit anderem Inhalt.
Für jedes neue Ereignis einen neuen Wert nehmen.
CONFLICT
409
Die Anfrage passt nicht zum aktuellen Stand, etwa weil dieselbe Aufgabe gleichzeitig abgehakt wurde.
Kurz warten und neu versuchen.
RATE_LIMITED
429
Zu viele Anfragen in kurzer Zeit.
Retry-After abwarten und seltener senden.
DAILY_LIMIT_REACHED
429
Die Tagesgrenze dieses Beckens ist erreicht.
Ab 00:00 UTC geht es weiter. Seltener senden oder weniger Werte.
SERVICE_DISABLED
503
Die API oder nur das Lesen ist gerade pausiert. Ist nur das Lesen pausiert, nimmt die API Einträge weiter an. Deine Keys bleiben erhalten.
Später erneut versuchen.
INTERNAL_ERROR
500
Bei uns ist etwas schiefgelaufen, oder die Anfrage ließ sich nicht verarbeiten (dann mit einem Status unter 500).
Später erneut versuchen. Hält es an, melde dich mit der requestId.
Referenz
Alle Routen, Felder und Antworten im Detail. Die Basis-URL ist https://api.turq.app/v1; jede Anfrage braucht den Header Authorization: Bearer <Key>, Schreibanfragen schicken JSON. Die Referenz ist auf Englisch und entsteht aus derselben Datei, die du hier herunterladen kannst. Wir gleichen sie bei jeder Änderung automatisch mit dem Code ab.
OpenAPI 3.1. Du kannst die Datei in dein API-Werkzeug importieren oder dir daraus einen Client erzeugen lassen.
POST/v1/ping
Check an API key
Scope: none
Verifies that the key is valid and active and returns the scopes and the IDs of the aquariums the key can use right now. Needs no scope and writes nothing. The request needs no body. This route has its own, stricter request limit.
Responses
Status
Meaning
200
The key is valid. Headers: X-Turq-Consent-Deadline
401
The key is missing, malformed, unknown or revoked.
403
The request is not allowed. Possible codes: ACCOUNT_NOT_SECURED (the owning account is a guest account), CONSENT_REQUIRED (the owning account has not accepted the current terms and the transition period after the new version has ended), API_KEY_SUSPENDED (the key or its account is suspended).
429
Too many requests. Wait Retry-After seconds before you retry. Headers: Retry-After
Records one measurement with one or more parameter values at a point in time. Required scope: MEASUREMENTS_WRITE.
Parameter keys are the Turq parameter keys, for example ph, kh, gh, temperature, no3, po4, salinity. Values are plain numbers in the unit Turq uses for that parameter. Values outside the plausible range of a parameter are rejected.
Water values change slowly. A fixed interval of several minutes is usually enough; do not send on every sensor reading.
The daily allowance is counted in individual values, not in requests.
Parameters
Name
In
Type
Description
aquariumId required
path
string (uuid)
ID of the aquarium. The key must be bound to it.
Idempotency-Key optional
header
string
Optional unique value (for example a UUID) chosen by the client. A repeat of the same request with the same key and body does not write again.
Request body (JSON)
Field
Type
Description
timestamp required
integer
Time of the measurement as Unix time in milliseconds. Not earlier than 2000-01-01 and not noticeably in the future.
values required
object (values: number)
Parameter key to numeric value. Keys must be non-empty and short, the number of entries is limited, and values must be finite numbers. max 200 entries; keys 1 to 50 characters
The measurement was recorded. Headers: X-Turq-Daily-Limit, X-Turq-Daily-Remaining, X-Turq-Consent-Deadline
400
The path, the query or the body is invalid. The message lists what is wrong.
401
The key is missing, malformed, unknown or revoked.
403
The request is not allowed. Possible codes: ACCOUNT_NOT_SECURED, CONSENT_REQUIRED (after the transition period), API_KEY_SUSPENDED, SCOPE_DENIED (the key lacks the scope of this route), AQUARIUM_NOT_ALLOWED (the key is not bound to this aquarium, or the account may no longer use it), AQUARIUM_LOCKED (the aquarium is read-only).
409
IDEMPOTENCY_KEY_REUSED (the key was already used with a different body), IDEMPOTENCY_IN_PROGRESS (the first request with this key is still running; repeat after Retry-After) or CONFLICT. Headers: Retry-After
429
RATE_LIMITED (too many requests) or DAILY_LIMIT_REACHED (the daily allowance of this aquarium is used up). Wait Retry-After seconds. For the daily allowance the wait ends at the start of the next UTC day. Headers: Retry-After, X-Turq-Daily-Limit, X-Turq-Daily-Remaining
500
Unexpected server error.
503
The API is temporarily switched off.
Response 201json
{
"id": "0b7e2c5a-6f1d-4b8e-9a3c-2d4f6a8c0e12"
}
POST/v1/aquariums/{aquariumId}/dosing-events
Record a dosing event
Scope: DOSING_WRITE
Records that a dosing product was dosed (or refilled or calibrated) in the aquarium. Required scope: DOSING_WRITE.
The product must belong to the aquarium in the path. The type value manual_dose records a dose and reduces the remaining volume of the product by amount; refill and calibration are statements about the remaining volume. If timestamp is omitted the server time is used.
Parameters
Name
In
Type
Description
aquariumId required
path
string (uuid)
ID of the aquarium. The key must be bound to it.
Idempotency-Key optional
header
string
Optional unique value (for example a UUID) chosen by the client. A repeat of the same request with the same key and body does not write again.
Request body (JSON)
Field
Type
Description
productId required
string (uuid)
Dosing product of the aquarium in the path.
amount required
number
Amount in the unit of the product.
type required
string
Kind of event. manual_dose, refill and calibration change the remaining volume of the product.
unit optional
string
Unit label, for example ml. max length 10
notes optional
string
max length 500
timestamp optional
number
Unix time in milliseconds. Defaults to the server time.
The dosing event was recorded. Headers: X-Turq-Daily-Limit, X-Turq-Daily-Remaining, X-Turq-Consent-Deadline
400
The path, the query or the body is invalid. The message lists what is wrong.
401
The key is missing, malformed, unknown or revoked.
403
The request is not allowed. Possible codes: ACCOUNT_NOT_SECURED, CONSENT_REQUIRED (after the transition period), API_KEY_SUSPENDED, SCOPE_DENIED (the key lacks the scope of this route), AQUARIUM_NOT_ALLOWED (the key is not bound to this aquarium, or the account may no longer use it), AQUARIUM_LOCKED (the aquarium is read-only).
404
A referenced resource, for example the dosing product, was not found in this aquarium.
409
IDEMPOTENCY_KEY_REUSED (the key was already used with a different body), IDEMPOTENCY_IN_PROGRESS (the first request with this key is still running; repeat after Retry-After) or CONFLICT. Headers: Retry-After
429
RATE_LIMITED (too many requests) or DAILY_LIMIT_REACHED (the daily allowance of this aquarium is used up). Wait Retry-After seconds. For the daily allowance the wait ends at the start of the next UTC day. Headers: Retry-After, X-Turq-Daily-Limit, X-Turq-Daily-Remaining
500
Unexpected server error.
503
The API is temporarily switched off.
Response 201json
{
"id": "5d3c1a9e-8b7f-4e6d-a2c4-0f1e2d3c4b5a"
}
POST/v1/aquariums/{aquariumId}/tasks/complete
Mark the current task occurrence as done
Scope: TASKS_WRITE
Marks the current occurrence of a recurring task as done: today's latest occurrence that is already due, otherwise today's next one, otherwise the most recent overdue one. Older open occurrences stay open; they are never worked off by this route (the Turq app lets people mark a backlog as missed). Required scope: TASKS_WRITE.
The task template must belong to the aquarium in the path. If the task has no occurrence that can be completed right now, the API answers with the error code NO_DUE_TASK. This includes a repeated call: once the current occurrence is done, a second call does not complete an older one but answers NO_DUE_TASK. The same holds for two calls at the same time: one completes the occurrence, the other gets NO_DUE_TASK.
Parameters
Name
In
Type
Description
aquariumId required
path
string (uuid)
ID of the aquarium. The key must be bound to it.
Idempotency-Key optional
header
string
Optional unique value (for example a UUID) chosen by the client. A repeat of the same request with the same key and body does not write again.
Request body (JSON)
Field
Type
Description
templateId required
string (uuid)
Task template of the aquarium in the path.
note optional
string
max length 500
metadata optional
object | null
Free-form JSON object that is stored with the completion. Limited in size.
{
"templateId": "7c1d2e3f-4a5b-4c6d-8e7f-0a1b2c3d4e5f",
"note": "Water change done by the automation"
}
Responses
Status
Meaning
201
The task occurrence was marked as done. Headers: X-Turq-Consent-Deadline
400
The path, the query or the body is invalid. The message lists what is wrong.
401
The key is missing, malformed, unknown or revoked.
403
The request is not allowed. Possible codes: ACCOUNT_NOT_SECURED, CONSENT_REQUIRED (after the transition period), API_KEY_SUSPENDED, SCOPE_DENIED (the key lacks the scope of this route), AQUARIUM_NOT_ALLOWED (the key is not bound to this aquarium, or the account may no longer use it), AQUARIUM_LOCKED (the aquarium is read-only).
404
NOT_FOUND (the task template was not found in this aquarium) or NO_DUE_TASK (there is no occurrence that can be completed right now).
409
IDEMPOTENCY_KEY_REUSED (the key was already used with a different body), IDEMPOTENCY_IN_PROGRESS (the first request with this key is still running; repeat after Retry-After) or CONFLICT. Headers: Retry-After
429
Too many requests. Wait Retry-After seconds before you retry. Headers: Retry-After
500
Unexpected server error.
503
The API is temporarily switched off.
Response 201json
{
"id": "c4a1e8b2-3d5f-4a7c-9e0b-6f8d1a2b3c4d"
}
POST/v1/aquariums/{aquariumId}/notifications
Send a push notification to your own devices
Scope: NOTIFICATIONS_WRITE
Sends a push notification to the devices of the account that owns the key. Other members of the aquarium do not receive it. Required scope: NOTIFICATIONS_WRITE.
The title of the push notification is always set by Turq to "🔌 <key name> · <aquarium name>", so the message is recognizable as coming from an integration. A device cannot change it. The title and body you send appear in the message text below that heading, title on the first line and body on the next. Both are plain text; control characters are removed. This route has its own, stricter request limits.
Parameters
Name
In
Type
Description
aquariumId required
path
string (uuid)
ID of the aquarium. The key must be bound to it.
Idempotency-Key optional
header
string
Optional unique value (for example a UUID) chosen by the client. A repeat of the same request with the same key and body does not write again.
Request body (JSON)
Field
Type
Description
title required
string
First line of the message text. It is not the title of the push notification. max length 80
body required
string
Second line of the message text. max length 240
Example: A warningjson
{
"title": "Tank",
"body": "Water level is low"
}
Responses
Status
Meaning
200
The notification was accepted for delivery. Headers: X-Turq-Consent-Deadline
400
The path, the query or the body is invalid. The message lists what is wrong.
401
The key is missing, malformed, unknown or revoked.
403
The request is not allowed. Possible codes: ACCOUNT_NOT_SECURED, CONSENT_REQUIRED (after the transition period), API_KEY_SUSPENDED, SCOPE_DENIED (the key lacks the scope of this route), AQUARIUM_NOT_ALLOWED (the key is not bound to this aquarium, or the account may no longer use it), AQUARIUM_LOCKED (the aquarium is read-only).
409
IDEMPOTENCY_KEY_REUSED (the key was already used with a different body), IDEMPOTENCY_IN_PROGRESS (the first request with this key is still running; repeat after Retry-After) or CONFLICT. Headers: Retry-After
429
Too many requests. Wait Retry-After seconds before you retry. Headers: Retry-After
500
Unexpected server error.
503
The API is temporarily switched off.
Response 200json
{
"sent": true
}
GET/v1/aquariums
List the aquariums of a key
Scope: CONFIG_READ
Returns the aquariums the key is bound to and the account can currently use. Required scope: CONFIG_READ. readOnly is true when the aquarium is read-only in the Turq app: it can be read, but writes are rejected. This route is not counted as activity of an aquarium.
Parameters
Name
In
Type
Description
If-None-Match optional
header
string
The ETag of an earlier response. When nothing changed, the API answers 304 Not Modified without a body.
Responses
Status
Meaning
200
The aquariums of the key. Headers: ETag, X-Turq-Consent-Deadline
304
Nothing changed since the response with the ETag you sent in If-None-Match. No body. The 304 still counts against the request limits. Headers: ETag
401
The key is missing, malformed, unknown or revoked.
403
The request is not allowed. Possible codes: ACCOUNT_NOT_SECURED, CONSENT_REQUIRED (after the transition period), API_KEY_SUSPENDED, SCOPE_DENIED (the key lacks the read scope of this route), AQUARIUM_NOT_ALLOWED (the key is not bound to this aquarium, or the account may no longer use it). A read-only aquarium is not an error here.
429
Too many requests. Wait Retry-After seconds before you retry. Headers: Retry-After
Returns the water parameters a device can enter, with the unit, the input step and the plausible range. Use them to limit input on the device before you send a value. Required scope: CONFIG_READ.
unit is the unit the API expects and returns for the parameter (a plain ASCII label, or null). decimals is the number of decimal places of step. plausibleMin and plausibleMax are hard limits; null means that no limit is stored, not that every value is valid. With the scope STATUS_READ each parameter also has target, the target range of this aquarium (null when none is set).
The optional query parameters limits the list to a comma separated list of parameter keys. Unknown or inactive keys are ignored. A malformed list is rejected with VALIDATION_FAILED.
Parameters
Name
In
Type
Description
aquariumId required
path
string (uuid)
ID of the aquarium. The key must be bound to it.
parameters optional
query
string
Comma separated parameter keys, for example kh,ca. One single value: the array form parameters[]=kh and a repeated parameters are rejected. Keys use lower-case letters, digits and underscores only. Unknown or inactive keys are ignored.
If-None-Match optional
header
string
The ETag of an earlier response. When nothing changed, the API answers 304 Not Modified without a body.
Responses
Status
Meaning
200
The parameters. Headers: ETag, X-Turq-Consent-Deadline
304
Nothing changed since the response with the ETag you sent in If-None-Match. No body. The 304 still counts against the request limits. Headers: ETag
400
The path, the query or the body is invalid. The message lists what is wrong.
401
The key is missing, malformed, unknown or revoked.
403
The request is not allowed. Possible codes: ACCOUNT_NOT_SECURED, CONSENT_REQUIRED (after the transition period), API_KEY_SUSPENDED, SCOPE_DENIED (the key lacks the read scope of this route), AQUARIUM_NOT_ALLOWED (the key is not bound to this aquarium, or the account may no longer use it). A read-only aquarium is not an error here.
429
Too many requests. Wait Retry-After seconds before you retry. Headers: Retry-After
Returns the dosing products with the IDs you need for the dosing route. Required scope: CONFIG_READ. With the scope STATUS_READ each product also has remainingVolume, the remaining volume as the app calculates it (null when unknown). It changes only a few times a day.
Parameters
Name
In
Type
Description
aquariumId required
path
string (uuid)
ID of the aquarium. The key must be bound to it.
If-None-Match optional
header
string
The ETag of an earlier response. When nothing changed, the API answers 304 Not Modified without a body.
Responses
Status
Meaning
200
The dosing products. Headers: ETag, X-Turq-Consent-Deadline
304
Nothing changed since the response with the ETag you sent in If-None-Match. No body. The 304 still counts against the request limits. Headers: ETag
401
The key is missing, malformed, unknown or revoked.
403
The request is not allowed. Possible codes: ACCOUNT_NOT_SECURED, CONSENT_REQUIRED (after the transition period), API_KEY_SUSPENDED, SCOPE_DENIED (the key lacks the read scope of this route), AQUARIUM_NOT_ALLOWED (the key is not bound to this aquarium, or the account may no longer use it). A read-only aquarium is not an error here.
429
Too many requests. Wait Retry-After seconds before you retry. Headers: Retry-After
Returns the active recurring tasks with the IDs you need for the task route. Required scope: CONFIG_READ. With the scope STATUS_READ each template also has dueNow (true when the task route can complete an occurrence right now) and nextDueAt (Unix time in milliseconds of the occurrence the task route would complete now, otherwise of the next one that is not done yet, starting tomorrow, or null).
When many templates have to be calculated at once, the server limits the work per request. The two status properties can then be missing for some templates. A missing property means unknown, not false: ask again later or use the task route, which answers NO_DUE_TASK when nothing is due.
Parameters
Name
In
Type
Description
aquariumId required
path
string (uuid)
ID of the aquarium. The key must be bound to it.
If-None-Match optional
header
string
The ETag of an earlier response. When nothing changed, the API answers 304 Not Modified without a body.
Responses
Status
Meaning
200
The task templates. Headers: ETag, X-Turq-Consent-Deadline
304
Nothing changed since the response with the ETag you sent in If-None-Match. No body. The 304 still counts against the request limits. Headers: ETag
401
The key is missing, malformed, unknown or revoked.
403
The request is not allowed. Possible codes: ACCOUNT_NOT_SECURED, CONSENT_REQUIRED (after the transition period), API_KEY_SUSPENDED, SCOPE_DENIED (the key lacks the read scope of this route), AQUARIUM_NOT_ALLOWED (the key is not bound to this aquarium, or the account may no longer use it). A read-only aquarium is not an error here.
429
Too many requests. Wait Retry-After seconds before you retry. Headers: Retry-After
Returns, for each parameter that has a value in the aquarium, the most recent one, as a map from parameter key to value. A parameter without a value is missing from the map. Required scope: MEASUREMENTS_READ.
value is null when the entry is a bound such as "below 0.05"; then operator is < or >, and belowDetection is true when the value was below the detection limit. timestamp is the time the writer gave for the measurement (Unix time in milliseconds), not the time of arrival. origin tells where the value came from: app (entered in the app), lab (lab report), api (an integration), assistant (the Qualy assistant) or other. viaApi is true when it was written with an API key.
The optional query parameters limits the map to a comma separated list of parameter keys. Unknown or inactive keys are ignored. A malformed list is rejected with VALIDATION_FAILED. The latest value changes only when someone measures; do not ask for it more often than your use needs.
Parameters
Name
In
Type
Description
aquariumId required
path
string (uuid)
ID of the aquarium. The key must be bound to it.
parameters optional
query
string
Comma separated parameter keys, for example kh,ca. One single value: the array form parameters[]=kh and a repeated parameters are rejected. Keys use lower-case letters, digits and underscores only. Unknown or inactive keys are ignored.
If-None-Match optional
header
string
The ETag of an earlier response. When nothing changed, the API answers 304 Not Modified without a body.
Responses
Status
Meaning
200
The latest values. Headers: ETag, X-Turq-Consent-Deadline
304
Nothing changed since the response with the ETag you sent in If-None-Match. No body. The 304 still counts against the request limits. Headers: ETag
400
The path, the query or the body is invalid. The message lists what is wrong.
401
The key is missing, malformed, unknown or revoked.
403
The request is not allowed. Possible codes: ACCOUNT_NOT_SECURED, CONSENT_REQUIRED (after the transition period), API_KEY_SUSPENDED, SCOPE_DENIED (the key lacks the read scope of this route), AQUARIUM_NOT_ALLOWED (the key is not bound to this aquarium, or the account may no longer use it). A read-only aquarium is not an error here.
429
Too many requests. Wait Retry-After seconds before you retry. Headers: Retry-After
Hier steht, was sich an der API ändert, das Neueste oben. Die Hauptversion steht im Pfad (/v1). Neue Felder, Werte und Routen kommen innerhalb von /v1 dazu; dein Code sollte unbekannte Felder und Werte deshalb ignorieren. Änderungen, nach denen laufende Geräte angepasst werden müssen, versuchen wir zu vermeiden und nennen sie hier, sobald sie feststehen. Turq ist ein kleines Projekt: Wir sichern keine Verfügbarkeit und keine Mindestlaufzeit einer Version zu und können die API vorübergehend pausieren.
1. November 2026 · Aufgaben: der aktuelle Termin
Geändert: POST …/tasks/complete hakt jetzt den aktuellen Termin der Aufgabe ab: den jüngsten schon fälligen Termin von heute, sonst den nächsten von heute, sonst den jüngsten überfälligen. Bisher war es der älteste offene Termin.
Geändert: Ältere offene Termine bleiben offen und werden nie nachgezogen. Ein wiederholter Aufruf hakt keinen älteren Termin ab, sondern antwortet mit NO_DUE_TASK. Das gilt auch für zwei Aufrufe zur selben Zeit: einer hakt ab, der andere bekommt NO_DUE_TASK.
Geändert: dueNow und nextDueAt folgen demselben Termin. dueNow ist true, wenn das Abhaken gerade klappt, und nextDueAt nennt dann genau diesen Termin. Sonst nennt es den nächsten Termin ab morgen, der noch nicht geschlossen ist.
Für dein Gerät: Hakt es einmal je Ereignis ab, ändert sich nichts. Hat es nach einem Ausfall mehrfach abgehakt, um liegen gebliebene Termine nachzuholen, tut es das nicht mehr. Solche Termine hakst du in der App ab oder markierst sie dort als verpasst.
1. November 2026 · Version 1.1: Lesen
Neu: fünf Leserouten, GET /v1/aquariums sowie je Becken …/parameters, …/dosing-products, …/task-templates und …/measurements/latest.
Neu: die Rechte CONFIG_READ, STATUS_READ und MEASUREMENTS_READ. Keins schließt ein anderes ein, und Lese- und Schreibrechte lassen sich auf einem Key kombinieren. Bestehende Keys können weiter nur schreiben.
Neu: ETag und If-None-Match mit der Antwort 304; Leseantworten tragen Cache-Control: private, no-store.
Geändert: Der Selbsttest nennt nur noch Becken, die der Key gerade nutzen kann, und in scopes können Leserechte stehen.
Geändert: SERVICE_DISABLED kann auch nur das Lesen betreffen; Einträge nimmt die API dann weiter an.
Unverändert: Schreibrouten, die Grenzen fürs Schreiben und die Fehlercodes. Gelesene Werte sind zum Anzeigen da, nicht zum Steuern von Geräten.
1. November 2026 · Offen für jedes gesicherte Konto
Die API ist jetzt ohne Abo nutzbar, mit einem gesicherten Konto. Sie schreibt nur in Becken, die du in der App bearbeiten darfst.
Neu: eine Tagesgrenze je Becken für Messwerte und Dosierungen, mit den Headern X-Turq-Daily-Limit und X-Turq-Daily-Remaining und dem Code DAILY_LIMIT_REACHED.
Neu: die Codes ACCOUNT_NOT_SECURED, CONSENT_REQUIRED, API_KEY_SUSPENDED, AQUARIUM_LOCKED und IDEMPOTENCY_IN_PROGRESS.
Neu: Nach neuen Nutzungsbedingungen oder einer neuen Datenschutzerklärung laufen Keys eine Übergangsfrist weiter. Der Header X-Turq-Consent-Deadline nennt ihr Ende; danach kommt CONSENT_REQUIRED, bis du in der App zustimmst.
Geändert: Schreibgeschützte Becken antworten mit AQUARIUM_LOCKED statt SCOPE_DENIED. Auch Push-Nachrichten aus solchen Becken werden jetzt abgelehnt. Becken, auf die du keinen Zugriff mehr hast, antworten mit AQUARIUM_NOT_ALLOWED statt 404 oder NO_DUE_TASK.
PRO_REQUIRED wird nicht mehr verwendet.
Hilfe und Feedback
Fragen, Fehler oder Ideen zur API schickst du am besten direkt aus der App: Einstellungen › Hilfe & Feedback. Dort findest du später auch unsere Antwort. Häng bei Fehlern den code, die requestId und das, was dein Gerät gesendet hat, an. Deinen Key brauchen wir nie, schick ihn bitte nicht mit. Und wenn dir eine Route fehlt: Schreib uns, wofür du sie brauchst.