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.
Base URL
Jeder Pfad in diesem Dokument ist relativ zu einer Base URL zu verstehen. Zwei Einstiegspunkte bedienen dieselbe API:
| Einstiegspunkt | Base 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/tokenbezogen, gesendet alsAuthorization: bearer <token>. Dies ist das primäre Schema. - HTTP Basic —
Authorization: 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
{
"login": "your-login",
"password": "your-password"
}
| Feld | Typ | Beschreibung |
|---|---|---|
login | string | Konto-Login. Erforderlich. Die E-Mail-Adresse des Kontos wird ebenfalls akzeptiert. |
password | string | Konto-Passwort. Erforderlich. |
forLogin | string | Optional. Der Login des Hauptkontos (Super-Account), in dessen Namen gehandelt werden soll (Subaccount-Impersonation — siehe unten). |
Response — 200 OK
{
"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
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.
# 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
# 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 SieX-HT-Reason.
HTTP/1.1 400 SimilarExists
X-HT-Reason: SimilarExists
Content-Type: text/plain; charset=utf-8
Same task allready exists
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
| Code | Status | Bedeutung |
|---|---|---|
AccessDenied | 401 | Der API-Zugriff ist für dieses Konto deaktiviert, oder dem Aufrufer fehlen die erforderlichen Rechte. |
IncorrectLoginOrPassword | 401 | Login/Passwort bei users/token abgelehnt. |
WrongTicket | 401 | Das Bearer-Token ist fehlerhaft / nicht lesbar. |
TicketExpired | 401 | Das Bearer-Token ist abgelaufen — ein neues beziehen. |
RequestThrottled | 429 | Rate Limit überschritten (siehe Rate Limits). Enthält Retry-After. |
Tasks
| Code | Status | Bedeutung |
|---|---|---|
NotFound | 404 | Der angeforderte Task existiert nicht. |
SimilarExists | 400 | Ein Task mit demselben Typ und Schlüssel existiert bereits (außer das Konto erlaubt ähnliche Tasks). |
EmptyTaskData | 400 | Keine Task-Daten übermittelt. |
UncomplitedData | 400 | Die Task-Daten sind unvollständig. |
NoIdInTaskData | 400 | Eine Aktualisierung wurde angefordert, aber die Task-ID fehlt. |
WrongEditableTaskDataType | 400 | Der Typ der Bearbeitungsdaten stimmt nicht mit dem Typ des Ziel-Tasks überein. |
WrongTaskType | 400 | Unbekannter Task-Typ. |
WrongTaskStatus | 400 | Nicht unterstützter status-Wert (erwartet Enabled/Disabled). |
WrongInterval | 400 | Das Überwachungsintervall entspricht keinem der akzeptierten Werte (siehe tasks/intervals). |
EmptyUrl | 400 | Keine URL/kein Host für einen Task angegeben, der dies benötigt. |
WrongUrl | 400 | Die URL ist ungültig. |
WrongSchema | 400 | Nicht unterstütztes URL-Schema. |
BadIP | 400 | Die URL löst zu einer gesperrten oder fehlerhaften IP-Adresse auf. |
UrlInBlackList | 400 | Die URL steht auf einer internen Sperrliste. |
WrongHttpMethod | 400 | Nicht unterstützte HTTP-Methode für einen HTTP-Task (erlaubt: Get, Post, Head). |
WrongKeywordMode | 400 | Nicht unterstützter Keyword-Modus. |
WrongPort | 400 | Ungültiger Port für einen Port-Task. |
WrongAgentPool | 400 | Ein oder mehrere angeforderte Agent-Pools existieren nicht. Die Meldung listet die ungültigen und die verfügbaren Pools auf. |
SelectMoreAgents | 400 | Die gewählten Agent-Pools enthalten nicht genügend Agenten (7 erforderlich). Die Meldung listet die Anzahl je Pool auf. |
ApiFullLogNotAllowed | 400 | fullLog ist nur bei erweiterten Paketen verfügbar. |
WrongExpectedSLA | 400 | expectedSLA muss zwischen 0 und 100 liegen. |
WrongDate | 400 | Ungültiges Start-/Enddatum in einem Filter. |
WrongDateFormat | 400 | Ein Datumsstring entsprach nicht dem erforderlichen Format (in der Meldung angegeben). |
EndDateIsGreaterThanStartDate | 400 | Das Startdatum muss ≤ dem Enddatum sein. |
StartEndIntervalIsTooBig | 400 | Eine Ergebnisabfrage würde mehr als 10 000 Zeilen liefern. Die Meldung enthält das größtmögliche passende Intervall (siehe GET tasks). |
WrongSubscription | 400 | Ein im Task-Body enthaltenes Inline-Abonnement ist ungültig (der innere Code/die Meldung des Abonnements wird durchgereicht). |
EmptyFilter | 400 | Ein Massen-DELETE tasks wurde mit leerem Filter gesendet (abgelehnt, um das Löschen des gesamten Kontos zu verhindern). |
Kontakte
| Code | Status | Bedeutung |
|---|---|---|
NotFound | 404 | Der angeforderte Kontakt existiert nicht. |
SimilarExists | 400 | Ein Kontakt mit demselben Typ, Gateway, derselben Adresse und demselben Alarm-Delay existiert bereits. |
EmptyContactData | 400 | Keine Kontaktdaten übermittelt. |
UncomplitedData | 400 | Die Kontaktdaten sind unvollständig. |
NoIdInContactData | 400 | Eine Aktualisierung wurde angefordert, aber die Kontakt-ID fehlt. |
EmptyAddress | 400 | Beim Anlegen eines Kontakts wurde keine Adresse angegeben. |
WrongContactType | 400 | Unbekannter Kontakttyp (wird auch für den abgeschafften IM-Erstellungs-/Aktualisierungspfad zurückgegeben). |
WrongEditableContactDataType | 400 | Der Typ der Bearbeitungsdaten stimmt nicht mit dem Typ des Ziel-Kontakts überein. |
WrongEmailFormat | 400 | Ungültige E-Mail-Adresse, oder ein nicht unterstütztes E-Mail-Reportformat. |
WrongPhoneFormat | 400 | Eine Telefonnummer darf nur Ziffern enthalten (ein führendes + ist erlaubt). |
WrongSmsGateway | 400 | Unbekanntes SMS-Gateway. |
WrongIMGateway | 400 | Unbekanntes IM-Gateway. |
WrongAlertDelay | 400 | alertDelay entspricht keinem der akzeptierten Werte (siehe contacts/delays). |
WrongActivePeriodInterval | 400 | Ungültiger Start/Ende des aktiven Zeitraums. |
WrongActiveDay | 400 | Nicht unterstützter Name für einen aktiven Tag. |
EmptyFilter | 400 | Ein Massen-DELETE contacts wurde mit leerem Filter gesendet (abgelehnt). |
Abonnements
| Code | Status | Bedeutung |
|---|---|---|
AlertsAndReportsAreEmpty | 400 | Ein Abonnement-Eintrag gibt weder Alarmtypen noch Reporttypen an. |
UnknownAlertType | 400 | Ein Alarmtyp ist keiner von Up, Down, RepeatedlyDown. |
UnknownReportType | 400 | Ein 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).
| Geltungsbereich | Limit |
|---|---|
| Allgemeine Endpunkte, pro Konto + Endpunkt | 6 Requests/Sekunde und 120 Requests/Minute |
Bestätigungscode-Endpunkte (contacts/{id}/code), pro Konto + Endpunkt | 1 Request/Sekunde und 2 Requests/Minute |
| Anonyme Endpunkte | Dieselben 6/s + 120/min, gezählt pro Client-IP-Adresse |
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:
["API","CntCheck","Counter","DNSBL","Database","DomainExp","Http",
"Ping","Port","RusRegBL","SSLExp","Snmp","Tran","Waterfall","WebRisk"]
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:
| Wert | Bit | Effekt |
|---|---|---|
subscriptions | 1 | Bezieht die Alarm-/Report-Abonnements des Tasks in subscriptions mit ein. |
stats | 2 | Bezieht Tages-/Monats-/Jahres-/Gesamt-Uptime in stats mit ein. |
results | 4 | Bezieht Prüfergebnisse für das Fenster sdtu…edtu in results mit ein (letztes Ergebnis, wenn das Fenster weggelassen wird). |
attachedResults | — | Bezieht 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
| Parameter | Typ | Beschreibung |
|---|---|---|
ids | guid[] | Nur diese Task-IDs zurückgeben. Für eine einzelne ID bevorzugen Sie GET tasks/{id}. |
excludeIds | bool | Zusammen mit ids: alles außer diesen IDs zurückgeben. |
taskType / taskTypes | string / string[] | Nach Task-Typ filtern (Groß-/Kleinschreibung beachten), z. B. Http. |
excludeTaskTypes | bool | Den Typfilter umkehren. |
status | string | Enabled oder Disabled (Deaktivierung durch den Benutzer). Z. B. ?status=Disabled. |
url / urls | string / string[] | Nach URL filtern. Werte in urls müssen URL-kodiert sein. |
urlSearchLike | bool | Zusammen mit url (nicht urls): Substring-Suche statt exaktem Abgleich. |
excludeUrls | bool | Den URL-Filter umkehren. |
name / names | string / string[] | Nach Task-Namen filtern. name/names zusammen mit id/ids ist ein ODER; zusammen mit anderen Filtern ein UND. |
nameSearchLike | bool | Zusammen mit name: Substring-Suche. |
excludeNames | bool | Den Namensfilter umkehren. |
interval / intervals | int / int[] | Nach Überwachungsintervall (Minuten) filtern. |
excludeIntervals | bool | Den Intervallfilter umkehren. |
openStat | bool | Öffentliche Tasks (öffentliche Statistik/Ereignisprotokoll). |
lastState | bool | true = aktuell erreichbar, false = aktuell nicht erreichbar. |
tags | string[] | Nach Tag filtern. |
overlimited | bool | Tasks mit (true) oder ohne (false) Abrechnungs-Überlimit. |
active | bool | true = aktiv, false = systemseitig deaktiviert (Überlimit, niedriges Guthaben, …). Für eine Deaktivierung durch den Benutzer verwenden Sie status. |
sdtu / edtu | int64 | Unix-Sekunden (UTC) für Start/Ende eines Fensters. Wird nur berücksichtigt, wenn info=results gesetzt ist; beide Werte angeben. edtu muss > sdtu sein. |
(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).
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
{
// 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-Modus | Task ist OK, wenn… |
|---|---|
PresentAny | mindestens ein Keyword in der Response vorkommt. |
PresentAll | alle Keywords vorkommen. |
ReverseAny | alle Keywords fehlen. |
ReverseAll | mindestens ein Keyword fehlt. |
ReverseWithResult | alle 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ägthostplus die gemeinsamen Felder.tasks/port— der Body trägthostundportplus die gemeinsamen Felder.tasks/rusbl— Prüfung gegen die russische Registry-Sperrliste; der Body trägturl, zusätzlichignoreWarnings,doNotSendMsgOnWarnings,prefixMatchund die gemeinsamen Felder.
Response — 201 Created (HTTP-Task)
{
"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
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 ID —
PUT tasks/{id}(nur gemeinsame Felder), oder die typisiertenPUT 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 Filter —
PUT tasks?<filter>(nur gemeinsame Felder) oder die typisiertePUT 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.
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. http →
POST tasks/http). Der Request-Body muss JSON sein
(Content-Type: application/json). Derselbe Mechanismus existiert für Kontakte unter
contacts/$batch / contact/$batch.
| Request-Feld | Typ | Beschreibung |
|---|---|---|
method | string | HTTP-Methode des Sub-Requests (POST, PUT, DELETE…). |
relativeUrl | string | Sub-Ressource; das letzte Segment wählt die Operation (http, ping, port, rusbl…). |
contentType | string | Content-Type von content, üblicherweise application/json. |
content | string | Der Body des Sub-Requests, als JSON-String. |
| Response-Feld | Typ | Beschreibung |
|---|---|---|
code | int | HTTP-Statuscode der Sub-Response (z. B. 201, 400). |
status | string | Reason-/Statustext (trägt bei Fehlern den maschinenlesbaren Code). |
headers | object | Response-Header der Sub-Operation (z. B. Location). |
body | string | Der Body der Sub-Response. |
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\"}"
}
]
[
{ "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:
| Endpunkt | Liefert |
|---|---|
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/delays | Die akzeptierten Werte für alertDelay (Minuten): [0,5,15,30,60,180,720,360,1440,3]. |
contacts/sms/gateways | SMS-Gateway-IDs: ["clickatell","clickatella","infobip","skype","twiliosms"]. Der Standard ist twiliosms; die übrigen Einträge sind Altbestände und ggf. inaktiv. |
contacts/im/gateways | IM-Gateway-IDs: ["GTalk","SkypeChat"]. Nur aus Kompatibilitätsgründen aufgeführt — IM-Kontakte können nicht mehr angelegt werden (siehe unten). |
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.
| Filterparameter | Typ | Beschreibung |
|---|---|---|
ids / excludeIds | guid[] / bool | Nach ID auswählen oder ausschließen. |
contactType / contactTypes | string / string[] | Nach Typ filtern (Email, SMS, VoiceCall…). |
excludeContactTypes | bool | Den Typfilter umkehren. |
confirmed | bool | Bestätigte vs. unbestätigte Kontakte. |
overlimited | bool | Kontakte, die über dem Paketlimit markiert sind. |
acceptBillingNotifications | bool | Für Abrechnungsbenachrichtigungen verwendete Kontakte. |
name / names / nameSearchLike / excludeNames | string(s) / bool | Nach Namen filtern (exakt, Liste, Substring oder ausgeschlossen). |
address / addresses / addressSearchLike / excludeAddresses | string(s) / bool | Nach 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.
{
"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 */ ]
}
| Feld | Gilt für | Hinweise |
|---|---|---|
address | alle | E-Mail-Adresse oder Telefonnummer (Ziffern, optional führendes +) für SMS/Anruf. Beim Anlegen erforderlich. |
alertDelay | alle | Minuten Wartezeit vor der Alarmierung. Muss einer der Werte aus contacts/delays sein. |
activePeriodStart / activePeriodEnd | alle | HH:mm; der Zeitraum, in dem Alarme zugestellt werden. |
activeDays | alle | Beliebige aus Sunday…Saturday; Standard ist jeder Tag. |
reportFormat, sendNews, sendBillingNotifications | E-Mail-Optionen. | |
gateway | SMS | Einer 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:
| Status | Bedeutung |
|---|---|
Confirmed | Kontakt wurde bereits bestätigt angelegt (kein Code erforderlich). |
CodeSent | Ein Bestätigungscode wurde versendet; der Kontakt wird nach Bestätigung aktiv. |
CodeSentEarlier | Ein Code wurde bereits kürzlich gesendet und ist noch gültig. |
CodeFail | Kontakt wurde angelegt, aber der Versand des Codes ist fehlgeschlagen; später erneut versuchen. |
LowSmsBalance | Der Code konnte nicht gesendet werden, da das Guthaben des Kontos zu niedrig ist. |
Overlimited | Der Kontakt liegt über dem Paketlimit. |
PUT contacts & typisierte Varianten
- Nach ID —
PUT contacts/{id}(gemeinsame Felder), oder typisiertPUT contacts/email/{id},contacts/sms/{id},contacts/voice/{id}. Nur die übermittelten Felder werden geändert. - Nach Filter —
PUT contacts?<filter>oder typisiertPUT 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 einContactOperationResultmit einem Status wieCodeSentzurück.POST contacts/{id}/code— bestätigt den Kontakt durch Übermitteln des Codes. Body:{ "code": "12345" }. Bei Erfolg wird der Kontakt bestätigt.
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
{
"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/reportTypesist erforderlich, sonstAlertsAndReportsAreEmpty. - Wird
taskIdsweggelassen, gilt standardmäßig alle Ihre Tasks; wirdcontactIdsweggelassen, 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
| Endpunkt | Liefert |
|---|---|
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:
| Parameter | Typ | Beschreibung |
|---|---|---|
taskId | guid | Nur Abonnements für diesen Task. |
contactId | guid | Nur Abonnements für diesen Kontakt. |
types | string[] | 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.
[
{ "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 -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:
| Parameter | Typ | Beschreibung |
|---|---|---|
statsStartUnix / statsEndUnix | int64 | Fenster-Start/-Ende als Unix-Sekunden (UTC). |
statsStart / statsEnd | string | Fenster-Start/-Ende als profilformatierter Datumsstring (Alternative zu den Unix-Feldern). |
expectedSLA | double | 0–100. Wenn gesetzt, meldet jedes Ergebnis slaExpectationSucceeded. |
fullTask | bool | Das 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% = (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:
| Parameter | Typ | Beschreibung |
|---|---|---|
startTimeUnix / endTimeUnix | int64 | Fenster als Unix-Sekunden (UTC). |
startTime / endTime | string | Fenster als profilformatierte Strings. |
getInUtcTimeZone | int | Wenn gesetzt, sind formatierte Zeiten UTC statt der Profil-Zeitzone. |
fullTask | bool | Das 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:
| Parameter | Typ | Beschreibung |
|---|---|---|
startTimeUnix / endTimeUnix / startTime / endTime | int64 / string | Fenster (Unix und/oder formatiert). |
getInUtcTimeZone | int | Zeiten in UTC formatieren. |
fullTask | bool | Das vollständige Task-Objekt einschließen. |
fullLog | bool | Das 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:
| Parameter | Typ | Beschreibung |
|---|---|---|
taskId | guid | Der Task. Erforderlich. |
checkId | int64 | Die Prüfungs-/Ereignis-ID. |
timestampUnixUtc | int64 | Der 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:
| Parameter | Typ | Beschreibung |
|---|---|---|
resultStartUnix / resultEndUnix | int64 | Fenster als Unix-Sekunden (UTC). |
resultStart / resultEnd | string | Fenster als profilformatierte Strings. |
fullTask | bool | Das 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:
[
{
"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:
| Parameter | Typ | Beschreibung |
|---|---|---|
touched | int | Nur 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.
[
{
"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.
203.0.113.10
203.0.113.11
198.51.100.7
["203.0.113.10", "203.0.113.11", "198.51.100.7"]