Nessuna sezione corrispondente.

Host-Tracker REST API v1

Una API HTTP stabile, autenticata tramite token, per gestire task di monitoraggio dei siti web, contatti, sottoscrizioni di avvisi/report e per leggere statistiche, interruzioni e incidenti.

Questa è la API v1. Non esegue controlli istantanei e utilizza uno schema di autenticazione diverso rispetto alla API v2 — le due non sono interscambiabili. Per i controlli istantanei automatizzati utilizza invece la API v2.

URL di base

Ogni percorso in questo documento è relativo a un URL di base. Due punti di ingresso servono la stessa API:

Punto di ingressoURL di base (BASE_URL)Note
Diretto https://api1.host-tracker.com/ Consigliato per integrazioni server-to-server.
Tramite il sito principale https://www.host-tracker.com/api/web/v1/ Instradato in reverse proxy verso lo stesso servizio. Comodo se comunichi già con www.host-tracker.com.

In questo riferimento, una chiamata scritta come GET tasks indica GET BASE_URL/tasks — ad es. https://api1.host-tracker.com/tasks oppure https://www.host-tracker.com/api/web/v1/tasks.

Tipo di contenuto e metodi HTTP

Le richieste e le risposte sono in application/json per impostazione predefinita (vedi Convenzioni per l'XML). L'API utilizza i metodi HTTP standard:

  • GET — legge le entità (task, contatti, sottoscrizioni, statistiche, interruzioni, incidenti, agenti).
  • POST — crea un'entità o avvia un'azione.
  • PUT — aggiorna le entità esistenti.
  • DELETE — rimuove le entità.
  • PATCH — aggiornamenti parziali (usato per reinviare il codice di conferma di un contatto).

Override del metodo HTTP

Se il tuo client non può inviare PUT, DELETE o PATCH, invia una POST aggiungendo un header X-HTTP-Method-Override che indichi il verbo desiderato. Ad esempio, per aggiornare i task, esegui una POST su tasks con X-HTTP-Method-Override: PUT.

Convenzioni

Serializzazione JSON

Il JSON utilizza nomi di proprietà in camelCase. I campi nulli vengono omessi dalle risposte (gli array vuoti vengono comunque emessi come []). L'ordine delle proprietà è stabile: prima l'identificatore e l'indirizzo/URL, poi i campi ereditati, infine i campi specifici del tipo.

Data e ora

Le risposte di creazione/lettura dei task riportano i timestamp come stringhe ISO-8601 UTC (ad es. 2024-06-21T22:26:23Z). Gli endpoint di statistiche, interruzioni, incidenti e risultati usano inoltre una doppia rappresentazione: ogni orario compare sia come campo intero in secondi Unix (suffisso Unix) sia come stringa leggibile formattata secondo il formato data e il fuso orario del profilo dell'account. I filtri delle richieste accettano secondi Unix e/o stringhe formattate a seconda dell'endpoint (documentato per ciascun endpoint più avanti). Tutti i timestamp Unix sono espressi in secondi a partire da 1970-01-01T00:00:00Z.

Negoziazione del contenuto XML

Tutti gli endpoint possono restituire anche XML. Invia Accept: application/xml per ricevere un corpo XML invece di JSON; la risposta utilizza la classica rappresentazione .NET XmlSerializer dello stesso grafo di oggetti. JSON è il formato predefinito e consigliato.

CORS

Le richieste cross-origin sono consentite. Le richieste semplici (senza credenziali) sono accettate da qualsiasi origine (Access-Control-Allow-Origin: *). Le richieste che inviano cookie/credenziali sono accettate solo da origini *.host-tracker.com. I chiamanti basati su token (che usano l'header Authorization, come documentato qui) non sono soggetti alla restrizione sulle origini con credenziali.

Autenticazione

Ogni endpoint, ad eccezione di POST users/token e degli endpoint anonimi di elenco agenti, richiede l'autenticazione. Sono accettati due schemi:

  • Bearer token — ottenuto da POST users/token, inviato come Authorization: bearer <token>. Questo è lo schema principale.
  • HTTP BasicAuthorization: Basic <base64(login:password)>. Le credenziali vengono decodificate come ISO-8859-1. Comodo per test rapidi; per l'automazione è preferibile il bearer token.

POST users/token anonimo

Scambia un login e una password con un bearer token. Il token è valido per 48 ore.

Corpo della richiesta

application/json
{
  "login": "your-login",
  "password": "your-password"
}
CampoTipoDescrizione
loginstringLogin dell'account. Obbligatorio. È accettata anche l'email dell'account.
passwordstringPassword dell'account. Obbligatorio.
forLoginstringFacoltativo. Il login del super-account per conto del quale operare (impersonificazione di sottoaccount — vedi sotto).

Risposta — 200 OK

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

In caso di errore la risposta è 401 con il codice macchina IncorrectLoginOrPassword (oppure AccessDenied se l'accesso API è disabilitato per l'account) e un header WWW-Authenticate: Bearer.

Utilizzo del token

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

Impersonificazione di sottoaccount (forLogin)

Se un super-account ha concesso al tuo sottoaccount l'accesso ai propri dati, accedi come sottoaccount ma passa il login del super-account in forLogin. Il token restituito ti permette quindi di gestire il super-account esattamente come se gli endpoint fossero chiamati per il tuo stesso account, nei limiti dei diritti concessi dal super-account. Ad esempio, se ha concesso l'accesso in sola lettura ai task di monitoraggio, le chiamate GET riescono ma le POST/PUT/PATCH/DELETE sui task vengono rifiutate.

esempio end-to-end
# 1. Ottieni un token di impersonificazione
POST BASE_URL/users/token HTTP/1.1
Content-Type: application/json

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

# 2. Usa il ticket restituito per leggere i task del SUPER-account
GET BASE_URL/tasks HTTP/1.1
Authorization: bearer <ticket from step 1>

curl

bash
# recupera un token e memorizzalo
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)

# chiama un endpoint autenticato
curl -s https://api1.host-tracker.com/tasks \
  -H "Authorization: bearer $TOKEN"

Errori e codici macchina

Gli errori restituiscono un codice di stato HTTP standard più un breve codice leggibile dalla macchina su cui la tua integrazione può basare la logica. Il corpo è una descrizione in testo semplice in inglese (non JSON), pensata per persone/log.

Il codice macchina viene fornito in due modi:

  • X-HT-Reason header di risposta — riporta il codice su ogni risposta e ogni versione HTTP. Questo è il modo consigliato per rilevare il tipo di errore.
  • Frase motivo HTTP/1.1 (reason phrase) — la status line riporta ad es. HTTP/1.1 400 SimilarExists. Mantenuta per compatibilità con le versioni precedenti, ma nota che HTTP/2 e HTTP/3 hanno rimosso le reason phrase dal protocollo, quindi questo campo può essere vuoto quando la connessione negozia HTTP/2+. Preferisci X-HT-Reason.
esempio di risposta di errore
HTTP/1.1 400 SimilarExists
X-HT-Reason: SimilarExists
Content-Type: text/plain; charset=utf-8

Same task allready exists
Sfide di autenticazione. Un token mancante o non valido restituisce 401 con WWW-Authenticate: Bearer e uno tra AccessDenied, WrongTicket, TicketExpired o IncorrectLoginOrPassword.

Riferimento dei codici di errore

Tutti i codici macchina che l'API può restituire, raggruppati per area, con il tipico stato HTTP. Salvo diversa indicazione, gli errori sono 400 Bad Request.

Autenticazione

CodiceStatoSignificato
AccessDenied401L'accesso API è disabilitato per questo account, oppure il chiamante non dispone dei diritti richiesti.
IncorrectLoginOrPassword401Login/password rifiutati su users/token.
WrongTicket401Il bearer token è malformato / illeggibile.
TicketExpired401Il bearer token è scaduto — ottienine uno nuovo.
RequestThrottled429Limite di frequenza superato (vedi Limiti di frequenza). Include Retry-After.

Task

CodiceStatoSignificato
NotFound404Il task richiesto non esiste.
SimilarExists400Esiste già un task con lo stesso tipo e la stessa chiave (a meno che l'account non consenta task simili).
EmptyTaskData400Nessun dato del task fornito.
UncomplitedData400I dati del task sono incompleti.
NoIdInTaskData400È stato richiesto un aggiornamento ma manca l'id del task.
WrongEditableTaskDataType400Il tipo del payload di modifica non corrisponde al tipo del task di destinazione.
WrongTaskType400Tipo di task sconosciuto.
WrongTaskStatus400Valore di status non supportato (atteso Enabled/Disabled).
WrongInterval400L'intervallo di monitoraggio non è tra i valori accettati (vedi tasks/intervals).
EmptyUrl400Nessun URL/host fornito per un task che lo richiede.
WrongUrl400L'URL non è valido.
WrongSchema400Schema URL non supportato.
BadIP400L'URL viene risolto in un indirizzo IP negato o malformato.
UrlInBlackList400L'URL è presente in una lista di blocco interna.
WrongHttpMethod400Metodo HTTP non supportato per un task HTTP (consentiti: Get, Post, Head).
WrongKeywordMode400Modalità parola chiave non supportata.
WrongPort400Porta non valida per un task di tipo port.
WrongAgentPool400Uno o più pool di agenti richiesti non esistono. Il messaggio elenca i pool errati e quelli disponibili.
SelectMoreAgents400I pool di agenti selezionati non contengono abbastanza agenti (ne sono richiesti 7). Il messaggio elenca i conteggi per pool.
ApiFullLogNotAllowed400fullLog è disponibile solo sui pacchetti avanzati.
WrongExpectedSLA400expectedSLA deve essere compreso tra 0 e 100.
WrongDate400Data di inizio/fine non valida in un filtro.
WrongDateFormat400Una stringa di data non corrisponde al formato richiesto (indicato nel messaggio).
EndDateIsGreaterThanStartDate400La data di inizio deve essere ≤ alla data di fine.
StartEndIntervalIsTooBig400Una query sui risultati restituirebbe più di 10 000 righe. Il messaggio include l'intervallo consentito (vedi GET tasks).
WrongSubscription400Una sottoscrizione inline nel corpo del task non è valida (il codice/messaggio interno della sottoscrizione viene riportato).
EmptyFilter400Una DELETE tasks massiva è stata inviata con un filtro vuoto (rifiutata per evitare di eliminare l'intero account).

Contatti

CodiceStatoSignificato
NotFound404Il contatto richiesto non esiste.
SimilarExists400Esiste già un contatto con lo stesso tipo, gateway, indirizzo e ritardo di avviso.
EmptyContactData400Nessun dato del contatto fornito.
UncomplitedData400I dati del contatto sono incompleti.
NoIdInContactData400È stato richiesto un aggiornamento ma manca l'id del contatto.
EmptyAddress400Nessun indirizzo fornito durante la creazione di un contatto.
WrongContactType400Tipo di contatto sconosciuto (restituito anche per il percorso di creazione/aggiornamento IM ormai dismesso).
WrongEditableContactDataType400Il tipo del payload di modifica non corrisponde al tipo del contatto di destinazione.
WrongEmailFormat400Indirizzo email non valido, oppure formato di report email non supportato.
WrongPhoneFormat400Un numero di telefono deve contenere solo cifre (è consentito un + iniziale).
WrongSmsGateway400Gateway SMS sconosciuto.
WrongIMGateway400Gateway IM sconosciuto.
WrongAlertDelay400alertDelay non è tra i valori accettati (vedi contacts/delays).
WrongActivePeriodInterval400Inizio/fine del periodo attivo non validi.
WrongActiveDay400Nome del giorno attivo non supportato.
EmptyFilter400Una DELETE contacts massiva è stata inviata con un filtro vuoto (rifiutata).

Sottoscrizioni

CodiceStatoSignificato
AlertsAndReportsAreEmpty400Una voce di sottoscrizione non specifica né tipi di avviso né tipi di report.
UnknownAlertType400Un tipo di avviso non è tra Up, Down, RepeatedlyDown.
UnknownReportType400Un tipo di report non è tra Day, Week, Month, Quarter, Year.

Limiti di frequenza

Le richieste sono soggette a un limite di frequenza per client e per endpoint. Il superamento di un limite restituisce 429 con codice macchina RequestThrottled e un header Retry-After (in secondi).

AmbitoLimite
Endpoint generali, per account + endpoint6 richieste/secondo e 120 richieste/minuto
Endpoint dei codici di conferma (contacts/{id}/code), per account + endpoint1 richiesta/secondo e 2 richieste/minuto
Endpoint anonimiStessi 6/s + 120/min, calcolati per indirizzo IP del client
risposta 429
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."

Task di monitoraggio

GET tasks/types

Restituisce l'array dei nomi dei tipi di task conosciuti dal sistema:

200 OK
["API","CntCheck","Counter","DNSBL","Database","DomainExp","Http",
 "Ping","Port","RusRegBL","SSLExp","Snmp","Tran","Waterfall","WebRisk"]
I task esistenti di uno qualsiasi di questi tipi possono essere letti tramite questa API. I task possono essere creati/aggiornati tramite gli endpoint tipizzati solo per quattro tipi: Http Ping Port RusRegBL (creati rispettivamente su tasks/http, tasks/ping, tasks/port, tasks/rusbl).

GET tasks/intervals

Restituisce l'array degli intervalli di monitoraggio (in minuti) accettati per il tuo account, ad es. [1,5,15,30,60]. Usa uno di questi valori per il campo interval quando crei un task; qualsiasi altro valore genera WrongInterval.

GET tasks

Elenca i task di monitoraggio. Tutti i parametri di query sono facoltativi; se nessuno viene specificato, vengono restituiti tutti i task dell'account. Ripeti un parametro per passare un array, ad es. ?ids=guid1&ids=guid2.

Il parametro info

Richiede dati aggiuntivi incorporati in ciascun task. Combina i valori con virgole (?info=stats,subscriptions) oppure passa l'intero bitmask equivalente:

ValoreBitEffetto
subscriptions1Include le sottoscrizioni di avviso/report del task in subscriptions.
stats2Include l'uptime giornaliero/mensile/annuale/totale in stats.
results4Include i risultati dei controlli per la finestra sdtuedtu in results (ultimo risultato se la finestra viene omessa).
attachedResultsInclude gli ultimi risultati dei controlli collegati (certificato, scadenza dominio, DNSBL) in attached. Richiede i relativi flag check… sul task.

?info=stats,subscriptions,results equivale a ?info=7.

Parametri di filtro

ParametroTipoDescrizione
idsguid[]Restituisce solo questi id di task. Per un singolo id, preferisci GET tasks/{id}.
excludeIdsboolCon ids: restituisce tutto tranne quegli id.
taskType / taskTypesstring / string[]Filtra per tipo di task (sensibile a maiuscole/minuscole), ad es. Http.
excludeTaskTypesboolInverte il filtro per tipo.
statusstringEnabled o Disabled (disabilitazione da parte dell'utente). Ad es. ?status=Disabled.
url / urlsstring / string[]Filtra per URL. I valori in urls devono essere URL-encoded.
urlSearchLikeboolCon url (non urls): corrispondenza per sottostringa invece che esatta.
excludeUrlsboolInverte il filtro per URL.
name / namesstring / string[]Filtra per nome del task. name/names combinato con id/ids è un OR; combinato con altri filtri è un AND.
nameSearchLikeboolCon name: corrispondenza per sottostringa.
excludeNamesboolInverte il filtro per nome.
interval / intervalsint / int[]Filtra per intervallo di monitoraggio (minuti).
excludeIntervalsboolInverte il filtro per intervallo.
openStatboolTask pubblici (statistiche/registro eventi pubblici).
lastStatebooltrue = attualmente up, false = attualmente down.
tagsstring[]Filtra per tag.
overlimitedboolTask con (true) o senza (false) un overlimit di fatturazione.
activebooltrue = attivo, false = disabilitato dal sistema (overlimit, saldo basso, …). Per la disabilitazione da parte dell'utente usa status.
sdtu / edtuint64Secondi Unix (UTC) di inizio/fine di una finestra. Usati solo quando è impostato info=results; forniscili entrambi. edtu deve essere > sdtu.
Limite di righe dei risultati. Quando si richiedono i risultati, il numero di righe stimato (edtu − sdtu) × (#task) / (intervallo medio) non deve superare 10 000. In caso contrario la risposta è 400 StartEndIntervalIsTooBig, il cui messaggio include l'intervallo più grande che rientrerebbe nel limite. Questo limite si applica solo alla lettura dei risultati dei task.

Risposta — 200 OK

Un array di oggetti task. I campi esatti dipendono dal tipo di task; la base comune include id, name, taskType, enabled, interval, lastState, creationTime, tags, agentPools e (quando richiesto tramite info) subscriptions, stats, results e attached. Quando i risultati sono inclusi, ciascun risultato riporta almeno timestamp (secondi Unix UTC) ed eventNumber; i campi restanti sono specifici per tipo di task (vedi la risposta di creazione più sotto per la forma HTTP).

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

GET tasks/{id:guid}

Recupera un singolo task per id. Accetta lo stesso parametro info (e sdtu/edtu quando info=results). Restituisce l'oggetto task, oppure 404 NotFound se non esiste.

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

Crea un task di monitoraggio del tipo specificato. In caso di successo restituisce 201 Created, un header relativo Location: /tasks/{id} e l'oggetto task creato completo.

Corpo della richiesta — task HTTP

POST tasks/http · application/json
{
  // campi specifici HTTP
  "url": "https://www.example.com",        // OBBLIGATORIO
  "httpMethod": "Get",                       // Get | Post | Head (predefinito Get)
  "userAgent": "MyMonitor",
  "referer": "https://www.google.com",
  "acceptHeader": "application/json",
  "followRedirect": false,
  "treat300AsError": false,                // se impostato, followRedirect viene ignorato
  "checkDnsbl": false,                       // verifica il dominio rispetto alle liste di blocco DNS
  "checkDomainExpiration": false,            // monitora la scadenza del dominio (solo domini validi)
  "checkCertificateExpiration": false,       // monitora la scadenza del certificato TLS (solo https)
  "checkRussianBlackLists": false,
  "checkWebRisk": false,
  "timeout": 40000,                          // ms prima che un controllo fallisca
  "keywords": ["error", "maintenance"],
  "keywordMode": "ReverseAny",             // vedi le modalità parola chiave più sotto
  "userName": "basic-auth-user",          // credenziali per la risorsa monitorata
  "password": "basic-auth-pass",
  "postParameters": "a=1\r\nb=2",          // solo con httpMethod=Post
  "ignoredStatuses": [404, 500],

  // campi comuni a ogni tipo di task
  "interval": 5,                             // minuti; deve essere un intervallo accettato
  "enabled": true,
  "fullLog": false,                          // solo pacchetti avanzati
  "openStat": true,
  "name": "My website",
  "tags": ["production", "web"],
  "agentPools": ["westeurope", "asia"],  // vedi le note più sotto
  "subscriptions": [ /* sottoscrizioni inline, vedi sotto */ ]
}
Modalità parola chiaveIl task è OK quando…
PresentAnyuna qualsiasi parola chiave è presente nella risposta.
PresentAlltutte le parole chiave sono presenti.
ReverseAnytutte le parole chiave sono assenti.
ReverseAlluna qualsiasi parola chiave è assente.
ReverseWithResulttutte le parole chiave sono assenti; il messaggio di errore include il resto della riga di risposta in cui è comparsa la prima parola chiave (vengono analizzati i primi 100 caratteri di ciascuna riga).
agentPools seleziona le posizioni di monitoraggio. È facoltativo (altrimenti viene usato il valore predefinito del profilo). Se specificato, i pool devono contenere insieme almeno 7 agenti, altrimenti la richiesta fallisce con SelectMoreAgents. Id di pool sconosciuti falliscono con WrongAgentPool. Gli id dei pool provengono da GET agents/pools.

Sottoscrizioni inline

L'array subscriptions sottoscrive dei contatti agli avvisi/report di questo task al momento della creazione. Ogni voce utilizza la forma delle sottoscrizioni; non impostare taskIds (è fissato al nuovo task). Se contactIds viene omesso, vengono sottoscritti tutti i tuoi contatti confermati. Le sottoscrizioni di report vengono applicate solo ai contatti Email.

Altri tipi di task

  • tasks/ping — il corpo riporta host più i campi comuni.
  • tasks/port — il corpo riporta host e port più i campi comuni.
  • tasks/rusbl — controllo della lista di blocco del registro russo; il corpo riporta url, più ignoreWarnings, doNotSendMsgOnWarnings, prefixMatch e i campi comuni.

Risposta — 201 Created (task HTTP)

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 & varianti tipizzate

Aggiorna i task. Due modalità:

  • Per idPUT tasks/{id} (solo campi comuni), oppure le varianti tipizzate PUT tasks/http/{id}, tasks/ping/{id}, tasks/port/{id}, tasks/rusbl/{id} (anche campi specifici del tipo). Il corpo ha la stessa forma modificabile della creazione; vengono modificati solo i campi che includi.
  • Per filtroPUT tasks?<filter> (solo campi comuni) oppure la variante tipizzata PUT tasks/{type}?<filter> (che vincola il filtro a quel tipo). Usa gli stessi parametri di filtro di GET tasks. Restituisce il/i task aggiornato/i.

La PUT tasks / PUT tasks/{id} non tipizzata può modificare solo i campi comuni a tutti i tipi di task — usa un endpoint tipizzato per cambiare le impostazioni specifiche del tipo.

DELETE tasks/{id:guid} & tasks

  • DELETE tasks/{id} — elimina un singolo task; restituisce il task eliminato.
  • DELETE tasks?<filter> — eliminazione massiva tramite il filtro dei task (un filtro può anche essere fornito nel corpo della richiesta). Restituisce i task eliminati.
Il filtro vuoto viene rifiutato. Una DELETE tasks massiva senza un filtro selettivo restituisce 400 EmptyFilter invece di eliminare l'intero account. Per eliminare tutto intenzionalmente, itera esplicitamente.

POST tasks/$batch · task/$batch

Esegue più operazioni sui task in un'unica richiesta. Il corpo è un array JSON di sotto-richieste; la risposta è un array JSON di sotto-risposte nello stesso ordine. La sotto-operazione viene scelta in base all'ultimo segmento di relativeUrl (ad es. httpPOST tasks/http). Il corpo della richiesta deve essere JSON (Content-Type: application/json). Lo stesso meccanismo esiste per i contatti su contacts/$batch / contact/$batch.

Campo della richiestaTipoDescrizione
methodstringMetodo HTTP della sotto-richiesta (POST, PUT, DELETE…).
relativeUrlstringSotto-risorsa; l'ultimo segmento seleziona l'operazione (http, ping, port, rusbl…).
contentTypestringTipo di contenuto di content, di solito application/json.
contentstringIl corpo della sotto-richiesta, come stringa JSON.
Campo della rispostaTipoDescrizione
codeintCodice di stato HTTP della sotto-risposta (ad es. 201, 400).
statusstringTesto del motivo/stato (riporta il codice macchina in caso di errori).
headersobjectHeader di risposta della sotto-operazione (ad es. Location).
bodystringIl corpo della sotto-risposta.
richiesta · 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\"}"
  }
]
risposta · 200 OK
[
  { "code": 201, "status": "Created",
    "headers": { "Location": "/tasks/ef10cd12-...-0bc2" },
    "body": "{ ...task http creato... }" },
  { "code": 201, "status": "Created",
    "headers": { "Location": "/tasks/7a20de34-...-1cd3" },
    "body": "{ ...task ping creato... }" }
]

Contatti

I contatti sono le destinazioni che ricevono avvisi e report (indirizzi email, numeri di telefono per SMS/chiamate vocali). Gli id dei contatti vengono utilizzati durante la creazione delle sottoscrizioni.

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

Enumerazioni statiche utilizzate dagli endpoint dei contatti:

EndpointRestituisce
contacts/types["Email","IM","SMS","VoiceCall"] — i tipi di contatto enumerati da questa API. I tipi creabili sono Email, SMS e VoiceCall (IM è dismesso — vedi sotto).
contacts/delaysI valori accettati per alertDelay (minuti): [0,5,15,30,60,180,720,360,1440,3].
contacts/sms/gatewaysId dei gateway SMS: ["clickatell","clickatella","infobip","skype","twiliosms"]. Il predefinito è twiliosms; le altre voci sono legacy e potrebbero essere inattive.
contacts/im/gatewaysId dei gateway IM: ["GTalk","SkypeChat"]. Elencati solo per compatibilità — i contatti IM non possono più essere creati (vedi sotto).
I contatti IM sono dismessi. GET contacts/im/gateways restituisce ancora l'elenco dei gateway, ma POST contacts/im e PUT contacts/im ora restituiscono 400 WrongContactType. I contatti IM esistenti non sono creabili tramite questa API.

GET contacts & contacts/{id:guid}

Elenca i contatti (con filtro opzionale) o ne recupera uno per id. Aggiungi ?info=subscriptions per incorporare le sottoscrizioni di ciascun contatto. Senza filtro, vengono restituiti tutti i contatti dell'account.

Parametro di filtroTipoDescrizione
ids / excludeIdsguid[] / boolSeleziona o esclude per id.
contactType / contactTypesstring / string[]Filtra per tipo (Email, SMS, VoiceCall…).
excludeContactTypesboolInverte il filtro per tipo.
confirmedboolContatti confermati o non confermati.
overlimitedboolContatti contrassegnati come oltre il limite del pacchetto.
acceptBillingNotificationsboolContatti usati per le notifiche di fatturazione.
name / names / nameSearchLike / excludeNamesstring(s) / boolFiltra per nome (esatto, elenco, sottostringa o esclusione).
address / addresses / addressSearchLike / excludeAddressesstring(s) / boolFiltra per indirizzo.

Oggetto contatto

Campi comuni: id, confirmed, contactType, name, address, alertDelay, activePeriodStart/activePeriodEnd (HH:mm), activeDays, sendCost. I contatti email aggiungono reportFormat (Text/ShortText), sendNews, sendBillingNotifications; i contatti SMS/IM aggiungono gateway.

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

Crea un contatto. Restituisce 201 Created, un header relativo Location: /contacts/{id} e un ContactOperationResult ({ contact, status }) il cui status riporta l'esito della conferma.

POST contacts/email · application/json
{
  "address": "ops@@example.com",          // OBBLIGATORIO
  "name": "Ops mailbox",
  "alertDelay": 0,                        // minuti; uno tra contacts/delays
  "reportFormat": "Text",               // Text | ShortText (solo email)
  "activePeriodStart": "00:00",        // finestra oraria di silenzio facoltativa (HH:mm)
  "activePeriodEnd": "23:59",
  "activeDays": ["Monday", "Tuesday"],   // facoltativo; predefinito tutti i giorni
  "subscriptions": [ /* sottoscrizioni inline facoltative */ ]
}
CampoSi applica aNote
addresstuttiIndirizzo email, oppure numero di telefono (cifre, con + iniziale facoltativo) per SMS/voce. Obbligatorio in creazione.
alertDelaytuttiMinuti di attesa prima di avvisare. Deve essere uno tra contacts/delays.
activePeriodStart / activePeriodEndtuttiHH:mm; la finestra durante la quale vengono recapitati gli avvisi.
activeDaystuttiUno o più tra SundaySaturday; il valore predefinito è ogni giorno.
reportFormat, sendNews, sendBillingNotificationsemailOpzioni email.
gatewaysmsUno tra contacts/sms/gateways; predefinito twiliosms.

I contatti SMS e voce usano per impostazione predefinita i gateway twiliosms / twiliovoice, ottengono un prezzo predefinito per messaggio e memorizzano il numero con un + iniziale. Modificare l'indirizzo o il gateway di un contatto ne azzera lo stato di conferma.

Valori dello stato di conferma

Il campo status del risultato riporta l'esito dell'invio del codice di conferma:

StatoSignificato
ConfirmedContatto creato già confermato (nessun codice necessario).
CodeSentÈ stato inviato un codice di conferma; il contatto diventa attivo una volta confermato.
CodeSentEarlierUn codice è già stato inviato di recente ed è ancora valido.
CodeFailContatto creato ma l'invio del codice non è riuscito; riprova più tardi.
LowSmsBalanceImpossibile inviare il codice perché il saldo dell'account è troppo basso.
OverlimitedIl contatto supera il limite del pacchetto.

PUT contacts & varianti tipizzate

  • Per idPUT contacts/{id} (campi comuni), oppure le varianti tipizzate PUT contacts/email/{id}, contacts/sms/{id}, contacts/voice/{id}. Vengono modificati solo i campi che invii.
  • Per filtroPUT contacts?<filter> oppure la variante tipizzata PUT contacts/{type}?<filter> (vincola il filtro a quel tipo), usando il filtro dei contatti.

PUT contacts/im (in entrambe le forme) restituisce 400 WrongContactType.

DELETE contacts/{id:guid} & contacts

Elimina un contatto per id, oppure elimina in massa tramite il filtro dei contatti. Come per i task, un'eliminazione massiva con filtro vuoto viene rifiutata con 400 EmptyFilter.

Codici di conferma

I contatti non confermati devono confermare la proprietà con un breve codice recapitato all'indirizzo del contatto.

  • PATCH contacts/{id}/code — (ri)emette e invia il codice di conferma. Restituisce un ContactOperationResult con uno status come CodeSent.
  • POST contacts/{id}/code — conferma il contatto inviando il codice. Corpo: { "code": "12345" }. In caso di successo il contatto diventa confermato.
Questi endpoint hanno un limite di frequenza più stretto: 1 richiesta/secondo e 2 richieste/minuto.

Avvisi e sottoscrizioni

Una sottoscrizione collega uno o più task e contatti a un insieme di tipi di avviso e/o report. Una singola voce di sottoscrizione effettua un prodotto cartesiano tra i suoi task e contatti, producendo un avviso/report per ciascuna combinazione (task, contatto, tipo).

Forma della sottoscrizione

voce di sottoscrizione
{
  "alertTypes": ["Up", "Down"],       // uno tra Up, Down, RepeatedlyDown
  "reportTypes": ["Day", "Month"],     // uno tra Day, Week, Month, Quarter, Year
  "taskIds": ["<task guid>"],
  "contactIds": ["<contact guid>"]
}
  • È richiesto almeno uno tra alertTypes / reportTypes, altrimenti AlertsAndReportsAreEmpty.
  • Omettere taskIds equivale a tutti i tuoi task; omettere contactIds equivale a tutti i tuoi contatti. Un array vuoto esplicito significa "nessuno".
  • Le sottoscrizioni di report si applicano solo ai contatti Email — i tipi di report su contatti non Email vengono ignorati silenziosamente (le loro sottoscrizioni di avviso vengono comunque create).
  • Gli id che non possiedi vengono ignorati.

GET subscriptions/alertTypes · subscriptions/reportTypes

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

GET subscriptions

Elenca le sottoscrizioni. Restituisce una voce per ogni sottoscrizione di avviso o report trovata (mai unite). Filtri facoltativi:

ParametroTipoDescrizione
taskIdguidSolo le sottoscrizioni per questo task.
contactIdguidSolo le sottoscrizioni per questo contatto.
typesstring[]Solo questi tipi di avviso/report. I nomi non riconosciuti vengono qui ignorati (a differenza di POST/DELETE, che li rifiutano).

POST subscriptions · DELETE subscriptions

Entrambe accettano un array JSON di voci di sottoscrizione nel corpo. POST aggiunge le sottoscrizioni descritte (vengono inserite solo le righe nuove); DELETE rimuove quelle esistenti. Entrambe restituiscono 200 OK con corpo vuoto. I tipi di avviso/report sconosciuti vengono rifiutati con UnknownAlertType / UnknownReportType.

POST subscriptions · corpo
[
  { "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>"]}]'

Statistiche e risultati

GET stats

Aggregati di uptime/downtime per task su una finestra temporale. Accetta il filtro dei task per selezionare i task, più:

ParametroTipoDescrizione
statsStartUnix / statsEndUnixint64Inizio/fine della finestra in secondi Unix (UTC).
statsStart / statsEndstringInizio/fine della finestra come stringa di data formattata secondo il profilo (alternativa ai campi Unix).
expectedSLAdouble0–100. Se impostato, ciascun risultato riporta slaExpectationSucceeded.
fullTaskboolInclude l'oggetto task completo invece del solo riferimento.

Risposta

Un oggetto Stats con la finestra risolta (doppi campi data) e un array stats. Ogni voce riporta il riferimento al task e: uptimeInMinutes/uptimeSpan, downtimeInMinutes/downtimeSpan, i tempi di manutenzione up/down, totalTimeInMinutes, i conteggi dei controlli per bucket, e uptimePercent/downtimePercent.

Percentuale di uptime: uptime% = (uptime + maintenanceUptime) / (totalTime − maintenanceDowntime). Quando il tempo totale equivale al downtime di manutenzione, la percentuale è null (indefinita). slaExpectationSucceeded è uptime% ≥ expectedSLA.

GET outages

Intervalli di downtime per task. Accetta il filtro dei task più:

ParametroTipoDescrizione
startTimeUnix / endTimeUnixint64Finestra in secondi Unix (UTC).
startTime / endTimestringFinestra come stringhe formattate secondo il profilo.
getInUtcTimeZoneintSe impostato, gli orari formattati sono in UTC anziché nel fuso orario del profilo.
fullTaskboolInclude l'oggetto task completo.

Risposta: un oggetto Outages con la finestra risolta e un array taskOutages; ogni elemento abbina un task ai suoi intervalli di outages (startTime/endTime + varianti Unix, numeri di evento, commento facoltativo).

GET incident

Elenco degli incidenti (eventi di guasto) per task. Accetta il filtro dei task più gli stessi parametri di finestra/fuso orario di outages, e:

ParametroTipoDescrizione
startTimeUnix / endTimeUnix / startTime / endTimeint64 / stringFinestra (Unix e/o formattata).
getInUtcTimeZoneintFormatta gli orari in UTC.
fullTaskboolInclude l'oggetto task completo.
fullLogboolInclude il registro dettagliato dei ricontrolli per agente. Richiede un pacchetto avanzato, altrimenti ApiFullLogNotAllowed.

Risposta: un oggetto Incidents con un array taskIncidents. Ogni incidente riporta taskId, checkId, gli orari Unix di inizio/fine, la location in errore, l'error, hasSnapshot e (con fullLog) un blocco recheck che elenca le location OK e quelle in errore per ciascun errore.

GET incident/snapshot

Recupera lo snapshot della risposta salvato per un incidente. Parametri:

ParametroTipoDescrizione
taskIdguidIl task. Obbligatorio.
checkIdint64L'id del controllo/evento.
timestampUnixUtcint64Il timestamp dell'incidente (secondi Unix UTC).

Restituisce lo snapshot (un timestamp più i byte catturati) quando esiste, oppure null quando non c'è alcuno snapshot per l'incidente indicato.

GET results/http

Metriche di timing HTTP aggregate per task. Forza il tipo di task Http. Accetta il filtro dei task più:

ParametroTipoDescrizione
resultStartUnix / resultEndUnixint64Finestra in secondi Unix (UTC).
resultStart / resultEndstringFinestra come stringhe formattate secondo il profilo.
fullTaskboolInclude l'oggetto task completo.

Risposta: un oggetto AggregatedHttpResults; ogni voce di taskResults riporta il riferimento al task e i valori medi di responseTime, dnsTime, headTime, dataTime (millisecondi).

GET cr/httpResponseTime

Serie temporali del tempo di risposta HTTP per task. Accetta il filtro dei task più startDate, endDate e groupBy. Restituisce un array semplice di oggetti serie:

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

Agenti

Gli agenti sono le postazioni di monitoraggio distribuite geograficamente. Gli id dei pool restituiti qui sono i valori che passi nell'agentPools di un task.

GET agents

Elenca gli agenti di monitoraggio. Parametro di query facoltativo:

ParametroTipoDescrizione
touchedintSolo gli agenti che hanno segnalato nell'ultimo N minuti. I valori ≤ 0 (o assenti) significano nessun filtro; altrimenti vengono limitati all'intervallo 1–10.

Ogni agente riporta id, upFrom, datacenter (nome/città/paese/stato), company (nome/url), ip, version, lon/lat e 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

Elenca i pool di agenti pubblici (regioni geografiche). Ogni pool riporta id, desc, i suoi agents, childPools e hidden. Usa i valori id del pool nell'agentPools di un task.

GET agents/ips anonimo

Restituisce gli indirizzi IP attuali degli agenti di monitoraggio — utile per inserire Host-Tracker in whitelist in un firewall. Questo endpoint non richiede autenticazione. Per impostazione predefinita restituisce text/plain, un IP per riga; invia Accept: application/json per ricevere invece un array JSON.

text/plain (predefinito)
203.0.113.10
203.0.113.11
198.51.100.7
con Accept: application/json
["203.0.113.10", "203.0.113.11", "198.51.100.7"]
Host-Tracker REST API v1 — host-tracker.com. Lo Swagger/OpenAPI leggibile dalla macchina è disponibile su BASE_URL/docs/v1 con una sandbox interattiva su BASE_URL/sandbox.