Keine passenden Abschnitte.

Host-Tracker REST API v1

Eine stabile, token-authentifizierte HTTP-API zur Verwaltung von Website-Überwachungs-Tasks, Kontakten, Alarm-/Report-Abonnements sowie zum Auslesen von Statistiken, Ausfällen und Vorfällen.

Dies ist API v1. Sie führt keine Instant Checks aus und verwendet ein anderes Authentifizierungsschema als API v2 — beide sind nicht austauschbar. Für automatisierte Instant Checks verwenden Sie stattdessen die API v2.

Base URL

Jeder Pfad in diesem Dokument ist relativ zu einer Base URL zu verstehen. Zwei Einstiegspunkte bedienen dieselbe API:

EinstiegspunktBase URL (BASE_URL)Hinweise
Direkt https://api1.host-tracker.com/ Empfohlen für Server-zu-Server-Integrationen.
Über die Hauptseite https://www.host-tracker.com/api/web/v1/ Wird per Reverse-Proxy an denselben Dienst weitergeleitet. Praktisch, wenn Sie ohnehin mit www.host-tracker.com kommunizieren.

In dieser Referenz bedeutet ein Aufruf wie GET tasks stets GET BASE_URL/tasks — also z. B. https://api1.host-tracker.com/tasks oder https://www.host-tracker.com/api/web/v1/tasks.

Content-Type & HTTP-Methoden

Requests und Responses sind standardmäßig application/json (siehe Konventionen für XML). Die API verwendet die üblichen HTTP-Methoden:

  • GET — Entitäten lesen (Tasks, Kontakte, Abonnements, Statistiken, Ausfälle, Vorfälle, Agenten).
  • POST — eine Entität anlegen oder eine Aktion starten.
  • PUT — bestehende Entitäten aktualisieren.
  • DELETE — Entitäten entfernen.
  • PATCH — Teilaktualisierungen (wird zum erneuten Versand eines Kontakt-Bestätigungscodes verwendet).

Override der HTTP-Methode

Falls Ihr Client kein PUT, DELETE oder PATCH senden kann, senden Sie ein POST und fügen Sie einen X-HTTP-Method-Override-Header mit der gewünschten Methode hinzu. Um beispielsweise Tasks zu aktualisieren, senden Sie ein POST an tasks mit X-HTTP-Method-Override: PUT.

Konventionen

JSON-Serialisierung

JSON verwendet Property-Namen in camelCase. Null-Felder werden in Responses weggelassen (leere Arrays werden weiterhin als [] ausgegeben). Die Reihenfolge der Properties ist stabil: zuerst Identifikator und Adresse/URL, dann geerbte Felder, dann typspezifische Felder.

Datum & Uhrzeit

Antworten auf Task-Erstellung/-Abfrage führen Zeitstempel als ISO-8601-UTC-Strings (z. B. 2024-06-21T22:26:23Z). Die Endpunkte für Statistiken, Ausfälle, Vorfälle und Ergebnisse verwenden zusätzlich eine duale Darstellung: Jede Zeitangabe erscheint sowohl als Ganzzahl in Unix-Sekunden (Suffix Unix) als auch als für Menschen lesbarer String, formatiert gemäß dem im Profil hinterlegten Datumsformat und der Zeitzone des Kontos. Request-Filter akzeptieren je nach Endpunkt Unix-Sekunden und/oder formatierte Strings (bei jedem Endpunkt unten dokumentiert). Alle Unix-Zeitstempel sind Sekunden seit 1970-01-01T00:00:00Z.

XML-Content-Negotiation

Alle Endpunkte können auch XML zurückgeben. Senden Sie Accept: application/xml, um statt JSON einen XML-Body zu erhalten; die Response verwendet die klassische .NET-XmlSerializer-Darstellung desselben Objektgraphen. JSON ist das Standard- und empfohlene Format.

CORS

Cross-Origin-Requests sind zulässig. Einfache (nicht-credentialed) Requests werden von jedem Origin akzeptiert (Access-Control-Allow-Origin: *). Requests, die Cookies/Credentials mitsenden, werden nur von *.host-tracker.com-Origins akzeptiert. Aufrufer, die per Token (über den Authorization-Header, wie hier dokumentiert) arbeiten, sind von dieser Einschränkung für credentialed Origins nicht betroffen.

Authentifizierung

Jeder Endpunkt außer POST users/token und den anonymen Agent-Listen-Endpunkten erfordert eine Authentifizierung. Zwei Schemata werden akzeptiert:

  • Bearer-Token — von POST users/token bezogen, gesendet als Authorization: bearer <token>. Dies ist das primäre Schema.
  • HTTP BasicAuthorization: Basic <base64(login:password)>. Zugangsdaten werden als ISO-8859-1 dekodiert. Praktisch für schnelle Tests; für Automatisierung wird das Bearer-Token bevorzugt.

POST users/token anonym

Tauscht Login und Passwort gegen ein Bearer-Token. Das Token ist 48 Stunden gültig.

Request-Body

application/json
{
  "login": "your-login",
  "password": "your-password"
}
FeldTypBeschreibung
loginstringKonto-Login. Erforderlich. Die E-Mail-Adresse des Kontos wird ebenfalls akzeptiert.
passwordstringKonto-Passwort. Erforderlich.
forLoginstringOptional. Der Login des Hauptkontos (Super-Account), in dessen Namen gehandelt werden soll (Subaccount-Impersonation — siehe unten).

Response — 200 OK

application/json
{
  "ticket": "<bearer token>",
  "expirationTime": "2024-06-23T22:26:23Z",
  "expirationUnixTime": 1719181583
}

Bei einem Fehlschlag lautet die Response 401 mit dem maschinenlesbaren Code IncorrectLoginOrPassword (oder AccessDenied, falls der API-Zugriff für das Konto deaktiviert ist) sowie einem WWW-Authenticate: Bearer-Header.

Verwendung des Tokens

HTTP
GET BASE_URL/tasks HTTP/1.1
Host: api1.host-tracker.com
Accept: application/json
Authorization: bearer 3DD135...5EE510417

Subaccount-Impersonation (forLogin)

Wenn ein Hauptkonto (Super-Account) Ihrem Subaccount Zugriff auf seine Daten gewährt hat, melden Sie sich als Subaccount an, geben aber den Login des Hauptkontos in forLogin an. Das zurückgegebene Token erlaubt Ihnen dann, das Hauptkonto genau so zu verwalten, als würden die Endpunkte für Ihr eigenes Konto aufgerufen — vorbehaltlich der vom Hauptkonto gewährten Rechte. Wurde beispielsweise nur Lesezugriff auf Überwachungs-Tasks gewährt, gelingen GET-Aufrufe, während POST/PUT/PATCH/DELETE auf Tasks abgelehnt werden.

End-to-End-Beispiel
# 1. Impersonation-Token beziehen
POST BASE_URL/users/token HTTP/1.1
Content-Type: application/json

{
  "login": "subaccount-login",
  "password": "subaccount-password",
  "forLogin": "superaccount-login"
}

# 2. Mit dem zurückgegebenen Ticket die Tasks des HAUPTKONTOS lesen
GET BASE_URL/tasks HTTP/1.1
Authorization: bearer <ticket from step 1>

curl

bash
# Token abrufen und speichern
TOKEN=$(curl -s -X POST https://api1.host-tracker.com/users/token \
  -H "Content-Type: application/json" \
  -d '{"login":"your-login","password":"your-password"}' \
  | grep -o '"ticket":"[^"]*"' | cut -d'"' -f4)

# einen authentifizierten Endpunkt aufrufen
curl -s https://api1.host-tracker.com/tasks \
  -H "Authorization: bearer $TOKEN"

Fehler & maschinenlesbare Codes

Fehler liefern einen Standard-HTTP-Statuscode zusammen mit einem kurzen maschinenlesbaren Code, auf den Ihre Integration reagieren kann. Der Body ist eine reine Text-Beschreibung auf Englisch (kein JSON), gedacht für Menschen/Logs.

Der maschinenlesbare Code wird auf zwei Wegen übermittelt:

  • X-HT-Reason-Response-Header — trägt den Code bei jeder Response und jeder HTTP-Version. Dies ist der empfohlene Weg, um den Fehlertyp zu erkennen.
  • HTTP/1.1-Reason-Phrase — die Status-Zeile lautet z. B. HTTP/1.1 400 SimilarExists. Aus Gründen der Abwärtskompatibilität erhalten, aber zu beachten: HTTP/2 und HTTP/3 haben Reason-Phrases aus dem Protokoll entfernt, sodass dieses Feld leer sein kann, wenn die Verbindung HTTP/2+ aushandelt. Bevorzugen Sie X-HT-Reason.
Beispiel einer Fehler-Response
HTTP/1.1 400 SimilarExists
X-HT-Reason: SimilarExists
Content-Type: text/plain; charset=utf-8

Same task allready exists
Authentifizierungs-Challenges. Ein fehlendes oder ungültiges Token liefert 401 mit WWW-Authenticate: Bearer und einem der Codes AccessDenied, WrongTicket, TicketExpired oder IncorrectLoginOrPassword.

Referenz der Fehlercodes

Jeder von der API zurückgegebene maschinenlesbare Code, gruppiert nach Bereich, mit dem typischen HTTP-Status. Sofern nicht anders vermerkt, sind Fehler 400 Bad Request.

Authentifizierung

CodeStatusBedeutung
AccessDenied401Der API-Zugriff ist für dieses Konto deaktiviert, oder dem Aufrufer fehlen die erforderlichen Rechte.
IncorrectLoginOrPassword401Login/Passwort bei users/token abgelehnt.
WrongTicket401Das Bearer-Token ist fehlerhaft / nicht lesbar.
TicketExpired401Das Bearer-Token ist abgelaufen — ein neues beziehen.
RequestThrottled429Rate Limit überschritten (siehe Rate Limits). Enthält Retry-After.

Tasks

CodeStatusBedeutung
NotFound404Der angeforderte Task existiert nicht.
SimilarExists400Ein Task mit demselben Typ und Schlüssel existiert bereits (außer das Konto erlaubt ähnliche Tasks).
EmptyTaskData400Keine Task-Daten übermittelt.
UncomplitedData400Die Task-Daten sind unvollständig.
NoIdInTaskData400Eine Aktualisierung wurde angefordert, aber die Task-ID fehlt.
WrongEditableTaskDataType400Der Typ der Bearbeitungsdaten stimmt nicht mit dem Typ des Ziel-Tasks überein.
WrongTaskType400Unbekannter Task-Typ.
WrongTaskStatus400Nicht unterstützter status-Wert (erwartet Enabled/Disabled).
WrongInterval400Das Überwachungsintervall entspricht keinem der akzeptierten Werte (siehe tasks/intervals).
EmptyUrl400Keine URL/kein Host für einen Task angegeben, der dies benötigt.
WrongUrl400Die URL ist ungültig.
WrongSchema400Nicht unterstütztes URL-Schema.
BadIP400Die URL löst zu einer gesperrten oder fehlerhaften IP-Adresse auf.
UrlInBlackList400Die URL steht auf einer internen Sperrliste.
WrongHttpMethod400Nicht unterstützte HTTP-Methode für einen HTTP-Task (erlaubt: Get, Post, Head).
WrongKeywordMode400Nicht unterstützter Keyword-Modus.
WrongPort400Ungültiger Port für einen Port-Task.
WrongAgentPool400Ein oder mehrere angeforderte Agent-Pools existieren nicht. Die Meldung listet die ungültigen und die verfügbaren Pools auf.
SelectMoreAgents400Die gewählten Agent-Pools enthalten nicht genügend Agenten (7 erforderlich). Die Meldung listet die Anzahl je Pool auf.
ApiFullLogNotAllowed400fullLog ist nur bei erweiterten Paketen verfügbar.
WrongExpectedSLA400expectedSLA muss zwischen 0 und 100 liegen.
WrongDate400Ungültiges Start-/Enddatum in einem Filter.
WrongDateFormat400Ein Datumsstring entsprach nicht dem erforderlichen Format (in der Meldung angegeben).
EndDateIsGreaterThanStartDate400Das Startdatum muss ≤ dem Enddatum sein.
StartEndIntervalIsTooBig400Eine Ergebnisabfrage würde mehr als 10 000 Zeilen liefern. Die Meldung enthält das größtmögliche passende Intervall (siehe GET tasks).
WrongSubscription400Ein im Task-Body enthaltenes Inline-Abonnement ist ungültig (der innere Code/die Meldung des Abonnements wird durchgereicht).
EmptyFilter400Ein Massen-DELETE tasks wurde mit leerem Filter gesendet (abgelehnt, um das Löschen des gesamten Kontos zu verhindern).

Kontakte

CodeStatusBedeutung
NotFound404Der angeforderte Kontakt existiert nicht.
SimilarExists400Ein Kontakt mit demselben Typ, Gateway, derselben Adresse und demselben Alarm-Delay existiert bereits.
EmptyContactData400Keine Kontaktdaten übermittelt.
UncomplitedData400Die Kontaktdaten sind unvollständig.
NoIdInContactData400Eine Aktualisierung wurde angefordert, aber die Kontakt-ID fehlt.
EmptyAddress400Beim Anlegen eines Kontakts wurde keine Adresse angegeben.
WrongContactType400Unbekannter Kontakttyp (wird auch für den abgeschafften IM-Erstellungs-/Aktualisierungspfad zurückgegeben).
WrongEditableContactDataType400Der Typ der Bearbeitungsdaten stimmt nicht mit dem Typ des Ziel-Kontakts überein.
WrongEmailFormat400Ungültige E-Mail-Adresse, oder ein nicht unterstütztes E-Mail-Reportformat.
WrongPhoneFormat400Eine Telefonnummer darf nur Ziffern enthalten (ein führendes + ist erlaubt).
WrongSmsGateway400Unbekanntes SMS-Gateway.
WrongIMGateway400Unbekanntes IM-Gateway.
WrongAlertDelay400alertDelay entspricht keinem der akzeptierten Werte (siehe contacts/delays).
WrongActivePeriodInterval400Ungültiger Start/Ende des aktiven Zeitraums.
WrongActiveDay400Nicht unterstützter Name für einen aktiven Tag.
EmptyFilter400Ein Massen-DELETE contacts wurde mit leerem Filter gesendet (abgelehnt).

Abonnements

CodeStatusBedeutung
AlertsAndReportsAreEmpty400Ein Abonnement-Eintrag gibt weder Alarmtypen noch Reporttypen an.
UnknownAlertType400Ein Alarmtyp ist keiner von Up, Down, RepeatedlyDown.
UnknownReportType400Ein Reporttyp ist keiner von Day, Week, Month, Quarter, Year.

Rate Limits

Requests werden pro Client und pro Endpunkt limitiert. Wird ein Limit überschritten, liefert die API 429 mit dem maschinenlesbaren Code RequestThrottled und einem Retry-After-Header (in Sekunden).

GeltungsbereichLimit
Allgemeine Endpunkte, pro Konto + Endpunkt6 Requests/Sekunde und 120 Requests/Minute
Bestätigungscode-Endpunkte (contacts/{id}/code), pro Konto + Endpunkt1 Request/Sekunde und 2 Requests/Minute
Anonyme EndpunkteDieselben 6/s + 120/min, gezählt pro Client-IP-Adresse
429-Response
HTTP/1.1 429 RequestThrottled
X-HT-Reason: RequestThrottled
Retry-After: 1
Content-Type: application/json; charset=utf-8

"API calls quota exceeded! maximum admitted 6 per s."

Überwachungs-Tasks

GET tasks/types

Gibt das Array der dem System bekannten Task-Typ-Namen zurück:

200 OK
["API","CntCheck","Counter","DNSBL","Database","DomainExp","Http",
 "Ping","Port","RusRegBL","SSLExp","Snmp","Tran","Waterfall","WebRisk"]
Bestehende Tasks jedes dieser Typen können über diese API gelesen werden. Tasks können nur für vier Typen über die typisierten Endpunkte angelegt/aktualisiert werden: Http Ping Port RusRegBL (angelegt unter tasks/http, tasks/ping, tasks/port bzw. tasks/rusbl).

GET tasks/intervals

Gibt das Array der für Ihr Konto akzeptierten Überwachungsintervalle (in Minuten) zurück, z. B. [1,5,15,30,60]. Verwenden Sie beim Anlegen eines Tasks einen dieser Werte für das Feld interval; jeder andere Wert führt zu WrongInterval.

GET tasks

Listet Überwachungs-Tasks auf. Alle Query-Parameter sind optional; ohne Angabe werden alle Tasks des Kontos zurückgegeben. Wiederholen Sie einen Parameter, um ein Array zu übergeben, z. B. ?ids=guid1&ids=guid2.

Der Parameter info

Fordert zusätzliche, in jeden Task eingebettete Daten an. Kombinieren Sie Werte mit Kommas (?info=stats,subscriptions) oder übergeben Sie die äquivalente Bitmask als Ganzzahl:

WertBitEffekt
subscriptions1Bezieht die Alarm-/Report-Abonnements des Tasks in subscriptions mit ein.
stats2Bezieht Tages-/Monats-/Jahres-/Gesamt-Uptime in stats mit ein.
results4Bezieht Prüfergebnisse für das Fenster sdtuedtu in results mit ein (letztes Ergebnis, wenn das Fenster weggelassen wird).
attachedResultsBezieht die neuesten Ergebnisse zusätzlicher Prüfungen (Zertifikat, Domain-Ablauf, DNSBL) in attached mit ein. Erfordert die entsprechenden check…-Flags am Task.

?info=stats,subscriptions,results entspricht ?info=7.

Filterparameter

ParameterTypBeschreibung
idsguid[]Nur diese Task-IDs zurückgeben. Für eine einzelne ID bevorzugen Sie GET tasks/{id}.
excludeIdsboolZusammen mit ids: alles außer diesen IDs zurückgeben.
taskType / taskTypesstring / string[]Nach Task-Typ filtern (Groß-/Kleinschreibung beachten), z. B. Http.
excludeTaskTypesboolDen Typfilter umkehren.
statusstringEnabled oder Disabled (Deaktivierung durch den Benutzer). Z. B. ?status=Disabled.
url / urlsstring / string[]Nach URL filtern. Werte in urls müssen URL-kodiert sein.
urlSearchLikeboolZusammen mit url (nicht urls): Substring-Suche statt exaktem Abgleich.
excludeUrlsboolDen URL-Filter umkehren.
name / namesstring / string[]Nach Task-Namen filtern. name/names zusammen mit id/ids ist ein ODER; zusammen mit anderen Filtern ein UND.
nameSearchLikeboolZusammen mit name: Substring-Suche.
excludeNamesboolDen Namensfilter umkehren.
interval / intervalsint / int[]Nach Überwachungsintervall (Minuten) filtern.
excludeIntervalsboolDen Intervallfilter umkehren.
openStatboolÖffentliche Tasks (öffentliche Statistik/Ereignisprotokoll).
lastStatebooltrue = aktuell erreichbar, false = aktuell nicht erreichbar.
tagsstring[]Nach Tag filtern.
overlimitedboolTasks mit (true) oder ohne (false) Abrechnungs-Überlimit.
activebooltrue = aktiv, false = systemseitig deaktiviert (Überlimit, niedriges Guthaben, …). Für eine Deaktivierung durch den Benutzer verwenden Sie status.
sdtu / edtuint64Unix-Sekunden (UTC) für Start/Ende eines Fensters. Wird nur berücksichtigt, wenn info=results gesetzt ist; beide Werte angeben. edtu muss > sdtu sein.
Zeilenlimit bei Ergebnissen. Beim Anfordern von Ergebnissen darf die geschätzte Zeilenanzahl (edtu − sdtu) × (#tasks) / (avg interval) nicht mehr als 10 000 betragen. Andernfalls lautet die Response 400 StartEndIntervalIsTooBig, deren Meldung das größte noch passende Intervall enthält. Diese Obergrenze gilt nur für das Lesen von Task-Ergebnissen.

Response — 200 OK

Ein Array von Task-Objekten. Die genauen Felder hängen vom Task-Typ ab; die gemeinsame Basis umfasst id, name, taskType, enabled, interval, lastState, creationTime, tags, agentPools sowie (wenn über info angefordert) subscriptions, stats, results und attached. Sind Ergebnisse enthalten, trägt jedes Ergebnis mindestens timestamp (Unix-Sekunden UTC) und eventNumber; die übrigen Felder sind typspezifisch (siehe die Create-Response unten für die HTTP-Form).

Beispiel-Request
GET BASE_URL/tasks?info=stats,subscriptions&taskType=Http HTTP/1.1
Accept: application/json
Authorization: bearer <token>

GET tasks/{id:guid}

Ruft einen einzelnen Task anhand seiner ID ab. Akzeptiert denselben Parameter info (sowie sdtu/edtu, wenn info=results). Gibt das Task-Objekt zurück, oder 404 NotFound, falls es nicht existiert.

POST tasks/http · tasks/ping · tasks/port · tasks/rusbl

Legt einen Überwachungs-Task des angegebenen Typs an. Bei Erfolg wird 201 Created, ein relativer Location: /tasks/{id}-Header und das vollständige angelegte Task-Objekt zurückgegeben.

Request-Body — HTTP-Task

POST tasks/http · application/json
{
  // HTTP-spezifische Felder
  "url": "https://www.example.com",        // ERFORDERLICH
  "httpMethod": "Get",                       // Get | Post | Head (Standard: Get)
  "userAgent": "MyMonitor",
  "referer": "https://www.google.com",
  "acceptHeader": "application/json",
  "followRedirect": false,
  "treat300AsError": false,                // falls gesetzt, wird followRedirect ignoriert
  "checkDnsbl": false,                       // Domain gegen DNS-Sperrlisten prüfen
  "checkDomainExpiration": false,            // Domain-Ablauf überwachen (nur bei gültigen Domains)
  "checkCertificateExpiration": false,       // TLS-Zertifikatsablauf überwachen (nur https)
  "checkRussianBlackLists": false,
  "checkWebRisk": false,
  "timeout": 40000,                          // ms bis eine Prüfung fehlschlägt
  "keywords": ["error", "maintenance"],
  "keywordMode": "ReverseAny",             // siehe Keyword-Modi unten
  "userName": "basic-auth-user",          // Zugangsdaten für die überwachte Ressource
  "password": "basic-auth-pass",
  "postParameters": "a=1\r\nb=2",          // nur bei httpMethod=Post
  "ignoredStatuses": [404, 500],

  // Felder, die für jeden Task-Typ gelten
  "interval": 5,                             // Minuten; muss ein akzeptiertes Intervall sein
  "enabled": true,
  "fullLog": false,                          // nur bei erweiterten Paketen
  "openStat": true,
  "name": "My website",
  "tags": ["production", "web"],
  "agentPools": ["westeurope", "asia"],  // siehe Hinweise unten
  "subscriptions": [ /* Inline-Abonnements, siehe unten */ ]
}
Keyword-ModusTask ist OK, wenn…
PresentAnymindestens ein Keyword in der Response vorkommt.
PresentAllalle Keywords vorkommen.
ReverseAnyalle Keywords fehlen.
ReverseAllmindestens ein Keyword fehlt.
ReverseWithResultalle Keywords fehlen; die Fehlermeldung enthält den Rest der Response-Zeile, in der das erste Keyword erwartet wurde (die ersten 100 Zeichen jeder analysierten Zeile).
agentPools wählt die Überwachungsstandorte aus. Dieses Feld ist optional (andernfalls wird der Standard aus dem Profil verwendet). Wird es angegeben, müssen die Pools zusammen mindestens 7 Agenten enthalten, sonst schlägt der Request mit SelectMoreAgents fehl. Unbekannte Pool-IDs schlagen mit WrongAgentPool fehl. Pool-IDs stammen aus GET agents/pools.

Inline-Abonnements

Das Array subscriptions abonniert Kontakte beim Anlegen für die Alarme/Reports dieses Tasks. Jeder Eintrag verwendet die Abonnement-Struktur; setzen Sie kein taskIds (es wird fest auf den neuen Task gesetzt). Wird contactIds weggelassen, werden alle Ihre bestätigten Kontakte abonniert. Report-Abonnements werden nur auf E-Mail-Kontakte angewendet.

Weitere Task-Typen

  • tasks/ping — der Body trägt host plus die gemeinsamen Felder.
  • tasks/port — der Body trägt host und port plus die gemeinsamen Felder.
  • tasks/rusbl — Prüfung gegen die russische Registry-Sperrliste; der Body trägt url, zusätzlich ignoreWarnings, doNotSendMsgOnWarnings, prefixMatch und die gemeinsamen Felder.

Response — 201 Created (HTTP-Task)

application/json
{
  "id": "ef10cd12-93f9-e311-bec5-dc85de1f0bc2",
  "url": "https://www.example.com",
  "rawUrl": "https://www.example.com",
  "name": "My website",
  "creationTime": "2024-06-21T22:26:23Z",
  "taskType": "Http",
  "enabled": true,
  "interval": 5,
  "lastState": true,
  "openStatEnabled": true,
  "fullLogEnabled": false,
  "tags": ["production", "web"],
  "agentPools": ["westeurope", "asia"],
  "subscriptions": [
    { "alertTypes": ["Up"],   "taskIds": ["ef10cd12-...-0bc2"], "contactIds": ["4cedf037-...-0bc2"] },
    { "alertTypes": ["Down"], "taskIds": ["ef10cd12-...-0bc2"], "contactIds": ["4cedf037-...-0bc2"] },
    { "reportTypes": ["Month"], "taskIds": ["ef10cd12-...-0bc2"], "contactIds": ["4cedf037-...-0bc2"] }
  ],
  "httpMethod": "Get",
  "keywords": ["error"],
  "keywordMode": "ReverseAny",
  "timeout": 40000
}

curl

bash
curl -s -X POST https://api1.host-tracker.com/tasks/http \
  -H "Authorization: bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://www.example.com","interval":5,"name":"My website"}'

PUT tasks & typisierte Varianten

Aktualisiert Tasks. Zwei Formen:

  • Nach IDPUT tasks/{id} (nur gemeinsame Felder), oder die typisierten PUT tasks/http/{id}, tasks/ping/{id}, tasks/port/{id}, tasks/rusbl/{id} (auch typspezifische Felder). Der Body hat dieselbe editierbare Struktur wie beim Anlegen; nur die übermittelten Felder werden geändert.
  • Nach FilterPUT tasks?<filter> (nur gemeinsame Felder) oder die typisierte PUT tasks/{type}?<filter> (fixiert den Filter auf diesen Typ). Verwendet dieselben Filterparameter wie GET tasks. Gibt den/die aktualisierten Task(s) zurück.

Das untypisierte PUT tasks / PUT tasks/{id} kann nur Felder ändern, die allen Task-Typen gemeinsam sind — für typspezifische Einstellungen einen typisierten Endpunkt verwenden.

DELETE tasks/{id:guid} & tasks

  • DELETE tasks/{id} — löscht einen einzelnen Task; gibt den gelöschten Task zurück.
  • DELETE tasks?<filter> — Massenlöschung anhand des Task-Filters (ein Filter kann auch im Request-Body übergeben werden). Gibt die gelöschten Tasks zurück.
Leerer Filter wird abgelehnt. Ein Massen-DELETE tasks ohne selektiven Filter liefert 400 EmptyFilter, statt das gesamte Konto zu löschen. Um absichtlich alles zu löschen, iterieren Sie explizit.

POST tasks/$batch · task/$batch

Führt mehrere Task-Operationen in einem Request aus. Der Body ist ein JSON-Array von Sub-Requests; die Response ist ein JSON-Array von Sub-Responses in derselben Reihenfolge. Die Sub-Operation wird durch das letzte Segment von relativeUrl bestimmt (z. B. httpPOST tasks/http). Der Request-Body muss JSON sein (Content-Type: application/json). Derselbe Mechanismus existiert für Kontakte unter contacts/$batch / contact/$batch.

Request-FeldTypBeschreibung
methodstringHTTP-Methode des Sub-Requests (POST, PUT, DELETE…).
relativeUrlstringSub-Ressource; das letzte Segment wählt die Operation (http, ping, port, rusbl…).
contentTypestringContent-Type von content, üblicherweise application/json.
contentstringDer Body des Sub-Requests, als JSON-String.
Response-FeldTypBeschreibung
codeintHTTP-Statuscode der Sub-Response (z. B. 201, 400).
statusstringReason-/Statustext (trägt bei Fehlern den maschinenlesbaren Code).
headersobjectResponse-Header der Sub-Operation (z. B. Location).
bodystringDer Body der Sub-Response.
Request · POST tasks/$batch
POST BASE_URL/tasks/$batch HTTP/1.1
Authorization: bearer <token>
Content-Type: application/json

[
  {
    "method": "POST",
    "relativeUrl": "http",
    "contentType": "application/json",
    "content": "{\"url\":\"https://a.example.com\",\"interval\":5}"
  },
  {
    "method": "POST",
    "relativeUrl": "ping",
    "contentType": "application/json",
    "content": "{\"host\":\"b.example.com\"}"
  }
]
Response · 200 OK
[
  { "code": 201, "status": "Created",
    "headers": { "Location": "/tasks/ef10cd12-...-0bc2" },
    "body": "{ ...created http task... }" },
  { "code": 201, "status": "Created",
    "headers": { "Location": "/tasks/7a20de34-...-1cd3" },
    "body": "{ ...created ping task... }" }
]

Kontakte

Kontakte sind die Ziele, die Alarme und Reports empfangen (E-Mail-Adressen, Telefonnummern für SMS/Anruf). Kontakt-IDs werden beim Anlegen von Abonnements verwendet.

GET contacts/types · contacts/delays · contacts/sms/gateways · contacts/im/gateways

Statische Aufzählungen, die von den Kontakt-Endpunkten verwendet werden:

EndpunktLiefert
contacts/types["Email","IM","SMS","VoiceCall"] — die von dieser API aufgezählten Kontakttypen. Anlegbar sind Email, SMS und VoiceCall (IM ist abgeschafft — siehe unten).
contacts/delaysDie akzeptierten Werte für alertDelay (Minuten): [0,5,15,30,60,180,720,360,1440,3].
contacts/sms/gatewaysSMS-Gateway-IDs: ["clickatell","clickatella","infobip","skype","twiliosms"]. Der Standard ist twiliosms; die übrigen Einträge sind Altbestände und ggf. inaktiv.
contacts/im/gatewaysIM-Gateway-IDs: ["GTalk","SkypeChat"]. Nur aus Kompatibilitätsgründen aufgeführt — IM-Kontakte können nicht mehr angelegt werden (siehe unten).
IM-Kontakte sind abgeschafft. GET contacts/im/gateways liefert weiterhin die Gateway-Liste, aber POST contacts/im und PUT contacts/im liefern nun 400 WrongContactType. Bestehende IM-Kontakte können über diese API nicht mehr angelegt werden.

GET contacts & contacts/{id:guid}

Listet Kontakte (optional gefiltert) auf, oder ruft einen einzelnen anhand seiner ID ab. Fügen Sie ?info=subscriptions hinzu, um die Abonnements jedes Kontakts einzubetten. Ohne Filter werden alle Kontakte des Kontos zurückgegeben.

FilterparameterTypBeschreibung
ids / excludeIdsguid[] / boolNach ID auswählen oder ausschließen.
contactType / contactTypesstring / string[]Nach Typ filtern (Email, SMS, VoiceCall…).
excludeContactTypesboolDen Typfilter umkehren.
confirmedboolBestätigte vs. unbestätigte Kontakte.
overlimitedboolKontakte, die über dem Paketlimit markiert sind.
acceptBillingNotificationsboolFür Abrechnungsbenachrichtigungen verwendete Kontakte.
name / names / nameSearchLike / excludeNamesstring(s) / boolNach Namen filtern (exakt, Liste, Substring oder ausgeschlossen).
address / addresses / addressSearchLike / excludeAddressesstring(s) / boolNach Adresse filtern.

Kontakt-Objekt

Gemeinsame Felder: id, confirmed, contactType, name, address, alertDelay, activePeriodStart/activePeriodEnd (HH:mm), activeDays, sendCost. E-Mail-Kontakte fügen reportFormat (Text/ShortText), sendNews, sendBillingNotifications hinzu; SMS-/IM-Kontakte fügen gateway hinzu.

POST contacts/email · contacts/sms · contacts/voice

Legt einen Kontakt an. Gibt 201 Created, einen relativen Location: /contacts/{id} und ein ContactOperationResult ({ contact, status }) zurück, dessen status das Ergebnis der Bestätigung meldet.

POST contacts/email · application/json
{
  "address": "ops@@example.com",          // ERFORDERLICH
  "name": "Ops mailbox",
  "alertDelay": 0,                        // Minuten; einer der Werte aus contacts/delays
  "reportFormat": "Text",               // Text | ShortText (nur E-Mail)
  "activePeriodStart": "00:00",        // optionales Ruhezeitfenster (HH:mm)
  "activePeriodEnd": "23:59",
  "activeDays": ["Monday", "Tuesday"],   // optional; Standard sind alle Tage
  "subscriptions": [ /* optionale Inline-Abonnements */ ]
}
FeldGilt fürHinweise
addressalleE-Mail-Adresse oder Telefonnummer (Ziffern, optional führendes +) für SMS/Anruf. Beim Anlegen erforderlich.
alertDelayalleMinuten Wartezeit vor der Alarmierung. Muss einer der Werte aus contacts/delays sein.
activePeriodStart / activePeriodEndalleHH:mm; der Zeitraum, in dem Alarme zugestellt werden.
activeDaysalleBeliebige aus SundaySaturday; Standard ist jeder Tag.
reportFormat, sendNews, sendBillingNotificationsE-MailE-Mail-Optionen.
gatewaySMSEiner der Werte aus contacts/sms/gateways; Standard twiliosms.

SMS- und Anruf-Kontakte verwenden standardmäßig die Gateways twiliosms / twiliovoice, erhalten einen Standardpreis pro Nachricht und speichern die Nummer mit einem führenden +. Das Ändern von Adresse oder Gateway eines Kontakts setzt dessen Bestätigungsstatus zurück.

Werte des Bestätigungsstatus

Das Feld status des Ergebnisses meldet das Ergebnis des Bestätigungscode-Versands:

StatusBedeutung
ConfirmedKontakt wurde bereits bestätigt angelegt (kein Code erforderlich).
CodeSentEin Bestätigungscode wurde versendet; der Kontakt wird nach Bestätigung aktiv.
CodeSentEarlierEin Code wurde bereits kürzlich gesendet und ist noch gültig.
CodeFailKontakt wurde angelegt, aber der Versand des Codes ist fehlgeschlagen; später erneut versuchen.
LowSmsBalanceDer Code konnte nicht gesendet werden, da das Guthaben des Kontos zu niedrig ist.
OverlimitedDer Kontakt liegt über dem Paketlimit.

PUT contacts & typisierte Varianten

  • Nach IDPUT contacts/{id} (gemeinsame Felder), oder typisiert PUT contacts/email/{id}, contacts/sms/{id}, contacts/voice/{id}. Nur die übermittelten Felder werden geändert.
  • Nach FilterPUT contacts?<filter> oder typisiert PUT contacts/{type}?<filter> (fixiert den Filter auf diesen Typ), unter Verwendung des Kontaktfilters.

PUT contacts/im (beide Formen) liefert 400 WrongContactType.

DELETE contacts/{id:guid} & contacts

Löscht einen einzelnen Kontakt anhand seiner ID, oder löscht mehrere anhand des Kontaktfilters. Wie bei Tasks wird eine Massenlöschung mit leerem Filter mit 400 EmptyFilter abgelehnt.

Bestätigungscodes

Unbestätigte Kontakte müssen ihren Besitz mit einem kurzen, an die Kontaktadresse zugestellten Code bestätigen.

  • PATCH contacts/{id}/code — den Bestätigungscode (erneut) ausstellen und versenden. Gibt ein ContactOperationResult mit einem Status wie CodeSent zurück.
  • POST contacts/{id}/code — bestätigt den Kontakt durch Übermitteln des Codes. Body: { "code": "12345" }. Bei Erfolg wird der Kontakt bestätigt.
Für diese Endpunkte gilt ein engeres Rate Limit: 1 Request/Sekunde und 2 Requests/Minute.

Alarme & Abonnements

Ein Abonnement verknüpft einen oder mehrere Tasks und Kontakte mit einer Menge von Alarm- und/oder Reporttypen. Ein einzelner Abonnement-Eintrag bildet das Kreuzprodukt seiner Tasks und Kontakte, wodurch je (Task, Kontakt, Typ) ein Alarm/Report entsteht.

Struktur eines Abonnements

Abonnement-Eintrag
{
  "alertTypes": ["Up", "Down"],       // beliebige aus Up, Down, RepeatedlyDown
  "reportTypes": ["Day", "Month"],     // beliebige aus Day, Week, Month, Quarter, Year
  "taskIds": ["<task guid>"],
  "contactIds": ["<contact guid>"]
}
  • Mindestens eines von alertTypes / reportTypes ist erforderlich, sonst AlertsAndReportsAreEmpty.
  • Wird taskIds weggelassen, gilt standardmäßig alle Ihre Tasks; wird contactIds weggelassen, gilt standardmäßig alle Ihre Kontakte. Ein explizit leeres Array bedeutet "keine".
  • Report-Abonnements gelten nur für E-Mail-Kontakte — Reporttypen auf Nicht-E-Mail-Kontakten werden stillschweigend ignoriert (deren Alarm-Abonnements werden trotzdem angelegt).
  • IDs, die Ihnen nicht gehören, werden ignoriert.

GET subscriptions/alertTypes · subscriptions/reportTypes

EndpunktLiefert
subscriptions/alertTypes["Up","Down","RepeatedlyDown"]
subscriptions/reportTypes["Day","Week","Month","Quarter","Year"]

GET subscriptions

Listet Abonnements auf. Gibt einen Eintrag pro passendem Alarm- oder Report-Abonnement zurück (nie zusammengeführt). Optionale Filter:

ParameterTypBeschreibung
taskIdguidNur Abonnements für diesen Task.
contactIdguidNur Abonnements für diesen Kontakt.
typesstring[]Nur diese Alarm-/Reporttypen. Unbekannte Namen werden hier ignoriert (anders als bei POST/DELETE, die sie ablehnen).

POST subscriptions · DELETE subscriptions

Beide erwarten ein JSON-Array von Abonnement-Einträgen im Body. POST fügt die beschriebenen Abonnements hinzu (nur neue Zeilen werden eingefügt); DELETE entfernt die vorhandenen. Beide liefern 200 OK mit leerem Body. Unbekannte Alarm-/Reporttypen werden mit UnknownAlertType / UnknownReportType abgelehnt.

POST subscriptions · Body
[
  { "alertTypes": ["Up", "Down"],
    "taskIds": ["7ee87894-b8a9-e311-beb2-dc85de1f0bc2"],
    "contactIds": ["4cedf037-d1d9-e311-bebc-dc85de1f0bc2"] },
  { "reportTypes": ["Month"],
    "taskIds": ["7ee87894-b8a9-e311-beb2-dc85de1f0bc2"],
    "contactIds": ["4cedf037-d1d9-e311-bebc-dc85de1f0bc2"] }
]
curl
curl -s -X POST https://api1.host-tracker.com/subscriptions \
  -H "Authorization: bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '[{"alertTypes":["Up","Down"],"taskIds":["<task>"],"contactIds":["<contact>"]}]'

Statistiken & Ergebnisse

GET stats

Uptime-/Downtime-Aggregate je Task über ein Zeitfenster. Akzeptiert den Task-Filter zur Auswahl der Tasks, plus:

ParameterTypBeschreibung
statsStartUnix / statsEndUnixint64Fenster-Start/-Ende als Unix-Sekunden (UTC).
statsStart / statsEndstringFenster-Start/-Ende als profilformatierter Datumsstring (Alternative zu den Unix-Feldern).
expectedSLAdouble0–100. Wenn gesetzt, meldet jedes Ergebnis slaExpectationSucceeded.
fullTaskboolDas vollständige Task-Objekt statt nur einer Referenz einschließen.

Response

Ein Stats-Objekt mit dem aufgelösten Fenster (duale Datumsfelder) und einem stats-Array. Jeder Eintrag trägt die Task-Referenz sowie: uptimeInMinutes/uptimeSpan, downtimeInMinutes/downtimeSpan, Wartungs-Up-/Downtimes, totalTimeInMinutes, die Prüfungszählungen pro Bucket sowie uptimePercent/downtimePercent.

Uptime-Prozentsatz: uptime% = (uptime + maintenanceUptime) / (totalTime − maintenanceDowntime). Entspricht die Gesamtzeit der Wartungs-Downtime, ist der Prozentsatz null (undefiniert). slaExpectationSucceeded ist uptime% ≥ expectedSLA.

GET outages

Ausfallzeiträume je Task. Akzeptiert den Task-Filter plus:

ParameterTypBeschreibung
startTimeUnix / endTimeUnixint64Fenster als Unix-Sekunden (UTC).
startTime / endTimestringFenster als profilformatierte Strings.
getInUtcTimeZoneintWenn gesetzt, sind formatierte Zeiten UTC statt der Profil-Zeitzone.
fullTaskboolDas vollständige Task-Objekt einschließen.

Response: ein Outages-Objekt mit dem aufgelösten Fenster und einem taskOutages-Array; jedes Element paart einen Task mit seinen outages-Zeiträumen (startTime/endTime plus Unix-Varianten, Ereignisnummern, optionalem Kommentar).

GET incident

Liste der Vorfälle (Ausfallereignisse) je Task. Akzeptiert den Task-Filter plus dieselben Fenster-/Zeitzonenparameter wie bei Ausfällen sowie:

ParameterTypBeschreibung
startTimeUnix / endTimeUnix / startTime / endTimeint64 / stringFenster (Unix und/oder formatiert).
getInUtcTimeZoneintZeiten in UTC formatieren.
fullTaskboolDas vollständige Task-Objekt einschließen.
fullLogboolDas detaillierte Recheck-Protokoll pro Agent einschließen. Erfordert ein erweitertes Paket, sonst ApiFullLogNotAllowed.

Response: ein Incidents-Objekt mit einem taskIncidents-Array. Jeder Vorfall trägt taskId, checkId, Start-/End-Unix-Zeiten, den fehlgeschlagenen location-Wert, den error, hasSnapshot, sowie (mit fullLog) einen recheck-Block mit den OK-Standorten und den fehlgeschlagenen Standorten je Fehler.

GET incident/snapshot

Ruft das gespeicherte Response-Snapshot eines Vorfalls ab. Parameter:

ParameterTypBeschreibung
taskIdguidDer Task. Erforderlich.
checkIdint64Die Prüfungs-/Ereignis-ID.
timestampUnixUtcint64Der Zeitstempel des Vorfalls (Unix-Sekunden UTC).

Gibt das Snapshot (Zeitstempel plus erfasste Bytes) zurück, sofern vorhanden, oder null, wenn für den angegebenen Vorfall kein Snapshot existiert.

GET results/http

Aggregierte HTTP-Zeitmetriken je Task. Erzwingt den Task-Typ Http. Akzeptiert den Task-Filter plus:

ParameterTypBeschreibung
resultStartUnix / resultEndUnixint64Fenster als Unix-Sekunden (UTC).
resultStart / resultEndstringFenster als profilformatierte Strings.
fullTaskboolDas vollständige Task-Objekt einschließen.

Response: ein AggregatedHttpResults-Objekt; jeder taskResults-Eintrag meldet die Task-Referenz sowie die gemittelten Werte responseTime, dnsTime, headTime, dataTime (Millisekunden).

GET cr/httpResponseTime

HTTP-Antwortzeit-Reihen je Task. Akzeptiert den Task-Filter plus startDate, endDate und groupBy. Gibt ein reines Array von Serien-Objekten zurück:

200 OK
[
  {
    "id": "ef10cd12-93f9-e311-bec5-dc85de1f0bc2",
    "rawUrl": "https://www.example.com",
    "name": "My website",
    "results": [ [1719181583, 142], [1719177983, 138] ]   // [unixSeconds, responseTimeMs], neueste zuerst
  }
]

Agenten

Agenten sind die geografisch verteilten Überwachungsstandorte. Die hier zurückgegebenen Pool-IDs sind die Werte, die Sie im Feld agentPools eines Tasks angeben.

GET agents

Listet Überwachungsagenten auf. Optionaler Query-Parameter:

ParameterTypBeschreibung
touchedintNur Agenten, die sich innerhalb der letzten N Minuten gemeldet haben. Werte ≤ 0 (oder Fehlen) bedeuten kein Filter; andernfalls auf den Bereich 1–10 begrenzt.

Jeder Agent trägt id, upFrom, datacenter (Name/Stadt/Land/Bundesland), company (Name/URL), ip, version, lon/lat sowie pools.

200 OK
[
  {
    "id": "a1b2c3d4-...-0001",
    "upFrom": "2024-06-20T08:00:00Z",
    "datacenter": { "name": "Example Hosting", "city": "Frankfurt", "country": "DE", "state": "" },
    "company": { "name": "Example Hosting", "url": "https://example-hosting.com" },
    "ip": "203.0.113.10",
    "version": "1.4.2",
    "lon": 8.68, "lat": 50.11,
    "pools": []
  }
]

GET agents/pools

Listet die öffentlichen Agent-Pools (geografische Regionen) auf. Jeder Pool trägt id, desc, seine agents, childPools und hidden. Verwenden Sie die id-Werte der Pools im Feld agentPools eines Tasks.

GET agents/ips anonym

Gibt die aktuellen IP-Adressen der Überwachungsagenten zurück — nützlich, um Host-Tracker in einer Firewall freizugeben. Dieser Endpunkt erfordert keine Authentifizierung. Standardmäßig liefert er text/plain, eine IP pro Zeile; senden Sie Accept: application/json, um stattdessen ein JSON-Array zu erhalten.

text/plain (Standard)
203.0.113.10
203.0.113.11
198.51.100.7
mit Accept: application/json
["203.0.113.10", "203.0.113.11", "198.51.100.7"]
Host-Tracker REST API v1 — host-tracker.com. Maschinenlesbares Swagger/OpenAPI ist verfügbar unter BASE_URL/docs/v1, mit einer interaktiven Sandbox unter BASE_URL/sandbox.